1
0

WakeUpSimulators correct Y computation

+ Add Y validity check to SimulatorManager
This commit is contained in:
Tiger Wang 2020-08-05 08:35:10 +01:00
parent c0d1cffe0b
commit d2156aab7c
2 changed files with 12 additions and 7 deletions

View File

@ -1187,14 +1187,14 @@ void cChunk::CreateBlockEntities(void)
auto BlockType = Section->m_BlockTypes[BlockIdx]; auto BlockType = Section->m_BlockTypes[BlockIdx];
if (cBlockEntity::IsBlockEntityBlockType(BlockType)) if (cBlockEntity::IsBlockEntityBlockType(BlockType))
{ {
auto relPos = IndexToCoordinate(BlockIdx); auto RelPos = IndexToCoordinate(BlockIdx);
relPos.y += static_cast<int>(SectionIdx * cChunkData::SectionHeight); RelPos.y += static_cast<int>(SectionIdx * cChunkData::SectionHeight);
auto absPos = RelativeToAbsolute(relPos); const auto AbsPos = RelativeToAbsolute(RelPos);
if (!HasBlockEntityAt(absPos)) if (!HasBlockEntityAt(AbsPos))
{ {
AddBlockEntityClean(cBlockEntity::CreateByBlockType( AddBlockEntityClean(cBlockEntity::CreateByBlockType(
BlockType, GetMeta(relPos), absPos, m_World BlockType, GetMeta(RelPos), AbsPos, m_World
)); ));
} }
} }
@ -1223,7 +1223,8 @@ void cChunk::WakeUpSimulators(void)
for (size_t BlockIdx = 0; BlockIdx != cChunkData::SectionBlockCount; ++BlockIdx) for (size_t BlockIdx = 0; BlockIdx != cChunkData::SectionBlockCount; ++BlockIdx)
{ {
const auto BlockType = Section->m_BlockTypes[BlockIdx]; const auto BlockType = Section->m_BlockTypes[BlockIdx];
const auto Position = IndexToCoordinate(BlockIdx); auto Position = IndexToCoordinate(BlockIdx);
Position.y += static_cast<int>(SectionIdx * cChunkData::SectionHeight);
RedstoneSimulator->AddBlock(*this, Position, BlockType); RedstoneSimulator->AddBlock(*this, Position, BlockType);
WaterSimulator->AddBlock(*this, Position, BlockType); WaterSimulator->AddBlock(*this, Position, BlockType);

View File

@ -71,8 +71,12 @@ void cSimulatorManager::WakeUp(cChunk & a_Chunk, Vector3i a_Position)
for (const auto Offset : cSimulator::AdjacentOffsets) for (const auto Offset : cSimulator::AdjacentOffsets)
{ {
auto Relative = a_Position + Offset; auto Relative = a_Position + Offset;
auto Chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(Relative); if (!cChunkDef::IsValidHeight(Relative.y))
{
continue;
}
auto Chunk = a_Chunk.GetRelNeighborChunkAdjustCoords(Relative);
if ((Chunk == nullptr) || !Chunk->IsValid()) if ((Chunk == nullptr) || !Chunk->IsValid())
{ {
continue; continue;