From af82b87bd7a998a0f757ca72e24de43fd19bb14e Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sat, 15 Dec 2018 22:07:50 +0100 Subject: [PATCH] Core/Guilds: merged some guild achievement implementations --- .../game/Achievements/AchievementMgr.cpp | 154 +++++++++++------- src/server/game/DataStores/DBCEnums.h | 4 +- .../game/Entities/Player/KillRewarder.cpp | 8 +- src/server/game/Entities/Player/Player.cpp | 5 + src/server/game/Guilds/Guild.cpp | 8 +- src/server/game/Handlers/GuildHandler.cpp | 3 + src/server/game/Handlers/MiscHandler.cpp | 2 +- 7 files changed, 121 insertions(+), 63 deletions(-) diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index f21e3f7770e..1a2866a50e0 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -875,7 +875,7 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievemen guild->BroadcastWorker(_localizer, GetOwner()); } - if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL | ACHIEVEMENT_FLAG_REALM_FIRST_REACH)) + if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL | ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_GUILD)) { // broadcast realm first reached WorldPacket data(SMSG_SERVER_FIRST_ACHIEVEMENT, GetOwner()->GetName().size() + 1 + 8 + 4 + 4); @@ -960,7 +960,7 @@ template<> void AchievementMgr::SendCriteriaUpdate(AchievementCriteriaEntry const* entry, CriteriaProgress const* progress, uint32 /*timeElapsed*/, bool /*timedCompleted*/) const { //will send response to criteria progress request - WorldPacket data(SMSG_GUILD_CRITERIA_DATA, 3 + 1 + 1 + 8 + 8 + 4 + 4 + 4 + 4 + 4); + WorldPacket data(SMSG_GUILD_CRITERIA_DATA, 3 + 1 + 1 + 1 + 1 + 4 + 4 + 4 + 4 + 4); ObjectGuid counter(progress->counter); // for accessing every byte individually ObjectGuid guid = progress->CompletedGUID; @@ -1233,12 +1233,15 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA: case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: // This also behaves like ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN: + case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD: + case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD: SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; // std case: increment at miscValue1 case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS: case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD: + case ACHIEVEMENT_CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL: @@ -1333,6 +1336,9 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, // miscValue1 is the ingame fallheight*100 as stored in dbc SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer); break; + case ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_BANK_SLOTS: + SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer); + break; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL: case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA: @@ -1340,6 +1346,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: + case ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_TABARD: SetCriteriaProgress(achievementCriteria, 1, referencePlayer); break; case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT: @@ -1408,6 +1415,12 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, else SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer, PROGRESS_ACCUMULATE); break; + case ACHIEVEMENT_CRITERIA_TYPE_EARN_GUILD_ACHIEVEMENT_POINTS: + SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer, PROGRESS_ACCUMULATE); + break; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD: + SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); + break; case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING: { uint32 reqTeamType = achievementCriteria->highest_team_rating.teamtype; @@ -1477,17 +1490,10 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID: case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA: case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK: - case ACHIEVEMENT_CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS: case ACHIEVEMENT_CRITERIA_TYPE_CRAFT_ITEMS_GUILD: case ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL: - case ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_BANK_SLOTS: - case ACHIEVEMENT_CRITERIA_TYPE_EARN_GUILD_ACHIEVEMENT_POINTS: case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_BATTLEGROUND: case ACHIEVEMENT_CRITERIA_TYPE_REACH_BG_RATING: - case ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_TABARD: - case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD: - case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD: - case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE: break; // Not implemented yet :( @@ -1527,7 +1533,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achi if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER) return false; - if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL)) + if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL | ACHIEVEMENT_FLAG_REALM_FIRST_GUILD)) { // someone on this realm has already completed that achievement if (sAchievementMgr->IsRealmCompleted(achievement, GetInstanceId(GetOwner()))) @@ -1552,6 +1558,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achi case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL: return progress->counter >= achievementCriteria->reach_skill_level.skillLevel; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: + case ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_TABARD: return progress->counter >= 1; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT: return progress->counter >= achievementCriteria->complete_quest_count.totalQuestCount; @@ -1582,7 +1589,10 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achi return progress->counter >= 1; case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL: case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL: + case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD: return progress->counter >= achievementCriteria->honorable_kill.killCount; + case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD: + return progress->counter >= achievementCriteria->raw.count; case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM: return progress->counter >= achievementCriteria->own_item.itemCount; case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: @@ -1597,6 +1607,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achi return progress->counter >= achievementCriteria->loot_item.itemCount; case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA: return progress->counter >= 1; + case ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_BANK_SLOTS: + return progress->counter >= achievementCriteria->raw.count; case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT: return progress->counter >= achievementCriteria->buy_bank_slot.numberOfSlots; case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION: @@ -1618,6 +1630,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achi return progress->counter >= achievementCriteria->do_emote.count; case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM: return progress->counter >= achievementCriteria->equip_item.count; + case ACHIEVEMENT_CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS: + return progress->counter >= achievementCriteria->guild_gold_repairs.goldInCopper; case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD: return progress->counter >= achievementCriteria->quest_reward_money.goldInCopper; case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY: @@ -1636,6 +1650,10 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achi return progress->counter >= achievementCriteria->loot_type.lootTypeCount; case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE: return progress->counter >= achievementCriteria->learn_skill_line.spellCount; + case ACHIEVEMENT_CRITERIA_TYPE_EARN_GUILD_ACHIEVEMENT_POINTS: + return progress->counter >= achievementCriteria->raw.count; + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD: + return progress->counter >= achievementCriteria->raw.count; case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS: return progress->counter >= 9000; case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS: @@ -2044,7 +2062,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achieve _achievementPoints += achievement->points; UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, 0, 0, 0, nullptr, referencePlayer); - UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->points, 0, 0, nullptr, referencePlayer); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_GUILD_ACHIEVEMENT_POINTS, achievement->points, 0, 0, nullptr, referencePlayer); } struct VisibleAchievementPred @@ -2271,7 +2289,16 @@ void AchievementMgr::SendAchievementInfo(Player* receiver, uint32 achieve ++numCriteria; } - criteriaBits.WriteBits(numCriteria, 21); + if (!numCriteria) + { + WorldPacket data(SMSG_GUILD_CRITERIA_DATA, 3); + data.WriteBits(0, 21); + receiver->GetSession()->SendPacket(&data); + return; + } + + WorldPacket data(SMSG_GUILD_CRITERIA_DATA, 3 + numCriteria * (1 + 1 + 1 + 1 + 4 + 4 + 4 + 4 + 4)); + data.WriteBits(numCriteria, 21); for (AchievementCriteriaEntryList::const_iterator itr = criteria->begin(); itr != criteria->end(); ++itr) { @@ -2283,51 +2310,48 @@ void AchievementMgr::SendAchievementInfo(Player* receiver, uint32 achieve counter.Set(progress->second.counter); guid = progress->second.CompletedGUID; - criteriaBits.WriteBit(counter[4]); - criteriaBits.WriteBit(counter[1]); - criteriaBits.WriteBit(guid[2]); - criteriaBits.WriteBit(counter[3]); - criteriaBits.WriteBit(guid[1]); - criteriaBits.WriteBit(counter[5]); - criteriaBits.WriteBit(counter[0]); - criteriaBits.WriteBit(guid[3]); - criteriaBits.WriteBit(counter[2]); - criteriaBits.WriteBit(guid[7]); - criteriaBits.WriteBit(guid[5]); - criteriaBits.WriteBit(guid[0]); - criteriaBits.WriteBit(counter[6]); - criteriaBits.WriteBit(guid[6]); - criteriaBits.WriteBit(counter[7]); - criteriaBits.WriteBit(guid[4]); + data.WriteBit(counter[4]); + data.WriteBit(counter[1]); + data.WriteBit(guid[2]); + data.WriteBit(counter[3]); + data.WriteBit(guid[1]); + data.WriteBit(counter[5]); + data.WriteBit(counter[0]); + data.WriteBit(guid[3]); + data.WriteBit(counter[2]); + data.WriteBit(guid[7]); + data.WriteBit(guid[5]); + data.WriteBit(guid[0]); + data.WriteBit(counter[6]); + data.WriteBit(guid[6]); + data.WriteBit(counter[7]); + data.WriteBit(guid[4]); - criteriaData.WriteByteSeq(guid[5]); - criteriaData << uint32(progress->second.date); // unknown date - criteriaData.WriteByteSeq(counter[3]); - criteriaData.WriteByteSeq(counter[7]); - criteriaData << uint32(progress->second.date); // unknown date - criteriaData.WriteByteSeq(counter[6]); - criteriaData.WriteByteSeq(guid[4]); - criteriaData.WriteByteSeq(guid[1]); - criteriaData.WriteByteSeq(counter[4]); - criteriaData.WriteByteSeq(guid[3]); - criteriaData.WriteByteSeq(counter[0]); - criteriaData.WriteByteSeq(guid[2]); - criteriaData.WriteByteSeq(counter[1]); - criteriaData.WriteByteSeq(guid[6]); - criteriaData << uint32(progress->second.date); // last update time (not packed!) - criteriaData << uint32(criteriaId); - criteriaData.WriteByteSeq(counter[5]); - criteriaData << uint32(0); - criteriaData.WriteByteSeq(guid[7]); - criteriaData.WriteByteSeq(counter[2]); - criteriaData.WriteByteSeq(guid[0]); + data.FlushBits(); + + data.WriteByteSeq(guid[5]); + data << uint32(progress->second.date); // unknown date + data.WriteByteSeq(counter[3]); + data.WriteByteSeq(counter[7]); + data << uint32(progress->second.date); // unknown date + data.WriteByteSeq(counter[6]); + data.WriteByteSeq(guid[4]); + data.WriteByteSeq(guid[1]); + data.WriteByteSeq(counter[4]); + data.WriteByteSeq(guid[3]); + data.WriteByteSeq(counter[0]); + data.WriteByteSeq(guid[2]); + data.WriteByteSeq(counter[1]); + data.WriteByteSeq(guid[6]); + data << uint32(progress->second.date); // last update time (not packed!) + data << uint32(criteriaId); + data.WriteByteSeq(counter[5]); + data << uint32(0); + data.WriteByteSeq(guid[7]); + data.WriteByteSeq(counter[2]); + data.WriteByteSeq(guid[0]); } - WorldPacket data(SMSG_GUILD_CRITERIA_DATA, criteriaBits.size() + criteriaData.size()); - data.append(criteriaBits); - if (numCriteria) - data.append(criteriaData); - receiver->SendDirectMessage(&data); } @@ -2473,6 +2497,9 @@ bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const* ac case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL: case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: + case ACHIEVEMENT_CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS: + case ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_BANK_SLOTS: + case ACHIEVEMENT_CRITERIA_TYPE_EARN_GUILD_ACHIEVEMENT_POINTS: if (!miscValue1) return false; break; @@ -2488,6 +2515,10 @@ bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const* ac case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING: case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS: case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL: + case ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_TABARD: + case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD: + case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD: + case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD: case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN: break; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: @@ -2912,10 +2943,23 @@ bool AchievementMgr::AdditionalRequirementsSatisfied(AchievementCriteriaEntry case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_ZONE: // 41 if (!unit || unit->GetZoneId() != reqValue) return false; + break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_HEALTH_PERCENT_BELOW: // 46 if (!unit || unit->GetHealthPct() >= reqValue) return false; break; + case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_REQUIRES_GUILD_GROUP: // 61 + { + Guild* guild = referencePlayer->GetGuild(); + Group* group = referencePlayer->GetGroup(); + if (!guild || !group || !group->IsGuildGroupFor(referencePlayer)) + return false; + break; + } + case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GUILD_REPUTATION: // 62 + if (referencePlayer->GetReputation(PLAYER_GUILD_REPUTATION) < reqValue) + return false; + break; case ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_PROJECT_RARITY: // 65 { if (!miscValue1) @@ -3347,7 +3391,7 @@ void AchievementGlobalMgr::LoadCompletedAchievements() continue; } - else if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL)) + else if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL | ACHIEVEMENT_FLAG_REALM_FIRST_GUILD)) m_allCompletedAchievements[achievementId] = uint32(0xFFFFFFFF); } while (result->NextRow()); diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index b0d940c205f..389ebb4208a 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -158,8 +158,8 @@ enum AchievementCriteriaAdditionalCondition ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MIN_ACHIEVEMENT_POINTS = 56, // NYI ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_REQUIRES_LFG_GROUP = 58, // NYI ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK60 = 60, - ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_REQUIRES_GUILD_GROUP = 61, // NYI - ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GUILD_REPUTATION = 62, // NYI + ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_REQUIRES_GUILD_GROUP = 61, + ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GUILD_REPUTATION = 62, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_RATED_BATTLEGROUND = 63, // NYI ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_PROJECT_RARITY = 65, ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_PROJECT_RACE = 66, diff --git a/src/server/game/Entities/Player/KillRewarder.cpp b/src/server/game/Entities/Player/KillRewarder.cpp index af8db3afe6d..27022e731be 100644 --- a/src/server/game/Entities/Player/KillRewarder.cpp +++ b/src/server/game/Entities/Player/KillRewarder.cpp @@ -312,9 +312,11 @@ void KillRewarder::Reward() if (InstanceScript* instance = _victim->GetInstanceScript()) instance->UpdateEncounterStateForKilledCreature(_victim->GetEntry(), _victim); - if (uint32 guildId = victim->GetMap()->GetOwnerGuildId()) - if (Guild* guild = sGuildMgr->GetGuildById(guildId)) - guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, victim->GetEntry(), 1, 0, victim, _killer); + if (Guild* guild = _killer->GetGuild()) + { + guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, victim->GetEntry(), 1, 0, victim, _killer); + guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD, 0, 0, 0, victim, _killer); + } } } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 2a4389af0bc..2319a9a7c20 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6930,6 +6930,8 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, victim->getRace()); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, GetAreaId()); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, 1, 0, 0, victim); + if (Guild* guild = GetGuild()) + guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD, 0, 0, 0, victim, this); } else { @@ -12139,6 +12141,8 @@ Item* Player::EquipItem(uint16 pos, Item* pItem, bool update) // only for full equip instead adding to stack UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry()); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot); + if (Guild* guild = GetGuild()) + guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, pItem->GetEntry(), 1, 0, nullptr, this); return pItem; } @@ -15386,6 +15390,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, uint32 guildRep = std::max(uint32(1), uint32(_xp / 450)); guild->GiveXP(uint32(_xp * sWorld->getRate(RATE_XP_QUEST) * sWorld->getRate(RATE_XP_QUEST_GUILD_MODIFIER)), this); guild->GiveReputation(guildRep, this); + guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD, 0, 0, 0, nullptr, this); } // Give player extra money if GetRewOrReqMoney > 0 and get ReqMoney if negative diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index ffb8951f650..e5750ce46b9 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1873,6 +1873,7 @@ void Guild::HandleBuyBankTab(WorldSession* session, uint8 tabId) _CreateNewBankTab(); _BroadcastEvent(GE_BANK_TAB_PURCHASED, ObjectGuid::Empty); + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_BANK_SLOTS, _GetPurchasedTabsSize(), 0, 0, nullptr, player); SendPermissions(session); /// Hack to force client to update permissions } @@ -2212,7 +2213,7 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool CharacterDatabase.CommitTransaction(trans); std::string aux = ByteArrayToHexStr(reinterpret_cast(&m_bankMoney), 8, true); - _BroadcastEvent(GE_BANK_MONEY_SET, ObjectGuid::Empty, aux.c_str()); + _BroadcastEvent(GE_BANK_MONEY_SET, player->GetGUID(), aux.c_str()); if (player->GetSession()->HasPermission(rbac::RBAC_PERM_LOG_GM_TRADE)) { @@ -2262,7 +2263,10 @@ bool Guild::HandleMemberWithdrawMoney(WorldSession* session, uint64 amount, bool CharacterDatabase.CommitTransaction(trans); std::string aux = ByteArrayToHexStr(reinterpret_cast(&m_bankMoney), 8, true); - _BroadcastEvent(GE_BANK_MONEY_SET, ObjectGuid::Empty, aux.c_str()); + _BroadcastEvent(GE_BANK_MONEY_SET, player->GetGUID(), aux.c_str()); + + if (repair) + UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS, amount, 0, 0, nullptr, player); return true; } diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index 81fd05448b9..6e257a63f23 100644 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -359,7 +359,10 @@ void WorldSession::HandleSaveGuildEmblemOpcode(WorldPacket& recvPacket) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); if (Guild* guild = GetPlayer()->GetGuild()) + { + guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_TABARD, 0, 0, 0, NULL, GetPlayer()); guild->HandleSetEmblem(this, emblemInfo); + } else Guild::SendSaveEmblemResult(this, ERR_GUILDEMBLEM_NOGUILD); // "You are not part of a guild!"; } diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index c9097271e96..67cc87f1b16 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1592,7 +1592,7 @@ void WorldSession::HandleGuildAchievementProgressQuery(WorldPacket& recvData) uint32 achievementId; recvData >> achievementId; - if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId())) + if (Guild* guild = _player->GetGuild()) guild->GetAchievementMgr().SendAchievementInfo(_player, achievementId); }