mirror of
https://github.com/minetest/minetest.git
synced 2024-09-26 06:20:32 +02:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
94ae1a0e90
|
@ -57,11 +57,23 @@ minetest.register_entity("__builtin:item", {
|
|||
end,
|
||||
|
||||
get_staticdata = function(self)
|
||||
return self.itemstring
|
||||
--return self.itemstring
|
||||
return minetest.serialize({
|
||||
itemstring = self.itemstring,
|
||||
always_collect = self.always_collect,
|
||||
})
|
||||
end,
|
||||
|
||||
on_activate = function(self, staticdata)
|
||||
self.itemstring = staticdata
|
||||
if string.sub(staticdata, 1, string.len("return")) == "return" then
|
||||
local data = minetest.deserialize(staticdata)
|
||||
if data and type(data) == "table" then
|
||||
self.itemstring = data.itemstring
|
||||
self.always_collect = data.always_collect
|
||||
end
|
||||
else
|
||||
self.itemstring = staticdata
|
||||
end
|
||||
self.object:set_armor_groups({immortal=1})
|
||||
self.object:setvelocity({x=0, y=2, z=0})
|
||||
self.object:setacceleration({x=0, y=-10, z=0})
|
||||
|
|
|
@ -1087,6 +1087,7 @@ methods:
|
|||
- punch(puncher, time_from_last_punch, tool_capabilities, direction)
|
||||
^ puncher = an another ObjectRef,
|
||||
^ time_from_last_punch = time since last punch action of the puncher
|
||||
^ direction: can be nil
|
||||
- right_click(clicker); clicker = an another ObjectRef
|
||||
- get_hp(): returns number of hitpoints (2 * number of hearts)
|
||||
- set_hp(hp): set number of hitpoints (2 * number of hearts)
|
||||
|
@ -1236,7 +1237,7 @@ Entity definition (register_entity)
|
|||
|
||||
initial_properties = <initial object properties>,
|
||||
|
||||
on_activate = function(self, staticdata),
|
||||
on_activate = function(self, staticdata, dtime_s),
|
||||
on_step = function(self, dtime),
|
||||
on_punch = function(self, hitter),
|
||||
on_rightclick = function(self, clicker),
|
||||
|
@ -1420,6 +1421,11 @@ Node definition (register_node)
|
|||
on_metadata_inventory_take = func(pos, listname, index, stack, player),
|
||||
^ Called after the actual action has happened, according to what was allowed.
|
||||
^ No return value
|
||||
|
||||
on_blast = func(pos, intensity),
|
||||
^ intensity: 1.0 = mid range of regular TNT
|
||||
^ If defined, called when an explosion touches the node, instead of
|
||||
removing the node
|
||||
}
|
||||
|
||||
Recipe for register_craft: (shaped)
|
||||
|
|
|
@ -40,6 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "util/serialize.h"
|
||||
#include "util/mathconstants.h"
|
||||
#include "map.h"
|
||||
#include <IMeshManipulator.h>
|
||||
|
||||
class Settings;
|
||||
struct ToolCapabilities;
|
||||
|
@ -797,8 +798,15 @@ public:
|
|||
infostream<<"textures[0]: "<<m_prop.textures[0]<<std::endl;
|
||||
IItemDefManager *idef = m_gamedef->idef();
|
||||
ItemStack item(m_prop.textures[0], 1, 0, "", idef);
|
||||
scene::IMesh *mesh = item.getDefinition(idef).wield_mesh;
|
||||
scene::IMesh *item_mesh = item.getDefinition(idef).wield_mesh;
|
||||
|
||||
// Copy mesh to be able to set unique vertex colors
|
||||
scene::IMeshManipulator *manip =
|
||||
irr->getVideoDriver()->getMeshManipulator();
|
||||
scene::IMesh *mesh = manip->createMeshUniquePrimitives(item_mesh);
|
||||
|
||||
m_meshnode = smgr->addMeshSceneNode(mesh, NULL);
|
||||
mesh->drop();
|
||||
|
||||
m_meshnode->setScale(v3f(m_prop.visual_size.X/2,
|
||||
m_prop.visual_size.Y/2,
|
||||
|
@ -838,15 +846,17 @@ public:
|
|||
{
|
||||
bool is_visible = (m_hp != 0);
|
||||
u8 li = decode_light(light_at_pos);
|
||||
m_last_light = li;
|
||||
video::SColor color(255,li,li,li);
|
||||
if(m_meshnode){
|
||||
setMeshColor(m_meshnode->getMesh(), color);
|
||||
m_meshnode->setVisible(is_visible);
|
||||
}
|
||||
if(m_spritenode){
|
||||
m_spritenode->setColor(color);
|
||||
m_spritenode->setVisible(is_visible);
|
||||
if(li != m_last_light){
|
||||
m_last_light = li;
|
||||
video::SColor color(255,li,li,li);
|
||||
if(m_meshnode){
|
||||
setMeshColor(m_meshnode->getMesh(), color);
|
||||
m_meshnode->setVisible(is_visible);
|
||||
}
|
||||
if(m_spritenode){
|
||||
m_spritenode->setColor(color);
|
||||
m_spritenode->setVisible(is_visible);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -376,9 +376,9 @@ LuaEntitySAO::~LuaEntitySAO()
|
|||
}
|
||||
}
|
||||
|
||||
void LuaEntitySAO::addedToEnvironment()
|
||||
void LuaEntitySAO::addedToEnvironment(u32 dtime_s)
|
||||
{
|
||||
ServerActiveObject::addedToEnvironment();
|
||||
ServerActiveObject::addedToEnvironment(dtime_s);
|
||||
|
||||
// Create entity from name
|
||||
lua_State *L = m_env->getLua();
|
||||
|
@ -390,7 +390,7 @@ void LuaEntitySAO::addedToEnvironment()
|
|||
// Initialize HP from properties
|
||||
m_hp = m_prop.hp_max;
|
||||
// Activate entity, supplying serialized state
|
||||
scriptapi_luaentity_activate(L, m_id, m_init_state.c_str());
|
||||
scriptapi_luaentity_activate(L, m_id, m_init_state.c_str(), dtime_s);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -805,9 +805,9 @@ std::string PlayerSAO::getDescription()
|
|||
}
|
||||
|
||||
// Called after id has been set and has been inserted in environment
|
||||
void PlayerSAO::addedToEnvironment()
|
||||
void PlayerSAO::addedToEnvironment(u32 dtime_s)
|
||||
{
|
||||
ServerActiveObject::addedToEnvironment();
|
||||
ServerActiveObject::addedToEnvironment(dtime_s);
|
||||
ServerActiveObject::setBasePosition(m_player->getPosition());
|
||||
m_player->setPlayerSAO(this);
|
||||
m_player->peer_id = m_peer_id;
|
||||
|
|
|
@ -43,7 +43,7 @@ public:
|
|||
{ return ACTIVEOBJECT_TYPE_LUAENTITY; }
|
||||
u8 getSendType() const
|
||||
{ return ACTIVEOBJECT_TYPE_GENERIC; }
|
||||
virtual void addedToEnvironment();
|
||||
virtual void addedToEnvironment(u32 dtime_s);
|
||||
static ServerActiveObject* create(ServerEnvironment *env, v3f pos,
|
||||
const std::string &data);
|
||||
void step(float dtime, bool send_recommended);
|
||||
|
@ -118,7 +118,7 @@ public:
|
|||
Active object <-> environment interface
|
||||
*/
|
||||
|
||||
void addedToEnvironment();
|
||||
void addedToEnvironment(u32 dtime_s);
|
||||
void removingFromEnvironment();
|
||||
bool isStaticAllowed() const;
|
||||
bool unlimitedTransferDistance() const;
|
||||
|
|
|
@ -743,18 +743,24 @@ neighbor_found:
|
|||
u32 active_object_count = block->m_static_objects.m_active.size();
|
||||
// Find out how many objects this and all the neighbors contain
|
||||
u32 active_object_count_wider = 0;
|
||||
u32 wider_unknown_count = 0;
|
||||
for(s16 x=-1; x<=1; x++)
|
||||
for(s16 y=-1; y<=1; y++)
|
||||
for(s16 z=-1; z<=1; z++)
|
||||
{
|
||||
MapBlock *block2 = map->getBlockNoCreateNoEx(
|
||||
block->getPos() + v3s16(x,y,z));
|
||||
if(block2==NULL)
|
||||
if(block2==NULL){
|
||||
wider_unknown_count = 0;
|
||||
continue;
|
||||
}
|
||||
active_object_count_wider +=
|
||||
block2->m_static_objects.m_active.size()
|
||||
+ block2->m_static_objects.m_stored.size();
|
||||
}
|
||||
// Extrapolate
|
||||
u32 wider_known_count = 3*3*3 - wider_unknown_count;
|
||||
active_object_count_wider += wider_unknown_count * active_object_count_wider / wider_known_count;
|
||||
|
||||
// Call all the trigger variations
|
||||
i->abm->trigger(m_env, p, n);
|
||||
|
@ -784,7 +790,7 @@ void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime)
|
|||
<<dtime_s<<" seconds old."<<std::endl;*/
|
||||
|
||||
// Activate stored objects
|
||||
activateObjects(block);
|
||||
activateObjects(block, dtime_s);
|
||||
|
||||
// Run node timers
|
||||
std::map<v3s16, NodeTimer> elapsed_timers =
|
||||
|
@ -1243,7 +1249,7 @@ u16 getFreeServerActiveObjectId(
|
|||
u16 ServerEnvironment::addActiveObject(ServerActiveObject *object)
|
||||
{
|
||||
assert(object);
|
||||
u16 id = addActiveObjectRaw(object, true);
|
||||
u16 id = addActiveObjectRaw(object, true, 0);
|
||||
return id;
|
||||
}
|
||||
|
||||
|
@ -1402,7 +1408,7 @@ ActiveObjectMessage ServerEnvironment::getActiveObjectMessage()
|
|||
*/
|
||||
|
||||
u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
|
||||
bool set_changed)
|
||||
bool set_changed, u32 dtime_s)
|
||||
{
|
||||
assert(object);
|
||||
if(object->getId() == 0){
|
||||
|
@ -1442,7 +1448,7 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
|
|||
// Register reference in scripting api (must be done before post-init)
|
||||
scriptapi_add_object_reference(m_lua, object);
|
||||
// Post-initialize object
|
||||
object->addedToEnvironment();
|
||||
object->addedToEnvironment(dtime_s);
|
||||
|
||||
// Add static data to block
|
||||
if(object->isStaticAllowed())
|
||||
|
@ -1465,9 +1471,10 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
|
|||
"addActiveObjectRaw");
|
||||
}
|
||||
else{
|
||||
v3s16 p = floatToInt(objectpos, BS);
|
||||
errorstream<<"ServerEnvironment::addActiveObjectRaw(): "
|
||||
<<"could not find block for storing id="<<object->getId()
|
||||
<<" statically"<<std::endl;
|
||||
<<" statically (pos="<<PP(p)<<")"<<std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1578,7 +1585,7 @@ static void print_hexdump(std::ostream &o, const std::string &data)
|
|||
/*
|
||||
Convert stored objects from blocks near the players to active.
|
||||
*/
|
||||
void ServerEnvironment::activateObjects(MapBlock *block)
|
||||
void ServerEnvironment::activateObjects(MapBlock *block, u32 dtime_s)
|
||||
{
|
||||
if(block==NULL)
|
||||
return;
|
||||
|
@ -1602,7 +1609,7 @@ void ServerEnvironment::activateObjects(MapBlock *block)
|
|||
"large amount of objects");
|
||||
return;
|
||||
}
|
||||
// A list for objects that couldn't be converted to static for some
|
||||
// A list for objects that couldn't be converted to active for some
|
||||
// reason. They will be stored back.
|
||||
core::list<StaticObject> new_stored;
|
||||
// Loop through stored static objects
|
||||
|
@ -1632,7 +1639,7 @@ void ServerEnvironment::activateObjects(MapBlock *block)
|
|||
<<"activated static object pos="<<PP(s_obj.pos/BS)
|
||||
<<" type="<<(int)s_obj.type<<std::endl;
|
||||
// This will also add the object to the active static list
|
||||
addActiveObjectRaw(obj, false);
|
||||
addActiveObjectRaw(obj, false, dtime_s);
|
||||
}
|
||||
// Clear stored list
|
||||
block->m_static_objects.m_stored.clear();
|
||||
|
@ -1756,7 +1763,12 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete)
|
|||
// Add to the block where the object is located in
|
||||
v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS));
|
||||
// Get or generate the block
|
||||
MapBlock *block = m_map->emergeBlock(blockpos);
|
||||
MapBlock *block = NULL;
|
||||
try{
|
||||
block = m_map->emergeBlock(blockpos);
|
||||
} catch(InvalidPositionException &e){
|
||||
// Handled via NULL pointer
|
||||
}
|
||||
|
||||
if(block)
|
||||
{
|
||||
|
@ -1793,9 +1805,10 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete)
|
|||
}
|
||||
else{
|
||||
if(!force_delete){
|
||||
v3s16 p = floatToInt(objectpos, BS);
|
||||
errorstream<<"ServerEnv: Could not find or generate "
|
||||
<<"a block for storing id="<<obj->getId()
|
||||
<<" statically"<<std::endl;
|
||||
<<" statically (pos="<<PP(p)<<")"<<std::endl;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -2129,6 +2142,7 @@ void ClientEnvironment::step(float dtime)
|
|||
Step active objects and update lighting of them
|
||||
*/
|
||||
|
||||
bool update_lighting = m_active_object_light_update_interval.step(dtime, 0.21);
|
||||
for(core::map<u16, ClientActiveObject*>::Iterator
|
||||
i = m_active_objects.getIterator();
|
||||
i.atEnd()==false; i++)
|
||||
|
@ -2137,7 +2151,7 @@ void ClientEnvironment::step(float dtime)
|
|||
// Step object
|
||||
obj->step(dtime, this);
|
||||
|
||||
if(m_active_object_light_update_interval.step(dtime, 0.21))
|
||||
if(update_lighting)
|
||||
{
|
||||
// Update lighting
|
||||
u8 light = 0;
|
||||
|
|
|
@ -312,7 +312,7 @@ private:
|
|||
Returns the id of the object.
|
||||
Returns 0 if not added and thus deleted.
|
||||
*/
|
||||
u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed);
|
||||
u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed, u32 dtime_s);
|
||||
|
||||
/*
|
||||
Remove all objects that satisfy (m_removed && m_known_by_count==0)
|
||||
|
@ -322,7 +322,7 @@ private:
|
|||
/*
|
||||
Convert stored objects from block to active
|
||||
*/
|
||||
void activateObjects(MapBlock *block);
|
||||
void activateObjects(MapBlock *block, u32 dtime_s);
|
||||
|
||||
/*
|
||||
Convert objects that are not in active blocks to static.
|
||||
|
|
|
@ -2542,7 +2542,7 @@ private:
|
|||
return 0;
|
||||
}
|
||||
|
||||
// punch(self, puncher, tool_capabilities, direction, time_from_last_punch)
|
||||
// punch(self, puncher, time_from_last_punch, tool_capabilities, dir)
|
||||
static int l_punch(lua_State *L)
|
||||
{
|
||||
ObjectRef *ref = checkobject(L, 1);
|
||||
|
@ -2551,13 +2551,18 @@ private:
|
|||
ServerActiveObject *puncher = getobject(puncher_ref);
|
||||
if(co == NULL) return 0;
|
||||
if(puncher == NULL) return 0;
|
||||
ToolCapabilities toolcap = read_tool_capabilities(L, 3);
|
||||
v3f dir = read_v3f(L, 4);
|
||||
v3f dir;
|
||||
if(lua_type(L, 5) != LUA_TTABLE)
|
||||
dir = co->getBasePosition() - puncher->getBasePosition();
|
||||
else
|
||||
dir = read_v3f(L, 5);
|
||||
float time_from_last_punch = 1000000;
|
||||
if(lua_isnumber(L, 5))
|
||||
time_from_last_punch = lua_tonumber(L, 5);
|
||||
if(lua_isnumber(L, 3))
|
||||
time_from_last_punch = lua_tonumber(L, 3);
|
||||
ToolCapabilities toolcap = read_tool_capabilities(L, 4);
|
||||
dir.normalize();
|
||||
// Do it
|
||||
puncher->punch(dir, &toolcap, puncher, time_from_last_punch);
|
||||
co->punch(dir, &toolcap, puncher, time_from_last_punch);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -6478,7 +6483,7 @@ bool scriptapi_luaentity_add(lua_State *L, u16 id, const char *name)
|
|||
}
|
||||
|
||||
void scriptapi_luaentity_activate(lua_State *L, u16 id,
|
||||
const std::string &staticdata)
|
||||
const std::string &staticdata, u32 dtime_s)
|
||||
{
|
||||
realitycheck(L);
|
||||
assert(lua_checkstack(L, 20));
|
||||
|
@ -6496,8 +6501,9 @@ void scriptapi_luaentity_activate(lua_State *L, u16 id,
|
|||
luaL_checktype(L, -1, LUA_TFUNCTION);
|
||||
lua_pushvalue(L, object); // self
|
||||
lua_pushlstring(L, staticdata.c_str(), staticdata.size());
|
||||
// Call with 2 arguments, 0 results
|
||||
if(lua_pcall(L, 2, 0, 0))
|
||||
lua_pushinteger(L, dtime_s);
|
||||
// Call with 3 arguments, 0 results
|
||||
if(lua_pcall(L, 3, 0, 0))
|
||||
script_error(L, "error running function on_activate: %s\n",
|
||||
lua_tostring(L, -1));
|
||||
}
|
||||
|
|
|
@ -167,7 +167,7 @@ void scriptapi_detached_inventory_on_take(lua_State *L,
|
|||
// Returns true if succesfully added into Lua; false otherwise.
|
||||
bool scriptapi_luaentity_add(lua_State *L, u16 id, const char *name);
|
||||
void scriptapi_luaentity_activate(lua_State *L, u16 id,
|
||||
const std::string &staticdata);
|
||||
const std::string &staticdata, u32 dtime_s);
|
||||
void scriptapi_luaentity_rm(lua_State *L, u16 id);
|
||||
std::string scriptapi_luaentity_get_staticdata(lua_State *L, u16 id);
|
||||
void scriptapi_luaentity_get_properties(lua_State *L, u16 id,
|
||||
|
|
|
@ -62,7 +62,7 @@ public:
|
|||
{ return getType(); }
|
||||
|
||||
// Called after id has been set and has been inserted in environment
|
||||
virtual void addedToEnvironment(){};
|
||||
virtual void addedToEnvironment(u32 dtime_s){};
|
||||
// Called before removing from environment
|
||||
virtual void removingFromEnvironment(){};
|
||||
// Returns true if object's deletion is the job of the
|
||||
|
|
Loading…
Reference in New Issue
Block a user