1
This commit is contained in:
parent
813095f368
commit
b068a4c801
@ -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;
|
||||
|
@ -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
|
||||
|
@ -91,4 +91,9 @@ namespace MetaData
|
||||
int rand_space = 0;
|
||||
};
|
||||
|
||||
struct AirDrop
|
||||
{
|
||||
const metatable::AirDrop* i = nullptr;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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_);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user