Inventory: Undo prediction on drop
authorSmallJoker <mk939@ymail.com>
Tue, 17 Sep 2019 17:02:01 +0000 (19:02 +0200)
committerSmallJoker <mk939@ymail.com>
Tue, 17 Sep 2019 17:02:01 +0000 (19:02 +0200)
src/inventorymanager.cpp
src/server.cpp

index 02cb9e3a4ae45accd5178c4a33add8df38012cb0..fccfdea16cbdd77b2247c88fdceaff5630aed0fb 100644 (file)
@@ -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
index df3b816f7f8661890113e44925afb07c116da57a..a848c0ae98f5b351c32f6e917ea1f07881380d58 100644 (file)
@@ -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;