]> git.lizzy.rs Git - minetest.git/blobdiff - src/content_sao.cpp
Improve the look of fences
[minetest.git] / src / content_sao.cpp
index d01b023de069fa3b5e38be7847e309ccc50bc7b6..5b0dc3eb4739649f53b987f540f5fb5919e6ea65 100644 (file)
@@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "gamedef.h"
 #include "player.h"
 #include "scriptapi.h"
+#include "genericobject.h"
 
 core::map<u16, ServerActiveObject::Factory> ServerActiveObject::m_types;
 
@@ -351,6 +352,7 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos,
        m_velocity(0,0,0),
        m_acceleration(0,0,0),
        m_yaw(0),
+       m_properties_sent(true),
        m_last_sent_yaw(0),
        m_last_sent_position(0,0,0),
        m_last_sent_velocity(0,0,0),
@@ -434,6 +436,15 @@ ServerActiveObject* LuaEntitySAO::create(ServerEnvironment *env, v3f pos,
 
 void LuaEntitySAO::step(float dtime, bool send_recommended)
 {
+       if(!m_properties_sent)
+       {
+               m_properties_sent = true;
+               std::string str = getPropertyPacket();
+               // create message and add to list
+               ActiveObjectMessage aom(getId(), true, str);
+               m_messages_out.push_back(aom);
+       }
+
        m_last_sent_position_timer += dtime;
        
        if(m_prop->physical){
@@ -483,16 +494,10 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
 
        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);
-               }
+               std::string str = gob_cmd_update_armor_groups(
+                               m_armor_groups);
                // create message and add to list
-               ActiveObjectMessage aom(getId(), true, os.str());
+               ActiveObjectMessage aom(getId(), true, str);
                m_messages_out.push_back(aom);
        }
 }
@@ -500,18 +505,19 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
 std::string LuaEntitySAO::getClientInitializationData()
 {
        std::ostringstream os(std::ios::binary);
-       // version
-       writeU8(os, 1);
-       // pos
+       writeU8(os, 0); // version
+       os<<serializeString(""); // name
+       writeU8(os, 0); // is_player
        writeV3F1000(os, m_base_position);
-       // yaw
        writeF1000(os, m_yaw);
-       // hp
        writeS16(os, m_hp);
-       // properties
-       std::ostringstream prop_os(std::ios::binary);
-       m_prop->serialize(prop_os);
-       os<<serializeLongString(prop_os.str());
+       writeU8(os, 3); // number of messages stuffed in here
+       os<<serializeLongString(getPropertyPacket()); // message 1
+       os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
+       os<<serializeLongString(gob_cmd_set_sprite( // 3
+               m_prop->initial_sprite_basepos,
+               1, 1.0, false
+       ));
        // return result
        return os.str();
 }
@@ -574,15 +580,9 @@ int LuaEntitySAO::punch(v3f dir,
                                <<" hp, health now "<<getHP()<<" hp"<<std::endl;
                
                {
-                       std::ostringstream os(std::ios::binary);
-                       // command 
-                       writeU8(os, LUAENTITY_CMD_PUNCHED);
-                       // damage
-                       writeS16(os, result.damage);
-                       // result_hp
-                       writeS16(os, getHP());
+                       std::string str = gob_cmd_punched(result.damage, getHP());
                        // create message and add to list
-                       ActiveObjectMessage aom(getId(), true, os.str());
+                       ActiveObjectMessage aom(getId(), true, str);
                        m_messages_out.push_back(aom);
                }
 
@@ -605,17 +605,6 @@ void LuaEntitySAO::rightClick(ServerActiveObject *clicker)
        scriptapi_luaentity_rightclick(L, m_id, clicker);
 }
 
-void LuaEntitySAO::setHP(s16 hp)
-{
-       if(hp < 0) hp = 0;
-       m_hp = hp;
-}
-
-s16 LuaEntitySAO::getHP() const
-{
-       return m_hp;
-}
-
 void LuaEntitySAO::setPos(v3f pos)
 {
        m_base_position = pos;
@@ -645,6 +634,23 @@ std::string LuaEntitySAO::getDescription()
        return os.str();
 }
 
+void LuaEntitySAO::setHP(s16 hp)
+{
+       if(hp < 0) hp = 0;
+       m_hp = hp;
+}
+
+s16 LuaEntitySAO::getHP() const
+{
+       return m_hp;
+}
+
+void LuaEntitySAO::setArmorGroups(const ItemGroupList &armor_groups)
+{
+       m_armor_groups = armor_groups;
+       m_armor_groups_sent = false;
+}
+
 void LuaEntitySAO::setVelocity(v3f velocity)
 {
        m_velocity = velocity;
@@ -677,29 +683,23 @@ float LuaEntitySAO::getYaw()
 
 void LuaEntitySAO::setTextureMod(const std::string &mod)
 {
-       std::ostringstream os(std::ios::binary);
-       // command 
-       writeU8(os, LUAENTITY_CMD_SET_TEXTURE_MOD);
-       // parameters
-       os<<serializeString(mod);
+       std::string str = gob_cmd_set_texture_mod(mod);
        // create message and add to list
-       ActiveObjectMessage aom(getId(), false, os.str());
+       ActiveObjectMessage aom(getId(), true, str);
        m_messages_out.push_back(aom);
 }
 
 void LuaEntitySAO::setSprite(v2s16 p, int num_frames, float framelength,
                bool select_horiz_by_yawpitch)
 {
-       std::ostringstream os(std::ios::binary);
-       // command
-       writeU8(os, LUAENTITY_CMD_SET_SPRITE);
-       // parameters
-       writeV2S16(os, p);
-       writeU16(os, num_frames);
-       writeF1000(os, framelength);
-       writeU8(os, select_horiz_by_yawpitch);
+       std::string str = gob_cmd_set_sprite(
+               p,
+               num_frames,
+               framelength,
+               select_horiz_by_yawpitch
+       );
        // create message and add to list
-       ActiveObjectMessage aom(getId(), false, os.str());
+       ActiveObjectMessage aom(getId(), true, str);
        m_messages_out.push_back(aom);
 }
 
@@ -708,10 +708,20 @@ std::string LuaEntitySAO::getName()
        return m_init_name;
 }
 
-void LuaEntitySAO::setArmorGroups(const ItemGroupList &armor_groups)
+std::string LuaEntitySAO::getPropertyPacket()
 {
-       m_armor_groups = armor_groups;
-       m_armor_groups_sent = false;
+       return gob_cmd_set_properties(
+               m_prop->hp_max,
+               m_prop->physical,
+               m_prop->weight,
+               m_prop->collisionbox,
+               m_prop->visual,
+               m_prop->visual_size,
+               m_prop->textures,
+               m_prop->spritediv,
+               true, // is_visible
+               false // makes_footstep_sound
+       );
 }
 
 void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end)
@@ -726,28 +736,17 @@ void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end)
 
        float update_interval = m_env->getSendRecommendedInterval();
 
-       std::ostringstream os(std::ios::binary);
-       // command
-       writeU8(os, LUAENTITY_CMD_UPDATE_POSITION);
-
-       // do_interpolate
-       writeU8(os, do_interpolate);
-       // pos
-       writeV3F1000(os, m_base_position);
-       // velocity
-       writeV3F1000(os, m_velocity);
-       // acceleration
-       writeV3F1000(os, m_acceleration);
-       // yaw
-       writeF1000(os, m_yaw);
-       // is_end_position (for interpolation)
-       writeU8(os, is_movement_end);
-       // update_interval (for interpolation)
-       writeF1000(os, update_interval);
-
+       std::string str = gob_cmd_update_position(
+               m_base_position,
+               m_velocity,
+               m_acceleration,
+               m_yaw,
+               do_interpolate,
+               is_movement_end,
+               update_interval
+       );
        // create message and add to list
-       ActiveObjectMessage aom(getId(), false, os.str());
-       m_messages_out.push_back(aom);
+       ActiveObjectMessage aom(getId(), false, str);
 }
 
 /*
@@ -766,6 +765,8 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_):
        m_time_from_last_punch(0),
        m_wield_index(0),
        m_position_not_sent(false),
+       m_armor_groups_sent(false),
+       m_properties_sent(true),
        m_teleported(false),
        m_inventory_not_sent(false),
        m_hp_not_sent(false),
@@ -775,6 +776,8 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_):
        assert(m_peer_id != 0);
        setBasePosition(m_player->getPosition());
        m_inventory = &m_player->inventory;
+       m_armor_groups["choppy"] = 2;
+       m_armor_groups["fleshy"] = 3;
 }
 
 PlayerSAO::~PlayerSAO()
@@ -824,18 +827,15 @@ bool PlayerSAO::unlimitedTransferDistance() const
 std::string PlayerSAO::getClientInitializationData()
 {
        std::ostringstream os(std::ios::binary);
-       // version
-       writeU8(os, 0);
-       // name
-       os<<serializeString(m_player->getName());
-       // pos
-       writeV3F1000(os, m_player->getPosition());
-       // yaw
+       writeU8(os, 0); // version
+       os<<serializeString(m_player->getName()); // name
+       writeU8(os, 1); // is_player
+       writeV3F1000(os, m_player->getPosition() + v3f(0,BS*1,0));
        writeF1000(os, m_player->getYaw());
-       // dead
-       writeU8(os, getHP() == 0);
-       // wielded item
-       os<<serializeString(getWieldedItem().getItemString());
+       writeS16(os, getHP());
+       writeU8(os, 2); // number of messages stuffed in here
+       os<<serializeLongString(getPropertyPacket()); // message 1
+       os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
        return os.str();
 }
 
@@ -847,6 +847,15 @@ std::string PlayerSAO::getStaticData()
 
 void PlayerSAO::step(float dtime, bool send_recommended)
 {
+       if(!m_properties_sent)
+       {
+               m_properties_sent = true;
+               std::string str = getPropertyPacket();
+               // create message and add to list
+               ActiveObjectMessage aom(getId(), true, str);
+               m_messages_out.push_back(aom);
+       }
+
        m_time_from_last_punch += dtime;
 
        /*
@@ -892,30 +901,33 @@ void PlayerSAO::step(float dtime, bool send_recommended)
        if(m_position_not_sent)
        {
                m_position_not_sent = false;
-
-               std::ostringstream os(std::ios::binary);
-               // command (0 = update position)
-               writeU8(os, 0);
-               // pos
-               writeV3F1000(os, m_player->getPosition());
-               // yaw
-               writeF1000(os, m_player->getYaw());
+               float update_interval = m_env->getSendRecommendedInterval();
+               std::string str = gob_cmd_update_position(
+                       m_player->getPosition() + v3f(0,BS*1,0),
+                       v3f(0,0,0),
+                       v3f(0,0,0),
+                       m_player->getYaw(),
+                       true,
+                       false,
+                       update_interval
+               );
                // create message and add to list
-               ActiveObjectMessage aom(getId(), false, os.str());
+               ActiveObjectMessage aom(getId(), false, str);
                m_messages_out.push_back(aom);
        }
 
        if(m_wielded_item_not_sent)
        {
                m_wielded_item_not_sent = false;
+               // GenericCAO has no special way to show this
+       }
 
-               std::ostringstream os(std::ios::binary);
-               // command (3 = wielded item)
-               writeU8(os, 3);
-               // wielded item
-               os<<serializeString(getWieldedItem().getItemString());
+       if(m_armor_groups_sent == false){
+               m_armor_groups_sent = true;
+               std::string str = gob_cmd_update_armor_groups(
+                               m_armor_groups);
                // create message and add to list
-               ActiveObjectMessage aom(getId(), false, os.str());
+               ActiveObjectMessage aom(getId(), true, str);
                m_messages_out.push_back(aom);
        }
 }
@@ -956,16 +968,17 @@ int PlayerSAO::punch(v3f dir,
 
        // No effect if PvP disabled
        if(g_settings->getBool("enable_pvp") == false){
-               if(puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER)
+               if(puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER){
+                       std::string str = gob_cmd_punched(0, getHP());
+                       // create message and add to list
+                       ActiveObjectMessage aom(getId(), true, str);
+                       m_messages_out.push_back(aom);
                        return 0;
+               }
        }
 
-       // "Material" groups of the player
-       ItemGroupList groups;
-       groups["choppy"] = 2;
-       groups["fleshy"] = 3;
-
-       HitParams hitparams = getHitParams(groups, toolcap, time_from_last_punch);
+       HitParams hitparams = getHitParams(m_armor_groups, toolcap,
+                       time_from_last_punch);
 
        actionstream<<"Player "<<m_player->getName()<<" punched by "
                        <<puncher->getDescription()<<", damage "<<hitparams.hp
@@ -975,13 +988,9 @@ int PlayerSAO::punch(v3f dir,
 
        if(hitparams.hp != 0)
        {
-               std::ostringstream os(std::ios::binary);
-               // command (1 = punched)
-               writeU8(os, 1);
-               // damage
-               writeS16(os, hitparams.hp);
+               std::string str = gob_cmd_punched(hitparams.hp, getHP());
                // create message and add to list
-               ActiveObjectMessage aom(getId(), false, os.str());
+               ActiveObjectMessage aom(getId(), true, str);
                m_messages_out.push_back(aom);
        }
 
@@ -1020,17 +1029,21 @@ void PlayerSAO::setHP(s16 hp)
        // On death or reincarnation send an active object message
        if((hp == 0) != (oldhp == 0))
        {
-               std::ostringstream os(std::ios::binary);
-               // command (2 = update death state)
-               writeU8(os, 2);
-               // dead?
-               writeU8(os, hp == 0);
-               // create message and add to list
-               ActiveObjectMessage aom(getId(), false, os.str());
+               // Will send new is_visible value based on (getHP()!=0)
+               m_properties_sent = false;
+               // Send new HP
+               std::string str = gob_cmd_punched(0, getHP());
+               ActiveObjectMessage aom(getId(), true, str);
                m_messages_out.push_back(aom);
        }
 }
 
+void PlayerSAO::setArmorGroups(const ItemGroupList &armor_groups)
+{
+       m_armor_groups = armor_groups;
+       m_armor_groups_sent = false;
+}
+
 Inventory* PlayerSAO::getInventory()
 {
        return m_inventory;
@@ -1092,3 +1105,22 @@ void PlayerSAO::createCreativeInventory()
        scriptapi_get_creative_inventory(m_env->getLua(), this);
 }
 
+std::string PlayerSAO::getPropertyPacket()
+{
+       core::array<std::string> textures;
+       textures.push_back("player.png");
+       textures.push_back("player_back.png");
+       return gob_cmd_set_properties(
+               PLAYER_MAX_HP,
+               false,
+               75,
+               core::aabbox3d<f32>(-1/3.,-1.0,-1/3., 1/3.,1.0,1/3.),
+               "upright_sprite",
+               v2f(1, 2),
+               textures,
+               v2s16(1,1),
+               (getHP() != 0), // is_visible
+               true // makes_footstep_sound
+       );
+}
+