Add node on_construct, on_destruct callbacks and update lua_api.txt
parent
c4315a7afa
commit
fe8c5546f0
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue