mirror of
https://github.com/minetest/minetest.git
synced 2024-12-24 15:12:23 +01:00
LuaEntity armor groups
This commit is contained in:
parent
8c01ad8a9d
commit
8db89b8136
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user