From 7a95ca7c5116e260a08e2b649c1b9c793cfe8dc0 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 25 Apr 2019 14:17:23 +0800 Subject: [PATCH] smupdate ok --- server/gameserver/frameevent.cc | 164 +++++++++++++++++--------------- server/gameserver/frameevent.h | 10 +- server/gameserver/framemaker.cc | 83 +++++++++------- server/gameserver/human.cc | 2 +- server/gameserver/human.h | 4 + server/gameserver/player.cc | 2 +- 6 files changed, 146 insertions(+), 119 deletions(-) diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index 7b53ff6..07109ee 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -2,6 +2,8 @@ #include "frameevent.h" #include "human.h" +#include "bullet.h" +#include "metamgr.h" void FrameEvent::AddAirDrop(int appear_time, int box_id, Vector2D box_pos) { @@ -13,116 +15,126 @@ void FrameEvent::AddAirDrop(int appear_time, int box_id, Vector2D box_pos) void FrameEvent::AddEmote(Human* hum, int emote_id) { -#if 0 - ::google::protobuf::RepeatedPtrField<::cs::MFEmote>* emotes = nullptr; { - auto itr = room->frame_data.emotes_.find(room->frame_no); - if (itr == room->frame_data.emotes_.end()) { - room->frame_data.emotes_[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFEmote>(); - itr = room->frame_data.emotes_.find(room->frame_no); - } - emotes = &itr->second; - } + auto& tuple = a8::FastAppend(emotes_); + std::get<0>(tuple) = hum; + auto& p = std::get<1>(tuple); - { - cs::MFEmote* p = emotes->Add(); - p->set_emote_id(emote_id); - p->set_player_id(entity_uniid); + p.set_emote_id(emote_id); + p.set_player_id(hum->entity_uniid); + } + { + int emote_idx = emotes_.size() - 1; + for (auto& cell : hum->grid_list) { + for (auto& hum : cell->human_list) { + hum->emotes_.push_back(emote_idx); + } + } } -#endif } void FrameEvent::AddShot(Human* hum) { - auto& tuple = a8::FastAppend(shots_); - std::get<0>(tuple) = hum; - auto& shot = std::get<1>(tuple); - shot.set_player_id(hum->entity_uniid); - hum->curr_weapon->ToPB(shot.mutable_weapon()); - shot.set_offhand(true); - shot.set_bullskin(10001); + { + auto& tuple = a8::FastAppend(shots_); + std::get<0>(tuple) = hum; + auto& p = std::get<1>(tuple); - int shot_idx = shots_.size() - 1; - for (auto& cell : hum->grid_list) { - for (auto& hum : cell->human_list) { - hum->shots_.push_back(shot_idx); + p.set_player_id(hum->entity_uniid); + hum->curr_weapon->ToPB(p.mutable_weapon()); + p.set_offhand(true); + p.set_bullskin(10001); + } + { + int shot_idx = shots_.size() - 1; + for (auto& cell : hum->grid_list) { + for (auto& hum : cell->human_list) { + hum->shots_.push_back(shot_idx); + } } } } -void FrameEvent::AddBullet() +void FrameEvent::AddBullet(Human* hum, Vector2D born_pos, float fly_distance) { - #if 0 - ::google::protobuf::RepeatedPtrField<::cs::MFBullet>* bullets = nullptr; { - { - auto itr = room->frame_data.bullets_.find(room->frame_no); - if (itr == room->frame_data.bullets_.end()) { - room->frame_data.bullets_[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFBullet>(); - itr = room->frame_data.bullets_.find(room->frame_no); + auto& tuple = a8::FastAppend(bullets_); + std::get<0>(tuple) = hum; + auto& p = std::get<1>(tuple); + + p.set_player_id(hum->entity_uniid); + p.set_bullet_id(hum->curr_weapon->meta->i->use_bullet()); + born_pos.ToPB(p.mutable_pos()); + hum->attack_dir.ToPB(p.mutable_dir()); + p.set_bulletskin(10001); + p.set_gun_id(hum->curr_weapon->meta->i->id()); + p.set_fly_distance(fly_distance); + } + { + int bullet_idx = bullets_.size() - 1; + for (auto& cell : hum->grid_list) { + for (auto& hum : cell->human_list) { + hum->bullets_.push_back(bullet_idx); } - 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); - } - #endif } void FrameEvent::AddExplosion(Bullet* bullet, int item_id, Vector2D bomb_pos) { -#if 0 - Vector2D bomb_pos = pos; - room->AddExplosion(Human *hum, meta->i->id(), bomb_pos) - cs::MFExplosion* explosion = explosions->Add(); - explosion->set_item_id(meta->i->id()); - bomb_pos.ToPB(explosion->mutable_pos()); - explosion->set_player_id(player->entity_uniid); -#endif + { + auto& tuple = a8::FastAppend(explosions_); + std::get<0>(tuple) = bullet->player; + auto& p = std::get<1>(tuple); + + p.set_item_id(item_id); + bomb_pos.ToPB(p.mutable_pos()); + p.set_player_id(bullet->player->entity_uniid); + } + { + int explosion_idx = explosions_.size() - 1; + for (auto& cell : bullet->player->grid_list) { + for (auto& hum : cell->human_list) { + hum->explosions_.push_back(explosion_idx); + } + } + } } void FrameEvent::AddSmoke(Bullet* bullet, int item_id, Vector2D pos) { -#if 0 - ::google::protobuf::RepeatedPtrField<::cs::MFSmoke>* smokes = nullptr; { - auto itr = room->frame_data.smokes_.find(room->frame_no); - if (itr == room->frame_data.smokes_.end()) { - room->frame_data.smokes_[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFSmoke>(); - itr = room->frame_data.smokes_.find(room->frame_no); - } - smokes = &itr->second; + auto& tuple = a8::FastAppend(explosions_); + std::get<0>(tuple) = bullet->player; + auto& p = std::get<1>(tuple); + + p.set_item_id(item_id); + pos.ToPB(p.mutable_pos()); + p.set_player_id(bullet->player->entity_uniid); + } + { + int explosion_idx = smokes_.size() - 1; + for (auto& cell : bullet->player->grid_list) { + for (auto& hum : cell->human_list) { + hum->explosions_.push_back(explosion_idx); + } + } } - - cs::MFSmoke* smoke = smokes->Add(); - smoke->set_item_id(meta->i->id()); - bomb_pos.ToPB(smoke->mutable_pos()); - smoke->set_player_id(player->entity_uniid); - -#endif } void FrameEvent::Clear() { - if (explosions_.size() > 0) { - explosions_.Clear(); + if (!explosions_.empty()) { + explosions_.clear(); } - if (smokes_.size() > 0) { - smokes_.Clear(); + if (!smokes_.empty()) { + smokes_.clear(); } - if (emotes_.size() > 0) { - emotes_.Clear(); + if (!emotes_.empty()) { + emotes_.clear(); } - if (bullets_.size() > 0) { - bullets_.Clear(); + if (!bullets_.empty()) { + bullets_.clear(); } if (!shots_.empty()) { shots_.clear(); diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index ed91019..a269e04 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -10,18 +10,18 @@ public: void AddAirDrop(int appear_time, int box_id, Vector2D box_pos); void AddEmote(Human* hum, int emote_id); void AddShot(Human* hum); - void AddBullet(); + void AddBullet(Human* hum, Vector2D born_pos, float fly_distance); void AddExplosion(Bullet* bullet, int item_id, Vector2D bomb_pos); void AddSmoke(Bullet* bullet, int item_id, Vector2D pos); void Clear(); private: - ::google::protobuf::RepeatedPtrField<::cs::MFExplosion> explosions_; - ::google::protobuf::RepeatedPtrField<::cs::MFSmoke> smokes_; - ::google::protobuf::RepeatedPtrField<::cs::MFEmote> emotes_; - ::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets_; ::google::protobuf::RepeatedPtrField<::cs::MFAirDrop> airdrops_; std::vector> shots_; + std::vector> bullets_; + std::vector> explosions_; + std::vector> smokes_; + std::vector> emotes_; friend class FrameMaker; }; diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index 2b1e640..5a94eea 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -4,39 +4,6 @@ #include "human.h" #include "room.h" -#if 0 - { - for (auto& pair : room->frame_data.bullets_hash) { - if (pair.first <= room->frame_no) { - for (auto& itr : pair.second) { - *msg->add_bullets() = itr; - } - } - } - for (auto& pair : room->frame_data.explosions_hash) { - if (pair.first <= room->frame_no) { - for (auto& itr : pair.second) { - *msg->add_explosions() = itr; - } - } - } - for (auto& pair : room->frame_data.smokes_hash) { - if (pair.first <= room->frame_no) { - for (auto& itr : pair.second) { - *msg->add_smokes() = itr; - } - } - } - for (auto& pair : room->frame_data.emotes_hash) { - if (pair.first <= room->frame_no) { - for (auto& itr : pair.second) { - *msg->add_emotes() = itr; - } - } - } - } -#endif - cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) { cs::SMUpdate* msg = new cs::SMUpdate; @@ -70,14 +37,46 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) hum->part_objects.erase(entity); } } - for (int shot_idx : hum->shots_) { - if (shot_idx < room->frame_event.shots_.size()) { - auto& tuple = room->frame_event.shots_[shot_idx]; + for (int idx : hum->shots_) { + if (idx < room->frame_event.shots_.size()) { + auto& tuple = room->frame_event.shots_[idx]; if (hum->CanSee(std::get<0>(tuple))) { *msg->add_shots() = std::get<1>(tuple); } } } + for (int idx : hum->bullets_) { + if (idx < room->frame_event.bullets_.size()) { + auto& tuple = room->frame_event.bullets_[idx]; + if (hum->CanSee(std::get<0>(tuple))) { + *msg->add_bullets() = std::get<1>(tuple); + } + } + } + for (int idx : hum->explosions_) { + if (idx < room->frame_event.explosions_.size()) { + auto& tuple = room->frame_event.explosions_[idx]; + if (hum->CanSee(std::get<0>(tuple))) { + *msg->add_explosions() = std::get<1>(tuple); + } + } + } + for (int idx : hum->smokes_) { + if (idx < room->frame_event.smokes_.size()) { + auto& tuple = room->frame_event.smokes_[idx]; + if (hum->CanSee(std::get<0>(tuple))) { + *msg->add_smokes() = std::get<1>(tuple); + } + } + } + for (int idx : hum->emotes_) { + if (idx < room->frame_event.emotes_.size()) { + auto& tuple = room->frame_event.emotes_[idx]; + if (hum->CanSee(std::get<0>(tuple))) { + *msg->add_emotes() = std::get<1>(tuple); + } + } + } if (room->frame_event.airdrops_.size() > 0) { *msg->mutable_airdrop() = room->frame_event.airdrops_.Get(0); } @@ -105,6 +104,18 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) if (!hum->shots_.empty()) { hum->shots_.clear(); } + if (!hum->bullets_.empty()) { + hum->bullets_.clear(); + } + if (!hum->explosions_.empty()) { + hum->explosions_.clear(); + } + if (!hum->smokes_.empty()) { + hum->smokes_.clear(); + } + if (!hum->emotes_.empty()) { + hum->emotes_.clear(); + } ++hum->send_msg_times; return msg; } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index c5154d6..23620af 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -180,7 +180,7 @@ void Human::Shot(Vector2D& target_dir) 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; - room->frame_event.AddBullet(); + room->frame_event.AddBullet(this, bullet_born_pos, fly_distance); room->CreateBullet(this, curr_weapon->meta, bullet_born_pos, attack_dir, fly_distance); } --curr_weapon->ammo; diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 56481ad..b51a903 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -136,6 +136,10 @@ protected: std::set part_objects; std::set del_objects; std::vector shots_; + std::vector emotes_; + std::vector bullets_; + std::vector smokes_; + std::vector explosions_; private: CircleCollider* self_collider_ = nullptr; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 4af37da..d16b786 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -439,7 +439,7 @@ void Player::Shot() 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; - room->frame_event.AddBullet(); + room->frame_event.AddBullet(this, bullet_born_pos, fly_distance); room->CreateBullet(this, curr_weapon->meta, bullet_born_pos, attack_dir, fly_distance); } }