summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattes D <github@xoft.cz>2016-03-01 17:25:45 +0100
committerMattes D <github@xoft.cz>2016-03-17 19:29:02 +0100
commitd0a04a7a82badcbfd694ccf0e9302b87f027abc2 (patch)
tree6f054f4b0948bba7a04f3e10c59ce3aad5f602c9
parentChanged plugin hook registrations to use cLuaState::cCallback. (diff)
downloadcuberite-d0a04a7a82badcbfd694ccf0e9302b87f027abc2.tar
cuberite-d0a04a7a82badcbfd694ccf0e9302b87f027abc2.tar.gz
cuberite-d0a04a7a82badcbfd694ccf0e9302b87f027abc2.tar.bz2
cuberite-d0a04a7a82badcbfd694ccf0e9302b87f027abc2.tar.lz
cuberite-d0a04a7a82badcbfd694ccf0e9302b87f027abc2.tar.xz
cuberite-d0a04a7a82badcbfd694ccf0e9302b87f027abc2.tar.zst
cuberite-d0a04a7a82badcbfd694ccf0e9302b87f027abc2.zip
-rw-r--r--Server/Plugins/Debuggers/Debuggers.lua4
-rw-r--r--src/Bindings/ManualBindings_World.cpp105
2 files changed, 40 insertions, 69 deletions
diff --git a/Server/Plugins/Debuggers/Debuggers.lua b/Server/Plugins/Debuggers/Debuggers.lua
index 422993932..b9d1d1e41 100644
--- a/Server/Plugins/Debuggers/Debuggers.lua
+++ b/Server/Plugins/Debuggers/Debuggers.lua
@@ -1876,8 +1876,8 @@ end
function HandleConsoleSchedule(a_Split)
local prev = os.clock()
- LOG("Scheduling a task for 2 seconds in the future (current os.clock is " .. prev .. ")")
- cRoot:Get():GetDefaultWorld():ScheduleTask(40,
+ LOG("Scheduling a task for 5 seconds in the future (current os.clock is " .. prev .. ")")
+ cRoot:Get():GetDefaultWorld():ScheduleTask(5 * 20,
function ()
local current = os.clock()
local diff = current - prev
diff --git a/src/Bindings/ManualBindings_World.cpp b/src/Bindings/ManualBindings_World.cpp
index 00d2169d8..3faf038aa 100644
--- a/src/Bindings/ManualBindings_World.cpp
+++ b/src/Bindings/ManualBindings_World.cpp
@@ -466,67 +466,41 @@ static int tolua_cWorld_PrepareChunk(lua_State * tolua_S)
-class cLuaWorldTask :
- public cPluginLua::cResettable
-{
-public:
- cLuaWorldTask(cPluginLua & a_Plugin, int a_FnRef) :
- cPluginLua::cResettable(a_Plugin),
- m_FnRef(a_FnRef)
- {
- }
-
- void Run(cWorld & a_World)
- {
- cCSLock Lock(m_CSPlugin);
- if (m_Plugin != nullptr)
- {
- m_Plugin->Call(m_FnRef, &a_World);
- }
- }
-
-protected:
- int m_FnRef;
-};
-
-
-
-
-
static int tolua_cWorld_QueueTask(lua_State * tolua_S)
{
- // Binding for cWorld::QueueTask
- // Params: function
+ // Function signature:
+ // World:QueueTask(Callback)
- // Retrieve the cPlugin from the LuaState:
- cPluginLua * Plugin = cManualBindings::GetLuaPlugin(tolua_S);
- if (Plugin == nullptr)
+ // Retrieve the args:
+ cLuaState L(tolua_S);
+ if (
+ !L.CheckParamUserType(1, "cWorld") ||
+ !L.CheckParamNumber (2) ||
+ !L.CheckParamFunction(3)
+ )
{
- // An error message has been already printed in GetLuaPlugin()
return 0;
}
-
- // Retrieve the args:
- cWorld * self = reinterpret_cast<cWorld *>(tolua_tousertype(tolua_S, 1, nullptr));
- if (self == nullptr)
+ cWorld * World;
+ auto Task = std::make_shared<cLuaState::cCallback>();
+ if (!L.GetStackValues(1, World, Task))
{
- return cManualBindings::lua_do_error(tolua_S, "Error in function call '#funcname#': Not called on an object instance");
+ return cManualBindings::lua_do_error(tolua_S, "Error in function call '#funcname#': Cannot read parameters");
}
- if (!lua_isfunction(tolua_S, 2))
+ if (World == nullptr)
{
- return cManualBindings::lua_do_error(tolua_S, "Error in function call '#funcname#': Expected a function for parameter #1");
+ return cManualBindings::lua_do_error(tolua_S, "Error in function call '#funcname#': Not called on an object instance");
}
-
- // Create a reference to the function:
- int FnRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
- if (FnRef == LUA_REFNIL)
+ if (!Task->IsValid())
{
- return cManualBindings::lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get function reference of parameter #1");
+ return cManualBindings::lua_do_error(tolua_S, "Error in function call '#funcname#': Could not store the callback parameter");
}
- auto ResettableTask = std::make_shared<cLuaWorldTask>(*Plugin, FnRef);
- Plugin->AddResettable(ResettableTask);
- self->QueueTask(std::bind(&cLuaWorldTask::Run, ResettableTask, std::placeholders::_1));
+ World->QueueTask([Task](cWorld & a_World)
+ {
+ Task->Call(&a_World);
+ }
+ );
return 0;
}
@@ -576,16 +550,8 @@ static int tolua_cWorld_SetSignLines(lua_State * tolua_S)
static int tolua_cWorld_ScheduleTask(lua_State * tolua_S)
{
- // Binding for cWorld::ScheduleTask
- // Params: function, Ticks
-
- // Retrieve the cPlugin from the LuaState:
- cPluginLua * Plugin = cManualBindings::GetLuaPlugin(tolua_S);
- if (Plugin == nullptr)
- {
- // An error message has been already printed in GetLuaPlugin()
- return 0;
- }
+ // Function signature:
+ // World:ScheduleTask(NumTicks, Callback)
// Retrieve the args:
cLuaState L(tolua_S);
@@ -597,22 +563,27 @@ static int tolua_cWorld_ScheduleTask(lua_State * tolua_S)
{
return 0;
}
- cWorld * World = reinterpret_cast<cWorld *>(tolua_tousertype(tolua_S, 1, nullptr));
+ cWorld * World;
+ int NumTicks;
+ auto Task = std::make_shared<cLuaState::cCallback>();
+ if (!L.GetStackValues(1, World, NumTicks, Task))
+ {
+ return cManualBindings::lua_do_error(tolua_S, "Error in function call '#funcname#': Cannot read parameters");
+ }
if (World == nullptr)
{
return cManualBindings::lua_do_error(tolua_S, "Error in function call '#funcname#': Not called on an object instance");
}
-
- // Create a reference to the function:
- int FnRef = luaL_ref(tolua_S, LUA_REGISTRYINDEX);
- if (FnRef == LUA_REFNIL)
+ if (!Task->IsValid())
{
- return cManualBindings::lua_do_error(tolua_S, "Error in function call '#funcname#': Could not get function reference of parameter #1");
+ return cManualBindings::lua_do_error(tolua_S, "Error in function call '#funcname#': Could not store the callback parameter");
}
- auto ResettableTask = std::make_shared<cLuaWorldTask>(*Plugin, FnRef);
- Plugin->AddResettable(ResettableTask);
- World->ScheduleTask(static_cast<int>(tolua_tonumber(tolua_S, 2, 0)), std::bind(&cLuaWorldTask::Run, ResettableTask, std::placeholders::_1));
+ World->ScheduleTask(NumTicks, [Task](cWorld & a_World)
+ {
+ Task->Call(&a_World);
+ }
+ );
return 0;
}