using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using StardewModdingAPI;
using StardewModdingAPI.Events;
using StardewValley;
using StardewValley.Menus;
using System;
using System.Reflection;
using UIInfoSuite.Extensions;
namespace UIInfoSuite.UIElements
{
class ShopHarvestPrices : IDisposable
{
private readonly IModHelper _helper;
public ShopHarvestPrices(IModHelper helper)
{
_helper = helper;
}
public void ToggleOption(bool shopHarvestPrices)
{
_helper.Events.Display.RenderedActiveMenu -= OnRenderedActiveMenu;
if (shopHarvestPrices)
{
_helper.Events.Display.RenderedActiveMenu += OnRenderedActiveMenu;
}
}
public void Dispose()
{
ToggleOption(false);
}
/// When a menu is open ( isn't null), raised after that menu is drawn to the sprite batch but before it's rendered to the screen.
/// The event sender.
/// The event arguments.
private void OnRenderedActiveMenu(object sender, RenderedActiveMenuEventArgs e)
{
// draw shop harvest prices
if (Game1.activeClickableMenu is ShopMenu menu)
{
if (typeof(ShopMenu).GetField("hoveredItem", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(menu) is Item hoverItem)
{
String text = string.Empty;
bool itemHasPriceInfo = Tools.GetTruePrice(hoverItem) > 0;
if (hoverItem is StardewValley.Object &&
(hoverItem as StardewValley.Object).Type == "Seeds" &&
itemHasPriceInfo &&
hoverItem.Name != "Mixed Seeds" &&
hoverItem.Name != "Winter Seeds")
{
StardewValley.Object temp =
new StardewValley.Object(
new Debris(
new Crop(
hoverItem.ParentSheetIndex,
0,
0)
.indexOfHarvest.Value,
Game1.player.position,
Game1.player.position).chunkType.Value,
1);
text = " " + temp.Price;
}
Item heldItem = typeof(ShopMenu).GetField("heldItem", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(menu) as Item;
if (heldItem == null)
{
int value = 0;
switch (hoverItem.ParentSheetIndex)
{
case 628: value = 50; break;
case 629: value = 80; break;
case 630:
case 633: value = 100; break;
case 631:
case 632: value = 140; break;
}
if (value > 0)
text = " " + value;
if (text != "" &&
(hoverItem as StardewValley.Object).Type == "Seeds")
{
String textToRender = _helper.SafeGetString(
LanguageKeys.HarvestPrice);
int xPosition = menu.xPositionOnScreen - 30;
int yPosition = menu.yPositionOnScreen + 580;
IClickableMenu.drawTextureBox(
Game1.spriteBatch,
xPosition + 20,
yPosition - 52,
264,
108,
Color.White);
Game1.spriteBatch.DrawString(
Game1.dialogueFont,
textToRender,
new Vector2(xPosition + 30, yPosition - 38),
Color.Black * 0.2f);
Game1.spriteBatch.DrawString(
Game1.dialogueFont,
textToRender,
new Vector2(xPosition + 32, yPosition - 40),
Color.Black * 0.8f);
xPosition += 80;
Game1.spriteBatch.Draw(
Game1.mouseCursors,
new Vector2(xPosition, yPosition),
new Rectangle(60, 428, 10, 10),
Color.White,
0,
Vector2.Zero,
Game1.pixelZoom,
SpriteEffects.None,
0.85f);
Game1.spriteBatch.Draw(
Game1.debrisSpriteSheet,
new Vector2(xPosition + 32, yPosition + 10),
Game1.getSourceRectForStandardTileSheet(Game1.debrisSpriteSheet, 8, 16, 16),
Color.White,
0,
new Vector2(8, 8),
4,
SpriteEffects.None,
0.95f);
Game1.spriteBatch.DrawString(
Game1.dialogueFont,
text,
new Vector2(xPosition - 2, yPosition + 6),
Color.Black * 0.2f);
Game1.spriteBatch.DrawString(
Game1.dialogueFont,
text,
new Vector2(xPosition, yPosition + 4),
Color.Black * 0.8f);
String hoverText = _helper.Reflection.GetField(menu, "hoverText").GetValue();
String hoverTitle = _helper.Reflection.GetField(menu, "boldTitleText").GetValue();
Item hoverItem2 = _helper.Reflection.GetField- (menu, "hoveredItem").GetValue();
int currency = _helper.Reflection.GetField(menu, "currency").GetValue();
int hoverPrice = _helper.Reflection.GetField(menu, "hoverPrice").GetValue();
IReflectedMethod getHoveredItemExtraItemIndex = _helper.Reflection.GetMethod(menu, "getHoveredItemExtraItemIndex");
IReflectedMethod getHoveredItemExtraItemAmount = _helper.Reflection.GetMethod(menu, "getHoveredItemExtraItemAmount");
IClickableMenu.drawToolTip(
Game1.spriteBatch,
hoverText,
hoverTitle,
hoverItem2,
heldItem != null,
-1,
currency,
getHoveredItemExtraItemIndex.Invoke(new object[0]),
getHoveredItemExtraItemAmount.Invoke(new object[0]),
null,
hoverPrice);
}
}
}
}
}
}
}