using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using DM; using FhpSLib; using HarmonyLib; using Landfall.TABS; using SI; using SIComponents; using SLMA; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("StitchedItems")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("GeeztJeez")] [assembly: AssemblyProduct("StitchedItems")] [assembly: AssemblyCopyright("Copyright © 4Ever")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("7acfaef0-7669-4401-8bff-5a9a02e18c75")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace SI { public static class Manager { public static string comment; public static void Init(LandfallContentDatabase db) { UTI.LoadBundle("stitchitemsbundle"); Sprite val = UTI.LoadTexture2Sprite("icon_items"); string categoryName = "Stitched Items"; GameObject val2 = UTI.LoadGmObj("EmptyPropItem"); int startId = 99999999; comment = "----------------------------------------------------------------------------------------------------------------------------"; comment = "Custom Clothes"; comment = "----------------------------------------------------------------------------------------------------------------------------"; UTI.ICat.SetTag(UPool.MyPool.AddObject("SmartSkinnedPropScale", val2, true, (HideFlags)52, val, UTI.IDScan(UTI.assetType.Ability, startId), true), categoryName, (TagType)0); UTI.ICat.SetTag(UPool.MyPool.AddObject("SmartSkinnedPropRotation", val2, true, (HideFlags)52, val, UTI.IDScan(UTI.assetType.Ability, startId), true), categoryName, (TagType)0); UTI.ICat.SetTag(UPool.MyPool.AddObject("SmartSkinnedPropPosition", val2, true, (HideFlags)52, val, UTI.IDScan(UTI.assetType.Ability, startId), true), categoryName, (TagType)0); } public static void SetItemObject(GameObject itemObject) { if ((Object)(object)itemObject == (Object)(object)UPool.MyPool.GetObject("SmartSkinnedPropScale")) { itemObject.AddComponent().smartType = SmartSkinnedPropBehaviour.SmartType.Scale; } if ((Object)(object)itemObject == (Object)(object)UPool.MyPool.GetObject("SmartSkinnedPropRotation")) { itemObject.AddComponent().smartType = SmartSkinnedPropBehaviour.SmartType.Rotation; } if ((Object)(object)itemObject == (Object)(object)UPool.MyPool.GetObject("SmartSkinnedPropPosition")) { itemObject.AddComponent().smartType = SmartSkinnedPropBehaviour.SmartType.Position; } } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("GeeztJeez.StitchedItems", "StitchedItems", "1.0.0")] internal class Loader : BaseUnityPlugin { public static string modName; public static bool DebugEnabled; public static string modtitle; private void ApplyHarmony() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) try { new Harmony(modName).PatchAll(Assembly.GetExecutingAssembly()); Log(" Harmony patched successfully!"); } catch (Exception ex) { LogError("Harmony patch failed: " + ex); Log("Please contact Geezt Jeez or try reloading the game for proper installation..."); } } static Loader() { DebugEnabled = false; modtitle = "Stitched Items"; modName = "StitchedItems"; } public static void Log(string message) { if (DebugEnabled) { Debug.Log((object)$"[{modName}] {message}"); } } public static void LogWarning(string message) { if (DebugEnabled) { Debug.LogWarning((object)$"[{modName}] {message}"); } } public static void LogError(string message) { if (DebugEnabled) { Debug.LogError((object)$"[{modName}] {message}"); } } private void Awake() { ApplyHarmony(); ((MonoBehaviour)this).StartCoroutine(Call()); } private IEnumerator Call() { yield return (object)new WaitUntil((Func)(() => (Object)(object)Object.FindObjectOfType() != (Object)null)); yield return (object)new WaitUntil((Func)(() => ServiceLocator.GetService() != null)); Log($"Loading {modtitle}!"); SLMALoader.GetInstance(); Manager.Init(ContentDatabase.Instance().LandfallContentDatabase); GameObject[] array = Resources.FindObjectsOfTypeAll(); for (int num = 0; num < array.Length; num++) { Manager.SetItemObject(array[num]); } Log($"Loaded {modtitle} Successfully!"); } } public static class UTI { public static class ICat { public static void SetTag(GameObject item, string categoryName = "Technical Items", TagType tagType = (TagType)0) { //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) try { if ((Object)(object)item == (Object)null) { Loader.LogWarning("[SetTag] Provided item is null."); return; } CharacterItem componentInChildren = item.GetComponentInChildren(); if ((Object)(object)componentInChildren == (Object)null) { Loader.LogWarning("[SetTag] CharacterItem not found in children."); return; } if (componentInChildren.tags == null) { componentInChildren.tags = new List(); } string uniqueValue = categoryName; int num = 0; while (componentInChildren.tags.Exists((Tag tag) => tag.value == uniqueValue)) { num++; uniqueValue = $"{categoryName}_{num}"; if (num > 999999) { Loader.LogError("[SetTag] Failed to generate a unique tag value after 999999 attempts."); return; } } componentInChildren.tags.Add(new Tag { tagType = tagType, value = uniqueValue }); } catch (Exception ex) { Loader.LogError("[SetTag] Exception occurred: " + ex.Message); } } } public enum assetType { Prop, Ability } public static string comment; public static AssetBundle bundle; private static Dictionary CombatMoves { get { Dictionary dictionary = HelpLibrary.m_combatMoves; if (dictionary == null) { dictionary = (HelpLibrary.m_combatMoves = new Dictionary()); } return dictionary; } } private static Dictionary CharacterProps { get { Dictionary dictionary = HelpLibrary.m_characterProps; if (dictionary == null) { dictionary = (HelpLibrary.m_characterProps = new Dictionary()); } return dictionary; } } public static void LoadBundle(string assetBundleName) { Stream manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(assetBundleName); if (manifestResourceStream == null) { Loader.LogError("[LoadBundle] Failed to find resource: " + assetBundleName); } else if (!manifestResourceStream.CanRead) { Loader.LogError("[LoadBundle] Resource stream is not readable: " + assetBundleName); } else { bundle = AssetBundle.LoadFromStream(manifestResourceStream); } } public static Sprite LoadTexture2Sprite(string name) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) Texture2D val = (Texture2D)bundle.LoadAsset(name); ((Texture)val).filterMode = (FilterMode)0; return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)); } public static GameObject LoadGmObj(string name) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown return (GameObject)bundle.LoadAsset(name); } private static bool IsOccupied(DatabaseID id) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) if (!CombatMoves.ContainsKey(id)) { return CharacterProps.ContainsKey(id); } return true; } public static int IDScan(assetType type, int startId = 1) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) int num = Math.Max(1, startId); DatabaseID id = default(DatabaseID); ((DatabaseID)(ref id))..ctor(num); while (IsOccupied(id)) { Loader.LogWarning($"[IDChecker] ID {num} in use, trying {num + 1}…"); num++; ((DatabaseID)(ref id))..ctor(num); } Loader.Log($"[IDChecker] Found free ID: {num}"); return num; } } } namespace SIComponents { public class StitchedClothingBehaviour : MonoBehaviour { public Transform UnitBone; public string BoneName; public List ClothingBones = new List(); } } namespace TIHarmonyPatches { [HarmonyPatch(typeof(Stitcher), "StitchUnitEditor")] internal static class StitcherHarmonyPatch { private static readonly Dictionary ClothMasters; private static bool Prefix(GameObject sourceClothing, GameObject targetAvatar, TransformCatalog boneCatalog, ref GameObject[] __result) { //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) sourceClothing.SetActive(true); SkinnedMeshRenderer[] componentsInChildren = sourceClothing.GetComponentsInChildren(true); __result = (GameObject[])(object)new GameObject[componentsInChildren.Length]; for (int i = 0; i < componentsInChildren.Length; i++) { SkinnedMeshRenderer val = componentsInChildren[i]; Transform[] bones = val.bones; foreach (Transform val2 in bones) { if (!((Object)(object)val2 == (Object)null) && ((Dictionary)(object)boneCatalog).TryGetValue(((Object)val2).name, out Transform value)) { Transform orCreateMaster = GetOrCreateMaster(value); Transform orCreatePropContainer = GetOrCreatePropContainer(orCreateMaster, sourceClothing); if ((Object)(object)val2.parent != (Object)(object)orCreatePropContainer) { val2.SetParent(orCreatePropContainer, true); } StitchedClothingBehaviour component = ((Component)orCreateMaster).GetComponent(); if (!component.ClothingBones.Contains(val2)) { component.ClothingBones.Add(val2); } val2.localPosition = Vector3.zero; val2.localRotation = Quaternion.identity; val2.localScale = Vector3.one; } } if ((Object)(object)val.rootBone != (Object)null && ((Dictionary)(object)boneCatalog).TryGetValue(((Object)val.rootBone).name, out Transform value2)) { Transform orCreatePropContainer2 = GetOrCreatePropContainer(GetOrCreateMaster(value2), sourceClothing); if ((Object)(object)val.rootBone.parent != (Object)(object)orCreatePropContainer2) { val.rootBone.SetParent(orCreatePropContainer2, true); } } __result[i] = ((Component)val).gameObject; } sourceClothing.transform.SetParent(targetAvatar.transform, false); return false; } private static Transform GetOrCreateMaster(Transform unitBone) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (ClothMasters.TryGetValue(unitBone, out var value)) { return value; } GameObject val = new GameObject(((Object)unitBone).name + "ClothMaster"); value = val.transform; value.SetParent(unitBone, false); value.localPosition = Vector3.zero; value.localRotation = Quaternion.identity; value.localScale = Vector3.one; StitchedClothingBehaviour stitchedClothingBehaviour = val.AddComponent(); stitchedClothingBehaviour.UnitBone = unitBone; stitchedClothingBehaviour.BoneName = ((Object)unitBone).name; ClothMasters.Add(unitBone, value); return value; } static StitcherHarmonyPatch() { ClothMasters = new Dictionary(); } private static Transform GetOrCreatePropContainer(Transform clothMaster, GameObject sourceClothing) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) string text = ((Object)sourceClothing).name + "_" + ((Object)sourceClothing).GetInstanceID(); Transform val = clothMaster.Find(text); if ((Object)(object)val != (Object)null) { return val; } val = new GameObject(text).transform; val.SetParent(clothMaster, false); val.localPosition = Vector3.zero; val.localRotation = Quaternion.identity; val.localScale = Vector3.one; return val; } } [HarmonyPatch(typeof(CharacterItem), "Equip", new Type[] { typeof(GameObject), typeof(PropItemData), typeof(TransformCatalog), typeof(Team), typeof(bool) })] public static class CharacterItemEquipHarmonyPatch { private static readonly FieldInfo GameObjectsField = AccessTools.Field(typeof(CharacterItem), "m_gameObjects"); private static bool Prefix(CharacterItem __instance, GameObject unitRoot, PropItemData propData, TransformCatalog catalog, Team team, bool isUnitEditor, ref GameObject[] __result) { unitRoot.GetComponent(); if ((Object)(object)((Component)__instance).GetComponentInChildren() != (Object)null) { __instance.Equip(); GameObject[] array = Stitcher.StitchUnitEditor(((Component)__instance).gameObject, unitRoot, catalog); GameObjectsField.SetValue(__instance, array); __result = array; return true; } return true; } } } namespace SIComponents { public class SmartSkinnedPropBehaviour : MonoBehaviour { public enum SmartType { Scale, Position, Rotation } public int propBoneId; public int stitcherId; public SmartType smartType; public Vector3 values; public GameObject objectToAffect; private IEnumerator Start() { SetSettings(); objectToAffect = ((Component)((Component)((Component)this).transform.root).GetComponentsInChildren()[stitcherId].ClothingBones.ToArray()[propBoneId]).gameObject; while ((Object)(object)objectToAffect == (Object)null) { Loader.Log("Fetching object..."); yield return null; } if (Object.op_Implicit((Object)(object)objectToAffect)) { if (smartType == SmartType.Scale) { objectToAffect.transform.localScale = values; } else if (smartType == SmartType.Position) { objectToAffect.transform.localPosition = values; } else { objectToAffect.transform.localRotation = Quaternion.Euler(values); } } ((MonoBehaviour)this).StartCoroutine(MonitorPosition()); } private void SetSettings() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) Vector3 localScale = ((Component)this).transform.localScale; stitcherId = Mathf.RoundToInt(localScale.x); propBoneId = Mathf.RoundToInt(localScale.y); values = ((Component)this).transform.localPosition; } private IEnumerator MonitorPosition() { ((Component)this).transform.hasChanged = false; while (true) { if (((Component)this).transform.hasChanged) { ((Component)this).transform.hasChanged = false; if (values != ((Component)this).transform.localPosition) { values = ((Component)this).transform.localPosition; if (Object.op_Implicit((Object)(object)objectToAffect)) { switch (smartType) { case SmartType.Scale: objectToAffect.transform.localScale = values; break; case SmartType.Position: objectToAffect.transform.localPosition = values; break; case SmartType.Rotation: objectToAffect.transform.localRotation = Quaternion.Euler(values); break; } } } } yield return (object)new WaitForSeconds(0.1f); } } } }