Check item_drop amount clientside (#6242)
authorrubenwardy <rubenwardy@gmail.com>
Sat, 26 Aug 2017 06:11:59 +0000 (07:11 +0100)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Sat, 26 Aug 2017 06:11:59 +0000 (08:11 +0200)
builtin/game/item.lua
src/game.cpp

index b416a34b0d801589924e678cbbb440f895c76886..2c72005245e3193c0a761758b79ac730bd055c18 100644 (file)
@@ -420,19 +420,16 @@ end
 
 function core.item_drop(itemstack, dropper, pos)
        if dropper and dropper:is_player() then
-               local v = dropper:get_look_dir()
-               local p = {x=pos.x, y=pos.y+1.2, z=pos.z}
-               local cs = itemstack:get_count()
-               if dropper:get_player_control().sneak then
-                       cs = 1
-               end
-               local item = itemstack:take_item(cs)
+               local dir = dropper:get_look_dir()
+               local p = {x = pos.x, y = pos.y + 1.2, z = pos.z}
+               local cnt = itemstack:get_count()
+               local item = itemstack:take_item(cnt)
                local obj = core.add_item(p, item)
                if obj then
-                       v.x = v.x*2
-                       v.y = v.y*2 + 2
-                       v.z = v.z*2
-                       obj:setvelocity(v)
+                       dir.x = dir.x * 2
+                       dir.y = dir.y * 2 + 2
+                       dir.z = dir.z * 2
+                       obj:set_velocity(dir)
                        obj:get_luaentity().dropped_by = dropper:get_player_name()
                        return itemstack
                end
index 4a26bc844535caa12837a652322512d446f64d71..43495e8a6f01aa7e6e52392a308bd9f2dc259067 100644 (file)
@@ -1251,7 +1251,7 @@ protected:
        void processKeyInput();
        void processItemSelection(u16 *new_playeritem);
 
-       void dropSelectedItem();
+       void dropSelectedItem(bool single_item = false);
        void openInventory();
        void openConsole(float scale, const wchar_t *line=NULL);
        void toggleFreeMove();
@@ -2499,7 +2499,7 @@ void Game::processUserInput(f32 dtime)
 void Game::processKeyInput()
 {
        if (wasKeyDown(KeyType::DROP)) {
-               dropSelectedItem();
+               dropSelectedItem(isKeyDown(KeyType::SNEAK));
        } else if (wasKeyDown(KeyType::AUTOFORWARD)) {
                toggleAutoforward();
        } else if (wasKeyDown(KeyType::INVENTORY)) {
@@ -2645,10 +2645,10 @@ void Game::processItemSelection(u16 *new_playeritem)
 }
 
 
-void Game::dropSelectedItem()
+void Game::dropSelectedItem(bool single_item)
 {
        IDropAction *a = new IDropAction();
-       a->count = 0;
+       a->count = single_item ? 1 : 0;
        a->from_inv.setCurrentPlayer();
        a->from_list = "main";
        a->from_i = client->getPlayerItem();