summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSmallJoker <mk939@ymail.com>2019-09-17 19:02:01 +0200
committerSmallJoker <mk939@ymail.com>2019-09-17 19:02:01 +0200
commite0a85fae01287fb06c0d29fc309067d18286b100 (patch)
treec80bd831a22e81cf657e4a5c772cdede1ee0ad20 /src
parent1db3d252cff9e8d61fecf1052d7497813851da51 (diff)
downloadminetest-e0a85fae01287fb06c0d29fc309067d18286b100.tar.gz
minetest-e0a85fae01287fb06c0d29fc309067d18286b100.tar.bz2
minetest-e0a85fae01287fb06c0d29fc309067d18286b100.zip
Inventory: Undo prediction on drop
Diffstat (limited to 'src')
-rw-r--r--src/inventorymanager.cpp12
-rw-r--r--src/server.cpp1
2 files changed, 7 insertions, 6 deletions
diff --git a/src/inventorymanager.cpp b/src/inventorymanager.cpp
index 02cb9e3a4..fccfdea16 100644
--- a/src/inventorymanager.cpp
+++ b/src/inventorymanager.cpp
@@ -646,8 +646,6 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
if (src_can_take_count != -1 && src_can_take_count < take_count)
take_count = src_can_take_count;
- int actually_dropped_count = 0;
-
// Update item due executed callbacks
src_item = list_from->getItem(from_i);
@@ -656,10 +654,12 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
item1.count = take_count;
if(PLAYER_TO_SA(player)->item_OnDrop(item1, player,
player->getBasePosition())) {
- actually_dropped_count = take_count - item1.count;
+ int actually_dropped_count = take_count - item1.count;
if (actually_dropped_count == 0) {
infostream<<"Actually dropped no items"<<std::endl;
+ // Revert client prediction
+ mgr->setInventoryModified(from_inv);
return;
}
@@ -670,9 +670,10 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
if (item2.count != actually_dropped_count)
errorstream<<"Could not take dropped count of items"<<std::endl;
-
- mgr->setInventoryModified(from_inv);
}
+
+ src_item.count = actually_dropped_count;
+ mgr->setInventoryModified(from_inv);
}
infostream<<"IDropAction::apply(): dropped "
@@ -681,7 +682,6 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
<<" i="<<from_i
<<std::endl;
- src_item.count = actually_dropped_count;
/*
Report drop to endpoints
diff --git a/src/server.cpp b/src/server.cpp
index df3b816f7..a848c0ae9 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1151,6 +1151,7 @@ void Server::setInventoryModified(const InventoryLocation &loc)
return;
player->setModified(true);
+ player->inventory.setModified(true);
// Updates are sent in ServerEnvironment::step()
}
break;