mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Add reasons to on_dieplayer and on_hpchange
This commit is contained in:
parent
2323842dd3
commit
dfc8198349
14 changed files with 219 additions and 52 deletions
|
@ -43,6 +43,7 @@ extern "C" {
|
|||
#include <cstdio>
|
||||
#include <cstdarg>
|
||||
#include "script/common/c_content.h"
|
||||
#include "content_sao.h"
|
||||
#include <sstream>
|
||||
|
||||
|
||||
|
@ -151,7 +152,7 @@ void ScriptApiBase::clientOpenLibs(lua_State *L)
|
|||
{ LUA_JITLIBNAME, luaopen_jit },
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
for (const std::pair<std::string, lua_CFunction> &lib : m_libs) {
|
||||
lua_pushcfunction(L, lib.second);
|
||||
lua_pushstring(L, lib.first.c_str());
|
||||
|
@ -381,6 +382,26 @@ void ScriptApiBase::objectrefGetOrCreate(lua_State *L,
|
|||
}
|
||||
}
|
||||
|
||||
void ScriptApiBase::pushPlayerHPChangeReason(lua_State *L, const PlayerHPChangeReason &reason)
|
||||
{
|
||||
if (reason.lua_reference >= 0) {
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, reason.lua_reference);
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, reason.lua_reference);
|
||||
} else
|
||||
lua_newtable(L);
|
||||
|
||||
lua_pushstring(L, reason.getTypeAsString().c_str());
|
||||
lua_setfield(L, -2, "type");
|
||||
|
||||
lua_pushstring(L, reason.from_mod ? "mod" : "engine");
|
||||
lua_setfield(L, -2, "from");
|
||||
|
||||
if (reason.object) {
|
||||
objectrefGetOrCreate(L, reason.object);
|
||||
lua_setfield(L, -2, "object");
|
||||
}
|
||||
}
|
||||
|
||||
Server* ScriptApiBase::getServer()
|
||||
{
|
||||
return dynamic_cast<Server *>(m_gamedef);
|
||||
|
|
|
@ -72,6 +72,7 @@ class IGameDef;
|
|||
class Environment;
|
||||
class GUIEngine;
|
||||
class ServerActiveObject;
|
||||
class PlayerHPChangeReason;
|
||||
|
||||
class ScriptApiBase {
|
||||
public:
|
||||
|
@ -139,6 +140,8 @@ protected:
|
|||
|
||||
void objectrefGetOrCreate(lua_State *L, ServerActiveObject *cobj);
|
||||
|
||||
void pushPlayerHPChangeReason(lua_State *L, const PlayerHPChangeReason& reason);
|
||||
|
||||
std::recursive_mutex m_luastackmutex;
|
||||
std::string m_last_run_mod;
|
||||
bool m_secure = false;
|
||||
|
|
|
@ -36,16 +36,20 @@ void ScriptApiPlayer::on_newplayer(ServerActiveObject *player)
|
|||
runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
|
||||
}
|
||||
|
||||
void ScriptApiPlayer::on_dieplayer(ServerActiveObject *player)
|
||||
void ScriptApiPlayer::on_dieplayer(ServerActiveObject *player, const PlayerHPChangeReason &reason)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
// Get core.registered_on_dieplayers
|
||||
// Get callback table
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "registered_on_dieplayers");
|
||||
// Call callbacks
|
||||
|
||||
// Push arguments
|
||||
objectrefGetOrCreate(L, player);
|
||||
runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
|
||||
pushPlayerHPChangeReason(L, reason);
|
||||
|
||||
// Run callbacks
|
||||
runCallbacks(2, RUN_CALLBACKS_MODE_FIRST);
|
||||
}
|
||||
|
||||
bool ScriptApiPlayer::on_punchplayer(ServerActiveObject *player,
|
||||
|
@ -71,7 +75,7 @@ bool ScriptApiPlayer::on_punchplayer(ServerActiveObject *player,
|
|||
}
|
||||
|
||||
s16 ScriptApiPlayer::on_player_hpchange(ServerActiveObject *player,
|
||||
s16 hp_change)
|
||||
s16 hp_change, const PlayerHPChangeReason &reason)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
|
@ -82,9 +86,13 @@ s16 ScriptApiPlayer::on_player_hpchange(ServerActiveObject *player,
|
|||
lua_getfield(L, -1, "registered_on_player_hpchange");
|
||||
lua_remove(L, -2);
|
||||
|
||||
// Push arguments
|
||||
objectrefGetOrCreate(L, player);
|
||||
lua_pushnumber(L, hp_change);
|
||||
PCALL_RES(lua_pcall(L, 2, 1, error_handler));
|
||||
pushPlayerHPChangeReason(L, reason);
|
||||
|
||||
// Call callbacks
|
||||
PCALL_RES(lua_pcall(L, 3, 1, error_handler));
|
||||
hp_change = lua_tointeger(L, -1);
|
||||
lua_pop(L, 2); // Pop result and error handler
|
||||
return hp_change;
|
||||
|
|
|
@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "util/string.h"
|
||||
|
||||
struct ToolCapabilities;
|
||||
struct PlayerHPChangeReason;
|
||||
|
||||
class ScriptApiPlayer : virtual public ScriptApiBase
|
||||
{
|
||||
|
@ -31,7 +32,7 @@ public:
|
|||
virtual ~ScriptApiPlayer() = default;
|
||||
|
||||
void on_newplayer(ServerActiveObject *player);
|
||||
void on_dieplayer(ServerActiveObject *player);
|
||||
void on_dieplayer(ServerActiveObject *player, const PlayerHPChangeReason &reason);
|
||||
bool on_respawnplayer(ServerActiveObject *player);
|
||||
bool on_prejoinplayer(const std::string &name, const std::string &ip,
|
||||
std::string *reason);
|
||||
|
@ -42,7 +43,8 @@ public:
|
|||
bool on_punchplayer(ServerActiveObject *player, ServerActiveObject *hitter,
|
||||
float time_from_last_punch, const ToolCapabilities *toolcap,
|
||||
v3f dir, s16 damage);
|
||||
s16 on_player_hpchange(ServerActiveObject *player, s16 hp_change);
|
||||
s16 on_player_hpchange(ServerActiveObject *player, s16 hp_change,
|
||||
const PlayerHPChangeReason &reason);
|
||||
void on_playerReceiveFields(ServerActiveObject *player,
|
||||
const std::string &formname, const StringMap &fields);
|
||||
void on_auth_failure(const std::string &name, const std::string &ip);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue