summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/DropSpenserEntity.cpp16
-rw-r--r--source/DropSpenserEntity.h7
-rw-r--r--source/Simulator/RedstoneSimulator.cpp24
3 files changed, 33 insertions, 14 deletions
diff --git a/source/DropSpenserEntity.cpp b/source/DropSpenserEntity.cpp
index 3830e1d01..85eaa8297 100644
--- a/source/DropSpenserEntity.cpp
+++ b/source/DropSpenserEntity.cpp
@@ -14,7 +14,8 @@
cDropSpenserEntity::cDropSpenserEntity(BLOCKTYPE a_BlockType, int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World) :
super(a_BlockType, a_BlockX, a_BlockY, a_BlockZ, ContentsWidth, ContentsHeight, a_World),
- m_ShouldDropSpense(false)
+ m_ShouldDropSpense(false),
+ m_IsPowered(false)
{
SetBlockEntity(this); // cBlockEntityWindowOwner
}
@@ -120,6 +121,19 @@ void cDropSpenserEntity::Activate(void)
+void cDropSpenserEntity::SetRedstonePower(bool a_IsPowered)
+{
+ if (a_IsPowered && !m_IsPowered)
+ {
+ Activate();
+ }
+ m_IsPowered = a_IsPowered;
+}
+
+
+
+
+
bool cDropSpenserEntity::Tick(float a_Dt)
{
if (!m_ShouldDropSpense)
diff --git a/source/DropSpenserEntity.h b/source/DropSpenserEntity.h
index f4221808c..d58f74f04 100644
--- a/source/DropSpenserEntity.h
+++ b/source/DropSpenserEntity.h
@@ -65,11 +65,16 @@ public:
/// Sets the dropspenser to dropspense an item in the next tick
void Activate(void);
+ /// Sets the internal redstone power flag to "on" or "off", depending on the parameter. Calls Activate() if appropriate
+ void SetRedstonePower(bool a_IsPowered);
+
// tolua_end
protected:
bool m_ShouldDropSpense; ///< If true, the dropspenser will dropspense an item in the next tick
-
+ bool m_IsPowered; ///< Set to true when the dropspenser receives redstone power.
+
+ /// Does the actual work on dropspensing an item. Chooses the slot, calls DropSpenseFromSlot() and handles smoke / sound effects
void DropSpense(void);
/// Override this function to provide the specific behavior for item dropspensing (drop / shoot / pour / ...)
diff --git a/source/Simulator/RedstoneSimulator.cpp b/source/Simulator/RedstoneSimulator.cpp
index 03ad43ace..5db40192f 100644
--- a/source/Simulator/RedstoneSimulator.cpp
+++ b/source/Simulator/RedstoneSimulator.cpp
@@ -433,20 +433,20 @@ void cRedstoneSimulator::HandleChange(const Vector3i & a_BlockPos)
BLOCKTYPE BlockType = m_World.GetBlock(pos);
if ((BlockType == E_BLOCK_DISPENSER) || (BlockType == E_BLOCK_DROPPER))
{
- if (IsPowered(pos))
+ class cSetPowerToDropSpenser :
+ public cDropSpenserCallback
{
- class cActivateDropSpenser :
- public cDropSpenserCallback
+ bool m_IsPowered;
+ public:
+ cSetPowerToDropSpenser(bool a_IsPowered) : m_IsPowered(a_IsPowered) {}
+
+ virtual bool Item(cDropSpenserEntity * a_DropSpenser) override
{
- virtual bool Item(cDropSpenserEntity * a_DropSpenser) override
- {
- a_DropSpenser->Activate();
- return false;
- }
- } ;
- cActivateDropSpenser DrSpAct;
- m_World.DoWithDropSpenserAt(pos.x, pos.y, pos.z, DrSpAct);
- }
+ a_DropSpenser->Activate();
+ return false;
+ }
+ } DrSpSP(IsPowered(pos));
+ m_World.DoWithDropSpenserAt(pos.x, pos.y, pos.z, DrSpSP);
}
}
}