From 252207c67fd9ca003280d88e9920144715bc5f72 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Thu, 22 Nov 2018 20:01:00 -0500 Subject: [PATCH 01/31] migrate to new NuGet package reference format --- PrismaticTools/PrismaticTools.csproj | 16 +++------------- PrismaticTools/packages.config | 4 ---- 2 files changed, 3 insertions(+), 17 deletions(-) delete mode 100644 PrismaticTools/packages.config diff --git a/PrismaticTools/PrismaticTools.csproj b/PrismaticTools/PrismaticTools.csproj index b44aab3..50fc74a 100644 --- a/PrismaticTools/PrismaticTools.csproj +++ b/PrismaticTools/PrismaticTools.csproj @@ -11,8 +11,6 @@ PrismaticTools v4.5 512 - - true @@ -53,6 +51,9 @@ + + + .\0Harmony.dll @@ -89,10 +90,6 @@ PreserveNewest - - - - @@ -112,11 +109,4 @@ - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - \ No newline at end of file diff --git a/PrismaticTools/packages.config b/PrismaticTools/packages.config deleted file mode 100644 index d798813..0000000 --- a/PrismaticTools/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From e544fa098b346935d936f02c6ecd5d5c9ee36a80 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Thu, 22 Nov 2018 20:01:49 -0500 Subject: [PATCH 02/31] update mod build config package --- PrismaticTools/PrismaticTools.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrismaticTools/PrismaticTools.csproj b/PrismaticTools/PrismaticTools.csproj index 50fc74a..f4f9ed9 100644 --- a/PrismaticTools/PrismaticTools.csproj +++ b/PrismaticTools/PrismaticTools.csproj @@ -52,7 +52,7 @@ - + From 66dce3ff337d1f3e698f3bc6b2f364c49743b549 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Thu, 22 Nov 2018 20:03:33 -0500 Subject: [PATCH 03/31] simplify project file using the new mod build config package features --- PrismaticTools/PrismaticTools.csproj | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/PrismaticTools/PrismaticTools.csproj b/PrismaticTools/PrismaticTools.csproj index f4f9ed9..30f4725 100644 --- a/PrismaticTools/PrismaticTools.csproj +++ b/PrismaticTools/PrismaticTools.csproj @@ -79,19 +79,11 @@ - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - + + + + Always @@ -104,9 +96,6 @@ Always - - PreserveNewest - \ No newline at end of file From a338e67f08bb70620aff08e7d5ec85869b9ae88e Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Thu, 22 Nov 2018 20:05:21 -0500 Subject: [PATCH 04/31] migrate to Harmony NuGet package --- PrismaticTools/0Harmony.dll | Bin 99840 -> 0 bytes PrismaticTools/PrismaticTools.csproj | 4 +--- 2 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 PrismaticTools/0Harmony.dll diff --git a/PrismaticTools/0Harmony.dll b/PrismaticTools/0Harmony.dll deleted file mode 100644 index 636194290d77c8f7fbcb7979027c6b9e6d18d765..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99840 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 diff --git a/PrismaticTools/PrismaticTools.csproj b/PrismaticTools/PrismaticTools.csproj index 30f4725..fdb342c 100644 --- a/PrismaticTools/PrismaticTools.csproj +++ b/PrismaticTools/PrismaticTools.csproj @@ -52,12 +52,10 @@ + - - .\0Harmony.dll - From fa4b47eef3db18a78331195c1505eaddf7774670 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Thu, 22 Nov 2018 20:06:16 -0500 Subject: [PATCH 05/31] bump versions for release, tweak manifest name --- PrismaticTools/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PrismaticTools/manifest.json b/PrismaticTools/manifest.json index 02cbf0e..d4a7d7f 100644 --- a/PrismaticTools/manifest.json +++ b/PrismaticTools/manifest.json @@ -1,10 +1,10 @@ { - "Name": "PrismaticTools", + "Name": "Prismatic Tools", "Author": "stokastic", - "Version": "1.7.0", + "Version": "1.7.1", "Description": "Adds prismatic tools and sprinklers to the game.", "UniqueID": "stokastic.PrismaticTools", "EntryDll": "PrismaticTools.dll", - "MinimumApiVersion": "2.7", + "MinimumApiVersion": "2.8", "UpdateKeys": [ "Nexus:2428" ] } \ No newline at end of file From b46d9ed0f1d0430a8d9b7295b6c2fd70c20c2cf4 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Mon, 26 Nov 2018 19:27:55 -0500 Subject: [PATCH 06/31] rework Harmony patching for crossplatform compatibility SMAPI automatically handles code changes between Linux/Mac and Windows, but it can't do that for type references in attributes. Using Harmony's API instead means the mod will work seamlessly across Linux/Mac/Windows without needing separate builds. --- PrismaticTools/Framework/Furnace.cs | 75 ------- PrismaticTools/Framework/PrismaticPatches.cs | 198 +++++++++++++++++++ PrismaticTools/Framework/Sprinkler.cs | 44 ----- PrismaticTools/Framework/Tools.cs | 108 ---------- PrismaticTools/ModEntry.cs | 53 ++++- PrismaticTools/PrismaticTools.csproj | 3 +- 6 files changed, 250 insertions(+), 231 deletions(-) delete mode 100644 PrismaticTools/Framework/Furnace.cs create mode 100644 PrismaticTools/Framework/PrismaticPatches.cs delete mode 100644 PrismaticTools/Framework/Tools.cs diff --git a/PrismaticTools/Framework/Furnace.cs b/PrismaticTools/Framework/Furnace.cs deleted file mode 100644 index 3f525c3..0000000 --- a/PrismaticTools/Framework/Furnace.cs +++ /dev/null @@ -1,75 +0,0 @@ -using Harmony; -using Microsoft.Xna.Framework; -using StardewValley; - -namespace PrismaticTools.Framework { - [HarmonyPatch(typeof(Farmer), "getTallyOfObject")] - internal class PrismaticGetTallyOfObject { - static public void Postfix(ref int __result, int index, bool bigCraftable) { - if (index == 382 && !bigCraftable) { - if (__result <= 0) { - __result = 666666; - return; - } - } - } - } - - [HarmonyPatch(typeof(Object), "performObjectDropInAction")] - internal class PrismaticPerformObjectDropInAction { - - static public bool Prefix(ref Object __instance, ref bool __result, ref Item dropInItem, bool probe, Farmer who) { - if (!(dropInItem is Object)) - return false; - Object object1 = dropInItem as Object; - - if (object1.ParentSheetIndex != 74) { - return true; - } - - if (__instance.name.Equals("Furnace")) { - if (who.IsLocalPlayer && who.getTallyOfObject(382, false) == 666666) { - if (!probe && who.IsLocalPlayer) - Game1.showRedMessage(Game1.content.LoadString("Strings\\StringsFromCSFiles:Object.cs.12772")); - return false; - } - if (__instance.heldObject.Value == null && !probe) { - __instance.heldObject.Value = new Object(PrismaticBarItem.INDEX, 5, false, -1, 0); - __instance.MinutesUntilReady = 2400; - who.currentLocation.playSound("furnace"); - __instance.initializeLightSource(__instance.TileLocation, false); - __instance.showNextIndex.Value = true; - - Multiplayer multiplayer = ModEntry.ModHelper.Reflection.GetField(typeof(Game1), "multiplayer").GetValue(); - multiplayer.broadcastSprites(who.currentLocation, new TemporaryAnimatedSprite[1] { - new TemporaryAnimatedSprite(30, __instance.TileLocation * 64f + new Vector2(0.0f, -16f), Color.White, 4, false, 50f, 10, 64, (float) (((double) __instance.TileLocation.Y + 1.0) * 64.0 / 10000.0 + 9.99999974737875E-05), -1, 0) { - alphaFade = 0.005f - } - }); - for (int index = who.Items.Count - 1; index >= 0; --index) { - if (who.Items[index] is Object && (who.Items[index] as Object).ParentSheetIndex == 382) { - --who.Items[index].Stack; - if (who.Items[index].Stack <= 0) { - who.Items[index] = (Item)null; - break; - } - break; - } - } - object1.Stack -= 1; - __result = object1.Stack <= 0; - return false; - } - if (__instance.heldObject.Value == null & probe) { - if (object1.ParentSheetIndex == 74) { - __instance.heldObject.Value = new Object(); - __result = true; - return false; - } - } - } - __result = false; - return false; - } - } -} \ No newline at end of file diff --git a/PrismaticTools/Framework/PrismaticPatches.cs b/PrismaticTools/Framework/PrismaticPatches.cs new file mode 100644 index 0000000..efbee86 --- /dev/null +++ b/PrismaticTools/Framework/PrismaticPatches.cs @@ -0,0 +1,198 @@ +using Harmony; +using System.Collections.Generic; +using StardewValley; +using Microsoft.Xna.Framework; + +using StardewValley.TerrainFeatures; +using Netcode; +using StardewValley.Tools; + +namespace PrismaticTools.Framework { + internal static class PrismaticPatches { + /********* + ** Furnace patches + *********/ + public static void Farmer_GetTallyOfObject(ref int __result, int index, bool bigCraftable) { + if (index == 382 && !bigCraftable) { + if (__result <= 0) { + __result = 666666; + return; + } + } + } + + public static bool Object_PerformObjectDropInAction(ref Object __instance, ref bool __result, ref Item dropInItem, bool probe, Farmer who) { + if (!(dropInItem is Object)) + return false; + Object object1 = dropInItem as Object; + + if (object1.ParentSheetIndex != 74) { + return true; + } + + if (__instance.name.Equals("Furnace")) { + if (who.IsLocalPlayer && who.getTallyOfObject(382, false) == 666666) { + if (!probe && who.IsLocalPlayer) + Game1.showRedMessage(Game1.content.LoadString("Strings\\StringsFromCSFiles:Object.cs.12772")); + return false; + } + if (__instance.heldObject.Value == null && !probe) { + __instance.heldObject.Value = new Object(PrismaticBarItem.INDEX, 5, false, -1, 0); + __instance.MinutesUntilReady = 2400; + who.currentLocation.playSound("furnace"); + __instance.initializeLightSource(__instance.TileLocation, false); + __instance.showNextIndex.Value = true; + + Multiplayer multiplayer = ModEntry.ModHelper.Reflection.GetField(typeof(Game1), "multiplayer").GetValue(); + multiplayer.broadcastSprites(who.currentLocation, new TemporaryAnimatedSprite[1] { + new TemporaryAnimatedSprite(30, __instance.TileLocation * 64f + new Vector2(0.0f, -16f), Color.White, 4, false, 50f, 10, 64, (float) (((double) __instance.TileLocation.Y + 1.0) * 64.0 / 10000.0 + 9.99999974737875E-05), -1, 0) { + alphaFade = 0.005f + } + }); + for (int index = who.Items.Count - 1; index >= 0; --index) { + if (who.Items[index] is Object && (who.Items[index] as Object).ParentSheetIndex == 382) { + --who.Items[index].Stack; + if (who.Items[index].Stack <= 0) { + who.Items[index] = (Item)null; + break; + } + break; + } + } + object1.Stack -= 1; + __result = object1.Stack <= 0; + return false; + } + if (__instance.heldObject.Value == null & probe) { + if (object1.ParentSheetIndex == 74) { + __instance.heldObject.Value = new Object(); + __result = true; + return false; + } + } + } + __result = false; + return false; + } + + /********* + ** Sprinkler patches + *********/ + public static bool Farm_AddCrows(ref Farm __instance) { + int num1 = 0; + foreach (KeyValuePair pair in __instance.terrainFeatures.Pairs) { + if (pair.Value is HoeDirt && (pair.Value as HoeDirt).crop != null) + ++num1; + } + List vector2List = new List(); + foreach (KeyValuePair pair in __instance.objects.Pairs) { + if (pair.Value.Name.Contains("arecrow")) { + vector2List.Add(pair.Key); + } + } + int num2 = System.Math.Min(4, num1 / 16); + for (int index1 = 0; index1 < num2; ++index1) { + if (Game1.random.NextDouble() < 1.0) { + for (int index2 = 0; index2 < 10; ++index2) { + Vector2 key = __instance.terrainFeatures.Pairs.ElementAt(Game1.random.Next(__instance.terrainFeatures.Count())).Key; + if (__instance.terrainFeatures[key] is HoeDirt && (__instance.terrainFeatures[key] as HoeDirt).crop != null && ((__instance.terrainFeatures[key] as HoeDirt).crop.currentPhase.Value) > 1) { + bool flag = false; + foreach (Vector2 index3 in vector2List) { + if ((double)Vector2.Distance(index3, key) < 9.0) { + flag = true; + ++__instance.objects[index3].SpecialVariable; + break; + } + } + if (!flag) { + (__instance.terrainFeatures[key] as HoeDirt).crop = (Crop)null; + break; + } + break; + } + } + } + } + return false; + } + + /********* + ** Tool patches + *********/ + public static void Tree_PerformToolAction(ref Tree __instance, Tool t, int explosion) { + if (t is Axe axe && axe.UpgradeLevel == 5 && explosion <= 0 && ModEntry.ModHelper.Reflection.GetField(__instance, "health").GetValue() > -99f) { + __instance.health.Value = 0.0f; + } + } + + public static void FruitTree_PerformToolAction(ref FruitTree __instance, Tool t, int explosion) { + if (t is Axe axe && axe.UpgradeLevel == 5 && explosion <= 0 && ModEntry.ModHelper.Reflection.GetField(__instance, "health").GetValue() > -99f) { + __instance.health.Value = 0.0f; + } + } + + public static void Pickaxe_DoFunction(ref Pickaxe __instance, GameLocation location, int x, int y, int power, Farmer who) { + if (__instance.UpgradeLevel == 5) { + if (location.Objects.TryGetValue(new Vector2(x/64, y/64), out Object obj)) { + if (obj.Name == "Stone") { + obj.MinutesUntilReady = 0; + } + } + } + } + + public static void ResourceClump_PerformToolAction(ref ResourceClump __instance, Tool t, int damage, Vector2 tileLocation, GameLocation location) { + if (t is Axe && t.UpgradeLevel == 5 && (__instance.parentSheetIndex.Value == 600 || __instance.parentSheetIndex.Value == 602)) { + __instance.health.Value = 0; + } + } + + public static void Tool_TilesAffected_Postfix(ref List __result, Vector2 tileLocation, int power, Farmer who) { + if (power >= 6) { + __result.Clear(); + Vector2 direction; + Vector2 orth; + int radius = ModEntry.Config.PrismaticToolWidth; + int length = ModEntry.Config.PrismaticToolLength; + switch (who.FacingDirection) { + case 0: direction = new Vector2(0, -1); orth = new Vector2(1, 0); break; + case 1: direction = new Vector2(1, 0); orth = new Vector2(0, 1); break; + case 2: direction = new Vector2(0, 1); orth = new Vector2(-1, 0); break; + case 3: direction = new Vector2(-1, 0); orth = new Vector2(0, -1); break; + default: direction = new Vector2(0, 0); orth = new Vector2(0, 0); break; + } + for (int i = 0; i < length; i++) { + __result.Add(direction * i + tileLocation); + for (int j = 1; j <= radius; j++) { + __result.Add(direction * i + orth * j + tileLocation); + __result.Add(direction * i + orth * -j + tileLocation); + } + } + } + } + + public static bool Tool_Name(Tool __instance, ref string __result) { + if (__instance.UpgradeLevel == 5) { + + switch (__instance.BaseName) { + case "Axe": __result = ModEntry.ModHelper.Translation.Get("prismaticAxe"); break; + case "Pickaxe": __result = ModEntry.ModHelper.Translation.Get("prismaticPickaxe"); break; + case "Watering Can": __result = ModEntry.ModHelper.Translation.Get("prismaticWatercan"); break; + case "Hoe": __result = ModEntry.ModHelper.Translation.Get("prismaticHoe"); break; + } + //__result = "Prismatic " + __instance.BaseName; + //__result = ModEntry.ModHelper.Translation.Get("prismatic.prefix") + " " + Game1.content.LoadString("Strings\\StringsFromCSFiles:Axe.cs.1"); + return false; + } + return true; + } + + public static bool Tool_DisplayName(Tool __instance, ref string __result) { + if (__instance.UpgradeLevel == 5) { + __result = __instance.Name; + return false; + } + return true; + } + } +} diff --git a/PrismaticTools/Framework/Sprinkler.cs b/PrismaticTools/Framework/Sprinkler.cs index 3e520b0..0a4c17a 100644 --- a/PrismaticTools/Framework/Sprinkler.cs +++ b/PrismaticTools/Framework/Sprinkler.cs @@ -3,9 +3,6 @@ using StardewValley.TerrainFeatures; using StardewModdingAPI.Events; using System.Collections.Generic; -using System.Linq; -using Harmony; -using System.Reflection.Emit; namespace PrismaticTools.Framework { @@ -96,47 +93,6 @@ private static void TimeEvents_AfterDayStarted(object sender, System.EventArgs e } } } - - [HarmonyPatch(typeof(Farm), "addCrows")] - internal class PrismaticAddCrows { - static public bool Prefix(ref Farm __instance) { - int num1 = 0; - foreach (KeyValuePair pair in __instance.terrainFeatures.Pairs) { - if (pair.Value is HoeDirt && (pair.Value as HoeDirt).crop != null) - ++num1; - } - List vector2List = new List(); - foreach (KeyValuePair pair in __instance.objects.Pairs) { - if (pair.Value.Name.Contains("arecrow")) { - vector2List.Add(pair.Key); - } - } - int num2 = System.Math.Min(4, num1 / 16); - for (int index1 = 0; index1 < num2; ++index1) { - if (Game1.random.NextDouble() < 1.0) { - for (int index2 = 0; index2 < 10; ++index2) { - Vector2 key = __instance.terrainFeatures.Pairs.ElementAt(Game1.random.Next(__instance.terrainFeatures.Count())).Key; - if (__instance.terrainFeatures[key] is HoeDirt && (__instance.terrainFeatures[key] as HoeDirt).crop != null && ((__instance.terrainFeatures[key] as HoeDirt).crop.currentPhase.Value) > 1) { - bool flag = false; - foreach (Vector2 index3 in vector2List) { - if ((double)Vector2.Distance(index3, key) < 9.0) { - flag = true; - ++__instance.objects[index3].SpecialVariable; - break; - } - } - if (!flag) { - (__instance.terrainFeatures[key] as HoeDirt).crop = (Crop)null; - break; - } - break; - } - } - } - } - return false; - } - } } } diff --git a/PrismaticTools/Framework/Tools.cs b/PrismaticTools/Framework/Tools.cs deleted file mode 100644 index 2f8e3b8..0000000 --- a/PrismaticTools/Framework/Tools.cs +++ /dev/null @@ -1,108 +0,0 @@ -using Harmony; -using System.Collections.Generic; -using StardewValley; -using Microsoft.Xna.Framework; - -using StardewValley.TerrainFeatures; -using Netcode; -using StardewValley.Tools; - -namespace PrismaticTools.Framework { - - [HarmonyPatch(typeof(Tree), "performToolAction")] - internal class PrismaticPerformToolActionTree { - static void Prefix(ref Tree __instance, Tool t, int explosion) { - if (t is Axe && (t as Axe).UpgradeLevel == 5 && explosion <= 0 && ModEntry.ModHelper.Reflection.GetField(__instance, "health").GetValue() > -99f) { - __instance.health.Value = 0.0f; - } - } - } - - [HarmonyPatch(typeof(FruitTree), "performToolAction")] - internal class PrismaticPerformToolActionFruitTree { - static void Prefix(ref FruitTree __instance, Tool t, int explosion) { - if (t is Axe && (t as Axe).UpgradeLevel == 5 && explosion <= 0 && ModEntry.ModHelper.Reflection.GetField(__instance, "health").GetValue() > -99f) { - __instance.health.Value = 0.0f; - } - } - } - - [HarmonyPatch(typeof(Pickaxe), "DoFunction")] - internal class PrimaticDoFunction { - static void Prefix(ref Pickaxe __instance, GameLocation location, int x, int y, int power, Farmer who) { - if (__instance.UpgradeLevel == 5) { - if (location.Objects.TryGetValue(new Vector2(x/64, y/64), out Object obj)) { - if (obj.Name == "Stone") { - obj.MinutesUntilReady = 0; - } - } - } - } - } - - [HarmonyPatch(typeof(ResourceClump), "performToolAction")] - internal class PrismaticPerformToolActionResourceClump { - static void Prefix(ref ResourceClump __instance, Tool t, int damage, Vector2 tileLocation, GameLocation location) { - if (t is Axe && t.UpgradeLevel == 5 && (__instance.parentSheetIndex.Value == 600 || __instance.parentSheetIndex.Value == 602)) { - __instance.health.Value = 0; - } - } - } - - [HarmonyPatch(typeof(Tool), "tilesAffected")] - internal class PrismaticTilesAffected { - static void Postfix(ref List __result, Vector2 tileLocation, int power, Farmer who) { - if (power >= 6) { - __result.Clear(); - Vector2 direction; - Vector2 orth; - int radius = ModEntry.Config.PrismaticToolWidth; - int length = ModEntry.Config.PrismaticToolLength; - switch (who.FacingDirection) { - case 0: direction = new Vector2(0, -1); orth = new Vector2(1, 0); break; - case 1: direction = new Vector2(1, 0); orth = new Vector2(0, 1); break; - case 2: direction = new Vector2(0, 1); orth = new Vector2(-1, 0); break; - case 3: direction = new Vector2(-1, 0); orth = new Vector2(0, -1); break; - default: direction = new Vector2(0, 0); orth = new Vector2(0, 0); break; - } - for (int i = 0; i < length; i++) { - __result.Add(direction * i + tileLocation); - for (int j = 1; j <= radius; j++) { - __result.Add(direction * i + orth * j + tileLocation); - __result.Add(direction * i + orth * -j + tileLocation); - } - } - } - } - } - - [HarmonyPatch(typeof(Tool), "get_Name")] - internal class PrismaticGetName { - public static bool Prefix(Tool __instance, ref string __result) { - if (__instance.UpgradeLevel == 5) { - - switch (__instance.BaseName) { - case "Axe": __result = ModEntry.ModHelper.Translation.Get("prismaticAxe"); break; - case "Pickaxe": __result = ModEntry.ModHelper.Translation.Get("prismaticPickaxe"); break; - case "Watering Can": __result = ModEntry.ModHelper.Translation.Get("prismaticWatercan"); break; - case "Hoe": __result = ModEntry.ModHelper.Translation.Get("prismaticHoe"); break; - } - //__result = "Prismatic " + __instance.BaseName; - //__result = ModEntry.ModHelper.Translation.Get("prismatic.prefix") + " " + Game1.content.LoadString("Strings\\StringsFromCSFiles:Axe.cs.1"); - return false; - } - return true; - } - } - - [HarmonyPatch(typeof(Tool), "get_DisplayName")] - internal static class CobaltDisplayNameHook { - public static bool Prefix(Tool __instance, ref string __result) { - if (__instance.UpgradeLevel == 5) { - __result = __instance.Name; - return false; - } - return true; - } - } -} diff --git a/PrismaticTools/ModEntry.cs b/PrismaticTools/ModEntry.cs index 658c927..c5c1ab0 100644 --- a/PrismaticTools/ModEntry.cs +++ b/PrismaticTools/ModEntry.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using StardewValley.Objects; using StardewValley.Locations; +using StardewValley.TerrainFeatures; using StardewValley.Tools; namespace PrismaticTools { @@ -46,7 +47,55 @@ public override void Entry(IModHelper helper) { InitColors(); var harmony = HarmonyInstance.Create("stokastic.PrismaticTools"); - harmony.PatchAll(Assembly.GetExecutingAssembly()); + this.ApplyPatches(harmony); + } + + private void ApplyPatches(HarmonyInstance harmony) { + // furnaces + harmony.Patch( + original: AccessTools.Method(typeof(Farmer), nameof(Farmer.getTallyOfObject)), + prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Farmer_GetTallyOfObject)) + ); + harmony.Patch( + original: AccessTools.Method(typeof(Object), nameof(Object.performObjectDropInAction)), + prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Object_PerformObjectDropInAction)) + ); + + // sprinklers + harmony.Patch( + original: AccessTools.Method(typeof(Farm), nameof(Farm.addCrows)), + prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Farm_AddCrows)) + ); + + // tools + harmony.Patch( + original: AccessTools.Method(typeof(Tree), nameof(Tree.performToolAction)), + prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Tree_PerformToolAction)) + ); + harmony.Patch( + original: AccessTools.Method(typeof(FruitTree), nameof(FruitTree.performToolAction)), + prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.FruitTree_PerformToolAction)) + ); + harmony.Patch( + original: AccessTools.Method(typeof(Pickaxe), nameof(Pickaxe.DoFunction)), + prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Pickaxe_DoFunction)) + ); + harmony.Patch( + original: AccessTools.Method(typeof(ResourceClump), nameof(ResourceClump.performToolAction)), + prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.ResourceClump_PerformToolAction)) + ); + harmony.Patch( + original: AccessTools.Method(typeof(Tool), "tilesAffected"), + postfix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Tool_TilesAffected_Postfix)) + ); + harmony.Patch( + original: AccessTools.Property(typeof(Tool), nameof(Tool.Name)).GetMethod, + prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Tool_Name)) + ); + harmony.Patch( + original: AccessTools.Property(typeof(Tool), nameof(Tool.DisplayName)).GetMethod, + prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Tool_DisplayName)) + ); } private void GameEvents_EighthUpdateTick(object sender, System.EventArgs e) { @@ -58,7 +107,7 @@ private void GameEvents_EighthUpdateTick(object sender, System.EventArgs e) { return; } - if (item == null || !(item is Object) || !((item as Object).ParentSheetIndex == PrismaticBarItem.INDEX)) { + if (!(item is Object obj) || obj.ParentSheetIndex != PrismaticBarItem.INDEX) { return; } diff --git a/PrismaticTools/PrismaticTools.csproj b/PrismaticTools/PrismaticTools.csproj index fdb342c..88181bb 100644 --- a/PrismaticTools/PrismaticTools.csproj +++ b/PrismaticTools/PrismaticTools.csproj @@ -68,11 +68,10 @@ - + - From 5abe7263b290588d306a22c81e9d79ef215509ce Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Tue, 8 Jan 2019 21:08:37 -0500 Subject: [PATCH 07/31] update for SMAPI 3.0 --- PrismaticTools/Framework/Blacksmith.cs | 12 +++++----- PrismaticTools/Framework/Sprinkler.cs | 23 +++++++++++++------ PrismaticTools/ModEntry.cs | 31 ++++++++++++++++++-------- PrismaticTools/manifest.json | 2 +- 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/PrismaticTools/Framework/Blacksmith.cs b/PrismaticTools/Framework/Blacksmith.cs index 15f8656..9b788c7 100644 --- a/PrismaticTools/Framework/Blacksmith.cs +++ b/PrismaticTools/Framework/Blacksmith.cs @@ -11,15 +11,17 @@ class BlacksmithInitializer { private static int UpgradeCost = ModEntry.Config.PrismaticToolCost; private static int NumBars = 3; - public static void Init() { - MenuEvents.MenuChanged += MenuEvents_MenuChanged1; + public static void Init(IModEvents events) { + events.Display.MenuChanged += OnMenuChanged; } - private static void MenuEvents_MenuChanged1(object sender, EventArgsClickableMenuChanged e) { - if (!(e.NewMenu is ShopMenu)) { + /// Raised after a game menu is opened, closed, or replaced. + /// The event sender. + /// The event arguments. + private static void OnMenuChanged(object sender, MenuChangedEventArgs e) { + if (!(e.NewMenu is ShopMenu menu)) { return; } - ShopMenu menu = e.NewMenu as ShopMenu; List categories = ModEntry.ModHelper.Reflection.GetField>(menu, "categoriesToSellHere").GetValue(); if (!categories.Contains(Object.GemCategory) || !categories.Contains(Object.mineralsCategory) || !categories.Contains(Object.metalResources)) { return; diff --git a/PrismaticTools/Framework/Sprinkler.cs b/PrismaticTools/Framework/Sprinkler.cs index 0a4c17a..adfb172 100644 --- a/PrismaticTools/Framework/Sprinkler.cs +++ b/PrismaticTools/Framework/Sprinkler.cs @@ -12,13 +12,16 @@ namespace PrismaticTools.Framework { // - optionally makes them act as scarecrows public static class SprinklerInitializer { - public static void Init() { - TimeEvents.AfterDayStarted += TimeEvents_AfterDayStarted; - SaveEvents.AfterLoad += SaveEvents_AfterLoad; - LocationEvents.ObjectsChanged += LocationEvents_ObjectsChanged; + public static void Init(IModEvents events) { + events.GameLoop.DayStarted += OnDayStarted; + events.GameLoop.SaveLoaded += OnSaveLoaded; + events.World.ObjectListChanged += OnObjectListChanged; } - private static void SaveEvents_AfterLoad(object sender, System.EventArgs e) { + /// Raised after the player loads a save slot and the world is initialised. + /// The event sender. + /// The event arguments. + private static void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { if (ModEntry.Config.UseSprinklersAsScarecrows) { foreach (GameLocation location in Game1.locations) { foreach (Object obj in location.Objects.Values) { @@ -48,7 +51,10 @@ private static void SaveEvents_AfterLoad(object sender, System.EventArgs e) { } } - private static void LocationEvents_ObjectsChanged(object sender, EventArgsLocationObjectsChanged e) { + /// Raised after objects are added or removed in a location. + /// The event sender. + /// The event arguments. + private static void OnObjectListChanged(object sender, ObjectListChangedEventArgs e) { // adds lightsources to newly placed sprinkler if (!ModEntry.Config.UseSprinklersAsLamps) { return; @@ -64,7 +70,10 @@ private static void LocationEvents_ObjectsChanged(object sender, EventArgsLocati } } - private static void TimeEvents_AfterDayStarted(object sender, System.EventArgs e) { + /// Raised after the game begins a new day (including when the player loads a save). + /// The event sender. + /// The event arguments. + private static void OnDayStarted(object sender, DayStartedEventArgs e) { foreach (GameLocation location in Game1.locations) { foreach (Object obj in location.Objects.Values) { if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { diff --git a/PrismaticTools/ModEntry.cs b/PrismaticTools/ModEntry.cs index c5c1ab0..68a6fb1 100644 --- a/PrismaticTools/ModEntry.cs +++ b/PrismaticTools/ModEntry.cs @@ -36,13 +36,13 @@ public override void Entry(IModHelper helper) { helper.ConsoleCommands.Add("ptools", "Upgrade all tools to prismatic", UpgradeTools); - SaveEvents.AfterLoad += SaveEvents_AfterLoad; - PlayerEvents.InventoryChanged += PlayerEvents_InventoryChanged; - GameEvents.EighthUpdateTick += GameEvents_EighthUpdateTick; + helper.Events.GameLoop.SaveLoaded += OnSaveLoaded; + helper.Events.GameLoop.UpdateTicked += OnUpdateTicked; + helper.Events.Player.InventoryChanged += OnInventoryChanged; helper.Content.AssetEditors.Add(new AssetEditor()); - SprinklerInitializer.Init(); - BlacksmithInitializer.Init(); + SprinklerInitializer.Init(helper.Events); + BlacksmithInitializer.Init(helper.Events); InitColors(); @@ -98,7 +98,13 @@ private void ApplyPatches(HarmonyInstance harmony) { ); } - private void GameEvents_EighthUpdateTick(object sender, System.EventArgs e) { + /// Raised after the game state is updated (≈60 times per second). + /// The event sender. + /// The event arguments. + private void OnUpdateTicked(object sender, UpdateTickedEventArgs e) { + if (!e.IsMultipleOf(8)) + return; + Farmer farmer = Game1.player; Item item; try { @@ -147,11 +153,18 @@ private void AddLightsToInventoryItems() { } } - private void PlayerEvents_InventoryChanged(object sender, EventArgsInventoryChanged e) { - AddLightsToInventoryItems(); + /// Raised after items are added or removed to a player's inventory. + /// The event sender. + /// The event arguments. + private void OnInventoryChanged(object sender, InventoryChangedEventArgs e) { + if (e.IsLocalPlayer) + AddLightsToInventoryItems(); } - private void SaveEvents_AfterLoad(object sender, System.EventArgs e) { + /// Raised after the player loads a save slot and the world is initialised. + /// The event sender. + /// The event arguments. + private void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { // force add sprinkler recipe for people who were level 10 before installing mod if (Game1.player.FarmingLevel >= PrismaticSprinklerItem.CRAFTING_LEVEL) { try { diff --git a/PrismaticTools/manifest.json b/PrismaticTools/manifest.json index d4a7d7f..754d047 100644 --- a/PrismaticTools/manifest.json +++ b/PrismaticTools/manifest.json @@ -5,6 +5,6 @@ "Description": "Adds prismatic tools and sprinklers to the game.", "UniqueID": "stokastic.PrismaticTools", "EntryDll": "PrismaticTools.dll", - "MinimumApiVersion": "2.8", + "MinimumApiVersion": "2.10.1", "UpdateKeys": [ "Nexus:2428" ] } \ No newline at end of file From 3ece888fb738d46dfa4dc8acacc04ff9fc750186 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Tue, 8 Jan 2019 21:09:40 -0500 Subject: [PATCH 08/31] update for Stardew Valley 1.3.33 --- PrismaticTools/Framework/Sprinkler.cs | 30 +++++++++++++-------------- PrismaticTools/ModEntry.cs | 7 +++---- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/PrismaticTools/Framework/Sprinkler.cs b/PrismaticTools/Framework/Sprinkler.cs index adfb172..f1e348b 100644 --- a/PrismaticTools/Framework/Sprinkler.cs +++ b/PrismaticTools/Framework/Sprinkler.cs @@ -1,8 +1,10 @@ -using Microsoft.Xna.Framework; +using System; +using Microsoft.Xna.Framework; using StardewValley; using StardewValley.TerrainFeatures; using StardewModdingAPI.Events; using System.Collections.Generic; +using SObject = StardewValley.Object; namespace PrismaticTools.Framework { @@ -24,7 +26,7 @@ public static void Init(IModEvents events) { private static void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { if (ModEntry.Config.UseSprinklersAsScarecrows) { foreach (GameLocation location in Game1.locations) { - foreach (Object obj in location.Objects.Values) { + foreach (SObject obj in location.Objects.Values) { if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { obj.Name = "Prismatic Scarecrow Sprinkler"; } @@ -36,16 +38,14 @@ private static void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { if (!ModEntry.Config.UseSprinklersAsLamps) { return; } - Object sprinkler; + foreach (GameLocation location in Game1.locations) { - if (location is GameLocation) { - foreach (KeyValuePair pair in location.objects.Pairs) { - if (location.objects[pair.Key].ParentSheetIndex == PrismaticSprinklerItem.INDEX) { - sprinkler = location.objects[pair.Key]; - int id = (int)sprinkler.TileLocation.X * 4000 + (int)sprinkler.TileLocation.Y; - sprinkler.lightSource = new LightSource(4, new Vector2((sprinkler.boundingBox.X + 32), (sprinkler.boundingBox.Y + 32)), 2.0f, Color.Black, id); - location.sharedLights.Add(sprinkler.lightSource.Clone()); - } + foreach (KeyValuePair pair in location.objects.Pairs) { + if (location.objects[pair.Key].ParentSheetIndex == PrismaticSprinklerItem.INDEX) { + SObject sprinkler = location.objects[pair.Key]; + int id = (int)sprinkler.TileLocation.X * 4000 + (int)sprinkler.TileLocation.Y; + sprinkler.lightSource = new LightSource(4, new Vector2((sprinkler.boundingBox.X + 32), (sprinkler.boundingBox.Y + 32)), 2.0f, Color.Black, id); + location.sharedLights.Add(id, sprinkler.lightSource.Clone()); } } } @@ -59,13 +59,13 @@ private static void OnObjectListChanged(object sender, ObjectListChangedEventArg if (!ModEntry.Config.UseSprinklersAsLamps) { return; } - foreach (KeyValuePair pair in e.Added) { - Object obj = pair.Value; + foreach (KeyValuePair pair in e.Added) { + SObject obj = pair.Value; if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { int id = (int)obj.TileLocation.X * 4000 + (int)obj.TileLocation.Y; obj.lightSource = new LightSource(4, new Vector2((obj.boundingBox.X + 32), (obj.boundingBox.Y + 32)), 2.0f, Color.Black, id); obj.Name = "Prismatic Scarecrow Sprinkler"; - Game1.currentLocation.sharedLights.Add(obj.lightSource.Clone()); + e.Location.sharedLights.Add(id, obj.lightSource.Clone()); } } } @@ -75,7 +75,7 @@ private static void OnObjectListChanged(object sender, ObjectListChangedEventArg /// The event arguments. private static void OnDayStarted(object sender, DayStartedEventArgs e) { foreach (GameLocation location in Game1.locations) { - foreach (Object obj in location.Objects.Values) { + foreach (SObject obj in location.Objects.Values) { if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { // add water spray animation diff --git a/PrismaticTools/ModEntry.cs b/PrismaticTools/ModEntry.cs index 68a6fb1..90e3c74 100644 --- a/PrismaticTools/ModEntry.cs +++ b/PrismaticTools/ModEntry.cs @@ -1,6 +1,5 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; -using System.Reflection; using Harmony; using StardewValley; @@ -117,9 +116,9 @@ private void OnUpdateTicked(object sender, UpdateTickedEventArgs e) { return; } - for (int i=0; i Date: Wed, 9 Jan 2019 19:12:28 -0500 Subject: [PATCH 09/31] fix sprinkler light feature --- PrismaticTools/Framework/Sprinkler.cs | 55 ++++++++++++++------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/PrismaticTools/Framework/Sprinkler.cs b/PrismaticTools/Framework/Sprinkler.cs index f1e348b..b0f1b42 100644 --- a/PrismaticTools/Framework/Sprinkler.cs +++ b/PrismaticTools/Framework/Sprinkler.cs @@ -1,5 +1,4 @@ -using System; -using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework; using StardewValley; using StardewValley.TerrainFeatures; using StardewModdingAPI.Events; @@ -34,19 +33,11 @@ private static void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { } } - // set light source - if (!ModEntry.Config.UseSprinklersAsLamps) { - return; - } - - foreach (GameLocation location in Game1.locations) { - foreach (KeyValuePair pair in location.objects.Pairs) { - if (location.objects[pair.Key].ParentSheetIndex == PrismaticSprinklerItem.INDEX) { - SObject sprinkler = location.objects[pair.Key]; - int id = (int)sprinkler.TileLocation.X * 4000 + (int)sprinkler.TileLocation.Y; - sprinkler.lightSource = new LightSource(4, new Vector2((sprinkler.boundingBox.X + 32), (sprinkler.boundingBox.Y + 32)), 2.0f, Color.Black, id); - location.sharedLights.Add(id, sprinkler.lightSource.Clone()); - } + // set light sources + if (ModEntry.Config.UseSprinklersAsLamps) { + foreach (GameLocation location in Game1.locations) { + foreach (KeyValuePair pair in location.objects.Pairs) + TryEnablePrismaticSprinkler(location, pair.Key, pair.Value); } } } @@ -55,21 +46,31 @@ private static void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { /// The event sender. /// The event arguments. private static void OnObjectListChanged(object sender, ObjectListChangedEventArgs e) { - // adds lightsources to newly placed sprinkler - if (!ModEntry.Config.UseSprinklersAsLamps) { - return; - } - foreach (KeyValuePair pair in e.Added) { - SObject obj = pair.Value; - if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { - int id = (int)obj.TileLocation.X * 4000 + (int)obj.TileLocation.Y; - obj.lightSource = new LightSource(4, new Vector2((obj.boundingBox.X + 32), (obj.boundingBox.Y + 32)), 2.0f, Color.Black, id); - obj.Name = "Prismatic Scarecrow Sprinkler"; - e.Location.sharedLights.Add(id, obj.lightSource.Clone()); - } + // adds light sources to newly placed sprinklers + if (ModEntry.Config.UseSprinklersAsLamps) { + foreach (KeyValuePair pair in e.Added) + TryEnablePrismaticSprinkler(e.Location, pair.Key, pair.Value); } } + /// Try to add the light source for a prismatic sprinkler, if applicable. + /// The location containing the sprinkler. + /// The sprinkler's tile coordinate within the location. + /// The object to check. + private static void TryEnablePrismaticSprinkler(GameLocation location, Vector2 tile, SObject obj) + { + if (obj.ParentSheetIndex != PrismaticSprinklerItem.INDEX || !ModEntry.Config.UseSprinklersAsLamps) + return; + + // set name + obj.Name = "Prismatic Scarecrow Sprinkler"; + + // add light source + int id = (int)tile.X * 4000 + (int)tile.Y; + obj.lightSource = new LightSource(4, tile * Game1.tileSize, 2.0f, Color.Black, id); + location.sharedLights.Add(id, obj.lightSource); + } + /// Raised after the game begins a new day (including when the player loads a save). /// The event sender. /// The event arguments. From 47d15a3a2405335e5407d66785f7b6dfb066aff3 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Fri, 18 Jan 2019 22:11:59 -0500 Subject: [PATCH 10/31] fix null reference exceptions in some cases --- PrismaticTools/ModEntry.cs | 65 ++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/PrismaticTools/ModEntry.cs b/PrismaticTools/ModEntry.cs index 90e3c74..b580015 100644 --- a/PrismaticTools/ModEntry.cs +++ b/PrismaticTools/ModEntry.cs @@ -179,39 +179,45 @@ private void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { private void IndexCompatibilityFix() { var watch = System.Diagnostics.Stopwatch.StartNew(); foreach (GameLocation location in Game1.locations) { - if (location is FarmHouse) { - // check fridge - if ((location as FarmHouse).fridge.Value != null) { - foreach (Item item in (location as FarmHouse).fridge.Value.items) { - if (item == null) { - continue; - } - if (item.Name.Contains("Prismatic")) { + // check fridge + if (location is FarmHouse farmhouse && farmhouse.fridge.Value is Chest fridge) { + foreach (Item item in fridge.items) { + if (item?.Name != null && item.Name.Contains("Prismatic")) { SwapIndex(item); } } - } } - foreach (Object obj in location.Objects.Values) { - // check chests, signposts, furnaces, and placed sprinklers - if (obj == null) { - continue; - } - if (obj is Chest) { - foreach (Item item in (obj as Chest).items) { - if (item.Name.Contains("Prismatic")) { - SwapIndex(item); + // check chests, signposts, furnaces, and placed sprinklers + foreach (Object obj in location.Objects.Values) + { + switch (obj) + { + // chest + case Chest chest: + foreach (Item item in chest.items) { + if (item?.Name != null && item.Name.Contains("Prismatic")) { + SwapIndex(item); + } } - } - } else if (obj is Sign) { - SwapIndex((obj as Sign).displayItem.Value); - } else if (obj.bigCraftable.Value && obj.name.Equals("Furnace")) { - if (obj.heldObject.Value != null) { - SwapIndex((obj.heldObject.Value)); - } - } else if (obj.ParentSheetIndex == PrismaticBarItem.OLD_INDEX || obj.ParentSheetIndex == PrismaticSprinklerItem.OLD_INDEX) { - SwapIndex(obj); + break; + + // sign + case Sign sign: + SwapIndex(sign.displayItem.Value); + break; + + default: + // furnace + if (obj.bigCraftable.Value && obj.Name == "Furnace") { + SwapIndex(obj.heldObject.Value); + } + + // prismatic bar/sprinkler + else if (obj.ParentSheetIndex == PrismaticBarItem.OLD_INDEX || obj.ParentSheetIndex == PrismaticSprinklerItem.OLD_INDEX) { + SwapIndex(obj); + } + break; } } } @@ -221,11 +227,16 @@ private void IndexCompatibilityFix() { SwapIndex(item); } } + watch.Stop(); Monitor.Log($"IndexCompatibility exec time: {watch.ElapsedMilliseconds} ms", LogLevel.Trace); } private void SwapIndex(Item item) { + if (item == null) { + return; + } + if (item.ParentSheetIndex == PrismaticBarItem.OLD_INDEX) { item.ParentSheetIndex = PrismaticBarItem.INDEX; } From 9ed0fe64651c032cc9279fe64550db5963f0c7cb Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Fri, 18 Jan 2019 22:12:43 -0500 Subject: [PATCH 11/31] fix 'key has already been added' error in some cases --- PrismaticTools/Framework/Sprinkler.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/PrismaticTools/Framework/Sprinkler.cs b/PrismaticTools/Framework/Sprinkler.cs index b0f1b42..00238b8 100644 --- a/PrismaticTools/Framework/Sprinkler.cs +++ b/PrismaticTools/Framework/Sprinkler.cs @@ -67,8 +67,11 @@ private static void TryEnablePrismaticSprinkler(GameLocation location, Vector2 t // add light source int id = (int)tile.X * 4000 + (int)tile.Y; - obj.lightSource = new LightSource(4, tile * Game1.tileSize, 2.0f, Color.Black, id); - location.sharedLights.Add(id, obj.lightSource); + if (!location.sharedLights.ContainsKey(id)) + { + obj.lightSource = new LightSource(4, tile * Game1.tileSize, 2.0f, Color.Black, id); + location.sharedLights.Add(id, obj.lightSource); + } } /// Raised after the game begins a new day (including when the player loads a save). From 5fb070aaadef248ec6de8bcdf05ad17f6c05b0cf Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 25 May 2019 12:09:58 -0400 Subject: [PATCH 12/31] remove old migration --- PrismaticTools/Framework/PrismaticItems.cs | 2 - PrismaticTools/ModEntry.cs | 71 ---------------------- 2 files changed, 73 deletions(-) diff --git a/PrismaticTools/Framework/PrismaticItems.cs b/PrismaticTools/Framework/PrismaticItems.cs index cec1db7..9b1331d 100644 --- a/PrismaticTools/Framework/PrismaticItems.cs +++ b/PrismaticTools/Framework/PrismaticItems.cs @@ -4,7 +4,6 @@ namespace PrismaticTools.Framework { public class PrismaticSprinklerItem { public const int INDEX = 1113; - public const int OLD_INDEX = 813; public const string NAME = "Prismatic Sprinkler"; public const int PRICE = 2000; public const int EDIBILITY = -300; @@ -16,7 +15,6 @@ public class PrismaticSprinklerItem { public class PrismaticBarItem : Object { public const int INDEX = 1112; - public const int OLD_INDEX = 812; public const string NAME = "Prismatic Bar"; public const string DESCRIPTION = "A mystical ingot forged from legend itself."; public const int PRICE = 2500; diff --git a/PrismaticTools/ModEntry.cs b/PrismaticTools/ModEntry.cs index b580015..1b492f8 100644 --- a/PrismaticTools/ModEntry.cs +++ b/PrismaticTools/ModEntry.cs @@ -171,80 +171,9 @@ private void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { } catch { } } - IndexCompatibilityFix(); AddLightsToInventoryItems(); } - // used to resolve asset conflicts with other mods - private void IndexCompatibilityFix() { - var watch = System.Diagnostics.Stopwatch.StartNew(); - foreach (GameLocation location in Game1.locations) { - // check fridge - if (location is FarmHouse farmhouse && farmhouse.fridge.Value is Chest fridge) { - foreach (Item item in fridge.items) { - if (item?.Name != null && item.Name.Contains("Prismatic")) { - SwapIndex(item); - } - } - } - - // check chests, signposts, furnaces, and placed sprinklers - foreach (Object obj in location.Objects.Values) - { - switch (obj) - { - // chest - case Chest chest: - foreach (Item item in chest.items) { - if (item?.Name != null && item.Name.Contains("Prismatic")) { - SwapIndex(item); - } - } - break; - - // sign - case Sign sign: - SwapIndex(sign.displayItem.Value); - break; - - default: - // furnace - if (obj.bigCraftable.Value && obj.Name == "Furnace") { - SwapIndex(obj.heldObject.Value); - } - - // prismatic bar/sprinkler - else if (obj.ParentSheetIndex == PrismaticBarItem.OLD_INDEX || obj.ParentSheetIndex == PrismaticSprinklerItem.OLD_INDEX) { - SwapIndex(obj); - } - break; - } - } - } - - foreach (Item item in Game1.player.Items) { - if (item != null && item.Name.Contains("Prismatic")) { - SwapIndex(item); - } - } - - watch.Stop(); - Monitor.Log($"IndexCompatibility exec time: {watch.ElapsedMilliseconds} ms", LogLevel.Trace); - } - - private void SwapIndex(Item item) { - if (item == null) { - return; - } - - if (item.ParentSheetIndex == PrismaticBarItem.OLD_INDEX) { - item.ParentSheetIndex = PrismaticBarItem.INDEX; - } - if (item.ParentSheetIndex == PrismaticSprinklerItem.OLD_INDEX) { - item.ParentSheetIndex = PrismaticSprinklerItem.INDEX; - } - } - private void InitColors() { int n = 24; for(int i=0; i Date: Sat, 25 May 2019 12:34:51 -0400 Subject: [PATCH 13/31] add editorconfig to keep formatting consistent, minor code formatting --- .editorconfig | 72 +++++++++++++++ PrismaticTools.sln | 12 ++- PrismaticTools.sln.DotSettings | 3 + PrismaticTools/Framework/AssetEditor.cs | 31 ++++--- PrismaticTools/Framework/Blacksmith.cs | 17 ++-- PrismaticTools/Framework/PrismaticAPI.cs | 7 +- PrismaticTools/Framework/PrismaticItems.cs | 5 +- PrismaticTools/Framework/PrismaticPatches.cs | 14 ++- PrismaticTools/Framework/Sprinkler.cs | 15 ++-- PrismaticTools/ModConfig.cs | 22 ++--- PrismaticTools/ModEntry.cs | 92 +++++++++----------- PrismaticTools/i18n/de.json | 22 ++--- PrismaticTools/i18n/default.json | 22 ++--- PrismaticTools/i18n/zh.json | 22 ++--- PrismaticTools/manifest.json | 20 ++--- 15 files changed, 215 insertions(+), 161 deletions(-) create mode 100644 .editorconfig create mode 100644 PrismaticTools.sln.DotSettings diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..083f401 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,72 @@ +# topmost editorconfig +root: true + +########## +## General formatting +## documentation: http://editorconfig.org +########## +[*] +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 + +[*.{csproj,nuspec,targets}] +indent_size = 2 + +[*.csproj] +insert_final_newline = false + +########## +## C# formatting +## documentation: https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference +########## +[*.cs] + +#sort 'system' usings first +dotnet_sort_system_directives_first = true + +# use 'this.' qualifier +dotnet_style_qualification_for_field = true:error +dotnet_style_qualification_for_property = true:error +dotnet_style_qualification_for_method = true:error +dotnet_style_qualification_for_event = true:error + +# use language keywords (like int) instead of type (like Int32) +dotnet_style_predefined_type_for_locals_parameters_members = true:error +dotnet_style_predefined_type_for_member_access = true:error + +# don't use 'var' for language keywords +csharp_style_var_for_built_in_types = false:error + +# suggest modern C# features where simpler +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion +csharp_prefer_simple_default_expression = true:suggestion + +# prefer method block bodies +csharp_style_expression_bodied_methods = false:suggestion +csharp_style_expression_bodied_constructors = false:suggestion + +# prefer property expression bodies +csharp_style_expression_bodied_properties = true:suggestion +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_accessors = true:suggestion + +# prefer inline out variables +csharp_style_inlined_variable_declaration = true:warning + +# avoid superfluous braces +csharp_prefer_braces = false:suggestion + +# set block newline conventions +csharp_new_line_before_open_brace = true +csharp_new_line_before_else = false +csharp_new_line_before_catch = false diff --git a/PrismaticTools.sln b/PrismaticTools.sln index 40856f6..45fa01d 100644 --- a/PrismaticTools.sln +++ b/PrismaticTools.sln @@ -1,10 +1,18 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27703.2026 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.202 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrismaticTools", "PrismaticTools\PrismaticTools.csproj", "{C24166EE-9341-4760-86B3-F89B326F3FC0}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "root", "root", "{7EF5E22B-2A2D-4B4A-9903-6B118B874F64}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + .gitignore = .gitignore + LICENSE = LICENSE + README.md = README.md + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/PrismaticTools.sln.DotSettings b/PrismaticTools.sln.DotSettings new file mode 100644 index 0000000..7cc51a4 --- /dev/null +++ b/PrismaticTools.sln.DotSettings @@ -0,0 +1,3 @@ + + DO_NOT_SHOW + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> \ No newline at end of file diff --git a/PrismaticTools/Framework/AssetEditor.cs b/PrismaticTools/Framework/AssetEditor.cs index 79611c5..086d010 100644 --- a/PrismaticTools/Framework/AssetEditor.cs +++ b/PrismaticTools/Framework/AssetEditor.cs @@ -1,16 +1,15 @@ -using Microsoft.Xna.Framework; +using System.Collections.Generic; +using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using StardewModdingAPI; using StardewValley; -using System.Collections.Generic; namespace PrismaticTools.Framework { public class AssetEditor : IAssetEditor { - - private string barName = ModEntry.ModHelper.Translation.Get("prismaticBar.name"); - private string barDesc = ModEntry.ModHelper.Translation.Get("prismaticBar.description"); - private string sprinklerName = ModEntry.ModHelper.Translation.Get("prismaticSprinkler.name"); - private string sprinklerDesc = ModEntry.ModHelper.Translation.Get("prismaticSprinkler.description"); + private readonly string barName = ModEntry.ModHelper.Translation.Get("prismaticBar.name"); + private readonly string barDesc = ModEntry.ModHelper.Translation.Get("prismaticBar.description"); + private readonly string sprinklerName = ModEntry.ModHelper.Translation.Get("prismaticSprinkler.name"); + private readonly string sprinklerDesc = ModEntry.ModHelper.Translation.Get("prismaticSprinkler.description"); public bool CanEdit(IAssetInfo asset) { bool canEdit = @@ -24,16 +23,16 @@ public bool CanEdit(IAssetInfo asset) { public void Edit(IAssetData asset) { if (asset.AssetNameEquals("Maps/springobjects")) { - Texture2D bar = ModEntry.ModHelper.Content.Load("Assets/prismaticBar.png", ContentSource.ModFolder); - Texture2D sprinkler = ModEntry.ModHelper.Content.Load("Assets/prismaticSprinkler.png", ContentSource.ModFolder); + Texture2D bar = ModEntry.ModHelper.Content.Load("Assets/prismaticBar.png"); + Texture2D sprinkler = ModEntry.ModHelper.Content.Load("Assets/prismaticSprinkler.png"); Texture2D old = asset.AsImage().Data; asset.ReplaceWith(new Texture2D(Game1.graphics.GraphicsDevice, old.Width, System.Math.Max(old.Height, 1200 / 24 * 16))); asset.AsImage().PatchImage(old); - asset.AsImage().PatchImage(bar, targetArea: Rektangle(PrismaticBarItem.INDEX)); - asset.AsImage().PatchImage(sprinkler, targetArea: Rektangle(PrismaticSprinklerItem.INDEX)); + asset.AsImage().PatchImage(bar, targetArea: this.GetRectangle(PrismaticBarItem.INDEX)); + asset.AsImage().PatchImage(sprinkler, targetArea: this.GetRectangle(PrismaticSprinklerItem.INDEX)); } else if (asset.AssetNameEquals("Data/ObjectInformation")) { - asset.AsDictionary().Data.Add(PrismaticBarItem.INDEX, $"{barName}/{PrismaticBarItem.PRICE}/{PrismaticBarItem.EDIBILITY}/{PrismaticBarItem.TYPE} {PrismaticBarItem.CATEGORY}/{barName}/{barDesc}"); - asset.AsDictionary().Data.Add(PrismaticSprinklerItem.INDEX, $"{sprinklerName}/{PrismaticSprinklerItem.PRICE}/{PrismaticSprinklerItem.EDIBILITY}/{PrismaticSprinklerItem.TYPE} {PrismaticSprinklerItem.CATEGORY}/{sprinklerName}/{sprinklerDesc}"); + asset.AsDictionary().Data.Add(PrismaticBarItem.INDEX, $"{this.barName}/{PrismaticBarItem.PRICE}/{PrismaticBarItem.EDIBILITY}/{PrismaticBarItem.TYPE} {PrismaticBarItem.CATEGORY}/{this.barName}/{this.barDesc}"); + asset.AsDictionary().Data.Add(PrismaticSprinklerItem.INDEX, $"{this.sprinklerName}/{PrismaticSprinklerItem.PRICE}/{PrismaticSprinklerItem.EDIBILITY}/{PrismaticSprinklerItem.TYPE} {PrismaticSprinklerItem.CATEGORY}/{this.sprinklerName}/{this.sprinklerDesc}"); } else if (asset.AssetNameEquals("Data/CraftingRecipes")) { IAssetDataForDictionary oldDict = asset.AsDictionary(); Dictionary newDict = new Dictionary(); @@ -42,7 +41,7 @@ public void Edit(IAssetData asset) { newDict.Add(key, oldDict.Data[key]); if (key.Equals("Iridium Sprinkler")) { if (asset.Locale != "en") - newDict.Add("Prismatic Sprinkler", $"{PrismaticBarItem.INDEX} 2 787 2/Home/{PrismaticSprinklerItem.INDEX}/false/Farming {PrismaticSprinklerItem.CRAFTING_LEVEL}/{sprinklerName}"); + newDict.Add("Prismatic Sprinkler", $"{PrismaticBarItem.INDEX} 2 787 2/Home/{PrismaticSprinklerItem.INDEX}/false/Farming {PrismaticSprinklerItem.CRAFTING_LEVEL}/{this.sprinklerName}"); else newDict.Add("Prismatic Sprinkler", $"{PrismaticBarItem.INDEX} 2 787 2/Home/{PrismaticSprinklerItem.INDEX}/false/Farming {PrismaticSprinklerItem.CRAFTING_LEVEL}"); } @@ -52,12 +51,12 @@ public void Edit(IAssetData asset) { asset.AsDictionary().Data.Add(key, newDict[key]); } } else if (asset.AssetNameEquals("TileSheets\\tools")) { - asset.AsImage().PatchImage(ModEntry.toolsTexture, null, null, PatchMode.Overlay); + asset.AsImage().PatchImage(ModEntry.ToolsTexture, null, null, PatchMode.Overlay); } } - public Rectangle Rektangle(int id) { + public Rectangle GetRectangle(int id) { int x = (id % 24) * 16; int y = (id / 24) * 16; return new Rectangle(x, y, 16, 16); diff --git a/PrismaticTools/Framework/Blacksmith.cs b/PrismaticTools/Framework/Blacksmith.cs index 9b788c7..55a7cf5 100644 --- a/PrismaticTools/Framework/Blacksmith.cs +++ b/PrismaticTools/Framework/Blacksmith.cs @@ -1,15 +1,12 @@ -using Microsoft.Xna.Framework.Graphics; +using System.Collections.Generic; using StardewModdingAPI.Events; using StardewValley; using StardewValley.Menus; using StardewValley.Tools; -using System.Collections.Generic; namespace PrismaticTools.Framework { - class BlacksmithInitializer { - - private static int UpgradeCost = ModEntry.Config.PrismaticToolCost; - private static int NumBars = 3; + internal class BlacksmithInitializer { + private static readonly int UpgradeCost = ModEntry.Config.PrismaticToolCost; public static void Init(IModEvents events) { events.Display.MenuChanged += OnMenuChanged; @@ -40,22 +37,22 @@ private static void OnMenuChanged(object sender, MenuChangedEventArgs e) { if (toolFromName1 != null && toolFromName1.UpgradeLevel == 4) { tool = new Axe { UpgradeLevel = 5 }; forSale.Add(tool); - stock.Add(tool, new int[3] { UpgradeCost, 1, PrismaticBarItem.INDEX }); + stock.Add(tool, new[] { UpgradeCost, 1, PrismaticBarItem.INDEX }); } if (toolFromName2 != null && toolFromName2.UpgradeLevel == 4) { tool = new WateringCan { UpgradeLevel = 5 }; forSale.Add(tool); - stock.Add(tool, new int[3] { UpgradeCost, 1, PrismaticBarItem.INDEX }); + stock.Add(tool, new[] { UpgradeCost, 1, PrismaticBarItem.INDEX }); } if (toolFromName3 != null && toolFromName3.UpgradeLevel == 4) { tool = new Pickaxe { UpgradeLevel = 5 }; forSale.Add(tool); - stock.Add(tool, new int[3] { UpgradeCost, 1, PrismaticBarItem.INDEX }); + stock.Add(tool, new[] { UpgradeCost, 1, PrismaticBarItem.INDEX }); } if (toolFromName4 != null && toolFromName4.UpgradeLevel == 4) { tool = new Hoe { UpgradeLevel = 5 }; forSale.Add(tool); - stock.Add(tool, new int[3] { UpgradeCost, 1, PrismaticBarItem.INDEX }); + stock.Add(tool, new[] { UpgradeCost, 1, PrismaticBarItem.INDEX }); } } } diff --git a/PrismaticTools/Framework/PrismaticAPI.cs b/PrismaticTools/Framework/PrismaticAPI.cs index 83e2a37..dc4abcc 100644 --- a/PrismaticTools/Framework/PrismaticAPI.cs +++ b/PrismaticTools/Framework/PrismaticAPI.cs @@ -1,5 +1,5 @@ -using Microsoft.Xna.Framework; using System.Collections.Generic; +using Microsoft.Xna.Framework; namespace PrismaticTools.Framework { public class PrismaticAPI { @@ -9,10 +9,9 @@ public class PrismaticAPI { public bool ArePrismaticSprinklersScarecrows { get; } = ModEntry.Config.UseSprinklersAsScarecrows; public IEnumerable GetSprinklerCoverage(Vector2 origin) { - for (int x = -SprinklerRange; x <= SprinklerRange; x++) { - for (int y = -SprinklerRange; y <= SprinklerRange; y++) { + for (int x = -this.SprinklerRange; x <= this.SprinklerRange; x++) { + for (int y = -this.SprinklerRange; y <= this.SprinklerRange; y++) yield return new Vector2(x, y) + origin; - } } } } diff --git a/PrismaticTools/Framework/PrismaticItems.cs b/PrismaticTools/Framework/PrismaticItems.cs index 9b1331d..c29c7a2 100644 --- a/PrismaticTools/Framework/PrismaticItems.cs +++ b/PrismaticTools/Framework/PrismaticItems.cs @@ -1,8 +1,7 @@ -using StardewValley; +using StardewValley; namespace PrismaticTools.Framework { - - public class PrismaticSprinklerItem { + public class PrismaticSprinklerItem { public const int INDEX = 1113; public const string NAME = "Prismatic Sprinkler"; public const int PRICE = 2000; diff --git a/PrismaticTools/Framework/PrismaticPatches.cs b/PrismaticTools/Framework/PrismaticPatches.cs index efbee86..9cc8655 100644 --- a/PrismaticTools/Framework/PrismaticPatches.cs +++ b/PrismaticTools/Framework/PrismaticPatches.cs @@ -1,10 +1,8 @@ -using Harmony; using System.Collections.Generic; -using StardewValley; using Microsoft.Xna.Framework; - -using StardewValley.TerrainFeatures; using Netcode; +using StardewValley; +using StardewValley.TerrainFeatures; using StardewValley.Tools; namespace PrismaticTools.Framework { @@ -65,9 +63,9 @@ public static bool Object_PerformObjectDropInAction(ref Object __instance, ref b } if (__instance.heldObject.Value == null & probe) { if (object1.ParentSheetIndex == 74) { - __instance.heldObject.Value = new Object(); - __result = true; - return false; + __instance.heldObject.Value = new Object(); + __result = true; + return false; } } } @@ -133,7 +131,7 @@ public static void FruitTree_PerformToolAction(ref FruitTree __instance, Tool t, public static void Pickaxe_DoFunction(ref Pickaxe __instance, GameLocation location, int x, int y, int power, Farmer who) { if (__instance.UpgradeLevel == 5) { - if (location.Objects.TryGetValue(new Vector2(x/64, y/64), out Object obj)) { + if (location.Objects.TryGetValue(new Vector2(x / 64, y / 64), out Object obj)) { if (obj.Name == "Stone") { obj.MinutesUntilReady = 0; } diff --git a/PrismaticTools/Framework/Sprinkler.cs b/PrismaticTools/Framework/Sprinkler.cs index 00238b8..635d4a1 100644 --- a/PrismaticTools/Framework/Sprinkler.cs +++ b/PrismaticTools/Framework/Sprinkler.cs @@ -1,18 +1,16 @@ -using Microsoft.Xna.Framework; +using System.Collections.Generic; +using Microsoft.Xna.Framework; +using StardewModdingAPI.Events; using StardewValley; using StardewValley.TerrainFeatures; -using StardewModdingAPI.Events; -using System.Collections.Generic; using SObject = StardewValley.Object; namespace PrismaticTools.Framework { - // searches map for any currently placed prismatic sprinklers and: // - waters adjacent tiles // - enables light sources // - optionally makes them act as scarecrows public static class SprinklerInitializer { - public static void Init(IModEvents events) { events.GameLoop.DayStarted += OnDayStarted; events.GameLoop.SaveLoaded += OnSaveLoaded; @@ -57,8 +55,7 @@ private static void OnObjectListChanged(object sender, ObjectListChangedEventArg /// The location containing the sprinkler. /// The sprinkler's tile coordinate within the location. /// The object to check. - private static void TryEnablePrismaticSprinkler(GameLocation location, Vector2 tile, SObject obj) - { + private static void TryEnablePrismaticSprinkler(GameLocation location, Vector2 tile, SObject obj) { if (obj.ParentSheetIndex != PrismaticSprinklerItem.INDEX || !ModEntry.Config.UseSprinklersAsLamps) return; @@ -67,8 +64,7 @@ private static void TryEnablePrismaticSprinkler(GameLocation location, Vector2 t // add light source int id = (int)tile.X * 4000 + (int)tile.Y; - if (!location.sharedLights.ContainsKey(id)) - { + if (!location.sharedLights.ContainsKey(id)) { obj.lightSource = new LightSource(4, tile * Game1.tileSize, 2.0f, Color.Black, id); location.sharedLights.Add(id, obj.lightSource); } @@ -108,4 +104,3 @@ private static void OnDayStarted(object sender, DayStartedEventArgs e) { } } } - diff --git a/PrismaticTools/ModConfig.cs b/PrismaticTools/ModConfig.cs index 6affd87..6f7efbb 100644 --- a/PrismaticTools/ModConfig.cs +++ b/PrismaticTools/ModConfig.cs @@ -1,20 +1,10 @@ - namespace PrismaticTools.Framework { public class ModConfig { - public bool UseSprinklersAsScarecrows { get; set; } - public bool UseSprinklersAsLamps { get; set; } - public int SprinklerRange { get; set; } - public int PrismaticToolLength { get; set; } - public int PrismaticToolWidth { get; set; } - public int PrismaticToolCost { get; set; } - - public ModConfig() { - UseSprinklersAsScarecrows = true; - UseSprinklersAsLamps = true; - SprinklerRange = 3; - PrismaticToolLength = 7; - PrismaticToolWidth = 2; - PrismaticToolCost = 100000; - } + public bool UseSprinklersAsScarecrows { get; set; } = true; + public bool UseSprinklersAsLamps { get; set; } = true; + public int SprinklerRange { get; set; } = 3; + public int PrismaticToolLength { get; set; } = 7; + public int PrismaticToolWidth { get; set; } = 2; + public int PrismaticToolCost { get; set; } = 100000; } } diff --git a/PrismaticTools/ModEntry.cs b/PrismaticTools/ModEntry.cs index 1b492f8..4c5d67b 100644 --- a/PrismaticTools/ModEntry.cs +++ b/PrismaticTools/ModEntry.cs @@ -1,49 +1,41 @@ -using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Graphics; - +using System.Collections.Generic; using Harmony; -using StardewValley; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using PrismaticTools.Framework; using StardewModdingAPI; using StardewModdingAPI.Events; - -using PrismaticTools.Framework; -using System.Collections.Generic; -using StardewValley.Objects; -using StardewValley.Locations; +using StardewValley; using StardewValley.TerrainFeatures; using StardewValley.Tools; namespace PrismaticTools { - public class ModEntry : Mod { - - public static IMonitor mon; public static IModHelper ModHelper; public static ModConfig Config; + public static Texture2D ToolsTexture; - public static Texture2D toolsTexture; - private int colorCycleIndex = 0; - private List colors = new List(); + private int colorCycleIndex; + private readonly List colors = new List(); public override void Entry(IModHelper helper) { - mon = Monitor; ModHelper = helper; - Config = Helper.ReadConfig(); + Config = this.Helper.ReadConfig(); - toolsTexture = ModHelper.Content.Load("Assets/tools.png", ContentSource.ModFolder); + ToolsTexture = ModHelper.Content.Load("Assets/tools.png"); - helper.ConsoleCommands.Add("ptools", "Upgrade all tools to prismatic", UpgradeTools); + helper.ConsoleCommands.Add("ptools", "Upgrade all tools to prismatic", this.UpgradeTools); - helper.Events.GameLoop.SaveLoaded += OnSaveLoaded; - helper.Events.GameLoop.UpdateTicked += OnUpdateTicked; - helper.Events.Player.InventoryChanged += OnInventoryChanged; + helper.Events.GameLoop.SaveLoaded += this.OnSaveLoaded; + helper.Events.GameLoop.UpdateTicked += this.OnUpdateTicked; + helper.Events.Player.InventoryChanged += this.OnInventoryChanged; helper.Content.AssetEditors.Add(new AssetEditor()); SprinklerInitializer.Init(helper.Events); BlacksmithInitializer.Init(helper.Events); - InitColors(); + this.InitColors(); var harmony = HarmonyInstance.Create("stokastic.PrismaticTools"); this.ApplyPatches(harmony); @@ -108,7 +100,7 @@ private void OnUpdateTicked(object sender, UpdateTickedEventArgs e) { Item item; try { item = farmer.Items[farmer.CurrentToolIndex]; - } catch (System.ArgumentOutOfRangeException) { + } catch (System.ArgumentOutOfRangeException) { return; } @@ -118,10 +110,10 @@ private void OnUpdateTicked(object sender, UpdateTickedEventArgs e) { foreach (var light in farmer.currentLocation.sharedLights.Values) { if (light.Identifier == (int)farmer.UniqueMultiplayerID) { - light.color.Value = colors[colorCycleIndex]; + light.color.Value = this.colors[this.colorCycleIndex]; } } - colorCycleIndex = (colorCycleIndex + 1) % colors.Count; + this.colorCycleIndex = (this.colorCycleIndex + 1) % this.colors.Count; } public override object GetApi() { @@ -136,17 +128,17 @@ private void UpgradeTools(string command, string[] args) { } } - // adds lightsources to prismatic bar and sprinkler items in inventory + // adds light sources to prismatic bar and sprinkler items in inventory private void AddLightsToInventoryItems() { if (!Config.UseSprinklersAsLamps) { return; } foreach (Item item in Game1.player.Items) { - if (item is Object) { - if (item.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { - (item as Object).lightSource = new LightSource(LightSource.cauldronLight, new Vector2(0, 0), 2.0f, new Color(0.0f, 0.0f, 0.0f)); - } else if (item.ParentSheetIndex == PrismaticBarItem.INDEX) { - (item as Object).lightSource = new LightSource(LightSource.cauldronLight, new Vector2(0, 0), 1.0f, colors[colorCycleIndex]); + if (item is Object obj) { + if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { + obj.lightSource = new LightSource(LightSource.cauldronLight, new Vector2(0, 0), 2.0f, new Color(0.0f, 0.0f, 0.0f)); + } else if (obj.ParentSheetIndex == PrismaticBarItem.INDEX) { + obj.lightSource = new LightSource(LightSource.cauldronLight, new Vector2(0, 0), 1.0f, this.colors[this.colorCycleIndex]); } } } @@ -157,7 +149,7 @@ private void AddLightsToInventoryItems() { /// The event arguments. private void OnInventoryChanged(object sender, InventoryChangedEventArgs e) { if (e.IsLocalPlayer) - AddLightsToInventoryItems(); + this.AddLightsToInventoryItems(); } /// Raised after the player loads a save slot and the world is initialised. @@ -171,13 +163,13 @@ private void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { } catch { } } - AddLightsToInventoryItems(); + this.AddLightsToInventoryItems(); } private void InitColors() { int n = 24; - for(int i=0; i Date: Sat, 25 May 2019 12:54:25 -0400 Subject: [PATCH 14/31] add Korean translations Thanks to S2SKY! --- PrismaticTools/PrismaticTools.csproj | 1 + PrismaticTools/i18n/ko.json | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 PrismaticTools/i18n/ko.json diff --git a/PrismaticTools/PrismaticTools.csproj b/PrismaticTools/PrismaticTools.csproj index 88181bb..eb660ce 100644 --- a/PrismaticTools/PrismaticTools.csproj +++ b/PrismaticTools/PrismaticTools.csproj @@ -79,6 +79,7 @@ + diff --git a/PrismaticTools/i18n/ko.json b/PrismaticTools/i18n/ko.json new file mode 100644 index 0000000..7bfe2a2 --- /dev/null +++ b/PrismaticTools/i18n/ko.json @@ -0,0 +1,11 @@ +{ + "prismatic.prefix": "무지갯빛", + "prismaticBar.name": "무지갯빛 주괴", + "prismaticBar.description": "전설 그 자체를 주조해 만들어진 신비로운 금속 주괴.", + "prismaticHoe": "무지갯빛 괭이", + "prismaticWatercan": "무지갯빛 물뿌리개", + "prismaticPickaxe": "무지갯빛 곡괭이", + "prismaticAxe": "무지갯빛 도끼", + "prismaticSprinkler.name": "무지갯빛 스프링클러", + "prismaticSprinkler.description": "매일 아침마다 인근 48개의 타일에 물을 줍니다." +} From e8fa0f68a923970ddbb77dd69128ee62c33e5036 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 25 May 2019 12:59:41 -0400 Subject: [PATCH 15/31] remove unused fields --- PrismaticTools/Framework/PrismaticItems.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/PrismaticTools/Framework/PrismaticItems.cs b/PrismaticTools/Framework/PrismaticItems.cs index c29c7a2..657ad14 100644 --- a/PrismaticTools/Framework/PrismaticItems.cs +++ b/PrismaticTools/Framework/PrismaticItems.cs @@ -3,19 +3,15 @@ namespace PrismaticTools.Framework { public class PrismaticSprinklerItem { public const int INDEX = 1113; - public const string NAME = "Prismatic Sprinkler"; public const int PRICE = 2000; public const int EDIBILITY = -300; public const string TYPE = "Crafting"; public const int CATEGORY = Object.CraftingCategory; - public const string DESCRIPTION = "Waters the 48 adjacent tiles every morning."; public const int CRAFTING_LEVEL = 9; } public class PrismaticBarItem : Object { public const int INDEX = 1112; - public const string NAME = "Prismatic Bar"; - public const string DESCRIPTION = "A mystical ingot forged from legend itself."; public const int PRICE = 2500; public const string TYPE = "Basic"; public const int CATEGORY = metalResources; From 9ea2133d6ab1b4d9a958989145f019f9635838b7 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 25 May 2019 14:31:31 -0400 Subject: [PATCH 16/31] minor cleanup --- PrismaticTools/Framework/PrismaticPatches.cs | 50 ++++++++------------ PrismaticTools/ModEntry.cs | 4 +- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/PrismaticTools/Framework/PrismaticPatches.cs b/PrismaticTools/Framework/PrismaticPatches.cs index 9cc8655..37547af 100644 --- a/PrismaticTools/Framework/PrismaticPatches.cs +++ b/PrismaticTools/Framework/PrismaticPatches.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using Microsoft.Xna.Framework; using Netcode; using StardewValley; @@ -6,27 +7,22 @@ using StardewValley.Tools; namespace PrismaticTools.Framework { + [SuppressMessage("ReSharper", "InconsistentNaming")] internal static class PrismaticPatches { /********* ** Furnace patches *********/ public static void Farmer_GetTallyOfObject(ref int __result, int index, bool bigCraftable) { - if (index == 382 && !bigCraftable) { - if (__result <= 0) { - __result = 666666; - return; - } - } + if (index == 382 && !bigCraftable && __result <= 0) + __result = 666666; } public static bool Object_PerformObjectDropInAction(ref Object __instance, ref bool __result, ref Item dropInItem, bool probe, Farmer who) { - if (!(dropInItem is Object)) + if (!(dropInItem is Object object1)) return false; - Object object1 = dropInItem as Object; - if (object1.ParentSheetIndex != 74) { + if (object1.ParentSheetIndex != 74) return true; - } if (__instance.name.Equals("Furnace")) { if (who.IsLocalPlayer && who.getTallyOfObject(382, false) == 666666) { @@ -35,23 +31,21 @@ public static bool Object_PerformObjectDropInAction(ref Object __instance, ref b return false; } if (__instance.heldObject.Value == null && !probe) { - __instance.heldObject.Value = new Object(PrismaticBarItem.INDEX, 5, false, -1, 0); + __instance.heldObject.Value = new Object(PrismaticBarItem.INDEX, 5); __instance.MinutesUntilReady = 2400; who.currentLocation.playSound("furnace"); - __instance.initializeLightSource(__instance.TileLocation, false); + __instance.initializeLightSource(__instance.TileLocation); __instance.showNextIndex.Value = true; Multiplayer multiplayer = ModEntry.ModHelper.Reflection.GetField(typeof(Game1), "multiplayer").GetValue(); - multiplayer.broadcastSprites(who.currentLocation, new TemporaryAnimatedSprite[1] { - new TemporaryAnimatedSprite(30, __instance.TileLocation * 64f + new Vector2(0.0f, -16f), Color.White, 4, false, 50f, 10, 64, (float) (((double) __instance.TileLocation.Y + 1.0) * 64.0 / 10000.0 + 9.99999974737875E-05), -1, 0) { - alphaFade = 0.005f - } - }); + multiplayer.broadcastSprites(who.currentLocation, new TemporaryAnimatedSprite(30, __instance.TileLocation * 64f + new Vector2(0.0f, -16f), Color.White, 4, false, 50f, 10, 64, (float)((__instance.TileLocation.Y + 1.0) * 64.0 / 10000.0 + 9.99999974737875E-05)) { + alphaFade = 0.005f + }); for (int index = who.Items.Count - 1; index >= 0; --index) { - if (who.Items[index] is Object && (who.Items[index] as Object).ParentSheetIndex == 382) { + if (who.Items[index] is Object obj && obj.ParentSheetIndex == 382) { --who.Items[index].Stack; if (who.Items[index].Stack <= 0) { - who.Items[index] = (Item)null; + who.Items[index] = null; break; } break; @@ -79,7 +73,7 @@ public static bool Object_PerformObjectDropInAction(ref Object __instance, ref b public static bool Farm_AddCrows(ref Farm __instance) { int num1 = 0; foreach (KeyValuePair pair in __instance.terrainFeatures.Pairs) { - if (pair.Value is HoeDirt && (pair.Value as HoeDirt).crop != null) + if (pair.Value is HoeDirt dirt && dirt.crop != null) ++num1; } List vector2List = new List(); @@ -93,19 +87,17 @@ public static bool Farm_AddCrows(ref Farm __instance) { if (Game1.random.NextDouble() < 1.0) { for (int index2 = 0; index2 < 10; ++index2) { Vector2 key = __instance.terrainFeatures.Pairs.ElementAt(Game1.random.Next(__instance.terrainFeatures.Count())).Key; - if (__instance.terrainFeatures[key] is HoeDirt && (__instance.terrainFeatures[key] as HoeDirt).crop != null && ((__instance.terrainFeatures[key] as HoeDirt).crop.currentPhase.Value) > 1) { + if (__instance.terrainFeatures[key] is HoeDirt dirt && dirt.crop?.currentPhase.Value > 1) { bool flag = false; foreach (Vector2 index3 in vector2List) { - if ((double)Vector2.Distance(index3, key) < 9.0) { + if (Vector2.Distance(index3, key) < 9.0) { flag = true; ++__instance.objects[index3].SpecialVariable; break; } } - if (!flag) { - (__instance.terrainFeatures[key] as HoeDirt).crop = (Crop)null; - break; - } + if (!flag) + dirt.crop = null; break; } } @@ -154,10 +146,10 @@ public static void Tool_TilesAffected_Postfix(ref List __result, Vector int length = ModEntry.Config.PrismaticToolLength; switch (who.FacingDirection) { case 0: direction = new Vector2(0, -1); orth = new Vector2(1, 0); break; - case 1: direction = new Vector2(1, 0); orth = new Vector2(0, 1); break; - case 2: direction = new Vector2(0, 1); orth = new Vector2(-1, 0); break; + case 1: direction = new Vector2(1, 0); orth = new Vector2(0, 1); break; + case 2: direction = new Vector2(0, 1); orth = new Vector2(-1, 0); break; case 3: direction = new Vector2(-1, 0); orth = new Vector2(0, -1); break; - default: direction = new Vector2(0, 0); orth = new Vector2(0, 0); break; + default: direction = Vector2.Zero; orth = Vector2.Zero; break; } for (int i = 0; i < length; i++) { __result.Add(direction * i + tileLocation); diff --git a/PrismaticTools/ModEntry.cs b/PrismaticTools/ModEntry.cs index 4c5d67b..069a973 100644 --- a/PrismaticTools/ModEntry.cs +++ b/PrismaticTools/ModEntry.cs @@ -136,9 +136,9 @@ private void AddLightsToInventoryItems() { foreach (Item item in Game1.player.Items) { if (item is Object obj) { if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { - obj.lightSource = new LightSource(LightSource.cauldronLight, new Vector2(0, 0), 2.0f, new Color(0.0f, 0.0f, 0.0f)); + obj.lightSource = new LightSource(LightSource.cauldronLight, Vector2.Zero, 2.0f, new Color(0.0f, 0.0f, 0.0f)); } else if (obj.ParentSheetIndex == PrismaticBarItem.INDEX) { - obj.lightSource = new LightSource(LightSource.cauldronLight, new Vector2(0, 0), 1.0f, this.colors[this.colorCycleIndex]); + obj.lightSource = new LightSource(LightSource.cauldronLight, Vector2.Zero, 1.0f, this.colors[this.colorCycleIndex]); } } } From 62f43f7a24d03bdc89e90189c7016eb658786591 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 25 May 2019 15:22:55 -0400 Subject: [PATCH 17/31] replace location scanning with object patches for compatibility with custom locations --- PrismaticTools/Framework/PrismaticPatches.cs | 98 ++++++++++++++--- PrismaticTools/Framework/Sprinkler.cs | 106 ------------------- PrismaticTools/ModEntry.cs | 29 ++++- PrismaticTools/PrismaticTools.csproj | 1 - 4 files changed, 113 insertions(+), 121 deletions(-) delete mode 100644 PrismaticTools/Framework/Sprinkler.cs diff --git a/PrismaticTools/Framework/PrismaticPatches.cs b/PrismaticTools/Framework/PrismaticPatches.cs index 37547af..1fcf5af 100644 --- a/PrismaticTools/Framework/PrismaticPatches.cs +++ b/PrismaticTools/Framework/PrismaticPatches.cs @@ -5,20 +5,24 @@ using StardewValley; using StardewValley.TerrainFeatures; using StardewValley.Tools; +using SObject = StardewValley.Object; namespace PrismaticTools.Framework { [SuppressMessage("ReSharper", "InconsistentNaming")] internal static class PrismaticPatches { /********* - ** Furnace patches + ** Public methods *********/ + /**** + ** Furnace patches + ****/ public static void Farmer_GetTallyOfObject(ref int __result, int index, bool bigCraftable) { if (index == 382 && !bigCraftable && __result <= 0) __result = 666666; } - public static bool Object_PerformObjectDropInAction(ref Object __instance, ref bool __result, ref Item dropInItem, bool probe, Farmer who) { - if (!(dropInItem is Object object1)) + public static bool Object_PerformObjectDropInAction(ref SObject __instance, ref bool __result, ref Item dropInItem, bool probe, Farmer who) { + if (!(dropInItem is SObject object1)) return false; if (object1.ParentSheetIndex != 74) @@ -31,7 +35,7 @@ public static bool Object_PerformObjectDropInAction(ref Object __instance, ref b return false; } if (__instance.heldObject.Value == null && !probe) { - __instance.heldObject.Value = new Object(PrismaticBarItem.INDEX, 5); + __instance.heldObject.Value = new SObject(PrismaticBarItem.INDEX, 5); __instance.MinutesUntilReady = 2400; who.currentLocation.playSound("furnace"); __instance.initializeLightSource(__instance.TileLocation); @@ -42,7 +46,7 @@ public static bool Object_PerformObjectDropInAction(ref Object __instance, ref b alphaFade = 0.005f }); for (int index = who.Items.Count - 1; index >= 0; --index) { - if (who.Items[index] is Object obj && obj.ParentSheetIndex == 382) { + if (who.Items[index] is SObject obj && obj.ParentSheetIndex == 382) { --who.Items[index].Stack; if (who.Items[index].Stack <= 0) { who.Items[index] = null; @@ -57,7 +61,7 @@ public static bool Object_PerformObjectDropInAction(ref Object __instance, ref b } if (__instance.heldObject.Value == null & probe) { if (object1.ParentSheetIndex == 74) { - __instance.heldObject.Value = new Object(); + __instance.heldObject.Value = new SObject(); __result = true; return false; } @@ -67,9 +71,9 @@ public static bool Object_PerformObjectDropInAction(ref Object __instance, ref b return false; } - /********* + /**** ** Sprinkler patches - *********/ + ****/ public static bool Farm_AddCrows(ref Farm __instance) { int num1 = 0; foreach (KeyValuePair pair in __instance.terrainFeatures.Pairs) { @@ -77,7 +81,7 @@ public static bool Farm_AddCrows(ref Farm __instance) { ++num1; } List vector2List = new List(); - foreach (KeyValuePair pair in __instance.objects.Pairs) { + foreach (KeyValuePair pair in __instance.objects.Pairs) { if (pair.Value.Name.Contains("arecrow")) { vector2List.Add(pair.Key); } @@ -106,9 +110,54 @@ public static bool Farm_AddCrows(ref Farm __instance) { return false; } - /********* + public static bool Object_DayUpdating(ref SObject __instance, GameLocation location) { + var obj = __instance; + + // water tiles covered by sprinkler + if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { + location.TemporarySprites.Add(new TemporaryAnimatedSprite("TileSheets\\animations", new Rectangle(0, 2176, 320, 320), 60f, 4, 100, obj.TileLocation * 64 + new Vector2(-192, -208), false, false) { + color = Color.White * 0.4f, + scale = 7f / 5f, + delayBeforeAnimationStart = 0, + id = obj.TileLocation.X * 4000f + obj.TileLocation.Y + }); + + for (int x = (int)obj.TileLocation.X - ModEntry.Config.SprinklerRange; x <= obj.TileLocation.X + ModEntry.Config.SprinklerRange; ++x) { + for (int y = (int)obj.TileLocation.Y - ModEntry.Config.SprinklerRange; y <= obj.TileLocation.Y + ModEntry.Config.SprinklerRange; ++y) { + Vector2 tile = new Vector2(x, y); + + // water dirt + if (location.terrainFeatures.TryGetValue(tile, out TerrainFeature terrain) && terrain is HoeDirt dirt) + dirt.state.Value = 1; + } + } + } + return true; + } + + public static bool Object_UpdatingWhenCurrentLocation(ref SObject __instance, GameTime time, GameLocation environment) { + var obj = __instance; + + // enable sprinkler scarecrow/light + if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) + TryEnablePrismaticSprinkler(environment, obj.TileLocation, obj); + + return true; + } + + public static bool Object_OnPlacing(ref SObject __instance, GameLocation location, int x, int y) { + var obj = __instance; + + // enable sprinkler scarecrow/light + if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) + TryEnablePrismaticSprinkler(location, new Vector2(x, y), obj); + + return true; + } + + /**** ** Tool patches - *********/ + ****/ public static void Tree_PerformToolAction(ref Tree __instance, Tool t, int explosion) { if (t is Axe axe && axe.UpgradeLevel == 5 && explosion <= 0 && ModEntry.ModHelper.Reflection.GetField(__instance, "health").GetValue() > -99f) { __instance.health.Value = 0.0f; @@ -123,7 +172,7 @@ public static void FruitTree_PerformToolAction(ref FruitTree __instance, Tool t, public static void Pickaxe_DoFunction(ref Pickaxe __instance, GameLocation location, int x, int y, int power, Farmer who) { if (__instance.UpgradeLevel == 5) { - if (location.Objects.TryGetValue(new Vector2(x / 64, y / 64), out Object obj)) { + if (location.Objects.TryGetValue(new Vector2(x / 64, y / 64), out SObject obj)) { if (obj.Name == "Stone") { obj.MinutesUntilReady = 0; } @@ -184,5 +233,30 @@ public static bool Tool_DisplayName(Tool __instance, ref string __result) { } return true; } + + + /********* + ** Private methods + *********/ + /// Try to add the light source for a prismatic sprinkler, if applicable. + /// The location containing the sprinkler. + /// The sprinkler's tile coordinate within the location. + /// The object to check. + private static void TryEnablePrismaticSprinkler(GameLocation location, Vector2 tile, SObject obj) { + if (obj.ParentSheetIndex != PrismaticSprinklerItem.INDEX) + return; + + // set name + obj.Name = "Prismatic Scarecrow Sprinkler"; + + // add light source + if (ModEntry.Config.UseSprinklersAsLamps) { + int id = (int)tile.X * 4000 + (int)tile.Y; + if (!location.sharedLights.ContainsKey(id)) { + obj.lightSource = new LightSource(4, tile * Game1.tileSize, 2.0f, Color.Black, id); + location.sharedLights.Add(id, obj.lightSource); + } + } + } } } diff --git a/PrismaticTools/Framework/Sprinkler.cs b/PrismaticTools/Framework/Sprinkler.cs deleted file mode 100644 index 635d4a1..0000000 --- a/PrismaticTools/Framework/Sprinkler.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System.Collections.Generic; -using Microsoft.Xna.Framework; -using StardewModdingAPI.Events; -using StardewValley; -using StardewValley.TerrainFeatures; -using SObject = StardewValley.Object; - -namespace PrismaticTools.Framework { - // searches map for any currently placed prismatic sprinklers and: - // - waters adjacent tiles - // - enables light sources - // - optionally makes them act as scarecrows - public static class SprinklerInitializer { - public static void Init(IModEvents events) { - events.GameLoop.DayStarted += OnDayStarted; - events.GameLoop.SaveLoaded += OnSaveLoaded; - events.World.ObjectListChanged += OnObjectListChanged; - } - - /// Raised after the player loads a save slot and the world is initialised. - /// The event sender. - /// The event arguments. - private static void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { - if (ModEntry.Config.UseSprinklersAsScarecrows) { - foreach (GameLocation location in Game1.locations) { - foreach (SObject obj in location.Objects.Values) { - if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { - obj.Name = "Prismatic Scarecrow Sprinkler"; - } - } - } - } - - // set light sources - if (ModEntry.Config.UseSprinklersAsLamps) { - foreach (GameLocation location in Game1.locations) { - foreach (KeyValuePair pair in location.objects.Pairs) - TryEnablePrismaticSprinkler(location, pair.Key, pair.Value); - } - } - } - - /// Raised after objects are added or removed in a location. - /// The event sender. - /// The event arguments. - private static void OnObjectListChanged(object sender, ObjectListChangedEventArgs e) { - // adds light sources to newly placed sprinklers - if (ModEntry.Config.UseSprinklersAsLamps) { - foreach (KeyValuePair pair in e.Added) - TryEnablePrismaticSprinkler(e.Location, pair.Key, pair.Value); - } - } - - /// Try to add the light source for a prismatic sprinkler, if applicable. - /// The location containing the sprinkler. - /// The sprinkler's tile coordinate within the location. - /// The object to check. - private static void TryEnablePrismaticSprinkler(GameLocation location, Vector2 tile, SObject obj) { - if (obj.ParentSheetIndex != PrismaticSprinklerItem.INDEX || !ModEntry.Config.UseSprinklersAsLamps) - return; - - // set name - obj.Name = "Prismatic Scarecrow Sprinkler"; - - // add light source - int id = (int)tile.X * 4000 + (int)tile.Y; - if (!location.sharedLights.ContainsKey(id)) { - obj.lightSource = new LightSource(4, tile * Game1.tileSize, 2.0f, Color.Black, id); - location.sharedLights.Add(id, obj.lightSource); - } - } - - /// Raised after the game begins a new day (including when the player loads a save). - /// The event sender. - /// The event arguments. - private static void OnDayStarted(object sender, DayStartedEventArgs e) { - foreach (GameLocation location in Game1.locations) { - foreach (SObject obj in location.Objects.Values) { - if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { - - // add water spray animation - location.TemporarySprites.Add(new TemporaryAnimatedSprite("TileSheets\\animations", new Rectangle(0, 2176, 320, 320), 60f, 4, 100, obj.TileLocation * 64 + new Vector2(-192, -208), false, false) { - color = Color.White * 0.4f, - scale = 7f / 5f, - delayBeforeAnimationStart = 0, - id = obj.TileLocation.X * 4000f + obj.TileLocation.Y - }); - - if (location is Farm || location.IsGreenhouse) { - for (int index1 = (int)obj.TileLocation.X - ModEntry.Config.SprinklerRange; index1 <= obj.TileLocation.X + ModEntry.Config.SprinklerRange; ++index1) { - for (int index2 = (int)obj.TileLocation.Y - ModEntry.Config.SprinklerRange; index2 <= obj.TileLocation.Y + ModEntry.Config.SprinklerRange; ++index2) { - Vector2 key = new Vector2(index1, index2); - - // water dirt - if (location.terrainFeatures.ContainsKey(key) && location.terrainFeatures[key] is HoeDirt) { - (location.terrainFeatures[key] as HoeDirt).state.Value = 1; - } - } - } - } - } - } - } - } - } -} diff --git a/PrismaticTools/ModEntry.cs b/PrismaticTools/ModEntry.cs index 069a973..31bc620 100644 --- a/PrismaticTools/ModEntry.cs +++ b/PrismaticTools/ModEntry.cs @@ -32,7 +32,6 @@ public override void Entry(IModHelper helper) { helper.Events.Player.InventoryChanged += this.OnInventoryChanged; helper.Content.AssetEditors.Add(new AssetEditor()); - SprinklerInitializer.Init(helper.Events); BlacksmithInitializer.Init(helper.Events); this.InitColors(); @@ -57,6 +56,18 @@ private void ApplyPatches(HarmonyInstance harmony) { original: AccessTools.Method(typeof(Farm), nameof(Farm.addCrows)), prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Farm_AddCrows)) ); + harmony.Patch( + original: AccessTools.Method(typeof(Object), nameof(Object.DayUpdate)), + prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Object_DayUpdating)) + ); + harmony.Patch( + original: AccessTools.Method(typeof(Object), nameof(Object.updateWhenCurrentLocation)), + prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Object_UpdatingWhenCurrentLocation)) + ); + harmony.Patch( + original: AccessTools.Method(typeof(Object), nameof(Object.placementAction)), + prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Object_OnPlacing)) + ); // tools harmony.Patch( @@ -128,7 +139,7 @@ private void UpgradeTools(string command, string[] args) { } } - // adds light sources to prismatic bar and sprinkler items in inventory + /// Adds light sources to prismatic bar and sprinkler items in inventory. private void AddLightsToInventoryItems() { if (!Config.UseSprinklersAsLamps) { return; @@ -144,6 +155,19 @@ private void AddLightsToInventoryItems() { } } + /// Set scarecrow mode for sprinkler items. + private static void SetScarecrowModeForAllSprinklers() { + if (ModEntry.Config.UseSprinklersAsScarecrows) { + foreach (GameLocation location in Game1.locations) { + foreach (Object obj in location.Objects.Values) { + if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { + obj.Name = "Prismatic Scarecrow Sprinkler"; + } + } + } + } + } + /// Raised after items are added or removed to a player's inventory. /// The event sender. /// The event arguments. @@ -164,6 +188,7 @@ private void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { } this.AddLightsToInventoryItems(); + this.SetScarecrowModeForAllSprinklers(); } private void InitColors() { diff --git a/PrismaticTools/PrismaticTools.csproj b/PrismaticTools/PrismaticTools.csproj index eb660ce..68e383e 100644 --- a/PrismaticTools/PrismaticTools.csproj +++ b/PrismaticTools/PrismaticTools.csproj @@ -71,7 +71,6 @@ - From e30943b0e95f218b066fbddb2d2119b14dd88c35 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 25 May 2019 15:23:50 -0400 Subject: [PATCH 18/31] fix sprinklers not un-scarecrowed when option is disabled --- PrismaticTools/Framework/PrismaticPatches.cs | 4 +++- PrismaticTools/ModEntry.cs | 14 +++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/PrismaticTools/Framework/PrismaticPatches.cs b/PrismaticTools/Framework/PrismaticPatches.cs index 1fcf5af..f3e7a7e 100644 --- a/PrismaticTools/Framework/PrismaticPatches.cs +++ b/PrismaticTools/Framework/PrismaticPatches.cs @@ -247,7 +247,9 @@ private static void TryEnablePrismaticSprinkler(GameLocation location, Vector2 t return; // set name - obj.Name = "Prismatic Scarecrow Sprinkler"; + obj.Name = ModEntry.Config.UseSprinklersAsScarecrows + ? "Prismatic Scarecrow Sprinkler" + : "Prismatic Sprinkler"; // add light source if (ModEntry.Config.UseSprinklersAsLamps) { diff --git a/PrismaticTools/ModEntry.cs b/PrismaticTools/ModEntry.cs index 31bc620..cb7991e 100644 --- a/PrismaticTools/ModEntry.cs +++ b/PrismaticTools/ModEntry.cs @@ -156,13 +156,13 @@ private void AddLightsToInventoryItems() { } /// Set scarecrow mode for sprinkler items. - private static void SetScarecrowModeForAllSprinklers() { - if (ModEntry.Config.UseSprinklersAsScarecrows) { - foreach (GameLocation location in Game1.locations) { - foreach (Object obj in location.Objects.Values) { - if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { - obj.Name = "Prismatic Scarecrow Sprinkler"; - } + private void SetScarecrowModeForAllSprinklers() { + foreach (GameLocation location in Game1.locations) { + foreach (Object obj in location.Objects.Values) { + if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { + obj.Name = Config.UseSprinklersAsScarecrows + ? "Prismatic Scarecrow Sprinkler" + : "Prismatic Sprinkler"; } } } From 5c0d1dc4a877ac415df2f4e0dd091a4c069aab8d Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Mon, 1 Jul 2019 19:39:16 -0400 Subject: [PATCH 19/31] update mod build package & migrate to new .csproj format The new mod build package version... - adds support for SMAPI 3.0; - deploys 'assets' folders automatically; - can add a Harmony reference automatically using . --- PrismaticTools.sln | 18 +-- PrismaticTools/Framework/AssetEditor.cs | 4 +- PrismaticTools/ModEntry.cs | 2 +- PrismaticTools/PrismaticTools.csproj | 104 ++---------------- PrismaticTools/Properties/AssemblyInfo.cs | 36 ------ .../{Assets => assets}/old/prismaticBar.png | Bin .../old/prismaticSprinkler.png | Bin .../{Assets => assets}/old/prismaticTools.png | Bin .../{Assets => assets}/old/tools.png | Bin .../{Assets => assets}/prismaticBar.png | Bin .../{Assets => assets}/prismaticSprinkler.png | Bin .../{Assets => assets}/prismaticTools.png | Bin PrismaticTools/{Assets => assets}/tools.png | Bin 13 files changed, 20 insertions(+), 144 deletions(-) delete mode 100644 PrismaticTools/Properties/AssemblyInfo.cs rename PrismaticTools/{Assets => assets}/old/prismaticBar.png (100%) rename PrismaticTools/{Assets => assets}/old/prismaticSprinkler.png (100%) rename PrismaticTools/{Assets => assets}/old/prismaticTools.png (100%) rename PrismaticTools/{Assets => assets}/old/tools.png (100%) rename PrismaticTools/{Assets => assets}/prismaticBar.png (100%) rename PrismaticTools/{Assets => assets}/prismaticSprinkler.png (100%) rename PrismaticTools/{Assets => assets}/prismaticTools.png (100%) rename PrismaticTools/{Assets => assets}/tools.png (100%) diff --git a/PrismaticTools.sln b/PrismaticTools.sln index 45fa01d..8ee10b1 100644 --- a/PrismaticTools.sln +++ b/PrismaticTools.sln @@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.28803.202 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrismaticTools", "PrismaticTools\PrismaticTools.csproj", "{C24166EE-9341-4760-86B3-F89B326F3FC0}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "root", "root", "{7EF5E22B-2A2D-4B4A-9903-6B118B874F64}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig @@ -13,22 +11,18 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "root", "root", "{7EF5E22B-2 README.md = README.md EndProjectSection EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PrismaticTools", "PrismaticTools\PrismaticTools.csproj", "{7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C24166EE-9341-4760-86B3-F89B326F3FC0}.Debug|Any CPU.ActiveCfg = Debug|x86 - {C24166EE-9341-4760-86B3-F89B326F3FC0}.Debug|Any CPU.Build.0 = Debug|x86 - {C24166EE-9341-4760-86B3-F89B326F3FC0}.Debug|x86.ActiveCfg = Debug|x86 - {C24166EE-9341-4760-86B3-F89B326F3FC0}.Debug|x86.Build.0 = Debug|x86 - {C24166EE-9341-4760-86B3-F89B326F3FC0}.Release|Any CPU.ActiveCfg = Release|x86 - {C24166EE-9341-4760-86B3-F89B326F3FC0}.Release|Any CPU.Build.0 = Release|x86 - {C24166EE-9341-4760-86B3-F89B326F3FC0}.Release|x86.ActiveCfg = Release|x86 - {C24166EE-9341-4760-86B3-F89B326F3FC0}.Release|x86.Build.0 = Release|x86 + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|x86.ActiveCfg = Debug|x86 + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|x86.Build.0 = Debug|x86 + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|x86.ActiveCfg = Release|x86 + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PrismaticTools/Framework/AssetEditor.cs b/PrismaticTools/Framework/AssetEditor.cs index 086d010..1fe42b6 100644 --- a/PrismaticTools/Framework/AssetEditor.cs +++ b/PrismaticTools/Framework/AssetEditor.cs @@ -23,8 +23,8 @@ public bool CanEdit(IAssetInfo asset) { public void Edit(IAssetData asset) { if (asset.AssetNameEquals("Maps/springobjects")) { - Texture2D bar = ModEntry.ModHelper.Content.Load("Assets/prismaticBar.png"); - Texture2D sprinkler = ModEntry.ModHelper.Content.Load("Assets/prismaticSprinkler.png"); + Texture2D bar = ModEntry.ModHelper.Content.Load("assets/prismaticBar.png"); + Texture2D sprinkler = ModEntry.ModHelper.Content.Load("assets/prismaticSprinkler.png"); Texture2D old = asset.AsImage().Data; asset.ReplaceWith(new Texture2D(Game1.graphics.GraphicsDevice, old.Width, System.Math.Max(old.Height, 1200 / 24 * 16))); asset.AsImage().PatchImage(old); diff --git a/PrismaticTools/ModEntry.cs b/PrismaticTools/ModEntry.cs index cb7991e..6797f17 100644 --- a/PrismaticTools/ModEntry.cs +++ b/PrismaticTools/ModEntry.cs @@ -23,7 +23,7 @@ public override void Entry(IModHelper helper) { Config = this.Helper.ReadConfig(); - ToolsTexture = ModHelper.Content.Load("Assets/tools.png"); + ToolsTexture = ModHelper.Content.Load("assets/tools.png"); helper.ConsoleCommands.Add("ptools", "Upgrade all tools to prismatic", this.UpgradeTools); diff --git a/PrismaticTools/PrismaticTools.csproj b/PrismaticTools/PrismaticTools.csproj index 68e383e..e318861 100644 --- a/PrismaticTools/PrismaticTools.csproj +++ b/PrismaticTools/PrismaticTools.csproj @@ -1,98 +1,16 @@ - - - + + - Debug - AnyCPU - {C24166EE-9341-4760-86B3-F89B326F3FC0} - Library - Properties - PrismaticTools PrismaticTools - v4.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\x86\Debug\ - DEBUG;TRACE - full - x86 - prompt - MinimumRecommendedRules.ruleset - - - bin\x86\Release\ - TRACE - true - none - x86 - prompt - MinimumRecommendedRules.ruleset - false - - - + PrismaticTools + 1.7.1 + net452 + + true + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Always - - - Always - - - Always - - - Always - + - - \ No newline at end of file + + diff --git a/PrismaticTools/Properties/AssemblyInfo.cs b/PrismaticTools/Properties/AssemblyInfo.cs deleted file mode 100644 index 078602c..0000000 --- a/PrismaticTools/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -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("PrismaticTools")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("PrismaticTools")] -[assembly: AssemblyCopyright("Copyright © 2018")] -[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("c24166ee-9341-4760-86b3-f89b326f3fc0")] - -// 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/PrismaticTools/Assets/old/prismaticBar.png b/PrismaticTools/assets/old/prismaticBar.png similarity index 100% rename from PrismaticTools/Assets/old/prismaticBar.png rename to PrismaticTools/assets/old/prismaticBar.png diff --git a/PrismaticTools/Assets/old/prismaticSprinkler.png b/PrismaticTools/assets/old/prismaticSprinkler.png similarity index 100% rename from PrismaticTools/Assets/old/prismaticSprinkler.png rename to PrismaticTools/assets/old/prismaticSprinkler.png diff --git a/PrismaticTools/Assets/old/prismaticTools.png b/PrismaticTools/assets/old/prismaticTools.png similarity index 100% rename from PrismaticTools/Assets/old/prismaticTools.png rename to PrismaticTools/assets/old/prismaticTools.png diff --git a/PrismaticTools/Assets/old/tools.png b/PrismaticTools/assets/old/tools.png similarity index 100% rename from PrismaticTools/Assets/old/tools.png rename to PrismaticTools/assets/old/tools.png diff --git a/PrismaticTools/Assets/prismaticBar.png b/PrismaticTools/assets/prismaticBar.png similarity index 100% rename from PrismaticTools/Assets/prismaticBar.png rename to PrismaticTools/assets/prismaticBar.png diff --git a/PrismaticTools/Assets/prismaticSprinkler.png b/PrismaticTools/assets/prismaticSprinkler.png similarity index 100% rename from PrismaticTools/Assets/prismaticSprinkler.png rename to PrismaticTools/assets/prismaticSprinkler.png diff --git a/PrismaticTools/Assets/prismaticTools.png b/PrismaticTools/assets/prismaticTools.png similarity index 100% rename from PrismaticTools/Assets/prismaticTools.png rename to PrismaticTools/assets/prismaticTools.png diff --git a/PrismaticTools/Assets/tools.png b/PrismaticTools/assets/tools.png similarity index 100% rename from PrismaticTools/Assets/tools.png rename to PrismaticTools/assets/tools.png From d22e5fad3c44fa653fc8e7e127f1a84882ce7c49 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 3 Jul 2019 21:29:21 -0400 Subject: [PATCH 20/31] remove unused assets/old files --- PrismaticTools/assets/old/prismaticBar.png | Bin 7221 -> 0 bytes .../assets/old/prismaticSprinkler.png | Bin 7381 -> 0 bytes PrismaticTools/assets/old/prismaticTools.png | Bin 33916 -> 0 bytes PrismaticTools/assets/old/tools.png | Bin 64002 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 PrismaticTools/assets/old/prismaticBar.png delete mode 100644 PrismaticTools/assets/old/prismaticSprinkler.png delete mode 100644 PrismaticTools/assets/old/prismaticTools.png delete mode 100644 PrismaticTools/assets/old/tools.png diff --git a/PrismaticTools/assets/old/prismaticBar.png b/PrismaticTools/assets/old/prismaticBar.png deleted file mode 100644 index b5ec38a60f6f5e02372c74bfa8b00c09e2c87b8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7221 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 diff --git a/PrismaticTools/assets/old/prismaticSprinkler.png b/PrismaticTools/assets/old/prismaticSprinkler.png deleted file mode 100644 index f0168874a34703807ce4df925f8500914154a7f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7381 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 diff --git a/PrismaticTools/assets/old/prismaticTools.png b/PrismaticTools/assets/old/prismaticTools.png deleted file mode 100644 index 42c88a0c325169b2f0fb6f825501b63bf2ac0a2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33916 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 Date: Wed, 27 Nov 2019 20:37:03 -0800 Subject: [PATCH 21/31] Update for SMAPI 3.0 Update for compatibility with SMAPI 3.0 and SDV 1.4 --- PrismaticTools.sln | 12 ++++----- PrismaticTools/Framework/Blacksmith.cs | 34 +++++++++++++++++--------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/PrismaticTools.sln b/PrismaticTools.sln index 8ee10b1..16dcfc2 100644 --- a/PrismaticTools.sln +++ b/PrismaticTools.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28803.202 +# Visual Studio 15 +VisualStudioVersion = 15.0.27703.2018 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "root", "root", "{7EF5E22B-2A2D-4B4A-9903-6B118B874F64}" ProjectSection(SolutionItems) = preProject @@ -19,10 +19,10 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|x86.ActiveCfg = Debug|x86 - {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|x86.Build.0 = Debug|x86 - {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|x86.ActiveCfg = Release|x86 - {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|x86.Build.0 = Release|x86 + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|x86.ActiveCfg = Debug|Any CPU + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|x86.Build.0 = Debug|Any CPU + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|x86.ActiveCfg = Release|Any CPU + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PrismaticTools/Framework/Blacksmith.cs b/PrismaticTools/Framework/Blacksmith.cs index 55a7cf5..ea15f54 100644 --- a/PrismaticTools/Framework/Blacksmith.cs +++ b/PrismaticTools/Framework/Blacksmith.cs @@ -4,23 +4,29 @@ using StardewValley.Menus; using StardewValley.Tools; -namespace PrismaticTools.Framework { - internal class BlacksmithInitializer { +namespace PrismaticTools.Framework +{ + internal class BlacksmithInitializer + { private static readonly int UpgradeCost = ModEntry.Config.PrismaticToolCost; - public static void Init(IModEvents events) { + public static void Init(IModEvents events) + { events.Display.MenuChanged += OnMenuChanged; } /// Raised after a game menu is opened, closed, or replaced. /// The event sender. /// The event arguments. - private static void OnMenuChanged(object sender, MenuChangedEventArgs e) { - if (!(e.NewMenu is ShopMenu menu)) { + private static void OnMenuChanged(object sender, MenuChangedEventArgs e) + { + if (!(e.NewMenu is ShopMenu menu)) + { return; } List categories = ModEntry.ModHelper.Reflection.GetField>(menu, "categoriesToSellHere").GetValue(); - if (!categories.Contains(Object.GemCategory) || !categories.Contains(Object.mineralsCategory) || !categories.Contains(Object.metalResources)) { + if (!categories.Contains(Object.GemCategory) || !categories.Contains(Object.mineralsCategory) || !categories.Contains(Object.metalResources)) + { return; } Farmer who = Game1.player; @@ -31,25 +37,29 @@ private static void OnMenuChanged(object sender, MenuChangedEventArgs e) { Tool toolFromName4 = who.getToolFromName("Hoe"); Tool tool; - List forSale = ModEntry.ModHelper.Reflection.GetField>(menu, "forSale").GetValue(); - Dictionary stock = ModEntry.ModHelper.Reflection.GetField>(menu, "itemPriceAndStock").GetValue(); + List forSale = menu.forSale; + Dictionary stock = menu.itemPriceAndStock; - if (toolFromName1 != null && toolFromName1.UpgradeLevel == 4) { + if (toolFromName1 != null && toolFromName1.UpgradeLevel == 4) + { tool = new Axe { UpgradeLevel = 5 }; forSale.Add(tool); stock.Add(tool, new[] { UpgradeCost, 1, PrismaticBarItem.INDEX }); } - if (toolFromName2 != null && toolFromName2.UpgradeLevel == 4) { + if (toolFromName2 != null && toolFromName2.UpgradeLevel == 4) + { tool = new WateringCan { UpgradeLevel = 5 }; forSale.Add(tool); stock.Add(tool, new[] { UpgradeCost, 1, PrismaticBarItem.INDEX }); } - if (toolFromName3 != null && toolFromName3.UpgradeLevel == 4) { + if (toolFromName3 != null && toolFromName3.UpgradeLevel == 4) + { tool = new Pickaxe { UpgradeLevel = 5 }; forSale.Add(tool); stock.Add(tool, new[] { UpgradeCost, 1, PrismaticBarItem.INDEX }); } - if (toolFromName4 != null && toolFromName4.UpgradeLevel == 4) { + if (toolFromName4 != null && toolFromName4.UpgradeLevel == 4) + { tool = new Hoe { UpgradeLevel = 5 }; forSale.Add(tool); stock.Add(tool, new[] { UpgradeCost, 1, PrismaticBarItem.INDEX }); From 89b99888bbebea9069464913d267b9188eb23717 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 30 Dec 2020 20:40:25 -0500 Subject: [PATCH 22/31] fix platform targets --- PrismaticTools.sln | 12 ++++++------ PrismaticTools/PrismaticTools.csproj | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/PrismaticTools.sln b/PrismaticTools.sln index 16dcfc2..8ee10b1 100644 --- a/PrismaticTools.sln +++ b/PrismaticTools.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27703.2018 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.202 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "root", "root", "{7EF5E22B-2A2D-4B4A-9903-6B118B874F64}" ProjectSection(SolutionItems) = preProject @@ -19,10 +19,10 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|x86.ActiveCfg = Debug|Any CPU - {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|x86.Build.0 = Debug|Any CPU - {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|x86.ActiveCfg = Release|Any CPU - {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|x86.Build.0 = Release|Any CPU + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|x86.ActiveCfg = Debug|x86 + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|x86.Build.0 = Debug|x86 + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|x86.ActiveCfg = Release|x86 + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PrismaticTools/PrismaticTools.csproj b/PrismaticTools/PrismaticTools.csproj index e318861..196de1c 100644 --- a/PrismaticTools/PrismaticTools.csproj +++ b/PrismaticTools/PrismaticTools.csproj @@ -5,6 +5,8 @@ PrismaticTools 1.7.1 net452 + x86 + x86 true From faaae568290de301390f8888def615e9edc000b8 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 30 Dec 2020 20:41:10 -0500 Subject: [PATCH 23/31] restore original code style for consistency --- PrismaticTools/Framework/Blacksmith.cs | 30 +++++++++----------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/PrismaticTools/Framework/Blacksmith.cs b/PrismaticTools/Framework/Blacksmith.cs index ea15f54..4a6a9de 100644 --- a/PrismaticTools/Framework/Blacksmith.cs +++ b/PrismaticTools/Framework/Blacksmith.cs @@ -4,29 +4,23 @@ using StardewValley.Menus; using StardewValley.Tools; -namespace PrismaticTools.Framework -{ - internal class BlacksmithInitializer - { +namespace PrismaticTools.Framework { + internal class BlacksmithInitializer { private static readonly int UpgradeCost = ModEntry.Config.PrismaticToolCost; - public static void Init(IModEvents events) - { + public static void Init(IModEvents events) { events.Display.MenuChanged += OnMenuChanged; } /// Raised after a game menu is opened, closed, or replaced. /// The event sender. /// The event arguments. - private static void OnMenuChanged(object sender, MenuChangedEventArgs e) - { - if (!(e.NewMenu is ShopMenu menu)) - { + private static void OnMenuChanged(object sender, MenuChangedEventArgs e) { + if (!(e.NewMenu is ShopMenu menu)) { return; } List categories = ModEntry.ModHelper.Reflection.GetField>(menu, "categoriesToSellHere").GetValue(); - if (!categories.Contains(Object.GemCategory) || !categories.Contains(Object.mineralsCategory) || !categories.Contains(Object.metalResources)) - { + if (!categories.Contains(Object.GemCategory) || !categories.Contains(Object.mineralsCategory) || !categories.Contains(Object.metalResources)) { return; } Farmer who = Game1.player; @@ -40,26 +34,22 @@ private static void OnMenuChanged(object sender, MenuChangedEventArgs e) List forSale = menu.forSale; Dictionary stock = menu.itemPriceAndStock; - if (toolFromName1 != null && toolFromName1.UpgradeLevel == 4) - { + if (toolFromName1 != null && toolFromName1.UpgradeLevel == 4) { tool = new Axe { UpgradeLevel = 5 }; forSale.Add(tool); stock.Add(tool, new[] { UpgradeCost, 1, PrismaticBarItem.INDEX }); } - if (toolFromName2 != null && toolFromName2.UpgradeLevel == 4) - { + if (toolFromName2 != null && toolFromName2.UpgradeLevel == 4) { tool = new WateringCan { UpgradeLevel = 5 }; forSale.Add(tool); stock.Add(tool, new[] { UpgradeCost, 1, PrismaticBarItem.INDEX }); } - if (toolFromName3 != null && toolFromName3.UpgradeLevel == 4) - { + if (toolFromName3 != null && toolFromName3.UpgradeLevel == 4) { tool = new Pickaxe { UpgradeLevel = 5 }; forSale.Add(tool); stock.Add(tool, new[] { UpgradeCost, 1, PrismaticBarItem.INDEX }); } - if (toolFromName4 != null && toolFromName4.UpgradeLevel == 4) - { + if (toolFromName4 != null && toolFromName4.UpgradeLevel == 4) { tool = new Hoe { UpgradeLevel = 5 }; forSale.Add(tool); stock.Add(tool, new[] { UpgradeCost, 1, PrismaticBarItem.INDEX }); From 21e6f77fb3d477a8e538ab9071359b4cd409c71b Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 30 Dec 2020 21:39:13 -0500 Subject: [PATCH 24/31] update sprinkler patches for Stardew Valley 1.5 This enables support for the new sprinkler addons like the enricher and pressure nozzle, and simplifies mod compatibility (since other mods can now use obj.isSprinkler() and obj.GetBaseRadiusForSprinkler() instead of calling the API). --- PrismaticTools/Framework/PrismaticPatches.cs | 29 +++++--------------- PrismaticTools/ModEntry.cs | 8 ++++-- 2 files changed, 13 insertions(+), 24 deletions(-) diff --git a/PrismaticTools/Framework/PrismaticPatches.cs b/PrismaticTools/Framework/PrismaticPatches.cs index f3e7a7e..87c4cbc 100644 --- a/PrismaticTools/Framework/PrismaticPatches.cs +++ b/PrismaticTools/Framework/PrismaticPatches.cs @@ -110,29 +110,14 @@ public static bool Farm_AddCrows(ref Farm __instance) { return false; } - public static bool Object_DayUpdating(ref SObject __instance, GameLocation location) { - var obj = __instance; - - // water tiles covered by sprinkler - if (obj.ParentSheetIndex == PrismaticSprinklerItem.INDEX) { - location.TemporarySprites.Add(new TemporaryAnimatedSprite("TileSheets\\animations", new Rectangle(0, 2176, 320, 320), 60f, 4, 100, obj.TileLocation * 64 + new Vector2(-192, -208), false, false) { - color = Color.White * 0.4f, - scale = 7f / 5f, - delayBeforeAnimationStart = 0, - id = obj.TileLocation.X * 4000f + obj.TileLocation.Y - }); - - for (int x = (int)obj.TileLocation.X - ModEntry.Config.SprinklerRange; x <= obj.TileLocation.X + ModEntry.Config.SprinklerRange; ++x) { - for (int y = (int)obj.TileLocation.Y - ModEntry.Config.SprinklerRange; y <= obj.TileLocation.Y + ModEntry.Config.SprinklerRange; ++y) { - Vector2 tile = new Vector2(x, y); + public static void After_Object_IsSprinkler(ref SObject __instance, ref bool __result) { + if (__instance.ParentSheetIndex == PrismaticSprinklerItem.INDEX) + __result = true; + } - // water dirt - if (location.terrainFeatures.TryGetValue(tile, out TerrainFeature terrain) && terrain is HoeDirt dirt) - dirt.state.Value = 1; - } - } - } - return true; + public static void After_Object_GetBaseRadiusForSprinkler(ref SObject __instance, ref int __result) { + if (__instance.ParentSheetIndex == PrismaticSprinklerItem.INDEX) + __result = ModEntry.Config.SprinklerRange; } public static bool Object_UpdatingWhenCurrentLocation(ref SObject __instance, GameTime time, GameLocation environment) { diff --git a/PrismaticTools/ModEntry.cs b/PrismaticTools/ModEntry.cs index 6797f17..3b6480b 100644 --- a/PrismaticTools/ModEntry.cs +++ b/PrismaticTools/ModEntry.cs @@ -57,8 +57,12 @@ private void ApplyPatches(HarmonyInstance harmony) { prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Farm_AddCrows)) ); harmony.Patch( - original: AccessTools.Method(typeof(Object), nameof(Object.DayUpdate)), - prefix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.Object_DayUpdating)) + original: AccessTools.Method(typeof(Object), nameof(Object.IsSprinkler)), + postfix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.After_Object_IsSprinkler)) + ); + harmony.Patch( + original: AccessTools.Method(typeof(Object), nameof(Object.GetBaseRadiusForSprinkler)), + postfix: new HarmonyMethod(typeof(PrismaticPatches), nameof(PrismaticPatches.After_Object_GetBaseRadiusForSprinkler)) ); harmony.Patch( original: AccessTools.Method(typeof(Object), nameof(Object.updateWhenCurrentLocation)), From 76ad8b50ea03b5c2908f942871721296ffeb2cc6 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 30 Dec 2020 21:49:14 -0500 Subject: [PATCH 25/31] bump API version for Stardew Valley 1.5 --- PrismaticTools/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PrismaticTools/manifest.json b/PrismaticTools/manifest.json index ae6debc..f23874e 100644 --- a/PrismaticTools/manifest.json +++ b/PrismaticTools/manifest.json @@ -5,6 +5,6 @@ "Description": "Adds prismatic tools and sprinklers to the game.", "UniqueID": "stokastic.PrismaticTools", "EntryDll": "PrismaticTools.dll", - "MinimumApiVersion": "2.10.1", + "MinimumApiVersion": "3.8.0", "UpdateKeys": [ "Nexus:2428" ] } From 59dfde99bf60db154215f372431b9ab259f1db3e Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 7 May 2022 12:12:09 -0400 Subject: [PATCH 26/31] update for Stardew Valley 1.5.5 Stardew Valley 1.5.5 migrated to MonoGame, 64-bit, and .NET 5. --- PrismaticTools.sln | 12 ++++++------ PrismaticTools/PrismaticTools.csproj | 8 +------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/PrismaticTools.sln b/PrismaticTools.sln index 8ee10b1..8266680 100644 --- a/PrismaticTools.sln +++ b/PrismaticTools.sln @@ -15,14 +15,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PrismaticTools", "Prismatic EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|x86.ActiveCfg = Debug|x86 - {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|x86.Build.0 = Debug|x86 - {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|x86.ActiveCfg = Release|x86 - {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|x86.Build.0 = Release|x86 + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A6634BD-1FF7-4711-99B6-FD503ED9B5C0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PrismaticTools/PrismaticTools.csproj b/PrismaticTools/PrismaticTools.csproj index 196de1c..6fa19c6 100644 --- a/PrismaticTools/PrismaticTools.csproj +++ b/PrismaticTools/PrismaticTools.csproj @@ -1,12 +1,7 @@ - - PrismaticTools - PrismaticTools 1.7.1 - net452 - x86 - x86 + net5.0 true @@ -14,5 +9,4 @@ - From 31c3e9516069504cb053b0a0927f98309d50a936 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 7 May 2022 12:27:06 -0400 Subject: [PATCH 27/31] update for recent SMAPI releases This migrates to Harmony 2.x and the new content API. --- PrismaticTools/Framework/AssetEditor.cs | 81 ++++++++++++------------- PrismaticTools/ModEntry.cs | 19 ++++-- PrismaticTools/PrismaticTools.csproj | 2 +- PrismaticTools/manifest.json | 1 - 4 files changed, 54 insertions(+), 49 deletions(-) diff --git a/PrismaticTools/Framework/AssetEditor.cs b/PrismaticTools/Framework/AssetEditor.cs index 1fe42b6..f9a1905 100644 --- a/PrismaticTools/Framework/AssetEditor.cs +++ b/PrismaticTools/Framework/AssetEditor.cs @@ -2,57 +2,54 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using StardewModdingAPI; +using StardewModdingAPI.Events; using StardewValley; namespace PrismaticTools.Framework { - public class AssetEditor : IAssetEditor { + public class AssetEditor { private readonly string barName = ModEntry.ModHelper.Translation.Get("prismaticBar.name"); private readonly string barDesc = ModEntry.ModHelper.Translation.Get("prismaticBar.description"); private readonly string sprinklerName = ModEntry.ModHelper.Translation.Get("prismaticSprinkler.name"); private readonly string sprinklerDesc = ModEntry.ModHelper.Translation.Get("prismaticSprinkler.description"); - public bool CanEdit(IAssetInfo asset) { - bool canEdit = - asset.AssetNameEquals("Maps/springobjects") - || asset.AssetNameEquals("Data/ObjectInformation") - || asset.AssetNameEquals("Data/CraftingRecipes") - || asset.AssetNameEquals("TileSheets/tools"); - return canEdit; - } - - public void Edit(IAssetData asset) { - - if (asset.AssetNameEquals("Maps/springobjects")) { - Texture2D bar = ModEntry.ModHelper.Content.Load("assets/prismaticBar.png"); - Texture2D sprinkler = ModEntry.ModHelper.Content.Load("assets/prismaticSprinkler.png"); - Texture2D old = asset.AsImage().Data; - asset.ReplaceWith(new Texture2D(Game1.graphics.GraphicsDevice, old.Width, System.Math.Max(old.Height, 1200 / 24 * 16))); - asset.AsImage().PatchImage(old); - asset.AsImage().PatchImage(bar, targetArea: this.GetRectangle(PrismaticBarItem.INDEX)); - asset.AsImage().PatchImage(sprinkler, targetArea: this.GetRectangle(PrismaticSprinklerItem.INDEX)); - } else if (asset.AssetNameEquals("Data/ObjectInformation")) { - asset.AsDictionary().Data.Add(PrismaticBarItem.INDEX, $"{this.barName}/{PrismaticBarItem.PRICE}/{PrismaticBarItem.EDIBILITY}/{PrismaticBarItem.TYPE} {PrismaticBarItem.CATEGORY}/{this.barName}/{this.barDesc}"); - asset.AsDictionary().Data.Add(PrismaticSprinklerItem.INDEX, $"{this.sprinklerName}/{PrismaticSprinklerItem.PRICE}/{PrismaticSprinklerItem.EDIBILITY}/{PrismaticSprinklerItem.TYPE} {PrismaticSprinklerItem.CATEGORY}/{this.sprinklerName}/{this.sprinklerDesc}"); - } else if (asset.AssetNameEquals("Data/CraftingRecipes")) { - IAssetDataForDictionary oldDict = asset.AsDictionary(); - Dictionary newDict = new Dictionary(); - // somehow the Dictionary maintains ordering, so reconstruct it with new sprinkler recipe immediately after prismatic - foreach (string key in oldDict.Data.Keys) { - newDict.Add(key, oldDict.Data[key]); - if (key.Equals("Iridium Sprinkler")) { - if (asset.Locale != "en") - newDict.Add("Prismatic Sprinkler", $"{PrismaticBarItem.INDEX} 2 787 2/Home/{PrismaticSprinklerItem.INDEX}/false/Farming {PrismaticSprinklerItem.CRAFTING_LEVEL}/{this.sprinklerName}"); - else - newDict.Add("Prismatic Sprinkler", $"{PrismaticBarItem.INDEX} 2 787 2/Home/{PrismaticSprinklerItem.INDEX}/false/Farming {PrismaticSprinklerItem.CRAFTING_LEVEL}"); + public void OnAssetRequested(AssetRequestedEventArgs e) { + if (e.NameWithoutLocale.IsEquivalentTo("Maps/springobjects")) { + e.Edit(asset => { + Texture2D bar = ModEntry.ModHelper.ModContent.Load("assets/prismaticBar.png"); + Texture2D sprinkler = ModEntry.ModHelper.ModContent.Load("assets/prismaticSprinkler.png"); + Texture2D old = asset.AsImage().Data; + asset.ReplaceWith(new Texture2D(Game1.graphics.GraphicsDevice, old.Width, System.Math.Max(old.Height, 1200 / 24 * 16))); + asset.AsImage().PatchImage(bar, targetArea: this.GetRectangle(PrismaticBarItem.INDEX)); + asset.AsImage().PatchImage(sprinkler, targetArea: this.GetRectangle(PrismaticSprinklerItem.INDEX)); + }); + } else if (e.NameWithoutLocale.IsEquivalentTo("Data/ObjectInformation")) { + e.Edit(asset => { + asset.AsDictionary().Data.Add(PrismaticBarItem.INDEX, $"{this.barName}/{PrismaticBarItem.PRICE}/{PrismaticBarItem.EDIBILITY}/{PrismaticBarItem.TYPE} {PrismaticBarItem.CATEGORY}/{this.barName}/{this.barDesc}"); + asset.AsDictionary().Data.Add(PrismaticSprinklerItem.INDEX, $"{this.sprinklerName}/{PrismaticSprinklerItem.PRICE}/{PrismaticSprinklerItem.EDIBILITY}/{PrismaticSprinklerItem.TYPE} {PrismaticSprinklerItem.CATEGORY}/{this.sprinklerName}/{this.sprinklerDesc}"); + }); + } else if (e.NameWithoutLocale.IsEquivalentTo("Data/CraftingRecipes")) { + e.Edit(asset => { + IAssetDataForDictionary oldDict = asset.AsDictionary(); + Dictionary newDict = new Dictionary(); + // somehow the Dictionary maintains ordering, so reconstruct it with new sprinkler recipe immediately after prismatic + foreach (string key in oldDict.Data.Keys) { + newDict.Add(key, oldDict.Data[key]); + if (key.Equals("Iridium Sprinkler")) { + if (asset.Locale != "en") + newDict.Add("Prismatic Sprinkler", $"{PrismaticBarItem.INDEX} 2 787 2/Home/{PrismaticSprinklerItem.INDEX}/false/Farming {PrismaticSprinklerItem.CRAFTING_LEVEL}/{this.sprinklerName}"); + else + newDict.Add("Prismatic Sprinkler", $"{PrismaticBarItem.INDEX} 2 787 2/Home/{PrismaticSprinklerItem.INDEX}/false/Farming {PrismaticSprinklerItem.CRAFTING_LEVEL}"); + } } - } - asset.AsDictionary().Data.Clear(); - foreach (string key in newDict.Keys) { - asset.AsDictionary().Data.Add(key, newDict[key]); - } - } else if (asset.AssetNameEquals("TileSheets\\tools")) { - asset.AsImage().PatchImage(ModEntry.ToolsTexture, null, null, PatchMode.Overlay); - + asset.AsDictionary().Data.Clear(); + foreach (string key in newDict.Keys) { + asset.AsDictionary().Data.Add(key, newDict[key]); + } + }); + } else if (e.NameWithoutLocale.IsEquivalentTo("TileSheets/tools")) { + e.Edit(asset => { + asset.AsImage().PatchImage(ModEntry.ToolsTexture, null, null, PatchMode.Overlay); + }); } } diff --git a/PrismaticTools/ModEntry.cs b/PrismaticTools/ModEntry.cs index 3b6480b..1eb9ff9 100644 --- a/PrismaticTools/ModEntry.cs +++ b/PrismaticTools/ModEntry.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using Harmony; +using HarmonyLib; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using PrismaticTools.Framework; @@ -17,30 +17,32 @@ public class ModEntry : Mod { private int colorCycleIndex; private readonly List colors = new List(); + private AssetEditor AssetEditor; public override void Entry(IModHelper helper) { ModHelper = helper; + this.AssetEditor = new AssetEditor(); Config = this.Helper.ReadConfig(); - ToolsTexture = ModHelper.Content.Load("assets/tools.png"); + ToolsTexture = ModHelper.ModContent.Load("assets/tools.png"); helper.ConsoleCommands.Add("ptools", "Upgrade all tools to prismatic", this.UpgradeTools); helper.Events.GameLoop.SaveLoaded += this.OnSaveLoaded; helper.Events.GameLoop.UpdateTicked += this.OnUpdateTicked; helper.Events.Player.InventoryChanged += this.OnInventoryChanged; + helper.Events.Content.AssetRequested += this.OnAssetRequested; - helper.Content.AssetEditors.Add(new AssetEditor()); BlacksmithInitializer.Init(helper.Events); this.InitColors(); - var harmony = HarmonyInstance.Create("stokastic.PrismaticTools"); + var harmony = new Harmony("stokastic.PrismaticTools"); this.ApplyPatches(harmony); } - private void ApplyPatches(HarmonyInstance harmony) { + private void ApplyPatches(Harmony harmony) { // furnaces harmony.Patch( original: AccessTools.Method(typeof(Farmer), nameof(Farmer.getTallyOfObject)), @@ -195,6 +197,13 @@ private void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { this.SetScarecrowModeForAllSprinklers(); } + /// Raised when an asset is being requested from the content pipeline. + /// The event sender. + /// The event arguments. + private void OnAssetRequested(object sender, AssetRequestedEventArgs e) { + this.AssetEditor.OnAssetRequested(e); + } + private void InitColors() { int n = 24; for (int i = 0; i < n; i++) { diff --git a/PrismaticTools/PrismaticTools.csproj b/PrismaticTools/PrismaticTools.csproj index 6fa19c6..ccce6bc 100644 --- a/PrismaticTools/PrismaticTools.csproj +++ b/PrismaticTools/PrismaticTools.csproj @@ -7,6 +7,6 @@ - + diff --git a/PrismaticTools/manifest.json b/PrismaticTools/manifest.json index f23874e..7094089 100644 --- a/PrismaticTools/manifest.json +++ b/PrismaticTools/manifest.json @@ -5,6 +5,5 @@ "Description": "Adds prismatic tools and sprinklers to the game.", "UniqueID": "stokastic.PrismaticTools", "EntryDll": "PrismaticTools.dll", - "MinimumApiVersion": "3.8.0", "UpdateKeys": [ "Nexus:2428" ] } From f22660e560e8688b100201a72d90a4266d2b45bb Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 7 May 2022 12:27:15 -0400 Subject: [PATCH 28/31] fix non-prismatic sprites overwritten by edits --- PrismaticTools/Framework/AssetEditor.cs | 2 +- PrismaticTools/assets/tools.png | Bin 44915 -> 16470 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/PrismaticTools/Framework/AssetEditor.cs b/PrismaticTools/Framework/AssetEditor.cs index f9a1905..eb4a788 100644 --- a/PrismaticTools/Framework/AssetEditor.cs +++ b/PrismaticTools/Framework/AssetEditor.cs @@ -48,7 +48,7 @@ public void OnAssetRequested(AssetRequestedEventArgs e) { }); } else if (e.NameWithoutLocale.IsEquivalentTo("TileSheets/tools")) { e.Edit(asset => { - asset.AsImage().PatchImage(ModEntry.ToolsTexture, null, null, PatchMode.Overlay); + asset.AsImage().PatchImage(ModEntry.ToolsTexture, patchMode: PatchMode.Overlay); }); } } diff --git a/PrismaticTools/assets/tools.png b/PrismaticTools/assets/tools.png index 991cdc248d0825b2a70342eb4973137bb8e4f334..8142b817d10c8f8a124a4cc82c596bb93ead90e5 100644 GIT binary patch literal 16470 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 HGYz0H6TmB*oP{(hk$T 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 Date: Sat, 7 May 2022 12:31:24 -0400 Subject: [PATCH 29/31] fix Prismatic Tools translations not updated when player switches language --- PrismaticTools/Framework/AssetEditor.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PrismaticTools/Framework/AssetEditor.cs b/PrismaticTools/Framework/AssetEditor.cs index eb4a788..bc674a6 100644 --- a/PrismaticTools/Framework/AssetEditor.cs +++ b/PrismaticTools/Framework/AssetEditor.cs @@ -7,10 +7,10 @@ namespace PrismaticTools.Framework { public class AssetEditor { - private readonly string barName = ModEntry.ModHelper.Translation.Get("prismaticBar.name"); - private readonly string barDesc = ModEntry.ModHelper.Translation.Get("prismaticBar.description"); - private readonly string sprinklerName = ModEntry.ModHelper.Translation.Get("prismaticSprinkler.name"); - private readonly string sprinklerDesc = ModEntry.ModHelper.Translation.Get("prismaticSprinkler.description"); + private string barName => ModEntry.ModHelper.Translation.Get("prismaticBar.name"); + private string barDesc => ModEntry.ModHelper.Translation.Get("prismaticBar.description"); + private string sprinklerName => ModEntry.ModHelper.Translation.Get("prismaticSprinkler.name"); + private string sprinklerDesc => ModEntry.ModHelper.Translation.Get("prismaticSprinkler.description"); public void OnAssetRequested(AssetRequestedEventArgs e) { if (e.NameWithoutLocale.IsEquivalentTo("Maps/springobjects")) { From 6c408d71fc9abd1da48164207e3af1726ca1aa59 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 7 May 2022 17:04:05 -0400 Subject: [PATCH 30/31] reduce repetition in asset editor --- PrismaticTools/Framework/AssetEditor.cs | 50 +++++++++++++++++-------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/PrismaticTools/Framework/AssetEditor.cs b/PrismaticTools/Framework/AssetEditor.cs index bc674a6..355faf5 100644 --- a/PrismaticTools/Framework/AssetEditor.cs +++ b/PrismaticTools/Framework/AssetEditor.cs @@ -13,27 +13,39 @@ public class AssetEditor { private string sprinklerDesc => ModEntry.ModHelper.Translation.Get("prismaticSprinkler.description"); public void OnAssetRequested(AssetRequestedEventArgs e) { + // new item sprites if (e.NameWithoutLocale.IsEquivalentTo("Maps/springobjects")) { e.Edit(asset => { + var editor = asset.AsImage(); + Texture2D bar = ModEntry.ModHelper.ModContent.Load("assets/prismaticBar.png"); Texture2D sprinkler = ModEntry.ModHelper.ModContent.Load("assets/prismaticSprinkler.png"); - Texture2D old = asset.AsImage().Data; - asset.ReplaceWith(new Texture2D(Game1.graphics.GraphicsDevice, old.Width, System.Math.Max(old.Height, 1200 / 24 * 16))); - asset.AsImage().PatchImage(bar, targetArea: this.GetRectangle(PrismaticBarItem.INDEX)); - asset.AsImage().PatchImage(sprinkler, targetArea: this.GetRectangle(PrismaticSprinklerItem.INDEX)); + + asset.ReplaceWith(new Texture2D(Game1.graphics.GraphicsDevice, editor.Data.Width, System.Math.Max(editor.Data.Height, 1200 / 24 * 16))); + editor.PatchImage(bar, targetArea: this.GetRectangle(PrismaticBarItem.INDEX)); + editor.PatchImage(sprinkler, targetArea: this.GetRectangle(PrismaticSprinklerItem.INDEX)); }); - } else if (e.NameWithoutLocale.IsEquivalentTo("Data/ObjectInformation")) { + } + + // new item data + else if (e.NameWithoutLocale.IsEquivalentTo("Data/ObjectInformation")) { e.Edit(asset => { - asset.AsDictionary().Data.Add(PrismaticBarItem.INDEX, $"{this.barName}/{PrismaticBarItem.PRICE}/{PrismaticBarItem.EDIBILITY}/{PrismaticBarItem.TYPE} {PrismaticBarItem.CATEGORY}/{this.barName}/{this.barDesc}"); - asset.AsDictionary().Data.Add(PrismaticSprinklerItem.INDEX, $"{this.sprinklerName}/{PrismaticSprinklerItem.PRICE}/{PrismaticSprinklerItem.EDIBILITY}/{PrismaticSprinklerItem.TYPE} {PrismaticSprinklerItem.CATEGORY}/{this.sprinklerName}/{this.sprinklerDesc}"); + var data = asset.AsDictionary().Data; + + data.Add(PrismaticBarItem.INDEX, $"{this.barName}/{PrismaticBarItem.PRICE}/{PrismaticBarItem.EDIBILITY}/{PrismaticBarItem.TYPE} {PrismaticBarItem.CATEGORY}/{this.barName}/{this.barDesc}"); + data.Add(PrismaticSprinklerItem.INDEX, $"{this.sprinklerName}/{PrismaticSprinklerItem.PRICE}/{PrismaticSprinklerItem.EDIBILITY}/{PrismaticSprinklerItem.TYPE} {PrismaticSprinklerItem.CATEGORY}/{this.sprinklerName}/{this.sprinklerDesc}"); }); - } else if (e.NameWithoutLocale.IsEquivalentTo("Data/CraftingRecipes")) { + } + + // new recipes + else if (e.NameWithoutLocale.IsEquivalentTo("Data/CraftingRecipes")) { e.Edit(asset => { - IAssetDataForDictionary oldDict = asset.AsDictionary(); - Dictionary newDict = new Dictionary(); + var data = asset.AsDictionary().Data; + // somehow the Dictionary maintains ordering, so reconstruct it with new sprinkler recipe immediately after prismatic - foreach (string key in oldDict.Data.Keys) { - newDict.Add(key, oldDict.Data[key]); + Dictionary newDict = new(); + foreach (string key in data.Keys) { + newDict.Add(key, data[key]); if (key.Equals("Iridium Sprinkler")) { if (asset.Locale != "en") newDict.Add("Prismatic Sprinkler", $"{PrismaticBarItem.INDEX} 2 787 2/Home/{PrismaticSprinklerItem.INDEX}/false/Farming {PrismaticSprinklerItem.CRAFTING_LEVEL}/{this.sprinklerName}"); @@ -41,14 +53,20 @@ public void OnAssetRequested(AssetRequestedEventArgs e) { newDict.Add("Prismatic Sprinkler", $"{PrismaticBarItem.INDEX} 2 787 2/Home/{PrismaticSprinklerItem.INDEX}/false/Farming {PrismaticSprinklerItem.CRAFTING_LEVEL}"); } } - asset.AsDictionary().Data.Clear(); + + data.Clear(); foreach (string key in newDict.Keys) { - asset.AsDictionary().Data.Add(key, newDict[key]); + data.Add(key, newDict[key]); } }); - } else if (e.NameWithoutLocale.IsEquivalentTo("TileSheets/tools")) { + } + + // tool sprites + else if (e.NameWithoutLocale.IsEquivalentTo("TileSheets/tools")) { e.Edit(asset => { - asset.AsImage().PatchImage(ModEntry.ToolsTexture, patchMode: PatchMode.Overlay); + var editor = asset.AsImage(); + + editor.PatchImage(ModEntry.ToolsTexture, patchMode: PatchMode.Overlay); }); } } From 08d397f5431dd648d7dfcf7c619eb8ab7eec7844 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 7 May 2022 17:04:46 -0400 Subject: [PATCH 31/31] use SMAPI's ExtendImage instead of manually replacing it --- PrismaticTools/Framework/AssetEditor.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PrismaticTools/Framework/AssetEditor.cs b/PrismaticTools/Framework/AssetEditor.cs index 355faf5..ef3e577 100644 --- a/PrismaticTools/Framework/AssetEditor.cs +++ b/PrismaticTools/Framework/AssetEditor.cs @@ -3,7 +3,6 @@ using Microsoft.Xna.Framework.Graphics; using StardewModdingAPI; using StardewModdingAPI.Events; -using StardewValley; namespace PrismaticTools.Framework { public class AssetEditor { @@ -21,7 +20,7 @@ public void OnAssetRequested(AssetRequestedEventArgs e) { Texture2D bar = ModEntry.ModHelper.ModContent.Load("assets/prismaticBar.png"); Texture2D sprinkler = ModEntry.ModHelper.ModContent.Load("assets/prismaticSprinkler.png"); - asset.ReplaceWith(new Texture2D(Game1.graphics.GraphicsDevice, editor.Data.Width, System.Math.Max(editor.Data.Height, 1200 / 24 * 16))); + editor.ExtendImage(minWidth: editor.Data.Width, minHeight: 1200 / 24 * 16); editor.PatchImage(bar, targetArea: this.GetRectangle(PrismaticBarItem.INDEX)); editor.PatchImage(sprinkler, targetArea: this.GetRectangle(PrismaticSprinklerItem.INDEX)); });