void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recv_data) { uint8 itemSlot; // slot sent in LOOT_RESPONSE ObjectGuid lootguid; // the guid of the loot object owner ObjectGuid targetGuid; // the item receiver guid recv_data >> lootguid >> itemSlot >> targetGuid; Player* target = ObjectAccessor::FindPlayer(targetGuid); if (!target) { sLog.outError("WorldSession::HandleLootMasterGiveOpcode> Cannot retrieve target %s", targetGuid.GetString().c_str()); return; } DEBUG_LOG("WorldSession::HandleLootMasterGiveOpcode> Giver = %s, Target = %s.", _player->GetGuidStr().c_str(), targetGuid.GetString().c_str()); Loot* pLoot = sLootMgr.GetLoot(_player, lootguid); if (!pLoot) { sLog.outError("WorldSession::HandleLootMasterGiveOpcode> Cannot retrieve loot for player %s", _player->GetGuidStr().c_str()); return; } if (_player->GetObjectGuid() != pLoot->GetMasterLootGuid()) { sLog.outError("WorldSession::HandleLootMasterGiveOpcode> player %s is not the loot master!", _player->GetGuidStr().c_str()); return; } LootItem* lootItem = pLoot->GetLootItemInSlot(itemSlot); if (!lootItem) { _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr); return; } // item may be already looted or another cheating possibility if (lootItem->GetSlotTypeForSharedLoot(_player, pLoot) == MAX_LOOT_SLOT_TYPE) { sLog.outError("HandleAutostoreLootItemOpcode> %s have no right to loot itemId(%u)", _player->GetGuidStr().c_str(), lootItem->itemId); return; } InventoryResult result = pLoot->SendItem(target, lootItem); if (result != EQUIP_ERR_OK) { // send duplicate of error massage to master looter if (LootItem* lootItem = pLoot->GetLootItemInSlot(itemSlot)) _player->SendEquipError(result, nullptr, nullptr, lootItem->itemId); else _player->SendEquipError(result, nullptr, nullptr); return; } }
void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recv_data) { uint8 itemSlot; // slot sent in LOOT_RESPONSE ObjectGuid lootguid; // the guid of the loot object owner ObjectGuid targetGuid; // the item receiver guid recv_data >> lootguid >> itemSlot >> targetGuid; Player* target = ObjectAccessor::FindPlayer(targetGuid); if (!target) { _player->SendLootError(lootguid, LOOT_ERROR_PLAYER_NOT_FOUND); sLog.outError("WorldSession::HandleLootMasterGiveOpcode> Cannot retrieve target %s", targetGuid.GetString().c_str()); return; } DEBUG_LOG("WorldSession::HandleLootMasterGiveOpcode> Giver = %s, Target = %s.", _player->GetGuidStr().c_str(), targetGuid.GetString().c_str()); Loot* pLoot = sLootMgr.GetLoot(_player, lootguid); if (!pLoot) { sLog.outError("WorldSession::HandleLootMasterGiveOpcode> Cannot retrieve loot for player %s", _player->GetGuidStr().c_str()); return; } if (_player->GetObjectGuid() != pLoot->GetMasterLootGuid()) { _player->SendLootError(lootguid, LOOT_ERROR_DIDNT_KILL); sLog.outError("WorldSession::HandleLootMasterGiveOpcode> player %s is not the loot master!", _player->GetGuidStr().c_str()); return; } if (!_player->IsInGroup(target) || !_player->IsInMap(target)) { _player->SendLootError(lootguid, LOOT_ERROR_MASTER_OTHER); sLog.outError("WorldSession::HandleLootMasterGiveOpcode> Player %s tried to give an item to ineligible player %s !", _player->GetGuidStr().c_str(), target->GetGuidStr().c_str()); return; } LootItem* lootItem = pLoot->GetLootItemInSlot(itemSlot); if (!lootItem) { _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr); return; } // item may be already looted or another cheating possibility if (lootItem->GetSlotTypeForSharedLoot(_player, pLoot) == MAX_LOOT_SLOT_TYPE) { sLog.outError("HandleAutostoreLootItemOpcode> %s have no right to loot itemId(%u)", _player->GetGuidStr().c_str(), lootItem->itemId); return; } if (!lootItem->IsAllowed(target, pLoot)) { _player->SendEquipError(EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM, nullptr, nullptr); return; } InventoryResult result = pLoot->SendItem(target, lootItem); if (result != EQUIP_ERR_OK) { if (result == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS) _player->SendLootError(lootguid, LOOT_ERROR_MASTER_UNIQUE_ITEM); else if (result == EQUIP_ERR_INVENTORY_FULL) _player->SendLootError(lootguid, LOOT_ERROR_MASTER_INV_FULL); else _player->SendLootError(lootguid, LOOT_ERROR_MASTER_OTHER); } }