From d53622e0fd372c0137fa0ec136ab3bebd3b92c20 Mon Sep 17 00:00:00 2001 From: Aleksander Waage Date: Tue, 17 Dec 2019 20:56:43 +0100 Subject: [PATCH] alpha --- .gitignore | 356 ++++++++++++++++++ OWML.Common/IHarmonyHelper.cs | 12 + OWML.Common/IModConfig.cs | 12 + OWML.Common/IModConsole.cs | 7 + OWML.Common/IModEvents.cs | 14 + OWML.Common/IModFinder.cs | 11 + OWML.Common/IModHelper.cs | 10 + OWML.Common/IModLogger.cs | 7 + OWML.Common/IModManifest.cs | 14 + OWML.Common/ModBehaviour.cs | 16 + OWML.Common/ModConfig.cs | 25 ++ OWML.Common/ModConsole.cs | 24 ++ OWML.Common/ModHelper.cs | 20 + OWML.Common/ModLogger.cs | 21 ++ OWML.Common/ModManifest.cs | 31 ++ OWML.Common/OWML.Common.csproj | 65 ++++ OWML.Common/Properties/AssemblyInfo.cs | 35 ++ OWML.Common/packages.config | 4 + OWML.Events/HarmonyHelper.cs | 101 +++++ OWML.Events/ModEvents.cs | 39 ++ OWML.Events/OWML.Events.csproj | 67 ++++ OWML.Events/Patches.cs | 29 ++ OWML.Events/Properties/AssemblyInfo.cs | 35 ++ OWML.Events/TypeExtensions.cs | 26 ++ OWML.Events/packages.config | 4 + OWML.Launcher/App.config | 6 + OWML.Launcher/App.cs | 112 ++++++ OWML.Launcher/OWML.Config.json | 3 + OWML.Launcher/OWML.Launcher.csproj | 84 +++++ OWML.Launcher/OutputListener.cs | 44 +++ OWML.Launcher/Program.cs | 11 + OWML.Launcher/Properties/AssemblyInfo.cs | 35 ++ OWML.Launcher/packages.config | 5 + OWML.ModLoader/ModFinder.cs | 61 +++ OWML.ModLoader/ModLoader.cs | 65 ++++ OWML.ModLoader/OWML.ModLoader.csproj | 63 ++++ OWML.ModLoader/Owo.cs | 41 ++ OWML.ModLoader/Properties/AssemblyInfo.cs | 35 ++ OWML.ModLoader/packages.config | 4 + OWML.Patcher/ModPatcher.cs | 85 +++++ OWML.Patcher/OWML.Patcher.csproj | 62 +++ OWML.Patcher/Properties/AssemblyInfo.cs | 35 ++ OWML.Patcher/dnpatch/dnlib.dll | Bin 0 -> 1014784 bytes OWML.Patcher/dnpatch/dnpatch.dll | Bin 0 -> 34816 bytes .../OWML.EnableDebugMode/EnableDebugMode.cs | 32 ++ .../OWML.EnableDebugMode.csproj | 75 ++++ .../Properties/AssemblyInfo.cs | 35 ++ .../OWML.EnableDebugMode/manifest.json | 8 + .../OWML.EnableDebugMode/packages.config | 4 + .../OWML.TestMod/OWML.TestMod.csproj | 70 ++++ .../OWML.TestMod/Properties/AssemblyInfo.cs | 35 ++ OWML.SampleMods/OWML.TestMod/TestMod.cs | 27 ++ OWML.SampleMods/OWML.TestMod/manifest.json | 8 + OWML.sln | 67 ++++ OWML.sln.DotSettings | 7 + Readme.md | 185 +++++++++ createrelease.bat | 27 ++ 57 files changed, 2316 insertions(+) create mode 100644 .gitignore create mode 100644 OWML.Common/IHarmonyHelper.cs create mode 100644 OWML.Common/IModConfig.cs create mode 100644 OWML.Common/IModConsole.cs create mode 100644 OWML.Common/IModEvents.cs create mode 100644 OWML.Common/IModFinder.cs create mode 100644 OWML.Common/IModHelper.cs create mode 100644 OWML.Common/IModLogger.cs create mode 100644 OWML.Common/IModManifest.cs create mode 100644 OWML.Common/ModBehaviour.cs create mode 100644 OWML.Common/ModConfig.cs create mode 100644 OWML.Common/ModConsole.cs create mode 100644 OWML.Common/ModHelper.cs create mode 100644 OWML.Common/ModLogger.cs create mode 100644 OWML.Common/ModManifest.cs create mode 100644 OWML.Common/OWML.Common.csproj create mode 100644 OWML.Common/Properties/AssemblyInfo.cs create mode 100644 OWML.Common/packages.config create mode 100644 OWML.Events/HarmonyHelper.cs create mode 100644 OWML.Events/ModEvents.cs create mode 100644 OWML.Events/OWML.Events.csproj create mode 100644 OWML.Events/Patches.cs create mode 100644 OWML.Events/Properties/AssemblyInfo.cs create mode 100644 OWML.Events/TypeExtensions.cs create mode 100644 OWML.Events/packages.config create mode 100644 OWML.Launcher/App.config create mode 100644 OWML.Launcher/App.cs create mode 100644 OWML.Launcher/OWML.Config.json create mode 100644 OWML.Launcher/OWML.Launcher.csproj create mode 100644 OWML.Launcher/OutputListener.cs create mode 100644 OWML.Launcher/Program.cs create mode 100644 OWML.Launcher/Properties/AssemblyInfo.cs create mode 100644 OWML.Launcher/packages.config create mode 100644 OWML.ModLoader/ModFinder.cs create mode 100644 OWML.ModLoader/ModLoader.cs create mode 100644 OWML.ModLoader/OWML.ModLoader.csproj create mode 100644 OWML.ModLoader/Owo.cs create mode 100644 OWML.ModLoader/Properties/AssemblyInfo.cs create mode 100644 OWML.ModLoader/packages.config create mode 100644 OWML.Patcher/ModPatcher.cs create mode 100644 OWML.Patcher/OWML.Patcher.csproj create mode 100644 OWML.Patcher/Properties/AssemblyInfo.cs create mode 100644 OWML.Patcher/dnpatch/dnlib.dll create mode 100644 OWML.Patcher/dnpatch/dnpatch.dll create mode 100644 OWML.SampleMods/OWML.EnableDebugMode/EnableDebugMode.cs create mode 100644 OWML.SampleMods/OWML.EnableDebugMode/OWML.EnableDebugMode.csproj create mode 100644 OWML.SampleMods/OWML.EnableDebugMode/Properties/AssemblyInfo.cs create mode 100644 OWML.SampleMods/OWML.EnableDebugMode/manifest.json create mode 100644 OWML.SampleMods/OWML.EnableDebugMode/packages.config create mode 100644 OWML.SampleMods/OWML.TestMod/OWML.TestMod.csproj create mode 100644 OWML.SampleMods/OWML.TestMod/Properties/AssemblyInfo.cs create mode 100644 OWML.SampleMods/OWML.TestMod/TestMod.cs create mode 100644 OWML.SampleMods/OWML.TestMod/manifest.json create mode 100644 OWML.sln create mode 100644 OWML.sln.DotSettings create mode 100644 Readme.md create mode 100644 createrelease.bat diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b011a110 --- /dev/null +++ b/.gitignore @@ -0,0 +1,356 @@ + +# Created by https://www.gitignore.io/api/visualstudio +# Edit at https://www.gitignore.io/?templates=visualstudio + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# End of https://www.gitignore.io/api/visualstudio diff --git a/OWML.Common/IHarmonyHelper.cs b/OWML.Common/IHarmonyHelper.cs new file mode 100644 index 00000000..d0fb4f70 --- /dev/null +++ b/OWML.Common/IHarmonyHelper.cs @@ -0,0 +1,12 @@ +using System; +using UnityEngine; + +namespace OWML.Common +{ + public interface IHarmonyHelper + { + void AddPostfix(string methodName, string patchName) where T : MonoBehaviour; + void EmptyMethod(string methodName) where T : MonoBehaviour; + void Transpile(string methodName, Type patchType, string patchMethodName) where T : MonoBehaviour; + } +} diff --git a/OWML.Common/IModConfig.cs b/OWML.Common/IModConfig.cs new file mode 100644 index 00000000..3ae56c94 --- /dev/null +++ b/OWML.Common/IModConfig.cs @@ -0,0 +1,12 @@ +namespace OWML.Common +{ + public interface IModConfig + { + string GamePath { get; } + string ManagedPath { get; } + string OWMLPath { get; } + string ModsPath { get; } + string OutputFilePath { get; } + string LogFilePath { get; } + } +} diff --git a/OWML.Common/IModConsole.cs b/OWML.Common/IModConsole.cs new file mode 100644 index 00000000..429d44cf --- /dev/null +++ b/OWML.Common/IModConsole.cs @@ -0,0 +1,7 @@ +namespace OWML.Common +{ + public interface IModConsole + { + void WriteLine(string s); + } +} diff --git a/OWML.Common/IModEvents.cs b/OWML.Common/IModEvents.cs new file mode 100644 index 00000000..6540c6b5 --- /dev/null +++ b/OWML.Common/IModEvents.cs @@ -0,0 +1,14 @@ +using System; +using UnityEngine; + +namespace OWML.Common +{ + public interface IModEvents + { + Action OnAwake { get; set; } + Action OnStart { get; set; } + + void AddAwakeEvent() where T : MonoBehaviour; + void AddStartEvent() where T : MonoBehaviour; + } +} diff --git a/OWML.Common/IModFinder.cs b/OWML.Common/IModFinder.cs new file mode 100644 index 00000000..39e3ae16 --- /dev/null +++ b/OWML.Common/IModFinder.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; + +namespace OWML.Common +{ + public interface IModFinder + { + IList GetManifests(); + Type LoadModType(IModManifest manifest); + } +} diff --git a/OWML.Common/IModHelper.cs b/OWML.Common/IModHelper.cs new file mode 100644 index 00000000..41cc4cfb --- /dev/null +++ b/OWML.Common/IModHelper.cs @@ -0,0 +1,10 @@ +namespace OWML.Common +{ + public interface IModHelper + { + IModLogger Logger { get; } + IModConsole Console { get; } + IModEvents Events { get; } + IHarmonyHelper HarmonyHelper { get; } + } +} diff --git a/OWML.Common/IModLogger.cs b/OWML.Common/IModLogger.cs new file mode 100644 index 00000000..2fb3681a --- /dev/null +++ b/OWML.Common/IModLogger.cs @@ -0,0 +1,7 @@ +namespace OWML.Common +{ + public interface IModLogger + { + void Log(string s); + } +} diff --git a/OWML.Common/IModManifest.cs b/OWML.Common/IModManifest.cs new file mode 100644 index 00000000..0c88ee45 --- /dev/null +++ b/OWML.Common/IModManifest.cs @@ -0,0 +1,14 @@ +namespace OWML.Common +{ + public interface IModManifest + { + string Filename { get; } + string Author { get; } + string Name { get; } + string Version { get; } + string AssemblyPath { get; } + string UniqueName { get; } + string FolderPath { get; set; } + bool Enabled { get; } + } +} diff --git a/OWML.Common/ModBehaviour.cs b/OWML.Common/ModBehaviour.cs new file mode 100644 index 00000000..864ee0e6 --- /dev/null +++ b/OWML.Common/ModBehaviour.cs @@ -0,0 +1,16 @@ +using UnityEngine; + +namespace OWML.Common +{ + public class ModBehaviour : MonoBehaviour + { + protected IModHelper ModHelper; + + public void Init(IModHelper modHelper) + { + ModHelper = modHelper; + DontDestroyOnLoad(gameObject); + } + + } +} diff --git a/OWML.Common/ModConfig.cs b/OWML.Common/ModConfig.cs new file mode 100644 index 00000000..35654b4c --- /dev/null +++ b/OWML.Common/ModConfig.cs @@ -0,0 +1,25 @@ +using Newtonsoft.Json; + +namespace OWML.Common +{ + public class ModConfig : IModConfig + { + [JsonProperty("gamePath")] + public string GamePath { get; private set; } + + [JsonIgnore] + public string ManagedPath => $"{GamePath}/OuterWilds_Data/Managed"; + + [JsonProperty("owmlPath")] + public string OWMLPath { get; set; } + + [JsonIgnore] + public string LogFilePath => $"{OWMLPath}Logs/OWML.Log.txt"; + + [JsonIgnore] + public string OutputFilePath => $"{OWMLPath}Logs/OWML.Output.txt"; + + [JsonIgnore] + public string ModsPath => $"{OWMLPath}Mods"; + } +} diff --git a/OWML.Common/ModConsole.cs b/OWML.Common/ModConsole.cs new file mode 100644 index 00000000..7da0291c --- /dev/null +++ b/OWML.Common/ModConsole.cs @@ -0,0 +1,24 @@ +using System; +using System.IO; +using System.Text; + +namespace OWML.Common +{ + public class ModConsole : IModConsole + { + private readonly FileStream _writer; + + public ModConsole(IModConfig config) + { + _writer = File.Open(config.OutputFilePath, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); + } + + public void WriteLine(string s) + { + var bytes = Encoding.UTF8.GetBytes(s + Environment.NewLine); + _writer.Write(bytes, 0, bytes.Length); + _writer.Flush(); + } + + } +} diff --git a/OWML.Common/ModHelper.cs b/OWML.Common/ModHelper.cs new file mode 100644 index 00000000..452a23bc --- /dev/null +++ b/OWML.Common/ModHelper.cs @@ -0,0 +1,20 @@ + +namespace OWML.Common +{ + public class ModHelper : IModHelper + { + public IModLogger Logger { get; } + public IModConsole Console { get; } + public IModEvents Events { get; } + public IHarmonyHelper HarmonyHelper { get; } + + public ModHelper(IModLogger logger, IModConsole console, IModEvents events, IHarmonyHelper harmonyHelper) + { + Logger = logger; + Console = console; + Events = events; + HarmonyHelper = harmonyHelper; + } + + } +} diff --git a/OWML.Common/ModLogger.cs b/OWML.Common/ModLogger.cs new file mode 100644 index 00000000..81bc1645 --- /dev/null +++ b/OWML.Common/ModLogger.cs @@ -0,0 +1,21 @@ +using System; +using System.IO; + +namespace OWML.Common +{ + public class ModLogger : IModLogger + { + private readonly IModConfig _config; + + public ModLogger(IModConfig config) + { + _config = config; + } + + public void Log(string s) + { + File.AppendAllText(_config.LogFilePath, $"{DateTime.Now}: {s}{Environment.NewLine}"); + } + + } +} diff --git a/OWML.Common/ModManifest.cs b/OWML.Common/ModManifest.cs new file mode 100644 index 00000000..e7f64284 --- /dev/null +++ b/OWML.Common/ModManifest.cs @@ -0,0 +1,31 @@ +using Newtonsoft.Json; + +namespace OWML.Common +{ + public class ModManifest : IModManifest + { + [JsonProperty("filename")] + public string Filename { get; private set; } + + [JsonProperty("author")] + public string Author { get; private set; } + + [JsonProperty("name")] + public string Name { get; private set; } + + [JsonProperty("uniqueName")] + public string UniqueName { get; private set; } + + [JsonProperty("version")] + public string Version { get; private set; } + + [JsonProperty("enabled")] + public bool Enabled { get; private set; } + + [JsonIgnore] + public string FolderPath { get; set; } + + [JsonIgnore] + public string AssemblyPath => FolderPath + Filename; + } +} diff --git a/OWML.Common/OWML.Common.csproj b/OWML.Common/OWML.Common.csproj new file mode 100644 index 00000000..b403283e --- /dev/null +++ b/OWML.Common/OWML.Common.csproj @@ -0,0 +1,65 @@ + + + + + Debug + AnyCPU + {3C00626F-B688-4F32-B493-5B7EC1C879A0} + Library + Properties + OWML.Common + OWML.Common + v3.5 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Json.Net.Unity3D.9.0.1\lib\net35\Newtonsoft.Json.dll + + + + + ..\..\..\..\..\..\Program Files (x86)\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.CoreModule.dll + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OWML.Common/Properties/AssemblyInfo.cs b/OWML.Common/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..543b40b5 --- /dev/null +++ b/OWML.Common/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OWML.Common")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OWML.Common")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3c00626f-b688-4f32-b493-5b7ec1c879a0")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OWML.Common/packages.config b/OWML.Common/packages.config new file mode 100644 index 00000000..eceb5e43 --- /dev/null +++ b/OWML.Common/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/OWML.Events/HarmonyHelper.cs b/OWML.Events/HarmonyHelper.cs new file mode 100644 index 00000000..bda80a76 --- /dev/null +++ b/OWML.Events/HarmonyHelper.cs @@ -0,0 +1,101 @@ +using System; +using System.Reflection; +using Harmony; +using OWML.Common; +using UnityEngine; + +namespace OWML.Events +{ + public class HarmonyHelper : IHarmonyHelper + { + private readonly IModLogger _logger; + private readonly IModConsole _console; + + public HarmonyHelper(IModLogger logger, IModConsole console) + { + _logger = logger; + _console = console; + } + + public void AddPostfix(string methodName, string patchName) where T : MonoBehaviour + { + var postfix = typeof(Patches).GetMethod(patchName); + if (postfix == null) + { + _logger.Log("postfix is null"); + _console.WriteLine("postfix is null"); + return; + } + Patch(methodName, null, postfix, null); + } + + public void EmptyMethod(string methodName) where T : MonoBehaviour + { + Transpile(methodName, typeof(Patches), nameof(Patches.EmptyMethod)); + } + + public void Transpile(string methodName, Type patchType, string patchMethodName) where T : MonoBehaviour + { + var patchMethod = patchType.GetMethod(patchMethodName); + if (patchMethod == null) + { + _logger.Log("patchMethod is null"); + _console.WriteLine("patchMethod is null"); + return; + } + Patch(methodName, null, null, patchMethod); + } + + private void Patch(string methodName, MethodInfo prefix, MethodInfo postfix, MethodInfo transpiler) where T : MonoBehaviour + { + var targetType = typeof(T); + _logger.Log("Trying to patch " + targetType.Name); + HarmonyInstance harmony; + try + { + _logger.Log("Creating harmony instance"); + harmony = HarmonyInstance.Create("com.alek.owml"); + _logger.Log("Created harmony instance"); + } + catch (Exception ex) + { + _logger.Log($"Exception while creating harmony instance: {ex}"); + _console.WriteLine($"Exception while creating harmony instance: {ex}"); + return; + } + MethodInfo original; + try + { + _logger.Log($"Getting method {methodName} of {targetType.Name}"); + original = targetType.GetAnyMethod(methodName); + _logger.Log($"Got method {methodName} of {targetType.Name}"); + } + catch (Exception ex) + { + _logger.Log($"Exception while getting method {methodName} of {targetType.Name}: {ex}"); + _console.WriteLine($"Exception while getting method {methodName} of {targetType.Name}: {ex}"); + return; + } + if (original == null) + { + _logger.Log("original is null"); + _console.WriteLine("original is null"); + return; + } + var prefixMethod = prefix == null ? null : new HarmonyMethod(prefix); + var postfixMethod = postfix == null ? null : new HarmonyMethod(postfix); + var transpilerMethod = transpiler == null ? null : new HarmonyMethod(transpiler); + try + { + harmony.Patch(original, prefixMethod, postfixMethod, transpilerMethod); + _logger.Log($"Patched {targetType.Name}!"); + } + catch (Exception ex) + { + _logger.Log($"Exception while patching {targetType.Name}: {ex}"); + _console.WriteLine($"Exception while patching {targetType.Name}: {ex}"); + } + } + + } +} diff --git a/OWML.Events/ModEvents.cs b/OWML.Events/ModEvents.cs new file mode 100644 index 00000000..06356e91 --- /dev/null +++ b/OWML.Events/ModEvents.cs @@ -0,0 +1,39 @@ +using System; +using OWML.Common; +using UnityEngine; + +namespace OWML.Events +{ + public class ModEvents : IModEvents + { + public Action OnAwake + { + get => Patches.OnAwake; + set => Patches.OnAwake += value; + } + + public Action OnStart + { + get => Patches.OnStart; + set => Patches.OnStart += value; + } + + private readonly IHarmonyHelper _harmonyHelper; + + public ModEvents(IHarmonyHelper harmonyHelper) + { + _harmonyHelper = harmonyHelper; + } + + public void AddAwakeEvent() where T : MonoBehaviour + { + _harmonyHelper.AddPostfix("Awake", nameof(Patches.PostAwake)); + } + + public void AddStartEvent() where T : MonoBehaviour + { + _harmonyHelper.AddPostfix("Start", nameof(Patches.PostStart)); + } + + } +} diff --git a/OWML.Events/OWML.Events.csproj b/OWML.Events/OWML.Events.csproj new file mode 100644 index 00000000..1b212730 --- /dev/null +++ b/OWML.Events/OWML.Events.csproj @@ -0,0 +1,67 @@ + + + + + Debug + AnyCPU + {B771615E-6B51-44F8-B862-D7543C12C0FF} + Library + Properties + OWML.Events + OWML.Events + v3.5 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Lib.Harmony.1.2.0.1\lib\net35\0Harmony.dll + + + ..\..\..\..\..\..\Program Files (x86)\Outer Wilds\OuterWilds_Data\Managed\Assembly-CSharp.dll + + + + + + + + + ..\..\..\..\..\..\Program Files (x86)\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.CoreModule.dll + + + + + + + + + + + + + + + {3C00626F-B688-4F32-B493-5B7EC1C879A0} + OWML.Common + + + + \ No newline at end of file diff --git a/OWML.Events/Patches.cs b/OWML.Events/Patches.cs new file mode 100644 index 00000000..6f0b3758 --- /dev/null +++ b/OWML.Events/Patches.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using Harmony; +using UnityEngine; + +namespace OWML.Events +{ + internal static class Patches + { + public static Action OnAwake { get; set; } + public static Action OnStart { get; set; } + + public static void PostAwake(MonoBehaviour __instance) + { + OnAwake?.Invoke(__instance); + } + + public static void PostStart(MonoBehaviour __instance) + { + OnStart?.Invoke(__instance); + } + + public static IEnumerable EmptyMethod(IEnumerable instructions) + { + return new List(); + } + + } +} diff --git a/OWML.Events/Properties/AssemblyInfo.cs b/OWML.Events/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..e3ce48aa --- /dev/null +++ b/OWML.Events/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OWML.Events")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OWML.Events")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b771615e-6b51-44f8-b862-d7543c12c0ff")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OWML.Events/TypeExtensions.cs b/OWML.Events/TypeExtensions.cs new file mode 100644 index 00000000..0f2280f0 --- /dev/null +++ b/OWML.Events/TypeExtensions.cs @@ -0,0 +1,26 @@ +using System; +using System.Reflection; + +namespace OWML.Events +{ + public static class TypeExtensions + { + private const BindingFlags Flags = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static; + + public static MethodInfo GetAnyMethod(this Type type, string name) + { + return type.GetMethod(name, Flags); + } + + public static PropertyInfo GetAnyProperty(this Type type, string name) + { + return type.GetProperty(name, Flags); + } + + public static FieldInfo GetAnyField(this Type type, string name) + { + return type.GetField(name, Flags); + } + + } +} diff --git a/OWML.Events/packages.config b/OWML.Events/packages.config new file mode 100644 index 00000000..edc218f4 --- /dev/null +++ b/OWML.Events/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/OWML.Launcher/App.config b/OWML.Launcher/App.config new file mode 100644 index 00000000..07e79507 --- /dev/null +++ b/OWML.Launcher/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/OWML.Launcher/App.cs b/OWML.Launcher/App.cs new file mode 100644 index 00000000..f3a06d2e --- /dev/null +++ b/OWML.Launcher/App.cs @@ -0,0 +1,112 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using Newtonsoft.Json; +using OWML.Common; +using OWML.ModLoader; +using OWML.Patcher; + +namespace OWML.Launcher +{ + public class App + { + public void Run() + { + Console.WriteLine("Started OWML."); + + var config = GetConfig(); + if (!Directory.Exists(config.GamePath)) + { + Console.WriteLine($"Game not found at {config.GamePath}"); + Console.WriteLine("Edit OWML.Config.json and try again."); + Console.ReadLine(); + return; + } + + Console.WriteLine($"Game found at {config.GamePath}"); + Console.WriteLine($"For detailed log, see Logs/OWML.Log.txt"); + + CopyGameFiles(config); + + ListenForOutput(config); + + var modFinder = new ModFinder(config, new ModLogger(config), new ModConsole(config)); + + ShowModList(modFinder); + + PatchGame(config); + + StartGame(config); + + Console.ReadLine(); + } + + private void CopyGameFiles(IModConfig config) + { + var filesToCopy = new[] { "UnityEngine.CoreModule.dll", "Assembly-CSharp.dll" }; + foreach (var fileName in filesToCopy) + { + File.Copy($"{config.ManagedPath}/{fileName}", fileName, true); + } + Console.WriteLine("Game files copied."); + } + + private void ShowModList(IModFinder modFinder) + { + var manifests = modFinder.GetManifests(); + if (!manifests.Any()) + { + Console.WriteLine("Found no mods."); + return; + } + Console.WriteLine("Found mods:"); + foreach (var manifest in manifests) + { + var stateText = manifest.Enabled ? "" : " (disabled)"; + Console.WriteLine($"* {manifest.UniqueName} ({manifest.Version}){stateText}"); + } + } + + private ModConfig GetConfig() + { + var json = File.ReadAllText("OWML.Config.json"); + var config = JsonConvert.DeserializeObject(json); + config.OWMLPath = AppDomain.CurrentDomain.BaseDirectory; + return config; + } + + private void ListenForOutput(IModConfig config) + { + var listener = new OutputListener(config); + listener.OnOutput += Console.Write; + listener.Start(); + } + + private void PatchGame(IModConfig config) + { + var patcher = new ModPatcher(config); + patcher.PatchGame(); + var filesToCopy = new[] { "OWML.ModLoader.dll", "OWML.Common.dll", "OWML.Events.dll", "Newtonsoft.Json.dll", "System.Runtime.Serialization.dll", "0Harmony.dll" }; + foreach (var filename in filesToCopy) + { + File.Copy(filename, $"{config.ManagedPath}/{filename}", true); + } + File.WriteAllText($"{config.ManagedPath}/OWML.Config.json", JsonConvert.SerializeObject(config)); + } + + private void StartGame(IModConfig config) + { + Console.WriteLine("Starting game..."); + try + { + Process.Start($"{config.GamePath}/OuterWilds.exe"); + } + catch (Exception ex) + { + Console.WriteLine("Error while starting game: " + ex.Message); + } + } + + } +} diff --git a/OWML.Launcher/OWML.Config.json b/OWML.Launcher/OWML.Config.json new file mode 100644 index 00000000..c685e4c6 --- /dev/null +++ b/OWML.Launcher/OWML.Config.json @@ -0,0 +1,3 @@ +{ + "gamePath": "C:/Program Files (x86)/Outer Wilds" +} \ No newline at end of file diff --git a/OWML.Launcher/OWML.Launcher.csproj b/OWML.Launcher/OWML.Launcher.csproj new file mode 100644 index 00000000..2c50912a --- /dev/null +++ b/OWML.Launcher/OWML.Launcher.csproj @@ -0,0 +1,84 @@ + + + + + Debug + AnyCPU + {9C09F86B-0C03-4630-8424-B939D3C632D0} + Exe + OWML.Launcher + OWML.Launcher + v4.7.2 + 512 + true + true + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\packages\Lib.Harmony.1.2.0.1\lib\net35\0Harmony.dll + + + ..\packages\Json.Net.Unity3D.9.0.1\lib\net35\Newtonsoft.Json.dll + + + + + True + + + + + + + + + + + + + Always + + + + + + {3C00626F-B688-4F32-B493-5B7EC1C879A0} + OWML.Common + + + {D075D13C-990A-46A2-B596-4600A3411BD5} + OWML.ModLoader + + + {5153D37F-3148-45DE-B1A4-7EBF87965569} + OWML.Patcher + + + + + + + + \ No newline at end of file diff --git a/OWML.Launcher/OutputListener.cs b/OWML.Launcher/OutputListener.cs new file mode 100644 index 00000000..43e43863 --- /dev/null +++ b/OWML.Launcher/OutputListener.cs @@ -0,0 +1,44 @@ +using System; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using OWML.Common; + +namespace OWML.Launcher +{ + public class OutputListener + { + public Action OnOutput; + + private readonly string _outputPath; + + public OutputListener(IModConfig config) + { + _outputPath = config.OutputFilePath; + } + + public void Start() + { + File.WriteAllText(_outputPath, ""); + Task.Run(Work); + } + + private async Task Work() + { + using (var reader = File.Open(_outputPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + { + while (true) + { + var bytes = new byte[128]; + reader.Read(bytes, 0, 128); + var s = Encoding.UTF8.GetString(bytes).Replace("\0", ""); + if (!string.IsNullOrEmpty(s)) + { + OnOutput?.Invoke(s); + } + await Task.Delay(100); + } + } + } + } +} diff --git a/OWML.Launcher/Program.cs b/OWML.Launcher/Program.cs new file mode 100644 index 00000000..e814be32 --- /dev/null +++ b/OWML.Launcher/Program.cs @@ -0,0 +1,11 @@ +namespace OWML.Launcher +{ + public class Program + { + static void Main(string[] args) + { + var app = new App(); + app.Run(); + } + } +} diff --git a/OWML.Launcher/Properties/AssemblyInfo.cs b/OWML.Launcher/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..6437ec37 --- /dev/null +++ b/OWML.Launcher/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OWML.Launcher")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OWML.Launcher")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9c09f86b-0c03-4630-8424-b939d3c632d0")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OWML.Launcher/packages.config b/OWML.Launcher/packages.config new file mode 100644 index 00000000..3a754bf3 --- /dev/null +++ b/OWML.Launcher/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OWML.ModLoader/ModFinder.cs b/OWML.ModLoader/ModFinder.cs new file mode 100644 index 00000000..806a3c26 --- /dev/null +++ b/OWML.ModLoader/ModFinder.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using Newtonsoft.Json; +using OWML.Common; + +namespace OWML.ModLoader +{ + public class ModFinder : IModFinder + { + private readonly IModConfig _config; + private readonly IModLogger _logger; + private readonly IModConsole _console; + + public ModFinder(IModConfig config, IModLogger logger, IModConsole console) + { + _config = config; + _logger = logger; + _console = console; + } + + public IList GetManifests() + { + var manifestFilenames = Directory.GetFiles(_config.ModsPath, "manifest.json", SearchOption.AllDirectories); + var manifests = new List(); + foreach (var manifestFilename in manifestFilenames) + { + var json = File.ReadAllText(manifestFilename); + var manifest = JsonConvert.DeserializeObject(json); + manifest.FolderPath = manifestFilename.Substring(0, manifestFilename.IndexOf("manifest.json")); + manifests.Add(manifest); + } + return manifests; + } + + public Type LoadModType(IModManifest manifest) + { + if (!manifest.Enabled) + { + _logger.Log($"{manifest.UniqueName} is disabled, skipping"); + return null; + } + _logger.Log("Loading assembly: " + manifest.AssemblyPath); + var assembly = Assembly.LoadFile(manifest.AssemblyPath); + _logger.Log($"Loaded {assembly.FullName}"); + try + { + return assembly.GetTypes().FirstOrDefault(x => x.IsSubclassOf(typeof(ModBehaviour))); + } + catch (Exception ex) + { + _logger.Log($"Error while trying to get {typeof(ModBehaviour)}: {ex.Message}"); + _console.WriteLine($"Error while trying to get {typeof(ModBehaviour)}: {ex.Message}"); + return null; + } + } + + } +} diff --git a/OWML.ModLoader/ModLoader.cs b/OWML.ModLoader/ModLoader.cs new file mode 100644 index 00000000..6584ce6b --- /dev/null +++ b/OWML.ModLoader/ModLoader.cs @@ -0,0 +1,65 @@ +using System; +using System.IO; +using Newtonsoft.Json; +using OWML.Common; +using OWML.Events; +using UnityEngine; + +namespace OWML.ModLoader +{ + public class ModLoader + { + private static readonly string ConfigPath = $"{Application.dataPath}/Managed/OWML.Config.json"; + private static readonly string SecondaryLogPath = $"{Application.dataPath}/Resources/OWML.Output.txt"; + + public static void LoadMods() + { + SecondaryLog($"In {nameof(ModLoader)}.{nameof(LoadMods)}!"); + SecondaryLog("Getting config..."); + var config = GetConfig(); + if (config == null) + { + SecondaryLog("Config is null"); + return; + } + SecondaryLog("Got config!"); + SecondaryLog("Loading mods..."); + try + { + var logger = new ModLogger(config); + var console = new ModConsole(config); + var harmonyHelper = new HarmonyHelper(logger, console); + var events = new ModEvents(harmonyHelper); + var helper = new ModHelper(logger, console, events, harmonyHelper); + var modFinder = new ModFinder(config, logger, console); + var owo = new Owo(helper, modFinder); + owo.LoadMods(); + SecondaryLog("Loaded mods"); + } + catch (Exception ex) + { + SecondaryLog("Error while loading mods: " + ex); + } + } + + private static IModConfig GetConfig() + { + try + { + var json = File.ReadAllText(ConfigPath); + return JsonConvert.DeserializeObject(json); + } + catch (Exception ex) + { + SecondaryLog("Error while loading config: " + ex); + return null; + } + } + + private static void SecondaryLog(string s) + { + File.AppendAllText(SecondaryLogPath, $"{DateTime.Now}: {s}{Environment.NewLine}"); + } + + } +} diff --git a/OWML.ModLoader/OWML.ModLoader.csproj b/OWML.ModLoader/OWML.ModLoader.csproj new file mode 100644 index 00000000..3c4a54b7 --- /dev/null +++ b/OWML.ModLoader/OWML.ModLoader.csproj @@ -0,0 +1,63 @@ + + + + + Debug + AnyCPU + {D075D13C-990A-46A2-B596-4600A3411BD5} + Library + Properties + OWML.ModLoader + OWML.ModLoader + v3.5 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Json.Net.Unity3D.9.0.1\lib\net35\Newtonsoft.Json.dll + + + + ..\..\..\..\..\..\Program Files (x86)\Outer Wilds\OuterWilds_Data\Managed\UnityEngine.CoreModule.dll + + + + + + + + + + + {3c00626f-b688-4f32-b493-5b7ec1c879a0} + OWML.Common + + + {B771615E-6B51-44F8-B862-D7543C12C0FF} + OWML.Events + + + + + + + \ No newline at end of file diff --git a/OWML.ModLoader/Owo.cs b/OWML.ModLoader/Owo.cs new file mode 100644 index 00000000..b26faa2a --- /dev/null +++ b/OWML.ModLoader/Owo.cs @@ -0,0 +1,41 @@ +using OWML.Common; +using UnityEngine; + +namespace OWML.ModLoader +{ + internal class Owo + { + private readonly IModHelper _helper; + private readonly IModFinder _modFinder; + + public Owo(IModHelper helper, IModFinder modFinder) + { + _helper = helper; + _modFinder = modFinder; + } + + public void LoadMods() + { + _helper.Logger.Log($"{nameof(Owo)}: {nameof(LoadMods)}"); + var manifests = _modFinder.GetManifests(); + foreach (var manifest in manifests) + { + LoadMod(manifest); + } + } + + private void LoadMod(IModManifest manifest) + { + _helper.Logger.Log($"Loading {manifest.UniqueName} ({manifest.Version})..."); + var modType = _modFinder.LoadModType(manifest); + _helper.Logger.Log("Adding mod behaviour..."); + var go = new GameObject(manifest.UniqueName); + var mod = (ModBehaviour)go.AddComponent(modType); + _helper.Logger.Log("Added! Initializing..."); + mod.Init(_helper); + _helper.Console.WriteLine($"Loaded {manifest.UniqueName} ({manifest.Version})."); + _helper.Logger.Log($"Loaded {manifest.UniqueName} ({manifest.Version})."); + } + + } +} diff --git a/OWML.ModLoader/Properties/AssemblyInfo.cs b/OWML.ModLoader/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..3c3db567 --- /dev/null +++ b/OWML.ModLoader/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OWML.OWModLoader")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OWML.OWModLoader")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("d075d13c-990a-46a2-b596-4600a3411bd5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OWML.ModLoader/packages.config b/OWML.ModLoader/packages.config new file mode 100644 index 00000000..eceb5e43 --- /dev/null +++ b/OWML.ModLoader/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/OWML.Patcher/ModPatcher.cs b/OWML.Patcher/ModPatcher.cs new file mode 100644 index 00000000..9fca0de4 --- /dev/null +++ b/OWML.Patcher/ModPatcher.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using dnlib.DotNet.Emit; +using dnpatch; +using OWML.Common; + +namespace OWML.Patcher +{ + public class ModPatcher + { + private readonly IModConfig _config; + + public ModPatcher(IModConfig config) + { + _config = config; + } + + public void PatchGame() + { + var patcher = new dnpatch.Patcher($"{_config.ManagedPath}/Assembly-CSharp.dll"); + var target = new Target + { + Class = "PermanentManager", + Method = "Awake" + }; + var newInstructions = new[] + { + Instruction.Create(OpCodes.Call, patcher.BuildCall(typeof(ModLoader.ModLoader), "LoadMods", typeof(void), new Type[] { })), + Instruction.Create(OpCodes.Ret) + }; + var instructions = patcher.GetInstructions(target).ToList(); + if (IsPatched(instructions)) + { + ReplacePatchedInstructions(instructions, newInstructions); + } + else + { + AddNewInstructions(instructions, newInstructions); + } + target.Instructions = instructions.ToArray(); + try + { + patcher.Patch(target); + } + catch (Exception ex) + { + Console.WriteLine("Error while patching game assembly: " + ex); + throw; + } + try + { + patcher.Save(true); + } + catch (Exception ex) + { + Console.WriteLine("Error while saving patched game assembly: " + ex); + throw; + } + } + + private void ReplacePatchedInstructions(List instructions, Instruction[] newInstructions) + { + Console.WriteLine("Game is already patched. Re-patching."); + for (var i = 0; i < newInstructions.Length; i++) + { + instructions.Remove(instructions.Last()); + } + instructions.AddRange(newInstructions); + } + + private void AddNewInstructions(List instructions, Instruction[] newInstructions) + { + Console.WriteLine("Game is not patched. Patching!"); + instructions.Remove(instructions.Last()); + instructions.AddRange(newInstructions); + } + + private bool IsPatched(List instructions) + { + return instructions.Any(x => x.Operand != null && x.Operand.ToString().Contains(nameof(ModLoader.ModLoader))); + } + + } +} diff --git a/OWML.Patcher/OWML.Patcher.csproj b/OWML.Patcher/OWML.Patcher.csproj new file mode 100644 index 00000000..16980ffe --- /dev/null +++ b/OWML.Patcher/OWML.Patcher.csproj @@ -0,0 +1,62 @@ + + + + + Debug + AnyCPU + {5153D37F-3148-45DE-B1A4-7EBF87965569} + Library + Properties + OWML.Patcher + OWML.Patcher + v4.7.2 + 512 + true + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + False + dnpatch\dnlib.dll + + + dnpatch\dnpatch.dll + + + + + + + + + + + {3C00626F-B688-4F32-B493-5B7EC1C879A0} + OWML.Common + + + {D075D13C-990A-46A2-B596-4600A3411BD5} + OWML.ModLoader + + + + \ No newline at end of file diff --git a/OWML.Patcher/Properties/AssemblyInfo.cs b/OWML.Patcher/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..72652bf0 --- /dev/null +++ b/OWML.Patcher/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OWML.Patcher")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OWML.Patcher")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5153d37f-3148-45de-b1a4-7ebf87965569")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OWML.Patcher/dnpatch/dnlib.dll b/OWML.Patcher/dnpatch/dnlib.dll new file mode 100644 index 0000000000000000000000000000000000000000..e3f81a6f39a3c3eaac15c995bde2a64b752c0309 GIT binary patch literal 1014784 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 z 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 z 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