From cab988d64202f65d7984043a8a4a08331203dea1 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 1 Mar 2021 13:59:47 +0800 Subject: [PATCH] plane ok --- server/gameserver/framemaker.cc | 11 ++ server/gameserver/human.cc | 25 +++- server/gameserver/human.h | 3 + server/gameserver/player.cc | 4 +- server/gameserver/room.cc | 210 ++++++++++++++++++++++---------- server/gameserver/room.h | 4 + server/gameserver/types.h | 8 ++ 7 files changed, 198 insertions(+), 67 deletions(-) diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index 6d565f7..204ca91 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -11,6 +11,11 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum) cs::SMUpdate* msg = new cs::SMUpdate; { Room* room = hum->room; + if (room->GetGasData().gas_mode == GasJump) { + cs::MFPlane* p = msg->mutable_plane(); + TypeConvert::ToPb(room->plane.start_point, p->mutable_start_point()); + TypeConvert::ToPb(room->plane.end_point, p->mutable_end_point()); + } for (auto& itr : hum->new_objects) { #ifdef DEBUG if (hum->del_objects.find(itr->GetEntityUniId()) != hum->del_objects.end()) { @@ -27,6 +32,12 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(const Human* hum) hum->room->GetFrameNo() - entity->GetDeadFrameNo(room) > 10) { continue; } else { + if (room->GetGasData().gas_mode == GasJump && + entity != hum && + entity->GetEntityType() == ET_Player && + a8::HasBitFlag(((Human*)entity)->status, HS_Fly)) { + continue; + } } if (((Human*)hum)->GetPos().ManhattanDistance(entity->GetPos()) > VIEW_RANGE + 300) { continue; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 10814c2..a1c706e 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -78,7 +78,8 @@ void InternalShot(Human* hum, bullet_born_pos, bullet_dir, fly_distance); - if (hum->room->BattleStarted()) { + if (hum->room->BattleStarted() || + (hum->room->GetGasData().gas_mode == GasJump && !a8::HasBitFlag(hum->status, HS_Jump))) { hum->room->CreateBullet(hum, weapon_meta, weapon_upgrade_meta, @@ -1345,6 +1346,26 @@ bool Human::CanUseSkill() return true; } +void Human::DoJump() +{ + if (a8::HasBitFlag(status, HS_Fly)) { + a8::UnSetBitFlag(status, HS_Fly); + a8::SetBitFlag(status, HS_Jump); + jump_frameno_ = room->GetFrameNo(); + SyncAroundPlayers(__FILE__, __LINE__, __func__); + room->xtimer.AddDeadLineTimerAndAttach + (MetaMgr::Instance()->jump_time * SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Human* hum = (Human*)param.sender.GetUserData(); + hum->OnLand(); + }, + &xtimer_attacher.timer_list_); + } +} + void Human::DoSkill() { if (action_type == AT_Reload || @@ -1562,6 +1583,8 @@ void Human::FillMFGasData(cs::MFGasData* gas_data) long long duration = room->GetGasInactiveTime() * SERVER_FRAME_RATE - (room->GetFrameNo() - room->GetGasData().gas_start_frameno); gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000); + } else if (room->GetGasData().gas_mode == GasJump) { + gas_data->set_duration(0); } else if (room->GetGasData().gas_mode == GasMoving) { if (room->GetGasData().new_area_meta->i->shrink_speed() > 0.01f) { long long duration = (room->GetGasData().old_area_meta->i->rad() - room->GetGasData().new_area_meta->i->rad()) / diff --git a/server/gameserver/human.h b/server/gameserver/human.h index dd96ee6..f80bfd6 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -24,6 +24,7 @@ enum HumanStatus HS_LastAndroid = 7, HS_DisableAttack = 8, HS_Fly = 9, + HS_Jump = 10, HS_End }; @@ -204,6 +205,7 @@ class Human : public MoveableEntity bool HasLiveTeammate(); bool HasNoDownedTeammate(); bool CanUseSkill(); + void DoJump(); void DoSkill(); void DoGetDown(); void FindLocation(); @@ -416,6 +418,7 @@ private: std::vector skins; Entity* last_collision_door_ = nullptr; + long long jump_frameno_ = 0; friend class FrameMaker; friend class FrameEvent; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 5c3fc0e..a6de82f 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -310,7 +310,9 @@ void Player::UpdateUseItemId() void Player::UpdateSpectate() { - if (room->GetGasData().gas_mode == GasInactive) { + if (room->GetGasData().gas_mode == GasInactive || + room->GetGasData().gas_mode == GasJump || + a8::HasBitFlag(status, HS_Fly)) { spectate = false; return; } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 812df5f..1f23dc5 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -985,57 +985,59 @@ void Room::UpdateGas() case GasInactive: UpdateGasInactive(); break; + case GasJump: + UpdateGasJump(); + break; case GasWaiting: UpdateGasWaiting(); break; case GasMoving: UpdateGasMoving(); break; - case GasJump: - UpdateGasJump(); - break; } - #if 1 - if (GetRoomMode() == kZombieMode) { - int zombie_num = 0; - for (auto& pair : human_hash_) { - if (pair.second->GetRace() == kZombieRace) { - ++zombie_num; + if (gas_data_.gas_mode != GasInactive && gas_data_.gas_mode != GasJump) { +#if 1 + if (GetRoomMode() == kZombieMode) { + int zombie_num = 0; + for (auto& pair : human_hash_) { + if (pair.second->GetRace() == kZombieRace) { + ++zombie_num; + } + } + if (zombie_num >= GetRoomMaxPlayerNum() && !game_over_) { + game_over_ = true; + game_over_frameno_ = GetFrameNo(); + OnGameOver(); } } - if (zombie_num >= GetRoomMaxPlayerNum() && !game_over_) { - game_over_ = true; - game_over_frameno_ = GetFrameNo(); - OnGameOver(); - } - } - #endif - if (gas_data_.gas_mode != GasInactive && GetRoomMode() == kChiJiMode) { - if (!IsGameOver() && alive_count_ <= MAX_TEAM_NUM && GetAliveTeamNum() <= 1) { - game_over_ = true; - game_over_frameno_ = GetFrameNo(); - OnGameOver(); - } - for (auto& pair : human_hash_) { - if (pair.second->real_dead || - a8::HasBitFlag(pair.second->status, HS_Disable)) { - continue; +#endif + if (gas_data_.gas_mode != GasInactive && GetRoomMode() == kChiJiMode) { + if (!IsGameOver() && alive_count_ <= MAX_TEAM_NUM && GetAliveTeamNum() <= 1) { + game_over_ = true; + game_over_frameno_ = GetFrameNo(); + OnGameOver(); } - bool b1 = a8::CircleContainCircle(gas_data_.pos_old, - gas_data_.gas_progress, - pair.second->GetPos(), - pair.second->GetRadius() - ); - bool b2 = a8::CircleContainCircle(gas_data_.pos_new, - gas_data_.rad_new, - pair.second->GetPos(), - pair.second->GetRadius() - ); - if (!b1 && !b2) { - pair.second->poisoning = true; - } else { - pair.second->poisoning = false; - pair.second->poisoning_time = false; + for (auto& pair : human_hash_) { + if (pair.second->real_dead || + a8::HasBitFlag(pair.second->status, HS_Disable)) { + continue; + } + bool b1 = a8::CircleContainCircle(gas_data_.pos_old, + gas_data_.gas_progress, + pair.second->GetPos(), + pair.second->GetRadius() + ); + bool b2 = a8::CircleContainCircle(gas_data_.pos_new, + gas_data_.rad_new, + pair.second->GetPos(), + pair.second->GetRadius() + ); + if (!b1 && !b2) { + pair.second->poisoning = true; + } else { + pair.second->poisoning = false; + pair.second->poisoning_time = false; + } } } } @@ -1044,35 +1046,48 @@ void Room::UpdateGas() void Room::UpdateGasInactive() { if (GetFrameNo() - gas_data_.gas_start_frameno >= GetGasInactiveTime() * SERVER_FRAME_RATE) { - gas_data_.gas_mode = GasWaiting; - gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea()); - 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_mode = GasJump; 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_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(); - battle_start_frameno_ = GetFrameNo(); if (human_hash_.size() < GetRoomMaxPlayerNum()) { CreateAndroid(GetRoomMaxPlayerNum() - human_hash_.size()); + NotifyUiUpdate(); } CombineTeam(); - NotifyGameStart(); - NotifyUiUpdate(); + ShuaPlane(); NotifyWxVoip(); - if (room_type_ != RT_NewBrid) { - InitAirDrop(); - } - RoomMgr::Instance()->ActiveRoom(room_uuid_); + InitAirDrop(); + RoomMgr::Instance()->ActiveRoom(GetRoomUuid()); + int auto_jump_interval = MetaMgr::Instance()->GetSysParamAsInt("auto_jump_interval"); + auto_jump_timer_ = xtimer.AddRepeatTimerAndAttach + (SERVER_FRAME_RATE * auto_jump_interval, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Room* room = (Room*)param.sender.GetUserData(); + int auto_jump_min_num = MetaMgr::Instance()->GetSysParamAsInt("auto_jump_min_num"); + int auto_jump_max_num = MetaMgr::Instance()->GetSysParamAsInt("auto_jump_max_num"); + int jump_num = a8::RandEx(auto_jump_min_num, auto_jump_max_num); + if (room->last_player_jump_pos_.Distance(room->plane.curr_pos) < 64 * 8) { + jump_num = 1 + rand() % 2; + } + for (int i = 0; i < jump_num; ++i) { + room->TouchHumanList + ( + a8::XParams() + .SetSender(room), + [] (Human* hum, a8::XParams& param) -> bool + { + if (a8::HasBitFlag(hum->status, HS_Fly) && + hum->GetEntitySubType() != EST_Player) { + hum->DoJump(); + return false; + } + return true; + }); + } + }, + &xtimer_attacher_.timer_list_); } } @@ -1151,7 +1166,49 @@ void Room::UpdateGasMoving() void Room::UpdateGasJump() { - + a8::Vec2 len_vec = plane.dir * + ((GetFrameNo() - GetGasData().gas_start_frameno)*airline_->i->plane_speed() / SERVER_FRAME_RATE); + plane.curr_pos = plane.start_point + len_vec; + if ((plane.end_point - plane.start_point).Norm() <= len_vec.Norm()) { + TouchHumanList( + a8::XParams(), + [] (Human* hum, a8::XParams& param) -> bool + { + if (a8::HasBitFlag(hum->status, HS_Fly)) { + hum->DoJump(); + } + if (hum->GetEntitySubType() == EST_Player) { + GameLog::Instance()->GameStart((Player*)hum); + } + return true; + }); + gas_data_.gas_mode = GasWaiting; + gas_data_.old_area_meta = MetaMgr::Instance()->GetSafeArea(map_meta_->i->safearea()); + 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_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(); + battle_start_frameno_ = GetFrameNo(); + xtimer.DeleteTimer(auto_jump_timer_); + auto_jump_timer_ = nullptr; + NotifyGameStart(); + NotifyUiUpdate(); + NotifyWxVoip(); + if (room_type_ != RT_NewBrid) { + InitAirDrop(); + } + } } bool Room::GenSmallCircle(a8::Vec2 big_circle_pos, float big_circle_rad, float small_circle_rad, @@ -1530,6 +1587,29 @@ void Room::AdjustAirDropPos(MetaData::MapThing* thing_meta, a8::Vec2& box_pos) AdjustPosInnerMap(box_pos, 100); } +void Room::ShuaPlane() +{ + airline_ = MetaMgr::Instance()->RandAirLine(map_meta_->i->map_id()); + if (!airline_) { + abort(); + } + plane.start_point = a8::Vec2(airline_->start_point_x, airline_->start_point_y); + plane.end_point = a8::Vec2(airline_->end_point_x, airline_->end_point_y); + plane.dir = plane.end_point - plane.start_point; + plane.dir.Normalize(); + plane.curr_pos = plane.start_point; + last_player_jump_pos_ = plane.curr_pos; + + for (auto& pair : human_hash_) { + a8::SetBitFlag(pair.second->status, HS_Fly); + pair.second->SetPos(plane.curr_pos); + pair.second->attack_dir = plane.dir; + pair.second->move_dir = plane.dir; + grid_service->MoveHuman(pair.second); + pair.second->AddToNewObjects(pair.second); + } +} + RoomObstacle* Room::InternalCreateObstacle(int id, float x, float y, std::function on_precreate) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index b3507cc..e11b75b 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -39,6 +39,7 @@ public: FrameEvent frame_event; FrameMaker frame_maker; a8::XTimer xtimer; + Plane plane; a8::TimerAttacher timer_attacher; GridService* grid_service = nullptr; MapService* map_service = nullptr; @@ -298,4 +299,7 @@ private: std::map removed_robot_hash_; std::vector obstacle_datas_; + + xtimer_list* auto_jump_timer_ = nullptr; + a8::Vec2 last_player_jump_pos_; }; diff --git a/server/gameserver/types.h b/server/gameserver/types.h index ce31a3d..5039d24 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -116,6 +116,14 @@ struct BornPoint a8::Vec2 RandPoint() const; }; +struct Plane +{ + a8::Vec2 start_point; + a8::Vec2 end_point; + a8::Vec2 dir; + a8::Vec2 curr_pos; +}; + struct HumanAbility { float hp = 0.0f;