DropSpensers: Fixed activation when receiving redstone signal. Now only one item is dropspensed.

Fix for FS #378, http://www.mc-server.org/support/index.php?do=details&task_id=378

git-svn-id: http://mc-server.googlecode.com/svn/trunk@1521 0a769ca7-a7f5-676a-18bf-c427514a06d6
master
madmaxoft@gmail.com 2013-05-27 17:28:42 +00:00
parent edbc2790e3
commit 9b8dff31e6
3 changed files with 33 additions and 14 deletions

View File

@ -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)

View File

@ -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 / ...)

View File

@ -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);
}
}
}