summaryrefslogtreecommitdiffstats
path: root/src/WorldStorage
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@hotmail.co.uk>2016-08-20 14:34:29 +0200
committerTiger Wang <ziwei.tiger@hotmail.co.uk>2016-08-20 14:34:29 +0200
commit7175b9e435a54cff33914d21384625a445cc5cf0 (patch)
tree7feb44f1e8e4ed7ea4d5bf0ba1d173abd3417f34 /src/WorldStorage
parentAdded cWorld:SetSpawn() API and Lua binding (#3316) (diff)
downloadcuberite-7175b9e435a54cff33914d21384625a445cc5cf0.tar
cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.tar.gz
cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.tar.bz2
cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.tar.lz
cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.tar.xz
cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.tar.zst
cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.zip
Diffstat (limited to '')
-rwxr-xr-xsrc/WorldStorage/WSSAnvil.cpp115
-rw-r--r--src/WorldStorage/WorldStorage.cpp28
2 files changed, 79 insertions, 64 deletions
diff --git a/src/WorldStorage/WSSAnvil.cpp b/src/WorldStorage/WSSAnvil.cpp
index 4fc855589..d89ef5e67 100755
--- a/src/WorldStorage/WSSAnvil.cpp
+++ b/src/WorldStorage/WSSAnvil.cpp
@@ -459,7 +459,7 @@ bool cWSSAnvil::LoadChunkFromNBT(const cChunkCoords & a_Chunk, const cParsedNBT
} // for y
//*/
- cSetChunkDataPtr SetChunkData(new cSetChunkData(
+ auto SetChunkData(cSetChunkData(
a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ,
BlockTypes, MetaData,
IsLightValid ? BlockLight : nullptr,
@@ -495,7 +495,16 @@ bool cWSSAnvil::SaveChunkToNBT(const cChunkCoords & a_Chunk, cFastNBTWriter & a_
a_Writer.AddInt("zPos", a_Chunk.m_ChunkZ);
cNBTChunkSerializer Serializer(a_Writer);
- if (!m_World->GetChunkData(a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, Serializer))
+ bool DataRetrivalSucceeded;
+
+ m_World->QueueTask(
+ [&Serializer, &a_Chunk, &DataRetrivalSucceeded](cWorld & a_World)
+ {
+ DataRetrivalSucceeded = a_World.GetChunkData(a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, Serializer);
+ }
+ ).wait();
+
+ if (!DataRetrivalSucceeded)
{
LOGWARNING("Cannot get chunk [%d, %d] data for NBT saving", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ);
return false;
@@ -1642,7 +1651,7 @@ void cWSSAnvil::LoadBoatFromNBT(cEntityList & a_Entities, const cParsedNBT & a_N
{
return;
}
- a_Entities.push_back(Boat.release());
+ a_Entities.emplace_back(std::move(Boat));
}
@@ -1656,7 +1665,7 @@ void cWSSAnvil::LoadEnderCrystalFromNBT(cEntityList & a_Entities, const cParsedN
{
return;
}
- a_Entities.push_back(EnderCrystal.release());
+ a_Entities.emplace_back(std::move(EnderCrystal));
}
@@ -1681,7 +1690,7 @@ void cWSSAnvil::LoadFallingBlockFromNBT(cEntityList & a_Entities, const cParsedN
{
return;
}
- a_Entities.push_back(FallingBlock.release());
+ a_Entities.emplace_back(std::move(FallingBlock));
}
@@ -1695,7 +1704,7 @@ void cWSSAnvil::LoadMinecartRFromNBT(cEntityList & a_Entities, const cParsedNBT
{
return;
}
- a_Entities.push_back(Minecart.release());
+ a_Entities.emplace_back(std::move(Minecart));
}
@@ -1727,7 +1736,7 @@ void cWSSAnvil::LoadMinecartCFromNBT(cEntityList & a_Entities, const cParsedNBT
Minecart->SetSlot(a_NBT.GetByte(Slot), Item);
}
} // for itr - ItemDefs[]
- a_Entities.push_back(Minecart.release());
+ a_Entities.emplace_back(std::move(Minecart));
}
@@ -1744,7 +1753,7 @@ void cWSSAnvil::LoadMinecartFFromNBT(cEntityList & a_Entities, const cParsedNBT
// TODO: Load the Push and Fuel tags
- a_Entities.push_back(Minecart.release());
+ a_Entities.emplace_back(std::move(Minecart));
}
@@ -1761,7 +1770,7 @@ void cWSSAnvil::LoadMinecartTFromNBT(cEntityList & a_Entities, const cParsedNBT
// TODO: Everything to do with TNT carts
- a_Entities.push_back(Minecart.release());
+ a_Entities.emplace_back(std::move(Minecart));
}
@@ -1778,7 +1787,7 @@ void cWSSAnvil::LoadMinecartHFromNBT(cEntityList & a_Entities, const cParsedNBT
// TODO: Everything to do with hopper carts
- a_Entities.push_back(Minecart.release());
+ a_Entities.emplace_back(std::move(Minecart));
}
@@ -1812,7 +1821,7 @@ void cWSSAnvil::LoadPickupFromNBT(cEntityList & a_Entities, const cParsedNBT & a
Pickup->SetAge(a_NBT.GetShort(Age));
}
- a_Entities.push_back(Pickup.release());
+ a_Entities.emplace_back(std::move(Pickup));
}
@@ -1834,7 +1843,7 @@ void cWSSAnvil::LoadTNTFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NB
TNT->SetFuseTicks(static_cast<int>(a_NBT.GetByte(FuseTicks)));
}
- a_Entities.push_back(TNT.release());
+ a_Entities.emplace_back(std::move(TNT));
}
@@ -1863,7 +1872,7 @@ void cWSSAnvil::LoadExpOrbFromNBT(cEntityList & a_Entities, const cParsedNBT & a
ExpOrb->SetReward(a_NBT.GetShort(Reward));
}
- a_Entities.push_back(ExpOrb.release());
+ a_Entities.emplace_back(std::move(ExpOrb));
}
@@ -1928,7 +1937,7 @@ void cWSSAnvil::LoadItemFrameFromNBT(cEntityList & a_Entities, const cParsedNBT
ItemFrame->SetItemRotation(static_cast<Byte>(a_NBT.GetByte(Rotation)));
}
- a_Entities.push_back(ItemFrame.release());
+ a_Entities.emplace_back(std::move(ItemFrame));
}
@@ -1951,7 +1960,7 @@ void cWSSAnvil::LoadPaintingFromNBT(cEntityList & a_Entities, const cParsedNBT &
}
LoadHangingFromNBT(*Painting.get(), a_NBT, a_TagIdx);
- a_Entities.push_back(Painting.release());
+ a_Entities.emplace_back(std::move(Painting));
}
@@ -2022,7 +2031,7 @@ void cWSSAnvil::LoadArrowFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
}
// Store the new arrow in the entities list:
- a_Entities.push_back(Arrow.release());
+ a_Entities.emplace_back(std::move(Arrow));
}
@@ -2045,7 +2054,7 @@ void cWSSAnvil::LoadSplashPotionFromNBT(cEntityList & a_Entities, const cParsedN
SplashPotion->SetPotionColor(a_NBT.FindChildByName(a_TagIdx, "PotionName"));
// Store the new splash potion in the entities list:
- a_Entities.push_back(SplashPotion.release());
+ a_Entities.emplace_back(std::move(SplashPotion));
}
@@ -2061,7 +2070,7 @@ void cWSSAnvil::LoadSnowballFromNBT(cEntityList & a_Entities, const cParsedNBT &
}
// Store the new snowball in the entities list:
- a_Entities.push_back(Snowball.release());
+ a_Entities.emplace_back(std::move(Snowball));
}
@@ -2077,7 +2086,7 @@ void cWSSAnvil::LoadEggFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NB
}
// Store the new egg in the entities list:
- a_Entities.push_back(Egg.release());
+ a_Entities.emplace_back(std::move(Egg));
}
@@ -2093,7 +2102,7 @@ void cWSSAnvil::LoadFireballFromNBT(cEntityList & a_Entities, const cParsedNBT &
}
// Store the new fireball in the entities list:
- a_Entities.push_back(Fireball.release());
+ a_Entities.emplace_back(std::move(Fireball));
}
@@ -2109,7 +2118,7 @@ void cWSSAnvil::LoadFireChargeFromNBT(cEntityList & a_Entities, const cParsedNBT
}
// Store the new FireCharge in the entities list:
- a_Entities.push_back(FireCharge.release());
+ a_Entities.emplace_back(std::move(FireCharge));
}
@@ -2125,7 +2134,7 @@ void cWSSAnvil::LoadThrownEnderpearlFromNBT(cEntityList & a_Entities, const cPar
}
// Store the new enderpearl in the entities list:
- a_Entities.push_back(Enderpearl.release());
+ a_Entities.emplace_back(std::move(Enderpearl));
}
@@ -2145,7 +2154,7 @@ void cWSSAnvil::LoadBatFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NB
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2165,7 +2174,7 @@ void cWSSAnvil::LoadBlazeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2185,7 +2194,7 @@ void cWSSAnvil::LoadCaveSpiderFromNBT(cEntityList & a_Entities, const cParsedNBT
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2205,7 +2214,7 @@ void cWSSAnvil::LoadChickenFromNBT(cEntityList & a_Entities, const cParsedNBT &
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2225,7 +2234,7 @@ void cWSSAnvil::LoadCowFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NB
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2245,7 +2254,7 @@ void cWSSAnvil::LoadCreeperFromNBT(cEntityList & a_Entities, const cParsedNBT &
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2265,7 +2274,7 @@ void cWSSAnvil::LoadEnderDragonFromNBT(cEntityList & a_Entities, const cParsedNB
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2285,7 +2294,7 @@ void cWSSAnvil::LoadEndermanFromNBT(cEntityList & a_Entities, const cParsedNBT &
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2305,7 +2314,7 @@ void cWSSAnvil::LoadGhastFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2325,7 +2334,7 @@ void cWSSAnvil::LoadGiantFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2345,7 +2354,7 @@ void cWSSAnvil::LoadGuardianFromNBT(cEntityList & a_Entities, const cParsedNBT &
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2391,7 +2400,7 @@ void cWSSAnvil::LoadHorseFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
Monster->SetAge(Age);
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2411,7 +2420,7 @@ void cWSSAnvil::LoadIronGolemFromNBT(cEntityList & a_Entities, const cParsedNBT
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2440,7 +2449,7 @@ void cWSSAnvil::LoadMagmaCubeFromNBT(cEntityList & a_Entities, const cParsedNBT
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2460,7 +2469,7 @@ void cWSSAnvil::LoadMooshroomFromNBT(cEntityList & a_Entities, const cParsedNBT
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2493,7 +2502,7 @@ void cWSSAnvil::LoadOcelotFromNBT(cEntityList & a_Entities, const cParsedNBT & a
Monster->SetAge(Age);
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2526,7 +2535,7 @@ void cWSSAnvil::LoadPigFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NB
Monster->SetAge(Age);
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2570,7 +2579,7 @@ void cWSSAnvil::LoadRabbitFromNBT(cEntityList & a_Entities, const cParsedNBT & a
Monster->SetAge(Age);
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2616,7 +2625,7 @@ void cWSSAnvil::LoadSheepFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
Monster->SetAge(Age);
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2636,7 +2645,7 @@ void cWSSAnvil::LoadSilverfishFromNBT(cEntityList & a_Entities, const cParsedNBT
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2664,7 +2673,7 @@ void cWSSAnvil::LoadSkeletonFromNBT(cEntityList & a_Entities, const cParsedNBT &
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2693,7 +2702,7 @@ void cWSSAnvil::LoadSlimeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2713,7 +2722,7 @@ void cWSSAnvil::LoadSnowGolemFromNBT(cEntityList & a_Entities, const cParsedNBT
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2733,7 +2742,7 @@ void cWSSAnvil::LoadSpiderFromNBT(cEntityList & a_Entities, const cParsedNBT & a
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2753,7 +2762,7 @@ void cWSSAnvil::LoadSquidFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2795,7 +2804,7 @@ void cWSSAnvil::LoadVillagerFromNBT(cEntityList & a_Entities, const cParsedNBT &
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2815,7 +2824,7 @@ void cWSSAnvil::LoadWitchFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
return;
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2841,7 +2850,7 @@ void cWSSAnvil::LoadWitherFromNBT(cEntityList & a_Entities, const cParsedNBT & a
Monster->SetWitherInvulnerableTicks(static_cast<unsigned int>(a_NBT.GetInt(CurrLine)));
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2908,7 +2917,7 @@ void cWSSAnvil::LoadWolfFromNBT(cEntityList & a_Entities, const cParsedNBT & a_N
Monster->SetAge(Age);
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2949,7 +2958,7 @@ void cWSSAnvil::LoadZombieFromNBT(cEntityList & a_Entities, const cParsedNBT & a
Monster->SetAge(Age);
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
@@ -2982,7 +2991,7 @@ void cWSSAnvil::LoadPigZombieFromNBT(cEntityList & a_Entities, const cParsedNBT
Monster->SetAge(Age);
}
- a_Entities.push_back(Monster.release());
+ a_Entities.emplace_back(std::move(Monster));
}
diff --git a/src/WorldStorage/WorldStorage.cpp b/src/WorldStorage/WorldStorage.cpp
index 55555d731..7c7bb4bfd 100644
--- a/src/WorldStorage/WorldStorage.cpp
+++ b/src/WorldStorage/WorldStorage.cpp
@@ -156,6 +156,7 @@ void cWorldStorage::QueueSaveChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallba
{
ASSERT(m_World->IsChunkValid(a_ChunkX, a_ChunkZ));
+ m_World->MarkChunkSaving(a_ChunkX, a_ChunkZ);
m_SaveQueue.EnqueueItem(cChunkCoordsWithCallback(a_ChunkX, a_ChunkZ, a_Callback));
m_Event.Set();
}
@@ -259,16 +260,18 @@ bool cWorldStorage::SaveOneChunk(void)
return false;
}
- // Save the chunk, if it's valid:
+ cChunkCoords SaveCoordinates(ToSave.m_ChunkX, ToSave.m_ChunkZ);
bool Status = false;
- if (m_World->IsChunkValid(ToSave.m_ChunkX, ToSave.m_ChunkZ))
+
+ // Save the chunk; validity is checked inside a cWorld task:
+ if (m_SaveSchema->SaveChunk(SaveCoordinates))
{
- m_World->MarkChunkSaving(ToSave.m_ChunkX, ToSave.m_ChunkZ);
- if (m_SaveSchema->SaveChunk(cChunkCoords(ToSave.m_ChunkX, ToSave.m_ChunkZ)))
- {
- m_World->MarkChunkSaved(ToSave.m_ChunkX, ToSave.m_ChunkZ);
- Status = true;
- }
+ Status = true;
+ m_World->QueueTask([SaveCoordinates](cWorld & a_World)
+ {
+ a_World.MarkChunkSaved(SaveCoordinates.m_ChunkX, SaveCoordinates.m_ChunkZ);
+ }
+ );
}
// Call the callback, if specified:
@@ -285,8 +288,6 @@ bool cWorldStorage::SaveOneChunk(void)
bool cWorldStorage::LoadChunk(int a_ChunkX, int a_ChunkZ)
{
- ASSERT(m_World->IsChunkQueued(a_ChunkX, a_ChunkZ));
-
cChunkCoords Coords(a_ChunkX, a_ChunkZ);
// First try the schema that is used for saving
@@ -305,7 +306,12 @@ bool cWorldStorage::LoadChunk(int a_ChunkX, int a_ChunkZ)
}
// Notify the chunk owner that the chunk failed to load (sets cChunk::m_HasLoadFailed to true):
- m_World->ChunkLoadFailed(a_ChunkX, a_ChunkZ);
+ m_World->QueueTask(
+ [a_ChunkX, a_ChunkZ](cWorld & a_World)
+ {
+ a_World.ChunkLoadFailed(a_ChunkX, a_ChunkZ);
+ }
+ );
return false;
}