diff --git a/data/mods/default/init.lua b/data/mods/default/init.lua index bcd633b34..5ffed25ff 100644 --- a/data/mods/default/init.lua +++ b/data/mods/default/init.lua @@ -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) diff --git a/data/mods/experimental/init.lua b/data/mods/experimental/init.lua index ddc89f92c..c37488d04 100644 --- a/data/mods/experimental/init.lua +++ b/data/mods/experimental/init.lua @@ -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 diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 836f719a3..33079fd11 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -240,6 +240,7 @@ private: 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 @@ public: 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; igetToolCapabilities(m_gamedef->idef()); @@ -613,7 +621,6 @@ public: if(result.did_punch) { - // TODO: Decrease hp by if(result.damage < m_hp) m_hp -= result.damage; else @@ -623,6 +630,19 @@ public: 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<first<<"="<second<<", "; + } + os<<"}"; + return os.str(); + } }; // Prototype diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 0c105bb0f..02a4eb1eb 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -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<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( diff --git a/src/content_sao.h b/src/content_sao.h index 507631d2a..53e701d8c 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -71,6 +71,7 @@ public: 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 @@ private: v3f m_last_sent_velocity; float m_last_sent_position_timer; float m_last_sent_move_precision; + bool m_armor_groups_sent; }; #endif diff --git a/src/luaentity_common.h b/src/luaentity_common.h index b63663828..d12ec9f0e 100644 --- a/src/luaentity_common.h +++ b/src/luaentity_common.h @@ -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 diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index c3059ec55..541baa61c 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -2538,6 +2538,19 @@ private: 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