From 68a317c4309886df84cfbf0f3b34a39f42a4fdec Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 9 Oct 2022 15:42:27 +0800 Subject: [PATCH] 1 --- server/gameserver/creature.cc | 14 +++++++++++++- server/gameserver/creature.h | 1 + server/gameserver/skill.cc | 27 +++++++++++++++++++++++++-- server/gameserver/trigger.cc | 4 ++-- server/gameserver/trigger.h | 2 +- 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index a82f4656..4cb16377 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -684,7 +684,19 @@ int Creature::TryAddBuff(Creature* caster, int buff_id) if (buff_meta) { return AddBuff(caster, buff_meta); } - return -1; + return 0; +} + +int Creature::TryAddBuffAndSetTime(Creature* caster, int buff_id, int time) +{ + int buff_uniid = TryAddBuff(caster, buff_id); + if (buff_uniid) { + Buff* buff = GetBuffByUniId(buff_uniid); + room->xtimer.ModifyTimer + (buff->remover_timer, + time / FRAME_RATE_MS); + } + return buff_uniid; } std::weak_ptr Creature::TryDelayAddBuff(Creature* caster, int buff_id, int time) diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 4581681a..64e7623c 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -138,6 +138,7 @@ class Creature : public MoveableEntity int MustBeAddBuff(Creature* caster, int buff_id); std::weak_ptr TryDelayAddBuff(Creature* caster, int buff_id, int time); int TryAddBuff(Creature* caster, int buff_id); + int TryAddBuffAndSetTime(Creature* caster, int buff_id, int time); int TryAddBuffWithTarget(Creature* caster, int buff_id); void RemoveBuffById(int buff_id); void RemoveBuffByUniId(int buff_uniid); diff --git a/server/gameserver/skill.cc b/server/gameserver/skill.cc index 37c9781f..033fcf62 100644 --- a/server/gameserver/skill.cc +++ b/server/gameserver/skill.cc @@ -293,12 +293,35 @@ void Skill::InitPassiveSkill() void Skill::ProcSJXY() { + int shot_times = 0; + std::map hited_objs; owner->GetTrigger()->AddListener ( kBulletHitEvent, - [this] (const std::vector& params) + [this, shot_times, hited_objs] (const std::vector& params) mutable { - + ++shot_times; + Bullet* bullet = std::any_cast(params.at(0)); + Creature* target = std::any_cast(params.at(1)); + if (shot_times % meta->number_meta->int_ratio == 0) { + if ((rand() % 100) < meta->number_meta->float_probability * 100) { + bool is_hit = false; + 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_cd * 1000); + } + } + } } ); } diff --git a/server/gameserver/trigger.cc b/server/gameserver/trigger.cc index 8792825a..57fd4b27 100644 --- a/server/gameserver/trigger.cc +++ b/server/gameserver/trigger.cc @@ -422,10 +422,10 @@ void Trigger::DispatchEvent(int event_id, const std::vector& param) } } -void Trigger::BulletHit(Bullet* bullet) +void Trigger::BulletHit(Bullet* bullet, Creature* target) { if (bullet->sender.Get()) { - bullet->sender.Get()->GetTrigger()->DispatchEvent(kBulletHitEvent, {bullet}); + bullet->sender.Get()->GetTrigger()->DispatchEvent(kBulletHitEvent, {bullet, target}); } } diff --git a/server/gameserver/trigger.h b/server/gameserver/trigger.h index 13421a6e..6401d96b 100644 --- a/server/gameserver/trigger.h +++ b/server/gameserver/trigger.h @@ -55,7 +55,7 @@ public: void Die(); void ActiveBuff(MetaData::Buff* buff_meta); void DeactiveBuff(MetaData::Buff* buff_meta); - void BulletHit(Bullet* bullet); + void BulletHit(Bullet* bullet, Creature* target); void ShieldDestory(); void Rescue(Human* target);