修复延迟buff问题

This commit is contained in:
aozhiwei 2021-04-07 19:27:36 +08:00
parent ed3c30052e
commit 431842744b
3 changed files with 104 additions and 42 deletions

View File

@ -809,54 +809,84 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
break; break;
case kBET_DelayAddBuff: case kBET_DelayAddBuff:
{ {
if (caster->GetEntityType() == ET_Player) { if (caster) {
SkillCasterState* caster_state = new SkillCasterState;
caster->FillSkillCasterState(caster_state);
room->xtimer.AddDeadLineTimerAndAttach room->xtimer.AddDeadLineTimerAndAttach
( (
SERVER_FRAME_RATE * buff->meta->param1, SERVER_FRAME_RATE * buff->meta->param1,
a8::XParams() a8::XParams()
.SetSender(this) .SetSender(this)
.SetParam1(caster) .SetParam1(caster_state)
.SetParam2(buff->meta->param2) .SetParam2(buff->meta->param2)
.SetParam3(((Creature*)caster)->CurrentSkill()->meta), .SetParam3(((Creature*)caster)->CurrentSkill()->meta),
[] (const a8::XParams& param) [] (const a8::XParams& param)
{ {
Human* hum = (Human*)param.sender.GetUserData(); Creature* receiver = (Creature*)param.sender.GetUserData();
Human* caster = (Human*)param.param1.GetUserData(); SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
int buff_id = param.param2; if (caster_state->caster.Get()) {
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData(); int buff_id = param.param2;
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData();
if (buff_meta && skill == caster->CurrentSkill()->meta && caster) { MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id);
hum->AddBuff(caster, buff_meta, 1, skill); if (buff_meta &&
} caster_state->caster.Get()->CurrentSkill() &&
}, skill == caster_state->caster.Get()->CurrentSkill()->meta) {
&buff->xtimer_attacher.timer_list_); 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);
}
}
},
&buff->xtimer_attacher.timer_list_,
[] (const a8::XParams& param)
{
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
delete caster_state;
});
} }
} }
break; break;
case kBET_IntervalAddBuff: case kBET_IntervalAddBuff:
{ {
room->xtimer.AddRepeatTimerAndAttach if (caster) {
( SkillCasterState* caster_state = new SkillCasterState;
FRAME_RATE_MS / buff->meta->param1, caster->FillSkillCasterState(caster_state);
a8::XParams() room->xtimer.AddRepeatTimerAndAttach
.SetSender(this) (
.SetParam1(caster) buff->meta->param1 / FRAME_RATE_MS,
.SetParam2(buff->meta) a8::XParams()
.SetParam3(((Creature*)caster)->CurrentSkill()->meta), .SetSender(this)
[] (const a8::XParams& param) .SetParam1(caster_state)
{ .SetParam2(buff->meta)
Human* hum = (Human*)param.sender.GetUserData(); .SetParam3(((Creature*)caster)->CurrentSkill()->meta),
Human* caster = (Human*)param.param1.GetUserData(); [] (const a8::XParams& param)
MetaData::Buff* mother_buff_meta = (MetaData::Buff*)param.param2.GetUserData(); {
MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData(); Creature* receiver = (Creature*)param.sender.GetUserData();
for (int buff_id : mother_buff_meta->param2_int_list) { SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); if (caster_state->caster.Get()) {
if (buff_meta && skill == caster->CurrentSkill()->meta && caster) { int buff_id = param.param2;
hum->AddBuff(caster, buff_meta, 1, skill); 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);
}
} }
} },
}, &buff->xtimer_attacher.timer_list_,
&buff->xtimer_attacher.timer_list_); [] (const a8::XParams& param)
{
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
delete caster_state;
});
}
} }
break; break;
case kBET_SummonHero: case kBET_SummonHero:
@ -1399,3 +1429,22 @@ bool Creature::CollisonDetection()
} }
return false; return false;
} }
void Creature::FillSkillCasterState(SkillCasterState* caster_state)
{
caster_state->caster.Attach(this);
caster_state->caster_pos = GetPos();
caster_state->caster_skill_id = CurrentSkill() ? CurrentSkill()->meta->i->skill_id() : 0;
caster_state->caster_skill_target_id = skill_target_id_;
caster_state->caster_skill_dir = skill_dir_;
caster_state->caster_skill_distance = skill_distance_;
caster_state->caster_skill_param1 = skill_param1;
}
void Creature::RecoverSkillCasterState(SkillCasterState* caster_state)
{
skill_target_id_ = caster_state->caster_skill_target_id;
skill_dir_ = caster_state->caster_skill_dir;
skill_distance_ = caster_state->caster_skill_distance;
skill_param1 = caster_state->caster_skill_param1;
}

View File

@ -12,6 +12,17 @@ namespace MetaData
class SkillPhase; class SkillPhase;
} }
struct SkillCasterState
{
CreatureWeakPtr caster;
a8::Vec2 caster_pos;
int caster_skill_id = 0;
int caster_skill_target_id = 0;
a8::Vec2 caster_skill_dir;
float caster_skill_distance = 0.0f;
float caster_skill_param1 = 0.0f;
};
struct xtimer_list; struct xtimer_list;
class Skill; class Skill;
class Obstacle; class Obstacle;
@ -121,6 +132,8 @@ class Creature : public MoveableEntity
void CheckSpecObject(); void CheckSpecObject();
RoomObstacle* SummonObstacle(int id, const a8::Vec2& pos); RoomObstacle* SummonObstacle(int id, const a8::Vec2& pos);
bool CollisonDetection(); bool CollisonDetection();
void FillSkillCasterState(SkillCasterState* caster_state);
void RecoverSkillCasterState(SkillCasterState* caster_state);
private: private:

@ -1 +1 @@
Subproject commit 9f43c10312f3f3adccab2d477365c0c1d9200e03 Subproject commit 1bcc24955410e67342d5e44c2e35addff5111fca