Added in crafting menu for machines. For some reason though custom obbjects are broken in crafting menus.

This commit is contained in:
JoshuaNavarro 2019-09-11 18:04:12 -07:00
parent 1a63bcc34d
commit a2b66afb65
13 changed files with 328 additions and 60 deletions

View File

@ -6,6 +6,7 @@ using System.Text;
using System.Threading.Tasks;
using Microsoft.Xna.Framework;
using Revitalize.Framework.Menus;
using Revitalize.Framework.Objects.Machines;
using Revitalize.Framework.Utilities;
using StardewValley;
using StardustCore.Animations;
@ -164,6 +165,60 @@ namespace Revitalize.Framework.Crafting
if (Game1.activeClickableMenu == null) Game1.activeClickableMenu = menu;
}
public CraftingMenuV1 getCraftingMenuForMachine(int x, int y, int width, int height,ref IList<Item> Items,ref IList<Item> Output,Machine Machine)
{
CraftingMenuV1 menu = new Framework.Menus.CraftingMenuV1(x, y, width, height, Color.White, ref Items,ref Output,Machine);
//menu.addInCraftingPageTab("Default", new AnimatedButton(new StardustCore.Animations.AnimatedSprite("Default Tab", new Vector2(100 + 48, 100 + (24 * 4)), new AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Menus", "MenuTabHorizontal"), new Animation(0, 0, 24, 24)), Color.White), new Rectangle(0, 0, 24, 24), 2f));
foreach (KeyValuePair<string, AnimatedButton> pair in this.craftingMenuTabs)
{
menu.addInCraftingPageTab(pair.Key, pair.Value);
}
foreach (KeyValuePair<string, UnlockableCraftingRecipe> pair in this.craftingRecipes)
{
if (pair.Value.hasUnlocked)
{
menu.addInCraftingRecipe(new Framework.Menus.MenuComponents.CraftingRecipeButton(pair.Value.recipe, null, new Vector2(), new Rectangle(0, 0, 16, 16), 4f, true, Color.White), pair.Value.whichTab);
ModCore.log("Add in a crafting recipe to the menu!");
}
else
{
ModCore.log("Recipe is locked!");
}
}
menu.currentTab = this.defaultTab;
menu.sortRecipes();
return menu;
}
public void openCraftingMenu(int x, int y, int width, int height, ref IList<Item> items)
{
CraftingMenuV1 menu = new Framework.Menus.CraftingMenuV1(x, y, width, height, Color.White, items);
//menu.addInCraftingPageTab("Default", new AnimatedButton(new StardustCore.Animations.AnimatedSprite("Default Tab", new Vector2(100 + 48, 100 + (24 * 4)), new AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Menus", "MenuTabHorizontal"), new Animation(0, 0, 24, 24)), Color.White), new Rectangle(0, 0, 24, 24), 2f));
foreach (KeyValuePair<string, AnimatedButton> pair in this.craftingMenuTabs)
{
menu.addInCraftingPageTab(pair.Key, pair.Value);
}
foreach (KeyValuePair<string, UnlockableCraftingRecipe> pair in this.craftingRecipes)
{
if (pair.Value.hasUnlocked)
{
menu.addInCraftingRecipe(new Framework.Menus.MenuComponents.CraftingRecipeButton(pair.Value.recipe, null, new Vector2(), new Rectangle(0, 0, 16, 16), 4f, true, Color.White), pair.Value.whichTab);
ModCore.log("Add in a crafting recipe to the menu!");
}
else
{
ModCore.log("Recipe is locked!");
}
}
menu.currentTab = this.defaultTab;
menu.sortRecipes();
if (Game1.activeClickableMenu == null) Game1.activeClickableMenu = menu;
}
#region
//~~~~~~~~~~~~~~~~~~~~//
// Static Functions //

View File

@ -44,12 +44,17 @@ namespace Revitalize.Framework.Crafting
/// </summary>
public StatCost statCost;
/// <summary>
/// The number of in-game minutes it takes to craft this item.
/// </summary>
public int timeToCraft;
public Recipe() { }
/// <summary>Constructor for single item output.</summary>
/// <param name="inputs">All the ingredients required to make the output.</param>
/// <param name="output">The item given as output with how many</param>
public Recipe(List<CraftingRecipeComponent> inputs, CraftingRecipeComponent output, StatCost StatCost = null)
public Recipe(List<CraftingRecipeComponent> inputs, CraftingRecipeComponent output, StatCost StatCost = null,int TimeToCraft=0)
{
this.ingredients = inputs;
this.DisplayItem = output.item;
@ -60,9 +65,10 @@ namespace Revitalize.Framework.Crafting
output
};
this.statCost = StatCost ?? new StatCost();
this.timeToCraft = TimeToCraft;
}
public Recipe(List<CraftingRecipeComponent> inputs, List<CraftingRecipeComponent> outputs, string OutputName, string OutputDescription, Item DisplayItem = null, StatCost StatCost = null)
public Recipe(List<CraftingRecipeComponent> inputs, List<CraftingRecipeComponent> outputs, string OutputName, string OutputDescription, Item DisplayItem = null, StatCost StatCost = null,int TimeToCraft=0)
{
this.ingredients = inputs;
this.outputs = outputs;
@ -70,6 +76,7 @@ namespace Revitalize.Framework.Crafting
this.outputDescription = OutputDescription;
this.DisplayItem = DisplayItem;
this.statCost = StatCost ?? new StatCost();
this.timeToCraft = TimeToCraft;
}
/// <summary>Checks if a player contains all recipe ingredients.</summary>

View File

@ -1,13 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Revitalize.Framework.Crafting
{
public class RecipeBook
{
}
}

View File

@ -8,6 +8,7 @@ using Microsoft.Xna.Framework.Graphics;
using Revitalize.Framework.Crafting;
using Revitalize.Framework.Menus.MenuComponents;
using Revitalize.Framework.Objects;
using Revitalize.Framework.Objects.Machines;
using Revitalize.Framework.Utilities;
using StardewValley;
using StardustCore.UIUtilities;
@ -28,6 +29,7 @@ namespace Revitalize.Framework.Menus
public Vector2 itemDisplayLocation;
public IList<Item> inventory;
public IList<Item> outputInventory;
private Dictionary<ItemDisplayButton,int> requiredItems;
@ -35,6 +37,10 @@ namespace Revitalize.Framework.Menus
public bool isPlayerInventory;
private Machine machine;
string hoverText;
public Item actualItem
{
get
@ -63,6 +69,31 @@ namespace Revitalize.Framework.Menus
this.requiredItems.Add(b, this.infoButton.recipe.ingredients.ElementAt(i).requiredAmount);
}
this.craftingButton = new AnimatedButton(new StardustCore.Animations.AnimatedSprite("CraftingButton", new Vector2(this.xPositionOnScreen + this.width / 2-96, this.getCraftingButtonHeight()),new StardustCore.Animations.AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "CraftingMenu", "CraftButton"),new StardustCore.Animations.Animation(0,0,48,16)), Color.White),new Rectangle(0,0,48,16),4f);
this.outputInventory = this.inventory;
}
public CraftingInformationPage(int x, int y, int width, int height, Color BackgroundColor, CraftingRecipeButton ItemToDisplay, ref IList<Item> Inventory,ref IList<Item> OutputInventory ,bool IsPlayerInventory, Machine Machine) : base(x, y, width, height, false)
{
this.backgroundColor = BackgroundColor;
this.infoButton = ItemToDisplay;
this.itemDisplayLocation = new Vector2(this.xPositionOnScreen + (this.width / 2) - 32, this.yPositionOnScreen + (128));
this.inventory = Inventory;
this.isPlayerInventory = IsPlayerInventory;
this.requiredItems = new Dictionary<ItemDisplayButton, int>();
for (int i = 0; i < this.infoButton.recipe.ingredients.Count; i++)
{
ItemDisplayButton b = new ItemDisplayButton(this.infoButton.recipe.ingredients.ElementAt(i).item, null, new Vector2(this.xPositionOnScreen + 64, this.getIngredientHeightOffset().Y), new Rectangle(0, 0, 64, 64), 2f, true, Color.White);
this.requiredItems.Add(b, this.infoButton.recipe.ingredients.ElementAt(i).requiredAmount);
}
this.craftingButton = new AnimatedButton(new StardustCore.Animations.AnimatedSprite("CraftingButton", new Vector2(this.xPositionOnScreen + this.width / 2 - 96, this.getCraftingButtonHeight()), new StardustCore.Animations.AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "CraftingMenu", "CraftButton"), new StardustCore.Animations.Animation(0, 0, 48, 16)), Color.White), new Rectangle(0, 0, 48, 16), 4f);
if (OutputInventory == null)
{
this.outputInventory = this.inventory;
}
this.outputInventory = OutputInventory;
this.machine = Machine;
}
public override void receiveLeftClick(int x, int y, bool playSound = true)
@ -72,7 +103,19 @@ namespace Revitalize.Framework.Menus
if (this.canCraftRecipe())
{
Game1.soundBank.PlayCue("coin");
this.infoButton.craftItem();
this.infoButton.craftItem(this.inventory, this.outputInventory);
if (this.machine != null)
{
if (this.infoButton.recipe.timeToCraft == 0)
{
this.machine.InventoryManager.dumpBufferToItems();
}
else
{
this.machine.MinutesUntilReady = this.infoButton.recipe.timeToCraft;
}
}
if (this.isPlayerInventory)
{
@ -82,6 +125,41 @@ namespace Revitalize.Framework.Menus
}
}
public override void performHoverAction(int x, int y)
{
bool hovered = false;
if (this.craftingButton.containsPoint(x, y))
{
if (this.infoButton.recipe.CanCraft(this.inventory) == false)
{
this.hoverText = "Not enough items.";
hovered = true;
}
if (this.machine != null)
{
if (this.machine.MinutesUntilReady > 0)
{
this.hoverText = "Crafting in progress...";
hovered = true;
}
if (this.machine.MinutesUntilReady == 0 && this.machine.InventoryManager.hasItemsInBuffer)
{
this.hoverText = "Items in buffer. Please make room in the inventory for: " + System.Environment.NewLine + this.machine.InventoryManager + " items.";
hovered = true;
}
if (this.machine.InventoryManager.IsFull)
{
this.hoverText = "Inventory is full!";
hovered = true;
}
}
}
if (hovered == false)
{
this.hoverText = "";
}
}
public override void draw(SpriteBatch b)
{
this.drawDialogueBoxBackground(this.xPositionOnScreen, this.yPositionOnScreen, this.width, this.height, this.backgroundColor);
@ -110,7 +188,16 @@ namespace Revitalize.Framework.Menus
public bool canCraftRecipe()
{
return this.infoButton.recipe.CanCraft(this.inventory);
bool canCraft = true;
if (this.infoButton.recipe.CanCraft(this.inventory) == false) canCraft = false;
if (this.machine != null)
{
if (this.machine.InventoryManager.hasItemsInBuffer) canCraft = false;
if (this.machine.InventoryManager.IsFull) canCraft = false;
}
return canCraft;
}
/// <summary>

View File

@ -7,6 +7,7 @@ using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Revitalize.Framework.Menus.MenuComponents;
using Revitalize.Framework.Objects.Machines;
using StardewValley;
using StardewValley.Menus;
using StardustCore.UIUtilities;
@ -90,6 +91,8 @@ namespace Revitalize.Framework.Menus
/// </summary>
public StardewValley.Menus.TextBox searchBox;
private Machine machine;
/// <summary>
/// The maximum amount of pages to display.
/// </summary>
@ -167,7 +170,7 @@ namespace Revitalize.Framework.Menus
/// <param name="BackgroundColor"></param>
/// <param name="FromInventory"></param>
/// <param name="ToInventory"></param>
public CraftingMenuV1(int X, int Y, int Width, int Height, Color BackgroundColor, ref IList<Item> FromInventory, ref IList<Item> ToInventory) : base(X, Y, Width, Height, false)
public CraftingMenuV1(int X, int Y, int Width, int Height, Color BackgroundColor, ref IList<Item> FromInventory, ref IList<Item> ToInventory,Machine Machine) : base(X, Y, Width, Height, false)
{
this.backgroundColor = BackgroundColor;
this.CraftingTabs = new Dictionary<string, AnimatedButton>();
@ -176,6 +179,8 @@ namespace Revitalize.Framework.Menus
this.fromInventory = FromInventory;
this.toInventory = ToInventory;
this.initializeButtons();
this.machine = Machine;
this.playerInventory = false;
}
/// <summary>
@ -386,17 +391,19 @@ namespace Revitalize.Framework.Menus
this.fromInventory = Game1.player.Items;
}
this.craftingInfo = new CraftingInformationPage(this.xPositionOnScreen + this.width + this.xOffset, this.yPositionOnScreen, 400, this.height, this.backgroundColor, button, ref this.fromInventory, this.playerInventory);
this.craftingInfo = new CraftingInformationPage(this.xPositionOnScreen + this.width + this.xOffset, this.yPositionOnScreen, 400, this.height, this.backgroundColor, button, ref this.fromInventory,ref this.toInventory,this.playerInventory,this.machine);
Game1.soundBank.PlayCue("coin");
if (this.playerInventory)
{
Game1.player.Items = this.toInventory;
return;
}
//ModCore.log("Button has been clicked!");
return;
}
}
}
//ModCore.log("Menu has been clicked");
if (this.craftingInfo != null)
{
@ -420,7 +427,7 @@ namespace Revitalize.Framework.Menus
this.leftButton.draw(b);
//Draw page numbers here.
//b.DrawString(Game1.smallFont,"Page: "+this.currentPageIndex.ToString()/)
b.DrawString(Game1.dialogueFont, ("Page: " + (this.currentPageIndex + 1) + " / " + (this.maxPages + 1)).ToString(), new Vector2(this.xPositionOnScreen + 128, this.yPositionOnScreen), Color.White);
b.DrawString(Game1.dialogueFont, ("Page: " + (this.currentPageIndex + 1) + " / " + (this.maxPages + 1)).ToString(), new Vector2(this.xPositionOnScreen + 128, this.yPositionOnScreen+32), Color.White);
this.rightButton.draw(b);
this.searchBox.Draw(b, true);

View File

@ -19,6 +19,7 @@ namespace Revitalize.Framework.Menus.Machines
public string currentTab;
public string hoverText;
public IClickableMenuExtended CurrentMenu
{
get

View File

@ -14,6 +14,12 @@ using StardustCore.UIUtilities.MenuComponents.ComponentsV2.Buttons;
namespace Revitalize.Framework.Menus.Machines
{
/// <summary>
/// TODO:
/// Add in minutes remaining display
/// Add in remaining inventory space display.
/// Make crafting menu require the object passed in to count down before crafting the recipe.
/// </summary>
public class MachineSummaryMenu : IClickableMenuExtended
{
@ -45,12 +51,24 @@ namespace Revitalize.Framework.Menus.Machines
}
}
/// <summary>
/// Should this menu draw the battery for the energy guage?
/// </summary>
private bool shouldDrawBattery
{
get
{
return this.energy.maxEnergy != 0 || ModCore.Configs.machinesConfig.doMachinesConsumeEnergy==false;
}
}
public MachineSummaryMenu()
{
}
public MachineSummaryMenu(int x, int y, int width, int height, Color BackgroundColor, CustomObject SourceObject):base(x,y,width,height,false)
public MachineSummaryMenu(int x, int y, int width, int height, Color BackgroundColor, CustomObject SourceObject) : base(x, y, width, height, false)
{
this.objectSource = SourceObject;
@ -58,8 +76,8 @@ namespace Revitalize.Framework.Menus.Machines
this.energyTexture = new Texture2D(Game1.graphics.GraphicsDevice, 1, 1);
this.colorSwap();
this.energyPosition = new Vector2(this.xPositionOnScreen + this.width - 128, this.yPositionOnScreen + this.height - 72*4);
this.batteryBackground =new AnimatedButton(new StardustCore.Animations.AnimatedSprite("BatteryFrame", this.energyPosition, new StardustCore.Animations.AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Menus.EnergyMenu", "BatteryFrame"), new StardustCore.Animations.Animation(0, 0, 32, 64)),Color.White),new Rectangle(0,0,32,64),4f);
this.energyPosition = new Vector2(this.xPositionOnScreen + this.width - 128, this.yPositionOnScreen + this.height - 72 * 4);
this.batteryBackground = new AnimatedButton(new StardustCore.Animations.AnimatedSprite("BatteryFrame", this.energyPosition, new StardustCore.Animations.AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Menus.EnergyMenu", "BatteryFrame"), new StardustCore.Animations.Animation(0, 0, 32, 64)), Color.White), new Rectangle(0, 0, 32, 64), 4f);
this.battergyEnergyGuage = new AnimatedButton(new StardustCore.Animations.AnimatedSprite("BatteryEnergyGuage", this.energyPosition, new StardustCore.Animations.AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Menus.EnergyMenu", "BatteryEnergyGuage"), new StardustCore.Animations.Animation(0, 0, 32, 64)), Color.White), new Rectangle(0, 0, 32, 64), 4f);
this.itemDisplayOffset = ObjectUtilities.GetDimensionOffsetFromItem(this.objectSource);
@ -68,9 +86,9 @@ namespace Revitalize.Framework.Menus.Machines
public override void performHoverAction(int x, int y)
{
bool hovered = false;
if (this.batteryBackground.containsPoint(x, y))
if (this.batteryBackground.containsPoint(x, y) && this.shouldDrawBattery)
{
this.hoverText ="Energy: "+this.energy.energyDisplayString;
this.hoverText = "Energy: " + this.energy.energyDisplayString;
hovered = true;
}
@ -90,16 +108,21 @@ namespace Revitalize.Framework.Menus.Machines
{
this.drawDialogueBoxBackground(this.xPositionOnScreen, this.yPositionOnScreen, this.width, this.height, this.backgroundColor);
this.batteryBackground.draw(b, 1f, 1f);
this.colorSwap();
b.Draw(this.energyTexture, new Rectangle((int)this.energyPosition.X+(int)(11*this.batteryBackground.scale), (int)this.energyPosition.Y+(int)(18*this.batteryBackground.scale), (int)(9*this.batteryBackground.scale), (int)(46*this.batteryBackground.scale)), new Rectangle(0, 0, 1, 1), Color.White, 0f, Vector2.Zero, SpriteEffects.None, 0.2f);
this.battergyEnergyGuage.draw(b, 1f, 1f);
//Draw the energy on the screen.
if (this.shouldDrawBattery)
{
this.batteryBackground.draw(b, 1f, 1f);
this.colorSwap();
b.Draw(this.energyTexture, new Rectangle((int)this.energyPosition.X + (int)(11 * this.batteryBackground.scale), (int)this.energyPosition.Y + (int)(18 * this.batteryBackground.scale), (int)(9 * this.batteryBackground.scale), (int)(46 * this.batteryBackground.scale)), new Rectangle(0, 0, 1, 1), Color.White, 0f, Vector2.Zero, SpriteEffects.None, 0.2f);
this.battergyEnergyGuage.draw(b, 1f, 1f);
}
this.objectSource.drawFullyInMenu(b,new Vector2((int)(this.xPositionOnScreen+ (this.width / 2) - (this.itemDisplayOffset.X / 2)),(int)(this.yPositionOnScreen+128f)),.24f);
this.objectSource.drawFullyInMenu(b, new Vector2((int)(this.xPositionOnScreen + (this.width / 2) - (this.itemDisplayOffset.X / 2)), (int)(this.yPositionOnScreen + 128f)), .24f);
Vector2 nameOffset = Game1.dialogueFont.MeasureString(this.objectSource.DisplayName);
b.DrawString(Game1.dialogueFont, this.objectSource.DisplayName, new Vector2(this.xPositionOnScreen + (this.width / 2)-nameOffset.X/2, (this.yPositionOnScreen + 150f)) + new Vector2(0,ObjectUtilities.GetHeightOffsetFromItem(this.objectSource)), Color.Black);
b.DrawString(Game1.dialogueFont, this.objectSource.DisplayName, new Vector2(this.xPositionOnScreen + (this.width / 2) - nameOffset.X / 2, (this.yPositionOnScreen + 150f)) + new Vector2(0, ObjectUtilities.GetHeightOffsetFromItem(this.objectSource)), Color.Black);
if (string.IsNullOrEmpty(this.hoverText) == false)
{
@ -109,7 +132,7 @@ namespace Revitalize.Framework.Menus.Machines
this.drawMouse(b);
}
/// <summary>
/// Swaps the color for the energy bar meter depending on how much energy is left.
@ -127,7 +150,7 @@ namespace Revitalize.Framework.Menus.Machines
{
col = Color.GreenYellow;
}
else if(this.energy.energyPercentRemaining>.25d && this.energy.energyPercentRemaining <= .5d)
else if (this.energy.energyPercentRemaining > .25d && this.energy.energyPercentRemaining <= .5d)
{
col = Color.Yellow;
}

View File

@ -7,9 +7,15 @@ using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Newtonsoft.Json;
using PyTK.CustomElementHandler;
using Revitalize.Framework.Crafting;
using Revitalize.Framework.Menus;
using Revitalize.Framework.Menus.Machines;
using Revitalize.Framework.Objects.InformationFiles;
using Revitalize.Framework.Utilities;
using StardewValley;
using StardustCore.Animations;
using StardustCore.UIUtilities;
using StardustCore.UIUtilities.MenuComponents.ComponentsV2.Buttons;
namespace Revitalize.Framework.Objects.Machines
{
@ -31,7 +37,7 @@ namespace Revitalize.Framework.Objects.Machines
string timeToProduce = this.timeToProduce.ToString();
string updatesContainer = this.updatesContainerObjectForProduction.ToString();
return info + "<" + guidStr + "<" + pyTkData + "<" + offsetKey + "<" + container+"<"+resources+"<"+energyRequired+"<"+timeToProduce+"<"+updatesContainer;
return info + "<" + guidStr + "<" + pyTkData + "<" + offsetKey + "<" + container+"<"+resources+"<"+energyRequired+"<"+timeToProduce+"<"+updatesContainer+"<"+this.craftingRecipeBook;
}
set
{
@ -46,6 +52,7 @@ namespace Revitalize.Framework.Objects.Machines
string energyRequired = data[6];
string time = data[7];
string updates = data[8];
this.craftingRecipeBook = data[9];
this.info = (BasicItemInformation)Revitalize.ModCore.Serializer.DeserializeFromJSONString(infoString, typeof(BasicItemInformation));
this.data = Revitalize.ModCore.Serializer.DeserializeFromJSONString<CustomObjectData>(pyTKData);
this.energyRequiredPer10Minutes = Convert.ToInt32(energyRequired);
@ -114,6 +121,8 @@ namespace Revitalize.Framework.Objects.Machines
public int timeToProduce;
public bool updatesContainerObjectForProduction;
public string craftingRecipeBook;
[JsonIgnore]
public bool ProducesItems
{
@ -137,15 +146,16 @@ namespace Revitalize.Framework.Objects.Machines
public Machine() { }
public Machine(CustomObjectData PyTKData, BasicItemInformation info,List<ResourceInformation> ProducedResources=null, int EnergyRequiredPer10Minutes = 0,int TimeToProduce=0,bool UpdatesContainer=false) : base(PyTKData, info) {
public Machine(CustomObjectData PyTKData, BasicItemInformation info,List<ResourceInformation> ProducedResources=null, int EnergyRequiredPer10Minutes = 0,int TimeToProduce=0,bool UpdatesContainer=false, string CraftingBook = "") : base(PyTKData, info) {
this.producedResources = ProducedResources?? new List<ResourceInformation>();
this.energyRequiredPer10Minutes = EnergyRequiredPer10Minutes;
this.timeToProduce = TimeToProduce;
this.updatesContainerObjectForProduction = UpdatesContainer;
this.MinutesUntilReady = TimeToProduce;
this.craftingRecipeBook = CraftingBook;
}
public Machine(CustomObjectData PyTKData, BasicItemInformation info, Vector2 TileLocation, List<ResourceInformation> ProducedResources=null,int EnergyRequiredPer10Minutes=0,int TimeToProduce=0,bool UpdatesContainer=false,MultiTiledObject obj=null) : base(PyTKData, info, TileLocation)
public Machine(CustomObjectData PyTKData, BasicItemInformation info, Vector2 TileLocation, List<ResourceInformation> ProducedResources=null,int EnergyRequiredPer10Minutes=0,int TimeToProduce=0,bool UpdatesContainer=false, string CraftingBook = "", MultiTiledObject obj=null) : base(PyTKData, info, TileLocation)
{
this.containerObject = obj;
this.producedResources = ProducedResources ?? new List<ResourceInformation>();
@ -153,9 +163,10 @@ namespace Revitalize.Framework.Objects.Machines
this.timeToProduce = TimeToProduce;
this.updatesContainerObjectForProduction = UpdatesContainer;
this.MinutesUntilReady = TimeToProduce;
this.craftingRecipeBook = CraftingBook;
}
public Machine(CustomObjectData PyTKData, BasicItemInformation info, Vector2 TileLocation, Vector2 offsetKey,List<ResourceInformation> ProducedResources=null, int EnergyRequiredPer10Minutes = 0, int TimeToProduce=0,bool UpdatesContainer=false,MultiTiledObject obj = null) : base(PyTKData, info, TileLocation)
public Machine(CustomObjectData PyTKData, BasicItemInformation info, Vector2 TileLocation, Vector2 offsetKey,List<ResourceInformation> ProducedResources=null, int EnergyRequiredPer10Minutes = 0, int TimeToProduce=0,bool UpdatesContainer=false, string CraftingBook = "", MultiTiledObject obj = null) : base(PyTKData, info, TileLocation)
{
this.offsetKey = offsetKey;
this.containerObject = obj;
@ -163,6 +174,7 @@ namespace Revitalize.Framework.Objects.Machines
this.timeToProduce = TimeToProduce;
this.updatesContainerObjectForProduction = UpdatesContainer;
this.MinutesUntilReady = TimeToProduce;
this.craftingRecipeBook = CraftingBook;
}
public override void updateWhenCurrentLocation(GameTime time, GameLocation environment)
@ -185,7 +197,6 @@ namespace Revitalize.Framework.Objects.Machines
energySources = this.EnergyGraphSearchSources(); //Only grab the network once.
}
if (this.ProducesItems)
{
//ModCore.log("This produces items!");
@ -219,6 +230,17 @@ namespace Revitalize.Framework.Objects.Machines
this.produceEnergy();
}
}
if (this.MinutesUntilReady>0)
{
this.MinutesUntilReady = Math.Max(0, this.MinutesUntilReady - minutes);
if(this.InventoryManager.hasItemsInBuffer && this.MinutesUntilReady == 0)
{
this.InventoryManager.dumpBufferToItems();
}
}
return false;
}
else
@ -235,18 +257,40 @@ namespace Revitalize.Framework.Objects.Machines
if (this.location == null)
this.location = Game1.player.currentLocation;
if (Game1.menuUp || Game1.currentMinigame != null) return false;
if (this.containerObject.info.inventory != null && Game1.activeClickableMenu == null)
{
Game1.activeClickableMenu = new Revitalize.Framework.Menus.InventoryTransferMenu(100, 100, 500, 500, this.containerObject.info.inventory.items, this.containerObject.info.inventory.capacity);
}
//ModCore.playerInfo.sittingInfo.sit(this, Vector2.Zero);
//ModCore.playerInfo.sittingInfo.sit(this, Vector2.Zero);
this.createMachineMenu();
return true;
}
/// <summary>
/// Creates the necessary components to display the machine menu properly.
/// </summary>
protected virtual void createMachineMenu()
{
MachineMenu machineMenu = new MachineMenu((Game1.viewport.Width / 2) - 400, 0, 800, 600);
MachineSummaryMenu m = new Framework.Menus.Machines.MachineSummaryMenu((Game1.viewport.Width / 2) - 400, 48, 800, 600, Color.White, this.containerObject);
machineMenu.addInMenuTab("Summary", new AnimatedButton(new StardustCore.Animations.AnimatedSprite("SummaryTab", new Vector2(), new AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Menus", "MenuTab"), new Animation(0, 0, 24, 24)), Color.White), new Rectangle(0, 0, 24, 24), 2f), m, true);
if (this.InventoryManager.capacity > 0)
{
InventoryTransferMenu transferMenu = new InventoryTransferMenu(100, 150, 500, 600, this.InventoryManager.items, 36);
machineMenu.addInMenuTab("Inventory", new AnimatedButton(new StardustCore.Animations.AnimatedSprite("Inventory Tab", new Vector2(), new AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Menus", "MenuTab"), new Animation(0, 0, 24, 24)), Color.White), new Rectangle(0, 0, 24, 24), 2f), transferMenu, false);
}
if (string.IsNullOrEmpty(this.craftingRecipeBook)==false)
{
CraftingMenuV1 craftingMenu = CraftingRecipeBook.CraftingRecipesByGroup[this.craftingRecipeBook].getCraftingMenuForMachine(100, 100, 400, 700, ref this.InventoryManager.items,ref this.InventoryManager.bufferItems,this);
machineMenu.addInMenuTab("Crafting", new AnimatedButton(new StardustCore.Animations.AnimatedSprite("Crafting Tab", new Vector2(), new AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Menus", "MenuTab"), new Animation(0, 0, 24, 24)), Color.White), new Rectangle(0, 0, 24, 24), 2f), craftingMenu, false);
}
if (Game1.activeClickableMenu == null) Game1.activeClickableMenu = machineMenu;
}
public override Item getOne()
{
Machine component = new Machine(this.data, this.info.Copy(), this.TileLocation, this.offsetKey, this.producedResources,this.energyRequiredPer10Minutes,this.timeToProduce,this.updatesContainerObjectForProduction,this.containerObject);
Machine component = new Machine(this.data, this.info.Copy(), this.TileLocation, this.offsetKey, this.producedResources,this.energyRequiredPer10Minutes,this.timeToProduce,this.updatesContainerObjectForProduction,this.craftingRecipeBook,this.containerObject);
return component;
}

View File

@ -154,24 +154,24 @@ namespace Revitalize.Framework.Objects
MultiTiledObject sandBox = new MultiTiledObject(PyTKHelper.CreateOBJData("Omegasis.Revitalize.Objects.Machines.Sandbox", TextureManager.GetTexture(ModCore.Manifest, "Machines", "Sandbox"), typeof(MultiTiledObject), Color.White, true), new BasicItemInformation("Sandbox", "Omegasis.Revitalize.Objects.Machines.Sandbox", "A sandbox which slowly produces sand. Unfortunately you can't sit in this one.", "Machine", Color.SteelBlue, -300, 0, false, 750, true, true, TextureManager.GetTexture(ModCore.Manifest, "Machines", "Sandbox"), new AnimationManager(), Color.White, true, new InventoryManager(36), null, null));
Machine sandBox_0_0 = new Machine(PyTKHelper.CreateOBJData("Omegasis.Revitalize.Objects.Machines.Sandbox", TextureManager.GetTexture(ModCore.Manifest, "Machines", "Sandbox"), typeof(Machine), Color.White, true), new BasicItemInformation("Sandbox", "Omegasis.Revitalize.Objects.Machines.Sandbox", "A sandbox which slowly produces sand. Unfortunately you can't sit in this one.", "Machine", Color.SteelBlue, -300, 0, false, 750, true, true, TextureManager.GetTexture(ModCore.Manifest, "Machines", "Sandbox"), new AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Machines", "Sandbox"),new Animation(0,0,16,16)), Color.White, false, new InventoryManager(36), null, null), new List<InformationFiles.ResourceInformation>()
{
new InformationFiles.ResourceInformation(this.resources.getResource("Sand",1),1,1,1,1,1,1,0,0,0,0)
//new InformationFiles.ResourceInformation(this.resources.getResource("Sand",1),1,1,1,1,1,1,0,0,0,0)
}, 0, TimeUtilities.GetMinutesFromTime(0, 1, 0), true);
}, 0, TimeUtilities.GetMinutesFromTime(0, 1, 0), true,"Workbench");
Machine sandBox_1_0 = new Machine(PyTKHelper.CreateOBJData("Omegasis.Revitalize.Objects.Machines.Sandbox", TextureManager.GetTexture(ModCore.Manifest, "Machines", "Sandbox"), typeof(Machine), Color.White, true), new BasicItemInformation("Sandbox", "Omegasis.Revitalize.Objects.Machines.Sandbox", "A sandbox which slowly produces sand. Unfortunately you can't sit in this one.", "Machine", Color.SteelBlue, -300, 0, false, 750, true, true, TextureManager.GetTexture(ModCore.Manifest, "Machines", "Sandbox"), new AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Machines", "Sandbox"), new Animation(16, 0, 16, 16)), Color.White, false, new InventoryManager(36), null, null), new List<InformationFiles.ResourceInformation>()
{
new InformationFiles.ResourceInformation(this.resources.getResource("Sand",1),1,1,1,1,1,1,0,0,0,0)
//new InformationFiles.ResourceInformation(this.resources.getResource("Sand",1),1,1,1,1,1,1,0,0,0,0)
}, 0, TimeUtilities.GetMinutesFromTime(0, 1, 0), false);
}, 0, TimeUtilities.GetMinutesFromTime(0, 1, 0), false, "Workbench");
Machine sandBox_0_1 = new Machine(PyTKHelper.CreateOBJData("Omegasis.Revitalize.Objects.Machines.Sandbox", TextureManager.GetTexture(ModCore.Manifest, "Machines", "Sandbox"), typeof(Machine), Color.White, true), new BasicItemInformation("Sandbox", "Omegasis.Revitalize.Objects.Machines.Sandbox", "A sandbox which slowly produces sand. Unfortunately you can't sit in this one.", "Machine", Color.SteelBlue, -300, 0, false, 750, true, true, TextureManager.GetTexture(ModCore.Manifest, "Machines", "Sandbox"), new AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Machines", "Sandbox"), new Animation(0, 16, 16, 16)), Color.White, false, new InventoryManager(36), null, null), new List<InformationFiles.ResourceInformation>()
{
new InformationFiles.ResourceInformation(this.resources.getResource("Sand",1),1,1,1,1,1,1,0,0,0,0)
//new InformationFiles.ResourceInformation(this.resources.getResource("Sand",1),1,1,1,1,1,1,0,0,0,0)
}, 0, TimeUtilities.GetMinutesFromTime(0,1,0), false);
}, 0, TimeUtilities.GetMinutesFromTime(0,1,0), false, "Workbench");
Machine sandBox_1_1 = new Machine(PyTKHelper.CreateOBJData("Omegasis.Revitalize.Objects.Machines.Sandbox", TextureManager.GetTexture(ModCore.Manifest, "Machines", "Sandbox"), typeof(Machine), Color.White, true), new BasicItemInformation("Sandbox", "Omegasis.Revitalize.Objects.Machines.Sandbox", "A sandbox which slowly produces sand. Unfortunately you can't sit in this one.", "Machine", Color.SteelBlue, -300, 0, false, 750, true, true, TextureManager.GetTexture(ModCore.Manifest, "Machines", "Sandbox"), new AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Machines", "Sandbox"), new Animation(16, 16, 16, 16)), Color.White, false, new InventoryManager(36), null, null), new List<InformationFiles.ResourceInformation>()
{
new InformationFiles.ResourceInformation(this.resources.getResource("Sand",1),1,1,1,1,1,1,0,0,0,0)
//new InformationFiles.ResourceInformation(this.resources.getResource("Sand",1),1,1,1,1,1,1,0,0,0,0)
}, 0, TimeUtilities.GetMinutesFromTime(0, 1, 0), false);
}, 0, TimeUtilities.GetMinutesFromTime(0, 1, 0), false, "Workbench");
sandBox.addComponent(new Vector2(0,0),sandBox_0_0);
sandBox.addComponent(new Vector2(1, 0), sandBox_1_0);

View File

@ -20,12 +20,26 @@ namespace Revitalize.Framework.Utilities
/// <summary>The actual contents of the inventory.</summary>
public IList<Item> items;
/// <summary>
/// Items that are to be buffered into the inventory manager if possible.
/// </summary>
public IList<Item> bufferItems;
/// <summary>Checks if the inventory is full or not.</summary>
public bool IsFull => this.ItemCount >= this.capacity && this.items.Where(i=>i==null).Count()==0;
/// <summary>Checks to see if this core object actually has a valid inventory.</summary>
public bool HasInventory => this.capacity > 0;
[JsonIgnore]
public bool hasItemsInBuffer
{
get
{
return this.bufferItems.Count > 0;
}
}
[JsonIgnore]
public bool requiresUpdate;
public InventoryManager()
@ -33,6 +47,7 @@ namespace Revitalize.Framework.Utilities
this.capacity = 0;
this.setMaxLimit(0);
this.items = new List<Item>();
this.bufferItems = new List<Item>();
}
/// <summary>Construct an instance.</summary>
@ -41,6 +56,7 @@ namespace Revitalize.Framework.Utilities
this.capacity = int.MaxValue;
this.setMaxLimit(int.MaxValue);
this.items = items;
this.bufferItems = new List<Item>();
}
public InventoryManager(IList<Item> items)
@ -48,6 +64,7 @@ namespace Revitalize.Framework.Utilities
this.capacity = int.MaxValue;
this.setMaxLimit(int.MaxValue);
this.items = items;
this.bufferItems = new List<Item>();
}
/// <summary>Construct an instance.</summary>
@ -56,6 +73,7 @@ namespace Revitalize.Framework.Utilities
this.capacity = capacity;
this.MaxCapacity = int.MaxValue;
this.items = new List<Item>();
this.bufferItems = new List<Item>();
}
/// <summary>Construct an instance.</summary>
@ -64,6 +82,7 @@ namespace Revitalize.Framework.Utilities
this.capacity = capacity;
this.setMaxLimit(MaxCapacity);
this.items = new List<Item>();
this.bufferItems = new List<Item>();
}
/// <summary>Add the item to the inventory.</summary>
@ -75,15 +94,23 @@ namespace Revitalize.Framework.Utilities
}
else
{
foreach (Item self in this.items)
for(int i = 0; i < this.items.Count; i++)
{
Item self = this.items[i];
if (self != null && self.canStackWith(item))
{
self.addToStack(item.Stack);
this.requiresUpdate = true;
return true;
}
if (self == null)
{
self = item;
this.requiresUpdate=true;
return true;
}
}
this.requiresUpdate = true;
this.items.Add(item);
return true;
@ -156,5 +183,14 @@ namespace Revitalize.Framework.Utilities
{
return new InventoryManager(this.capacity, this.MaxCapacity);
}
public void dumpBufferToItems()
{
foreach(Item I in this.bufferItems)
{
this.addItem(I);
}
this.bufferItems.Clear();
}
}
}

View File

@ -254,7 +254,6 @@ namespace Revitalize
//Loads in objects to be use by the mod.
ObjectGroups = new Dictionary<string, MultiTiledObject>();
ObjectManager = new ObjectManager(Manifest);
ObjectManager.loadInItems();
ObjectsToDraw = new Dictionary<GameLocation, MultiTiledObject>();
//Adds in event handling for the mod.
@ -278,9 +277,7 @@ namespace Revitalize
ModHelper.Events.Multiplayer.ModMessageReceived += MultiplayerUtilities.GetModMessage;
ModHelper.Events.Input.ButtonPressed += ObjectInteractionHacks.ResetNormalToolsColorOnLeftClick;
//Adds in recipes to the mod.
VanillaRecipeBook = new VanillaRecipeBook();
CraftingRecipeBook.CraftingRecipesByGroup = new Dictionary<string, CraftingRecipeBook>();
ModHelper.Events.Display.MenuChanged += MenuHacks.RecreateFarmhandInventory;
@ -339,9 +336,12 @@ namespace Revitalize
MachineSummaryMenu m= new Framework.Menus.Machines.MachineSummaryMenu((Game1.viewport.Width/2)-400, 48, 800, 600,Color.White,test);
InventoryTransferMenu transferMenu = new InventoryTransferMenu(100, 150, 500, 600, test.info.inventory.items, 36);
MachineMenu machineMenu = new MachineMenu((Game1.viewport.Width / 2) - 400, 0, 800, 600);
CraftingMenuV1 craftingMenu= new Framework.Menus.CraftingMenuV1(100, 100, 400, 700, Color.White, Game1.player.Items);
machineMenu.addInMenuTab("Summary",new AnimatedButton(new StardustCore.Animations.AnimatedSprite("SummaryTab",new Vector2(),new AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest,"Menus","MenuTab"),new Animation(0,0,24,24)),Color.White),new Rectangle(0,0,24,24),2f),m,true);
machineMenu.addInMenuTab("Inventory", new AnimatedButton(new StardustCore.Animations.AnimatedSprite("Inventory Tab", new Vector2(), new AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Menus", "MenuTab"), new Animation(0, 0, 24, 24)), Color.White), new Rectangle(0, 0, 24, 24), 2f), transferMenu, true);
machineMenu.addInMenuTab("Crafting", new AnimatedButton(new StardustCore.Animations.AnimatedSprite("Crafting Tab", new Vector2(), new AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "Menus", "MenuTab"), new Animation(0, 0, 24, 24)), Color.White), new Rectangle(0, 0, 24, 24), 2f), craftingMenu, true);
if (Game1.activeClickableMenu == null) Game1.activeClickableMenu = machineMenu;
}
@ -537,6 +537,11 @@ namespace Revitalize
private void GameLoop_SaveLoaded(object sender, StardewModdingAPI.Events.SaveLoadedEventArgs e)
{
this.loadContent();
ObjectManager.loadInItems();
//Adds in recipes to the mod.
VanillaRecipeBook = new VanillaRecipeBook();
CraftingRecipeBook.CraftingRecipesByGroup = new Dictionary<string, CraftingRecipeBook>();
Serializer.afterLoad();
ShopHacks.AddInCustomItemsToShops();
ObjectInteractionHacks.AfterLoad_RestoreTrackedMachines();
@ -555,7 +560,8 @@ namespace Revitalize
new StardewValley.Object((int)Enums.SDVObject.Wood,100),
ModCore.ObjectManager.GetItem("SteelIngot", 20),
ModCore.ObjectManager.GetItem("TrashCan",1),
ModCore.ObjectManager.GetItem("SandBox",1)
ModCore.ObjectManager.GetItem("SandBox",1),
ModCore.ObjectManager.GetItem("Anvil",1)
});
}

View File

@ -62,7 +62,6 @@
<Compile Include="Framework\Crafting\CraftingRecipeComponent.cs" />
<Compile Include="Framework\Crafting\MachineCraftingRecipe.cs" />
<Compile Include="Framework\Crafting\Recipe.cs" />
<Compile Include="Framework\Crafting\RecipeBook.cs" />
<Compile Include="Framework\Crafting\StatCost.cs" />
<Compile Include="Framework\Crafting\UnlockableCraftingRecipe.cs" />
<Compile Include="Framework\Crafting\VanillaRecipeBook.cs" />

View File

@ -122,6 +122,10 @@ namespace StardustCore.UIUtilities.MenuComponents.ComponentsV2.Buttons
public void draw(SpriteBatch b,float Depth, float Alpha,bool DrawShadow)
{
if(this.background!=null)this.background.draw(b, this.scale, Depth,Alpha);
if (this.item == null)
{
ModCore.log("ITEM IS NULL!!!!");
}
if(this.item!=null)this.item.drawInMenu(b, this.position, 1f,Alpha,Depth,this.drawStackNumber,this.drawColor,DrawShadow);
}
@ -137,12 +141,20 @@ namespace StardustCore.UIUtilities.MenuComponents.ComponentsV2.Buttons
{
if (this.background != null) this.background.draw(b,Position,this.scale, Depth, Alpha);
if (this.item != null) this.item.drawInMenu(b, Position, 1f, Alpha, Depth, this.drawStackNumber, this.drawColor, DrawShadow);
if (this.item == null)
{
ModCore.log("ITEM IS NULL!!!!");
}
}
public void draw(SpriteBatch b,float ItemScale ,float Depth, float Alpha, bool DrawShadow)
{
this.background.draw(b, this.scale, Depth, Alpha);
if (this.item != null) this.item.drawInMenu(b, this.position, ItemScale, Alpha, Depth, this.drawStackNumber, this.drawColor, DrawShadow);
if (this.item == null)
{
ModCore.log("ITEM IS NULL!!!!");
}
}
/// <summary>
@ -155,6 +167,10 @@ namespace StardustCore.UIUtilities.MenuComponents.ComponentsV2.Buttons
/// <param name="DrawShadow">Should the shadow be drawn for the item?</param>
public void drawJustItem(SpriteBatch b,float Scale,float Depth, float Alpha, bool DrawShadow)
{
if (this.item == null)
{
ModCore.log("ITEM IS NULL!!!!");
}
if (this.item != null) this.item.drawInMenu(b, this.position, Scale, Alpha, Depth, this.drawStackNumber, this.drawColor, DrawShadow);
}