From 74c780bde70fcd7e1d46a088c50d2c94eb209057 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 20 May 2021 11:21:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=86=B2=E5=88=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/buff.cc | 28 ++++++++++++++++++++++++++++ server/gameserver/creature.cc | 25 +++++++++++++++++++++++++ server/gameserver/creature.h | 2 ++ server/gameserver/metadata.cc | 7 +++++++ server/gameserver/metadata.h | 1 + 5 files changed, 63 insertions(+) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index df36029..d14d49b 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -266,5 +266,33 @@ void Buff::ProcSprint(Creature* caster) { if (caster->IsPlayer()) { Player* hum = (Player*)caster; + std::set* hited_objects = new std::set; + owner->room->xtimer.AddRepeatTimerAndAttach + ( + 1, + a8::XParams() + .SetSender(this) + .SetParam1(hited_objects), + [] (const a8::XParams& param) + { + Buff* buff = (Buff*)param.sender.GetUserData(); + std::set* hited_objects = (std::set*)param.param1.GetUserData(); + std::set enemys; + buff->owner->GetHitEnemys(enemys); + for (auto& enemy : enemys) { + if (hited_objects->find(enemy->GetEntityUniId()) != hited_objects->end()) { + hited_objects->insert(enemy->GetEntityUniId()); + for (int buff_id : buff->meta->param1_int_list) { + enemy->TryAddBuff(buff->owner, buff_id); + } + } + } + }, + &xtimer_attacher.timer_list_, + [] (const a8::XParams& param) + { + std::set* hited_objects = (std::set*)param.param1.GetUserData(); + delete hited_objects; + }); } } diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 009263f..5e4a242 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -236,6 +236,14 @@ void Creature::MustBeAddBuff(Creature* caster, int buff_id) AddBuff(caster, buff_meta, 1); } +void Creature::TryAddBuff(Creature* caster, int buff_id) +{ + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); + if (buff_meta) { + AddBuff(caster, buff_meta, 1); + } +} + void Creature::RemoveBuffById(int buff_id) { std::vector removed_buffs; @@ -1716,3 +1724,20 @@ float Creature::GetMaxHP() { return ability.max_hp; } + +void Creature::GetHitEnemys(std::set& enemys) +{ + room->grid_service->TouchCreatures + (room->GetRoomIdx(), + GetGridList(), + [this, &enemys] (Creature* c, bool& stop) + { + if (IsProperTarget(c)) { + AabbCollider aabb_box; + c->GetHitAabbBox(aabb_box); + if (!c->dead && TestCollision(room, &aabb_box)) { + enemys.insert(c); + } + } + }); +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index c44abba..45833ec 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -70,6 +70,7 @@ class Creature : public MoveableEntity MetaData::Skill* buff_skill_meta = nullptr); bool IsImmuneBuffEffect(int buff_effect); void MustBeAddBuff(Creature* caster, int buff_id); + void TryAddBuff(Creature* caster, int buff_id); void RemoveBuffById(int buff_id); void RecalcBuffAttr(); void RemoveBuffByEffectId(int buff_effect_id); @@ -158,6 +159,7 @@ class Creature : public MoveableEntity void ClearAimingBuffs(); float GetHP(); float GetMaxHP(); + void GetHitEnemys(std::set& enemys); private: diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index cb74dde..49d150f 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -639,6 +639,13 @@ namespace MetaData immune_buffeffect.insert(a8::XValue(str)); } } + { + std::vector strings; + a8::Split(i->buff_param1(), strings, '|'); + for (auto& str : strings) { + param1_int_list.push_back(a8::XValue(str).GetInt()); + } + } { std::vector strings; a8::Split(i->buff_param2(), strings, ':'); diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 5155f13..cb9b131 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -180,6 +180,7 @@ namespace MetaData float param2 = 0.0f; float param3 = 0.0f; float param4 = 0.0f; + std::vector param1_int_list; std::vector param2_int_list; std::vector>>> batch_add_list; std::vector>> post_remove_action;