diff --git a/Mods/RespriteHero.dll b/Mods/RespriteHero.dll new file mode 100644 index 0000000..37fb31c Binary files /dev/null and b/Mods/RespriteHero.dll differ diff --git a/RespriteHero.zip b/RespriteHero.zip new file mode 100644 index 0000000..b3593bd Binary files /dev/null and b/RespriteHero.zip differ diff --git a/RespriteHero/Properties/AssemblyInfo.cs b/RespriteHero/Properties/AssemblyInfo.cs index b235aba..47dcaf9 100644 --- a/RespriteHero/Properties/AssemblyInfo.cs +++ b/RespriteHero/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using MelonLoader; @@ -14,7 +13,7 @@ [assembly: AssemblyCopyright("Copyright © 2022")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -[assembly: MelonInfo(typeof(RespriteHero.RespriteHero), "RespriteHero", "0.3.0", "Ignacio Zevallos")] +[assembly: MelonInfo(typeof(RespriteHero.RespriteHero), "RespriteHero", "0.3.2", "Ignacio Zevallos")] [assembly: MelonGame("TheJaspel", "Backpack Hero")] // Setting ComVisible to false makes the types in this assembly not visible @@ -35,5 +34,5 @@ // 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("0.3.0")] -[assembly: AssemblyFileVersion("0.3.0")] +[assembly: AssemblyVersion("0.3.2")] +[assembly: AssemblyFileVersion("0.3.2")] diff --git a/RespriteHero/RespriteHero.cs b/RespriteHero/RespriteHero.cs index c39d886..52f276b 100644 --- a/RespriteHero/RespriteHero.cs +++ b/RespriteHero/RespriteHero.cs @@ -4,20 +4,16 @@ using System.IO; using UnityEngine; using System.Linq; +using System; namespace RespriteHero { public class RespriteHero : MelonMod { - public static string TEXTURE_DIRECTORY = "/../ModConfig/RespriteHero/"; - //Cache of all the used sprites - public static Dictionary SPRITE_CACHE = new Dictionary(); - //Cache of all unused sprites, so we don't have to call - //IO operations every time we want to use a sprite - public static List UNUSED_CACHE = new List(); + public static string TEXTURE_DIRECTORY = @"\ModConfig\RespriteHero\"; public override void OnApplicationLateStart() { LoggerInstance.Msg("Texture Pack Mod Initialized"); - + UnityEngine.SceneManagement.SceneManager.sceneLoaded += OnSceneLoad; string path = Application.dataPath + TEXTURE_DIRECTORY; if (!Directory.Exists(path)) { LoggerInstance.Msg("ModConfig/RespriteHero folder doesn't exist. Creating one..."); @@ -25,21 +21,9 @@ public override void OnApplicationLateStart() { } } - public static Sprite LoadPNGCache(string filePath, Item2 item) { - if (SPRITE_CACHE.ContainsKey(filePath)) { - return SPRITE_CACHE[filePath]; - } - else { - Sprite sprite = LoadPNG(filePath, item); - SPRITE_CACHE.Add(filePath, sprite); - return sprite; - } - } - public static Sprite LoadPNG(string filePath, Item2 item) { Texture2D tex = null; byte[] fileData; - float PPU = 16f; if (File.Exists(filePath)) { @@ -65,13 +49,15 @@ public static Sprite LoadPNG(string filePath, Item2 item) { if (PPU % 2 != 0) PPU += 1; + else if (PPU == 0) + return null; return Sprite.Create( tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f), PPU, //Calculated value based on image dimensions and item size - 0, + 0, SpriteMeshType.FullRect ); } @@ -81,70 +67,74 @@ public static int[] _BPTGetGridBounds(List colliders, Item2 item) Vector2 max = new Vector2 { x = 0, y = 0 }; Vector2 min = new Vector2 { x = 0, y = 0 }; if (colliders.Count > 0) { - foreach (BoxCollider2D collider in colliders) { - max.x = collider.bounds.max.x + collider.offset.x - item.gameObject.transform.position.x; - max.y = collider.bounds.max.y + collider.offset.y - item.gameObject.transform.position.y; - min.x = collider.bounds.min.x + collider.offset.x - item.gameObject.transform.position.x; - min.y = collider.bounds.min.y + collider.offset.y - item.gameObject.transform.position.y; + max.x = collider.size.x/2 + collider.offset.x - item.gameObject.transform.position.x; + max.y = collider.size.y/2 + collider.offset.y - item.gameObject.transform.position.y; + min.x = -collider.size.x/2 + collider.offset.x - item.gameObject.transform.position.x; + min.y = -collider.size.y/2 + collider.offset.y - item.gameObject.transform.position.y; } } - gridNum[0] = Mathf.RoundToInt(Mathf.Abs(max.x) + Mathf.Abs(min.x)); - gridNum[1] = Mathf.RoundToInt(Mathf.Abs(max.y) + Mathf.Abs(min.y)); + gridNum[0] = Mathf.RoundToInt(Mathf.Clamp(Mathf.Abs(max.x) + Mathf.Abs(min.x), 1, Mathf.Infinity)); + gridNum[1] = Mathf.RoundToInt(Mathf.Clamp(Mathf.Abs(max.y) + Mathf.Abs(min.y), 1, Mathf.Infinity)); + return gridNum; } - } - - //Every time an item is instantiated: - //Checks if the sprite exists in the cache - //If not, check if the expr - //This is not very efficient. But performance doesn't matter in - //the current context - [HarmonyPatch(typeof(Item2), "Start")] - class Item2_Start_Patch { - static void Postfix(ref Item2 __instance) { - string name = __instance.gameObject.name; - name = name.Replace("(Clone)", ""); - name = name.Replace("Variant", ""); - name = name.Replace("variant", ""); - name = name.Trim(); - string filename; - ItemSpriteChanger itemSpriteChanger = __instance.GetComponent(); - if (itemSpriteChanger != null) { - List sprites = typeof(ItemSpriteChanger).GetField( - "sprites", - System.Reflection.BindingFlags.NonPublic | - System.Reflection.BindingFlags.Instance - ).GetValue(itemSpriteChanger) as List; - - for (int i = 0; i < sprites.Count; i++) { - filename = Application.dataPath + RespriteHero.TEXTURE_DIRECTORY + name + "_" + i + ".png"; - MelonLogger.Msg($"[ItemSpriteChanger]: Opening filename[{filename}]"); - - if (RespriteHero.SPRITE_CACHE.ContainsKey(filename) || File.Exists(filename)) { - Sprite newSprite = RespriteHero.LoadPNGCache(filename, __instance); - sprites[i] = newSprite; + void OnSceneLoad(UnityEngine.SceneManagement.Scene scene, UnityEngine.SceneManagement.LoadSceneMode scenemode) { + if (scene.name == "Game") { + List prefabs = GameObject.FindObjectOfType().defaultItems; + List files = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory + TEXTURE_DIRECTORY).ToList(); + GameObject item = null; + foreach (string file in files) { + string[] split0 = file.Split(@"\".ToCharArray()); + string itemName = split0[split0.Length - 1].Replace(".png", "").Trim(); + if (file.Contains("_")) { + split0 = file.Split(@"\".ToCharArray()); + string[] split1 = split0[split0.Length - 1].Split('_'); + split1[1] = split1[1].Replace(".png", "").Trim(); + itemName = split1[0]; + if (file.Contains("Variant")) + item = prefabs.Find(x => x.name.Replace("Variant", "").Replace("variant", "").Replace("1", "").Trim() + " Variant" == itemName); + else + item = prefabs.Find(x => x.name.Replace("Variant", "").Replace("variant", "").Replace("1", "").Trim() == itemName && !x.name.Contains("Variant Variant")); + ItemSpriteChanger itemSpriteChanger = item.GetComponent(); + if (itemSpriteChanger != null) { + List sprites = typeof(ItemSpriteChanger).GetField( + "sprites", + System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Instance + ).GetValue(itemSpriteChanger) as List; + + Sprite newSprite = RespriteHero.LoadPNG(file, item.GetComponent()); + if (newSprite != null) { + int index; + if (int.TryParse(split1[1], out index)) { + sprites[index] = newSprite; + if (index == 0) { + item.GetComponent().sprite = newSprite; + item.GetComponent().material.mainTexture = newSprite.texture; + } + } + } + } } else { - RespriteHero.UNUSED_CACHE.Add(filename); + if (itemName.Contains("Variant")) { + item = prefabs.Find(x => x.name.Replace("Variant", "").Replace("variant", "").Replace("1", "").Trim() + " Variant" == itemName); + } + else { + item = prefabs.Find(x => x.name.Replace("Variant", "").Replace("variant", "").Replace("1", "").Trim() == itemName && !x.name.Contains("Variant Variant")); + } + if (item != null) { + Sprite newSprite = LoadPNG(file, item.GetComponent()); + if (newSprite != null) { + item.GetComponent().sprite = newSprite; + item.GetComponent().material.mainTexture = newSprite.texture; + } + } } } - - return; - } - - filename = Application.dataPath + RespriteHero.TEXTURE_DIRECTORY + name + ".png"; - - if (RespriteHero.SPRITE_CACHE.ContainsKey(filename) || File.Exists(filename)) { - MelonLogger.Msg($"[SpriteRenderer]: Opening filename[{filename}]"); - Sprite newSprite = RespriteHero.LoadPNGCache(filename, __instance); - SpriteRenderer spriteRenderer = __instance.gameObject.GetComponent(); - spriteRenderer.sprite = newSprite; - } - else { - RespriteHero.UNUSED_CACHE.Add(filename); } } } diff --git a/RespriteHero/RespriteHero.csproj b/RespriteHero/RespriteHero.csproj index 3880f10..dfd9be6 100644 --- a/RespriteHero/RespriteHero.csproj +++ b/RespriteHero/RespriteHero.csproj @@ -43,15 +43,15 @@ False - E:\SteamLibrary\steamapps\common\Backpack Hero\MelonLoader\0Harmony.dll + ..\..\..\..\..\..\..\Programs\Steam\steamapps\common\Backpack Hero\MelonLoader\0Harmony.dll False - E:\SteamLibrary\steamapps\common\Backpack Hero\Backpack Hero_Data\Managed\Assembly-CSharp.dll + ..\..\..\..\..\..\..\Programs\Steam\steamapps\common\Backpack Hero\Backpack Hero_Data\Managed\Assembly-CSharp.dll False - E:\SteamLibrary\steamapps\common\Backpack Hero\MelonLoader\MelonLoader.dll + ..\..\..\..\..\..\..\Programs\Steam\steamapps\common\Backpack Hero\MelonLoader\MelonLoader.dll False @@ -59,23 +59,23 @@ False - E:\SteamLibrary\steamapps\common\Backpack Hero\Backpack Hero_Data\Managed\Unity.TextMeshPro.dll + ..\..\..\..\..\..\..\Programs\Steam\steamapps\common\Backpack Hero\Backpack Hero_Data\Managed\Unity.TextMeshPro.dll False - E:\SteamLibrary\steamapps\common\Backpack Hero\Backpack Hero_Data\Managed\UnityEngine.dll + ..\..\..\..\..\..\..\Programs\Steam\steamapps\common\Backpack Hero\Backpack Hero_Data\Managed\UnityEngine.dll False - E:\SteamLibrary\steamapps\common\Backpack Hero\Backpack Hero_Data\Managed\UnityEngine.ImageConversionModule.dll + ..\..\..\..\..\..\..\Programs\Steam\steamapps\common\Backpack Hero\Backpack Hero_Data\Managed\UnityEngine.ImageConversionModule.dll False - E:\SteamLibrary\steamapps\common\Backpack Hero\Backpack Hero_Data\Managed\UnityEngine.CoreModule.dll + ..\..\..\..\..\..\..\Programs\Steam\steamapps\common\Backpack Hero\Backpack Hero_Data\Managed\UnityEngine.CoreModule.dll False - E:\SteamLibrary\steamapps\common\Backpack Hero\Backpack Hero_Data\Managed\UnityEngine.Physics2DModule.dll + ..\..\..\..\..\..\..\Programs\Steam\steamapps\common\Backpack Hero\Backpack Hero_Data\Managed\UnityEngine.Physics2DModule.dll @@ -83,4 +83,4 @@ - + \ No newline at end of file diff --git a/RespriteHero/RespriteHero.dll b/RespriteHero/RespriteHero.dll new file mode 100644 index 0000000..150f589 Binary files /dev/null and b/RespriteHero/RespriteHero.dll differ