Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unofficial update #6

Merged
merged 8 commits into from Feb 11, 2020
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
67 changes: 67 additions & 0 deletions MegaStorage/ISaveAnywhere.cs
@@ -0,0 +1,67 @@
using System;

namespace MegaStorage
{
public interface ISaveAnywhereApi
{
/*********
** Events
*********/
/// <summary>
/// Event that fires before game save
/// </summary>
event EventHandler BeforeSave;

/// <summary>
/// Event that fires after game save
/// </summary>
event EventHandler AfterSave;

/// <summary>
/// Event that fires after game load
/// </summary>
event EventHandler AfterLoad;

/// <summary>
/// Add in an event that can trigger before saving begins.
/// </summary>
/// <param name="ID"></param>
/// <param name="BeforeSave"></param>
void addBeforeSaveEvent(string ID, Action BeforeSave);

/// <summary>
/// Remove an event that can trigger before saving begins.
/// </summary>
/// <param name="ID"></param>
/// <param name="BeforeSave"></param>
void removeBeforeSaveEvent(string ID, Action BeforeSave);

/// <summary>
/// Add an event that tiggers after saving has finished.
/// </summary>
/// <param name="ID"></param>
/// <param name="AfterSave"></param>
void addAfterSaveEvent(string ID, Action AfterSave);

/// <summary>
///Remove an event that triggers after saving has occured.
/// </summary>
/// <param name="ID"></param>
/// <param name="AfterSave"></param>
void removeAfterSaveEvent(string ID, Action AfterSave);

/// <summary>
/// Add in an event that triggers afer loading has occured.
/// </summary>
/// <param name="ID"></param>
/// <param name="AfterLoad"></param>
void addAfterLoadEvent(string ID, Action AfterLoad);

/// <summary>
/// Remove an event that occurs after loading has occured.
/// </summary>
/// <param name="ID"></param>
/// <param name="AfterLoad"></param>
void removeAfterLoadEvent(string ID, Action AfterLoad);
}
}
20 changes: 20 additions & 0 deletions MegaStorage/ItemPatcher.cs
Expand Up @@ -21,6 +21,7 @@ public ItemPatcher(IModHelper modHelper, IMonitor monitor)
public void Start()
{
_modHelper.Events.Player.InventoryChanged += OnInventoryChanged;
_modHelper.Events.World.ChestInventoryChanged += OnChestInventoryChanged;
_modHelper.Events.World.ObjectListChanged += OnObjectListChanged;
_modHelper.Events.GameLoop.SaveLoaded += OnSaveLoaded;
}
Expand Down Expand Up @@ -60,6 +61,25 @@ private void OnInventoryChanged(object sender, InventoryChangedEventArgs e)
Game1.player.Items[index] = addedItem.ToCustomChest();
}

private void OnChestInventoryChanged(object sender, ChestInventoryChangedEventArgs e)
{
_monitor.VerboseLog("OnChestInventoryChanged");
if (e.Added.Count() != 1)
return;

var addedItem = e.Added.Single();
if (addedItem is CustomChest)
return;

if (!CustomChestFactory.ShouldBeCustomChest(addedItem))
return;

_monitor.VerboseLog("OnChestInventoryChanged: converting");

var index = Game1.player.Items.IndexOf(addedItem);
Game1.player.Items[index] = addedItem.ToCustomChest();
}

private void OnObjectListChanged(object sender, ObjectListChangedEventArgs e)
{
_monitor.VerboseLog("OnObjectListChanged");
Expand Down
59 changes: 59 additions & 0 deletions MegaStorage/Mapping/AutomationFactory.cs
@@ -0,0 +1,59 @@
using System;
using MegaStorage.Models;
using Microsoft.Xna.Framework;
using Pathoschild.Stardew.Automate;
using StardewValley;
using StardewValley.Buildings;
using StardewValley.Locations;
using StardewValley.TerrainFeatures;
using SObject = StardewValley.Object;

namespace MegaStorage.Mapping
{
internal class AutomationFactory : IAutomationFactory
{
/// <summary>Get a machine, container, or connector instance for a given object.</summary>
/// <param name="obj">The in-game object.</param>
/// <param name="location">The location to check.</param>
/// <param name="tile">The tile position to check.</param>
/// <returns>Returns an instance or <c>null</c>.</returns>
public IAutomatable GetFor(SObject obj, GameLocation location, in Vector2 tile)
{
if (obj.ParentSheetIndex == ModConfig.Instance.LargeChest.Id ||
obj.ParentSheetIndex == ModConfig.Instance.MagicChest.Id)
return new CustomChestContainer(obj, location, tile);

return null;
}

/// <summary>Get a machine, container, or connector instance for a given terrain feature.</summary>
/// <param name="feature">The terrain feature.</param>
/// <param name="location">The location to check.</param>
/// <param name="tile">The tile position to check.</param>
/// <returns>Returns an instance or <c>null</c>.</returns>
public IAutomatable GetFor(TerrainFeature feature, GameLocation location, in Vector2 tile)
{
return null;
}

/// <summary>Get a machine, container, or connector instance for a given building.</summary>
/// <param name="building">The building.</param>
/// <param name="location">The location to check.</param>
/// <param name="tile">The tile position to check.</param>
/// <returns>Returns an instance or <c>null</c>.</returns>
public IAutomatable GetFor(Building building, BuildableGameLocation location, in Vector2 tile)
{
return null;
}

/// <summary>Get a machine, container, or connector instance for a given tile position.</summary>
/// <param name="location">The location to check.</param>
/// <param name="tile">The tile position to check.</param>
/// <returns>Returns an instance or <c>null</c>.</returns>
/// <remarks>Shipping bin logic from <see cref="Farm.leftClick"/>, garbage can logic from <see cref="Town.checkAction"/>.</remarks>
public IAutomatable GetForTile(GameLocation location, in Vector2 tile)
{
return null;
}
}
}
12 changes: 8 additions & 4 deletions MegaStorage/MegaStorage.csproj
Expand Up @@ -12,13 +12,17 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Pathoschild.Stardew.ModBuildConfig" Version="3.0.0" />
<PackageReference Include="Pathoschild.Stardew.ModBuildConfig" Version="3.1.0" />
</ItemGroup>

<ItemGroup>
<Reference Include="Automate">
<HintPath>G:\Steam\steamapps\common\Stardew Valley\Mods\Automate\Automate.dll</HintPath>
<Private>false</Private>
</Reference>
</ItemGroup>

<ItemGroup>
<None Update="config.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Sprites\AllTab.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
Expand Down
12 changes: 10 additions & 2 deletions MegaStorage/MegaStorageMod.cs
@@ -1,5 +1,7 @@
using MegaStorage.Models;
using MegaStorage.Mapping;
using MegaStorage.Models;
using MegaStorage.Persistence;
using Pathoschild.Stardew.Automate;
using StardewModdingAPI;
using StardewModdingAPI.Events;

Expand All @@ -19,6 +21,7 @@ public override void Entry(IModHelper modHelper)
private void OnGameLaunched(object sender, GameLaunchedEventArgs e)
{
var convenientChestsApi = Helper.ModRegistry.GetApi<IConvenientChestsApi>("aEnigma.ConvenientChests");
var automateApi = Helper.ModRegistry.GetApi<IAutomateAPI>("Pathoschild.Automate");

var spritePatcher = new SpritePatcher(Helper, Monitor);
var itemPatcher = new ItemPatcher(Helper, Monitor);
Expand All @@ -35,7 +38,12 @@ private void OnGameLaunched(object sender, GameLaunchedEventArgs e)
itemPatcher.Start();
saveManager.Start();
menuChanger.Start();

if (!(convenientChestsApi is null))
ModConfig.Instance.EnableCategories = false;

automateApi?.AddFactory(new AutomationFactory());
}

}
}
}
3 changes: 1 addition & 2 deletions MegaStorage/MenuChanger.cs
Expand Up @@ -32,6 +32,5 @@ private void OnMenuChanged(object sender, MenuChangedEventArgs e)
return;
Game1.activeClickableMenu = customChest.GetItemGrabMenu();
}

}
}
}