diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index beff87e..7839976 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -565,7 +565,9 @@ bool Human::IsCollisionInMapService() DropItems(obstacle); } obstacle->BroadcastFullState(room); - if (obstacle->IsTerminatorAirDropBox(room) && GetRace() == kHumanRace) { + if (obstacle->IsTerminatorAirDropBox(room) && + GetRace() == kHumanRace && + !HasBuffEffect(kBET_Terminator)) { MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(TERMINATOR_BUFF_ID); if (buff_meta) { AddBuff(this, buff_meta, 1); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index b3bb56f..9ea48f8 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -575,10 +575,24 @@ void Room::OnHumanDie(Human* hum) if (hum->GetRace() == kHumanRace) { RemoveRescue(hum); hum->DeadDrop(); + std::vector alive_humans; + alive_humans.reserve(GetRoomMaxPlayerNum()); for (auto& pair : human_hash_) { if (pair.second != hum) { pair.second->WinExp(hum, hum->meta->i->dead_exp()); } + if (!pair.second->dead && pair.second->GetRace() == kHumanRace) { + alive_humans.push_back(pair.second); + } + } + if (alive_humans.size() == 1) { + Human* terminator = alive_humans[0]; + if (!terminator->HasBuffEffect(kBET_Terminator)) { + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(TERMINATOR_BUFF_ID); + if (buff_meta) { + terminator->AddBuff(terminator, buff_meta, 1); + } + } } { Human* killer = GetPlayerByUniId(hum->stats.killer_id);