diff options
Diffstat (limited to 'src/Chunk.cpp')
-rw-r--r-- | src/Chunk.cpp | 42 |
1 files changed, 16 insertions, 26 deletions
diff --git a/src/Chunk.cpp b/src/Chunk.cpp index 7d5f54373..b6ec39294 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -411,7 +411,7 @@ void cChunk::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlock int OffZ = BlockStartZ - m_PosZ * cChunkDef::Width; int BaseX = BlockStartX - a_MinBlockX; int BaseZ = BlockStartZ - a_MinBlockZ; - int SizeY = a_Area.GetSizeY(); + int SizeY = std::min(a_Area.GetSizeY(), cChunkDef::Height - a_MinBlockY); // TODO: Improve this by not calling FastSetBlock() and doing the processing here // so that the heightmap is touched only once for each column. @@ -640,6 +640,7 @@ void cChunk::Tick(std::chrono::milliseconds a_Dt) else if ((*itr)->IsWorldTravellingFrom(m_World)) { // Remove all entities that are travelling to another world + LOGD("Removing entity from [%d, %d] that's travelling between worlds.", m_PosX, m_PosZ); MarkDirty(); (*itr)->SetWorldTravellingFrom(nullptr); itr = m_Entities.erase(itr); @@ -695,7 +696,6 @@ void cChunk::MoveEntityToNewChunk(cEntity * a_Entity) } ASSERT(Neighbor != this); // Moving into the same chunk? wtf? - Neighbor->AddEntity(a_Entity); class cMover : @@ -714,8 +714,8 @@ void cChunk::MoveEntityToNewChunk(cEntity * a_Entity) cEntity * m_Entity; public: - cMover(cEntity * a_Entity) : - m_Entity(a_Entity) + cMover(cEntity * a_CallbackEntity) : + m_Entity(a_CallbackEntity) {} } Mover(a_Entity); @@ -1018,20 +1018,26 @@ void cChunk::GrowMelonPumpkin(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_Bl // Check if there's soil under the neighbor. We already know the neighbors are valid. Place produce if ok BLOCKTYPE Soil; - UnboundedRelGetBlock(a_RelX + x, a_RelY - 1, a_RelZ + z, Soil, BlockMeta); + VERIFY(UnboundedRelGetBlock(a_RelX + x, a_RelY - 1, a_RelZ + z, Soil, BlockMeta)); switch (Soil) { case E_BLOCK_DIRT: case E_BLOCK_GRASS: case E_BLOCK_FARMLAND: { - // DEBUG: This is here to catch FS #349 - melons growing over other crops. - LOG("Growing melon / pumpkin overwriting %s, growing on %s", + // Place a randomly-facing produce: + NIBBLETYPE Meta = (ProduceType == E_BLOCK_MELON) ? 0 : static_cast<NIBBLETYPE>(a_TickRandom.randInt(4) % 4); + LOGD("Growing melon / pumpkin at {%d, %d, %d} (<%d, %d> from stem), overwriting %s, growing on top of %s, meta %d", + a_RelX + x + m_PosX * cChunkDef::Width, a_RelY, a_RelZ + z + m_PosZ * cChunkDef::Width, + x, z, ItemTypeToString(BlockType[CheckType]).c_str(), - ItemTypeToString(Soil).c_str() + ItemTypeToString(Soil).c_str(), + Meta ); - // Place a randomly-facing produce: - UnboundedRelFastSetBlock(a_RelX + x, a_RelY, a_RelZ + z, ProduceType, (NIBBLETYPE)(a_TickRandom.randInt(4) % 4)); + VERIFY(UnboundedRelFastSetBlock(a_RelX + x, a_RelY, a_RelZ + z, ProduceType, Meta)); + auto Absolute = RelativeToAbsolute(Vector3i{a_RelX + x, a_RelY, a_RelZ + z}, m_PosX, m_PosZ); + cChunkInterface ChunkInterface(this->GetWorld()->GetChunkMap()); + cBlockHandler::NeighborChanged(ChunkInterface, Absolute.x, Absolute.y - 1, Absolute.z, BLOCK_FACE_YP); break; } } @@ -2852,22 +2858,6 @@ void cChunk::BroadcastBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cons -void cChunk::BroadcastChunkData(cChunkDataSerializer & a_Serializer, const cClientHandle * a_Exclude) -{ - for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr) - { - if (*itr == a_Exclude) - { - continue; - } - (*itr)->SendChunkData(m_PosX, m_PosZ, a_Serializer); - } // for itr - LoadedByClient[] -} - - - - - void cChunk::BroadcastCollectEntity(const cEntity & a_Entity, const cPlayer & a_Player, const cClientHandle * a_Exclude) { for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr) |