From b97746dd843c6a869c182703ab3548baf81aa9f8 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 17 May 2021 19:54:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Drpg=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 | 2 +- server/gameserver/hero.cc | 20 +++++++++++++++++++- server/gameserver/hero.h | 1 + 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index da7f066..8e83b3a 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -259,7 +259,7 @@ void Bullet::Check(float distance) bullet_range += gun_upgrade_meta->GetAttrValue(gun_lv, kHAT_ShotRange); } if (!objects.empty() || distance > bullet_range || - (IsBomb() && distance >= fly_distance) + (IsBomb() && meta->i->_inventory_slot() != IS_RPG && distance >= fly_distance) ) { if (IsBomb()) { ProcBomb(); diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index bd24dc4..58229b9 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -275,5 +275,23 @@ void Hero::DetachFromMaster() void Hero::DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) { - + if (dec_hp < 0.001f) { + return; + } + float old_health = GetHP(); + float new_health = std::max(0.0f, GetHP() - dec_hp); + ability.hp = std::max(0.0f, new_health); + if (GetHP() <= 0.0001f && !IsDead(room)) { + BeKill(killer_id, killer_name, weapon_id); + } + room->frame_event.AddHpChg(GetWeakPtrRef()); +} + +void Hero::BeKill(int killer_id, const std::string& killer_name, int weapon_id) +{ + dead = true; + BroadcastDeleteState(room); + RemoveFromAroundPlayers(room); + room->grid_service->RemoveCreature(this); + room->RemoveObjectLater(this); } diff --git a/server/gameserver/hero.h b/server/gameserver/hero.h index ee52e6f..0159e58 100644 --- a/server/gameserver/hero.h +++ b/server/gameserver/hero.h @@ -43,6 +43,7 @@ protected: void InternalUpdateMove(float speed); bool IsCollisionInMapService(); virtual void RecalcSelfCollider() override; + void BeKill(int killer_id, const std::string& killer_name, int weapon_id); private: bool later_removed_ = false;