From 97e5cc5c3d841a3be34bb98e62a7d99d6e47fb30 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 1 Apr 2019 14:16:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=AF=92=E5=9C=88=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/constant.h | 4 +- server/gameserver/player.cc | 4 +- server/gameserver/room.cc | 86 +++++++++++++++++++++++++ server/gameserver/room.h | 3 + server/gameserver/types.h | 4 +- server/tools/protobuild/metatable.proto | 2 +- 6 files changed, 98 insertions(+), 5 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 5ffd1af..258c495 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -68,4 +68,6 @@ const int DEF_HELMET_ID = 12404; const int DEF_CHEST_ID = 12401; const int DEF_WEAPON_ID = 12103; -const int GAS_INACTIVE_TIME = 30; +const int GAS_INACTIVE_TIME = 10; +const int SERVER_FRAME_RATE = 20; +const int SYNC_FRAME_RATE = 10; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 4094040..4dbcb72 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -298,10 +298,10 @@ void Player::FillMFGasData(cs::MFGasData* gas_data) long long duration = GAS_INACTIVE_TIME * 20 - (room->frame_no - room->gas_data.gas_start_frameno); gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000); } else { - if (room->gas_data.area_meta->i->wait_time() <= 0) { + if (room->gas_data.old_area_meta->i->wait_time() <= 0) { gas_data->set_duration(0); } else { - long long duration = room->gas_data.area_meta->i->wait_time() * 20 - + long long duration = room->gas_data.old_area_meta->i->wait_time() * 20 - (room->frame_no - room->gas_data.gas_start_frameno); gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000); } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index ff9f734..9ef2e29 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -22,6 +22,7 @@ void Room::Update(int delta_time) while (elapsed_time_ >= 50) { if (frame_no % 2 == 0) { ResetFrameData(); + UpdateGas(); } for (auto& pair : moveable_hash_) { pair.second->Update(50); @@ -420,3 +421,88 @@ void Room::BeAddedObject(Entity* entity) { be_added_hash_[entity->entity_uniid] = entity; } + +void Room::UpdateGas() +{ + switch (gas_data.gas_mode) { + case GasInactive: + { + if (frame_no - gas_data.gas_start_frameno >= 30 * SERVER_FRAME_RATE) { + gas_data.gas_mode = GasWaiting; + gas_data.old_area_meta = MetaMgr::Instance()->GetSafeArea(30001); + gas_data.new_area_meta = MetaMgr::Instance()->GetSafeArea(30002); + gas_data.gas_progress = 0.0f; + gas_data.gas_start_frameno = frame_no; + gas_data.pos_old = Vector2D(map_meta->i->width() / 2.0f, + map_meta->i->height() / 2.0f); + { + 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(); + } + } + break; + case GasWaiting: + { + if (frame_no - gas_data.gas_start_frameno >= + gas_data.old_area_meta->i->wait_time() * SERVER_FRAME_RATE) { + gas_data.gas_mode = GasMoving; + gas_data.gas_progress = 0.0f; + gas_data.gas_start_frameno = frame_no;; + } + } + break; + case GasMoving: + { + if (frame_no - gas_data.gas_start_frameno > 0 && !gas_data.is_last_gas) { + float total_distance = gas_data.rad_old - gas_data.rad_new + + (gas_data.pos_old - gas_data.pos_new).Norm(); + float distance = gas_data.old_area_meta->i->shrink_speed() * + ((frame_no - gas_data.gas_start_frameno) * (1.0 / SERVER_FRAME_RATE)); + gas_data.gas_progress = std::min(distance, total_distance); + if (std::abs(total_distance-distance) >= 0.001f) { + int pre_area_id = gas_data.new_area_meta->i->id(); + Vector2D 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 = 0.0f; + gas_data.gas_start_frameno = frame_no; + gas_data.pos_old = pre_pos; + { + 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(); + } + } + } + break; + } +} + +bool Room::GenSmallCircle(Vector2D big_circle_pos, float big_circle_rad, float small_circle_rad, + Vector2D& out_pos) +{ + if (big_circle_rad <= small_circle_rad) { + abort(); + } + Vector2D dir = Vector2D::UP; + dir.Rotate(a8::RandAngle()); + float rad = rand() % (int)(big_circle_rad - small_circle_rad); + out_pos = big_circle_pos + dir * rad; + return true; +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index ea34387..60e5860 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -64,6 +64,9 @@ public: private: void ClearDeletedObjects(); void ProcAddedObjects(); + void UpdateGas(); + bool GenSmallCircle(Vector2D big_circle_pos, float big_circle_rad, float small_circle_rad, + Vector2D& out_pos); public: unsigned short current_uniid = 0; diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 112eea0..c67fdf7 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -55,5 +55,7 @@ struct GasData float rad_new = 0.0f; float gas_progress = 0.0f; long long gas_start_frameno = 0; - MetaData::SafeArea* area_meta = nullptr; + MetaData::SafeArea* old_area_meta = nullptr; + MetaData::SafeArea* new_area_meta = nullptr; + bool is_last_gas = false; }; diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 3d87ddd..01c777b 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -32,7 +32,7 @@ message SafeArea optional int32 level = 2; //安全区登记 optional int32 rad = 3; //半径 optional int32 wait_time = 4; //等待时间 - optional int32 shrink_time = 5; //收缩伤害 + optional int32 shrink_speed = 5; //收缩速度 optional int32 hurt = 6; //伤害/秒 }