Skip to content

Commit 785a9a6

Browse files
TeTpaAkaparamat
authored andcommittedNov 26, 2016
Wieldhand: Allow overriding the hand
1 parent e4ee654 commit 785a9a6

File tree

6 files changed

+64
-4
lines changed

6 files changed

+64
-4
lines changed
 

‎doc/lua_api.txt

+7
Original file line numberDiff line numberDiff line change
@@ -1759,6 +1759,13 @@ Inventory locations
17591759
* `"nodemeta:<X>,<Y>,<Z>"`: Any node metadata
17601760
* `"detached:<name>"`: A detached inventory
17611761

1762+
Player Inventory lists
1763+
----------------------
1764+
* `main`: list containing the default inventory
1765+
* `craft`: list containing the craft input
1766+
* `craftpreview`: list containing the craft output
1767+
* `hand`: list containing an override for the empty hand
1768+
17621769
`ColorString`
17631770
-------------
17641771
`#RGB` defines a color in hexadecimal format.

‎src/content_sao.cpp

+36
Original file line numberDiff line numberDiff line change
@@ -1341,6 +1341,42 @@ std::string PlayerSAO::getWieldList() const
13411341
return "main";
13421342
}
13431343

1344+
ItemStack PlayerSAO::getWieldedItem() const
1345+
{
1346+
const Inventory *inv = getInventory();
1347+
ItemStack ret;
1348+
const InventoryList *mlist = inv->getList(getWieldList());
1349+
if (mlist && getWieldIndex() < (s32)mlist->getSize())
1350+
ret = mlist->getItem(getWieldIndex());
1351+
if (ret.name.empty()) {
1352+
const InventoryList *hlist = inv->getList("hand");
1353+
if (hlist)
1354+
ret = hlist->getItem(0);
1355+
}
1356+
return ret;
1357+
}
1358+
1359+
bool PlayerSAO::setWieldedItem(const ItemStack &item)
1360+
{
1361+
Inventory *inv = getInventory();
1362+
if (inv) {
1363+
InventoryList *mlist = inv->getList(getWieldList());
1364+
if (mlist) {
1365+
ItemStack olditem = mlist->getItem(getWieldIndex());
1366+
if (olditem.name.empty()) {
1367+
InventoryList *hlist = inv->getList("hand");
1368+
if (hlist) {
1369+
hlist->changeItem(0, item);
1370+
return true;
1371+
}
1372+
}
1373+
mlist->changeItem(getWieldIndex(), item);
1374+
return true;
1375+
}
1376+
}
1377+
return false;
1378+
}
1379+
13441380
int PlayerSAO::getWieldIndex() const
13451381
{
13461382
return m_wield_index;

‎src/content_sao.h

+2
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,8 @@ class PlayerSAO : public UnitSAO
251251
const Inventory* getInventory() const;
252252
InventoryLocation getInventoryLocation() const;
253253
std::string getWieldList() const;
254+
ItemStack getWieldedItem() const;
255+
bool setWieldedItem(const ItemStack &item);
254256
int getWieldIndex() const;
255257
void setWieldIndex(int i);
256258

‎src/game.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -3684,6 +3684,12 @@ void Game::updateCamera(VolatileRunFlags *flags, u32 busy_time,
36843684
if (mlist && client->getPlayerItem() < mlist->getSize())
36853685
playeritem = mlist->getItem(client->getPlayerItem());
36863686
}
3687+
if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand
3688+
InventoryList *hlist = local_inventory->getList("hand");
3689+
if (hlist)
3690+
playeritem = hlist->getItem(0);
3691+
}
3692+
36873693

36883694
ToolCapabilities playeritem_toolcap =
36893695
playeritem.getToolCapabilities(itemdef_manager);
@@ -3768,6 +3774,11 @@ void Game::processPlayerInteraction(GameRunData *runData,
37683774
playeritem = mlist->getItem(client->getPlayerItem());
37693775
}
37703776

3777+
if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand
3778+
InventoryList *hlist = local_inventory->getList("hand");
3779+
if (hlist)
3780+
playeritem = hlist->getItem(0);
3781+
}
37713782
const ItemDefinition &playeritem_def =
37723783
playeritem.getDefinition(itemdef_manager);
37733784

@@ -4321,8 +4332,14 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
43214332

43224333
if (mlist && (client->getPlayerItem() < mlist->getSize())) {
43234334
ItemStack item = mlist->getItem(client->getPlayerItem());
4335+
if (item.getDefinition(itemdef_manager).name.empty()) { // override the hand
4336+
InventoryList *hlist = local_inventory->getList("hand");
4337+
if (hlist)
4338+
item = hlist->getItem(0);
4339+
}
43244340
camera->wield(item);
43254341
}
4342+
43264343
runData->update_wielded_item_trigger = false;
43274344
}
43284345

‎src/network/serverpackethandler.cpp

+1-4
Original file line numberDiff line numberDiff line change
@@ -1529,10 +1529,7 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
15291529
m_script->on_cheat(playersao, "finished_unknown_dig");
15301530
}
15311531
// Get player's wielded item
1532-
ItemStack playeritem;
1533-
InventoryList *mlist = playersao->getInventory()->getList("main");
1534-
if (mlist != NULL)
1535-
playeritem = mlist->getItem(playersao->getWieldIndex());
1532+
ItemStack playeritem = playersao->getWieldedItem();
15361533
ToolCapabilities playeritem_toolcap =
15371534
playeritem.getToolCapabilities(m_itemdef);
15381535
// Get diggability and expected digging time

‎src/player.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ Player::Player(const char *name, IItemDefManager *idef):
4040

4141
inventory.clear();
4242
inventory.addList("main", PLAYER_INVENTORY_SIZE);
43+
inventory.addList("hand", 1);
4344
InventoryList *craft = inventory.addList("craft", 9);
4445
craft->setWidth(3);
4546
inventory.addList("craftpreview", 1);

0 commit comments

Comments
 (0)
Please sign in to comment.