diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 39d79ed..9337ace 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -260,7 +260,8 @@ void Creature::RecalcBuffAttr() buff_attr_rate_ = {}; for (auto& buff : buff_list_) { if (buff.meta->i->buff_effect() == kBET_ChgAttr || - buff.meta->i->buff_effect() == kBET_Car) { + buff.meta->i->buff_effect() == kBET_Car || + buff.meta->i->buff_effect() == kBET_CrazyMode) { int attr_type = (int)buff.meta->param1; int calc_type = (int)buff.meta->param2; if (IsValidHumanAttr(attr_type)) { @@ -635,6 +636,7 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) switch (buff->meta->i->buff_effect()) { case kBET_ChgAttr: case kBET_Car: + case kBET_CrazyMode: { RecalcBuffAttr(); if (buff->meta->i->buff_effect() == kBET_Car) { @@ -781,31 +783,52 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) { if (caster->GetEntityType() == ET_Player) { room->xtimer.AddDeadLineTimerAndAttach - ( - SERVER_FRAME_RATE * buff->meta->param1, - a8::XParams() - .SetSender(this) - .SetParam1(caster) - .SetParam2(buff->meta->param2) - .SetParam3(((Human*)caster)->CurrentSkill()->meta), - [] (const a8::XParams& param) - { - Human* hum = (Human*)param.sender.GetUserData(); - Human* caster = (Human*)param.param1.GetUserData(); - 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->CurrentSkill()->meta && caster) { - hum->AddBuff(caster, buff_meta, 1, skill); - } - }, - &buff->xtimer_attacher.timer_list_); + ( + SERVER_FRAME_RATE * buff->meta->param1, + a8::XParams() + .SetSender(this) + .SetParam1(caster) + .SetParam2(buff->meta->param2) + .SetParam3(((Creature*)caster)->CurrentSkill()->meta), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + Human* caster = (Human*)param.param1.GetUserData(); + 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->CurrentSkill()->meta && caster) { + hum->AddBuff(caster, buff_meta, 1, skill); + } + }, + &buff->xtimer_attacher.timer_list_); } } break; case kBET_IntervalAddBuff: { - + room->xtimer.AddRepeatTimerAndAttach + ( + FRAME_RATE_MS / buff->meta->param1, + a8::XParams() + .SetSender(this) + .SetParam1(caster) + .SetParam2(buff->meta) + .SetParam3(((Creature*)caster)->CurrentSkill()->meta), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + Human* caster = (Human*)param.param1.GetUserData(); + MetaData::Buff* mother_buff_meta = (MetaData::Buff*)param.param2.GetUserData(); + MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData(); + for (int buff_id : mother_buff_meta->param2_int_list) { + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); + if (buff_meta && skill == caster->CurrentSkill()->meta && caster) { + hum->AddBuff(caster, buff_meta, 1, skill); + } + } + }, + &buff->xtimer_attacher.timer_list_); } break; case kBET_SummonHero: @@ -821,11 +844,6 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) case kBET_Hide: { - } - break; - case kBET_CrazyMode: - { - } break; case kBET_ShockWave: diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 97ce5a2..7a08006 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -169,6 +169,7 @@ namespace MetaData float param2 = 0.0f; float param3 = 0.0f; float param4 = 0.0f; + std::vector param2_int_list; std::set immune_buffeffect; };