summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSmallJoker <SmallJoker@users.noreply.github.com>2019-09-21 11:44:24 +0200
committerGitHub <noreply@github.com>2019-09-21 11:44:24 +0200
commit5fa614d97e13af64be490336392abe2a54fdcbc1 (patch)
tree32a0856d971d850081c1a7e748ab3f96a103ea19
parent47da640d7763ee1e00badb7476ac5afc4f864367 (diff)
downloadminetest-5fa614d97e13af64be490336392abe2a54fdcbc1.tar.gz
minetest-5fa614d97e13af64be490336392abe2a54fdcbc1.tar.bz2
minetest-5fa614d97e13af64be490336392abe2a54fdcbc1.zip
Wieldhand: Specify which ItemStack to use (#8961)
Makes 'get_wield_item' to return the "main" ItemStack
-rw-r--r--doc/lua_api.txt3
-rw-r--r--src/content_sao.cpp10
-rw-r--r--src/content_sao.h2
-rw-r--r--src/network/serverpackethandler.cpp37
-rw-r--r--src/script/lua_api/l_object.cpp4
-rw-r--r--src/serverobject.cpp19
-rw-r--r--src/serverobject.h3
7 files changed, 37 insertions, 41 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 4eb9c797c..04882ad59 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -2556,8 +2556,7 @@ Player Inventory lists
* `craftresult`: list containing the crafted output
* `hand`: list containing an override for the empty hand
* Is not created automatically, use `InvRef:set_size`
-
-
+ * Is only used to enhance the empty hand's tool capabilities
Colors
diff --git a/src/content_sao.cpp b/src/content_sao.cpp
index 800c74859..90240e267 100644
--- a/src/content_sao.cpp
+++ b/src/content_sao.cpp
@@ -638,12 +638,13 @@ int LuaEntitySAO::punch(v3f dir,
FATAL_ERROR_IF(!puncher, "Punch action called without SAO");
s32 old_hp = getHP();
- const ItemStack &punchitem = puncher->getWieldedItem();
+ ItemStack selected_item, hand_item;
+ ItemStack tool_item = puncher->getWieldedItem(&selected_item, &hand_item);
PunchDamageResult result = getPunchDamage(
m_armor_groups,
toolcap,
- &punchitem,
+ &tool_item,
time_from_last_punch);
bool damage_handled = m_env->getScriptIface()->luaentity_Punch(m_id, puncher,
@@ -1376,10 +1377,9 @@ u16 PlayerSAO::getWieldIndex() const
return m_player->getWieldIndex();
}
-ItemStack PlayerSAO::getWieldedItem() const
+ItemStack PlayerSAO::getWieldedItem(ItemStack *selected, ItemStack *hand) const
{
- ItemStack selected_item, hand_item;
- return m_player->getWieldedItem(&selected_item, &hand_item);
+ return m_player->getWieldedItem(selected, hand);
}
bool PlayerSAO::setWieldedItem(const ItemStack &item)
diff --git a/src/content_sao.h b/src/content_sao.h
index 2dd839e11..b8ef5382d 100644
--- a/src/content_sao.h
+++ b/src/content_sao.h
@@ -277,7 +277,7 @@ public:
void setInventoryModified() {}
std::string getWieldList() const { return "main"; }
u16 getWieldIndex() const;
- ItemStack getWieldedItem() const;
+ ItemStack getWieldedItem(ItemStack *selected, ItemStack *hand = nullptr) const;
bool setWieldedItem(const ItemStack &item);
/*
diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp
index a642f4a6e..0169a57da 100644
--- a/src/network/serverpackethandler.cpp
+++ b/src/network/serverpackethandler.cpp
@@ -1150,9 +1150,10 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
if (pointed_object->isGone())
return;
- ItemStack punchitem = playersao->getWieldedItem();
+ ItemStack selected_item, hand_item;
+ ItemStack tool_item = playersao->getWieldedItem(&selected_item, &hand_item);
ToolCapabilities toolcap =
- punchitem.getToolCapabilities(m_itemdef);
+ tool_item.getToolCapabilities(m_itemdef);
v3f dir = (pointed_object->getBasePosition() -
(playersao->getBasePosition() + playersao->getEyeOffset())
).normalize();
@@ -1291,11 +1292,12 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
3: place block or right-click object
*/
else if (action == INTERACT_PLACE) {
- ItemStack item = playersao->getWieldedItem();
+ ItemStack selected_item;
+ playersao->getWieldedItem(&selected_item, nullptr);
// Reset build time counter
if (pointed.type == POINTEDTHING_NODE &&
- item.getDefinition(m_itemdef).type == ITEM_NODE)
+ selected_item.getDefinition(m_itemdef).type == ITEM_NODE)
getClient(pkt->getPeerId())->m_time_from_building = 0.0;
if (pointed.type == POINTEDTHING_OBJECT) {
@@ -1311,13 +1313,12 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
// Do stuff
pointed_object->rightClick(playersao);
- }
- else if (m_script->item_OnPlace(
- item, playersao, pointed)) {
+ } else if (m_script->item_OnPlace(
+ selected_item, playersao, pointed)) {
// Placement was handled in lua
// Apply returned ItemStack
- if (playersao->setWieldedItem(item)) {
+ if (playersao->setWieldedItem(selected_item)) {
SendInventory(playersao, true);
}
}
@@ -1327,7 +1328,7 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
RemoteClient *client = getClient(pkt->getPeerId());
v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_above, BS));
v3s16 blockpos2 = getNodeBlockPos(floatToInt(pointed_pos_under, BS));
- if (!item.getDefinition(m_itemdef).node_placement_prediction.empty()) {
+ if (!selected_item.getDefinition(m_itemdef).node_placement_prediction.empty()) {
client->SetBlockNotSent(blockpos);
if (blockpos2 != blockpos) {
client->SetBlockNotSent(blockpos2);
@@ -1345,15 +1346,16 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
4: use
*/
else if (action == INTERACT_USE) {
- ItemStack item = playersao->getWieldedItem();
+ ItemStack selected_item;
+ playersao->getWieldedItem(&selected_item, nullptr);
- actionstream << player->getName() << " uses " << item.name
+ actionstream << player->getName() << " uses " << selected_item.name
<< ", pointing at " << pointed.dump() << std::endl;
if (m_script->item_OnUse(
- item, playersao, pointed)) {
+ selected_item, playersao, pointed)) {
// Apply returned ItemStack
- if (playersao->setWieldedItem(item)) {
+ if (playersao->setWieldedItem(selected_item)) {
SendInventory(playersao, true);
}
}
@@ -1364,14 +1366,15 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
5: rightclick air
*/
else if (action == INTERACT_ACTIVATE) {
- ItemStack item = playersao->getWieldedItem();
+ ItemStack selected_item;
+ playersao->getWieldedItem(&selected_item, nullptr);
actionstream << player->getName() << " activates "
- << item.name << std::endl;
+ << selected_item.name << std::endl;
if (m_script->item_OnSecondaryUse(
- item, playersao)) {
- if( playersao->setWieldedItem(item)) {
+ selected_item, playersao)) {
+ if (playersao->setWieldedItem(selected_item)) {
SendInventory(playersao, true);
}
}
diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp
index 1ad79024f..22445fc9a 100644
--- a/src/script/lua_api/l_object.cpp
+++ b/src/script/lua_api/l_object.cpp
@@ -340,7 +340,9 @@ int ObjectRef::l_get_wielded_item(lua_State *L)
return 1;
}
- LuaItemStack::create(L, co->getWieldedItem());
+ ItemStack selected_item;
+ co->getWieldedItem(&selected_item, nullptr);
+ LuaItemStack::create(L, selected_item);
return 1;
}
diff --git a/src/serverobject.cpp b/src/serverobject.cpp
index 4eebc0da4..1ed33f66b 100644
--- a/src/serverobject.cpp
+++ b/src/serverobject.cpp
@@ -68,25 +68,16 @@ float ServerActiveObject::getMinimumSavedMovement()
return 2.0*BS;
}
-ItemStack ServerActiveObject::getWieldedItem() const
+ItemStack ServerActiveObject::getWieldedItem(ItemStack *selected, ItemStack *hand) const
{
- const Inventory *inv = getInventory();
- if(inv)
- {
- const InventoryList *list = inv->getList(getWieldList());
- if(list && (getWieldIndex() < (s32)list->getSize()))
- return list->getItem(getWieldIndex());
- }
+ *selected = ItemStack();
+ if (hand)
+ *hand = ItemStack();
+
return ItemStack();
}
bool ServerActiveObject::setWieldedItem(const ItemStack &item)
{
- if(Inventory *inv = getInventory()) {
- if (InventoryList *list = inv->getList(getWieldList())) {
- list->changeItem(getWieldIndex(), item);
- return true;
- }
- }
return false;
}
diff --git a/src/serverobject.h b/src/serverobject.h
index c81abb972..5ab988571 100644
--- a/src/serverobject.h
+++ b/src/serverobject.h
@@ -180,7 +180,8 @@ public:
{ return ""; }
virtual u16 getWieldIndex() const
{ return 0; }
- virtual ItemStack getWieldedItem() const;
+ virtual ItemStack getWieldedItem(ItemStack *selected,
+ ItemStack *hand = nullptr) const;
virtual bool setWieldedItem(const ItemStack &item);
inline void attachParticleSpawner(u32 id)
{