LuaEntity armor groups

This commit is contained in:
Perttu Ahola 2012-03-09 20:46:56 +02:00
parent 8c01ad8a9d
commit 8db89b8136
7 changed files with 67 additions and 6 deletions

View File

@ -225,6 +225,7 @@
-- - select_horiz_by_yawpitch=false)
-- - ^ Select sprite from spritesheet with optional animation and DM-style
-- - texture selection based on yaw relative to camera
-- - set_armor_groups({group1=rating, group2=rating, ...})
-- - get_entity_name() (DEPRECATED: Will be removed in a future version)
-- - get_luaentity()
-- Player-only: (no-op for other objects)

View File

@ -330,6 +330,7 @@ function TNT:on_activate(staticdata)
self.object:setvelocity({x=0, y=4, z=0})
self.object:setacceleration({x=0, y=-10, z=0})
self.object:settexturemod("^[brighten")
self.object:set_armor_groups({foo=1,bar=2})
end
-- Called periodically
@ -355,7 +356,7 @@ function TNT:on_punch(hitter)
if self.health <= 0 then
self.object:remove()
hitter:get_inventory():add_item("main", "experimental:tnt")
hitter:set_hp(hitter:get_hp() - 1)
--hitter:set_hp(hitter:get_hp() - 1)
end
end

View File

@ -240,6 +240,7 @@ class LuaEntityCAO : public ClientActiveObject
int m_anim_num_frames;
float m_anim_framelength;
float m_anim_timer;
ItemGroupList m_armor_groups;
public:
LuaEntityCAO(IGameDef *gamedef, ClientEnvironment *env):
@ -594,14 +595,21 @@ class LuaEntityCAO : public ClientActiveObject
m_hp = result_hp;
// TODO: Execute defined fast response
}
else if(cmd == LUAENTITY_CMD_UPDATE_ARMOR_GROUPS)
{
m_armor_groups.clear();
int armor_groups_size = readU16(is);
for(int i=0; i<armor_groups_size; i++){
std::string name = deSerializeString(is);
int rating = readS16(is);
m_armor_groups[name] = rating;
}
}
}
bool directReportPunch(v3f dir, const ItemStack *punchitem=NULL,
float time_from_last_punch=1000000)
{
// TODO: Transfer this from the server
ItemGroupList m_armor_groups;
assert(punchitem);
const ToolCapabilities *toolcap =
&punchitem->getToolCapabilities(m_gamedef->idef());
@ -613,7 +621,6 @@ class LuaEntityCAO : public ClientActiveObject
if(result.did_punch)
{
// TODO: Decrease hp by
if(result.damage < m_hp)
m_hp -= result.damage;
else
@ -623,6 +630,19 @@ class LuaEntityCAO : public ClientActiveObject
return false;
}
std::string debugInfoText()
{
std::ostringstream os(std::ios::binary);
os<<"LuaEntityCAO \n";
os<<"armor={";
for(ItemGroupList::const_iterator i = m_armor_groups.begin();
i != m_armor_groups.end(); i++){
os<<i->first<<"="<<i->second<<", ";
}
os<<"}";
return os.str();
}
};
// Prototype

View File

@ -354,7 +354,8 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos,
m_last_sent_position(0,0,0),
m_last_sent_velocity(0,0,0),
m_last_sent_position_timer(0),
m_last_sent_move_precision(0)
m_last_sent_move_precision(0),
m_armor_groups_sent(false)
{
// Only register type if no environment supplied
if(env == NULL){
@ -475,6 +476,21 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
fabs(m_yaw - m_last_sent_yaw) > 1.0){
sendPosition(true, false);
}
if(m_armor_groups_sent == false){
m_armor_groups_sent = true;
std::ostringstream os(std::ios::binary);
writeU8(os, LUAENTITY_CMD_UPDATE_ARMOR_GROUPS);
writeU16(os, m_armor_groups.size());
for(ItemGroupList::const_iterator i = m_armor_groups.begin();
i != m_armor_groups.end(); i++){
os<<serializeString(i->first);
writeS16(os, i->second);
}
// create message and add to list
ActiveObjectMessage aom(getId(), true, os.str());
m_messages_out.push_back(aom);
}
}
std::string LuaEntitySAO::getClientInitializationData()
@ -685,6 +701,12 @@ std::string LuaEntitySAO::getName()
return m_init_name;
}
void LuaEntitySAO::setArmorGroups(const ItemGroupList &armor_groups)
{
m_armor_groups = armor_groups;
m_armor_groups_sent = false;
}
void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end)
{
m_last_sent_move_precision = m_base_position.getDistanceFrom(

View File

@ -71,6 +71,7 @@ class LuaEntitySAO : public ServerActiveObject
void setSprite(v2s16 p, int num_frames, float framelength,
bool select_horiz_by_yawpitch);
std::string getName();
void setArmorGroups(const ItemGroupList &armor_groups);
private:
void sendPosition(bool do_interpolate, bool is_movement_end);
@ -90,6 +91,7 @@ class LuaEntitySAO : public ServerActiveObject
v3f m_last_sent_velocity;
float m_last_sent_position_timer;
float m_last_sent_move_precision;
bool m_armor_groups_sent;
};
#endif

View File

@ -47,6 +47,7 @@ struct LuaEntityProperties
#define LUAENTITY_CMD_SET_TEXTURE_MOD 1
#define LUAENTITY_CMD_SET_SPRITE 2
#define LUAENTITY_CMD_PUNCHED 3
#define LUAENTITY_CMD_UPDATE_ARMOR_GROUPS 4
#endif

View File

@ -2538,6 +2538,19 @@ class ObjectRef
return 0;
}
// set_armor_groups(self, groups)
static int l_set_armor_groups(lua_State *L)
{
ObjectRef *ref = checkobject(L, 1);
LuaEntitySAO *co = getluaobject(ref);
if(co == NULL) return 0;
// Do it
ItemGroupList groups;
read_groups(L, 2, groups);
co->setArmorGroups(groups);
return 0;
}
// DEPRECATED
// get_entity_name(self)
static int l_get_entity_name(lua_State *L)
@ -2700,6 +2713,7 @@ const luaL_reg ObjectRef::methods[] = {
method(ObjectRef, getyaw),
method(ObjectRef, settexturemod),
method(ObjectRef, setsprite),
method(ObjectRef, set_armor_groups),
method(ObjectRef, get_entity_name),
method(ObjectRef, get_luaentity),
// Player-only