diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index a5e44a36..7b5c6a5c 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -16,6 +16,7 @@ #include "entityfactory.h" #include "player.h" #include "incubator.h" +#include "skillhelper.h" RoomObstacle::RoomObstacle():Obstacle() { @@ -856,36 +857,54 @@ void RoomObstacle::ActiveMedicalStation() room->grid_service->GetAllCellsByXy(room, GetPos().x, GetPos().y, *grid_list_); } - if (meta->i->width() > 0 && meta->int_param2 > 0) { - room->xtimer.AddRepeatTimerAndAttach - ( - meta->int_param1 / FRAME_RATE_MS, - a8::XParams() - .SetSender(this), - [] (const a8::XParams& param) - { - RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); - Room* room = obstacle->room; - std::set target_list; - room->grid_service->TraverseCreatures - (room->GetRoomIdx(), - *obstacle->grid_list_, - [obstacle, &target_list, room] (Creature* hum, bool& stop) - { - if (obstacle->master.Get()->team_id == hum->team_id && - !hum->dead && - obstacle->TestCollision(room, hum)) { + if (!skill_meta || !skill_meta->number_meta) { + return; + } + if (skill_meta->GetMagicId() != MAGIC_YLZ) { + return; + } + + room->xtimer.AddRepeatTimerAndAttach + ( + meta->int_param1 / FRAME_RATE_MS, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); + if (!obstacle->master.Get()) { + return; + } + + Room* room = obstacle->room; + std::set target_list; + room->grid_service->TraverseCreatures + (room->GetRoomIdx(), + *obstacle->grid_list_, + [obstacle, &target_list, room] (Creature* hum, bool& stop) + { + if (obstacle->master.Get()->team_id == hum->team_id && + !hum->dead + ) { + if (IntersectCircleCircle( + obstacle->GetPos(), + SkillHelper::GetYlzRange(obstacle->skill_meta), + hum->GetPos(), + hum->GetRadius() + )) { target_list.insert(hum); } } - ); - for (auto& c : target_list) { - c->AddHp(obstacle->meta->int_param2); - } - }, - &xtimer_attacher.timer_list_ - ); - } + } + ); + for (auto& c : target_list) { + c->AddHp(SkillHelper::GetYlzRecoverHp(obstacle->master.Get(), + c, + obstacle->skill_meta)); + } + }, + &xtimer_attacher.timer_list_ + ); } void RoomObstacle::ActivePortal() diff --git a/server/gameserver/skillhelper.cc b/server/gameserver/skillhelper.cc index 496db7d7..ec211f81 100644 --- a/server/gameserver/skillhelper.cc +++ b/server/gameserver/skillhelper.cc @@ -306,3 +306,17 @@ void SkillHelper::ProcSummonObstacle(const MetaData::Skill* skill_meta, RoomObst } } + +int SkillHelper::GetYlzRange(const MetaData::Skill* skill_meta) +{ + return skill_meta->number_meta->float_range2; +} + +int SkillHelper::GetYlzRecoverHp(Creature* sender, Creature* target, const MetaData::Skill* skill_meta) +{ + float hp = + (skill_meta->number_meta->float_ratio + + skill_meta->number_meta->float_ratio * sender->GetBattleContext()->GetHeroTotalAtk()) * + (1 + target->GetBattleContext()->GetExtRecoverHp()); + return hp; +} diff --git a/server/gameserver/skillhelper.h b/server/gameserver/skillhelper.h index 4ce42cbe..fa8e583d 100644 --- a/server/gameserver/skillhelper.h +++ b/server/gameserver/skillhelper.h @@ -34,6 +34,9 @@ class SkillHelper static int GetYmczBuffTime(const MetaData::Skill* skill_meta); static int GetYmczReserveDistance(const MetaData::Skill* skill_meta); static float GetYmczDmg(Creature* sender, Creature* target, const MetaData::Skill* skill_meta); + //医疗站 + static int GetYlzRange(const MetaData::Skill* skill_meta); + static int GetYlzRecoverHp(Creature* sender, Creature* target, const MetaData::Skill* skill_meta); static void ProcBulletHitBuff(Bullet* bullet, Creature* c, int buff_uniid); static bool ProcBulletDmg(Bullet* bullet, Creature* target, float& finaly_dmg);