From b068a4c8016ab9f0c37ca8014db1245885132b05 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 16 Apr 2019 15:43:18 +0800 Subject: [PATCH] 1 --- server/gameserver/constant.h | 2 +- server/gameserver/framedata.h | 1 + server/gameserver/metadata.h | 5 ++ server/gameserver/metamgr.cc | 13 +++ server/gameserver/metamgr.h | 1 + server/gameserver/player.cc | 8 ++ server/gameserver/room.cc | 106 ++++++++++++++++++++++++ server/gameserver/room.h | 3 + server/tools/protobuild/cs_proto.proto | 9 ++ server/tools/protobuild/metatable.proto | 8 ++ 10 files changed, 155 insertions(+), 1 deletion(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 1991e14..0338666 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -100,7 +100,7 @@ const int SYS_RESET_TIME = 2*60; //每日两点重置 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; const float FRAME_RATE_MS = 1000.0f / SERVER_FRAME_RATE; diff --git a/server/gameserver/framedata.h b/server/gameserver/framedata.h index c179f04..781200f 100644 --- a/server/gameserver/framedata.h +++ b/server/gameserver/framedata.h @@ -11,6 +11,7 @@ struct RoomFrameData std::map> emotes_hash; std::map> bullets_hash; std::map> shots_hash; + std::map> airdrops_hash; }; struct HumanFrameData diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 52be553..a4aa507 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -91,4 +91,9 @@ namespace MetaData int rand_space = 0; }; + struct AirDrop + { + const metatable::AirDrop* i = nullptr; + }; + } diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 7bec8d1..cb60867 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -28,6 +28,8 @@ public: std::list building_list; std::list drop_meta_list; std::list drop_list; + std::list airdrop_meta_list; + std::list airdrop_list; std::map parameter_hash; std::map gamemap_hash; @@ -59,6 +61,7 @@ public: f8::ReadCsvMetaFile(res_path + "player@player.csv", player_meta_list); f8::ReadCsvMetaFile(res_path + "mapThing@mapThing.csv", mapthing_meta_list); f8::ReadCsvMetaFile(res_path + "drop@drop.csv", drop_meta_list); + f8::ReadCsvMetaFile(res_path + "airdrop@airdrop.csv", airdrop_meta_list); f8::ReadJsonMetaFile(res_path + "maps.json", building_meta_list); BindToMetaData(); } @@ -150,6 +153,11 @@ private: drop_hash[item.i->drop_id()] = &item; } + for (auto& meta : airdrop_meta_list) { + MetaData::AirDrop& item = a8::FastAppend(airdrop_list); + item.i = &meta; + } + { int building_id = 0; for (auto& meta : building_meta_list) { @@ -246,3 +254,8 @@ std::vector* MetaMgr::GetMapTplThing(std::string& map_nam auto itr = loader_->maptpl_hash.find(map_name); return itr != loader_->maptpl_hash.end() ? &itr->second : nullptr; } + +std::list& MetaMgr::GetAirDrops() +{ + return loader_->airdrop_list; +} diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index d306541..a00ff7c 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -26,6 +26,7 @@ class MetaMgr : public a8::Singleton MetaData::Drop* GetDrop(int drop_id); MetaData::SafeArea* GetSafeArea(int area_id); std::vector* GetMapTplThing(std::string& map_name); + std::list& GetAirDrops(); private: MetaDataLoader* loader_ = nullptr; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 2a73c91..3b942a0 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -930,6 +930,14 @@ void Player::MakeUpdateMsg() } } } + for (auto& pair : room->frame_data.airdrops_hash) { + if (pair.first <= room->frame_no) { + for (auto& itr : pair.second) { + *update_msg->mutable_airdrop() = itr; + break; + } + } + } } if (team_members) { for (auto& itr : *team_members) { diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 8362c5a..f944b4c 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -69,6 +69,7 @@ void Room::Init() }, &xtimer_attacher.timer_list_); } + InitAirDrop(); } void Room::UnInit() @@ -186,6 +187,17 @@ void Room::Update(int delta_time) frame_data.emotes_hash.erase(id); } } + { + std::vector del_ids; + for (auto& pair : frame_data.airdrops_hash) { + if (pair.first <= frame_no) { + del_ids.push_back(pair.first); + } + } + for (long long id : del_ids) { + frame_data.airdrops_hash.erase(id); + } + } } } ++frame_no; @@ -568,6 +580,25 @@ void Room::CreateHouseObstacle(Building* building, int id, float x, float y) } } +void Room::CreateObstacle(int id, float x, float y) +{ + a8::XPrintf("createobstacle %d %f %f\n", {id, x, y}); + MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(id); + if (thing) { + Obstacle* entity = new Obstacle(); + entity->room = this; + entity->meta = thing; + entity->building = nullptr; + entity->entity_uniid = AllocUniid(); + entity->pos = Vector2D(x, y); + entity->Initialize(); + uniid_hash_[entity->entity_uniid] = entity; + for (auto& pair : human_hash_) { + pair.second->AddToNewObjects(entity); + } + } +} + void Room::CreateLoot(int equip_id, Vector2D pos, int count) { MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(equip_id); @@ -915,3 +946,78 @@ void Room::AutoMatchTeam() team_members->insert(humans[i]); } } + +void Room::InitAirDrop() +{ + std::list& air_drops = MetaMgr::Instance()->GetAirDrops(); + a8::XPrintf("InitAirdrop %d %d\n", {room_uuid, air_drops.size()}); + for (auto& air_drop : air_drops) { + xtimer.AddDeadLineTimerAndAttach(SERVER_FRAME_RATE * air_drop.i->time(), + a8::XParams() + .SetSender(this) + .SetParam1(air_drop.i->appear_time()) + .SetParam2(air_drop.i->drop_id()) + .SetParam3(air_drop.i->id()), + [] (const a8::XParams& param) + { + Room* room = (Room*)param.sender.GetUserData(); + if (!room->game_over) { + a8::XPrintf("airdrop %d %d %d\n", + { + param.param3, + param.param1, + param.param2 + }); + room->AirDrop(param.param1, param.param2); + } + }, + &xtimer_attacher.timer_list_); + } +} + +void Room::AirDrop(int appear_time, int box_id) +{ + MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(box_id); + if (thing_meta) { + Vector2D dir = Vector2D::UP; + dir.Rotate(a8::RandAngle()); + a8::XPrintf("gas_data.pos_new %f %f\n", + { + gas_data.pos_new.x, + gas_data.pos_new.y + }); + Vector2D box_pos = gas_data.pos_new + dir * (500 + rand() % 300); + ::google::protobuf::RepeatedPtrField<::cs::MFAirDrop>* airdrops = nullptr; + { + { + auto itr = frame_data.airdrops_hash.find(frame_no); + if (itr == frame_data.airdrops_hash.end()) { + frame_data.airdrops_hash[frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFAirDrop>(); + itr = frame_data.airdrops_hash.find(frame_no); + } + airdrops = &itr->second; + } + } + cs::MFAirDrop* airdrop = airdrops->Add(); + airdrop->set_appear_time(appear_time); + airdrop->set_box_id(box_id); + box_pos.ToPB(airdrop->mutable_pos()); + + xtimer.AddDeadLineTimerAndAttach(SERVER_FRAME_RATE * appear_time / 1000.f, + a8::XParams() + .SetSender(this) + .SetParam1(box_id) + .SetParam2(box_pos.x) + .SetParam3(box_pos.y), + [] (const a8::XParams& param) + { + Room* room = (Room*)param.sender.GetUserData(); + if (!room->game_over) { + room->CreateObstacle(param.param1.GetInt(), + param.param2.GetDouble(), + param.param3.GetDouble()); + } + }, + &xtimer_attacher.timer_list_); + } +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index bf16d2b..74fb0d9 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -69,6 +69,7 @@ public: void CreateThings(); void CreateDoor(Building* building, int door_idx); void CreateHouseObstacle(Building* building, int id, float x, float y); + void CreateObstacle(int id, float x, float y); void CreateLoot(int equip_id, Vector2D pos, int count); void CreateBullet(Human* hum, MetaData::Equip* gun_meta, Vector2D pos, Vector2D dir, float fly_distance); @@ -86,6 +87,8 @@ private: Vector2D& out_pos); void OutputDebugLog(); void AutoMatchTeam(); + void InitAirDrop(); + void AirDrop(int appear_time, int box_id); private: timer_list* stats_timer_ = nullptr; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 5fbd9d0..49a8cf9 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -500,6 +500,14 @@ message MFPlayerStats optional string account_id = 21; //账号id } +//空投 +message MFAirDrop +{ + optional int32 appear_time = 1; //箱子出现时间(毫秒) + optional int32 box_id = 2; //箱子id + optional MFVector2D pos = 3; //位置 +} + //end mfmsg //加入 @@ -622,6 +630,7 @@ message SMUpdate repeated MFExplosion explosions = 22; //爆炸 repeated MFSmoke smokes = 25; //烟雾 repeated MFEmote emotes = 23; //表情 + optional MFAirDrop airdrop = 26; //空投 optional int32 ack = 24; //服务器最后处理的req id } diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 62c64f0..a51ad2a 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -94,6 +94,14 @@ message Drop optional int32 type = 5; } +message AirDrop +{ + optional int32 id = 1; + optional int32 time = 2; + optional int32 appear_time = 3; + optional int32 drop_id = 4; +} + message DoorObjJson { optional float height = 1;