aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2012-03-09 20:46:56 +0200
committerPerttu Ahola <celeron55@gmail.com>2012-03-10 11:28:13 +0200
commit8db89b8136686a5721080d18e8a14f03404aa095 (patch)
treea6a87bc6a50b9ab2030930faae35ed22814c7669
parent8c01ad8a9da86fc76bc9a180ccab10ede726625a (diff)
downloadminetest-8db89b8136686a5721080d18e8a14f03404aa095.tar.gz
minetest-8db89b8136686a5721080d18e8a14f03404aa095.tar.bz2
minetest-8db89b8136686a5721080d18e8a14f03404aa095.zip
LuaEntity armor groups
-rw-r--r--data/mods/default/init.lua1
-rw-r--r--data/mods/experimental/init.lua3
-rw-r--r--src/content_cao.cpp28
-rw-r--r--src/content_sao.cpp24
-rw-r--r--src/content_sao.h2
-rw-r--r--src/luaentity_common.h1
-rw-r--r--src/scriptapi.cpp14
7 files changed, 67 insertions, 6 deletions
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; 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 @@ 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<<i->first<<"="<<i->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<<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(
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