This commit is contained in:
aozhiwei 2019-04-16 15:43:18 +08:00
parent 813095f368
commit b068a4c801
10 changed files with 155 additions and 1 deletions

View File

@ -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;

View File

@ -11,6 +11,7 @@ struct RoomFrameData
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFEmote>> emotes_hash;
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFBullet>> bullets_hash;
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFShot>> shots_hash;
std::map<long long, ::google::protobuf::RepeatedPtrField<::cs::MFAirDrop>> airdrops_hash;
};
struct HumanFrameData

View File

@ -91,4 +91,9 @@ namespace MetaData
int rand_space = 0;
};
struct AirDrop
{
const metatable::AirDrop* i = nullptr;
};
}

View File

@ -28,6 +28,8 @@ public:
std::list<MetaData::Building> building_list;
std::list<metatable::Drop> drop_meta_list;
std::list<MetaData::Drop> drop_list;
std::list<metatable::AirDrop> airdrop_meta_list;
std::list<MetaData::AirDrop> airdrop_list;
std::map<std::string, MetaData::Parameter*> parameter_hash;
std::map<int, MetaData::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<MetaData::MapTplThing>* 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<MetaData::AirDrop>& MetaMgr::GetAirDrops()
{
return loader_->airdrop_list;
}

View File

@ -26,6 +26,7 @@ class MetaMgr : public a8::Singleton<MetaMgr>
MetaData::Drop* GetDrop(int drop_id);
MetaData::SafeArea* GetSafeArea(int area_id);
std::vector<MetaData::MapTplThing>* GetMapTplThing(std::string& map_name);
std::list<MetaData::AirDrop>& GetAirDrops();
private:
MetaDataLoader* loader_ = nullptr;

View File

@ -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) {

View File

@ -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<long long> 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<MetaData::AirDrop>& 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_);
}
}

View File

@ -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;

View File

@ -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
}

View File

@ -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;