This commit is contained in:
aozhiwei 2024-03-06 16:46:29 +08:00
parent 892da19824
commit e17c25b65f
4 changed files with 129 additions and 7 deletions

View File

@ -393,3 +393,13 @@ void Buff::SetV(int key, int val)
} }
(*dyn_data_)[key] = val; (*dyn_data_)[key] = val;
} }
void Buff::PreExec(const a8::Args* args)
{
}
void Buff::PostExec(const a8::Args* args)
{
}

View File

@ -62,6 +62,8 @@ class Buff
virtual void Activate(); virtual void Activate();
virtual void Deactivate(); virtual void Deactivate();
virtual void PreExec(const a8::Args* args);
virtual void PostExec(const a8::Args* args);
protected: protected:
void ClearEventHandlers(); void ClearEventHandlers();

View File

@ -1603,15 +1603,17 @@ void CallFuncBuff::OnBreakSkill()
void CallFuncBuff::BreakSkill() void CallFuncBuff::BreakSkill()
{ {
Buff* on_break_buff = nullptr; Buff* selected_buff = nullptr;
for (auto buff_id : meta->_buff_param2_int_list) { for (auto buff_id : meta->_buff_param2_int_list) {
on_break_buff = owner->GetBuffById(buff_id); selected_buff = owner->GetBuffById(buff_id);
if (on_break_buff) { if (selected_buff) {
break; break;
} }
} }
if (on_break_buff) { if (selected_buff) {
int buff_uniid = on_break_buff->buff_uniid; a8::Args args({this});
selected_buff->PreExec(&args);
int buff_uniid = selected_buff->buff_uniid;
for (auto buff_id : meta->_buff_param3_int_list) { for (auto buff_id : meta->_buff_param3_int_list) {
if (buff_id > 0) { if (buff_id > 0) {
owner->TryAddBuff( owner->TryAddBuff(
@ -1625,7 +1627,10 @@ void CallFuncBuff::BreakSkill()
owner->RemoveBuffById(-buff_id); owner->RemoveBuffById(-buff_id);
} }
} }
owner->RemoveBuffByUniId(buff_uniid); if (selected_buff) {
selected_buff->PostExec(&args);
owner->RemoveBuffByUniId(buff_uniid);
}
} else { } else {
for (auto buff_id : meta->_buff_param4_int_list) { for (auto buff_id : meta->_buff_param4_int_list) {
if (buff_id > 0) { if (buff_id > 0) {
@ -1645,5 +1650,105 @@ void CallFuncBuff::BreakSkill()
void CallFuncBuff::BuffEffectCondAdd() void CallFuncBuff::BuffEffectCondAdd()
{ {
Buff* selected_buff = nullptr;
for (auto buff_effect : meta->_buff_param2_int_list) {
selected_buff = owner->GetBuffByEffectId(buff_effect);
if (selected_buff) {
break;
}
}
if (selected_buff) {
for (auto buff_id : meta->_buff_param3_int_list) {
if (buff_id > 0) {
owner->TryAddBuff(
GetCaster().Get(),
buff_id,
skill_meta,
init_args,
buff_vars
);
} else {
owner->RemoveBuffById(-buff_id);
}
}
selected_buff = owner->GetBuffByUniId(buff_uniid);
} else {
for (auto buff_id : meta->_buff_param4_int_list) {
if (buff_id > 0) {
owner->TryAddBuff(
GetCaster().Get(),
buff_id,
skill_meta,
init_args,
buff_vars
);
} else {
owner->RemoveBuffById(-buff_id);
}
}
}
}
void CallFuncBuff::PreExec(const a8::Args* args)
{
switch ((BuffCallFunc_e)meta->_int_buff_param1) {
case BuffCallFunc_e::kOnBreakSkill:
{
OnBreakSkillPreExec();
}
break;
default:
{
break;
}
}
}
void CallFuncBuff::PostExec(const a8::Args* args)
{
switch ((BuffCallFunc_e)meta->_int_buff_param1) {
case BuffCallFunc_e::kOnBreakSkill:
{
OnBreakSkillPostExec();
}
break;
default:
{
break;
}
}
}
void CallFuncBuff::OnBreakSkillPreExec()
{
for (auto buff_id : meta->_buff_param2_int_list) {
if (buff_id > 0) {
owner->TryAddBuff(
GetCaster().Get(),
buff_id,
skill_meta,
init_args,
buff_vars
);
} else {
owner->RemoveBuffById(-buff_id);
}
}
}
void CallFuncBuff::OnBreakSkillPostExec()
{
for (auto buff_id : meta->_buff_param3_int_list) {
if (buff_id > 0) {
owner->TryAddBuff(
GetCaster().Get(),
buff_id,
skill_meta,
init_args,
buff_vars
);
} else {
owner->RemoveBuffById(-buff_id);
}
}
} }

View File

@ -52,6 +52,8 @@ class CallFuncBuff : public Buff
virtual void Activate() override; virtual void Activate() override;
virtual void Deactivate() override; virtual void Deactivate() override;
virtual void PreExec(const a8::Args* args) override;
virtual void PostExec(const a8::Args* args) override;
private: private:
void ProcIntervalRangeAddBuffFunc(); void ProcIntervalRangeAddBuffFunc();
@ -87,6 +89,9 @@ class CallFuncBuff : public Buff
void InternalRangeHoldBuff(std::function<bool(glm::vec3&)> get_center_func); void InternalRangeHoldBuff(std::function<bool(glm::vec3&)> get_center_func);
void OnBreakSkillPreExec();
void OnBreakSkillPostExec();
float hold_param2_ = 0.0; float hold_param2_ = 0.0;
Weapon* hold_weapon_ = nullptr; Weapon* hold_weapon_ = nullptr;
std::function<void()> deactivate_cb_ = nullptr; std::function<void()> deactivate_cb_ = nullptr;