void GuildAchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult) { if (achievementResult) { do { Field* fields = achievementResult->Fetch(); uint32 achievementid = fields[0].GetUInt32(); // must not happen: cleanup at server startup in sAchievementMgr->LoadCompletedAchievements() AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementid); if (!achievement) continue; CompletedAchievementData& ca = _completedAchievements[achievementid]; ca.Date = time_t(fields[1].GetUInt32()); Tokenizer guids(fields[2].GetString(), ' '); for (uint32 i = 0; i < guids.size(); ++i) ca.CompletingPlayers.insert(ObjectGuid::Create<HighGuid::Player>(uint64(strtoull(guids[i], nullptr, 10)))); ca.Changed = false; _achievementPoints += achievement->Points; } while (achievementResult->NextRow()); } if (criteriaResult) { time_t now = time(NULL); do { Field* fields = criteriaResult->Fetch(); uint32 id = fields[0].GetUInt32(); uint64 counter = fields[1].GetUInt64(); time_t date = time_t(fields[2].GetUInt32()); ObjectGuid::LowType guid = fields[3].GetUInt64(); Criteria const* criteria = sCriteriaMgr->GetCriteria(id); if (!criteria) { // we will remove not existed criteria for all guilds TC_LOG_ERROR("criteria.achievement", "Non-existing achievement criteria %u data removed from table `guild_achievement_progress`.", id); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA_GUILD); stmt->setUInt32(0, id); CharacterDatabase.Execute(stmt); continue; } if (criteria->Entry->StartTimer && time_t(date + criteria->Entry->StartTimer) < now) continue; CriteriaProgress& progress = _criteriaProgress[id]; progress.Counter = counter; progress.Date = date; progress.PlayerGUID = ObjectGuid::Create<HighGuid::Player>(guid); progress.Changed = false; } while (criteriaResult->NextRow()); } }
/** Given a list of guids returns the concatenation using | as delimiter @param[in] check list of guids @returns Concatenated string */ std::string ConcatenateGuids(LfgGuidList const& check) { if (check.empty()) return ""; // need the guids in order to avoid duplicates LfgGuidSet guids(check.begin(), check.end()); std::ostringstream o; LfgGuidSet::const_iterator it = guids.begin(); o << (*it); for (++it; it != guids.end(); ++it) o << '|' << (*it); return o.str(); }
void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recvData) { ObjectGuid target_playerguid = 0; target_playerguid[6] = recvData.ReadBit(); target_playerguid[2] = recvData.ReadBit(); target_playerguid[1] = recvData.ReadBit(); target_playerguid[3] = recvData.ReadBit(); target_playerguid[7] = recvData.ReadBit(); target_playerguid[5] = recvData.ReadBit(); uint32 count = recvData.ReadBits(25); if (count > 40) return; std::vector<ObjectGuid> guids(count); std::vector<uint8> types(count); uint8 bitOrder[8] = {4, 6, 7, 5, 0, 1, 3, 2}; for (uint32 i = 0; i < count; ++i) recvData.ReadBitInOrder(guids[i], bitOrder); target_playerguid[4] = recvData.ReadBit(); target_playerguid[0] = recvData.ReadBit(); recvData.FlushBits(); uint8 byteOrder[8] = {6, 7, 3, 1, 0, 5, 4, 2}; for (uint32 i = 0; i < count; ++i) { recvData.ReadBytesSeq(guids[i], byteOrder); recvData >> types[i]; } uint8 byteOrder2[8] = {7, 0, 5, 6, 4, 3, 2, 1}; recvData.ReadBytesSeq(target_playerguid, byteOrder2); //recvData >> lootguid >> slotid >> target_playerguid; if (!_player->GetGroup() || _player->GetGroup()->GetLooterGuid() != _player->GetGUID()) { _player->SendLootRelease(GetPlayer()->GetLootGUID()); return; } Player* target = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(target_playerguid, 0, HIGHGUID_PLAYER)); if (!target) return; sLog->outDebug(LOG_FILTER_NETWORKIO, "WorldSession::HandleLootMasterGiveOpcode (CMSG_LOOT_MASTER_GIVE, 0x02A3) Target = [%s].", target->GetName()); for (uint32 i = 0; i < count; ++i) { ObjectGuid lootguid = guids[i]; uint8 slotid = types[i]; Loot* loot = NULL; if (IS_CRE_OR_VEH_GUID(GetPlayer()->GetLootGUID())) { Creature* creature = GetPlayer()->GetMap()->GetCreature(lootguid); if (!creature) return; loot = &creature->loot; } else if (IS_GAMEOBJECT_GUID(GetPlayer()->GetLootGUID())) { GameObject* pGO = GetPlayer()->GetMap()->GetGameObject(lootguid); if (!pGO) return; loot = &pGO->loot; } if (!loot) return; if (slotid >= loot->items.size() + loot->quest_items.size()) { sLog->outDebug(LOG_FILTER_LOOT, "MasterLootItem: Player %s might be using a hack! (slot %d, size %lu)", GetPlayer()->GetName(), slotid, (unsigned long)loot->items.size()); return; } LootItem& item = slotid >= loot->items.size() ? loot->quest_items[slotid - loot->items.size()] : loot->items[slotid]; ItemPosCountVec dest; InventoryResult msg = target->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item.itemid, item.count); if (item.follow_loot_rules && !item.AllowedForPlayer(target)) msg = EQUIP_ERR_CANT_EQUIP_EVER; if (msg != EQUIP_ERR_OK) { target->SendEquipError(msg, NULL, NULL, item.itemid); // send duplicate of error massage to master looter _player->SendEquipError(msg, NULL, NULL, item.itemid); return; } // list of players allowed to receive this item in trade AllowedLooterSet looters = item.GetAllowedLooters(); // not move item from loot to target inventory Item* newitem = target->StoreNewItem(dest, item.itemid, true, item.randomPropertyId, looters); target->SendNewItem(newitem, uint32(item.count), false, false, true); target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item.itemid, item.count); target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, loot->loot_type, item.count); target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM, item.itemid, item.count); // mark as looted item.count=0; item.is_looted=true; loot->NotifyItemRemoved(slotid, _player->GetLootGUID()); --loot->unlootedCount; } }