mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
[CSM] Add event on_place_node API lua (#5548)
* [CSM] Add event on_place_node API lua
This commit is contained in:
parent
ecf08255b0
commit
dc5bc6cac7
12 changed files with 88 additions and 37 deletions
|
@ -42,6 +42,7 @@ extern "C" {
|
|||
|
||||
#include <stdio.h>
|
||||
#include <cstdarg>
|
||||
#include "script/common/c_content.h"
|
||||
#include <sstream>
|
||||
|
||||
|
||||
|
@ -320,22 +321,10 @@ void ScriptApiBase::objectrefGetOrCreate(lua_State *L,
|
|||
if (cobj == NULL || cobj->getId() == 0) {
|
||||
ObjectRef::create(L, cobj);
|
||||
} else {
|
||||
objectrefGet(L, cobj->getId());
|
||||
push_objectRef(L, cobj->getId());
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptApiBase::objectrefGet(lua_State *L, u16 id)
|
||||
{
|
||||
// Get core.object_refs[i]
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "object_refs");
|
||||
luaL_checktype(L, -1, LUA_TTABLE);
|
||||
lua_pushnumber(L, id);
|
||||
lua_gettable(L, -2);
|
||||
lua_remove(L, -2); // object_refs
|
||||
lua_remove(L, -2); // core
|
||||
}
|
||||
|
||||
Server* ScriptApiBase::getServer()
|
||||
{
|
||||
return dynamic_cast<Server *>(m_gamedef);
|
||||
|
|
|
@ -115,7 +115,6 @@ protected:
|
|||
void setGuiEngine(GUIEngine* guiengine) { m_guiengine = guiengine; }
|
||||
|
||||
void objectrefGetOrCreate(lua_State *L, ServerActiveObject *cobj);
|
||||
void objectrefGet(lua_State *L, u16 id);
|
||||
|
||||
RecursiveMutex m_luastackmutex;
|
||||
std::string m_last_run_mod;
|
||||
|
|
|
@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "client.h"
|
||||
#include "common/c_converter.h"
|
||||
#include "common/c_content.h"
|
||||
#include "s_item.h"
|
||||
|
||||
void ScriptApiClient::on_shutdown()
|
||||
{
|
||||
|
@ -189,6 +190,23 @@ bool ScriptApiClient::on_punchnode(v3s16 p, MapNode node)
|
|||
return blocked;
|
||||
}
|
||||
|
||||
bool ScriptApiClient::on_placenode(const PointedThing &pointed, const ItemDefinition &item)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
// Get core.registered_on_placenode
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "registered_on_placenode");
|
||||
|
||||
// Push data
|
||||
push_pointed_thing(L, pointed);
|
||||
push_item_definition(L, item);
|
||||
|
||||
// Call functions
|
||||
runCallbacks(2, RUN_CALLBACKS_MODE_OR);
|
||||
return lua_toboolean(L, -1);
|
||||
}
|
||||
|
||||
void ScriptApiClient::setEnv(ClientEnvironment *env)
|
||||
{
|
||||
ScriptApiBase::setEnv(env);
|
||||
|
|
|
@ -21,8 +21,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#ifndef S_CLIENT_H_
|
||||
#define S_CLIENT_H_
|
||||
|
||||
#include "util/pointedthing.h"
|
||||
#include "cpp_api/s_base.h"
|
||||
#include "mapnode.h"
|
||||
#include "itemdef.h"
|
||||
#include "util/string.h"
|
||||
|
||||
#ifdef _CRT_MSVCP_CURRENT
|
||||
|
@ -51,6 +53,7 @@ public:
|
|||
|
||||
bool on_dignode(v3s16 p, MapNode node);
|
||||
bool on_punchnode(v3s16 p, MapNode node);
|
||||
bool on_placenode(const PointedThing &pointed, const ItemDefinition &item);
|
||||
|
||||
void setEnv(ClientEnvironment *env);
|
||||
};
|
||||
|
|
|
@ -57,7 +57,7 @@ bool ScriptApiEntity::luaentity_Add(u16 id, const char *name)
|
|||
|
||||
// Add object reference
|
||||
// This should be userdata with metatable ObjectRef
|
||||
objectrefGet(L, id);
|
||||
push_objectRef(L, id);
|
||||
luaL_checktype(L, -1, LUA_TUSERDATA);
|
||||
if (!luaL_checkudata(L, -1, "ObjectRef"))
|
||||
luaL_typerror(L, -1, "ObjectRef");
|
||||
|
|
|
@ -249,27 +249,6 @@ void ScriptApiItem::pushPointedThing(const PointedThing& pointed)
|
|||
{
|
||||
lua_State* L = getStack();
|
||||
|
||||
lua_newtable(L);
|
||||
if(pointed.type == POINTEDTHING_NODE)
|
||||
{
|
||||
lua_pushstring(L, "node");
|
||||
lua_setfield(L, -2, "type");
|
||||
push_v3s16(L, pointed.node_undersurface);
|
||||
lua_setfield(L, -2, "under");
|
||||
push_v3s16(L, pointed.node_abovesurface);
|
||||
lua_setfield(L, -2, "above");
|
||||
}
|
||||
else if(pointed.type == POINTEDTHING_OBJECT)
|
||||
{
|
||||
lua_pushstring(L, "object");
|
||||
lua_setfield(L, -2, "type");
|
||||
objectrefGet(L, pointed.object_id);
|
||||
lua_setfield(L, -2, "ref");
|
||||
}
|
||||
else
|
||||
{
|
||||
lua_pushstring(L, "nothing");
|
||||
lua_setfield(L, -2, "type");
|
||||
}
|
||||
push_pointed_thing(L, pointed);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue