diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 6d37788..9d75875 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -574,6 +574,14 @@ void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id) SendGameOver(); } } + if (room->GetAliveTeamNum() == 1) { + std::set* members = room->GetAliveTeam(); + if (members) { + for (Human* member : *members) { + member->SendGameOver(); + } + } + } } } diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 6f8d223..b13e9d3 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -699,13 +699,11 @@ void Player::LootInteraction(Loot* entity) if (item_meta->i->_inventory_slot() == 5 || item_meta->i->_inventory_slot() == 6) { Weapon* weapon = &weapons[3 + (item_meta->i->_inventory_slot() - 5)]; - if (weapon->weapon_id == 0) { - weapon->weapon_id = entity->item_id; - weapon->weapon_lv = 1; - weapon->ammo += entity->count; - weapon->meta = item_meta; - DecInventory(item_meta->i->_inventory_slot(), add_num); - } + weapon->weapon_id = entity->item_id; + weapon->weapon_lv = 1; + weapon->ammo += entity->count; + weapon->meta = item_meta; + DecInventory(item_meta->i->_inventory_slot(), add_num); } if (item_meta->i->_inventory_slot() > 12) { if (item_meta->i->_inventory_slot() - 12 > curr_scope_idx) { diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index acc3c9c..59f04d2 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -624,6 +624,32 @@ bool Room::BattleStarted() return battle_start_frameno_ != 0; } +int Room::GetAliveTeamNum() +{ + int num = 0; + for (auto& pair : team_hash_) { + for (Human* hum : pair.second) { + if (!hum->dead) { + ++num; + break; + } + } + } + return num; +} + +std::set* Room::GetAliveTeam() +{ + for (auto& pair : team_hash_) { + for (Human* hum : pair.second) { + if (!hum->dead) { + return &pair.second; + } + } + } + return nullptr; +} + int Room::NewTeam() { ++current_teamid; diff --git a/server/gameserver/room.h b/server/gameserver/room.h index cf7d499..8ce5505 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -85,6 +85,8 @@ public: bool OverBorder(const Vector2D pos, float radius); Human* GetWatchWarTarget(Human* hum); bool BattleStarted(); + int GetAliveTeamNum(); + std::set* GetAliveTeam(); private: unsigned short AllocUniid();