From 68119fdc012ce0f5ccf76b3351b71b50880d98a8 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 7 Jul 2021 06:46:36 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dc4=E9=97=AE=E9=A2=98-ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/creature.cc | 17 +++++++++++------ server/gameserver/frameevent.cc | 21 ++++++++++++++++++++- server/gameserver/frameevent.h | 5 ++++- server/gameserver/framemaker.cc | 6 ++++++ 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 6daf305..20c055f 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -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) { diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index 1353c34..26375ee 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -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(); + } } diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index 65b0434..94b25dc 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -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 chged_cars_; std::vector> dead_alive_objs_; std::vector> chged_props_; + std::vector del_bullets_; friend class FrameMaker; }; diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index 79a7983..9b076a8 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -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];