using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using Harmony;
using StardewModdingAPI.Framework.Patching;
using StardewValley;
using SObject = StardewValley.Object;
namespace StardewModdingAPI.Patches
{
/// A Harmony patch for which intercepts crashes due to the item no longer existing.
internal class ObjectErrorPatch : IHarmonyPatch
{
/*********
** Accessors
*********/
/// A unique name for this patch.
public string Name => $"{nameof(ObjectErrorPatch)}";
/*********
** Public methods
*********/
/// Apply the Harmony patch.
/// The Harmony instance.
public void Apply(HarmonyInstance harmony)
{
MethodInfo method = AccessTools.Method(typeof(SObject), nameof(SObject.getDescription));
MethodInfo prefix = AccessTools.Method(this.GetType(), nameof(ObjectErrorPatch.Prefix));
harmony.Patch(method, new HarmonyMethod(prefix), null);
}
/*********
** Private methods
*********/
/// The method to call instead of .
/// The instance being patched.
/// The patched method's return value.
/// Returns whether to execute the original method.
/// This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments.
[SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony.")]
private static bool Prefix(SObject __instance, ref string __result)
{
// invalid bigcraftables crash instead of showing '???' like invalid non-bigcraftables
if (!__instance.IsRecipe && __instance.bigCraftable.Value && !Game1.bigCraftablesInformation.ContainsKey(__instance.ParentSheetIndex))
{
__result = "???";
return false;
}
return true;
}
}
}