Add new "ForEach" function: ForEachLoadedChunk.
This commit is contained in:
parent
87489dc308
commit
6e86d20f73
@ -40,6 +40,7 @@ Taugeshtu
|
|||||||
tigerw (Tiger Wang)
|
tigerw (Tiger Wang)
|
||||||
tonibm19
|
tonibm19
|
||||||
UltraCoderRU
|
UltraCoderRU
|
||||||
|
Warmist
|
||||||
WebFreak001
|
WebFreak001
|
||||||
worktycho
|
worktycho
|
||||||
xoft (Mattes Dolak/madmaxoft on GH)
|
xoft (Mattes Dolak/madmaxoft on GH)
|
||||||
|
@ -110,6 +110,59 @@ static int tolua_cWorld_ChunkStay(lua_State * tolua_S)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int tolua_cWorld_ForEachLoadedChunk(lua_State * tolua_S)
|
||||||
|
{
|
||||||
|
// Exported manually, because tolua doesn't support converting functions to functor types.
|
||||||
|
// Function signature: ForEachLoadedChunk(callback) -> bool
|
||||||
|
|
||||||
|
cLuaState L(tolua_S);
|
||||||
|
if (
|
||||||
|
!L.CheckParamUserType(1, "cWorld") ||
|
||||||
|
!L.CheckParamFunction(2)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cPluginLua * Plugin = cManualBindings::GetLuaPlugin(tolua_S);
|
||||||
|
if (Plugin == nullptr)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the params:
|
||||||
|
cWorld * World = (cWorld *)tolua_tousertype(tolua_S, 1, nullptr);
|
||||||
|
if (World == nullptr)
|
||||||
|
{
|
||||||
|
LOGWARNING("World:ForEachLoadedChunk(): invalid world parameter");
|
||||||
|
L.LogStackTrace();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
cLuaState::cRef FnRef;
|
||||||
|
L.GetStackValues(2, FnRef);
|
||||||
|
if (!FnRef.IsValid())
|
||||||
|
{
|
||||||
|
return cManualBindings::lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get function reference of parameter #2");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the enumeration:
|
||||||
|
bool ret = World->ForEachLoadedChunk(
|
||||||
|
[&L, &FnRef](int a_ChunkX, int a_ChunkZ) -> bool
|
||||||
|
{
|
||||||
|
bool res = false; // By default continue the enumeration
|
||||||
|
L.Call(FnRef, a_ChunkX, a_ChunkZ, cLuaState::Return, res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Push the return value:
|
||||||
|
L.Push(ret);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int tolua_cWorld_GetBlockInfo(lua_State * tolua_S)
|
static int tolua_cWorld_GetBlockInfo(lua_State * tolua_S)
|
||||||
{
|
{
|
||||||
@ -580,6 +633,7 @@ void cManualBindings::BindWorld(lua_State * tolua_S)
|
|||||||
tolua_function(tolua_S, "ForEachEntityInChunk", ForEachInChunk<cWorld, cEntity, &cWorld::ForEachEntityInChunk>);
|
tolua_function(tolua_S, "ForEachEntityInChunk", ForEachInChunk<cWorld, cEntity, &cWorld::ForEachEntityInChunk>);
|
||||||
tolua_function(tolua_S, "ForEachFurnaceInChunk", ForEachInChunk<cWorld, cFurnaceEntity, &cWorld::ForEachFurnaceInChunk>);
|
tolua_function(tolua_S, "ForEachFurnaceInChunk", ForEachInChunk<cWorld, cFurnaceEntity, &cWorld::ForEachFurnaceInChunk>);
|
||||||
tolua_function(tolua_S, "ForEachPlayer", ForEach< cWorld, cPlayer, &cWorld::ForEachPlayer>);
|
tolua_function(tolua_S, "ForEachPlayer", ForEach< cWorld, cPlayer, &cWorld::ForEachPlayer>);
|
||||||
|
tolua_function(tolua_S, "ForEachLoadedChunk", tolua_cWorld_ForEachLoadedChunk);
|
||||||
tolua_function(tolua_S, "GetBlockInfo", tolua_cWorld_GetBlockInfo);
|
tolua_function(tolua_S, "GetBlockInfo", tolua_cWorld_GetBlockInfo);
|
||||||
tolua_function(tolua_S, "GetBlockTypeMeta", tolua_cWorld_GetBlockTypeMeta);
|
tolua_function(tolua_S, "GetBlockTypeMeta", tolua_cWorld_GetBlockTypeMeta);
|
||||||
tolua_function(tolua_S, "GetSignLines", tolua_cWorld_GetSignLines);
|
tolua_function(tolua_S, "GetSignLines", tolua_cWorld_GetSignLines);
|
||||||
|
@ -2576,6 +2576,34 @@ bool cChunkMap::ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinCh
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cChunkMap::ForEachLoadedChunk(std::function<bool(int, int)> a_Callback)
|
||||||
|
{
|
||||||
|
cCSLock Lock(m_CSLayers);
|
||||||
|
for (cChunkLayerList::const_iterator itr = m_Layers.begin(); itr != m_Layers.end(); ++itr) // iterate over ALL loaded layers
|
||||||
|
{
|
||||||
|
cChunkLayer * layer = *itr;
|
||||||
|
for (int x = 0; x < LAYER_SIZE; x++)
|
||||||
|
{
|
||||||
|
for (int z = 0; z < LAYER_SIZE; z++)
|
||||||
|
{
|
||||||
|
cChunkPtr p = layer->FindChunk(layer->GetX() * LAYER_SIZE + x, layer->GetZ() * LAYER_SIZE + z);
|
||||||
|
if ((p != nullptr) && p->IsValid()) // if chunk is loaded
|
||||||
|
{
|
||||||
|
if (a_Callback(p->GetPosX(), p->GetPosZ()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cChunkMap::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes)
|
bool cChunkMap::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes)
|
||||||
{
|
{
|
||||||
// Convert block coords to chunks coords:
|
// Convert block coords to chunks coords:
|
||||||
|
@ -345,6 +345,9 @@ public:
|
|||||||
/** Calls the callback for each chunk in the coords specified (all cords are inclusive). Returns true if all chunks have been processed successfully */
|
/** Calls the callback for each chunk in the coords specified (all cords are inclusive). Returns true if all chunks have been processed successfully */
|
||||||
bool ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback);
|
bool ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback);
|
||||||
|
|
||||||
|
/** Calls the callback for each loaded chunk. Returns true if all chunks have been processed successfully */
|
||||||
|
bool ForEachLoadedChunk(std::function<bool(int, int)> a_Callback);
|
||||||
|
|
||||||
/** Writes the block area into the specified coords. Returns true if all chunks have been processed. Prefer cBlockArea::Write() instead. */
|
/** Writes the block area into the specified coords. Returns true if all chunks have been processed. Prefer cBlockArea::Write() instead. */
|
||||||
bool WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes);
|
bool WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlockY, int a_MinBlockZ, int a_DataTypes);
|
||||||
|
|
||||||
|
@ -3140,6 +3140,15 @@ bool cWorld::ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunk
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cWorld::ForEachLoadedChunk(std::function<bool(int, int)> a_Callback)
|
||||||
|
{
|
||||||
|
return m_ChunkMap->ForEachLoadedChunk(a_Callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWorld::SaveAllChunks(void)
|
void cWorld::SaveAllChunks(void)
|
||||||
{
|
{
|
||||||
m_LastSave = std::chrono::duration_cast<cTickTimeLong>(m_WorldAge);
|
m_LastSave = std::chrono::duration_cast<cTickTimeLong>(m_WorldAge);
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#include "Blocks/BroadcastInterface.h"
|
#include "Blocks/BroadcastInterface.h"
|
||||||
#include "FastRandom.h"
|
#include "FastRandom.h"
|
||||||
#include "ClientHandle.h"
|
#include "ClientHandle.h"
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -434,6 +434,9 @@ public:
|
|||||||
/** Calls the callback for each chunk in the coords specified (all cords are inclusive). Returns true if all chunks have been processed successfully */
|
/** Calls the callback for each chunk in the coords specified (all cords are inclusive). Returns true if all chunks have been processed successfully */
|
||||||
virtual bool ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback) override;
|
virtual bool ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunkZ, int a_MaxChunkZ, cChunkDataCallback & a_Callback) override;
|
||||||
|
|
||||||
|
/** Calls the callback for each loaded chunk. Returns true if all chunks have been processed successfully */
|
||||||
|
bool ForEachLoadedChunk(std::function<bool(int, int)> a_Callback);
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/** Sets the block at the specified coords to the specified value.
|
/** Sets the block at the specified coords to the specified value.
|
||||||
|
Loading…
Reference in New Issue
Block a user