game2001/server/gameserver/frameevent.cc
2020-07-07 20:40:30 +08:00

241 lines
6.3 KiB
C++

#include "precompile.h"
#include "frameevent.h"
#include "human.h"
#include "bullet.h"
#include "metamgr.h"
#include "typeconvert.h"
void FrameEvent::AddAirDrop(int appear_time, int box_id, a8::Vec2 box_pos)
{
cs::MFAirDrop* airdrop = airdrops_.Add();
airdrop->set_appear_time(appear_time);
airdrop->set_box_id(box_id);
TypeConvert::ToPb(box_pos, 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);
if (hum->tank_weapon.meta) {
hum->tank_weapon.ToPB(p.mutable_weapon());
} else {
hum->curr_weapon->ToPB(p.mutable_weapon());
}
#if 0
p.set_offhand(true);
p.set_bullskin(10001);
#endif
}
{
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, a8::Vec2 born_pos, a8::Vec2 dir, 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);
if (hum->tank_weapon.meta) {
p.set_bullet_id(hum->tank_weapon.meta->i->use_bullet());
} else {
p.set_bullet_id(hum->curr_weapon->meta->i->use_bullet());
}
TypeConvert::ToPb(born_pos, p.mutable_pos());
TypeConvert::ToPb(dir, p.mutable_dir());
#if 0
p.set_bulletskin(10001);
#endif
if (hum->tank_weapon.meta) {
p.set_gun_id(hum->tank_weapon.meta->i->id());
p.set_gun_lv(hum->tank_weapon.weapon_lv);
} else {
p.set_gun_id(hum->curr_weapon->meta->i->id());
p.set_gun_lv(hum->curr_weapon->weapon_lv);
}
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, a8::Vec2 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);
TypeConvert::ToPb(bomb_pos, 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, a8::Vec2 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);
TypeConvert::ToPb(bomb_pos, 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::AddBulletNumChg(Human* hum)
{
chged_bullet_nums_.push_back(hum);
int idx = chged_bullet_nums_.size() - 1;
hum->chged_bullet_nums_.push_back(idx);
}
void FrameEvent::AddTankBulletNumChg(Human* hum)
{
chged_tank_bullet_nums_.push_back(hum);
int idx = chged_tank_bullet_nums_.size() - 1;
hum->chged_tank_bullet_nums_.push_back(idx);
}
void FrameEvent::AddTankOilValueChg(Human* hum)
{
chged_tank_oil_value_.push_back(hum);
int idx = chged_tank_oil_value_.size() - 1;
hum->chged_tank_oil_value_.push_back(idx);
}
void FrameEvent::AddTankOilMaxChg(Human* hum)
{
chged_tank_oil_max_.push_back(hum);
int idx = chged_tank_oil_max_.size() - 1;
hum->chged_tank_oil_max_.push_back(idx);
}
void FrameEvent::AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos)
{
{
auto& tuple = a8::FastAppend(smokes_);
std::get<0>(tuple) = bullet->player;
auto& p = std::get<1>(tuple);
p.set_item_id(item_id);
TypeConvert::ToPb(pos, 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::AddHpChg(Human* hum)
{
chged_hps_.push_back(hum);
int idx = chged_hps_.size() - 1;
for (auto& cell : hum->grid_list) {
for (auto& hum : cell->human_list) {
hum->chged_hps_.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();
}
if (!chged_bullet_nums_.empty()) {
chged_bullet_nums_.clear();
}
if (!chged_tank_bullet_nums_.empty()) {
chged_tank_bullet_nums_.clear();
}
if (!chged_tank_oil_value_.empty()) {
chged_tank_oil_value_.clear();
}
if (!chged_tank_oil_max_.empty()) {
chged_tank_oil_max_.clear();
}
if (!chged_hps_.empty()) {
chged_hps_.clear();
}
}