diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index dfbb4d4..c2a69c0 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -80,6 +80,17 @@ namespace MetaData abort(); } } + first_safearea_center = a8::Vec2(i->map_width() / 2.0f, + i->map_height() / 2.0f); + if (!i->first_safearea_center().empty()) { + std::vector strings; + a8::Split(i->first_safearea_center(), strings, ':'); + if (strings.size() != 2) { + abort(); + } + first_safearea_center = a8::Vec2(a8::XValue(strings[0]).GetDouble(), + a8::XValue(strings[1]).GetDouble()); + } if (i->player() < 10) { abort(); } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 85bb08f..c6d9790 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -28,6 +28,7 @@ namespace MetaData int refresh_robot_min_time = 0; int refresh_robot_max_time = 0; std::vector buff_list; + a8::Vec2 first_safearea_center; void Init(); std::string RandTemplate(); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index ceb0197..01210fc 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1226,27 +1226,11 @@ void Room::UpdateGasMoving() } if (std::abs(gas_data_.gas_progress - gas_data_.rad_new) <= 0.001f) { int pre_area_id = gas_data_.new_area_meta->i->id(); - a8::Vec2 pre_pos = gas_data_.pos_new; if (!MetaMgr::Instance()->GetSafeArea(pre_area_id + 1)) { gas_data_.is_last_gas = true; return; } - gas_data_.gas_mode = GasWaiting; - gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(pre_area_id); - gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(pre_area_id + 1); - gas_data_.gas_progress = gas_data_.old_area_meta->i->rad(); - gas_data_.gas_start_frameno = GetFrameNo(); - gas_data_.pos_old = pre_pos; - gas_data_.pos_old_bk = gas_data_.pos_old; - { - bool gen_ok = GenSmallCircle(gas_data_.pos_old, - gas_data_.old_area_meta->i->rad(), - gas_data_.new_area_meta->i->rad(), - gas_data_.pos_new); - assert(gen_ok); - } - gas_data_.rad_old = gas_data_.old_area_meta->i->rad(); - gas_data_.rad_new = gas_data_.new_area_meta->i->rad(); + ForwardGasRing(1); if (!MetaMgr::Instance()->GetSafeArea(gas_data_.new_area_meta->i->id() + 2)) { #if 1 //ζœ€εŽδΈ€εœˆ @@ -1291,8 +1275,7 @@ void Room::UpdateGasJump() gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea() + 1); gas_data_.gas_progress = gas_data_.old_area_meta->i->rad(); gas_data_.gas_start_frameno = GetFrameNo(); - gas_data_.pos_old = a8::Vec2(map_meta_->i->map_width() / 2.0f, - map_meta_->i->map_height() / 2.0f); + gas_data_.pos_old = map_meta_->first_safearea_center; gas_data_.pos_old_bk = gas_data_.pos_old; { bool gen_ok = GenSmallCircle(gas_data_.pos_old, @@ -1303,6 +1286,9 @@ void Room::UpdateGasJump() } gas_data_.rad_old = gas_data_.old_area_meta->i->rad(); gas_data_.rad_new = gas_data_.new_area_meta->i->rad(); + if (map_meta_->i->init_gas_ring() > 0) { + ForwardGasRing(map_meta_->i->init_gas_ring()); + } battle_start_frameno_ = GetFrameNo(); xtimer.DeleteTimer(auto_jump_timer_); auto_jump_timer_ = nullptr; @@ -3649,3 +3635,33 @@ void Room::InitAndroidAI() } #endif } + +void Room::ForwardGasRing(int n) +{ + while (n > 0) { + int pre_area_id = gas_data_.new_area_meta->i->id(); + if (!MetaMgr::Instance()->GetSafeArea(pre_area_id + 1)) { + gas_data_.is_last_gas = true; + return; + } + a8::Vec2 pre_pos = gas_data_.pos_new; + gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(pre_area_id); + gas_data_.new_area_meta = MetaMgr::Instance()->GetSafeArea(pre_area_id + 1); + gas_data_.gas_progress = gas_data_.old_area_meta->i->rad(); + gas_data_.gas_start_frameno = GetFrameNo(); + gas_data_.pos_old = pre_pos; + gas_data_.pos_old_bk = gas_data_.pos_old; + { + bool gen_ok = GenSmallCircle(gas_data_.pos_old, + gas_data_.old_area_meta->i->rad(), + gas_data_.new_area_meta->i->rad(), + gas_data_.pos_new); + if (!gen_ok) { + abort(); + } + } + gas_data_.rad_old = gas_data_.old_area_meta->i->rad(); + gas_data_.rad_new = gas_data_.new_area_meta->i->rad(); + --n; + } +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 0697126..3ef2d51 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -248,6 +248,7 @@ private: void ShuaLastGas(); size_t GetRoomMaxPlayerNum(); void InitAndroidAI(); + void ForwardGasRing(int n); #ifdef DEBUG void InitDebugInfo(); diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index c25ec34..4e9a469 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -34,6 +34,8 @@ message Map optional int32 safearea = 11; optional string game_start_buff_list = 12; optional string map_pic = 13; + optional string first_safearea_center = 14; + optional int32 init_gas_ring = 15; } message MapThing