diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 258c495..a46e19b 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -68,6 +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 = 10; +const int GAS_INACTIVE_TIME = 1; 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 4dbcb72..93b9f2b 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -354,6 +354,7 @@ void Player::MakeUpdateMsg() } if (room->gas_data.gas_mode == GasMoving) { update_msg->set_gas_progress(room->gas_data.gas_progress); + room->gas_data.pos_old.ToPB(update_msg->mutable_gas_pos_old()); } update_msg->set_alive_count(room->AliveCount()); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 29e24b1..2bd66ae 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -427,14 +427,15 @@ void Room::UpdateGas() switch (gas_data.gas_mode) { case GasInactive: { - if (frame_no - gas_data.gas_start_frameno >= 30 * SERVER_FRAME_RATE) { + if (frame_no - gas_data.gas_start_frameno >= GAS_INACTIVE_TIME * 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_progress = gas_data.old_area_meta->i->rad(); gas_data.gas_start_frameno = frame_no; gas_data.pos_old = Vector2D(map_meta->i->width() / 2.0f, map_meta->i->height() / 2.0f); + gas_data.pos_old_bk = gas_data.pos_old; { bool gen_ok = GenSmallCircle(gas_data.pos_old, gas_data.old_area_meta->i->rad(), @@ -452,7 +453,6 @@ void Room::UpdateGas() 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;; } } @@ -460,12 +460,20 @@ void Room::UpdateGas() 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) { + gas_data.gas_progress = std::max(gas_data.rad_old - distance, gas_data.rad_new); + if (!(gas_data.pos_new == gas_data.pos_old)) { + Vector2D p1 = gas_data.pos_new - gas_data.pos_old_bk; + if (std::abs(p1.Norm() - distance) <= 0.01f) { + gas_data.pos_old = gas_data.pos_new; + } else { + Vector2D dir = p1; + dir.Normalize(); + gas_data.pos_old = gas_data.pos_old_bk + dir * distance; + } + } + if (std::abs(gas_data.gas_progress - gas_data.rad_new) <= 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)) { @@ -475,9 +483,10 @@ void Room::UpdateGas() 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_progress = gas_data.old_area_meta->i->rad(); gas_data.gas_start_frameno = frame_no; 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(), @@ -493,7 +502,9 @@ void Room::UpdateGas() break; } if (gas_data.gas_mode == GasInactive) { + for (auto& pair : human_hash_) { + } } } @@ -506,6 +517,9 @@ bool Room::GenSmallCircle(Vector2D big_circle_pos, float big_circle_rad, float s Vector2D dir = Vector2D::UP; dir.Rotate(a8::RandAngle()); float rad = rand() % (int)(big_circle_rad - small_circle_rad); + if (rad <= 0.001f){ + rad = 0.001f; + } out_pos = big_circle_pos + dir * rad; return true; } diff --git a/server/gameserver/types.h b/server/gameserver/types.h index c67fdf7..6c24a31 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -50,6 +50,7 @@ struct GasData { GasMode_e gas_mode = GasInactive; Vector2D pos_old; + Vector2D pos_old_bk; Vector2D pos_new; float rad_old = 0.0f; float rad_new = 0.0f; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 55964f2..6dfce06 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -606,6 +606,7 @@ message SMUpdate optional MFActivePlayerData active_player_data = 6; //活跃玩家数据(如果玩家死亡后是观战对象的数据) optional int32 alive_count = 15; //存活数量 optional int32 gas_progress = 16; //毒圈进度,表示缩进的像素数(只有当gas_data.mode == moving时才会发进度) + optional MFVector2D gas_pos_old = 30; //毒圈当前圆心坐标 optional MFGasData gas_data = 17; //毒圈数据 repeated MFTeamData team_data = 18; repeated MFTeammateInfo teams = 19; //同队队友数据