From 993cc6285eb6d4b2a61dfcf7b1a1c3167c920a57 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 17 Apr 2019 17:58:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=8A=B6=E6=80=81=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/human.h | 3 ++ server/gameserver/metamgr.cc | 6 +++ server/gameserver/metamgr.h | 2 +- server/gameserver/player.cc | 80 +++++++++++++++++++++++++----------- server/gameserver/room.cc | 32 +++++++++++---- server/gameserver/room.h | 2 + server/gameserver/types.h | 8 ++++ 7 files changed, 101 insertions(+), 32 deletions(-) diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 3eb700f..b23d800 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -12,6 +12,9 @@ namespace MetaData enum HumanStatus { HS_PainKiller = 1, + HS_Fly = 2, + HS_Jump = 3, + HS_End }; struct xtimer_list; diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 7e35738..2b0b40d 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -64,6 +64,12 @@ public: f8::ReadCsvMetaFile(res_path + "airdrop@airdrop.csv", airdrop_meta_list); f8::ReadJsonMetaFile(res_path + "maps.json", building_meta_list); BindToMetaData(); + #if 1 + { + MetaMgr::Instance()->gas_inactive_time = MetaMgr::Instance()->GetSysParamAsInt("gas_inactive_time"); + MetaMgr::Instance()->plane_speed = MetaMgr::Instance()->GetSysParamAsFloat("plane_speed") / SERVER_FRAME_RATE; + } + #endif } private: diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index 1dc69b4..0dcf27e 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -31,7 +31,7 @@ class MetaMgr : public a8::Singleton std::list& GetAirDrops(); int gas_inactive_time = 10; - int gas_jump_time = 0; + float plane_speed = 5.0f; private: MetaDataLoader* loader_ = nullptr; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 2895356..04fb35a 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -85,6 +85,12 @@ void Player::UpdateMove() if (action_type == AT_Relive) { CancelAction(); } + if (a8::HasBitFlag(status, HS_Fly)) { + moving = false; + moved_frames = 0; + last_collision_door = nullptr; + return; + } ++moved_frames; if (moved_frames > 4) { moving = false; @@ -110,6 +116,12 @@ void Player::UpdateMove() void Player::UpdateShot() { + if (a8::HasBitFlag(status, HS_Fly)) { + shot_start = false; + shot_hold = false; + series_shot_frames = 0; + return; + } if (shot_start) { shot_start = false; Shot(); @@ -133,6 +145,11 @@ void Player::UpdateShot() void Player::UpdateSelectWeapon() { + if (a8::HasBitFlag(status, HS_Fly)) { + select_weapon = false; + selected_weapon_idx = 0; + return; + } if (selected_weapon_idx >= 0 && selected_weapon_idx < weapons.size()) { Weapon* weapon = &weapons[selected_weapon_idx]; if (weapon->weapon_id != 0) { @@ -331,6 +348,10 @@ void Player::UpdateUseItemIdx() void Player::UpdateSpectate() { + if (a8::HasBitFlag(status, HS_Fly)) { + spectate = false; + return; + } BeKill(entity_uniid, name); spectate = false; } @@ -345,6 +366,11 @@ void Player::UpdateGameOver() void Player::UpdateEmote() { + if (a8::HasBitFlag(status, HS_Fly)) { + emote = false; + emote_id = 0; + return; + } ::google::protobuf::RepeatedPtrField<::cs::MFEmote>* emotes = nullptr; { auto itr = room->frame_data.emotes_hash.find(room->frame_no); @@ -396,34 +422,38 @@ void Player::Shot() shot->set_offhand(true); shot->set_bullskin(10001); } - for (auto& tuple : curr_weapon->meta->bullet_born_offset) { - Vector2D bullet_born_offset = Vector2D(std::get<0>(tuple), std::get<1>(tuple)); - bullet_born_offset.Rotate(attack_dir.CalcAngle(Vector2D::UP)); - Vector2D bullet_born_pos = pos + bullet_born_offset; - ::google::protobuf::RepeatedPtrField<::cs::MFBullet>* bullets = nullptr; - { + if (room->gas_data.gas_mode != GasInactive && room->gas_data.gas_mode != GasJump) { + for (auto& tuple : curr_weapon->meta->bullet_born_offset) { + Vector2D bullet_born_offset = Vector2D(std::get<0>(tuple), std::get<1>(tuple)); + bullet_born_offset.Rotate(attack_dir.CalcAngle(Vector2D::UP)); + Vector2D bullet_born_pos = pos + bullet_born_offset; + ::google::protobuf::RepeatedPtrField<::cs::MFBullet>* bullets = nullptr; { - auto itr = room->frame_data.bullets_hash.find(room->frame_no); - if (itr == room->frame_data.bullets_hash.end()) { - room->frame_data.bullets_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFBullet>(); - itr = room->frame_data.bullets_hash.find(room->frame_no); + { + auto itr = room->frame_data.bullets_hash.find(room->frame_no); + if (itr == room->frame_data.bullets_hash.end()) { + room->frame_data.bullets_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFBullet>(); + itr = room->frame_data.bullets_hash.find(room->frame_no); + } + bullets = &itr->second; } - bullets = &itr->second; } + { + cs::MFBullet* bullet = bullets->Add(); + bullet->set_player_id(entity_uniid); + bullet->set_bullet_id(curr_weapon->meta->i->use_bullet()); + bullet_born_pos.ToPB(bullet->mutable_pos()); + attack_dir.ToPB(bullet->mutable_dir()); + bullet->set_bulletskin(10001); + bullet->set_gun_id(curr_weapon->meta->i->id()); + bullet->set_fly_distance(fly_distance); + } + room->CreateBullet(this, curr_weapon->meta, bullet_born_pos, attack_dir, fly_distance); } - { - cs::MFBullet* bullet = bullets->Add(); - bullet->set_player_id(entity_uniid); - bullet->set_bullet_id(curr_weapon->meta->i->use_bullet()); - bullet_born_pos.ToPB(bullet->mutable_pos()); - attack_dir.ToPB(bullet->mutable_dir()); - bullet->set_bulletskin(10001); - bullet->set_gun_id(curr_weapon->meta->i->id()); - bullet->set_fly_distance(fly_distance); - } - room->CreateBullet(this, curr_weapon->meta, bullet_born_pos, attack_dir, fly_distance); } - --curr_weapon->ammo; + if (curr_weapon->weapon_idx != 0) { + --curr_weapon->ammo; + } int slot_id = curr_weapon->meta->i->_inventory_slot(); switch (slot_id) { case 5: @@ -479,6 +509,10 @@ void Player::Shot() void Player::ProcInteraction() { + if (a8::HasBitFlag(status, HS_Fly)) { + interaction_objids.Clear(); + return; + } for (auto obj_id : interaction_objids) { Entity* entity = room->GetEntityByUniId(obj_id); if (entity) { diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index f6bd317..06966c8 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -755,7 +755,20 @@ void Room::UpdateGas() switch (gas_data.gas_mode) { case GasInactive: { - if (frame_no - gas_data.gas_start_frameno >= MetaMgr::Instance()->gas_inactive_time * SERVER_FRAME_RATE) { + if (frame_no - gas_data.gas_start_frameno >= + MetaMgr::Instance()->gas_inactive_time * SERVER_FRAME_RATE) { + gas_data.gas_mode = GasJump; + gas_data.gas_start_frameno = frame_no; + ShuaPlane(); + RoomMgr::Instance()->RemoveFromInactiveRoomHash(room_uuid); + } + } + break; + case GasJump: + { + Vector2D len_vec = plane.dir * (frame_no - gas_data.gas_start_frameno)*MetaMgr::Instance()->plane_speed; + plane.curr_pos = plane.start_point + len_vec; + if ((plane.end_point - plane.start_point).Norm() <= len_vec.Norm()) { gas_data.gas_mode = GasWaiting; gas_data.old_area_meta = MetaMgr::Instance()->GetSafeArea(30001); gas_data.new_area_meta = MetaMgr::Instance()->GetSafeArea(30002); @@ -773,15 +786,9 @@ void Room::UpdateGas() } gas_data.rad_old = gas_data.old_area_meta->i->rad(); gas_data.rad_new = gas_data.new_area_meta->i->rad(); - RoomMgr::Instance()->RemoveFromInactiveRoomHash(room_uuid); } } break; - case GasJump: - { - - } - break; case GasWaiting: { if (frame_no - gas_data.gas_start_frameno >= @@ -845,7 +852,7 @@ void Room::UpdateGas() } break; } - if (gas_data.gas_mode != GasInactive) { + if (gas_data.gas_mode != GasInactive && gas_data.gas_mode != GasJump) { if (!game_over && alive_count_ <= 1) { game_over = true; game_over_frameno = frame_no; @@ -1030,3 +1037,12 @@ void Room::AirDrop(int appear_time, int box_id) &xtimer_attacher.timer_list_); } } + +void Room::ShuaPlane() +{ + for (auto& pair : human_hash_) { + a8::SetBitFlag(pair.second->status, HS_Fly); + pair.second->pos = plane.curr_pos; + pair.second->attack_dir = plane.dir; + } +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index ede1f42..1ee525a 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -35,6 +35,7 @@ public: long long game_over_frameno = 0; RoomProfile profile; a8::XTimer xtimer; + Plane plane; ~Room(); void Init(); @@ -89,6 +90,7 @@ private: void AutoMatchTeam(); void InitAirDrop(); void AirDrop(int appear_time, int box_id); + void ShuaPlane(); private: timer_list* stats_timer_ = nullptr; diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 065e59b..c067162 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -60,3 +60,11 @@ struct PlayerStats std::string killer_name; }; + +struct Plane +{ + Vector2D start_point; + Vector2D end_point; + Vector2D dir; + Vector2D curr_pos; +};