]> git.lizzy.rs Git - minetest.git/blobdiff - src/serverremoteplayer.cpp
Remove unnecessary delays from large data transfer unit test
[minetest.git] / src / serverremoteplayer.cpp
index f2bb85c9274e5fd02c99c385f3ffbfed8e68ba51..b4dbbdb1b0663f7d9abd45b972079c247e8252ce 100644 (file)
@@ -22,7 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "settings.h"
 #include "log.h"
 #include "gamedef.h"
-#include "tooldef.h"
+#include "inventory.h"
 #include "environment.h"
 #include "materials.h"
 
@@ -31,11 +31,12 @@ ServerRemotePlayer::ServerRemotePlayer(ServerEnvironment *env):
        ServerActiveObject(env, v3f(0,0,0)),
        m_last_good_position(0,0,0),
        m_last_good_position_age(0),
-       m_additional_items(),
+       m_wield_index(0),
        m_inventory_not_sent(false),
        m_hp_not_sent(false),
        m_respawn_active(false),
        m_is_in_environment(false),
+       m_time_from_last_punch(0),
        m_position_not_sent(false)
 {
 }
@@ -43,9 +44,13 @@ ServerRemotePlayer::ServerRemotePlayer(ServerEnvironment *env, v3f pos_, u16 pee
                const char *name_):
        Player(env->getGameDef()),
        ServerActiveObject(env, pos_),
+       m_last_good_position(0,0,0),
+       m_last_good_position_age(0),
+       m_wield_index(0),
        m_inventory_not_sent(false),
        m_hp_not_sent(false),
        m_is_in_environment(false),
+       m_time_from_last_punch(0),
        m_position_not_sent(false)
 {
        setPosition(pos_);
@@ -54,7 +59,6 @@ ServerRemotePlayer::ServerRemotePlayer(ServerEnvironment *env, v3f pos_, u16 pee
 }
 ServerRemotePlayer::~ServerRemotePlayer()
 {
-       clearAddToInventoryLater();
 }
 
 void ServerRemotePlayer::setPosition(const v3f &position)
@@ -64,12 +68,41 @@ void ServerRemotePlayer::setPosition(const v3f &position)
        m_position_not_sent = true;
 }
 
-InventoryItem* ServerRemotePlayer::getWieldedItem()
+Inventory* ServerRemotePlayer::getInventory()
+{
+       return &inventory;
+}
+
+const Inventory* ServerRemotePlayer::getInventory() const
 {
-       InventoryList *list = inventory.getList("main");
-       if (list)
-               return list->getItem(m_selected_item);
-       return NULL;
+       return &inventory;
+}
+
+InventoryLocation ServerRemotePlayer::getInventoryLocation() const
+{
+       InventoryLocation loc;
+       loc.setPlayer(getName());
+       return loc;
+}
+
+void ServerRemotePlayer::setInventoryModified()
+{
+       m_inventory_not_sent = true;
+}
+
+std::string ServerRemotePlayer::getWieldList() const
+{
+       return "main";
+}
+
+int ServerRemotePlayer::getWieldIndex() const
+{
+       return m_wield_index;
+}
+
+void ServerRemotePlayer::setWieldIndex(int i)
+{
+       m_wield_index = i;
 }
 
 /* ServerActiveObject interface */
@@ -88,11 +121,13 @@ void ServerRemotePlayer::removingFromEnvironment()
 
 bool ServerRemotePlayer::unlimitedTransferDistance() const
 {
-       return true;
+       return g_settings->getBool("unlimited_player_transfer_distance");
 }
 
 void ServerRemotePlayer::step(float dtime, bool send_recommended)
 {
+       m_time_from_last_punch += dtime;
+       
        if(send_recommended == false)
                return;
        
@@ -139,22 +174,45 @@ void ServerRemotePlayer::punch(ServerActiveObject *puncher,
        if(!puncher)
                return;
        
+       // No effect if PvP disabled
+       if(g_settings->getBool("enable_pvp") == false){
+               if(puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER)
+                       return;
+       }
+       
        // "Material" properties of a player
        MaterialProperties mp;
        mp.diggability = DIGGABLE_NORMAL;
-       mp.crackiness = -1.0;
-       mp.cuttability = 1.0;
+       mp.crackiness = -0.5;
+       mp.cuttability = 0.5;
 
-       ToolDiggingProperties tp;
-       puncher->getWieldDiggingProperties(&tp);
+       IItemDefManager *idef = m_env->getGameDef()->idef();
+       ItemStack punchitem = puncher->getWieldedItem();
+       ToolDiggingProperties tp =
+               punchitem.getToolDiggingProperties(idef);
 
        HittingProperties hitprop = getHittingProperties(&mp, &tp,
                        time_from_last_punch);
        
-       infostream<<"1. getHP()="<<getHP()<<std::endl;
+       actionstream<<"Player "<<getName()<<" punched by "
+                       <<puncher->getDescription()<<", damage "<<hitprop.hp
+                       <<" HP"<<std::endl;
+       
        setHP(getHP() - hitprop.hp);
-       infostream<<"2. getHP()="<<getHP()<<std::endl;
-       puncher->damageWieldedItem(hitprop.wear);
+       punchitem.addWear(hitprop.wear, idef);
+       puncher->setWieldedItem(punchitem);
+       
+       if(hitprop.hp != 0)
+       {
+               std::ostringstream os(std::ios::binary);
+               // command (1 = punched)
+               writeU8(os, 1);
+               // damage
+               writeS16(os, hitprop.hp);
+               // create message and add to list
+               ActiveObjectMessage aom(getId(), false, os.str());
+               m_messages_out.push_back(aom);
+       }
 }
 
 void ServerRemotePlayer::rightClick(ServerActiveObject *clicker)
@@ -176,109 +234,6 @@ void ServerRemotePlayer::moveTo(v3f pos, bool continuous)
        m_last_good_position_age = 0;
 }
 
-void ServerRemotePlayer::getWieldDiggingProperties(ToolDiggingProperties *dst)
-{
-       IGameDef *gamedef = m_env->getGameDef();
-       IToolDefManager *tdef = gamedef->tdef();
-
-       InventoryItem *item = getWieldedItem();
-       if(item == NULL || std::string(item->getName()) != "ToolItem"){
-               *dst = ToolDiggingProperties();
-               return;
-       }
-       ToolItem *titem = (ToolItem*)item;
-       *dst = tdef->getDiggingProperties(titem->getToolName());
-}
-
-void ServerRemotePlayer::damageWieldedItem(u16 amount)
-{
-       infostream<<"Damaging "<<getName()<<"'s wielded item for amount="
-                       <<amount<<std::endl;
-       InventoryList *list = inventory.getList("main");
-       if(!list)
-               return;
-       InventoryItem *item = list->getItem(m_selected_item);
-       if(item && (std::string)item->getName() == "ToolItem"){
-               ToolItem *titem = (ToolItem*)item;
-               bool weared_out = titem->addWear(amount);
-               if(weared_out)
-                       list->deleteItem(m_selected_item);
-       }
-}
-bool ServerRemotePlayer::addToInventory(InventoryItem *item)
-{
-       infostream<<"Adding "<<item->getName()<<" into "<<getName()
-                       <<"'s inventory"<<std::endl;
-       
-       InventoryList *ilist = inventory.getList("main");
-       if(ilist == NULL)
-               return false;
-       
-       // In creative mode, just delete the item
-       if(g_settings->getBool("creative_mode")){
-               return false;
-       }
-
-       // Skip if inventory has no free space
-       if(ilist->roomForItem(item) == false)
-       {
-               infostream<<"Player inventory has no free space"<<std::endl;
-               return false;
-       }
-
-       // Add to inventory
-       InventoryItem *leftover = ilist->addItem(item);
-       assert(!leftover);
-       
-       m_inventory_not_sent = true;
-
-       return true;
-}
-void ServerRemotePlayer::addToInventoryLater(InventoryItem *item)
-{
-       infostream<<"Adding (later) "<<item->getName()<<" into "<<getName()
-                       <<"'s inventory"<<std::endl;
-       m_additional_items.push_back(item);
-}
-void ServerRemotePlayer::clearAddToInventoryLater()
-{
-       for (std::vector<InventoryItem*>::iterator
-                       i = m_additional_items.begin();
-                       i != m_additional_items.end(); i++)
-       {
-               delete *i;
-       }
-       m_additional_items.clear();
-}
-void ServerRemotePlayer::completeAddToInventoryLater(u16 preferred_index)
-{
-       InventoryList *ilist = inventory.getList("main");
-       if(ilist == NULL)
-       {
-               clearAddToInventoryLater();
-               return;
-       }
-       
-       // In creative mode, just delete the items
-       if(g_settings->getBool("creative_mode"))
-       {
-               clearAddToInventoryLater();
-               return;
-       }
-       
-       for (std::vector<InventoryItem*>::iterator
-                       i = m_additional_items.begin();
-                       i != m_additional_items.end(); i++)
-       {
-               InventoryItem *item = *i;
-               InventoryItem *leftover = item;
-               leftover = ilist->addItem(preferred_index, leftover);
-               leftover = ilist->addItem(leftover);
-               delete leftover;
-       }
-       m_additional_items.clear();
-       m_inventory_not_sent = true;
-}
 void ServerRemotePlayer::setHP(s16 hp_)
 {
        s16 oldhp = hp;