#include "precompile.h" #include "frameevent.h" #include "human.h" #include "bullet.h" #include "metamgr.h" void FrameEvent::AddAirDrop(int appear_time, int box_id, Vector2D box_pos) { cs::MFAirDrop* airdrop = airdrops_.Add(); airdrop->set_appear_time(appear_time); airdrop->set_box_id(box_id); box_pos.ToPB(airdrop->mutable_pos()); } void FrameEvent::AddEmote(Human* hum, int emote_id) { { auto& tuple = a8::FastAppend(emotes_); std::get<0>(tuple) = hum; auto& p = std::get<1>(tuple); 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); } } } } void FrameEvent::AddShot(Human* hum) { { auto& tuple = a8::FastAppend(shots_); std::get<0>(tuple) = hum; auto& p = std::get<1>(tuple); 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(Human* hum, Vector2D born_pos, float fly_distance) { { 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); } } } } void FrameEvent::AddExplosion(Bullet* bullet, int item_id, Vector2D bomb_pos) { { 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::AddExplosionEx(Human* sender, int item_id, Vector2D bomb_pos, int effect) { { auto& tuple = a8::FastAppend(explosions_); std::get<0>(tuple) = sender; auto& p = std::get<1>(tuple); p.set_item_id(item_id); bomb_pos.ToPB(p.mutable_pos()); p.set_player_id(sender->entity_uniid); p.set_effect(effect); } { int explosion_idx = explosions_.size() - 1; for (auto& cell : sender->grid_list) { for (auto& hum : cell->human_list) { hum->explosions_.push_back(explosion_idx); } } } } void FrameEvent::AddSmoke(Bullet* bullet, int item_id, Vector2D pos) { { auto& tuple = a8::FastAppend(smokes_); 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 idx = smokes_.size() - 1; for (auto& cell : bullet->player->grid_list) { for (auto& hum : cell->human_list) { hum->smokes_.push_back(idx); } } } } void FrameEvent::Clear() { if (!explosions_.empty()) { explosions_.clear(); } if (!smokes_.empty()) { smokes_.clear(); } if (!emotes_.empty()) { emotes_.clear(); } if (!bullets_.empty()) { bullets_.clear(); } if (!shots_.empty()) { shots_.clear(); } if (airdrops_.size() > 0) { airdrops_.Clear(); } }