summaryrefslogtreecommitdiffstats
path: root/src/ChunkMap.cpp
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@outlook.com>2020-08-28 22:35:38 +0200
committerTiger Wang <ziwei.tiger@outlook.com>2020-08-28 22:35:38 +0200
commit071aee6c79534ad7181a7dd72db11041268b0de1 (patch)
treee9f01ccf56e5a242cf70faba99ebebd537bb9ee6 /src/ChunkMap.cpp
parentChunk: Make StayCount/AlwaysTicked unsigned (diff)
downloadcuberite-071aee6c79534ad7181a7dd72db11041268b0de1.tar
cuberite-071aee6c79534ad7181a7dd72db11041268b0de1.tar.gz
cuberite-071aee6c79534ad7181a7dd72db11041268b0de1.tar.bz2
cuberite-071aee6c79534ad7181a7dd72db11041268b0de1.tar.lz
cuberite-071aee6c79534ad7181a7dd72db11041268b0de1.tar.xz
cuberite-071aee6c79534ad7181a7dd72db11041268b0de1.tar.zst
cuberite-071aee6c79534ad7181a7dd72db11041268b0de1.zip
Diffstat (limited to 'src/ChunkMap.cpp')
-rw-r--r--src/ChunkMap.cpp38
1 files changed, 22 insertions, 16 deletions
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;
+ });
}