diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 26210d6..475bbb3 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -226,6 +226,7 @@ enum EquipType_e EQUIP_TYPE_CAR = 9, EQUIP_TYPE_SKIN = 10, EQUIP_TYPE_CAMOUFLAGE = 11, + EQUIP_TYPE_SPOILS = 12, EQUIP_TYPE_End }; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 803ed5e..96d1e5a 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -962,8 +962,17 @@ void Human::FillSMGameOver(cs::SMGameOver& msg) } } } - cs::MFPlayerStats* p = msg.add_player_stats(); - FillMFPlayerStats(p); + { + cs::MFPlayerStats* p = msg.add_player_stats(); + FillMFPlayerStats(p); + } + { + for (auto& pair : spoils_items) { + auto p = msg.add_spoils_items(); + p->add_values(pair.first); + p->add_values(pair.second); + } + } } void Human::BeKill(int killer_id, const std::string& killer_name, int weapon_id) @@ -2670,6 +2679,16 @@ void Human::ProcCamoutflage(Loot* entity, MetaData::Equip* item_meta) AddItem(item_meta->i->id(), 1); } +void Human::ProcSpoils(Loot* entity, MetaData::Equip* item_meta) +{ + if (spoils_items.find(item_meta->i->id()) != + spoils_items.end()) { + spoils_items[item_meta->i->id()] += entity->count; + } else { + spoils_items[item_meta->i->id()] = entity->count; + } +} + void Human::FindLocationWithTarget(Entity* target) { a8::Vec2 old_pos = GetPos(); diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 2799aac..b6b32d5 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -134,6 +134,7 @@ class Human : public MoveableEntity Weapon grow_weapon; std::map weapon_configs; std::map skin_configs; + std::map spoils_items; bool use_skill = false; size_t curr_skill_phase = 0; @@ -299,6 +300,7 @@ protected: void ProcLootSkin(Loot* entity, MetaData::Equip* item_meta); void ProcLootCar(Loot* entity, MetaData::Equip* item_meta); void ProcCamoutflage(Loot* entity, MetaData::Equip* item_meta); + void ProcSpoils(Loot* entity, MetaData::Equip* item_meta); void SelectSkillTargets(const a8::Vec2& target_pos, std::set& target_list); Buff* GetBuffById(int buff_id); void ProcSkillPhase(MetaData::SkillPhase* phase); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 95dff57..7f7763c 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -604,6 +604,11 @@ void Player::LootInteraction(Loot* entity) ProcCamoutflage(entity, item_meta); } break; + case EQUIP_TYPE_SPOILS: + { + ProcSpoils(entity, item_meta); + } + break; default: { if (item_meta->i->_inventory_slot() >= 0 && diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 2944ecd..845a2bb 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -968,6 +968,7 @@ message SMGameOver repeated MFPlayerStats player_stats = 6; //玩家信息统计 optional string room_uuid = 7; //房间唯一id repeated MFTeamData team_data = 10; //队伍数据 + repeated MFTuple spoils_items = 11; //战利品 0: 道具id 1:道具数量 } //离开