1
0
Fork 0

Call BlockEntityWithItems from ChestEntity slot changed handler

* Small degree of unification for what to do with the current entity
* Make sure to do necessary actions for both sides of a double chest
This commit is contained in:
Tiger Wang 2020-07-26 00:02:07 +01:00
parent 6d650d5f3c
commit b30d70f09d
2 changed files with 53 additions and 37 deletions

View File

@ -41,19 +41,27 @@ void cBlockEntityWithItems::OnSlotChanged(cItemGrid * a_Grid, int a_SlotNum)
{
UNUSED(a_SlotNum);
ASSERT(a_Grid == &m_Contents);
if (m_World != nullptr)
{
if (GetWindow() != nullptr)
{
GetWindow()->BroadcastWholeWindow();
}
m_World->MarkChunkDirty(GetChunkX(), GetChunkZ());
m_World->DoWithChunkAt(m_Pos, [&](cChunk & a_Chunk)
{
m_World->GetRedstoneSimulator()->WakeUp(m_Pos, &a_Chunk);
return true;
}
);
if (m_World == nullptr)
{
return;
}
if (GetWindow() != nullptr)
{
GetWindow()->BroadcastWholeWindow();
}
m_World->MarkChunkDirty(GetChunkX(), GetChunkZ());
m_World->DoWithChunkAt(m_Pos, [&](cChunk & a_Chunk)
{
auto & Simulator = *m_World->GetRedstoneSimulator();
// Notify comparators:
Simulator.WakeUp(m_Pos + Vector3i(1, 0, 0), &a_Chunk);
Simulator.WakeUp(m_Pos + Vector3i(-1, 0, 0), &a_Chunk);
Simulator.WakeUp(m_Pos + Vector3i(0, 0, 1), &a_Chunk);
Simulator.WakeUp(m_Pos + Vector3i(0, 0, -1), &a_Chunk);
return true;
});
}

View File

@ -76,33 +76,41 @@ private:
/** cItemGrid::cListener overrides: */
virtual void OnSlotChanged(cItemGrid * a_Grid, int a_SlotNum) override
{
UNUSED(a_SlotNum);
ASSERT(a_Grid == &m_Contents);
if (m_World != nullptr)
if (m_World == nullptr)
{
cWindow * Window = GetWindow();
if (
(Window == nullptr) &&
(m_Neighbour != nullptr)
)
{
// Neighbour might own the window
Window = m_Neighbour->GetWindow();
}
if (Window != nullptr)
{
Window->BroadcastWholeWindow();
}
m_World->MarkChunkDirty(GetChunkX(), GetChunkZ());
m_World->DoWithChunkAt(m_Pos, [&](cChunk & a_Chunk)
{
m_World->GetRedstoneSimulator()->WakeUp(m_Pos, &a_Chunk);
return true;
}
);
return;
}
// Have cBlockEntityWithItems update redstone and try to broadcast our window:
Super::OnSlotChanged(a_Grid, a_SlotNum);
cWindow * Window = GetWindow();
if ((Window == nullptr) && (m_Neighbour != nullptr))
{
// Window was null, Super will have failed.
// Neighbour might own the window:
Window = m_Neighbour->GetWindow();
}
if (Window != nullptr)
{
Window->BroadcastWholeWindow();
}
m_World->MarkChunkDirty(GetChunkX(), GetChunkZ());
m_World->DoWithChunkAt(m_Pos, [&](cChunk & a_Chunk)
{
auto & Simulator = *m_World->GetRedstoneSimulator();
// Notify comparators:
Simulator.WakeUp(m_Pos + Vector3i(1, 0, 0), &a_Chunk);
Simulator.WakeUp(m_Pos + Vector3i(-1, 0, 0), &a_Chunk);
Simulator.WakeUp(m_Pos + Vector3i(0, 0, 1), &a_Chunk);
Simulator.WakeUp(m_Pos + Vector3i(0, 0, -1), &a_Chunk);
return true;
});
}
} ; // tolua_export