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-c427514a06d6master
parent
edbc2790e3
commit
9b8dff31e6
|
@ -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)
|
||||
|
|
|
@ -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 / ...)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue