CSM: Implement register_globalstep

* Re-use fatal error mechanism from server to disconnect client on CSM error
* Little client functions cleanups
This commit is contained in:
Loic Blot 2017-01-22 11:55:40 +01:00
parent 22b3e09a97
commit f0154c7912
9 changed files with 51 additions and 6 deletions

View File

@ -1,6 +1,6 @@
-- This is an example function to ensure it's working properly, should be removed before merge
core.register_on_shutdown(function()
print("shutdown client")
print("[PREVIEW] shutdown client")
end)
-- This is an example function to ensure it's working properly, should be removed before merge
@ -15,17 +15,25 @@ core.register_on_sending_chat_messages(function(message)
return false
end)
-- This is an example function to ensure it's working properly, should be removed before merge
core.register_on_hp_modification(function(hp)
print("[PREVIEW] HP modified " .. hp)
end)
-- This is an example function to ensure it's working properly, should be removed before merge
core.register_on_damage_taken(function(hp)
print("[PREVIEW] Damage taken " .. hp)
end)
-- This is an example function to ensure it's working properly, should be removed before merge
core.register_globalstep(function(dtime)
-- print("[PREVIEW] globalstep " .. dtime)
end)
-- This is an example function to ensure it's working properly, should be removed before merge
core.register_chatcommand("dump", {
func = function(name, param)
return true, dump(_G)
end,
})

View File

@ -55,6 +55,7 @@ local function make_registration()
return t, registerfunc
end
core.registered_globalsteps, core.register_globalstep = make_registration()
core.registered_on_shutdown, core.register_on_shutdown = make_registration()
core.registered_on_receiving_chat_messages, core.register_on_receiving_chat_messages = make_registration()
core.registered_on_sending_chat_messages, core.register_on_sending_chat_messages = make_registration()

View File

@ -678,6 +678,8 @@ Helper functions
### Global callback registration functions
Call these functions only at load time!
* `minetest.register_globalstep(func(dtime))`
* Called every client environment step, usually interval of 0.1s
* `minetest.register_on_shutdown(func())`
* Called before client shutdown
* **Warning**: If the client terminates abnormally (i.e. crashes), the registered

View File

@ -263,6 +263,7 @@ Client::Client(
g_settings->getBool("enable_parallax_occlusion"));
m_script = new ClientScripting(this);
m_env.setScript(m_script);
}
void Client::initMods()

View File

@ -488,13 +488,19 @@ public:
// Get event from queue. CE_NONE is returned if queue is empty.
ClientEvent getClientEvent();
bool accessDenied()
{ return m_access_denied; }
bool accessDenied() const { return m_access_denied; }
bool reconnectRequested() { return m_access_denied_reconnect; }
bool reconnectRequested() const { return m_access_denied_reconnect; }
std::string accessDeniedReason()
{ return m_access_denied_reason; }
void setFatalError(const std::string &reason)
{
m_access_denied = true;
m_access_denied_reason = reason;
}
// Renaming accessDeniedReason to better name could be good as it's used to
// disconnect client when CSM failed.
const std::string &accessDeniedReason() const { return m_access_denied_reason; }
bool itemdefReceived()
{ return m_itemdef_received; }

View File

@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "clientenvironment.h"
#include "clientsimpleobject.h"
#include "clientmap.h"
#include "clientscripting.h"
#include "mapblock_mesh.h"
#include "event.h"
#include "collision.h"
@ -42,6 +43,7 @@ ClientEnvironment::ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr,
m_smgr(smgr),
m_texturesource(texturesource),
m_client(client),
m_script(NULL),
m_irr(irr)
{
char zero = 0;
@ -243,6 +245,8 @@ void ClientEnvironment::step(float dtime)
}
}
m_script->environment_step(dtime);
/*
A quick draft of lava damage
*/

View File

@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
class ClientSimpleObject;
class ClientMap;
class ClientScripting;
class ClientActiveObject;
class GenericCAO;
class LocalPlayer;
@ -75,6 +76,7 @@ public:
ClientMap & getClientMap();
Client *getGameDef() { return m_client; }
void setScript(ClientScripting *script) { m_script = script; }
void step(f32 dtime);
@ -176,6 +178,7 @@ private:
scene::ISceneManager *m_smgr;
ITextureSource *m_texturesource;
Client *m_client;
ClientScripting *m_script;
IrrlichtDevice *m_irr;
UNORDERED_MAP<u16, ClientActiveObject*> m_active_objects;
std::vector<ClientSimpleObject*> m_simple_objects;

View File

@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "s_client.h"
#include "s_internal.h"
#include "client.h"
void ScriptApiClient::on_shutdown()
{
@ -94,3 +95,20 @@ void ScriptApiClient::on_death()
// Call callbacks
runCallbacks(0, RUN_CALLBACKS_MODE_FIRST);
}
void ScriptApiClient::environment_step(float dtime)
{
SCRIPTAPI_PRECHECKHEADER
// Get core.registered_globalsteps
lua_getglobal(L, "core");
lua_getfield(L, -1, "registered_globalsteps");
// Call callbacks
lua_pushnumber(L, dtime);
try {
runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
} catch (LuaError &e) {
getClient()->setFatalError(std::string("Client environment_step: ") + e.what() + "\n"
+ script_get_backtrace(L));
}
}

View File

@ -36,5 +36,7 @@ public:
void on_damage_taken(int32_t damage_amount);
void on_hp_modification(int32_t newhp);
void on_death();
void environment_step(float dtime);
};
#endif