From 4876f683692fbeaa83e8a841763c347b267e2e78 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 23 Jul 2021 12:07:14 +0000 Subject: [PATCH] 1 --- server/gameserver/hero.ai.cc | 28 +++++++++++++++++++++++++++- server/gameserver/metadata.cc | 8 ++++++++ server/gameserver/metadata.h | 2 ++ server/gameserver/roomobstacle.cc | 3 +++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/server/gameserver/hero.ai.cc b/server/gameserver/hero.ai.cc index f1f454e..275ec68 100644 --- a/server/gameserver/hero.ai.cc +++ b/server/gameserver/hero.ai.cc @@ -507,5 +507,31 @@ void HeroAI::UpdateSweepMine() RoomObstacle* HeroAI::FindObstacleTarget() { - return nullptr; + Hero* myself = (Hero*)owner; + RoomObstacle* target = nullptr; + if (!myself->master.Get()) { + return nullptr; + } + + for (auto& pair : myself->room->mine_objects) { + if (pair.second.Get() && + !pair.second.Get()->IsDead(myself->room) && + (pair.second.Get()->meta->sweep_tags & ai_meta->bits_param2) != 0) { + if (pair.second.Get()->GetTeamId(myself->room) == myself->master.Get()->team_id) { + continue; + } + if (target) { + if (myself->GetPos().ManhattanDistance(target->GetPos()) > + myself->GetPos().ManhattanDistance(pair.second.Get()->GetPos())) { + target = pair.second.Get(); + } + } else { + target = pair.second.Get(); + } + } + } + if (target && target->GetPos().Distance(myself->GetPos()) > ai_meta->int_param2) { + target = nullptr; + } + return target; } diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 25aa794..6b71894 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -1170,6 +1170,14 @@ namespace MetaData ); } } + if (i->ai_kind() == kAI_MineSweeper) { + for (int n : int_list_param2) { + if (n <= 0 || n > 63) { + abort(); + } + a8::SetBitFlag(bits_param2, n); + } + } } void AI::Init2() diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 4302657..9a0b8d7 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -317,6 +317,8 @@ namespace MetaData std::set int_set_param4; std::set int_set_param5; + long long bits_param2 = 0; + private: std::tuple random_move_idle_time_; std::tuple random_move_time_; diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index b5d9cf6..40ca0c2 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -407,6 +407,9 @@ void RoomObstacle::Die(Room* room) if (!IsDead(room)) { Obstacle::Die(room); DetachFromMaster(); + if (meta->sweep_tags != 0) { + room->mine_objects.erase(GetUniId()); + } } }