This commit is contained in:
aozhiwei 2021-04-09 13:28:35 +08:00
parent 7fbeb35d8e
commit 0dae85dd30
4 changed files with 106 additions and 78 deletions

View File

@ -5,6 +5,7 @@
#include "human.h" #include "human.h"
#include "room.h" #include "room.h"
#include "collider.h" #include "collider.h"
#include "skill.h"
int Buff::GetLeftTime() int Buff::GetLeftTime()
{ {
@ -23,3 +24,96 @@ void Buff::FillMFBuff(cs::MFBuff* buff_pb)
buff_pb->set_left_time(GetLeftTime()); buff_pb->set_left_time(GetLeftTime());
buff_pb->set_lasting_time(GetLastingTime()); buff_pb->set_lasting_time(GetLastingTime());
} }
void Buff::ProcDelayAddBuff(Creature* caster)
{
if (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)
{
#if 0
if (caster) {
SkillCasterState* caster_state = new SkillCasterState;
caster->FillSkillCasterState(caster_state);
room->xtimer.AddRepeatTimerAndAttach
(
buff->meta->param1 / FRAME_RATE_MS,
a8::XParams()
.SetSender(this)
.SetParam1(caster_state)
.SetParam2(buff->meta)
.SetParam3(caster->CurrentSkill() ? caster->CurrentSkill()->meta : nullptr),
[] (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 &&
(!skill ||
(
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_,
[] (const a8::XParams& param)
{
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
delete caster_state;
});
}
#endif
}
void Buff::ProcBatchAddBuff(Creature* caster)
{
}

View File

@ -29,4 +29,8 @@ class Buff
int GetLeftTime(); int GetLeftTime();
int GetLastingTime(); int GetLastingTime();
void FillMFBuff(cs::MFBuff* buff_pb); void FillMFBuff(cs::MFBuff* buff_pb);
void ProcDelayAddBuff(Creature* caster);
void ProcIntervalAddBuff(Creature* caster);
void ProcBatchAddBuff(Creature* caster);
}; };

View File

@ -168,6 +168,7 @@ enum BuffEffectType_e
kBET_InGrass = 56, //在草丛 kBET_InGrass = 56, //在草丛
kBET_InWater = 57, //在水里 kBET_InWater = 57, //在水里
kBET_InIce = 58, //在冰里 kBET_InIce = 58, //在冰里
kBET_BatchAddBuff = 60, //批量添加buff
kBET_End kBET_End
}; };

View File

@ -817,88 +817,12 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
break; break;
case kBET_DelayAddBuff: case kBET_DelayAddBuff:
{ {
if (caster) { buff->ProcDelayAddBuff(caster);
SkillCasterState* caster_state = new SkillCasterState;
caster->FillSkillCasterState(caster_state);
room->xtimer.AddDeadLineTimerAndAttach
(
SERVER_FRAME_RATE * buff->meta->param1,
a8::XParams()
.SetSender(this)
.SetParam1(caster_state)
.SetParam2(buff->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);
}
}
},
&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:
{ {
if (caster) { buff->ProcIntervalAddBuff(caster);
SkillCasterState* caster_state = new SkillCasterState;
caster->FillSkillCasterState(caster_state);
room->xtimer.AddRepeatTimerAndAttach
(
buff->meta->param1 / FRAME_RATE_MS,
a8::XParams()
.SetSender(this)
.SetParam1(caster_state)
.SetParam2(buff->meta)
.SetParam3(caster->CurrentSkill() ? caster->CurrentSkill()->meta : nullptr),
[] (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 &&
(!skill ||
(
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_,
[] (const a8::XParams& param)
{
SkillCasterState* caster_state = (SkillCasterState*)param.param1.GetUserData();
delete caster_state;
});
}
} }
break; break;
case kBET_SummonHero: case kBET_SummonHero:
@ -939,6 +863,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
} }
} }
break; break;
case kBET_BatchAddBuff:
{
buff->ProcBatchAddBuff(caster);
}
break;
default: default:
{ {
} }