Ui-Info-Suite/SDVModTest/UIElements/ShowItemEffectRanges.cs

185 lines
6.7 KiB
C#
Raw Normal View History

2017-07-20 11:51:05 +08:00
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using StardewModdingAPI.Events;
using StardewValley;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UIInfoSuite.UIElements
{
class ShowItemEffectRanges : IDisposable
{
private readonly List<Point> _effectiveArea = new List<Point>();
private readonly ModConfig _modConfig;
public ShowItemEffectRanges(ModConfig modConfig)
{
_modConfig = modConfig;
}
public void ToggleOption(bool showItemEffectRanges)
{
GraphicsEvents.OnPostRenderEvent -= DrawTileOutlines;
GameEvents.FourthUpdateTick -= CheckDrawTileOutlines;
if (showItemEffectRanges)
{
GraphicsEvents.OnPostRenderEvent += DrawTileOutlines;
GameEvents.FourthUpdateTick += CheckDrawTileOutlines;
}
}
public void Dispose()
{
ToggleOption(false);
}
private void CheckDrawTileOutlines(object sender, EventArgs e)
{
_effectiveArea.Clear();
if (Game1.player.CurrentItem != null &&
Game1.activeClickableMenu == null &&
!Game1.eventUp)
{
String name = Game1.player.CurrentItem.Name.ToLower();
Item currentItem = Game1.player.CurrentItem;
List<StardewValley.Object> objects = null;
int[][] arrayToUse = null;
if (name.Contains("arecrow"))
{
arrayToUse = new int[17][];
for (int i = 0; i < 17; ++i)
{
arrayToUse[i] = new int[17];
for (int j = 0; j < 17; ++j)
{
arrayToUse[i][j] = (Math.Abs(i - 8) + Math.Abs(j - 8) <= 12) ? 1 : 0;
}
}
ParseConfigToHighlightedArea(arrayToUse, TileUnderMouseX, TileUnderMouseY);
objects = GetObjectsInLocationOfSimilarName("arecrow");
if (objects != null)
{
foreach (StardewValley.Object next in objects)
{
ParseConfigToHighlightedArea(arrayToUse, (int)next.TileLocation.X, (int)next.TileLocation.Y);
}
}
}
else if (name.Contains("sprinkler"))
{
if (name.Contains("iridium"))
{
arrayToUse = _modConfig.IridiumSprinkler;
}
else if (name.Contains("quality"))
{
arrayToUse = _modConfig.QualitySprinkler;
}
else
{
arrayToUse = _modConfig.Sprinkler;
}
if (arrayToUse != null)
ParseConfigToHighlightedArea(arrayToUse, TileUnderMouseX, TileUnderMouseY);
objects = GetObjectsInLocationOfSimilarName("sprinkler");
if (objects != null)
{
foreach (StardewValley.Object next in objects)
{
string objectName = next.name.ToLower();
if (objectName.Contains("iridium"))
{
arrayToUse = _modConfig.IridiumSprinkler;
}
else if (objectName.Contains("quality"))
{
arrayToUse = _modConfig.QualitySprinkler;
}
else
{
arrayToUse = _modConfig.Sprinkler;
}
if (arrayToUse != null)
ParseConfigToHighlightedArea(arrayToUse, (int)next.TileLocation.X, (int)next.TileLocation.Y);
}
}
}
else if (name.Contains("bee house"))
{
ParseConfigToHighlightedArea(_modConfig.Beehouse, TileUnderMouseX, TileUnderMouseY);
}
}
}
private void DrawTileOutlines(object sender, EventArgs e)
{
foreach (Point point in _effectiveArea)
Game1.spriteBatch.Draw(
Game1.mouseCursors,
Game1.GlobalToLocal(new Vector2(point.X * Game1.tileSize, point.Y * Game1.tileSize)),
new Rectangle(194, 388, 16, 16),
Color.White * 0.7f,
0.0f,
Vector2.Zero,
Game1.pixelZoom,
SpriteEffects.None,
0.01f);
}
private void ParseConfigToHighlightedArea(int[][] highlightedLocation, int xPos, int yPos)
{
int xOffset = highlightedLocation.Length / 2;
for (int i = 0; i < highlightedLocation.Length; ++i)
{
int yOffset = highlightedLocation[i].Length / 2;
for (int j = 0; j < highlightedLocation[i].Length; ++j)
{
if (highlightedLocation[i][j] == 1)
_effectiveArea.Add(new Point(xPos + i - xOffset, yPos + j - yOffset));
}
}
}
private int TileUnderMouseX
{
get { return (Game1.getMouseX() + Game1.viewport.X) / Game1.tileSize; }
}
private int TileUnderMouseY
{
get { return (Game1.getMouseY() + Game1.viewport.Y) / Game1.tileSize; }
}
private List<StardewValley.Object> GetObjectsInLocationOfSimilarName(String nameContains)
{
List<StardewValley.Object> result = new List<StardewValley.Object>();
if (!String.IsNullOrEmpty(nameContains))
{
nameContains = nameContains.ToLower();
var objects = Game1.currentLocation.Objects;
foreach (var nextThing in objects.Values)
{
if (nextThing.name.ToLower().Contains(nameContains))
result.Add(nextThing);
}
}
return result;
}
}
}