From e02df63539580fa1824f0fa877da727049bb39a7 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 30 Jul 2020 10:15:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BB=88=E7=BB=93=E8=80=85?= =?UTF-8?q?=E5=AE=9D=E7=AE=B1=E4=BF=9D=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/bullet.cc | 4 +++- server/gameserver/human.cc | 8 ++------ server/gameserver/obstacle.cc | 4 +++- server/gameserver/obstacle.h | 1 + server/gameserver/roomobstacle.h | 1 + 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 9a0d0e8..eba0b2f 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -83,7 +83,9 @@ void Bullet::OnHit(std::set& objects) case ET_Obstacle: { Obstacle* obstacle = (Obstacle*)target; - if (!obstacle->IsDead(room) && obstacle->Attackable()) { + if (!obstacle->IsDead(room) && + obstacle->Attackable() && + !obstacle->IsTerminatorAirDropBox(room)) { float dmg = GetAtk() * (1 + player->GetBuffAttrRate(kHAT_Atk)) + player->GetBuffAttrAbs(kHAT_Atk); float def = 0; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index ec7abdb..a3cf880 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -526,15 +526,11 @@ bool Human::IsCollisionInMapService() if (!collider->owner->dead && TestCollision((ColliderComponent*)collider)) { #endif if (last_collision_door_ != collider->owner) { - bool is_terminator_airdrop_box = false; - if (obstacle->IsEntitySubType(EST_RoomObstacle)) { - is_terminator_airdrop_box = ((RoomObstacle*)obstacle)->is_terminator_airdrop_box; - } if (!obstacle->IsDead(room) && obstacle->Attackable() && obstacle->meta->i->drop() != 0 && room->GetGasData().gas_mode != GasInactive && - (!is_terminator_airdrop_box || GetRace() == kHumanRace) + (!obstacle->IsTerminatorAirDropBox(room) || GetRace() == kHumanRace) ) { obstacle->Die(room); if (obstacle->IsDead(room)) { @@ -547,7 +543,7 @@ bool Human::IsCollisionInMapService() DropItems(obstacle); } obstacle->BroadcastFullState(room); - if (is_terminator_airdrop_box && GetRace() == kHumanRace) { + if (obstacle->IsTerminatorAirDropBox(room) && GetRace() == kHumanRace) { MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(TERMINATOR_BUFF_ID); if (buff_meta) { AddBuff(this, buff_meta, 1); diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 8e8b56a..54395f4 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -301,7 +301,9 @@ void Obstacle::Explosion(Bullet* bullet) case ET_Obstacle: { Obstacle* obstacle = (Obstacle*)target; - if (!obstacle->IsDead(room) && obstacle->Attackable()) { + if (!obstacle->IsDead(room) && + obstacle->Attackable() && + !obstacle->IsTerminatorAirDropBox(room)) { float dmg = meta->i->damage(); float def = 0; float finaly_dmg = dmg * (1 - def/MetaMgr::Instance()->K); diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index 51506e7..cb55fd7 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -36,6 +36,7 @@ class Obstacle : public Entity virtual bool IsDead(Room* room) override; virtual long long GetDeadFrameNo(Room* room) override; virtual void OnPreCollision(Room* room) override; + virtual bool IsTerminatorAirDropBox(Room* room) { return false; } void Explosion(Bullet* bullet); void SetDoorInfo(Building* building, int door_id_x); bool IsDoor(); diff --git a/server/gameserver/roomobstacle.h b/server/gameserver/roomobstacle.h index 44360e6..e4df4d3 100644 --- a/server/gameserver/roomobstacle.h +++ b/server/gameserver/roomobstacle.h @@ -13,6 +13,7 @@ class RoomObstacle : public Obstacle virtual ~RoomObstacle() override; virtual void Initialize() override; virtual void RecalcSelfCollider() override; + virtual bool IsTerminatorAirDropBox(Room* room) override { return is_terminator_airdrop_box; } protected: RoomObstacle();