mirror of
https://github.com/muskit/H3VR-TNH-Quality-of-Life-Improvements.git
synced 2026-06-02 20:24:26 -07:00
81 lines
3.4 KiB
C#
81 lines
3.4 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Mono.Cecil;
|
|
using UnityEngine;
|
|
|
|
namespace MeatKit
|
|
{
|
|
[CreateAssetMenu(menuName = "MeatKit/Assembly Editors/Path Replacer", fileName = "New Path Replacer")]
|
|
public class CreatePathModifier : AssemblyModifier
|
|
{
|
|
[Tooltip("The new path replacements")]
|
|
public ReplacementPath[] ReplacementPaths = new ReplacementPath[0];
|
|
|
|
public override void ApplyModification(AssemblyDefinition assembly)
|
|
{
|
|
TypeReference stringRef = assembly.MainModule.TypeSystem.String;
|
|
TypeReference intRef = assembly.MainModule.TypeSystem.Int32;
|
|
if (stringRef == null || intRef == null) return;
|
|
|
|
foreach (ReplacementPath replacementPath in ReplacementPaths)
|
|
{
|
|
TypeReference type = assembly.MainModule.GetType(replacementPath.ScriptableObjectName);
|
|
if (type == null) continue;
|
|
|
|
TypeDefinition definition = type.Resolve();
|
|
CustomAttribute createMenuAttribute = GetCreateAssetMenuAttribute(definition);
|
|
|
|
if (createMenuAttribute == null)
|
|
{
|
|
Debug.LogWarning("Could not get CreateAssetMenuAttribute for scriptable object: " + replacementPath.ScriptableObjectName);
|
|
continue;
|
|
}
|
|
|
|
CustomAttributeArgument pathArgumentValue = new CustomAttributeArgument(stringRef, replacementPath.NewPath);
|
|
CustomAttributeArgument fileNameArgumentValue = new CustomAttributeArgument(stringRef, replacementPath.NewDefaultName);
|
|
CustomAttributeArgument orderArgumentValue = new CustomAttributeArgument(intRef, replacementPath.NewOrder);
|
|
|
|
CustomAttributeNamedArgument pathArgument = new CustomAttributeNamedArgument("menuName", pathArgumentValue);
|
|
CustomAttributeNamedArgument fileNameArgument = new CustomAttributeNamedArgument("fileName", fileNameArgumentValue);
|
|
CustomAttributeNamedArgument orderArgument = new CustomAttributeNamedArgument("order", orderArgumentValue);
|
|
|
|
createMenuAttribute.Properties.Clear();
|
|
createMenuAttribute.Properties.Add(pathArgument);
|
|
createMenuAttribute.Properties.Add(fileNameArgument);
|
|
createMenuAttribute.Properties.Add(orderArgument);
|
|
}
|
|
|
|
Applied = true;
|
|
}
|
|
|
|
private CustomAttribute GetCreateAssetMenuAttribute(TypeDefinition definition)
|
|
{
|
|
CustomAttribute[] foundAttributes = definition.CustomAttributes.Where(ca => ca.AttributeType.FullName.Contains("CreateAssetMenuAttribute")).ToArray();
|
|
|
|
if(foundAttributes.Length > 0)
|
|
{
|
|
return foundAttributes[0];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
|
|
[Serializable]
|
|
public struct ReplacementPath
|
|
{
|
|
[Tooltip("Specify the FULL NAME of the scriptable object you wish to modify. e.g. Sub.Namespace.Type")]
|
|
public string ScriptableObjectName;
|
|
|
|
[Tooltip("The new create asset path of the scriptable object")]
|
|
public string NewPath;
|
|
|
|
[Tooltip("The new default name of the scriptable object when created")]
|
|
public string NewDefaultName;
|
|
|
|
[Tooltip("The new ordering of the scriptable object in menu")]
|
|
public int NewOrder;
|
|
}
|
|
}
|
|
}
|