mirror of
https://github.com/minetest/minetest.git
synced 2024-08-18 20:44:16 +02: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
@ -69,3 +69,4 @@ core.registered_on_damage_taken, core.register_on_damage_taken = make_registrati
|
|||||||
core.registered_on_formspec_input, core.register_on_formspec_input = make_registration()
|
core.registered_on_formspec_input, core.register_on_formspec_input = make_registration()
|
||||||
core.registered_on_dignode, core.register_on_dignode = make_registration()
|
core.registered_on_dignode, core.register_on_dignode = make_registration()
|
||||||
core.registered_on_punchnode, core.register_on_punchnode = make_registration()
|
core.registered_on_punchnode, core.register_on_punchnode = make_registration()
|
||||||
|
core.registered_on_placenode, core.register_on_placenode = make_registration()
|
||||||
|
@ -10,6 +10,13 @@ core.register_on_connect(function()
|
|||||||
print("[PREVIEW] Player connection completed")
|
print("[PREVIEW] Player connection completed")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
core.register_on_placenode(function(pointed_thing, node)
|
||||||
|
print("The local player place a node!")
|
||||||
|
print("pointed_thing :" .. dump(pointed_thing))
|
||||||
|
print("node placed :" .. dump(node))
|
||||||
|
return false
|
||||||
|
end)
|
||||||
|
|
||||||
-- This is an example function to ensure it's working properly, should be removed before merge
|
-- This is an example function to ensure it's working properly, should be removed before merge
|
||||||
core.register_on_receiving_chat_messages(function(message)
|
core.register_on_receiving_chat_messages(function(message)
|
||||||
print("[PREVIEW] Received message " .. message)
|
print("[PREVIEW] Received message " .. message)
|
||||||
|
@ -667,6 +667,8 @@ Call these functions only at load time!
|
|||||||
* Called when the local player punches a node
|
* Called when the local player punches a node
|
||||||
* Newest functions are called first
|
* Newest functions are called first
|
||||||
* If any function returns true, the punch is ignored
|
* If any function returns true, the punch is ignored
|
||||||
|
* `minetest.register_on_placenode(function(pointed_thing, node))`
|
||||||
|
* Called when a node has been placed
|
||||||
### Sounds
|
### Sounds
|
||||||
* `minetest.sound_play(spec, parameters)`: returns a handle
|
* `minetest.sound_play(spec, parameters)`: returns a handle
|
||||||
* `spec` is a `SimpleSoundSpec`
|
* `spec` is a `SimpleSoundSpec`
|
||||||
|
@ -3730,6 +3730,9 @@ void Game::handlePointingAtNode(const PointedThing &pointed, const ItemDefinitio
|
|||||||
// Read the sound
|
// Read the sound
|
||||||
soundmaker->m_player_rightpunch_sound =
|
soundmaker->m_player_rightpunch_sound =
|
||||||
playeritem_def.sound_place;
|
playeritem_def.sound_place;
|
||||||
|
|
||||||
|
if (client->moddingEnabled())
|
||||||
|
client->getScript()->on_placenode(pointed, playeritem_def);
|
||||||
} else {
|
} else {
|
||||||
soundmaker->m_player_rightpunch_sound =
|
soundmaker->m_player_rightpunch_sound =
|
||||||
SimpleSoundSpec();
|
SimpleSoundSpec();
|
||||||
|
@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "porting.h"
|
#include "porting.h"
|
||||||
#include "mg_schematic.h"
|
#include "mg_schematic.h"
|
||||||
#include "noise.h"
|
#include "noise.h"
|
||||||
|
#include "util/pointedthing.h"
|
||||||
#include <json/json.h>
|
#include <json/json.h>
|
||||||
|
|
||||||
struct EnumString es_TileAnimationType[] =
|
struct EnumString es_TileAnimationType[] =
|
||||||
@ -117,6 +118,16 @@ void read_item_definition(lua_State* L, int index,
|
|||||||
def.node_placement_prediction);
|
def.node_placement_prediction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
void push_item_definition(lua_State *L, const ItemDefinition &i)
|
||||||
|
{
|
||||||
|
lua_newtable(L);
|
||||||
|
lua_pushstring(L, i.name.c_str());
|
||||||
|
lua_setfield(L, -2, "name");
|
||||||
|
lua_pushstring(L, i.description.c_str());
|
||||||
|
lua_setfield(L, -2, "description");
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
void read_object_properties(lua_State *L, int index,
|
void read_object_properties(lua_State *L, int index,
|
||||||
ObjectProperties *prop, IItemDefManager *idef)
|
ObjectProperties *prop, IItemDefManager *idef)
|
||||||
@ -1427,3 +1438,36 @@ void read_json_value(lua_State *L, Json::Value &root, int index, u8 recursion)
|
|||||||
}
|
}
|
||||||
lua_pop(L, 1); // Pop value
|
lua_pop(L, 1); // Pop value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void push_pointed_thing(lua_State *L, const PointedThing &pointed)
|
||||||
|
{
|
||||||
|
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");
|
||||||
|
push_objectRef(L, pointed.object_id);
|
||||||
|
lua_setfield(L, -2, "ref");
|
||||||
|
} else {
|
||||||
|
lua_pushstring(L, "nothing");
|
||||||
|
lua_setfield(L, -2, "type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void push_objectRef(lua_State *L, const 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
|
||||||
|
}
|
||||||
|
@ -88,6 +88,8 @@ void push_tool_capabilities (lua_State *L,
|
|||||||
|
|
||||||
void read_item_definition (lua_State *L, int index, const ItemDefinition &default_def,
|
void read_item_definition (lua_State *L, int index, const ItemDefinition &default_def,
|
||||||
ItemDefinition &def);
|
ItemDefinition &def);
|
||||||
|
void push_item_definition (lua_State *L,
|
||||||
|
const ItemDefinition &i);
|
||||||
void read_object_properties (lua_State *L, int index,
|
void read_object_properties (lua_State *L, int index,
|
||||||
ObjectProperties *prop,
|
ObjectProperties *prop,
|
||||||
IItemDefManager *idef);
|
IItemDefManager *idef);
|
||||||
@ -162,6 +164,10 @@ bool push_json_value (lua_State *L,
|
|||||||
void read_json_value (lua_State *L, Json::Value &root,
|
void read_json_value (lua_State *L, Json::Value &root,
|
||||||
int index, u8 recursion = 0);
|
int index, u8 recursion = 0);
|
||||||
|
|
||||||
|
void push_pointed_thing (lua_State *L, const PointedThing &pointed);
|
||||||
|
|
||||||
|
void push_objectRef (lua_State *L, const u16 id);
|
||||||
|
|
||||||
extern struct EnumString es_TileAnimationType[];
|
extern struct EnumString es_TileAnimationType[];
|
||||||
|
|
||||||
#endif /* C_CONTENT_H_ */
|
#endif /* C_CONTENT_H_ */
|
||||||
|
@ -42,6 +42,7 @@ extern "C" {
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
|
#include "script/common/c_content.h"
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
|
||||||
@ -320,22 +321,10 @@ void ScriptApiBase::objectrefGetOrCreate(lua_State *L,
|
|||||||
if (cobj == NULL || cobj->getId() == 0) {
|
if (cobj == NULL || cobj->getId() == 0) {
|
||||||
ObjectRef::create(L, cobj);
|
ObjectRef::create(L, cobj);
|
||||||
} else {
|
} 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()
|
Server* ScriptApiBase::getServer()
|
||||||
{
|
{
|
||||||
return dynamic_cast<Server *>(m_gamedef);
|
return dynamic_cast<Server *>(m_gamedef);
|
||||||
|
@ -115,7 +115,6 @@ protected:
|
|||||||
void setGuiEngine(GUIEngine* guiengine) { m_guiengine = guiengine; }
|
void setGuiEngine(GUIEngine* guiengine) { m_guiengine = guiengine; }
|
||||||
|
|
||||||
void objectrefGetOrCreate(lua_State *L, ServerActiveObject *cobj);
|
void objectrefGetOrCreate(lua_State *L, ServerActiveObject *cobj);
|
||||||
void objectrefGet(lua_State *L, u16 id);
|
|
||||||
|
|
||||||
RecursiveMutex m_luastackmutex;
|
RecursiveMutex m_luastackmutex;
|
||||||
std::string m_last_run_mod;
|
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 "client.h"
|
||||||
#include "common/c_converter.h"
|
#include "common/c_converter.h"
|
||||||
#include "common/c_content.h"
|
#include "common/c_content.h"
|
||||||
|
#include "s_item.h"
|
||||||
|
|
||||||
void ScriptApiClient::on_shutdown()
|
void ScriptApiClient::on_shutdown()
|
||||||
{
|
{
|
||||||
@ -189,6 +190,23 @@ bool ScriptApiClient::on_punchnode(v3s16 p, MapNode node)
|
|||||||
return blocked;
|
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)
|
void ScriptApiClient::setEnv(ClientEnvironment *env)
|
||||||
{
|
{
|
||||||
ScriptApiBase::setEnv(env);
|
ScriptApiBase::setEnv(env);
|
||||||
|
@ -21,8 +21,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#ifndef S_CLIENT_H_
|
#ifndef S_CLIENT_H_
|
||||||
#define S_CLIENT_H_
|
#define S_CLIENT_H_
|
||||||
|
|
||||||
|
#include "util/pointedthing.h"
|
||||||
#include "cpp_api/s_base.h"
|
#include "cpp_api/s_base.h"
|
||||||
#include "mapnode.h"
|
#include "mapnode.h"
|
||||||
|
#include "itemdef.h"
|
||||||
#include "util/string.h"
|
#include "util/string.h"
|
||||||
|
|
||||||
#ifdef _CRT_MSVCP_CURRENT
|
#ifdef _CRT_MSVCP_CURRENT
|
||||||
@ -51,6 +53,7 @@ public:
|
|||||||
|
|
||||||
bool on_dignode(v3s16 p, MapNode node);
|
bool on_dignode(v3s16 p, MapNode node);
|
||||||
bool on_punchnode(v3s16 p, MapNode node);
|
bool on_punchnode(v3s16 p, MapNode node);
|
||||||
|
bool on_placenode(const PointedThing &pointed, const ItemDefinition &item);
|
||||||
|
|
||||||
void setEnv(ClientEnvironment *env);
|
void setEnv(ClientEnvironment *env);
|
||||||
};
|
};
|
||||||
|
@ -57,7 +57,7 @@ bool ScriptApiEntity::luaentity_Add(u16 id, const char *name)
|
|||||||
|
|
||||||
// Add object reference
|
// Add object reference
|
||||||
// This should be userdata with metatable ObjectRef
|
// This should be userdata with metatable ObjectRef
|
||||||
objectrefGet(L, id);
|
push_objectRef(L, id);
|
||||||
luaL_checktype(L, -1, LUA_TUSERDATA);
|
luaL_checktype(L, -1, LUA_TUSERDATA);
|
||||||
if (!luaL_checkudata(L, -1, "ObjectRef"))
|
if (!luaL_checkudata(L, -1, "ObjectRef"))
|
||||||
luaL_typerror(L, -1, "ObjectRef");
|
luaL_typerror(L, -1, "ObjectRef");
|
||||||
|
@ -249,27 +249,6 @@ void ScriptApiItem::pushPointedThing(const PointedThing& pointed)
|
|||||||
{
|
{
|
||||||
lua_State* L = getStack();
|
lua_State* L = getStack();
|
||||||
|
|
||||||
lua_newtable(L);
|
push_pointed_thing(L, pointed);
|
||||||
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");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user