diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index d86a122e..78ea8acc 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -921,6 +921,23 @@ void Bullet::TriggerHitBuff(Entity* e) for (int buff_id : gun_meta->hit_buff_list) { MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); if (buff_meta) { + if (c->GetAbility()->GetImmuneVertigoTimes() > 0 && + buff_meta->i->buff_effect() == kBET_Vertigo) { +#ifdef DEBUG + { + std::string dbg_msg = a8::Format + ( + "免疫眩晕 target_uniid:%d ImmuneVertigoTimes:%d", + { + c->GetUniId(), + c->GetAbility()->GetImmuneVertigoTimes() + }); + sender.Get()->SendDebugMsg(dbg_msg); + a8::XPrintf("%s\n", {dbg_msg}); + } +#endif + continue; + } int buff_uniid = c->AddBuff( sender.Get(), buff_meta, diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 6795b3c5..cb08008d 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -307,21 +307,28 @@ void Skill::ProcSJXY() Creature* target = std::any_cast(params.at(1)); int rnd = rand(); bool is_hit = false; + bool is_immune = false; if (shot_times % meta->number_meta->int_ratio == 0) { if ((rnd % 100) < meta->number_meta->float_probability * 100) { - auto itr = hited_objs.find(target->GetUniId()); - if (itr == hited_objs.end()) { - hited_objs[target->GetUniId()] = owner->room->GetFrameNo(); - is_hit = true; + if (target->GetAbility()->GetImmuneVertigoTimes() > 0) { + is_immune = true; } else { - if ((owner->room->GetFrameNo() - itr->second) >= - meta->number_meta->float_cd * SERVER_FRAME_RATE) { - itr->second = owner->room->GetFrameNo(); + auto itr = hited_objs.find(target->GetUniId()); + if (itr == hited_objs.end()) { + hited_objs[target->GetUniId()] = owner->room->GetFrameNo(); is_hit = true; + } else { + if ((owner->room->GetFrameNo() - itr->second) >= + meta->number_meta->float_cd * SERVER_FRAME_RATE) { + itr->second = owner->room->GetFrameNo(); + is_hit = true; + } + }//endif itr + if (is_hit) { + target->TryAddBuffAndSetTime(owner, + kVertigoBuffId, + meta->number_meta->float_time * 1000); } - }//endif itr - if (is_hit) { - target->TryAddBuffAndSetTime(owner, kVertigoBuffId, meta->number_meta->float_time * 1000); } } } @@ -329,7 +336,7 @@ void Skill::ProcSJXY() { std::string dbg_msg = a8::Format ( - "skill_id:%d 射击 shot_times:%d ratio:%d rand:%d probability:%f time:%f 是否眩晕:%d", + "skill_id:%d 射击 shot_times:%d ratio:%d rand:%d probability:%f time:%f 是否眩晕:%d 是否被免疫:%d", { meta->i->skill_id(), shot_times, @@ -337,7 +344,8 @@ void Skill::ProcSJXY() rnd % 100, meta->number_meta->float_probability, meta->number_meta->float_time, - is_hit ? 1 :0 + is_hit ? 1 : 0, + is_immune ? 1 : 0 }); owner->SendDebugMsg(dbg_msg); a8::XPrintf("%s\n", {dbg_msg}); @@ -492,7 +500,12 @@ void Skill::ProcSWZB() } int buff_id = SkillHelper::GetSwzbBuffId(skill_meta); float buff_time = SkillHelper::GetSwzbBuffTime(skill_meta); - c->TryAddBuffAndSetTime(sender.Get(), buff_id, buff_time); + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); + if (c->GetAbility()->GetImmuneVertigoTimes() > 0 && + buff_meta->i->buff_effect() == kBET_Vertigo) { + } else { + c->TryAddBuffAndSetTime(sender.Get(), buff_id, buff_time); + } } } } @@ -553,6 +566,9 @@ void Skill::ProcCMXD() if (c->dead) { return; } + if (c->GetAbility()->GetImmuneVertigoTimes() > 0) { + return; + } float dmg = SkillHelper::GetCmxdDmg(sender.Get(), skill_meta); c->DecHP(dmg, VP_Explosion,