Skip to content

Commit df9dcf8

Browse files
authored
fix: condition suppression removal logic on equip/de-equip (#3563)
Ensure only relevant condition suppressions are decremented when de-equipping items. Prevents removing suppressions still active from other sources. Fix: #3267
1 parent ed2e413 commit df9dcf8

File tree

3 files changed

+39
-9
lines changed

3 files changed

+39
-9
lines changed

src/creatures/players/player.cpp

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -269,17 +269,38 @@ bool Player::isSuppress(ConditionType_t conditionType, bool attackerPlayer) cons
269269
return true;
270270
}
271271

272-
return m_conditionSuppressions[static_cast<size_t>(conditionType)];
272+
auto conditionId = static_cast<size_t>(conditionType);
273+
return (m_conditionSuppressionCount[conditionId] > 0);
273274
}
274275

275276
void Player::addConditionSuppressions(const std::array<ConditionType_t, ConditionType_t::CONDITION_COUNT> &addConditions) {
276-
for (const auto &conditionType : addConditions) {
277-
m_conditionSuppressions[static_cast<size_t>(conditionType)] = true;
277+
for (auto conditionType : addConditions) {
278+
auto conditionId = static_cast<size_t>(conditionType);
279+
if (conditionId >= ConditionType_t::CONDITION_COUNT) {
280+
continue;
281+
}
282+
if (m_conditionSuppressionCount[conditionId] < UINT8_MAX) {
283+
m_conditionSuppressionCount[conditionId]++;
284+
}
278285
}
279286
}
280287

281-
void Player::removeConditionSuppressions() {
282-
m_conditionSuppressions.reset();
288+
void Player::removeConditionSuppressions(const std::vector<ConditionType_t> &toRemoveConditions) {
289+
for (auto conditionType : toRemoveConditions) {
290+
if (conditionType == ConditionType_t::CONDITION_NONE) {
291+
continue;
292+
}
293+
auto conditionSize = static_cast<size_t>(conditionType);
294+
if (conditionSize >= ConditionType_t::CONDITION_COUNT) {
295+
continue;
296+
}
297+
if (m_conditionSuppressionCount[conditionSize] > 0) {
298+
m_conditionSuppressionCount[conditionSize]--;
299+
if (m_conditionSuppressionCount[conditionSize] == 0) {
300+
sendIcons();
301+
}
302+
}
303+
}
283304
}
284305

285306
std::shared_ptr<Item> Player::getWeapon(Slots_t slot, bool ignoreAmmo) const {

src/creatures/players/player.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@ class Player final : public Creature, public Cylinder, public Bankable {
561561
int32_t getDefaultStats(stats_t stat) const;
562562

563563
void addConditionSuppressions(const std::array<ConditionType_t, ConditionType_t::CONDITION_COUNT> &addCondition);
564-
void removeConditionSuppressions();
564+
void removeConditionSuppressions(const std::vector<ConditionType_t> &toRemoveConditions);
565565

566566
std::shared_ptr<Reward> getReward(uint64_t rewardId, bool autoCreate);
567567
void removeReward(uint64_t rewardId);
@@ -1500,7 +1500,7 @@ class Player final : public Creature, public Cylinder, public Bankable {
15001500

15011501
std::bitset<CombatType_t::COMBAT_COUNT> m_damageImmunities;
15021502
std::bitset<ConditionType_t::CONDITION_COUNT> m_conditionImmunities;
1503-
std::bitset<ConditionType_t::CONDITION_COUNT> m_conditionSuppressions;
1503+
std::array<uint8_t, ConditionType_t::CONDITION_COUNT> m_conditionSuppressionCount {};
15041504

15051505
uint32_t level = 1;
15061506
uint32_t magLevel = 0;

src/lua/creature/movement.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -691,8 +691,17 @@ uint32_t MoveEvent::DeEquipItem(const std::shared_ptr<MoveEvent> &, const std::s
691691
g_game().changePlayerSpeed(player, -item->getSpeed());
692692
}
693693

694-
player->removeConditionSuppressions();
695-
player->sendIcons();
694+
std::vector<ConditionType_t> toRemove;
695+
for (auto cond : it.abilities->conditionSuppressions) {
696+
if (cond == ConditionType_t::CONDITION_NONE) {
697+
continue;
698+
}
699+
toRemove.emplace_back(cond);
700+
}
701+
if (!toRemove.empty()) {
702+
player->removeConditionSuppressions(toRemove);
703+
player->sendIcons();
704+
}
696705

697706
if (it.transformDeEquipTo != 0) {
698707
g_game().transformItem(item, it.transformDeEquipTo);

0 commit comments

Comments
 (0)