From 12c1e08a72a21d5aa60d23a6f9df6f9e6c1c4ea0 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 7 Jul 2021 07:16:33 +0000 Subject: [PATCH] c4 ok --- server/gameserver/bullet.cc | 22 ++++++++++++++++++++++ server/gameserver/creature.cc | 19 ++++++++++--------- server/gameserver/frameevent.cc | 21 ++++++++++++++++----- server/gameserver/frameevent.h | 2 +- server/gameserver/framemaker.cc | 2 +- 5 files changed, 50 insertions(+), 16 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index d887435..0be56fa 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -139,6 +139,28 @@ void Bullet::ProcBomb() sender.Get()->GetAbility()->GetAttrAbs(kHAT_WeaponExplosionDealyTime); delay_time = std::max(0, delay_time); } + { + room->xtimer.AddDeadLineTimerAndAttach + (delay_time / FRAME_RATE_MS, + a8::XParams() + .SetSender(GetPos().x) + .SetParam1(GetPos().y) + .SetParam2(GetUniId()) + .SetParam3(room), + [] (const a8::XParams& param) + { + Room* room = (Room*)param.param3.GetUserData(); + float x = param.sender.GetDouble(); + float y = param.param1.GetDouble(); + int bullet_uniid = param.param2; + room->frame_event.RemoveBullet(a8::Vec2(x, y), bullet_uniid); + }, + &room->timer_attacher.timer_list_, + [] (const a8::XParams& param) + { + } + ); + } switch (meta->i->_inventory_slot()) { case IS_RPG: { diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 20c055f..ffe984d 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -64,15 +64,16 @@ void InternalShot(Creature* c, if (c->room->BattleStarted() || (c->room->GetGasData().gas_mode == GasJump && !c->HasBuffEffect(kBET_Jump))) { - c->room->CreateBullet(c, - c->shot_passenger, - weapon_meta, - weapon_upgrade_meta, - bullet_meta, - bullet_born_pos, - bullet_dir, - fly_distance, - is_tank_skin); + bullet_uniid = c->room->CreateBullet + (c, + c->shot_passenger, + weapon_meta, + weapon_upgrade_meta, + bullet_meta, + bullet_born_pos, + bullet_dir, + fly_distance, + is_tank_skin); } if (bullet_uniid == 0) { bullet_uniid = c->room->AllocUniid(); diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index 26375ee..6b1c741 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -111,13 +111,24 @@ void FrameEvent::AddBullet(int bullet_uniid, } } -void FrameEvent::RemoveBullet(Bullet* bullet) +void FrameEvent::RemoveBullet(a8::Vec2 pos, int bullet_uniid) { - if (bullet->sender.Get()) { - del_bullets_.push_back(bullet->GetUniId()); - int bullet_idx = del_bullets_.size() - 1; - bullet->sender.Get()->TraverseAllLayerHumanList + del_bullets_.push_back(bullet_uniid); + { + std::set grid_list; + room->grid_service->GetAllCellsByXy ( + room, + pos.x, + pos.y, + grid_list + ); + + int bullet_idx = del_bullets_.size() - 1; + room->grid_service->TraverseAllLayerHumanList + ( + room->GetRoomIdx(), + grid_list, [bullet_idx] (Human* hum, bool& stop) { hum->del_bullets_.push_back(bullet_idx); diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index 94b25dc..3a889ae 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -24,7 +24,7 @@ public: a8::Vec2 born_pos, a8::Vec2 dir, float fly_distance); - void RemoveBullet(Bullet* bullet); + void RemoveBullet(a8::Vec2 pos, int bullet_uniid); 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); diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index 9b076a8..bd5fd2a 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -117,7 +117,7 @@ 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); + msg->add_del_bullets(bullet_uniid); } } for (size_t idx : hum->explosions_) {