From 79be580f3d8c33ed67b634e994094469d4e4b911 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 5 Aug 2020 14:35:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AD=90=E5=BC=B9=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E8=BE=B9=E7=95=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/bullet.cc | 80 ++++++++++++++++++++----------------- server/gameserver/bullet.h | 2 + 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index a41fa54..03b1540 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -209,48 +209,17 @@ void Bullet::MapServiceUpdate() if (IsBomb()) { ProcBomb(); } else { - room->RemoveObjectLater(this); - } - } else { - room->grid_service->MoveBullet(this); - std::set objects; - TouchAllLayerHumanList - ( - [this, &objects] (Human* hum, bool& stop) - { - if (hum != player && !hum->dead && TestCollision(room, hum)) { - objects.insert(hum); - } - }); - { - std::set colliders; - room->map_service->GetColliders(room, GetX(), GetY(), colliders); - for (ColliderComponent* collider : colliders) { - if (TestCollision(room, collider) && !a8::HasBitFlag(collider->tag, kHalfWallTag)) { - objects.insert(collider->owner); - } - } - } - float bullet_range = gun_meta->i->range(); - if (gun_upgrade_meta && gun_upgrade_meta->GetAttrValue(gun_lv, kHAT_ShotRange) > 0) { - bullet_range += gun_upgrade_meta->GetAttrValue(gun_lv, kHAT_ShotRange); - } - if (!objects.empty() || distance > bullet_range || - (IsBomb() && meta->i->_inventory_slot() != 4 && distance >= fly_distance) - ) { - if (IsBomb()) { - ProcBomb(); - } else { - if (!objects.empty()) { - OnHit(objects); - } + Check(distance); + if (!later_removed_) { room->RemoveObjectLater(this); } } + } else { + room->grid_service->MoveBullet(this); + Check(distance); } } - float Bullet::GetAtk() { float atk = gun_meta->i->atk() + @@ -261,3 +230,42 @@ float Bullet::GetAtk() } return atk; } + +void Bullet::Check(float distance) +{ + std::set objects; + TouchAllLayerHumanList + ( + [this, &objects] (Human* hum, bool& stop) + { + if (hum != player && !hum->dead && TestCollision(room, hum)) { + objects.insert(hum); + } + }); + { + std::set colliders; + room->map_service->GetColliders(room, GetX(), GetY(), colliders); + for (ColliderComponent* collider : colliders) { + if (TestCollision(room, collider) && !a8::HasBitFlag(collider->tag, kHalfWallTag)) { + objects.insert(collider->owner); + } + } + } + float bullet_range = gun_meta->i->range(); + if (gun_upgrade_meta && gun_upgrade_meta->GetAttrValue(gun_lv, kHAT_ShotRange) > 0) { + bullet_range += gun_upgrade_meta->GetAttrValue(gun_lv, kHAT_ShotRange); + } + if (!objects.empty() || distance > bullet_range || + (IsBomb() && meta->i->_inventory_slot() != 4 && distance >= fly_distance) + ) { + if (IsBomb()) { + ProcBomb(); + } else { + if (!objects.empty()) { + OnHit(objects); + } + room->RemoveObjectLater(this); + later_removed_ = true; + } + } +} diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 10c9f6a..a922c59 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -43,9 +43,11 @@ protected: bool IsBomb(); inline void MapServiceUpdate(); float GetAtk(); + void Check(float distance); private: CircleCollider* self_collider_ = nullptr; + bool later_removed_ = false; friend class EntityFactory; };