Add node on_construct, on_destruct callbacks and update lua_api.txt

This commit is contained in:
Perttu Ahola 2012-06-01 17:24:54 +03:00
parent c4315a7afa
commit fe8c5546f0
3 changed files with 77 additions and 15 deletions

@ -775,18 +775,13 @@ methods:
- get_owner() - get_owner()
- set_owner(string) - set_owner(string)
Generic node metadata specific: Generic node metadata specific:
- set_infotext(infotext)
- get_inventory() -> InvRef
- set_inventory_draw_spec(string)
- set_allow_text_input(bool)
- set_allow_removal(bool)
- set_enforce_owner(bool)
- is_inventory_modified()
- reset_inventory_modified()
- is_text_modified()
- reset_text_modified()
- set_string(name, value) - set_string(name, value)
- get_string(name) - get_string(name)
- set_int(name, value)
- get_int(name)
- set_float(name, value)
- get_float(name)
- get_inventory() -> InvRef
ObjectRef: Moving things in the game are generally these ObjectRef: Moving things in the game are generally these
(basically reference to a C++ ServerActiveObject) (basically reference to a C++ ServerActiveObject)
@ -983,9 +978,13 @@ Item definition (register_node, register_craftitem, register_tool)
choppy={times={[3]=0.90}, maxwear=0.05, maxlevel=0} choppy={times={[3]=0.90}, maxwear=0.05, maxlevel=0}
} }
} }
on_drop = func(itemstack, dropper, pos),
on_place = func(itemstack, placer, pointed_thing), on_place = func(itemstack, placer, pointed_thing),
^ default: minetest.item_place
on_drop = func(itemstack, dropper, pos),
^ default: minetest.item_drop
on_use = func(itemstack, user, pointed_thing), on_use = func(itemstack, user, pointed_thing),
^ default: nil
^ Function must return either nil if no item shall be removed from ^ Function must return either nil if no item shall be removed from
inventory, or an itemstack to replace the original itemstack. inventory, or an itemstack to replace the original itemstack.
eg. itemstack:take_item(); return itemstack eg. itemstack:take_item(); return itemstack
@ -1032,6 +1031,19 @@ Node definition (register_node)
dig = <SimpleSoundSpec>, -- "__group" = group-based sound (default) dig = <SimpleSoundSpec>, -- "__group" = group-based sound (default)
dug = <SimpleSoundSpec>, dug = <SimpleSoundSpec>,
}, },
on_construct = func(pos),
^ Node constructor; always called after adding node
^ Can set up metadata and stuff like that
on_destruct = func(pos),
^ Node destructor; always called before removing node
on_punch = func(pos, node, puncher),
^ default: minetest.node_punch
^ By default: does nothing
on_dig = func(pos, node, digger),
^ default: minetest.node_dig
^ By default: checks privileges, wears out tool and removes node
} }
Recipe: (register_craft) Recipe: (register_craft)

@ -2978,8 +2978,15 @@ private:
// content // content
MapNode n = readnode(L, 3, env->getGameDef()->ndef()); MapNode n = readnode(L, 3, env->getGameDef()->ndef());
// Do it // Do it
// Call destructor
MapNode n_old = env->getMap().getNodeNoEx(pos);
scriptapi_node_on_destruct(L, pos, n_old);
// Replace node
bool succeeded = env->getMap().addNodeWithEvent(pos, n); bool succeeded = env->getMap().addNodeWithEvent(pos, n);
lua_pushboolean(L, succeeded); lua_pushboolean(L, succeeded);
// Call constructor
if(succeeded)
scriptapi_node_on_construct(L, pos, n);
return 1; return 1;
} }
@ -2999,8 +3006,13 @@ private:
// pos // pos
v3s16 pos = read_v3s16(L, 2); v3s16 pos = read_v3s16(L, 2);
// Do it // Do it
// Call destructor
MapNode n = env->getMap().getNodeNoEx(pos);
scriptapi_node_on_destruct(L, pos, n);
// Replace with air
bool succeeded = env->getMap().removeNodeWithEvent(pos); bool succeeded = env->getMap().removeNodeWithEvent(pos);
lua_pushboolean(L, succeeded); lua_pushboolean(L, succeeded);
// Air doesn't require constructor
return 1; return 1;
} }
@ -4881,7 +4893,7 @@ bool scriptapi_item_on_use(lua_State *L, ItemStack &item,
return true; return true;
} }
bool scriptapi_node_on_punch(lua_State *L, v3s16 pos, MapNode node, bool scriptapi_node_on_punch(lua_State *L, v3s16 p, MapNode node,
ServerActiveObject *puncher) ServerActiveObject *puncher)
{ {
realitycheck(L); realitycheck(L);
@ -4895,7 +4907,7 @@ bool scriptapi_node_on_punch(lua_State *L, v3s16 pos, MapNode node,
return false; return false;
// Call function // Call function
push_v3s16(L, pos); push_v3s16(L, p);
pushnode(L, node, ndef); pushnode(L, node, ndef);
objectref_get_or_create(L, puncher); objectref_get_or_create(L, puncher);
if(lua_pcall(L, 3, 0, 0)) if(lua_pcall(L, 3, 0, 0))
@ -4903,7 +4915,7 @@ bool scriptapi_node_on_punch(lua_State *L, v3s16 pos, MapNode node,
return true; return true;
} }
bool scriptapi_node_on_dig(lua_State *L, v3s16 pos, MapNode node, bool scriptapi_node_on_dig(lua_State *L, v3s16 p, MapNode node,
ServerActiveObject *digger) ServerActiveObject *digger)
{ {
realitycheck(L); realitycheck(L);
@ -4917,7 +4929,7 @@ bool scriptapi_node_on_dig(lua_State *L, v3s16 pos, MapNode node,
return false; return false;
// Call function // Call function
push_v3s16(L, pos); push_v3s16(L, p);
pushnode(L, node, ndef); pushnode(L, node, ndef);
objectref_get_or_create(L, digger); objectref_get_or_create(L, digger);
if(lua_pcall(L, 3, 0, 0)) if(lua_pcall(L, 3, 0, 0))
@ -4925,6 +4937,42 @@ bool scriptapi_node_on_dig(lua_State *L, v3s16 pos, MapNode node,
return true; return true;
} }
void scriptapi_node_on_construct(lua_State *L, v3s16 p, MapNode node)
{
realitycheck(L);
assert(lua_checkstack(L, 20));
StackUnroller stack_unroller(L);
INodeDefManager *ndef = get_server(L)->ndef();
// Push callback function on stack
if(!get_item_callback(L, ndef->get(node).name.c_str(), "on_construct"))
return;
// Call function
push_v3s16(L, p);
if(lua_pcall(L, 1, 0, 0))
script_error(L, "error: %s", lua_tostring(L, -1));
}
void scriptapi_node_on_destruct(lua_State *L, v3s16 p, MapNode node)
{
realitycheck(L);
assert(lua_checkstack(L, 20));
StackUnroller stack_unroller(L);
INodeDefManager *ndef = get_server(L)->ndef();
// Push callback function on stack
if(!get_item_callback(L, ndef->get(node).name.c_str(), "on_destruct"))
return;
// Call function
push_v3s16(L, p);
if(lua_pcall(L, 1, 0, 0))
script_error(L, "error: %s", lua_tostring(L, -1));
}
/* /*
environment environment
*/ */

@ -81,6 +81,8 @@ bool scriptapi_node_on_punch(lua_State *L, v3s16 p, MapNode node,
ServerActiveObject *puncher); ServerActiveObject *puncher);
bool scriptapi_node_on_dig(lua_State *L, v3s16 p, MapNode node, bool scriptapi_node_on_dig(lua_State *L, v3s16 p, MapNode node,
ServerActiveObject *digger); ServerActiveObject *digger);
void scriptapi_node_on_construct(lua_State *L, v3s16 p, MapNode node);
void scriptapi_node_on_destruct(lua_State *L, v3s16 p, MapNode node);
/* luaentity */ /* luaentity */
// Returns true if succesfully added into Lua; false otherwise. // Returns true if succesfully added into Lua; false otherwise.