1
0
Fork 0

unique_ptr<cChunkMap> to plain member

This commit is contained in:
Tiger Wang 2020-12-21 14:31:44 +00:00
parent 9518a27357
commit f3ec768dfb
6 changed files with 144 additions and 166 deletions

View File

@ -270,7 +270,7 @@ void cChunk::MarkLoadFailed(void)
void cChunk::GetAllData(cChunkDataCallback & a_Callback) void cChunk::GetAllData(cChunkDataCallback & a_Callback) const
{ {
ASSERT(m_Presence == cpPresent); ASSERT(m_Presence == cpPresent);
@ -2027,7 +2027,7 @@ void cChunk::GetBlockTypeMeta(Vector3i a_RelPos, BLOCKTYPE & a_BlockType, NIBBLE
void cChunk::GetBlockInfo(Vector3i a_RelPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) void cChunk::GetBlockInfo(Vector3i a_RelPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) const
{ {
a_BlockType = GetBlock(a_RelPos); a_BlockType = GetBlock(a_RelPos);
a_Meta = m_ChunkData.GetMeta(a_RelPos); a_Meta = m_ChunkData.GetMeta(a_RelPos);

View File

@ -111,7 +111,7 @@ public:
void MarkLoadFailed(void); void MarkLoadFailed(void);
/** Gets all chunk data, calls the a_Callback's methods for each data type */ /** Gets all chunk data, calls the a_Callback's methods for each data type */
void GetAllData(cChunkDataCallback & a_Callback); void GetAllData(cChunkDataCallback & a_Callback) const;
/** Sets all chunk data as either loaded from the storage or generated. /** Sets all chunk data as either loaded from the storage or generated.
BlockLight and BlockSkyLight are optional, if not present, chunk will be marked as unlighted. BlockLight and BlockSkyLight are optional, if not present, chunk will be marked as unlighted.
@ -172,11 +172,7 @@ public:
GetBlockTypeMeta({ a_RelX, a_RelY, a_RelZ }, a_BlockType, a_BlockMeta); GetBlockTypeMeta({ a_RelX, a_RelY, a_RelZ }, a_BlockType, a_BlockMeta);
} }
void GetBlockInfo(Vector3i a_RelPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight); void GetBlockInfo(Vector3i a_RelPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) const;
void GetBlockInfo(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight)
{
GetBlockInfo({ a_RelX, a_RelY, a_RelZ }, a_BlockType, a_Meta, a_SkyLight, a_BlockLight);
}
/** Convert absolute coordinates into relative coordinates. /** Convert absolute coordinates into relative coordinates.
Returns false on failure to obtain a valid chunk. Returns true otherwise. Returns false on failure to obtain a valid chunk. Returns true otherwise.

View File

@ -101,6 +101,18 @@ cChunk * cChunkMap::FindChunk(int a_ChunkX, int a_ChunkZ)
const cChunk * cChunkMap::FindChunk(int a_ChunkX, int a_ChunkZ) const
{
ASSERT(m_CSChunks.IsLockedByCurrentThread());
const auto Chunk = m_Chunks.find({ a_ChunkX, a_ChunkZ });
return (Chunk == m_Chunks.end()) ? nullptr : &Chunk->second;
}
void cChunkMap::SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client) void cChunkMap::SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client)
{ {
cCSLock Lock(m_CSChunks); cCSLock Lock(m_CSChunks);
@ -285,7 +297,7 @@ void cChunkMap::ChunkLighted(
bool cChunkMap::GetChunkData(cChunkCoords a_Coords, cChunkDataCallback & a_Callback) bool cChunkMap::GetChunkData(cChunkCoords a_Coords, cChunkDataCallback & a_Callback) const
{ {
if (!a_Callback.Coords(a_Coords.m_ChunkX, a_Coords.m_ChunkZ)) if (!a_Callback.Coords(a_Coords.m_ChunkX, a_Coords.m_ChunkZ))
{ {
@ -323,7 +335,7 @@ bool cChunkMap::GetChunkBlockTypes(int a_ChunkX, int a_ChunkZ, BLOCKTYPE * a_Blo
bool cChunkMap::IsChunkQueued(int a_ChunkX, int a_ChunkZ) bool cChunkMap::IsChunkQueued(int a_ChunkX, int a_ChunkZ) const
{ {
cCSLock Lock(m_CSChunks); cCSLock Lock(m_CSChunks);
const auto Chunk = FindChunk(a_ChunkX, a_ChunkZ); const auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);
@ -334,7 +346,7 @@ bool cChunkMap::IsChunkQueued(int a_ChunkX, int a_ChunkZ)
bool cChunkMap::IsChunkValid(int a_ChunkX, int a_ChunkZ) bool cChunkMap::IsChunkValid(int a_ChunkX, int a_ChunkZ) const
{ {
cCSLock Lock(m_CSChunks); cCSLock Lock(m_CSChunks);
const auto Chunk = FindChunk(a_ChunkX, a_ChunkZ); const auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);
@ -345,7 +357,7 @@ bool cChunkMap::IsChunkValid(int a_ChunkX, int a_ChunkZ)
bool cChunkMap::HasChunkAnyClients(int a_ChunkX, int a_ChunkZ) bool cChunkMap::HasChunkAnyClients(int a_ChunkX, int a_ChunkZ) const
{ {
cCSLock Lock(m_CSChunks); cCSLock Lock(m_CSChunks);
const auto Chunk = FindChunk(a_ChunkX, a_ChunkZ); const auto Chunk = FindChunk(a_ChunkX, a_ChunkZ);
@ -448,7 +460,7 @@ void cChunkMap::CollectPickupsByPlayer(cPlayer & a_Player)
BLOCKTYPE cChunkMap::GetBlock(Vector3i a_BlockPos) BLOCKTYPE cChunkMap::GetBlock(Vector3i a_BlockPos) const
{ {
auto chunkPos = cChunkDef::BlockToChunk(a_BlockPos); auto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);
auto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos); auto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);
@ -467,7 +479,7 @@ BLOCKTYPE cChunkMap::GetBlock(Vector3i a_BlockPos)
NIBBLETYPE cChunkMap::GetBlockMeta(Vector3i a_BlockPos) NIBBLETYPE cChunkMap::GetBlockMeta(Vector3i a_BlockPos) const
{ {
auto chunkPos = cChunkDef::BlockToChunk(a_BlockPos); auto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);
auto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos); auto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);
@ -486,7 +498,7 @@ NIBBLETYPE cChunkMap::GetBlockMeta(Vector3i a_BlockPos)
NIBBLETYPE cChunkMap::GetBlockSkyLight(Vector3i a_BlockPos) NIBBLETYPE cChunkMap::GetBlockSkyLight(Vector3i a_BlockPos) const
{ {
auto chunkPos = cChunkDef::BlockToChunk(a_BlockPos); auto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);
auto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos); auto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);
@ -505,7 +517,7 @@ NIBBLETYPE cChunkMap::GetBlockSkyLight(Vector3i a_BlockPos)
NIBBLETYPE cChunkMap::GetBlockBlockLight(Vector3i a_BlockPos) NIBBLETYPE cChunkMap::GetBlockBlockLight(Vector3i a_BlockPos) const
{ {
auto chunkPos = cChunkDef::BlockToChunk(a_BlockPos); auto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);
auto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos); auto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);
@ -559,7 +571,7 @@ void cChunkMap::SetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE
bool cChunkMap::GetBlockTypeMeta(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) bool cChunkMap::GetBlockTypeMeta(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const
{ {
auto chunkCoord = cChunkDef::BlockToChunk(a_BlockPos); auto chunkCoord = cChunkDef::BlockToChunk(a_BlockPos);
auto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkCoord); auto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkCoord);
@ -578,7 +590,7 @@ bool cChunkMap::GetBlockTypeMeta(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, N
bool cChunkMap::GetBlockInfo(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) bool cChunkMap::GetBlockInfo(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) const
{ {
auto chunkPos = cChunkDef::BlockToChunk(a_BlockPos); auto chunkPos = cChunkDef::BlockToChunk(a_BlockPos);
auto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos); auto relPos = cChunkDef::AbsoluteToRelative(a_BlockPos, chunkPos);
@ -633,7 +645,7 @@ void cChunkMap::ReplaceTreeBlocks(const sSetBlockVector & a_Blocks)
EMCSBiome cChunkMap::GetBiomeAt (int a_BlockX, int a_BlockZ) EMCSBiome cChunkMap::GetBiomeAt(int a_BlockX, int a_BlockZ) const
{ {
int ChunkX, ChunkZ, X = a_BlockX, Y = 0, Z = a_BlockZ; int ChunkX, ChunkZ, X = a_BlockX, Y = 0, Z = a_BlockZ;
cChunkDef::AbsoluteToRelative(X, Y, Z, ChunkX, ChunkZ); cChunkDef::AbsoluteToRelative(X, Y, Z, ChunkX, ChunkZ);

View File

@ -112,16 +112,16 @@ public:
/** Calls the callback with the chunk's data, if available (with ChunkCS locked). /** Calls the callback with the chunk's data, if available (with ChunkCS locked).
Returns true if the chunk was reported successfully, false if not (chunk not present or callback failed). */ Returns true if the chunk was reported successfully, false if not (chunk not present or callback failed). */
bool GetChunkData(cChunkCoords a_Coords, cChunkDataCallback & a_Callback); bool GetChunkData(cChunkCoords a_Coords, cChunkDataCallback & a_Callback) const;
/** Copies the chunk's blocktypes into a_Blocks; returns true if successful */ /** Copies the chunk's blocktypes into a_Blocks; returns true if successful */
bool GetChunkBlockTypes (int a_ChunkX, int a_ChunkZ, BLOCKTYPE * a_Blocks); bool GetChunkBlockTypes (int a_ChunkX, int a_ChunkZ, BLOCKTYPE * a_Blocks);
/** Returns true iff the chunk is in the loader / generator queue. */ /** Returns true iff the chunk is in the loader / generator queue. */
bool IsChunkQueued(int a_ChunkX, int a_ChunkZ); bool IsChunkQueued(int a_ChunkX, int a_ChunkZ) const;
bool IsChunkValid (int a_ChunkX, int a_ChunkZ); bool IsChunkValid (int a_ChunkX, int a_ChunkZ) const;
bool HasChunkAnyClients (int a_ChunkX, int a_ChunkZ); bool HasChunkAnyClients (int a_ChunkX, int a_ChunkZ) const;
int GetHeight (int a_BlockX, int a_BlockZ); // Waits for the chunk to get loaded / generated int GetHeight (int a_BlockX, int a_BlockZ); // Waits for the chunk to get loaded / generated
bool TryGetHeight (int a_BlockX, int a_BlockZ, int & a_Height); // Returns false if chunk not loaded / generated bool TryGetHeight (int a_BlockX, int a_BlockZ, int & a_Height); // Returns false if chunk not loaded / generated
@ -134,24 +134,24 @@ public:
/** Makes the specified player collect all the pickups around them. */ /** Makes the specified player collect all the pickups around them. */
void CollectPickupsByPlayer(cPlayer & a_Player); void CollectPickupsByPlayer(cPlayer & a_Player);
BLOCKTYPE GetBlock (Vector3i a_BlockPos); BLOCKTYPE GetBlock (Vector3i a_BlockPos) const;
NIBBLETYPE GetBlockMeta (Vector3i a_BlockPos); NIBBLETYPE GetBlockMeta (Vector3i a_BlockPos) const;
NIBBLETYPE GetBlockSkyLight (Vector3i a_BlockPos); NIBBLETYPE GetBlockSkyLight (Vector3i a_BlockPos) const;
NIBBLETYPE GetBlockBlockLight(Vector3i a_BlockPos); NIBBLETYPE GetBlockBlockLight(Vector3i a_BlockPos) const;
/** Sets the meta for the specified block, while keeping the blocktype. /** Sets the meta for the specified block, while keeping the blocktype.
Ignored if the chunk is invalid. */ Ignored if the chunk is invalid. */
void SetBlockMeta(Vector3i a_BlockPos, NIBBLETYPE a_BlockMeta); void SetBlockMeta(Vector3i a_BlockPos, NIBBLETYPE a_BlockMeta);
void SetBlock (Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta); void SetBlock (Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
bool GetBlockTypeMeta (Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta); bool GetBlockTypeMeta (Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) const;
bool GetBlockInfo (Vector3i, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight); bool GetBlockInfo (Vector3i, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) const;
/** Special function used for growing trees, replaces only blocks that tree may overwrite */ /** Special function used for growing trees, replaces only blocks that tree may overwrite */
void ReplaceTreeBlocks(const sSetBlockVector & a_Blocks); void ReplaceTreeBlocks(const sSetBlockVector & a_Blocks);
/** Returns the biome at the specified coords. Reads the biome from the chunk, if loaded, otherwise uses the world generator to provide the biome value */ /** Returns the biome at the specified coords. Reads the biome from the chunk, if loaded, otherwise uses the world generator to provide the biome value */
EMCSBiome GetBiomeAt (int a_BlockX, int a_BlockZ); EMCSBiome GetBiomeAt (int a_BlockX, int a_BlockZ) const;
/** Sets the biome at the specified coords. Returns true if successful, false if not (chunk not loaded). /** Sets the biome at the specified coords. Returns true if successful, false if not (chunk not loaded).
Doesn't resend the chunk to clients. */ Doesn't resend the chunk to clients. */
@ -462,6 +462,9 @@ private:
/** Locates a chunk ptr in the chunkmap; doesn't create it when not found; assumes m_CSChunks is locked. To be called only from cChunkMap. */ /** Locates a chunk ptr in the chunkmap; doesn't create it when not found; assumes m_CSChunks is locked. To be called only from cChunkMap. */
cChunk * FindChunk(int a_ChunkX, int a_ChunkZ); cChunk * FindChunk(int a_ChunkX, int a_ChunkZ);
/** Locates a chunk ptr in the chunkmap; doesn't create it when not found; assumes m_CSChunks is locked. To be called only from cChunkMap. */
const cChunk * FindChunk(int a_ChunkX, int a_ChunkZ) const;
/** Adds a new cChunkStay descendant to the internal list of ChunkStays; loads its chunks. /** Adds a new cChunkStay descendant to the internal list of ChunkStays; loads its chunks.
To be used only by cChunkStay; others should use cChunkStay::Enable() instead */ To be used only by cChunkStay; others should use cChunkStay::Enable() instead */
void AddChunkStay(cChunkStay & a_ChunkStay); void AddChunkStay(cChunkStay & a_ChunkStay);

View File

@ -92,7 +92,7 @@ namespace World
// cWorld::cLock: // cWorld::cLock:
cWorld::cLock::cLock(cWorld & a_World) : cWorld::cLock::cLock(cWorld & a_World) :
Super(&(a_World.m_ChunkMap->GetCS())) Super(&(a_World.m_ChunkMap.GetCS()))
{ {
} }
@ -184,7 +184,7 @@ cWorld::cWorld(
m_FireSimulator(), m_FireSimulator(),
m_RedstoneSimulator(nullptr), m_RedstoneSimulator(nullptr),
m_MaxPlayers(10), m_MaxPlayers(10),
m_ChunkMap(), m_ChunkMap(this),
m_bAnimals(true), m_bAnimals(true),
m_Weather(eWeather_Sunny), m_Weather(eWeather_Sunny),
m_WeatherInterval(24000), // Guaranteed 1 game-day of sunshine at server start :) m_WeatherInterval(24000), // Guaranteed 1 game-day of sunshine at server start :)
@ -227,9 +227,7 @@ cWorld::cWorld(
cFile::CreateFolderRecursive(m_DataPath); cFile::CreateFolderRecursive(m_DataPath);
// TODO: unique ptr unnecessary m_ChunkMap.TrackInDeadlockDetect(a_DeadlockDetect, m_WorldName);
m_ChunkMap = std::make_unique<cChunkMap>(this);
m_ChunkMap->TrackInDeadlockDetect(a_DeadlockDetect, m_WorldName);
// Load the scoreboard // Load the scoreboard
cScoreboardSerializer Serializer(m_DataPath, &m_Scoreboard); cScoreboardSerializer Serializer(m_DataPath, &m_Scoreboard);
@ -581,7 +579,7 @@ bool cWorld::IsWeatherWetAtXYZ(Vector3i a_Pos)
void cWorld::SetNextBlockToTick(const Vector3i a_BlockPos) void cWorld::SetNextBlockToTick(const Vector3i a_BlockPos)
{ {
return m_ChunkMap->SetNextBlockToTick(a_BlockPos); return m_ChunkMap.SetNextBlockToTick(a_BlockPos);
} }
@ -957,7 +955,7 @@ void cWorld::Stop(cDeadlockDetect & a_DeadlockDetect)
a_DeadlockDetect.UntrackCriticalSection(m_CSClients); a_DeadlockDetect.UntrackCriticalSection(m_CSClients);
a_DeadlockDetect.UntrackCriticalSection(m_CSTasks); a_DeadlockDetect.UntrackCriticalSection(m_CSTasks);
m_ChunkMap->UntrackInDeadlockDetect(a_DeadlockDetect); m_ChunkMap.UntrackInDeadlockDetect(a_DeadlockDetect);
if (IsSavingEnabled()) if (IsSavingEnabled())
{ {
@ -1022,7 +1020,7 @@ void cWorld::Tick(std::chrono::milliseconds a_Dt, std::chrono::milliseconds a_La
} }
for (auto & Entity : EntitiesToAdd) for (auto & Entity : EntitiesToAdd)
{ {
m_ChunkMap->AddEntity(std::move(Entity)); m_ChunkMap.AddEntity(std::move(Entity));
} }
EntitiesToAdd.clear(); EntitiesToAdd.clear();
@ -1031,7 +1029,7 @@ void cWorld::Tick(std::chrono::milliseconds a_Dt, std::chrono::milliseconds a_La
TickClients(static_cast<float>(a_Dt.count())); TickClients(static_cast<float>(a_Dt.count()));
TickQueuedBlocks(); TickQueuedBlocks();
m_ChunkMap->Tick(a_Dt); // Tick chunk after clients to apply at least one round of queued ticks (e.g. cBlockHandler::Check) this tick m_ChunkMap.Tick(a_Dt); // Tick chunk after clients to apply at least one round of queued ticks (e.g. cBlockHandler::Check) this tick
TickMobs(a_Dt); TickMobs(a_Dt);
m_MapManager.TickMaps(); m_MapManager.TickMaps();
TickQueuedTasks(); TickQueuedTasks();
@ -1103,7 +1101,7 @@ void cWorld::TickMobs(std::chrono::milliseconds a_Dt)
// before every Mob action, we have to count them depending on the distance to players, on their family ... // before every Mob action, we have to count them depending on the distance to players, on their family ...
cMobCensus MobCensus; cMobCensus MobCensus;
m_ChunkMap->CollectMobCensus(MobCensus); m_ChunkMap.CollectMobCensus(MobCensus);
if (m_bAnimals) if (m_bAnimals)
{ {
// Spawning is enabled, spawn now: // Spawning is enabled, spawn now:
@ -1129,7 +1127,7 @@ void cWorld::TickMobs(std::chrono::milliseconds a_Dt)
cMobSpawner Spawner(Family, m_AllowedMobs); cMobSpawner Spawner(Family, m_AllowedMobs);
if (Spawner.CanSpawnAnything()) if (Spawner.CanSpawnAnything())
{ {
m_ChunkMap->SpawnMobs(Spawner); m_ChunkMap.SpawnMobs(Spawner);
// do the spawn // do the spawn
for (auto & Mob : Spawner.getSpawned()) for (auto & Mob : Spawner.getSpawned())
{ {
@ -1300,7 +1298,7 @@ void cWorld::UpdateSkyDarkness(void)
void cWorld::WakeUpSimulators(Vector3i a_Block) void cWorld::WakeUpSimulators(Vector3i a_Block)
{ {
return m_ChunkMap->WakeUpSimulators(a_Block); return m_ChunkMap.WakeUpSimulators(a_Block);
} }
@ -1328,7 +1326,7 @@ void cWorld::WakeUpSimulatorsInArea(const cCuboid & a_Area)
bool cWorld::ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEntityCallback a_Callback) bool cWorld::ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEntityCallback a_Callback)
{ {
return m_ChunkMap->ForEachBlockEntityInChunk(a_ChunkX, a_ChunkZ, a_Callback); return m_ChunkMap.ForEachBlockEntityInChunk(a_ChunkX, a_ChunkZ, a_Callback);
} }
@ -1337,7 +1335,7 @@ bool cWorld::ForEachBlockEntityInChunk(int a_ChunkX, int a_ChunkZ, cBlockEntityC
bool cWorld::ForEachBrewingstandInChunk(int a_ChunkX, int a_ChunkZ, cBrewingstandCallback a_Callback) bool cWorld::ForEachBrewingstandInChunk(int a_ChunkX, int a_ChunkZ, cBrewingstandCallback a_Callback)
{ {
return m_ChunkMap->ForEachBrewingstandInChunk(a_ChunkX, a_ChunkZ, a_Callback); return m_ChunkMap.ForEachBrewingstandInChunk(a_ChunkX, a_ChunkZ, a_Callback);
} }
@ -1346,7 +1344,7 @@ bool cWorld::ForEachBrewingstandInChunk(int a_ChunkX, int a_ChunkZ, cBrewingstan
bool cWorld::ForEachChestInChunk(int a_ChunkX, int a_ChunkZ, cChestCallback a_Callback) bool cWorld::ForEachChestInChunk(int a_ChunkX, int a_ChunkZ, cChestCallback a_Callback)
{ {
return m_ChunkMap->ForEachChestInChunk(a_ChunkX, a_ChunkZ, a_Callback); return m_ChunkMap.ForEachChestInChunk(a_ChunkX, a_ChunkZ, a_Callback);
} }
@ -1355,7 +1353,7 @@ bool cWorld::ForEachChestInChunk(int a_ChunkX, int a_ChunkZ, cChestCallback a_Ca
bool cWorld::ForEachDispenserInChunk(int a_ChunkX, int a_ChunkZ, cDispenserCallback a_Callback) bool cWorld::ForEachDispenserInChunk(int a_ChunkX, int a_ChunkZ, cDispenserCallback a_Callback)
{ {
return m_ChunkMap->ForEachDispenserInChunk(a_ChunkX, a_ChunkZ, a_Callback); return m_ChunkMap.ForEachDispenserInChunk(a_ChunkX, a_ChunkZ, a_Callback);
} }
@ -1364,7 +1362,7 @@ bool cWorld::ForEachDispenserInChunk(int a_ChunkX, int a_ChunkZ, cDispenserCallb
bool cWorld::ForEachDropperInChunk(int a_ChunkX, int a_ChunkZ, cDropperCallback a_Callback) bool cWorld::ForEachDropperInChunk(int a_ChunkX, int a_ChunkZ, cDropperCallback a_Callback)
{ {
return m_ChunkMap->ForEachDropperInChunk(a_ChunkX, a_ChunkZ, a_Callback); return m_ChunkMap.ForEachDropperInChunk(a_ChunkX, a_ChunkZ, a_Callback);
} }
@ -1373,7 +1371,7 @@ bool cWorld::ForEachDropperInChunk(int a_ChunkX, int a_ChunkZ, cDropperCallback
bool cWorld::ForEachDropSpenserInChunk(int a_ChunkX, int a_ChunkZ, cDropSpenserCallback a_Callback) bool cWorld::ForEachDropSpenserInChunk(int a_ChunkX, int a_ChunkZ, cDropSpenserCallback a_Callback)
{ {
return m_ChunkMap->ForEachDropSpenserInChunk(a_ChunkX, a_ChunkZ, a_Callback); return m_ChunkMap.ForEachDropSpenserInChunk(a_ChunkX, a_ChunkZ, a_Callback);
} }
@ -1382,7 +1380,7 @@ bool cWorld::ForEachDropSpenserInChunk(int a_ChunkX, int a_ChunkZ, cDropSpenserC
bool cWorld::ForEachFurnaceInChunk(int a_ChunkX, int a_ChunkZ, cFurnaceCallback a_Callback) bool cWorld::ForEachFurnaceInChunk(int a_ChunkX, int a_ChunkZ, cFurnaceCallback a_Callback)
{ {
return m_ChunkMap->ForEachFurnaceInChunk(a_ChunkX, a_ChunkZ, a_Callback); return m_ChunkMap.ForEachFurnaceInChunk(a_ChunkX, a_ChunkZ, a_Callback);
} }
@ -1426,7 +1424,7 @@ void cWorld::DoExplosionAt(double a_ExplosionSize, double a_BlockX, double a_Blo
bool cWorld::DoWithBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBlockEntityCallback a_Callback) bool cWorld::DoWithBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBlockEntityCallback a_Callback)
{ {
return m_ChunkMap->DoWithBlockEntityAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithBlockEntityAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1435,7 +1433,7 @@ bool cWorld::DoWithBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBloc
bool cWorld::DoWithBeaconAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBeaconCallback a_Callback) bool cWorld::DoWithBeaconAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBeaconCallback a_Callback)
{ {
return m_ChunkMap->DoWithBeaconAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithBeaconAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1444,7 +1442,7 @@ bool cWorld::DoWithBeaconAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBeaconCal
bool cWorld::DoWithBedAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBedCallback a_Callback) bool cWorld::DoWithBedAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBedCallback a_Callback)
{ {
return m_ChunkMap->DoWithBedAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithBedAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1453,7 +1451,7 @@ bool cWorld::DoWithBedAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBedCallback
bool cWorld::DoWithBrewingstandAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBrewingstandCallback a_Callback) bool cWorld::DoWithBrewingstandAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBrewingstandCallback a_Callback)
{ {
return m_ChunkMap->DoWithBrewingstandAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithBrewingstandAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1462,7 +1460,7 @@ bool cWorld::DoWithBrewingstandAt(int a_BlockX, int a_BlockY, int a_BlockZ, cBre
bool cWorld::DoWithChestAt(int a_BlockX, int a_BlockY, int a_BlockZ, cChestCallback a_Callback) bool cWorld::DoWithChestAt(int a_BlockX, int a_BlockY, int a_BlockZ, cChestCallback a_Callback)
{ {
return m_ChunkMap->DoWithChestAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithChestAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1471,7 +1469,7 @@ bool cWorld::DoWithChestAt(int a_BlockX, int a_BlockY, int a_BlockZ, cChestCallb
bool cWorld::DoWithDispenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDispenserCallback a_Callback) bool cWorld::DoWithDispenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDispenserCallback a_Callback)
{ {
return m_ChunkMap->DoWithDispenserAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithDispenserAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1480,7 +1478,7 @@ bool cWorld::DoWithDispenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDispen
bool cWorld::DoWithDropperAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDropperCallback a_Callback) bool cWorld::DoWithDropperAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDropperCallback a_Callback)
{ {
return m_ChunkMap->DoWithDropperAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithDropperAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1489,7 +1487,7 @@ bool cWorld::DoWithDropperAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDropperC
bool cWorld::DoWithDropSpenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDropSpenserCallback a_Callback) bool cWorld::DoWithDropSpenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDropSpenserCallback a_Callback)
{ {
return m_ChunkMap->DoWithDropSpenserAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithDropSpenserAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1498,7 +1496,7 @@ bool cWorld::DoWithDropSpenserAt(int a_BlockX, int a_BlockY, int a_BlockZ, cDrop
bool cWorld::DoWithFurnaceAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFurnaceCallback a_Callback) bool cWorld::DoWithFurnaceAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFurnaceCallback a_Callback)
{ {
return m_ChunkMap->DoWithFurnaceAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithFurnaceAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1507,7 +1505,7 @@ bool cWorld::DoWithFurnaceAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFurnaceC
bool cWorld::DoWithHopperAt(int a_BlockX, int a_BlockY, int a_BlockZ, cHopperCallback a_Callback) bool cWorld::DoWithHopperAt(int a_BlockX, int a_BlockY, int a_BlockZ, cHopperCallback a_Callback)
{ {
return m_ChunkMap->DoWithHopperAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithHopperAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1516,7 +1514,7 @@ bool cWorld::DoWithHopperAt(int a_BlockX, int a_BlockY, int a_BlockZ, cHopperCal
bool cWorld::DoWithNoteBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cNoteBlockCallback a_Callback) bool cWorld::DoWithNoteBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cNoteBlockCallback a_Callback)
{ {
return m_ChunkMap->DoWithNoteBlockAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithNoteBlockAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1525,7 +1523,7 @@ bool cWorld::DoWithNoteBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cNoteBl
bool cWorld::DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cCommandBlockCallback a_Callback) bool cWorld::DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cCommandBlockCallback a_Callback)
{ {
return m_ChunkMap->DoWithCommandBlockAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithCommandBlockAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1534,7 +1532,7 @@ bool cWorld::DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cCom
bool cWorld::DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadCallback a_Callback) bool cWorld::DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadCallback a_Callback)
{ {
return m_ChunkMap->DoWithMobHeadAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithMobHeadAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1543,7 +1541,7 @@ bool cWorld::DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadC
bool cWorld::DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlowerPotCallback a_Callback) bool cWorld::DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlowerPotCallback a_Callback)
{ {
return m_ChunkMap->DoWithFlowerPotAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback); return m_ChunkMap.DoWithFlowerPotAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
} }
@ -1552,7 +1550,7 @@ bool cWorld::DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlower
bool cWorld::GetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4) bool cWorld::GetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4)
{ {
return m_ChunkMap->GetSignLines(a_BlockX, a_BlockY, a_BlockZ, a_Line1, a_Line2, a_Line3, a_Line4); return m_ChunkMap.GetSignLines(a_BlockX, a_BlockY, a_BlockZ, a_Line1, a_Line2, a_Line3, a_Line4);
} }
@ -1561,7 +1559,7 @@ bool cWorld::GetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_
bool cWorld::DoWithChunk(int a_ChunkX, int a_ChunkZ, cChunkCallback a_Callback) bool cWorld::DoWithChunk(int a_ChunkX, int a_ChunkZ, cChunkCallback a_Callback)
{ {
return m_ChunkMap->DoWithChunk(a_ChunkX, a_ChunkZ, a_Callback); return m_ChunkMap.DoWithChunk(a_ChunkX, a_ChunkZ, a_Callback);
} }
@ -1570,7 +1568,7 @@ bool cWorld::DoWithChunk(int a_ChunkX, int a_ChunkZ, cChunkCallback a_Callback)
bool cWorld::DoWithChunkAt(Vector3i a_BlockPos, cChunkCallback a_Callback) bool cWorld::DoWithChunkAt(Vector3i a_BlockPos, cChunkCallback a_Callback)
{ {
return m_ChunkMap->DoWithChunkAt(a_BlockPos, a_Callback); return m_ChunkMap.DoWithChunkAt(a_BlockPos, a_Callback);
} }
@ -1776,7 +1774,7 @@ bool cWorld::GrowTreeImage(const sSetBlockVector & a_Blocks)
} // for itr - b2[] } // for itr - b2[]
// All ok, replace blocks with the tree image: // All ok, replace blocks with the tree image:
m_ChunkMap->ReplaceTreeBlocks(a_Blocks); m_ChunkMap.ReplaceTreeBlocks(a_Blocks);
return true; return true;
} }
@ -1786,7 +1784,7 @@ bool cWorld::GrowTreeImage(const sSetBlockVector & a_Blocks)
int cWorld::GrowPlantAt(Vector3i a_BlockPos, int a_NumStages) int cWorld::GrowPlantAt(Vector3i a_BlockPos, int a_NumStages)
{ {
return m_ChunkMap->GrowPlantAt(a_BlockPos, a_NumStages); return m_ChunkMap.GrowPlantAt(a_BlockPos, a_NumStages);
} }
@ -1804,7 +1802,7 @@ bool cWorld::GrowRipePlant(Vector3i a_BlockPos)
EMCSBiome cWorld::GetBiomeAt (int a_BlockX, int a_BlockZ) EMCSBiome cWorld::GetBiomeAt (int a_BlockX, int a_BlockZ)
{ {
return m_ChunkMap->GetBiomeAt(a_BlockX, a_BlockZ); return m_ChunkMap.GetBiomeAt(a_BlockX, a_BlockZ);
} }
@ -1813,7 +1811,7 @@ EMCSBiome cWorld::GetBiomeAt (int a_BlockX, int a_BlockZ)
bool cWorld::SetBiomeAt(int a_BlockX, int a_BlockZ, EMCSBiome a_Biome) bool cWorld::SetBiomeAt(int a_BlockX, int a_BlockZ, EMCSBiome a_Biome)
{ {
return m_ChunkMap->SetBiomeAt(a_BlockX, a_BlockZ, a_Biome); return m_ChunkMap.SetBiomeAt(a_BlockX, a_BlockZ, a_Biome);
} }
@ -1822,7 +1820,7 @@ bool cWorld::SetBiomeAt(int a_BlockX, int a_BlockZ, EMCSBiome a_Biome)
bool cWorld::SetAreaBiome(int a_MinX, int a_MaxX, int a_MinZ, int a_MaxZ, EMCSBiome a_Biome) bool cWorld::SetAreaBiome(int a_MinX, int a_MaxX, int a_MinZ, int a_MaxZ, EMCSBiome a_Biome)
{ {
return m_ChunkMap->SetAreaBiome(a_MinX, a_MaxX, a_MinZ, a_MaxZ, a_Biome); return m_ChunkMap.SetAreaBiome(a_MinX, a_MaxX, a_MinZ, a_MaxZ, a_Biome);
} }
@ -1853,7 +1851,7 @@ void cWorld::SetMaxViewDistance(unsigned a_MaxViewDistance)
void cWorld::SetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) void cWorld::SetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
{ {
m_ChunkMap->SetBlock(a_BlockPos, a_BlockType, a_BlockMeta); m_ChunkMap.SetBlock(a_BlockPos, a_BlockType, a_BlockMeta);
} }
@ -1862,7 +1860,7 @@ void cWorld::SetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_B
void cWorld::SetBlockMeta(Vector3i a_BlockPos, NIBBLETYPE a_MetaData) void cWorld::SetBlockMeta(Vector3i a_BlockPos, NIBBLETYPE a_MetaData)
{ {
m_ChunkMap->SetBlockMeta(a_BlockPos, a_MetaData); m_ChunkMap.SetBlockMeta(a_BlockPos, a_MetaData);
} }
@ -1871,7 +1869,7 @@ void cWorld::SetBlockMeta(Vector3i a_BlockPos, NIBBLETYPE a_MetaData)
NIBBLETYPE cWorld::GetBlockSkyLight(Vector3i a_BlockPos) NIBBLETYPE cWorld::GetBlockSkyLight(Vector3i a_BlockPos)
{ {
return m_ChunkMap->GetBlockSkyLight(a_BlockPos); return m_ChunkMap.GetBlockSkyLight(a_BlockPos);
} }
@ -1880,7 +1878,7 @@ NIBBLETYPE cWorld::GetBlockSkyLight(Vector3i a_BlockPos)
NIBBLETYPE cWorld::GetBlockBlockLight(Vector3i a_BlockPos) NIBBLETYPE cWorld::GetBlockBlockLight(Vector3i a_BlockPos)
{ {
return m_ChunkMap->GetBlockBlockLight(a_BlockPos); return m_ChunkMap.GetBlockBlockLight(a_BlockPos);
} }
@ -1889,7 +1887,7 @@ NIBBLETYPE cWorld::GetBlockBlockLight(Vector3i a_BlockPos)
bool cWorld::GetBlockTypeMeta(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta) bool cWorld::GetBlockTypeMeta(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta)
{ {
return m_ChunkMap->GetBlockTypeMeta(a_BlockPos, a_BlockType, a_BlockMeta); return m_ChunkMap.GetBlockTypeMeta(a_BlockPos, a_BlockType, a_BlockMeta);
} }
@ -1898,7 +1896,7 @@ bool cWorld::GetBlockTypeMeta(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBB
bool cWorld::GetBlockInfo(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight) bool cWorld::GetBlockInfo(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETYPE & a_Meta, NIBBLETYPE & a_SkyLight, NIBBLETYPE & a_BlockLight)
{ {
return m_ChunkMap->GetBlockInfo(a_BlockPos, a_BlockType, a_Meta, a_SkyLight, a_BlockLight); return m_ChunkMap.GetBlockInfo(a_BlockPos, a_BlockType, a_Meta, a_SkyLight, a_BlockLight);
} }
@ -1907,7 +1905,7 @@ bool cWorld::GetBlockInfo(Vector3i a_BlockPos, BLOCKTYPE & a_BlockType, NIBBLETY
bool cWorld::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes) bool cWorld::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes)
{ {
return m_ChunkMap->WriteBlockArea(a_Area, a_MinBlockX, a_MinBlockY, a_MinBlockZ, a_DataTypes); return m_ChunkMap.WriteBlockArea(a_Area, a_MinBlockX, a_MinBlockY, a_MinBlockZ, a_DataTypes);
} }
@ -2165,7 +2163,7 @@ void cWorld::PlaceBlock(const Vector3i a_Position, const BLOCKTYPE a_BlockType,
bool cWorld::GetBlocks(sSetBlockVector & a_Blocks, bool a_ContinueOnFailure) bool cWorld::GetBlocks(sSetBlockVector & a_Blocks, bool a_ContinueOnFailure)
{ {
return m_ChunkMap->GetBlocks(a_Blocks, a_ContinueOnFailure); return m_ChunkMap.GetBlocks(a_Blocks, a_ContinueOnFailure);
} }
@ -2178,7 +2176,7 @@ bool cWorld::DigBlock(Vector3i a_BlockPos, const cEntity * a_Digger)
NIBBLETYPE BlockMeta; NIBBLETYPE BlockMeta;
GetBlockTypeMeta(a_BlockPos, BlockType, BlockMeta); GetBlockTypeMeta(a_BlockPos, BlockType, BlockMeta);
if (!m_ChunkMap->DigBlock(a_BlockPos)) if (!m_ChunkMap.DigBlock(a_BlockPos))
{ {
return false; return false;
} }
@ -2210,7 +2208,7 @@ bool cWorld::DropBlockAsPickups(Vector3i a_BlockPos, const cEntity * a_Digger, c
cItems cWorld::PickupsFromBlock(Vector3i a_BlockPos, const cEntity * a_Digger, const cItem * a_Tool) cItems cWorld::PickupsFromBlock(Vector3i a_BlockPos, const cEntity * a_Digger, const cItem * a_Tool)
{ {
return m_ChunkMap->PickupsFromBlock(a_BlockPos, a_Digger, a_Tool); return m_ChunkMap.PickupsFromBlock(a_BlockPos, a_Digger, a_Tool);
} }
@ -2219,7 +2217,7 @@ cItems cWorld::PickupsFromBlock(Vector3i a_BlockPos, const cEntity * a_Digger, c
void cWorld::SendBlockTo(int a_X, int a_Y, int a_Z, cPlayer & a_Player) void cWorld::SendBlockTo(int a_X, int a_Y, int a_Z, cPlayer & a_Player)
{ {
m_ChunkMap->SendBlockTo(a_X, a_Y, a_Z, a_Player); m_ChunkMap.SendBlockTo(a_X, a_Y, a_Z, a_Player);
} }
@ -2228,7 +2226,7 @@ void cWorld::SendBlockTo(int a_X, int a_Y, int a_Z, cPlayer & a_Player)
int cWorld::GetHeight(int a_X, int a_Z) int cWorld::GetHeight(int a_X, int a_Z)
{ {
return m_ChunkMap->GetHeight(a_X, a_Z); return m_ChunkMap.GetHeight(a_X, a_Z);
} }
@ -2237,7 +2235,7 @@ int cWorld::GetHeight(int a_X, int a_Z)
bool cWorld::TryGetHeight(int a_BlockX, int a_BlockZ, int & a_Height) bool cWorld::TryGetHeight(int a_BlockX, int a_BlockZ, int & a_Height)
{ {
return m_ChunkMap->TryGetHeight(a_BlockX, a_BlockZ, a_Height); return m_ChunkMap.TryGetHeight(a_BlockX, a_BlockZ, a_Height);
} }
@ -2246,7 +2244,7 @@ bool cWorld::TryGetHeight(int a_BlockX, int a_BlockZ, int & a_Height)
void cWorld::SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client) void cWorld::SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClientHandle & a_Client)
{ {
m_ChunkMap->SendBlockEntity(a_BlockX, a_BlockY, a_BlockZ, a_Client); m_ChunkMap.SendBlockEntity(a_BlockX, a_BlockY, a_BlockZ, a_Client);
} }
@ -2255,7 +2253,7 @@ void cWorld::SendBlockEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cClientHa
void cWorld::MarkChunkDirty(int a_ChunkX, int a_ChunkZ) void cWorld::MarkChunkDirty(int a_ChunkX, int a_ChunkZ)
{ {
m_ChunkMap->MarkChunkDirty(a_ChunkX, a_ChunkZ); m_ChunkMap.MarkChunkDirty(a_ChunkX, a_ChunkZ);
} }
@ -2264,7 +2262,7 @@ void cWorld::MarkChunkDirty(int a_ChunkX, int a_ChunkZ)
void cWorld::MarkChunkSaving(int a_ChunkX, int a_ChunkZ) void cWorld::MarkChunkSaving(int a_ChunkX, int a_ChunkZ)
{ {
m_ChunkMap->MarkChunkSaving(a_ChunkX, a_ChunkZ); m_ChunkMap.MarkChunkSaving(a_ChunkX, a_ChunkZ);
} }
@ -2273,7 +2271,7 @@ void cWorld::MarkChunkSaving(int a_ChunkX, int a_ChunkZ)
void cWorld::MarkChunkSaved (int a_ChunkX, int a_ChunkZ) void cWorld::MarkChunkSaved (int a_ChunkX, int a_ChunkZ)
{ {
m_ChunkMap->MarkChunkSaved (a_ChunkX, a_ChunkZ); m_ChunkMap.MarkChunkSaved (a_ChunkX, a_ChunkZ);
} }
@ -2311,7 +2309,7 @@ void cWorld::SetChunkData(cSetChunkData & a_SetChunkData)
ASSERT(a_SetChunkData.AreBiomesValid()); ASSERT(a_SetChunkData.AreBiomesValid());
ASSERT(a_SetChunkData.IsHeightMapValid()); ASSERT(a_SetChunkData.IsHeightMapValid());
m_ChunkMap->SetChunkData(a_SetChunkData); m_ChunkMap.SetChunkData(a_SetChunkData);
// Initialize the entities (outside the m_ChunkMap's CS, to fix FS #347): // Initialize the entities (outside the m_ChunkMap's CS, to fix FS #347):
for (auto & Entity : a_SetChunkData.GetEntities()) for (auto & Entity : a_SetChunkData.GetEntities())
@ -2360,7 +2358,7 @@ void cWorld::ChunkLighted(
const cChunkDef::BlockNibbles & a_SkyLight const cChunkDef::BlockNibbles & a_SkyLight
) )
{ {
m_ChunkMap->ChunkLighted(a_ChunkX, a_ChunkZ, a_BlockLight, a_SkyLight); m_ChunkMap.ChunkLighted(a_ChunkX, a_ChunkZ, a_BlockLight, a_SkyLight);
} }
@ -2369,7 +2367,7 @@ void cWorld::ChunkLighted(
bool cWorld::GetChunkData(cChunkCoords a_Coords, cChunkDataCallback & a_Callback) const bool cWorld::GetChunkData(cChunkCoords a_Coords, cChunkDataCallback & a_Callback) const
{ {
return m_ChunkMap->GetChunkData(a_Coords, a_Callback); return m_ChunkMap.GetChunkData(a_Coords, a_Callback);
} }
@ -2378,7 +2376,7 @@ bool cWorld::GetChunkData(cChunkCoords a_Coords, cChunkDataCallback & a_Callback
bool cWorld::GetChunkBlockTypes(int a_ChunkX, int a_ChunkZ, BLOCKTYPE * a_BlockTypes) bool cWorld::GetChunkBlockTypes(int a_ChunkX, int a_ChunkZ, BLOCKTYPE * a_BlockTypes)
{ {
return m_ChunkMap->GetChunkBlockTypes(a_ChunkX, a_ChunkZ, a_BlockTypes); return m_ChunkMap.GetChunkBlockTypes(a_ChunkX, a_ChunkZ, a_BlockTypes);
} }
@ -2387,7 +2385,7 @@ bool cWorld::GetChunkBlockTypes(int a_ChunkX, int a_ChunkZ, BLOCKTYPE * a_BlockT
bool cWorld::IsChunkQueued(int a_ChunkX, int a_ChunkZ) const bool cWorld::IsChunkQueued(int a_ChunkX, int a_ChunkZ) const
{ {
return m_ChunkMap->IsChunkQueued(a_ChunkX, a_ChunkZ); return m_ChunkMap.IsChunkQueued(a_ChunkX, a_ChunkZ);
} }
@ -2396,7 +2394,7 @@ bool cWorld::IsChunkQueued(int a_ChunkX, int a_ChunkZ) const
bool cWorld::IsChunkValid(int a_ChunkX, int a_ChunkZ) const bool cWorld::IsChunkValid(int a_ChunkX, int a_ChunkZ) const
{ {
return m_ChunkMap->IsChunkValid(a_ChunkX, a_ChunkZ); return m_ChunkMap.IsChunkValid(a_ChunkX, a_ChunkZ);
} }
@ -2405,7 +2403,7 @@ bool cWorld::IsChunkValid(int a_ChunkX, int a_ChunkZ) const
bool cWorld::HasChunkAnyClients(int a_ChunkX, int a_ChunkZ) const bool cWorld::HasChunkAnyClients(int a_ChunkX, int a_ChunkZ) const
{ {
return m_ChunkMap->HasChunkAnyClients(a_ChunkX, a_ChunkZ); return m_ChunkMap.HasChunkAnyClients(a_ChunkX, a_ChunkZ);
} }
@ -2415,7 +2413,7 @@ bool cWorld::HasChunkAnyClients(int a_ChunkX, int a_ChunkZ) const
void cWorld::UnloadUnusedChunks(void) void cWorld::UnloadUnusedChunks(void)
{ {
m_LastChunkCheck = std::chrono::duration_cast<cTickTimeLong>(m_WorldAge); m_LastChunkCheck = std::chrono::duration_cast<cTickTimeLong>(m_WorldAge);
m_ChunkMap->UnloadUnusedChunks(); m_ChunkMap.UnloadUnusedChunks();
} }
@ -2433,7 +2431,7 @@ void cWorld::QueueUnloadUnusedChunks(void)
void cWorld::CollectPickupsByPlayer(cPlayer & a_Player) void cWorld::CollectPickupsByPlayer(cPlayer & a_Player)
{ {
m_ChunkMap->CollectPickupsByPlayer(a_Player); m_ChunkMap.CollectPickupsByPlayer(a_Player);
} }
@ -2453,7 +2451,7 @@ void cWorld::AddPlayer(std::unique_ptr<cPlayer> a_Player, cWorld * a_OldWorld)
std::unique_ptr<cPlayer> cWorld::RemovePlayer(cPlayer & a_Player) std::unique_ptr<cPlayer> cWorld::RemovePlayer(cPlayer & a_Player)
{ {
// Check the chunkmap // Check the chunkmap
std::unique_ptr<cPlayer> PlayerPtr(static_cast<cPlayer *>(m_ChunkMap->RemoveEntity(a_Player).release())); std::unique_ptr<cPlayer> PlayerPtr(static_cast<cPlayer *>(m_ChunkMap.RemoveEntity(a_Player).release()));
if (PlayerPtr != nullptr) if (PlayerPtr != nullptr)
{ {
@ -2489,7 +2487,7 @@ std::unique_ptr<cPlayer> cWorld::RemovePlayer(cPlayer & a_Player)
if (Client != nullptr) if (Client != nullptr)
{ {
Client->RemoveFromWorld(); Client->RemoveFromWorld();
m_ChunkMap->RemoveClientFromChunks(Client); m_ChunkMap.RemoveClientFromChunks(Client);
cCSLock Lock(m_CSClients); cCSLock Lock(m_CSClients);
m_ClientsToRemove.push_back(Client); m_ClientsToRemove.push_back(Client);
} }
@ -2721,7 +2719,7 @@ void cWorld::SendPlayerList(cPlayer * a_DestPlayer)
bool cWorld::ForEachEntity(cEntityCallback a_Callback) bool cWorld::ForEachEntity(cEntityCallback a_Callback)
{ {
return m_ChunkMap->ForEachEntity(a_Callback); return m_ChunkMap.ForEachEntity(a_Callback);
} }
@ -2730,7 +2728,7 @@ bool cWorld::ForEachEntity(cEntityCallback a_Callback)
bool cWorld::ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback a_Callback) bool cWorld::ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback a_Callback)
{ {
return m_ChunkMap->ForEachEntityInChunk(a_ChunkX, a_ChunkZ, a_Callback); return m_ChunkMap.ForEachEntityInChunk(a_ChunkX, a_ChunkZ, a_Callback);
} }
@ -2739,7 +2737,7 @@ bool cWorld::ForEachEntityInChunk(int a_ChunkX, int a_ChunkZ, cEntityCallback a_
bool cWorld::ForEachEntityInBox(const cBoundingBox & a_Box, cEntityCallback a_Callback) bool cWorld::ForEachEntityInBox(const cBoundingBox & a_Box, cEntityCallback a_Callback)
{ {
return m_ChunkMap->ForEachEntityInBox(a_Box, a_Callback); return m_ChunkMap.ForEachEntityInBox(a_Box, a_Callback);
} }
@ -2762,7 +2760,7 @@ bool cWorld::DoWithEntityByID(UInt32 a_UniqueID, cEntityCallback a_Callback)
} }
// Then check the chunkmap: // Then check the chunkmap:
return m_ChunkMap->DoWithEntityByID(a_UniqueID, a_Callback); return m_ChunkMap.DoWithEntityByID(a_UniqueID, a_Callback);
} }
@ -2771,7 +2769,7 @@ bool cWorld::DoWithEntityByID(UInt32 a_UniqueID, cEntityCallback a_Callback)
void cWorld::CompareChunkClients(int a_ChunkX1, int a_ChunkZ1, int a_ChunkX2, int a_ChunkZ2, cClientDiffCallback & a_Callback) void cWorld::CompareChunkClients(int a_ChunkX1, int a_ChunkZ1, int a_ChunkX2, int a_ChunkZ2, cClientDiffCallback & a_Callback)
{ {
m_ChunkMap->CompareChunkClients(a_ChunkX1, a_ChunkZ1, a_ChunkX2, a_ChunkZ2, a_Callback); m_ChunkMap.CompareChunkClients(a_ChunkX1, a_ChunkZ1, a_ChunkX2, a_ChunkZ2, a_Callback);
} }
@ -2780,7 +2778,7 @@ void cWorld::CompareChunkClients(int a_ChunkX1, int a_ChunkZ1, int a_ChunkX2, in
bool cWorld::AddChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client) bool cWorld::AddChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client)
{ {
return m_ChunkMap->AddChunkClient(a_ChunkX, a_ChunkZ, a_Client); return m_ChunkMap.AddChunkClient(a_ChunkX, a_ChunkZ, a_Client);
} }
@ -2789,7 +2787,7 @@ bool cWorld::AddChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client
void cWorld::RemoveChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client) void cWorld::RemoveChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Client)
{ {
m_ChunkMap->RemoveChunkClient(a_ChunkX, a_ChunkZ, a_Client); m_ChunkMap.RemoveChunkClient(a_ChunkX, a_ChunkZ, a_Client);
} }
@ -2798,7 +2796,7 @@ void cWorld::RemoveChunkClient(int a_ChunkX, int a_ChunkZ, cClientHandle * a_Cli
void cWorld::RemoveClientFromChunks(cClientHandle * a_Client) void cWorld::RemoveClientFromChunks(cClientHandle * a_Client)
{ {
m_ChunkMap->RemoveClientFromChunks(a_Client); m_ChunkMap.RemoveClientFromChunks(a_Client);
} }
@ -2835,7 +2833,7 @@ void cWorld::RemoveClientFromChunkSender(cClientHandle * a_Client)
void cWorld::PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallAfter) void cWorld::PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallAfter)
{ {
m_ChunkMap->PrepareChunk(a_ChunkX, a_ChunkZ, std::move(a_CallAfter)); m_ChunkMap.PrepareChunk(a_ChunkX, a_ChunkZ, std::move(a_CallAfter));
} }
@ -2844,7 +2842,7 @@ void cWorld::PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoor
void cWorld::ChunkLoadFailed(int a_ChunkX, int a_ChunkZ) void cWorld::ChunkLoadFailed(int a_ChunkX, int a_ChunkZ)
{ {
m_ChunkMap->ChunkLoadFailed(a_ChunkX, a_ChunkZ); m_ChunkMap.ChunkLoadFailed(a_ChunkX, a_ChunkZ);
} }
@ -2863,7 +2861,7 @@ bool cWorld::SetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, const AStrin
return false; return false;
} }
if (m_ChunkMap->SetSignLines(a_BlockX, a_BlockY, a_BlockZ, Line1, Line2, Line3, Line4)) if (m_ChunkMap.SetSignLines(a_BlockX, a_BlockY, a_BlockZ, Line1, Line2, Line3, Line4))
{ {
cRoot::Get()->GetPluginManager()->CallHookUpdatedSign(*this, a_BlockX, a_BlockY, a_BlockZ, Line1, Line2, Line3, Line4, a_Player); cRoot::Get()->GetPluginManager()->CallHookUpdatedSign(*this, a_BlockX, a_BlockY, a_BlockZ, Line1, Line2, Line3, Line4, a_Player);
return true; return true;
@ -2933,7 +2931,7 @@ bool cWorld::SetTrapdoorOpen(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_Op
void cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ) void cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ)
{ {
m_ChunkMap->MarkChunkRegenerating(a_ChunkX, a_ChunkZ); m_ChunkMap.MarkChunkRegenerating(a_ChunkX, a_ChunkZ);
m_Generator.QueueGenerateChunk({a_ChunkX, a_ChunkZ}, true); m_Generator.QueueGenerateChunk({a_ChunkX, a_ChunkZ}, true);
} }
@ -2943,7 +2941,7 @@ void cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ)
void cWorld::GenerateChunk(int a_ChunkX, int a_ChunkZ) void cWorld::GenerateChunk(int a_ChunkX, int a_ChunkZ)
{ {
m_ChunkMap->GenerateChunk(a_ChunkX, a_ChunkZ); m_ChunkMap.GenerateChunk(a_ChunkX, a_ChunkZ);
} }
@ -2961,7 +2959,7 @@ void cWorld::QueueLightChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkC
bool cWorld::IsChunkLighted(int a_ChunkX, int a_ChunkZ) bool cWorld::IsChunkLighted(int a_ChunkX, int a_ChunkZ)
{ {
return m_ChunkMap->IsChunkLighted(a_ChunkX, a_ChunkZ); return m_ChunkMap.IsChunkLighted(a_ChunkX, a_ChunkZ);
} }
@ -2970,7 +2968,7 @@ bool cWorld::IsChunkLighted(int a_ChunkX, int a_ChunkZ)
bool cWorld::ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback) bool cWorld::ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback)
{ {
return m_ChunkMap->ForEachChunkInRect(a_MinChunkX, a_MaxChunkX, a_MinChunkZ, a_MaxChunkZ, a_Callback); return m_ChunkMap.ForEachChunkInRect(a_MinChunkX, a_MaxChunkX, a_MinChunkZ, a_MaxChunkZ, a_Callback);
} }
@ -2979,7 +2977,7 @@ bool cWorld::ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunk
bool cWorld::ForEachLoadedChunk(cFunctionRef<bool(int, int)> a_Callback) bool cWorld::ForEachLoadedChunk(cFunctionRef<bool(int, int)> a_Callback)
{ {
return m_ChunkMap->ForEachLoadedChunk(a_Callback); return m_ChunkMap.ForEachLoadedChunk(a_Callback);
} }
@ -2991,7 +2989,7 @@ void cWorld::SaveAllChunks(void)
if (IsSavingEnabled()) if (IsSavingEnabled())
{ {
m_LastSave = std::chrono::duration_cast<cTickTimeLong>(m_WorldAge); m_LastSave = std::chrono::duration_cast<cTickTimeLong>(m_WorldAge);
m_ChunkMap->SaveAllChunks(); m_ChunkMap.SaveAllChunks();
} }
} }
@ -3043,37 +3041,10 @@ void cWorld::AddEntity(OwnedEntity a_Entity)
bool cWorld::HasEntity(UInt32 a_UniqueID)
{
// Check if the entity is in the queue to be added to the world:
{
cCSLock Lock(m_CSEntitiesToAdd);
for (cEntityList::const_iterator itr = m_EntitiesToAdd.begin(), end = m_EntitiesToAdd.end(); itr != end; ++itr)
{
if ((*itr)->GetUniqueID() == a_UniqueID)
{
return true;
}
} // for itr - m_EntitiesToAdd[]
}
// Check if the entity is in the chunkmap:
if (m_ChunkMap.get() == nullptr)
{
// Chunkmap has already been destroyed, there are no entities anymore.
return false;
}
return m_ChunkMap->HasEntity(a_UniqueID);
}
OwnedEntity cWorld::RemoveEntity(cEntity & a_Entity) OwnedEntity cWorld::RemoveEntity(cEntity & a_Entity)
{ {
// Check if the entity is in the chunkmap: // Check if the entity is in the chunkmap:
auto Entity = m_ChunkMap->RemoveEntity(a_Entity); auto Entity = m_ChunkMap.RemoveEntity(a_Entity);
if (Entity != nullptr) if (Entity != nullptr)
{ {
Entity->OnRemoveFromWorld(*this); Entity->OnRemoveFromWorld(*this);
@ -3103,7 +3074,7 @@ OwnedEntity cWorld::RemoveEntity(cEntity & a_Entity)
size_t cWorld::GetNumChunks(void) const size_t cWorld::GetNumChunks(void) const
{ {
return m_ChunkMap->GetNumChunks(); return m_ChunkMap.GetNumChunks();
} }
@ -3112,7 +3083,7 @@ size_t cWorld::GetNumChunks(void) const
size_t cWorld::GetNumUnusedDirtyChunks(void) const size_t cWorld::GetNumUnusedDirtyChunks(void) const
{ {
return m_ChunkMap->GetNumUnusedDirtyChunks(); return m_ChunkMap.GetNumUnusedDirtyChunks();
} }
@ -3121,7 +3092,7 @@ size_t cWorld::GetNumUnusedDirtyChunks(void) const
void cWorld::GetChunkStats(int & a_NumValid, int & a_NumDirty, int & a_NumInLightingQueue) void cWorld::GetChunkStats(int & a_NumValid, int & a_NumDirty, int & a_NumInLightingQueue)
{ {
m_ChunkMap->GetChunkStats(a_NumValid, a_NumDirty); m_ChunkMap.GetChunkStats(a_NumValid, a_NumDirty);
a_NumInLightingQueue = static_cast<int>(m_Lighting.GetQueueLength()); a_NumInLightingQueue = static_cast<int>(m_Lighting.GetQueueLength());
} }
@ -3145,7 +3116,7 @@ void cWorld::TickQueuedBlocks(void)
if (Block->TicksToWait <= 0) if (Block->TicksToWait <= 0)
{ {
// TODO: Handle the case when the chunk is already unloaded // TODO: Handle the case when the chunk is already unloaded
m_ChunkMap->TickBlock({Block->X, Block->Y, Block->Z}); m_ChunkMap.TickBlock({Block->X, Block->Y, Block->Z});
delete Block; // We don't have to remove it from the vector, this will happen automatically on the next tick delete Block; // We don't have to remove it from the vector, this will happen automatically on the next tick
} }
else else
@ -3334,7 +3305,7 @@ void cWorld::TabCompleteUserName(const AString & a_Text, AStringVector & a_Resul
void cWorld::SetChunkAlwaysTicked(int a_ChunkX, int a_ChunkZ, bool a_AlwaysTicked) void cWorld::SetChunkAlwaysTicked(int a_ChunkX, int a_ChunkZ, bool a_AlwaysTicked)
{ {
m_ChunkMap->SetChunkAlwaysTicked(a_ChunkX, a_ChunkZ, a_AlwaysTicked); m_ChunkMap.SetChunkAlwaysTicked(a_ChunkX, a_ChunkZ, a_AlwaysTicked);
} }
@ -3475,7 +3446,7 @@ void cWorld::AddQueuedPlayers(void)
// Add to chunkmap, if not already there (Spawn vs MoveToWorld): // Add to chunkmap, if not already there (Spawn vs MoveToWorld):
auto PlayerPtr = Player.get(); auto PlayerPtr = Player.get();
m_ChunkMap->AddPlayer(std::move(Player)); m_ChunkMap.AddPlayer(std::move(Player));
PlayerPtr->OnAddToWorld(*this); PlayerPtr->OnAddToWorld(*this);
ASSERT(!PlayerPtr->IsTicking()); ASSERT(!PlayerPtr->IsTicking());
PlayerPtr->SetIsTicking(true); PlayerPtr->SetIsTicking(true);

View File

@ -307,10 +307,6 @@ public:
The entity is added lazily - this function only puts it in a queue that is then processed by the Tick thread. */ The entity is added lazily - this function only puts it in a queue that is then processed by the Tick thread. */
void AddEntity(OwnedEntity a_Entity); void AddEntity(OwnedEntity a_Entity);
/** Returns true if an entity with the specified UniqueID exists in the world.
Note: Only loaded chunks are considered. */
bool HasEntity(UInt32 a_UniqueID);
/** Removes the entity from the world. /** Removes the entity from the world.
Returns an owning reference to the found entity. */ Returns an owning reference to the found entity. */
OwnedEntity RemoveEntity(cEntity & a_Entity); OwnedEntity RemoveEntity(cEntity & a_Entity);
@ -410,7 +406,7 @@ public:
The replaced blocks aren't checked for block entities (block entity is leaked if it exists at this block) */ The replaced blocks aren't checked for block entities (block entity is leaked if it exists at this block) */
void FastSetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) void FastSetBlock(Vector3i a_BlockPos, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
{ {
m_ChunkMap->FastSetBlock(a_BlockPos, a_BlockType, a_BlockMeta); m_ChunkMap.FastSetBlock(a_BlockPos, a_BlockType, a_BlockMeta);
} }
/** OBSOLETE, use the Vector3-based overload instead. /** OBSOLETE, use the Vector3-based overload instead.
@ -424,32 +420,32 @@ public:
/** Returns the block type at the specified position. /** Returns the block type at the specified position.
Returns 0 if the chunk is not valid. */ Returns 0 if the chunk is not valid. */
BLOCKTYPE GetBlock(Vector3i a_BlockPos) BLOCKTYPE GetBlock(Vector3i a_BlockPos) const
{ {
return m_ChunkMap->GetBlock(a_BlockPos); return m_ChunkMap.GetBlock(a_BlockPos);
} }
/** OBSOLETE, use the Vector3-based overload instead. /** OBSOLETE, use the Vector3-based overload instead.
Returns the block type at the specified position. Returns the block type at the specified position.
Returns 0 if the chunk is not valid. */ Returns 0 if the chunk is not valid. */
BLOCKTYPE GetBlock(int a_BlockX, int a_BlockY, int a_BlockZ) BLOCKTYPE GetBlock(int a_BlockX, int a_BlockY, int a_BlockZ) const
{ {
return m_ChunkMap->GetBlock({a_BlockX, a_BlockY, a_BlockZ}); return m_ChunkMap.GetBlock({a_BlockX, a_BlockY, a_BlockZ});
} }
/** Returns the block meta at the specified position. /** Returns the block meta at the specified position.
Returns 0 if the chunk is not valid. */ Returns 0 if the chunk is not valid. */
NIBBLETYPE GetBlockMeta(Vector3i a_BlockPos) NIBBLETYPE GetBlockMeta(Vector3i a_BlockPos) const
{ {
return m_ChunkMap->GetBlockMeta(a_BlockPos); return m_ChunkMap.GetBlockMeta(a_BlockPos);
} }
/** OBSOLETE, use the Vector3-based overload instead. /** OBSOLETE, use the Vector3-based overload instead.
Returns the block meta at the specified position. Returns the block meta at the specified position.
Returns 0 if the chunk is not valid. */ Returns 0 if the chunk is not valid. */
NIBBLETYPE GetBlockMeta(int a_BlockX, int a_BlockY, int a_BlockZ) NIBBLETYPE GetBlockMeta(int a_BlockX, int a_BlockY, int a_BlockZ) const
{ {
return m_ChunkMap->GetBlockMeta({a_BlockX, a_BlockY, a_BlockZ}); return m_ChunkMap.GetBlockMeta({a_BlockX, a_BlockY, a_BlockZ});
} }
/** Sets the meta for the specified block, while keeping the blocktype. /** Sets the meta for the specified block, while keeping the blocktype.
@ -808,7 +804,7 @@ public:
bool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4); // Exported in ManualBindings.cpp bool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4); // Exported in ManualBindings.cpp
/** a_Player is using block entity at [x, y, z], handle that: */ /** a_Player is using block entity at [x, y, z], handle that: */
void UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) {m_ChunkMap->UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ); } // tolua_export void UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) { m_ChunkMap.UseBlockEntity(a_Player, a_BlockX, a_BlockY, a_BlockZ); } // tolua_export
/** Calls the callback for the chunk specified, with ChunkMapCS locked. /** Calls the callback for the chunk specified, with ChunkMapCS locked.
Returns false if the chunk doesn't exist, otherwise returns the same value as the callback */ Returns false if the chunk doesn't exist, otherwise returns the same value as the callback */
@ -1048,7 +1044,7 @@ public:
cChunkGeneratorThread & GetGenerator(void) { return m_Generator; } cChunkGeneratorThread & GetGenerator(void) { return m_Generator; }
cWorldStorage & GetStorage (void) { return m_Storage; } cWorldStorage & GetStorage (void) { return m_Storage; }
cChunkMap * GetChunkMap (void) { return m_ChunkMap.get(); } cChunkMap * GetChunkMap (void) { return &m_ChunkMap; }
/** Causes the specified block to be ticked on the next Tick() call. /** Causes the specified block to be ticked on the next Tick() call.
Only one block coord per chunk may be set, a second call overwrites the first call */ Only one block coord per chunk may be set, a second call overwrites the first call */
@ -1211,7 +1207,7 @@ private:
unsigned int m_MaxPlayers; unsigned int m_MaxPlayers;
std::unique_ptr<cChunkMap> m_ChunkMap; cChunkMap m_ChunkMap;
bool m_bAnimals; bool m_bAnimals;
std::set<eMonsterType> m_AllowedMobs; std::set<eMonsterType> m_AllowedMobs;