From aec866a01037deb66f62acb220afffb849a814e5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 5 Jun 2020 09:54:41 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/android.ai.cc | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index 0874e3f..ad4945b 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -186,17 +186,7 @@ void AndroidAI::UpdateNewBieNpc() } else if (hum->room->GetFrameNo() - hum->enable_frameno < SERVER_FRAME_RATE * 1.5) { int speed = std::max(1, (int)hum->GetSpeed()); for (int i = 0; i < speed; ++i) { - a8::Vec2 old_pos = hum->GetPos(); hum->SetPos(hum->GetPos() + hum->move_dir); - #if 0 - if (hum->IsCollisionInMapService()) { - hum->SetPos(old_pos); - if (i == 0) { - hum->FindPathInMapService(); - } - break; - } - #endif hum->room->grid_service->MoveHuman(hum); } } else if (hum->room->GetFrameNo() - hum->enable_frameno < SERVER_FRAME_RATE * 3) { @@ -230,17 +220,7 @@ void AndroidAI::UpdateLastNpc() } else if (hum->room->GetFrameNo() - hum->enable_frameno < SERVER_FRAME_RATE * 1.5) { int speed = std::max(1, (int)hum->GetSpeed()); for (int i = 0; i < speed; ++i) { - a8::Vec2 old_pos = hum->GetPos(); hum->SetPos(hum->GetPos() + hum->move_dir); - #if 0 - if (hum->IsCollisionInMapService()) { - hum->SetPos(old_pos); - if (i == 0) { - hum->FindPathInMapService(); - } - break; - } - #endif hum->room->grid_service->MoveHuman(hum); } } else if (hum->room->GetFrameNo() - hum->enable_frameno < SERVER_FRAME_RATE * 3) { @@ -337,17 +317,7 @@ void AndroidAI::UpdateNewBieRoomLogic() hum->attack_dir = hum->move_dir; speed *= 0.7; for (int i = 0; i < speed; ++i) { - a8::Vec2 old_pos = hum->GetPos(); hum->SetPos(hum->GetPos() + hum->move_dir); - #if 0 - if (hum->IsCollisionInMapService()) { - hum->SetPos(old_pos); - if (i == 0) { - hum->FindPathInMapService(); - } - break; - } - #endif hum->room->grid_service->MoveHuman(hum); } } else { From 223b7fccce29e333e52030b57905eb3e835d27f9 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 5 Jun 2020 10:00:04 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E4=BC=98=E5=8C=96SendUpdateMsg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index aba6683..4ffe0f0 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1471,7 +1471,7 @@ void Human::RemoveObserver(Human* observer) void Human::SendUpdateMsg() { - if (!follow_target_ && !a8::HasBitFlag(status, HS_Disable)) { + if (!follow_target_ && !a8::HasBitFlag(status, HS_Disable) && IsPlayer()) { cs::MFActivePlayerData* active_player_data_pb = nullptr; if (send_msg_times == 0 || need_sync_active_player) { active_player_data_pb = new cs::MFActivePlayerData(); @@ -1491,6 +1491,8 @@ void Human::SendUpdateMsg() delete active_player_data_pb; } ++send_msg_times; + } else { + need_sync_active_player = false; } ClearFrameData(); } From 1ad7610ce7b52a7dea251888ea100be171e5040d Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 5 Jun 2020 10:15:24 +0800 Subject: [PATCH 3/6] 1 --- server/gameserver/android.ai.cc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index ad4945b..f1f5517 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -262,23 +262,22 @@ void AndroidAI::UpdateNewBieRoomLogic() } }); } else { - std::vector alive_humans; hum->room->TouchHumanList ( a8::XParams(), - [hum, &alive_humans] (Human* huma, a8::XParams& param) + [hum, &target] (Human* huma, a8::XParams& param) { if (!huma->dead && huma->IsAndroid() && hum->team_id != huma->team_id && !a8::HasBitFlag(huma->status, HS_Disable)) { - alive_humans.push_back(huma); + if (hum->GetPos().ManhattanDistance(huma->GetPos()) < + hum->GetPos().ManhattanDistance(target->GetPos())) { + target = huma; + } } return true; }); - if (!alive_humans.empty()) { - target = alive_humans[rand() % alive_humans.size()]; - } } last_target_ = target; } From 45acd5264e6925ec8b7afec65496d5635c02f485 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 5 Jun 2020 11:05:16 +0800 Subject: [PATCH 4/6] 1 --- server/gameserver/android.ai.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index f1f5517..fb7e8a3 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -271,9 +271,13 @@ void AndroidAI::UpdateNewBieRoomLogic() huma->IsAndroid() && hum->team_id != huma->team_id && !a8::HasBitFlag(huma->status, HS_Disable)) { - if (hum->GetPos().ManhattanDistance(huma->GetPos()) < - hum->GetPos().ManhattanDistance(target->GetPos())) { + if (!target) { target = huma; + } else { + if (hum->GetPos().ManhattanDistance(huma->GetPos()) < + hum->GetPos().ManhattanDistance(target->GetPos())) { + target = huma; + } } } return true; From edb0faa6d204256f51ffc4aca531364e5390ab8a Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 5 Jun 2020 14:34:58 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=9C=BA=E5=88=B7?= =?UTF-8?q?=E5=88=B0=E6=8C=87=E5=AE=9A=E5=87=BA=E7=94=9F=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/mapmgr.cc | 9 +++++++-- server/gameserver/mapmgr.h | 3 ++- server/gameserver/metamgr.cc | 1 + server/gameserver/metamgr.h | 1 + server/gameserver/room.cc | 18 ++++++++++++++---- server/gameserver/room.h | 6 ++++-- server/gameserver/types.h | 3 ++- 7 files changed, 31 insertions(+), 10 deletions(-) diff --git a/server/gameserver/mapmgr.cc b/server/gameserver/mapmgr.cc index fe211ab..0250ba0 100644 --- a/server/gameserver/mapmgr.cc +++ b/server/gameserver/mapmgr.cc @@ -59,7 +59,8 @@ void MapMgr::AttachRoom(Room* room, RoomInitInfo& init_info) init_info.grid_service = grid_service_; init_info.map_service = map_service_; init_info.spawn_points = &spawn_points_; - init_info.newbie_born_point_meta = newbie_born_point_; + init_info.level0room_born_point_meta = level0room_born_point_; + init_info.level1room_born_point_meta = level1room_born_point_; init_info.loots = &loots_; init_info.buildings = &buildings_; init_info.level0room_spec_things = &level0room_spec_things_; @@ -106,7 +107,11 @@ void MapMgr::CreateThings() } if (spawn_points_hash.find(MetaMgr::Instance()->newbie_born_point) != spawn_points_hash.end()) { - newbie_born_point_ = spawn_points_hash[MetaMgr::Instance()->newbie_born_point]; + level0room_born_point_ = spawn_points_hash[MetaMgr::Instance()->newbie_born_point]; + } + if (spawn_points_hash.find(MetaMgr::Instance()->level1room_born_point) != + spawn_points_hash.end()) { + level1room_born_point_ = spawn_points_hash[MetaMgr::Instance()->level1room_born_point]; } } diff --git a/server/gameserver/mapmgr.h b/server/gameserver/mapmgr.h index 2b42b16..a78e28f 100644 --- a/server/gameserver/mapmgr.h +++ b/server/gameserver/mapmgr.h @@ -42,7 +42,8 @@ class MapMgr : public a8::Singleton MapService* map_service_ = nullptr; GridService* grid_service_ = nullptr; std::vector spawn_points_; - MetaData::MapTplThing* newbie_born_point_ = nullptr; + MetaData::MapTplThing* level0room_born_point_ = nullptr; + MetaData::MapTplThing* level1room_born_point_ = nullptr; std::vector loots_; std::vector buildings_; std::vector level0room_spec_things_; diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 01efa9c..fb84daf 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -240,6 +240,7 @@ public: METAMGR_READ(level1room_robot_water, 8); METAMGR_READ(level1room_robot_autodie_time, 10); METAMGR_READ(level1room_robot_autodie_distance, 500); + METAMGR_READ_STR(level1room_born_point, ""); METAMGR_READ(refresh_robot_min_num, 5); METAMGR_READ(refresh_robot_max_num, 10); diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 733ac9e..b7c20cc 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -100,6 +100,7 @@ class MetaMgr : public a8::Singleton int level1room_robot_water = 0; int level1room_robot_autodie_time = 0; int level1room_robot_autodie_distance = 0; + std::string level1room_born_point; int refresh_robot_min_num = 0; int refresh_robot_max_num = 0; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index f514608..7e07f6b 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -51,7 +51,8 @@ void Room::InitData(RoomInitInfo& init_info) map_service = init_info.map_service; map_meta_ = init_info.map_meta; spawn_points_ = init_info.spawn_points; - newbie_born_point_meta_ = init_info.newbie_born_point_meta; + level0room_born_point_meta_ = init_info.level0room_born_point_meta; + level1room_born_point_meta_ = init_info.level1room_born_point_meta; loots_ = init_info.loots; buildings_ = init_info.buildings; level0room_spec_things_ = init_info.level0room_spec_things; @@ -1464,8 +1465,11 @@ void Room::CreateSpawnPoints() BornPoint born_point; born_point.thing_tpl = thing_tpl; born_point_hash_[uniid] = born_point; - if (thing_tpl == newbie_born_point_meta_) { - newbie_born_point_uniid_ = uniid; + if (thing_tpl == level0room_born_point_meta_) { + level0room_born_point_uniid_ = uniid; + } + if (thing_tpl == level1room_born_point_meta_) { + level1room_born_point_uniid_ = uniid; } } } @@ -1571,7 +1575,7 @@ void Room::SecondRandPoint() } CombineTeamBornPoint(); if (room_type_ == RT_NewBrid) { - BornPoint* newbie_point = GetBornPoint(newbie_born_point_uniid_); + BornPoint* newbie_point = GetBornPoint(level0room_born_point_uniid_); if (newbie_point && first_newbie_) { ForceSetBornPoint(first_newbie_, newbie_point); } else { @@ -1579,10 +1583,16 @@ void Room::SecondRandPoint() } } if (room_type_ == RT_MidBrid) { + BornPoint* newbie_point = GetBornPoint(level0room_born_point_uniid_); for (auto& pair : accountid_hash_) { pair.second->on_grid_chg = std::bind(&Room::OnHumanGridChg, this, std::placeholders::_1); + for (Human* member : *pair.second->team_members) { + if (newbie_point) { + ForceSetBornPoint(member, newbie_point); + } + } } } #ifdef DEBUG diff --git a/server/gameserver/room.h b/server/gameserver/room.h index c39d9c6..6b7d59c 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -206,7 +206,8 @@ private: std::string map_tpl_name_; RoomType_e room_type_ = RT_NewBrid; const std::vector* spawn_points_ = nullptr; - const MetaData::MapTplThing* newbie_born_point_meta_ = nullptr; + const MetaData::MapTplThing* level0room_born_point_meta_ = nullptr; + const MetaData::MapTplThing* level1room_born_point_meta_ = nullptr; const std::vector* loots_ = nullptr; const std::vector* buildings_ = nullptr; const std::vector* level0room_spec_things_ = nullptr; @@ -223,7 +224,8 @@ private: MetaData::AirLine* airline_ = nullptr; a8::XTimerAttacher xtimer_attacher_; size_t airdrop_times_ = 0; - int newbie_born_point_uniid_ = 0; + int level0room_born_point_uniid_ = 0; + int level1room_born_point_uniid_ = 0; bool show_handed_ = false; int current_teamid_ = 0; diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 10a5810..529e479 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -151,7 +151,8 @@ struct RoomInitInfo GridService* grid_service = nullptr; MapService* map_service = nullptr; const std::vector* spawn_points = nullptr; - const MetaData::MapTplThing* newbie_born_point_meta = nullptr; + const MetaData::MapTplThing* level0room_born_point_meta = nullptr; + const MetaData::MapTplThing* level1room_born_point_meta = nullptr; const std::vector* loots = nullptr; const std::vector* buildings = nullptr; const std::vector* level0room_spec_things = nullptr; From 3ee109921d6fd0d65e2d287c0eaa99131bbc1075 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 5 Jun 2020 17:23:30 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9C=BA=E5=99=A8?= =?UTF-8?q?=E4=BA=BAai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/android.ai.cc | 108 +++++++++++++++++++------------- server/gameserver/android.ai.h | 2 + server/gameserver/room.cc | 32 +++++++++- 3 files changed, 97 insertions(+), 45 deletions(-) diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index fb7e8a3..b90a24f 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -242,46 +242,51 @@ void AndroidAI::UpdateLastNpc() void AndroidAI::UpdateNewBieRoomLogic() { Human* hum = (Human*)owner; + Human* old_last_target = last_target_; Human* target = last_target_; - if (!last_target_ || last_target_->real_dead) { - if (rand() % 100 < 70) { - hum->room->TouchPlayerList - ( - a8::XParams(), - [hum, &target] (Player* player, a8::XParams& param) - { - if (!player->dead && hum->team_id != player->team_id) { - if (!target) { - target = player; - } else { - if (hum->GetPos().ManhattanDistance(player->GetPos()) < - hum->GetPos().ManhattanDistance(target->GetPos())) { - target = player; - } - } - } - }); + if ((last_target_ && last_target_->real_dead) || !last_target_) { + if (hum->last_human_target && !hum->last_human_target->dead) { + target = hum->last_human_target; } else { - hum->room->TouchHumanList - ( - a8::XParams(), - [hum, &target] (Human* huma, a8::XParams& param) - { - if (!huma->dead && - huma->IsAndroid() && - hum->team_id != huma->team_id && - !a8::HasBitFlag(huma->status, HS_Disable)) { - if (!target) { - target = huma; - } else { - if (hum->GetPos().ManhattanDistance(huma->GetPos()) < - hum->GetPos().ManhattanDistance(target->GetPos())) { - target = huma; + if (rand() % 100 < 70) { + hum->room->TouchPlayerList + ( + a8::XParams(), + [hum, &target] (Player* player, a8::XParams& param) + { + if (!player->dead && hum->team_id != player->team_id) { + if (!target) { + target = player; + } else { + if (hum->GetPos().ManhattanDistance(player->GetPos()) < + hum->GetPos().ManhattanDistance(target->GetPos())) { + target = player; + } } } - } - return true; - }); + }); + } else { + hum->room->TouchHumanList + ( + a8::XParams(), + [hum, &target] (Human* huma, a8::XParams& param) + { + if (!huma->dead && + huma->IsAndroid() && + hum->team_id != huma->team_id && + !a8::HasBitFlag(huma->status, HS_Disable)) { + if (!target) { + target = huma; + } else { + if (hum->GetPos().ManhattanDistance(huma->GetPos()) < + hum->GetPos().ManhattanDistance(target->GetPos())) { + target = huma; + } + } + } + return true; + }); + } } last_target_ = target; } @@ -314,14 +319,20 @@ void AndroidAI::UpdateNewBieRoomLogic() } } if (hum->GetPos().ManhattanDistance(target->GetPos()) > 180) { - int speed = std::max(1, (int)hum->GetSpeed()); - hum->move_dir = target->GetPos() - hum->GetPos(); - hum->move_dir.Normalize(); - hum->attack_dir = hum->move_dir; - speed *= 0.7; - for (int i = 0; i < speed; ++i) { - hum->SetPos(hum->GetPos() + hum->move_dir); - hum->room->grid_service->MoveHuman(hum); + if (hum->GetPos().ManhattanDistance(target->GetPos()) > 650 && + hum->room->GetFrameNo() - last_findenemy_frameno_ > SERVER_FRAME_RATE * 3) { + last_findenemy_frameno_ = hum->room->GetFrameNo(); + last_target_ = nullptr; + } else { + int speed = std::max(1, (int)hum->GetSpeed()); + hum->move_dir = target->GetPos() - hum->GetPos(); + hum->move_dir.Normalize(); + hum->attack_dir = hum->move_dir; + speed *= 0.7; + for (int i = 0; i < speed; ++i) { + hum->SetPos(hum->GetPos() + hum->move_dir); + hum->room->grid_service->MoveHuman(hum); + } } } else { if (hum->room->GetFrameNo() - last_attack_frameno_ > SERVER_FRAME_RATE + (rand() % 15)) { @@ -336,5 +347,14 @@ void AndroidAI::UpdateNewBieRoomLogic() sender->Shot(shot_dir); } } + if (old_last_target && last_target_ && old_last_target == last_target_) { + ++series_attack_frames_; + } else { + series_attack_frames_ = 0; + } + if (series_attack_frames_ > SERVER_FRAME_RATE * 10 && + last_target_ && last_target_->IsAndroid()) { + last_target_ = nullptr; + } } } diff --git a/server/gameserver/android.ai.h b/server/gameserver/android.ai.h index 8cd4f74..4fc6334 100644 --- a/server/gameserver/android.ai.h +++ b/server/gameserver/android.ai.h @@ -33,4 +33,6 @@ private: private: Human* last_target_ = nullptr; long long last_attack_frameno_ = 0; + long long last_findenemy_frameno_ = 0; + long long series_attack_frames_ = 0; }; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 7e07f6b..194ae6d 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -315,6 +315,36 @@ Human* Room::FindEnemy(Human* hum) if ((rand() % 10) < 2) { sub_type = EST_Android; } + if (room_type_ == RT_MidBrid) { + sub_type = EST_Android; + Human* target = nullptr; + hum->room->TouchHumanList + ( + a8::XParams(), + [hum, &target] (Human* huma, a8::XParams& param) + { + if (!huma->dead && + huma->IsAndroid() && + hum->team_id != huma->team_id && + !a8::HasBitFlag(huma->status, HS_Disable)) { + if (!target) { + target = huma; + } else { + if (hum->GetPos().ManhattanDistance(huma->GetPos()) < + hum->GetPos().ManhattanDistance(target->GetPos())) { + target = huma; + } + } + } + return true; + }); + if (target) { + if (hum->GetPos().ManhattanDistance(target->GetPos()) > 190) { + return nullptr; + } + } + return target; + } hum->TouchAllLayerHumanList ( [&enemys, hum, sub_type] (Human* target, bool& stop) @@ -1583,7 +1613,7 @@ void Room::SecondRandPoint() } } if (room_type_ == RT_MidBrid) { - BornPoint* newbie_point = GetBornPoint(level0room_born_point_uniid_); + BornPoint* newbie_point = GetBornPoint(level1room_born_point_uniid_); for (auto& pair : accountid_hash_) { pair.second->on_grid_chg = std::bind(&Room::OnHumanGridChg, this,