diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index e961b36..9547cb3 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -686,7 +686,132 @@ void Player::HumanInteraction(Human* hum) void Player::ProcPrepareItems(const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& prepare_items) { + for (int equip_id : prepare_items) { + MetaData::Equip* item_meta = MetaMgr::Instance()->GetEquip(equip_id); + if (item_meta) { + switch (item_meta->i->equip_type()) { + case 1: + { + //装备 + if (item_meta->i->equip_subtype() == 1) { + //近战 + if (default_weapon.weapon_id == weapons[0].weapon_id) { + weapons[0].weapon_idx = 0; + weapons[0].weapon_id = equip_id; + weapons[0].weapon_lv = std::max(1, GetWeaponConfigLv(weapons[0].weapon_id)); + weapons[0].ammo = 0; + weapons[0].meta = item_meta; + weapons[0].Recalc(); + } + } else { + Weapon* weapon = nullptr; + if (weapons[GUN_SLOT1].weapon_id == 0) { + weapon = &weapons[GUN_SLOT1]; + weapon->weapon_idx = GUN_SLOT1; + if (curr_weapon != &weapons[GUN_SLOT2]) { + curr_weapon = &weapons[GUN_SLOT1]; + } + } else if (weapons[GUN_SLOT2].weapon_id == 0) { + weapon = &weapons[GUN_SLOT2]; + weapon->weapon_idx = GUN_SLOT2; + if (curr_weapon != &weapons[GUN_SLOT1]) { + curr_weapon = &weapons[GUN_SLOT2]; + } + } + if (!weapon) { + weapon->weapon_id = equip_id; + weapon->weapon_lv = std::max(1, GetWeaponConfigLv(weapon->weapon_id)); + weapon->ammo = 0; + weapon->meta = item_meta; + weapon->Recalc(); + } + } + } + break; + default: + { + if (item_meta->i->_inventory_slot() >= 0 && + item_meta->i->_inventory_slot() < IS_END) { + if (GetInventory(item_meta->i->_inventory_slot()) >= + GetVolume(item_meta->i->_inventory_slot()) + ) { + break; + } + int add_num = GetVolume(item_meta->i->_inventory_slot()) - + GetInventory(item_meta->i->_inventory_slot()); + add_num = std::min(1, add_num); + AddInventory(item_meta->i->_inventory_slot(), add_num); + if (item_meta->i->_inventory_slot() == 5 || + item_meta->i->_inventory_slot() == 6) { + Weapon* weapon = &weapons[3 + (item_meta->i->_inventory_slot() - 5)]; + weapon->weapon_id = equip_id; + weapon->weapon_lv = 1; + weapon->ammo += 1; + weapon->meta = item_meta; + weapon->Recalc(); + 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) { + curr_scope_idx = item_meta->i->_inventory_slot() - 12; + } + } + } else { + switch (item_meta->i->equip_type()) { + case 7: + { + //背包 + MetaData::Equip* old_item_meta = MetaMgr::Instance()->GetEquip(backpack); + if (old_item_meta) { + if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { + break; + } + room->DropItem(pos, old_item_meta->i->id(), 1, 1); + } + backpack = item_meta->i->id(); + RecalcVolume(); + } + break; + case 4: + { + //防具 + if (item_meta->i->equip_subtype() == 1) { + //盔甲 + MetaData::Equip* old_item_meta = MetaMgr::Instance()->GetEquip(chest); + if (old_item_meta) { + if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { + break; + } + room->DropItem(pos, old_item_meta->i->id(), 1, 1); + } + chest = item_meta->i->id(); + RecalcAttr(); + } else if (item_meta->i->equip_subtype() == 2) { + //头盔 + MetaData::Equip* old_item_meta = MetaMgr::Instance()->GetEquip(helmet); + if (old_item_meta) { + if (old_item_meta->i->equip_lv() >= item_meta->i->equip_lv()) { + break; + } + room->DropItem(pos, old_item_meta->i->id(), 1, 1); + } + helmet = item_meta->i->id(); + RecalcAttr(); + } + } + break; + } + } + } + break; + } + } + }//end for + need_sync_active_player = true; + if (prepare_items.size() > 0) { + SyncAroundPlayers(); + } } void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg)