From b4f4b9cdfd51b78c5168159283c53f75bd3cfced Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 7 Apr 2021 15:46:53 +0800 Subject: [PATCH] 1 --- server/gameserver/creature.cc | 3 +++ server/gameserver/roomobstacle.cc | 21 ++++++++++++++++++++- server/gameserver/roomobstacle.h | 2 ++ server/gameserver/select_target.cc | 5 +++++ server/tools/protobuild/metatable.proto | 2 ++ 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 8ac161e..b1d8170 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -503,6 +503,9 @@ void Creature::DoSkill(int skill_id, skill_target_id_ = GetEntityUniId(); } if (CurrentSkill()->meta->i->skill_target() == kST_SpecDir) { + std::set target_list; + SelectSkillTargets(CurrentSkill(), GetPos(), target_list); + TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill); UpdateSkill(); } else { Entity* entity = room->GetEntityByUniId(skill_target_id_); diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index c340da7..653f537 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -264,6 +264,14 @@ void RoomObstacle::Explosion() } } +void RoomObstacle::SpecExplosion() +{ + ++explosion_times_; + if (explosion_times_ >= meta->i->explosion_times()) { + room->xtimer.DeleteTimer(room->xtimer.GetRunningTimer()); + } +} + void RoomObstacle::Active() { switch (meta->i->thing_type()) { @@ -277,7 +285,18 @@ void RoomObstacle::Active() [] (const a8::XParams& param) { RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); - obstacle->Explosion(); + obstacle->room->xtimer.AddRepeatTimerAndAttach + ( + obstacle->meta->i->explosion_interval() / FRAME_RATE_MS, + a8::XParams() + .SetSender(obstacle), + [] (const a8::XParams& param) + { + RoomObstacle* obstacle = (RoomObstacle*)param.sender.GetUserData(); + obstacle->SpecExplosion(); + }, + &obstacle->xtimer_attacher.timer_list_ + ); }, &xtimer_attacher.timer_list_ ); diff --git a/server/gameserver/roomobstacle.h b/server/gameserver/roomobstacle.h index 53e3a55..7413810 100644 --- a/server/gameserver/roomobstacle.h +++ b/server/gameserver/roomobstacle.h @@ -24,10 +24,12 @@ class RoomObstacle : public Obstacle private: void Explosion(); + void SpecExplosion(); protected: bool temp_through_ = false; std::set* grid_list_ = nullptr; + int explosion_times_ = 0; RoomObstacle(); diff --git a/server/gameserver/select_target.cc b/server/gameserver/select_target.cc index 7253816..d60783f 100644 --- a/server/gameserver/select_target.cc +++ b/server/gameserver/select_target.cc @@ -115,6 +115,11 @@ void Creature::SelectSkillTargets(Skill* skill, const a8::Vec2& target_pos, std: target_list.insert(this); } break; + case kST_SpecDir: + { + target_list.insert(this); + } + break; default: break; } diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 003e24f..502bc37 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -55,6 +55,8 @@ message MapThing optional int32 house_id = 13; //房间id optional string buff_list = 14; optional int32 explosion_effect = 15; + optional int32 explosion_interval = 18; + optional int32 explosion_times = 19; } message SafeArea