diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Chunk.cpp | 36 | ||||
-rw-r--r-- | src/Chunk.h | 2 | ||||
-rw-r--r-- | src/ChunkMap.cpp | 38 |
3 files changed, 22 insertions, 54 deletions
diff --git a/src/Chunk.cpp b/src/Chunk.cpp index ea9862c6a..497205667 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -1496,42 +1496,6 @@ void cChunk::SetAreaBiome(int a_MinRelX, int a_MaxRelX, int a_MinRelZ, int a_Max -void cChunk::CollectPickupsByPlayer(cPlayer & a_Player) -{ - auto BoundingBox = a_Player.GetBoundingBox(); - BoundingBox.Expand(1, 0.5, 1); - - for (auto & Entity : m_Entities) - { - if ((!Entity->IsPickup()) && (!Entity->IsProjectile())) - { - continue; // Only pickups and projectiles can be picked up - } - - if (BoundingBox.IsInside(Entity->GetPosition())) - { - /* - LOG("Pickup %d being collected by player \"%s\", distance %f", - (*itr)->GetUniqueID(), a_Player->GetName().c_str(), SqrDist - ); - */ - MarkDirty(); - if (Entity->IsPickup()) - { - static_cast<cPickup &>(*Entity).CollectedBy(a_Player); - } - else - { - static_cast<cProjectileEntity &>(*Entity).CollectedBy(a_Player); - } - } - } -} - - - - - bool cChunk::SetSignLines(int a_PosX, int a_PosY, int a_PosZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) { // Also sends update packets to all clients in the chunk diff --git a/src/Chunk.h b/src/Chunk.h index 47eb4628d..fa4e9ad19 100644 --- a/src/Chunk.h +++ b/src/Chunk.h @@ -218,8 +218,6 @@ public: Sends the chunk to all relevant clients. */ void SetAreaBiome(int a_MinRelX, int a_MaxRelX, int a_MinRelZ, int a_MaxRelZ, EMCSBiome a_Biome); - void CollectPickupsByPlayer(cPlayer & a_Player); - /** Sets the sign text. Returns true if successful. Also sends update packets to all clients in the chunk */ bool SetSignLines(int a_RelX, int a_RelY, int a_RelZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4); diff --git a/src/ChunkMap.cpp b/src/ChunkMap.cpp index d373e510b..b93327ddc 100644 --- a/src/ChunkMap.cpp +++ b/src/ChunkMap.cpp @@ -418,25 +418,31 @@ void cChunkMap::FastSetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLET void cChunkMap::CollectPickupsByPlayer(cPlayer & a_Player) { - int BlockX = static_cast<int>(a_Player.GetPosX()); // Truncating doesn't matter much; we're scanning entire chunks anyway - int BlockY = static_cast<int>(a_Player.GetPosY()); - int BlockZ = static_cast<int>(a_Player.GetPosZ()); - int ChunkX = 0, ChunkZ = 0; - cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); - int OtherChunkX = ChunkX + ((BlockX > 8) ? 1 : -1); - int OtherChunkZ = ChunkZ + ((BlockZ > 8) ? 1 : -1); + cCSLock Lock(m_CSChunks); - // We suppose that each player keeps their chunks in memory, therefore it makes little sense to try to re-load or even generate them. - // The only time the chunks are not valid is when the player is downloading the initial world and they should not call this at that moment + auto BoundingBox = a_Player.GetBoundingBox(); + BoundingBox.Expand(1, 0.5, 1); - cCSLock Lock(m_CSChunks); - GetChunkNoLoad(ChunkX, ChunkZ)->CollectPickupsByPlayer(a_Player); + ForEachEntityInBox(BoundingBox, [&a_Player](cEntity & Entity) + { + // Only pickups and projectiles can be picked up: + if (Entity.IsPickup()) + { + /* + LOG("Pickup %d being collected by player \"%s\", distance %f", + (*itr)->GetUniqueID(), a_Player->GetName().c_str(), SqrDist + ); + */ + static_cast<cPickup &>(Entity).CollectedBy(a_Player); + } + else if (Entity.IsProjectile()) + { + static_cast<cProjectileEntity &>(Entity).CollectedBy(a_Player); + } - // Check the neighboring chunks as well: - GetChunkNoLoad(OtherChunkX, ChunkZ)->CollectPickupsByPlayer (a_Player); - GetChunkNoLoad(OtherChunkX, OtherChunkZ)->CollectPickupsByPlayer(a_Player); - GetChunkNoLoad(ChunkX, ChunkZ)->CollectPickupsByPlayer (a_Player); - GetChunkNoLoad(ChunkX, OtherChunkZ)->CollectPickupsByPlayer(a_Player); + // The entities will MarkDirty when they Destroy themselves + return false; + }); } |