diff --git a/server/gameserver/buff/callfunc.cc b/server/gameserver/buff/callfunc.cc index 629adea8..dc67d09f 100644 --- a/server/gameserver/buff/callfunc.cc +++ b/server/gameserver/buff/callfunc.cc @@ -273,6 +273,12 @@ void CallFuncBuff::Activate() ShowExplosion(); } break; + case BuffCallFunc_e::kAddArmorShield: + { + hold_param2_ = meta->GetBuffParam2(this); + AddArmorShield(); + } + break; default: { } @@ -323,6 +329,14 @@ void CallFuncBuff::Deactivate() } } break; + case BuffCallFunc_e::kAddArmorShield: + { + float dur_time = meta->GetBuffParam3(this); + if (dur_time > 0.00001f) { + owner->ClearArmorShield(); + } + } + break; default: { } @@ -1860,3 +1874,50 @@ void CallFuncBuff::ShowExplosion() explosion_effect, 0); } + +void CallFuncBuff::AddArmorShield() +{ + if (!owner->dead && !owner->downed) { + float dur_time = meta->GetBuffParam3(this); + if (dur_time < 0.00001f) { + dur_time = 99999999; + } + if (owner->armor_shield > 0) { + is_valid_ = false; + #if 0 + owner->GetTrigger()->UpdateArmorShield(hold_param2_, dur_time); + #endif + } else { + owner->AddArmorShield(hold_param2_); + #if 0 + event_handlers_.push_back(owner->GetTrigger()->AddListener + ( + kUpdateArmorShieldEvent, + [this] (const a8::Args& args) mutable + { + int value = args.Get(0); + int new_time = args.Get(1); + owner->AddArmorShield(value); + })); + event_handlers_.push_back(owner->GetTrigger()->AddListener + ( + kDestoryArmorShieldEvent, + [this] (const a8::Args& args) mutable + { + owner->RemoveBuffByUniId(buff_uniid); + })); + #endif + owner->room->xtimer.SetTimeoutWpEx + ( + dur_time / FRAME_RATE_MS, + [owner = owner, buff_uniid = buff_uniid] (int event, const a8::Args* args) mutable + { + if (a8::TIMER_DELETE_EVENT == event) { + owner->ClearArmorShield(); + owner->RemoveBuffByUniId(buff_uniid); + } + }, + &owner->xtimer_attacher); + } + } +} diff --git a/server/gameserver/buff/callfunc.h b/server/gameserver/buff/callfunc.h index 41b63bb2..a4513db3 100644 --- a/server/gameserver/buff/callfunc.h +++ b/server/gameserver/buff/callfunc.h @@ -45,9 +45,9 @@ A8_DECLARE_CLASS_ENUM(BuffCallFunc_e, int, kBuffEffectCondAdd = 45, kRandAdd = 46, kShowExplosion = 47, + kAddArmorShield = 48, ); - class CallFuncBuff : public Buff { public: @@ -90,6 +90,7 @@ class CallFuncBuff : public Buff void BuffEffectCondAdd(); void RandAdd(); void ShowExplosion(); + void AddArmorShield(); void InternalRangeHoldBuff(std::function get_center_func); diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 09bd2e45..d29eb0f9 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -3079,6 +3079,32 @@ void Creature::ClearEnergyShield() false); } +void Creature::AddArmorShield(int value) +{ + armor_shield = value; + max_armor_shield = value; + room->frame_event.AddPropChg + ( + GetWeakPtrRef(), + kPropArmorShield, + armor_shield, + max_armor_shield, + true); +} + +void Creature::ClearArmorShield() +{ + armor_shield = 0; + max_armor_shield = 0; + room->frame_event.AddPropChg + ( + GetWeakPtrRef(), + kPropArmorShield, + armor_shield, + max_armor_shield, + true); +} + std::weak_ptr Creature::AddEffect(int effect_id) { auto effect = std::make_shared(); diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 8dd5d980..1a23176a 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -268,6 +268,9 @@ class Creature : public MoveableEntity void AddEnergyShield(int value); void ClearEnergyShield(); + void AddArmorShield(int value); + void ClearArmorShield(); + void StartAction(ActionType_e action_type, int action_duration, int item_id,