This commit is contained in:
aozhiwei 2022-10-09 15:42:27 +08:00
parent 1dd0b0e25e
commit 68a317c430
5 changed files with 42 additions and 6 deletions

View File

@ -684,7 +684,19 @@ int Creature::TryAddBuff(Creature* caster, int buff_id)
if (buff_meta) { if (buff_meta) {
return AddBuff(caster, 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<a8::XTimerPtr> Creature::TryDelayAddBuff(Creature* caster, int buff_id, int time) std::weak_ptr<a8::XTimerPtr> Creature::TryDelayAddBuff(Creature* caster, int buff_id, int time)

View File

@ -138,6 +138,7 @@ class Creature : public MoveableEntity
int MustBeAddBuff(Creature* caster, int buff_id); int MustBeAddBuff(Creature* caster, int buff_id);
std::weak_ptr<a8::XTimerPtr> TryDelayAddBuff(Creature* caster, int buff_id, int time); std::weak_ptr<a8::XTimerPtr> TryDelayAddBuff(Creature* caster, int buff_id, int time);
int TryAddBuff(Creature* caster, int buff_id); int TryAddBuff(Creature* caster, int buff_id);
int TryAddBuffAndSetTime(Creature* caster, int buff_id, int time);
int TryAddBuffWithTarget(Creature* caster, int buff_id); int TryAddBuffWithTarget(Creature* caster, int buff_id);
void RemoveBuffById(int buff_id); void RemoveBuffById(int buff_id);
void RemoveBuffByUniId(int buff_uniid); void RemoveBuffByUniId(int buff_uniid);

View File

@ -293,12 +293,35 @@ void Skill::InitPassiveSkill()
void Skill::ProcSJXY() void Skill::ProcSJXY()
{ {
int shot_times = 0;
std::map<int, long long> hited_objs;
owner->GetTrigger()->AddListener owner->GetTrigger()->AddListener
( (
kBulletHitEvent, kBulletHitEvent,
[this] (const std::vector<std::any>& params) [this, shot_times, hited_objs] (const std::vector<std::any>& params) mutable
{ {
++shot_times;
Bullet* bullet = std::any_cast<Bullet*>(params.at(0));
Creature* target = std::any_cast<Creature*>(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);
}
}
}
} }
); );
} }

View File

@ -422,10 +422,10 @@ void Trigger::DispatchEvent(int event_id, const std::vector<std::any>& param)
} }
} }
void Trigger::BulletHit(Bullet* bullet) void Trigger::BulletHit(Bullet* bullet, Creature* target)
{ {
if (bullet->sender.Get()) { if (bullet->sender.Get()) {
bullet->sender.Get()->GetTrigger()->DispatchEvent(kBulletHitEvent, {bullet}); bullet->sender.Get()->GetTrigger()->DispatchEvent(kBulletHitEvent, {bullet, target});
} }
} }

View File

@ -55,7 +55,7 @@ public:
void Die(); void Die();
void ActiveBuff(MetaData::Buff* buff_meta); void ActiveBuff(MetaData::Buff* buff_meta);
void DeactiveBuff(MetaData::Buff* buff_meta); void DeactiveBuff(MetaData::Buff* buff_meta);
void BulletHit(Bullet* bullet); void BulletHit(Bullet* bullet, Creature* target);
void ShieldDestory(); void ShieldDestory();
void Rescue(Human* target); void Rescue(Human* target);