diff --git a/server/gameserver/CMakeLists.txt b/server/gameserver/CMakeLists.txt index 139c6dc6..89cb63c5 100644 --- a/server/gameserver/CMakeLists.txt +++ b/server/gameserver/CMakeLists.txt @@ -19,7 +19,7 @@ else() endif() set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DNDEBUG -DNEWGS") -set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DDEBUG -fsanitize=address -fno-omit-frame-pointer -DNEWGS -DPVE") +set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DDEBUG -DNEWGS -DPVE") include_directories( AFTER diff --git a/server/gameserver/incubator.cc b/server/gameserver/incubator.cc index 1dbf1cc7..2b199073 100644 --- a/server/gameserver/incubator.cc +++ b/server/gameserver/incubator.cc @@ -324,7 +324,7 @@ int Incubator::GetPveLeftTime() room->pve_data.wave < 0) { return 0; } - xtimer_list* timer = wave_timers_[room->pve_data.wave - 1]; + xtimer_list* timer = wave_timers_[room->pve_data.wave]; int remain_time = room->xtimer.GetRemainTime(timer); return remain_time * FRAME_RATE_MS; } diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index efa9dc7d..117c4523 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -143,6 +143,16 @@ void MapInstance::CreateThings() if (!MetaMgr::Instance()->GetHeroAI(hero_meta->i->ai())) { A8_ABORT(); } + if (map_id > 1001) { + auto itr = spawn_name_hash_.find(thing_tpl.i->name()); + if (itr != spawn_name_hash_.end()) { + abort(); + } + a8::Vec2 point; + point.x = thing_tpl.i->x(); + point.y = thing_tpl.i->y(); + spawn_name_hash_[thing_tpl.i->name()] = point; + } } } break; @@ -491,3 +501,9 @@ MapBlock* MapInstance::InternalCreateMapBlock(int id, float x, float y, p->permanent_map_service = map_service_; return p; } + +a8::Vec2* MapInstance::GetSpawnPoint(const std::string& name) +{ + auto itr = spawn_name_hash_.find(name); + return itr != spawn_name_hash_.end() ? &itr->second : nullptr; +} diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index 9a33b278..0702ae67 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -30,6 +30,8 @@ class MapInstance void AttachRoom(Room* room, RoomInitInfo& init_info); MetaData::Map* GetMapMeta() { return map_meta_; } Entity* GetEntityByUniId(int uniid); + a8::Vec2* GetSpawnPoint(const std::string& name); + private: void CreateThings(); void CreateTerrain(); @@ -63,6 +65,7 @@ class MapInstance std::vector buildings_; std::vector level0room_spec_things_; std::list terrain_blocks_; + std::map spawn_name_hash_; int building_num_ = 0; int obstacle_num_ = 0; diff --git a/server/gameserver/mapmgr.cc b/server/gameserver/mapmgr.cc index 155a428e..08861c81 100644 --- a/server/gameserver/mapmgr.cc +++ b/server/gameserver/mapmgr.cc @@ -36,6 +36,7 @@ void MapMgr::Init() if (mode_hash_.find(kChiJiMode) == mode_hash_.end()) { A8_ABORT(); } + MetaMgr::Instance()->CheckMapSpawnPoint(); } void MapMgr::UnInit() diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 46c6943b..bf7369ca 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -1659,16 +1659,6 @@ namespace MetaData void PveGeminiContent::Init() { - { - std::vector strings; - a8::Split(pb->spawn_point(), strings, ':'); - if (strings.size() != 2) { - abort(); - } - spawn_point = a8::Vec2(a8::XValue(strings[0]).GetDouble(), - a8::XValue(strings[1]).GetDouble()); - spawn_point.y = 7680 - spawn_point.y; - } } void PveGeminiMode::Init() diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index cb509862..14122139 100644 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -15,6 +15,8 @@ #include "metamgr.h" #include "app.h" #include "jsondatamgr.h" +#include "mapmgr.h" +#include "mapinstance.h" #define METAMGR_READ(field_name, def_val) MetaMgr::Instance()->field_name = \ a8::XValue(MetaMgr::Instance()->GetSysParamAsString(#field_name, #def_val)); @@ -1344,3 +1346,28 @@ MetaData::PveGeminiMode* MetaMgr::GetPveGeminiMode(int mode_id) auto itr = loader_->pve_gemini_mode_hash.find(mode_id); return itr != loader_->pve_gemini_mode_hash.end() ? &itr->second : nullptr; } + +void MetaMgr::CheckMapSpawnPoint() +{ + for (int i = kDestoryMode; i <= kSurvivalMode; ++i) { + MetaData::PveGeminiMode* mode_meta = GetPveGeminiMode(i); + if (!mode_meta) { + abort(); + } + auto contents = GetPveGeminiContents(i); + if (!contents) { + abort(); + } + MapInstance* map_instance = MapMgr::Instance()->GetMapInstance(mode_meta->pb->map_id()); + if (!map_instance) { + abort(); + } + for (auto& content : *contents) { + a8::Vec2* p = map_instance->GetSpawnPoint(content.pb->spawn_point()); + if (!p) { + abort(); + } + content.spawn_point = *p; + } + } +} diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 5cb9d9bd..0066156b 100644 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -73,6 +73,8 @@ class MetaMgr : public a8::Singleton bool HasText(const std::string& textid); std::vector>* GetTextElements(const std::string& textid); + void CheckMapSpawnPoint(); + int gas_inactive_time = 10; int newbie_gas_inactive_time = 5; int midbrid_gas_inactive_time = 15;