97eda34a94
Furnaces now smelt the correct number of items. Furnaces store their contents in a cItemGrid. Furnace window is updated with correct items and progressbars. Furnace recipes now use ticks instead of milliseconds. Furnaces save and load their state completely, not missing a smelt operation. Hoppers take items out of furnaces. Dropped the cSlotAreaDropSpenser class, replaced it with generic cSlotAreaItemGrid git-svn-id: http://mc-server.googlecode.com/svn/trunk@1601 0a769ca7-a7f5-676a-18bf-c427514a06d6
157 lines
4.6 KiB
C++
157 lines
4.6 KiB
C++
|
|
#pragma once
|
|
|
|
#include "BlockEntityWithItems.h"
|
|
#include "../UI/WindowOwner.h"
|
|
#include "../FurnaceRecipe.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace Json
|
|
{
|
|
class Value;
|
|
}
|
|
|
|
class cClientHandle;
|
|
class cServer;
|
|
|
|
|
|
|
|
|
|
|
|
class cFurnaceEntity : // tolua_export
|
|
public cBlockEntityWindowOwner,
|
|
// tolua_begin
|
|
public cBlockEntityWithItems
|
|
{
|
|
typedef cBlockEntityWithItems super;
|
|
|
|
public:
|
|
enum
|
|
{
|
|
fsInput = 0, // Input slot number
|
|
fsFuel = 1, // Fuel slot number
|
|
fsOutput = 2, // Output slot number
|
|
|
|
ContentsWidth = 3,
|
|
ContentsHeight = 1,
|
|
};
|
|
|
|
/// Constructor used while generating a chunk; sets m_World to NULL
|
|
cFurnaceEntity(int a_BlockX, int a_BlockY, int a_BlockZ);
|
|
|
|
// tolua_end
|
|
|
|
/// Constructor used for normal operation
|
|
cFurnaceEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World);
|
|
|
|
virtual ~cFurnaceEntity();
|
|
|
|
static const char * GetClassStatic() { return "cFurnaceEntity"; }
|
|
|
|
bool LoadFromJson(const Json::Value & a_Value);
|
|
|
|
// cBlockEntity overrides:
|
|
virtual void SaveToJson(Json::Value & a_Value) override;
|
|
virtual void SendTo(cClientHandle & a_Client) override;
|
|
virtual bool Tick(float a_Dt, cChunk & a_Chunk) override;
|
|
virtual void UsedBy(cPlayer * a_Player) override;
|
|
|
|
/// Restarts cooking. Used after the furnace is loaded from storage to set up the internal variables so that cooking continues, if it was active. Returns true if cooking.
|
|
bool ContinueCooking(void);
|
|
|
|
void ResetCookTimer();
|
|
|
|
// tolua_begin
|
|
|
|
/// Returns the item in the input slot
|
|
const cItem & GetInputSlot(void) const { return GetSlot(fsInput); }
|
|
|
|
/// Returns the item in the fuel slot
|
|
const cItem & GetFuelSlot(void) const { return GetSlot(fsFuel); }
|
|
|
|
/// Returns the item in the output slot
|
|
const cItem & GetOutputSlot(void) const { return GetSlot(fsOutput); }
|
|
|
|
/// Sets the item in the input slot
|
|
void SetInputSlot(const cItem & a_Item) { SetSlot(fsInput, a_Item); }
|
|
|
|
/// Sets the item in the fuel slot
|
|
void SetFuelSlot(const cItem & a_Item) { SetSlot(fsFuel, a_Item); }
|
|
|
|
/// Sets the item in the output slot
|
|
void SetOutputSlot(const cItem & a_Item) { SetSlot(fsOutput, a_Item); }
|
|
|
|
/// Returns the time that the current item has been cooking, in ticks
|
|
int GetTimeCooked(void) const {return m_TimeCooked; }
|
|
|
|
/// Returns the time until the current item finishes cooking, in ticks
|
|
int GetCookTimeLeft(void) const { return m_NeedCookTime - m_TimeCooked; }
|
|
|
|
/// Returns the time until the current fuel is depleted, in ticks
|
|
int GetFuelBurnTimeLeft(void) const {return m_FuelBurnTime - m_TimeBurned; }
|
|
|
|
/// Returns true if there's time left before the current fuel is depleted
|
|
bool HasFuelTimeLeft(void) const { return (GetFuelBurnTimeLeft() > 0); }
|
|
|
|
// tolua_end
|
|
|
|
void SetBurnTimes(int a_FuelBurnTime, int a_TimeBurned) {m_FuelBurnTime = a_FuelBurnTime; m_TimeBurned = 0; }
|
|
void SetCookTimes(int a_NeedCookTime, int a_TimeCooked) {m_NeedCookTime = a_NeedCookTime; m_TimeCooked = a_TimeCooked; }
|
|
|
|
protected:
|
|
|
|
/// The recipe for the current input slot
|
|
const cFurnaceRecipe::Recipe * m_CurrentRecipe;
|
|
|
|
/// The item that is being smelted
|
|
cItem m_LastInput;
|
|
|
|
bool m_IsCooking; ///< Set to true if the furnace is cooking an item
|
|
|
|
// All timers are in ticks
|
|
int m_NeedCookTime; ///< Amount of time needed to fully cook current item
|
|
int m_TimeCooked; ///< Amount of time that the current item has been cooking
|
|
int m_FuelBurnTime; ///< Amount of time that the current fuel can burn (in total); zero if no fuel burning
|
|
int m_TimeBurned; ///< Amount of time that the current fuel has been burning
|
|
|
|
int m_LastProgressFuel; ///< Last value sent as the progress for the fuel
|
|
int m_LastProgressCook; ///< Last value sent as the progress for the cooking
|
|
|
|
void BroadcastProgress(int a_ProgressbarID, short a_Value);
|
|
|
|
/// One item finished cooking
|
|
void FinishOne(cChunk & a_Chunk);
|
|
|
|
/// Starts burning a new fuel, if possible
|
|
void BurnNewFuel(void);
|
|
|
|
/// Updates the recipe, based on the current input
|
|
void UpdateInput(void);
|
|
|
|
/// Called when the fuel slot changes or when the fuel is spent, burns another piece of fuel if appropriate
|
|
void UpdateFuel(void);
|
|
|
|
/// Called when the output slot changes
|
|
void UpdateOutput(void);
|
|
|
|
/// Updates the m_IsCooking, based on the input slot, output slot and m_FuelBurnTime / m_TimeBurned
|
|
void UpdateIsCooking(void);
|
|
|
|
/// Returns true if the input can be cooked into output and the item counts allow for another cooking operation
|
|
bool CanCookInputToOutput(void) const;
|
|
|
|
/// Broadcasts progressbar updates, if needed
|
|
void UpdateProgressBars(void);
|
|
|
|
// cItemGrid::cListener overrides:
|
|
virtual void OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum) override;
|
|
|
|
} ; // tolua_export
|
|
|
|
|
|
|
|
|