HookahPlace/Editor/HookahAssetBuilder.cs

199 lines
6.5 KiB
C#

using System.Diagnostics;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
public class HookahAssetBuilder
{
static readonly string ModManagerProfilesPath =
@"C:\Users\user\AppData\Roaming\com.kesomannen.gale\lethal-company\profiles";
static readonly string ModPackProfileName = "HookahPlace Test";
static readonly string ModPackModName = "HookahPlace-DEV";
static readonly string ModPackProfilePath = $@"{ModManagerProfilesPath}/{ModPackProfileName}";
static readonly string ModPackHookahPlacePath = @$"{ModPackProfilePath}/BepInEx/plugins/{ModPackModName}";
static readonly string ModProjectPath = @"D:\Code\LethalCompany\Mods\HookahPlace";
static readonly string DllName = "Ratijas.HookahPlace.dll";
static readonly string DllSourcePath = $@"{ModProjectPath}/HookahPlace/bin/Debug/netstandard2.1/{DllName}";
static readonly string[] DllDestinationPaths = new string[]
{
// relative to Unity project
$@"Assets/LethalCompany/Mods/plugins/Dependencies/{ModPackModName}",
ModPackHookahPlacePath,
};
static readonly string AssetBundlesPath = "Assets/LethalCompany/Mods/plugins/HookahPlace/AssetBundles";
static readonly string[] AssetBundlesDestinationPaths = new string[]
{
@$"{ModPackHookahPlacePath}/Assets",
@$"{ModProjectPath}/HookahPlace/res",
};
public static BuildAssetBundlesParameters GetBuildAssetBundlesParameters()
{
var assetBundleDefinitions = new AssetBundleBuild[]
{
new AssetBundleBuild()
{
assetBundleName = "hookahplaceasset",
assetNames = new string[]
{
"Assets/LethalCompany/Mods/plugins/HookahPlace/HookahContentContainer.asset",
}
},
new AssetBundleBuild()
{
assetBundleName = "hookahunlockableassets",
assetNames = new string[]
{
"Assets/LethalCompany/Mods/plugins/HookahPlace/Content/Unlockables",
}
},
};
var buildParameters = new BuildAssetBundlesParameters()
{
outputPath = AssetBundlesPath,
options = BuildAssetBundleOptions.ChunkBasedCompression,
bundleDefinitions = assetBundleDefinitions
};
return buildParameters;
}
[MenuItem("HookahPlace/All")]
public static void DoAll()
{
CompileScripts();
BuildAssetBundles();
InstallAssetBundles();
LaunchGame();
}
[MenuItem("HookahPlace/1. Compile Scripts")]
public static void CompileScripts()
{
var psi = new ProcessStartInfo
{
FileName = "dotnet",
Arguments = "build",
UseShellExecute = false,
WorkingDirectory = ModProjectPath,
};
var proc = Process.Start(psi);
proc.WaitForExit();
if (proc.ExitCode != 0)
{
UnityEngine.Debug.Log($"Process exited with non-zero code: {proc.ExitCode}");
// proc.StandardOutput
return;
}
foreach (var destinationPath in DllDestinationPaths)
{
Directory.CreateDirectory(destinationPath);
var sourceFileName = DllSourcePath;
var destFileName = $"{destinationPath}/{DllName}";
FileCopy(sourceFileName, destFileName);
}
}
[MenuItem("HookahPlace/2. Build Asset Bundles")]
public static void BuildAssetBundles()
{
UnityEngine.Debug.Log("Building asset bundles for HookahPlace...");
var buildParameters = GetBuildAssetBundlesParameters();
Directory.CreateDirectory(buildParameters.outputPath);
AssetBundleManifest manifest = BuildPipeline.BuildAssetBundles(buildParameters);
if (manifest != null)
{
foreach(var bundleName in manifest.GetAllAssetBundles())
{
string projectRelativePath = buildParameters.outputPath + "/" + bundleName;
UnityEngine.Debug.Log($"Size of AssetBundle {projectRelativePath} is {new FileInfo(projectRelativePath).Length}");
}
}
else
{
UnityEngine.Debug.Log("Build failed, see Console and Editor log for details");
}
if (Application.isBatchMode)
{
EditorApplication.Exit(0);
}
}
[MenuItem("HookahPlace/3. Install Asset Bundles")]
public static void InstallAssetBundles()
{
UnityEngine.Debug.Log("Installing asset bundles for HookahPlace...");
var buildParameters = GetBuildAssetBundlesParameters();
foreach (var destinationPath in AssetBundlesDestinationPaths)
{
Directory.CreateDirectory(destinationPath);
foreach (var bundle in buildParameters.bundleDefinitions)
{
var name = bundle.assetBundleName;
var sourceFileName = $"{buildParameters.outputPath}/{name}";
var destFileName = $"{destinationPath}/{name}";
FileCopy(sourceFileName, destFileName);
}
}
}
[MenuItem("HookahPlace/4. Launch Game")]
public static void LaunchGame()
{
UnityEngine.Debug.Log($"Launching Gale profile with profile '{ModPackProfileName}'...");
string BepInExPreloaderDllPath = $@"{ModPackProfilePath}/BepInEx/core/BepInEx.Preloader.dll";
string[] args = new string[]
{
@"C:\Program Files (x86)\Steam\steam.exe",
"-applaunch",
"1966720",
"--doorstop-enabled",
"true",
"--doorstop-target-assembly",
BepInExPreloaderDllPath,
};
var psi = new ProcessStartInfo
{
FileName = args[0],
Arguments = string.Join(" ", args.Skip(1).Select(QuoteArgument)),
UseShellExecute = false,
};
Process.Start(psi);
GUIUtility.systemCopyBuffer = "hookah";
}
static void FileCopy(string sourceFileName, string destFileName)
{
UnityEngine.Debug.Log($"File.Copy {sourceFileName} => {destFileName}");
File.Copy(sourceFileName, destFileName, overwrite: true);
}
static string QuoteArgument(string arg)
{
if (string.IsNullOrEmpty(arg))
return "\"\"";
if (arg.IndexOfAny(new char[] { ' ', '\t', '"' }) == -1)
return arg;
return "\"" + arg.Replace("\"", "\\\"") + "\"";
}
}