summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/lua_api.txt7
-rw-r--r--src/content_sao.cpp36
-rw-r--r--src/content_sao.h2
-rw-r--r--src/game.cpp17
-rw-r--r--src/network/serverpackethandler.cpp5
-rw-r--r--src/player.cpp1
6 files changed, 64 insertions, 4 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 760a829d3..9da0fb4f9 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -1759,6 +1759,13 @@ Inventory locations
* `"nodemeta:<X>,<Y>,<Z>"`: Any node metadata
* `"detached:<name>"`: A detached inventory
+Player Inventory lists
+----------------------
+* `main`: list containing the default inventory
+* `craft`: list containing the craft input
+* `craftpreview`: list containing the craft output
+* `hand`: list containing an override for the empty hand
+
`ColorString`
-------------
`#RGB` defines a color in hexadecimal format.
diff --git a/src/content_sao.cpp b/src/content_sao.cpp
index 6caea5198..609673ed9 100644
--- a/src/content_sao.cpp
+++ b/src/content_sao.cpp
@@ -1341,6 +1341,42 @@ std::string PlayerSAO::getWieldList() const
return "main";
}
+ItemStack PlayerSAO::getWieldedItem() const
+{
+ const Inventory *inv = getInventory();
+ ItemStack ret;
+ const InventoryList *mlist = inv->getList(getWieldList());
+ if (mlist && getWieldIndex() < (s32)mlist->getSize())
+ ret = mlist->getItem(getWieldIndex());
+ if (ret.name.empty()) {
+ const InventoryList *hlist = inv->getList("hand");
+ if (hlist)
+ ret = hlist->getItem(0);
+ }
+ return ret;
+}
+
+bool PlayerSAO::setWieldedItem(const ItemStack &item)
+{
+ Inventory *inv = getInventory();
+ if (inv) {
+ InventoryList *mlist = inv->getList(getWieldList());
+ if (mlist) {
+ ItemStack olditem = mlist->getItem(getWieldIndex());
+ if (olditem.name.empty()) {
+ InventoryList *hlist = inv->getList("hand");
+ if (hlist) {
+ hlist->changeItem(0, item);
+ return true;
+ }
+ }
+ mlist->changeItem(getWieldIndex(), item);
+ return true;
+ }
+ }
+ return false;
+}
+
int PlayerSAO::getWieldIndex() const
{
return m_wield_index;
diff --git a/src/content_sao.h b/src/content_sao.h
index f58c7dadb..c5b066f50 100644
--- a/src/content_sao.h
+++ b/src/content_sao.h
@@ -251,6 +251,8 @@ public:
const Inventory* getInventory() const;
InventoryLocation getInventoryLocation() const;
std::string getWieldList() const;
+ ItemStack getWieldedItem() const;
+ bool setWieldedItem(const ItemStack &item);
int getWieldIndex() const;
void setWieldIndex(int i);
diff --git a/src/game.cpp b/src/game.cpp
index 671682348..e6d38d0a0 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -3684,6 +3684,12 @@ void Game::updateCamera(VolatileRunFlags *flags, u32 busy_time,
if (mlist && client->getPlayerItem() < mlist->getSize())
playeritem = mlist->getItem(client->getPlayerItem());
}
+ if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand
+ InventoryList *hlist = local_inventory->getList("hand");
+ if (hlist)
+ playeritem = hlist->getItem(0);
+ }
+
ToolCapabilities playeritem_toolcap =
playeritem.getToolCapabilities(itemdef_manager);
@@ -3768,6 +3774,11 @@ void Game::processPlayerInteraction(GameRunData *runData,
playeritem = mlist->getItem(client->getPlayerItem());
}
+ if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand
+ InventoryList *hlist = local_inventory->getList("hand");
+ if (hlist)
+ playeritem = hlist->getItem(0);
+ }
const ItemDefinition &playeritem_def =
playeritem.getDefinition(itemdef_manager);
@@ -4321,8 +4332,14 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
if (mlist && (client->getPlayerItem() < mlist->getSize())) {
ItemStack item = mlist->getItem(client->getPlayerItem());
+ if (item.getDefinition(itemdef_manager).name.empty()) { // override the hand
+ InventoryList *hlist = local_inventory->getList("hand");
+ if (hlist)
+ item = hlist->getItem(0);
+ }
camera->wield(item);
}
+
runData->update_wielded_item_trigger = false;
}
diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp
index d56424b75..70eb0a828 100644
--- a/src/network/serverpackethandler.cpp
+++ b/src/network/serverpackethandler.cpp
@@ -1529,10 +1529,7 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
m_script->on_cheat(playersao, "finished_unknown_dig");
}
// Get player's wielded item
- ItemStack playeritem;
- InventoryList *mlist = playersao->getInventory()->getList("main");
- if (mlist != NULL)
- playeritem = mlist->getItem(playersao->getWieldIndex());
+ ItemStack playeritem = playersao->getWieldedItem();
ToolCapabilities playeritem_toolcap =
playeritem.getToolCapabilities(m_itemdef);
// Get diggability and expected digging time
diff --git a/src/player.cpp b/src/player.cpp
index 9c321d571..85bc639ec 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -40,6 +40,7 @@ Player::Player(const char *name, IItemDefManager *idef):
inventory.clear();
inventory.addList("main", PLAYER_INVENTORY_SIZE);
+ inventory.addList("hand", 1);
InventoryList *craft = inventory.addList("craft", 9);
craft->setWidth(3);
inventory.addList("craftpreview", 1);