修复c4问题-ok

This commit is contained in:
aozhiwei 2021-07-07 06:46:36 +00:00
parent 8bf5a2e025
commit 68119fdc01
4 changed files with 41 additions and 8 deletions

View File

@ -60,12 +60,7 @@ void InternalShot(Creature* c,
}
}
bullet_dir.Rotate(bullet_angle / 180.0f);
c->room->frame_event.AddBullet(c->GetWeakPtrRef(),
weapon_meta,
weapon_lv,
bullet_born_pos,
bullet_dir,
fly_distance);
int bullet_uniid = 0;
if (c->room->BattleStarted() ||
(c->room->GetGasData().gas_mode == GasJump &&
!c->HasBuffEffect(kBET_Jump))) {
@ -79,6 +74,16 @@ void InternalShot(Creature* c,
fly_distance,
is_tank_skin);
}
if (bullet_uniid == 0) {
bullet_uniid = c->room->AllocUniid();
}
c->room->frame_event.AddBullet(bullet_uniid,
c->GetWeakPtrRef(),
weapon_meta,
weapon_lv,
bullet_born_pos,
bullet_dir,
fly_distance);
}
c->GetTrigger()->Shot(weapon_meta);
if (weapon_meta->i->recoil_force() > 0.000001) {

View File

@ -75,7 +75,8 @@ void FrameEvent::AddShot(CreatureWeakPtr& sender)
}
}
void FrameEvent::AddBullet(CreatureWeakPtr& sender,
void FrameEvent::AddBullet(int bullet_uniid,
CreatureWeakPtr& sender,
MetaData::Equip* weapon_meta,
int weapon_lv,
a8::Vec2 born_pos,
@ -88,6 +89,7 @@ void FrameEvent::AddBullet(CreatureWeakPtr& sender,
auto& p = std::get<1>(tuple);
p.set_player_id(sender.Get()->GetUniId());
p.set_bullet_uniid(bullet_uniid);
p.set_bullet_id(weapon_meta->i->use_bullet());
TypeConvert::ToPb(born_pos, p.mutable_pos());
TypeConvert::ToPb(dir, p.mutable_dir());
@ -109,6 +111,20 @@ void FrameEvent::AddBullet(CreatureWeakPtr& sender,
}
}
void FrameEvent::RemoveBullet(Bullet* bullet)
{
if (bullet->sender.Get()) {
del_bullets_.push_back(bullet->GetUniId());
int bullet_idx = del_bullets_.size() - 1;
bullet->sender.Get()->TraverseAllLayerHumanList
(
[bullet_idx] (Human* hum, bool& stop)
{
hum->del_bullets_.push_back(bullet_idx);
});
}
}
void FrameEvent::AddExplosion(Bullet* bullet, int item_id, a8::Vec2 bomb_pos)
{
AddExplosionEx(bullet->sender, item_id, bomb_pos, 0);
@ -484,4 +500,7 @@ void FrameEvent::Clear()
if (!chged_props_.empty()) {
chged_props_.clear();
}
if (!del_bullets_.empty()) {
del_bullets_.clear();
}
}

View File

@ -17,12 +17,14 @@ public:
void AddAirRaid(int appear_time, const a8::Vec2& raid_pos, float raid_rad);
void AddEmote(CreatureWeakPtr& sender, int emote_id);
void AddShot(CreatureWeakPtr& sender);
void AddBullet(CreatureWeakPtr& sender,
void AddBullet(int bullet_uniid,
CreatureWeakPtr& sender,
MetaData::Equip* weapon_meta,
int weapon_lv,
a8::Vec2 born_pos,
a8::Vec2 dir,
float fly_distance);
void RemoveBullet(Bullet* bullet);
void AddExplosion(Bullet* bullet, int item_id, a8::Vec2 bomb_pos);
void AddSmoke(Bullet* bullet, int item_id, a8::Vec2 pos);
void AddPlaySkill(CreatureWeakPtr& sender, int skill_id);
@ -62,6 +64,7 @@ private:
std::vector<CreatureWeakPtr> chged_cars_;
std::vector<std::tuple<int, int, int>> dead_alive_objs_;
std::vector<std::tuple<CreatureWeakPtr, ::cs::MFPropertyChg>> chged_props_;
std::vector<int> del_bullets_;
friend class FrameMaker;
};

View File

@ -114,6 +114,12 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum)
}
}
}
for (size_t idx : hum->del_bullets_) {
if (idx < room->frame_event.del_bullets_.size()) {
int bullet_uniid = room->frame_event.del_bullets_[idx];
msg->add_del_objids(bullet_uniid);
}
}
for (size_t idx : hum->explosions_) {
if (idx < room->frame_event.explosions_.size()) {
auto& tuple = room->frame_event.explosions_[idx];