From ad9677a14fb8ad1b4048e83a779e5ad36a99f2d0 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sat, 26 Aug 2017 07:11:59 +0100 Subject: [PATCH] Check item_drop amount clientside (#6242) --- builtin/game/item.lua | 19 ++++++++----------- src/game.cpp | 8 ++++---- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/builtin/game/item.lua b/builtin/game/item.lua index b416a34b0..2c7200524 100644 --- a/builtin/game/item.lua +++ b/builtin/game/item.lua @@ -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 diff --git a/src/game.cpp b/src/game.cpp index 4a26bc844..43495e8a6 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -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();