This commit is contained in:
aozhiwei 2021-04-09 13:39:22 +08:00
parent 0dae85dd30
commit 838d9eca3f
2 changed files with 59 additions and 80 deletions

View File

@ -27,59 +27,25 @@ void Buff::FillMFBuff(cs::MFBuff* buff_pb)
void Buff::ProcDelayAddBuff(Creature* caster) void Buff::ProcDelayAddBuff(Creature* caster)
{ {
if (caster) { InternalTimerAddBuff(caster);
SkillCasterState* caster_state = new SkillCasterState;
caster->FillSkillCasterState(caster_state);
owner->room->xtimer.AddDeadLineTimerAndAttach
(
SERVER_FRAME_RATE * meta->param1,
a8::XParams()
.SetSender(owner)
.SetParam1(caster_state)
.SetParam2(meta->param2)
.SetParam3(((Creature*)caster)->CurrentSkill()->meta),
[] (const a8::XParams& param)
{
Creature* receiver = (Creature*)param.sender.GetUserData();
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
if (caster_state->caster.Get()) {
int buff_id = param.param2;
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData();
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
if (buff_meta &&
caster_state->caster.Get()->CurrentSkill() &&
skill == caster_state->caster.Get()->CurrentSkill()->meta) {
SkillCasterState old_caster_state;
caster_state->caster.Get()->FillSkillCasterState(&old_caster_state);
caster_state->caster.Get()->RecoverSkillCasterState(caster_state);
receiver->AddBuff(caster_state->caster.Get(), buff_meta, 1, skill);
caster_state->caster.Get()->RecoverSkillCasterState(&old_caster_state);
}
}
},
&xtimer_attacher.timer_list_,
[] (const a8::XParams& param)
{
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
delete caster_state;
});
}
} }
void Buff::ProcIntervalAddBuff(Creature* caster) void Buff::ProcIntervalAddBuff(Creature* caster)
{ {
#if 0 InternalTimerAddBuff(caster);
if (caster) { }
SkillCasterState* caster_state = new SkillCasterState;
caster->FillSkillCasterState(caster_state); void Buff::ProcBatchAddBuff(Creature* caster)
room->xtimer.AddRepeatTimerAndAttach {
(
buff->meta->param1 / FRAME_RATE_MS, }
a8::XParams()
.SetSender(this) void Buff::InternalTimerAddBuff(Creature* caster)
.SetParam1(caster_state) {
.SetParam2(buff->meta) if (!caster) {
.SetParam3(caster->CurrentSkill() ? caster->CurrentSkill()->meta : nullptr), return;
}
auto timer_func =
[] (const a8::XParams& param) [] (const a8::XParams& param)
{ {
Creature* receiver = (Creature*)param.sender.GetUserData(); Creature* receiver = (Creature*)param.sender.GetUserData();
@ -102,18 +68,28 @@ void Buff::ProcIntervalAddBuff(Creature* caster)
caster_state->caster.Get()->RecoverSkillCasterState(&old_caster_state); caster_state->caster.Get()->RecoverSkillCasterState(&old_caster_state);
} }
} }
}, };
&buff->xtimer_attacher.timer_list_, auto timer_after_func =
[] (const a8::XParams& param) [] (const a8::XParams& param)
{ {
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData(); SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
delete caster_state; delete caster_state;
}); };
}
#endif
}
void Buff::ProcBatchAddBuff(Creature* caster) SkillCasterState* caster_state = new SkillCasterState;
{ caster->FillSkillCasterState(caster_state);
a8::XParams param;
param.SetSender(this);
param.SetParam1(caster_state);
param.SetParam2(meta);
param.SetParam3(caster->CurrentSkill() ? caster->CurrentSkill()->meta : nullptr);
owner->room->xtimer.AddRepeatTimerAndAttach
(
meta->param1 / FRAME_RATE_MS,
param,
timer_func,
&xtimer_attacher.timer_list_,
timer_after_func);
} }

View File

@ -33,4 +33,7 @@ class Buff
void ProcDelayAddBuff(Creature* caster); void ProcDelayAddBuff(Creature* caster);
void ProcIntervalAddBuff(Creature* caster); void ProcIntervalAddBuff(Creature* caster);
void ProcBatchAddBuff(Creature* caster); void ProcBatchAddBuff(Creature* caster);
private:
void InternalTimerAddBuff(Creature* caster);
}; };