summaryrefslogtreecommitdiff
path: root/src/client.cpp
diff options
context:
space:
mode:
authorKahrl <kahrl@gmx.net>2012-01-22 00:49:02 +0100
committerPerttu Ahola <celeron55@gmail.com>2012-01-22 17:31:20 +0200
commitb4dd5d3bd7d2152fdf02e0e7422b1305caf151f2 (patch)
treeb47e57a55e6a2787464e49ffe172592b956c5a96 /src/client.cpp
parent1efdc36b22532807d21a0beac94524e3eacfe7bc (diff)
downloadminetest-b4dd5d3bd7d2152fdf02e0e7422b1305caf151f2.tar.gz
minetest-b4dd5d3bd7d2152fdf02e0e7422b1305caf151f2.tar.bz2
minetest-b4dd5d3bd7d2152fdf02e0e7422b1305caf151f2.zip
Client-side prediction of inventory changes, and some inventory menu fixes
Diffstat (limited to 'src/client.cpp')
-rw-r--r--src/client.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/client.cpp b/src/client.cpp
index 602f0cf84..0463aa81c 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -225,6 +225,8 @@ Client::Client(
m_server_ser_ver(SER_FMT_VER_INVALID),
m_playeritem(0),
m_inventory_updated(false),
+ m_inventory_from_server(NULL),
+ m_inventory_from_server_age(0.0),
m_time_of_day(0),
m_map_seed(0),
m_password(password),
@@ -269,6 +271,8 @@ Client::~Client()
m_mesh_update_thread.setRun(false);
while(m_mesh_update_thread.IsRunning())
sleep_ms(100);
+
+ delete m_inventory_from_server;
}
void Client::connect(Address address)
@@ -657,6 +661,30 @@ void Client::step(float dtime)
}
}
}
+
+ /*
+ If the server didn't update the inventory in a while, revert
+ the local inventory (so the player notices the lag problem
+ and knows something is wrong).
+ */
+ if(m_inventory_from_server)
+ {
+ float interval = 10.0;
+ float count_before = floor(m_inventory_from_server_age / interval);
+
+ m_inventory_from_server_age += dtime;
+
+ float count_after = floor(m_inventory_from_server_age / interval);
+
+ if(count_after != count_before)
+ {
+ // Do this every <interval> seconds after TOCLIENT_INVENTORY
+ // Reset the locally changed inventory to the authoritative inventory
+ Player *player = m_env.getLocalPlayer();
+ player->inventory = *m_inventory_from_server;
+ m_inventory_updated = true;
+ }
+ }
}
// Virtual methods from con::PeerHandler
@@ -975,6 +1003,10 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
m_inventory_updated = true;
+ delete m_inventory_from_server;
+ m_inventory_from_server = new Inventory(player->inventory);
+ m_inventory_from_server_age = 0.0;
+
//infostream<<"Client got player inventory:"<<std::endl;
//player->inventory.print(infostream);
}
@@ -1931,7 +1963,15 @@ Inventory* Client::getInventory(const InventoryLocation &loc)
}
void Client::inventoryAction(InventoryAction *a)
{
+ /*
+ Send it to the server
+ */
sendInventoryAction(a);
+
+ /*
+ Predict some local inventory changes
+ */
+ a->clientApply(this, this);
}
ClientActiveObject * Client::getSelectedActiveObject(