mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 19:03:43 +00:00
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>
52 lines
2.0 KiB
C++
52 lines
2.0 KiB
C++
#include "ApplyBuffBehavior.h"
|
|
#include "EntityManager.h"
|
|
#include "BehaviorContext.h"
|
|
#include "BehaviorBranchContext.h"
|
|
#include "BuffComponent.h"
|
|
|
|
|
|
void ApplyBuffBehavior::Handle(BehaviorContext* context, RakNet::BitStream& bitStream, BehaviorBranchContext branch) {
|
|
auto* entity = Game::entityManager->GetEntity(branch.target == LWOOBJID_EMPTY ? context->originator : branch.target);
|
|
|
|
if (entity == nullptr) return;
|
|
|
|
auto* buffComponent = entity->GetComponent<BuffComponent>();
|
|
|
|
if (buffComponent == nullptr) return;
|
|
|
|
buffComponent->ApplyBuff(m_BuffId, m_Duration, context->originator, addImmunity, cancelOnDamaged, cancelOnDeath,
|
|
cancelOnLogout, cancelonRemoveBuff, cancelOnUi, cancelOnUnequip, cancelOnZone, m_ApplyOnTeammates);
|
|
}
|
|
|
|
void ApplyBuffBehavior::UnCast(BehaviorContext* context, BehaviorBranchContext branch) {
|
|
auto* entity = Game::entityManager->GetEntity(branch.target);
|
|
|
|
if (entity == nullptr) return;
|
|
|
|
auto* buffComponent = entity->GetComponent<BuffComponent>();
|
|
|
|
if (buffComponent == nullptr) return;
|
|
|
|
// 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) {
|
|
Handle(context, bitStream, branch);
|
|
}
|
|
|
|
void ApplyBuffBehavior::Load() {
|
|
m_BuffId = GetInt("buff_id");
|
|
m_Duration = GetFloat("duration_secs");
|
|
addImmunity = GetBoolean("add_immunity");
|
|
cancelOnDamaged = GetBoolean("cancel_on_damaged");
|
|
cancelOnDeath = GetBoolean("cancel_on_death");
|
|
cancelOnLogout = GetBoolean("cancel_on_logout");
|
|
cancelonRemoveBuff = GetBoolean("cancel_on_remove_buff");
|
|
cancelOnUi = GetBoolean("cancel_on_ui");
|
|
cancelOnUnequip = GetBoolean("cancel_on_unequip");
|
|
cancelOnZone = GetBoolean("cancel_on_zone");
|
|
m_ApplyOnTeammates = GetBoolean("apply_on_teammates");
|
|
}
|