Skip to content

Commit 5d1bc20

Browse files
authored
Merge pull request #10039 from sruon/state_fix
[core] Decrement equipped ammo / Send item packet update on craft fail
2 parents 0874258 + 3eb7de2 commit 5d1bc20

5 files changed

Lines changed: 29 additions & 20 deletions

File tree

scripts/tests/systems/items/equip.lua

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,17 @@ describe('Equipment', function()
8787
assert(player:getEquippedItem(xi.slot.MAIN) == nil)
8888
end)
8989

90+
it('equipped ammo stack decrements on use', function()
91+
player:addItem(xi.item.FIRE_ARROW, 50)
92+
player:equipItem(xi.item.FIRE_ARROW, nil, xi.slot.AMMO)
93+
94+
player:delItem(xi.item.FIRE_ARROW, 1)
95+
96+
local ammo = player:getEquippedItem(xi.slot.AMMO)
97+
assert(ammo)
98+
assert(ammo:getQuantity() == 49)
99+
end)
100+
90101
it('all visible armor slots accept their piece', function()
91102
local pieces =
92103
{

src/map/ai/states/item_state.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ CItemState::CItemState(CCharEntity* PEntity, const uint16 targid, const uint8 lo
119119
m_PEntity->UContainer->SetType(UCONTAINER_USEITEM);
120120
m_PEntity->UContainer->SetItem(0, m_PItem);
121121

122-
tx_ = ItemUseTransaction::start(m_PEntity, m_PItem);
122+
tx_ = m_PEntity->addTransaction(ItemUseTransaction::start(m_PEntity, m_PItem));
123123
m_startPos = m_PEntity->loc.p;
124124
m_castTime = m_PItem->getActivationTime();
125125
m_animationTime = m_PItem->getAnimationTime();
@@ -241,13 +241,9 @@ void CItemState::Cleanup(timer::time_point tick)
241241
{
242242
m_PEntity->UContainer->Clean();
243243

244-
// Clear InTransaction before the ITEM_LIST packet below.
245-
if (m_interrupted || !IsCompleted())
244+
if (tx_ && tx_->isOpen())
246245
{
247-
if (tx_)
248-
{
249-
tx_->rollback();
250-
}
246+
tx_->rollback();
251247
}
252248

253249
if (m_PItem && (m_interrupted || !IsCompleted()) && !m_PItem->isType(ITEM_EQUIPMENT))

src/map/ai/states/item_state.h

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323

2424
#include "state.h"
2525

26-
#include <memory>
27-
2826
class CBattleEntity;
2927
class CCharEntity;
3028
class CItemUsable;
@@ -62,14 +60,14 @@ class CItemState : public CState
6260
protected:
6361
bool HasMoved() const;
6462

65-
CCharEntity* m_PEntity;
66-
CItemUsable* m_PItem;
67-
uint8 m_location;
68-
uint8 m_slot;
69-
timer::duration m_castTime{};
70-
timer::duration m_animationTime{};
71-
position_t m_startPos;
72-
bool m_interrupted{ false };
73-
bool m_interruptable{ true };
74-
std::unique_ptr<ItemUseTransaction> tx_;
63+
CCharEntity* m_PEntity;
64+
CItemUsable* m_PItem;
65+
uint8 m_location;
66+
uint8 m_slot;
67+
timer::duration m_castTime{};
68+
timer::duration m_animationTime{};
69+
position_t m_startPos;
70+
bool m_interrupted{ false };
71+
bool m_interruptable{ true };
72+
ItemUseTransaction* tx_{ nullptr };
7573
};

src/map/items/transactions/synth.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ void SynthTransaction::releaseAllClaims()
251251
{
252252
exitTx(item);
253253
item->setSubType(ITEM_UNLOCKED);
254+
this->player_->pushPacket<GP_SERV_COMMAND_ITEM_LIST>(item, ItemLockFlg::Normal);
254255
}
255256

256257
this->slots_[i].item = nullptr;

src/map/utils/charutils.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1933,7 +1933,10 @@ uint32 UpdateItem(CCharEntity* PChar, uint8 LocationID, uint8 slotID, int32 quan
19331933
}
19341934
}
19351935

1936-
if (PItem->isBusy() && !force)
1936+
// Equipped ammo decrements its stack on consumption without leaving the slot.
1937+
const bool isEquippedAmmo = PItem->state() == ItemState::Equipped &&
1938+
PChar->getEquip(SLOT_AMMO) == PItem;
1939+
if (PItem->isBusy() && !isEquippedAmmo && !force)
19371940
{
19381941
ShowWarningFmt("UpdateItem: refusing to mutate busy item {} in state {} (loc={}, slot={}, char={})",
19391942
ItemID,

0 commit comments

Comments
 (0)