Skip to content

Commit

Permalink
[CSM] Add event on_place_node API lua (#5548)
Browse files Browse the repository at this point in the history
* [CSM] Add event on_place_node API lua
  • Loading branch information
Dumbeldor authored and nerzhul committed Apr 29, 2017
1 parent ecf0825 commit dc5bc6c
Show file tree
Hide file tree
Showing 12 changed files with 88 additions and 37 deletions.
1 change: 1 addition & 0 deletions builtin/client/register.lua
Expand Up @@ -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_dignode, core.register_on_dignode = make_registration()
core.registered_on_punchnode, core.register_on_punchnode = make_registration()
core.registered_on_placenode, core.register_on_placenode = make_registration()
7 changes: 7 additions & 0 deletions clientmods/preview/init.lua
Expand Up @@ -10,6 +10,13 @@ core.register_on_connect(function()
print("[PREVIEW] Player connection completed")
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
core.register_on_receiving_chat_messages(function(message)
print("[PREVIEW] Received message " .. message)
Expand Down
2 changes: 2 additions & 0 deletions doc/client_lua_api.md
Expand Up @@ -667,6 +667,8 @@ Call these functions only at load time!
* Called when the local player punches a node
* Newest functions are called first
* 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
* `minetest.sound_play(spec, parameters)`: returns a handle
* `spec` is a `SimpleSoundSpec`
Expand Down
3 changes: 3 additions & 0 deletions src/game.cpp
Expand Up @@ -3730,6 +3730,9 @@ void Game::handlePointingAtNode(const PointedThing &pointed, const ItemDefinitio
// Read the sound
soundmaker->m_player_rightpunch_sound =
playeritem_def.sound_place;

if (client->moddingEnabled())
client->getScript()->on_placenode(pointed, playeritem_def);
} else {
soundmaker->m_player_rightpunch_sound =
SimpleSoundSpec();
Expand Down
44 changes: 44 additions & 0 deletions src/script/common/c_content.cpp
Expand Up @@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "porting.h"
#include "mg_schematic.h"
#include "noise.h"
#include "util/pointedthing.h"
#include <json/json.h>

struct EnumString es_TileAnimationType[] =
Expand Down Expand Up @@ -117,6 +118,16 @@ void read_item_definition(lua_State* L, int index,
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,
ObjectProperties *prop, IItemDefManager *idef)
Expand Down Expand Up @@ -1427,3 +1438,36 @@ void read_json_value(lua_State *L, Json::Value &root, int index, u8 recursion)
}
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
}
6 changes: 6 additions & 0 deletions src/script/common/c_content.h
Expand Up @@ -88,6 +88,8 @@ void push_tool_capabilities (lua_State *L,

void read_item_definition (lua_State *L, int index, const ItemDefinition &default_def,
ItemDefinition &def);
void push_item_definition (lua_State *L,
const ItemDefinition &i);
void read_object_properties (lua_State *L, int index,
ObjectProperties *prop,
IItemDefManager *idef);
Expand Down Expand Up @@ -162,6 +164,10 @@ bool push_json_value (lua_State *L,
void read_json_value (lua_State *L, Json::Value &root,
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[];

#endif /* C_CONTENT_H_ */
15 changes: 2 additions & 13 deletions src/script/cpp_api/s_base.cpp
Expand Up @@ -42,6 +42,7 @@ extern "C" {

#include <stdio.h>
#include <cstdarg>
#include "script/common/c_content.h"
#include <sstream>


Expand Down Expand Up @@ -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);
Expand Down
1 change: 0 additions & 1 deletion src/script/cpp_api/s_base.h
Expand Up @@ -115,7 +115,6 @@ class ScriptApiBase {
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;
Expand Down
18 changes: 18 additions & 0 deletions src/script/cpp_api/s_client.cpp
Expand Up @@ -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()
{
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions src/script/cpp_api/s_client.h
Expand Up @@ -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
Expand Down Expand Up @@ -51,6 +53,7 @@ class ScriptApiClient : virtual public ScriptApiBase

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);
};
Expand Down
2 changes: 1 addition & 1 deletion src/script/cpp_api/s_entity.cpp
Expand Up @@ -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");
Expand Down
23 changes: 1 addition & 22 deletions src/script/cpp_api/s_item.cpp
Expand Up @@ -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);
}

0 comments on commit dc5bc6c

Please sign in to comment.