Skip to content

Commit 5fa614d

Browse files
authoredSep 21, 2019
Wieldhand: Specify which ItemStack to use (#8961)
Makes 'get_wield_item' to return the "main" ItemStack
1 parent 47da640 commit 5fa614d

File tree

7 files changed

+37
-41
lines changed

7 files changed

+37
-41
lines changed
 

‎doc/lua_api.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -2556,8 +2556,7 @@ Player Inventory lists
25562556
* `craftresult`: list containing the crafted output
25572557
* `hand`: list containing an override for the empty hand
25582558
* Is not created automatically, use `InvRef:set_size`
2559-
2560-
2559+
* Is only used to enhance the empty hand's tool capabilities
25612560

25622561

25632562
Colors

‎src/content_sao.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -638,12 +638,13 @@ int LuaEntitySAO::punch(v3f dir,
638638
FATAL_ERROR_IF(!puncher, "Punch action called without SAO");
639639

640640
s32 old_hp = getHP();
641-
const ItemStack &punchitem = puncher->getWieldedItem();
641+
ItemStack selected_item, hand_item;
642+
ItemStack tool_item = puncher->getWieldedItem(&selected_item, &hand_item);
642643

643644
PunchDamageResult result = getPunchDamage(
644645
m_armor_groups,
645646
toolcap,
646-
&punchitem,
647+
&tool_item,
647648
time_from_last_punch);
648649

649650
bool damage_handled = m_env->getScriptIface()->luaentity_Punch(m_id, puncher,
@@ -1376,10 +1377,9 @@ u16 PlayerSAO::getWieldIndex() const
13761377
return m_player->getWieldIndex();
13771378
}
13781379

1379-
ItemStack PlayerSAO::getWieldedItem() const
1380+
ItemStack PlayerSAO::getWieldedItem(ItemStack *selected, ItemStack *hand) const
13801381
{
1381-
ItemStack selected_item, hand_item;
1382-
return m_player->getWieldedItem(&selected_item, &hand_item);
1382+
return m_player->getWieldedItem(selected, hand);
13831383
}
13841384

13851385
bool PlayerSAO::setWieldedItem(const ItemStack &item)

‎src/content_sao.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ class PlayerSAO : public UnitSAO
277277
void setInventoryModified() {}
278278
std::string getWieldList() const { return "main"; }
279279
u16 getWieldIndex() const;
280-
ItemStack getWieldedItem() const;
280+
ItemStack getWieldedItem(ItemStack *selected, ItemStack *hand = nullptr) const;
281281
bool setWieldedItem(const ItemStack &item);
282282

283283
/*

‎src/network/serverpackethandler.cpp

+20-17
Original file line numberDiff line numberDiff line change
@@ -1150,9 +1150,10 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
11501150
if (pointed_object->isGone())
11511151
return;
11521152

1153-
ItemStack punchitem = playersao->getWieldedItem();
1153+
ItemStack selected_item, hand_item;
1154+
ItemStack tool_item = playersao->getWieldedItem(&selected_item, &hand_item);
11541155
ToolCapabilities toolcap =
1155-
punchitem.getToolCapabilities(m_itemdef);
1156+
tool_item.getToolCapabilities(m_itemdef);
11561157
v3f dir = (pointed_object->getBasePosition() -
11571158
(playersao->getBasePosition() + playersao->getEyeOffset())
11581159
).normalize();
@@ -1291,11 +1292,12 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
12911292
3: place block or right-click object
12921293
*/
12931294
else if (action == INTERACT_PLACE) {
1294-
ItemStack item = playersao->getWieldedItem();
1295+
ItemStack selected_item;
1296+
playersao->getWieldedItem(&selected_item, nullptr);
12951297

12961298
// Reset build time counter
12971299
if (pointed.type == POINTEDTHING_NODE &&
1298-
item.getDefinition(m_itemdef).type == ITEM_NODE)
1300+
selected_item.getDefinition(m_itemdef).type == ITEM_NODE)
12991301
getClient(pkt->getPeerId())->m_time_from_building = 0.0;
13001302

13011303
if (pointed.type == POINTEDTHING_OBJECT) {
@@ -1311,13 +1313,12 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
13111313

13121314
// Do stuff
13131315
pointed_object->rightClick(playersao);
1314-
}
1315-
else if (m_script->item_OnPlace(
1316-
item, playersao, pointed)) {
1316+
} else if (m_script->item_OnPlace(
1317+
selected_item, playersao, pointed)) {
13171318
// Placement was handled in lua
13181319

13191320
// Apply returned ItemStack
1320-
if (playersao->setWieldedItem(item)) {
1321+
if (playersao->setWieldedItem(selected_item)) {
13211322
SendInventory(playersao, true);
13221323
}
13231324
}
@@ -1327,7 +1328,7 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
13271328
RemoteClient *client = getClient(pkt->getPeerId());
13281329
v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_above, BS));
13291330
v3s16 blockpos2 = getNodeBlockPos(floatToInt(pointed_pos_under, BS));
1330-
if (!item.getDefinition(m_itemdef).node_placement_prediction.empty()) {
1331+
if (!selected_item.getDefinition(m_itemdef).node_placement_prediction.empty()) {
13311332
client->SetBlockNotSent(blockpos);
13321333
if (blockpos2 != blockpos) {
13331334
client->SetBlockNotSent(blockpos2);
@@ -1345,15 +1346,16 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
13451346
4: use
13461347
*/
13471348
else if (action == INTERACT_USE) {
1348-
ItemStack item = playersao->getWieldedItem();
1349+
ItemStack selected_item;
1350+
playersao->getWieldedItem(&selected_item, nullptr);
13491351

1350-
actionstream << player->getName() << " uses " << item.name
1352+
actionstream << player->getName() << " uses " << selected_item.name
13511353
<< ", pointing at " << pointed.dump() << std::endl;
13521354

13531355
if (m_script->item_OnUse(
1354-
item, playersao, pointed)) {
1356+
selected_item, playersao, pointed)) {
13551357
// Apply returned ItemStack
1356-
if (playersao->setWieldedItem(item)) {
1358+
if (playersao->setWieldedItem(selected_item)) {
13571359
SendInventory(playersao, true);
13581360
}
13591361
}
@@ -1364,14 +1366,15 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
13641366
5: rightclick air
13651367
*/
13661368
else if (action == INTERACT_ACTIVATE) {
1367-
ItemStack item = playersao->getWieldedItem();
1369+
ItemStack selected_item;
1370+
playersao->getWieldedItem(&selected_item, nullptr);
13681371

13691372
actionstream << player->getName() << " activates "
1370-
<< item.name << std::endl;
1373+
<< selected_item.name << std::endl;
13711374

13721375
if (m_script->item_OnSecondaryUse(
1373-
item, playersao)) {
1374-
if( playersao->setWieldedItem(item)) {
1376+
selected_item, playersao)) {
1377+
if (playersao->setWieldedItem(selected_item)) {
13751378
SendInventory(playersao, true);
13761379
}
13771380
}

‎src/script/lua_api/l_object.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,9 @@ int ObjectRef::l_get_wielded_item(lua_State *L)
340340
return 1;
341341
}
342342

343-
LuaItemStack::create(L, co->getWieldedItem());
343+
ItemStack selected_item;
344+
co->getWieldedItem(&selected_item, nullptr);
345+
LuaItemStack::create(L, selected_item);
344346
return 1;
345347
}
346348

‎src/serverobject.cpp

+5-14
Original file line numberDiff line numberDiff line change
@@ -68,25 +68,16 @@ float ServerActiveObject::getMinimumSavedMovement()
6868
return 2.0*BS;
6969
}
7070

71-
ItemStack ServerActiveObject::getWieldedItem() const
71+
ItemStack ServerActiveObject::getWieldedItem(ItemStack *selected, ItemStack *hand) const
7272
{
73-
const Inventory *inv = getInventory();
74-
if(inv)
75-
{
76-
const InventoryList *list = inv->getList(getWieldList());
77-
if(list && (getWieldIndex() < (s32)list->getSize()))
78-
return list->getItem(getWieldIndex());
79-
}
73+
*selected = ItemStack();
74+
if (hand)
75+
*hand = ItemStack();
76+
8077
return ItemStack();
8178
}
8279

8380
bool ServerActiveObject::setWieldedItem(const ItemStack &item)
8481
{
85-
if(Inventory *inv = getInventory()) {
86-
if (InventoryList *list = inv->getList(getWieldList())) {
87-
list->changeItem(getWieldIndex(), item);
88-
return true;
89-
}
90-
}
9182
return false;
9283
}

‎src/serverobject.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@ class ServerActiveObject : public ActiveObject
180180
{ return ""; }
181181
virtual u16 getWieldIndex() const
182182
{ return 0; }
183-
virtual ItemStack getWieldedItem() const;
183+
virtual ItemStack getWieldedItem(ItemStack *selected,
184+
ItemStack *hand = nullptr) const;
184185
virtual bool setWieldedItem(const ItemStack &item);
185186
inline void attachParticleSpawner(u32 id)
186187
{

0 commit comments

Comments
 (0)
Please sign in to comment.