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();