mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-28 15:37:14 +00:00
fix(buffs): remove equipment buffs with bFromUnEquip on unequip
Unequipping an item uncasts its equip skills; ApplyBuffBehavior::UnCast now removes the buff with bFromUnEquip set, as live did (2014 captures: RemoveBuff for buffs 3, 4, 5, 50 and 61 always carried bFromUnEquip, and those are exactly the cancel_on_unequip buffs in the CDClient). The client only drops a buff for such a removal when it was added with cancelOnUnEquip (LWOBuffComponent::RemoveBuffIcon @ 0x00cf99b0), so BuffComponent::RemoveBuff does the same to stay in step with it. Also corrects the bFromRemoveBehavior comment: the client does not ignore the message, it only removes buffs added with cancelOnRemoveBuff. Replaces the TODO in InventoryComponent::RemoveBuff. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -27,7 +27,9 @@ void ApplyBuffBehavior::UnCast(BehaviorContext* context, BehaviorBranchContext b
|
|||||||
|
|
||||||
if (buffComponent == nullptr) return;
|
if (buffComponent == nullptr) return;
|
||||||
|
|
||||||
buffComponent->RemoveBuff(m_BuffId);
|
// UnCast only runs when the item (or item set) that cast the buff is unequipped. Live servers sent those
|
||||||
|
// removals with bFromUnEquip set (2014 captures: buffs 3, 4, 5, 50 and 61, all cancel_on_unequip).
|
||||||
|
buffComponent->RemoveBuff(m_BuffId, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApplyBuffBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
void ApplyBuffBehavior::Calculate(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
||||||
|
|||||||
@@ -229,6 +229,10 @@ void BuffComponent::RemoveBuff(int32_t id, bool fromUnEquip, bool removeImmunity
|
|||||||
// If the buff is already scheduled to be removed, don't do it again
|
// If the buff is already scheduled to be removed, don't do it again
|
||||||
if (iter == m_Buffs.end() || m_BuffsToRemove.contains(id)) return;
|
if (iter == m_Buffs.end() || m_BuffsToRemove.contains(id)) return;
|
||||||
|
|
||||||
|
// The client only removes a buff for an unequip when it was applied with cancelOnUnequip
|
||||||
|
// (LWOBuffComponent::RemoveBuffIcon @ 00cf99b0 in 1.10.64); keep the server's copy in step with it.
|
||||||
|
if (fromUnEquip && !iter->second.cancelOnUnequip) return;
|
||||||
|
|
||||||
if (!ignoreRefCount && !iter->second.cancelOnRemoveBuff) {
|
if (!ignoreRefCount && !iter->second.cancelOnRemoveBuff) {
|
||||||
iter->second.refCount--;
|
iter->second.refCount--;
|
||||||
LOG_DEBUG("refCount for buff %i is now %i", id, iter->second.refCount);
|
LOG_DEBUG("refCount for buff %i is now %i", id, iter->second.refCount);
|
||||||
|
|||||||
@@ -1160,7 +1160,7 @@ void InventoryComponent::ApplyBuff(Item* item) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO Something needs to send the remove buff GameMessage as well when it is unequipping items that would remove buffs.
|
// Uncasting the item's equip skills sends RemoveBuff (with bFromUnEquip) for the buffs they applied, see ApplyBuffBehavior::UnCast.
|
||||||
void InventoryComponent::RemoveBuff(Item* item) const {
|
void InventoryComponent::RemoveBuff(Item* item) const {
|
||||||
const auto buffs = FindBuffs(item, false);
|
const auto buffs = FindBuffs(item, false);
|
||||||
|
|
||||||
|
|||||||
@@ -223,7 +223,8 @@ namespace GameMessages {
|
|||||||
void Serialize(RakNet::BitStream& bitStream) const override;
|
void Serialize(RakNet::BitStream& bitStream) const override;
|
||||||
bool Deserialize(RakNet::BitStream& bitStream) override;
|
bool Deserialize(RakNet::BitStream& bitStream) override;
|
||||||
|
|
||||||
// DLU always sends false: setting it makes the client ignore the message.
|
// With either flag set the client only removes a buff that was added with the matching cancelOnRemoveBuff /
|
||||||
|
// cancelOnUnEquip (LWOBuffComponent::RemoveBuffIcon @ 00cf99b0 in 1.10.64).
|
||||||
bool bFromRemoveBehavior{ false };
|
bool bFromRemoveBehavior{ false };
|
||||||
bool bFromUnEquip{ false };
|
bool bFromUnEquip{ false };
|
||||||
bool bRemoveImmunity{ false };
|
bool bRemoveImmunity{ false };
|
||||||
|
|||||||
Reference in New Issue
Block a user