mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-20 17:27:36 +01:00
Core/Guilds: merged more guild achievement implementations and fixed counting dungeon challenges
This commit is contained in:
@@ -79,8 +79,6 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM:
|
||||
break;
|
||||
default:
|
||||
if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT)
|
||||
@@ -960,7 +958,7 @@ template<>
|
||||
void AchievementMgr<Guild>::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 + 1 + 1 + 4 + 4 + 4 + 4 + 4);
|
||||
WorldPacket data(SMSG_GUILD_CRITERIA_DATA, 3 + 1 + 1 + 8 + 8 + 4 + 4 + 4 + 4 + 4);
|
||||
|
||||
ObjectGuid counter(progress->counter); // for accessing every byte individually
|
||||
ObjectGuid guid = progress->CompletedGUID;
|
||||
@@ -1129,7 +1127,7 @@ template<> bool IsGuild<Guild>() { return true; }
|
||||
* this function will be called whenever the user might have done a criteria relevant action
|
||||
*/
|
||||
template<class T>
|
||||
void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 /*= 0*/, uint64 miscValue2 /*= 0*/, uint64 miscValue3 /*= 0*/, Unit const* unit /*= nullptr*/, Player* referencePlayer /*= nullptr*/)
|
||||
void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 /*= 0*/, uint64 miscValue2 /*= 0*/, uint64 miscValue3 /*= 0*/, Unit const* unit /*= nullptr*/, Player* referencePlayer /*= nullptr*/, GameObject* go /*= nullptr*/)
|
||||
{
|
||||
if (type >= ACHIEVEMENT_CRITERIA_TYPE_TOTAL)
|
||||
{
|
||||
@@ -1169,7 +1167,7 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!CanUpdateCriteria(achievementCriteria, achievement, miscValue1, miscValue2, miscValue3, unit, referencePlayer))
|
||||
if (!CanUpdateCriteria(achievementCriteria, achievement, miscValue1, miscValue2, miscValue3, unit, referencePlayer, go))
|
||||
continue;
|
||||
|
||||
// requirements not found in the dbc
|
||||
@@ -1203,8 +1201,6 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_DEATH:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
|
||||
@@ -1235,6 +1231,8 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
|
||||
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:
|
||||
SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE);
|
||||
break;
|
||||
// std case: increment at miscValue1
|
||||
@@ -1263,6 +1261,8 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CURRENCY:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CRAFT_ITEMS_GUILD:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ARCHAEOLOGY_PROJECTS:
|
||||
SetCriteriaProgress(achievementCriteria, miscValue2, referencePlayer, PROGRESS_ACCUMULATE);
|
||||
break;
|
||||
@@ -1355,7 +1355,7 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
|
||||
{
|
||||
int32 reputation = referencePlayer->GetReputation(achievementCriteria->gain_reputation.factionID);
|
||||
int32 reputation = referencePlayer->GetReputationMgr().GetReputation(achievementCriteria->gain_reputation.factionID);
|
||||
if (reputation > 0)
|
||||
SetCriteriaProgress(achievementCriteria, reputation, referencePlayer);
|
||||
break;
|
||||
@@ -1487,15 +1487,15 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL:
|
||||
SetCriteriaProgress(achievementCriteria, miscValue1, referencePlayer);
|
||||
break;
|
||||
// FIXME: not triggered in code as result, need to implement
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL:
|
||||
SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE);
|
||||
break;
|
||||
// FIXME: not triggered in code as result, need to implement
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_BATTLEGROUND:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_BG_RATING:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE:
|
||||
break; // Not implemented yet :(
|
||||
}
|
||||
|
||||
@@ -1560,6 +1560,8 @@ bool AchievementMgr<T>::IsCompletedCriteria(AchievementCriteriaEntry const* achi
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_TABARD:
|
||||
return progress->counter >= 1;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE:
|
||||
return progress->counter >= achievementCriteria->raw.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
|
||||
return progress->counter >= achievementCriteria->complete_quest_count.totalQuestCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY:
|
||||
@@ -1613,6 +1615,8 @@ bool AchievementMgr<T>::IsCompletedCriteria(AchievementCriteriaEntry const* achi
|
||||
return progress->counter >= achievementCriteria->buy_bank_slot.numberOfSlots;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
|
||||
return progress->counter >= achievementCriteria->gain_reputation.reputationAmount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE:
|
||||
return progress->counter >= achievementCriteria->guild_challenge.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION:
|
||||
return progress->counter >= achievementCriteria->gain_exalted_reputation.numberOfExaltedFactions;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP:
|
||||
@@ -1646,6 +1650,10 @@ bool AchievementMgr<T>::IsCompletedCriteria(AchievementCriteriaEntry const* achi
|
||||
return progress->counter >= achievementCriteria->learn_skillline_spell.spellCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL:
|
||||
return progress->counter >= achievementCriteria->win_duel.duelCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
|
||||
if (!achievementCriteria->loot_epic_item.count)
|
||||
return false;
|
||||
return progress->counter >= achievementCriteria->loot_epic_item.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
|
||||
return progress->counter >= achievementCriteria->loot_type.lootTypeCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
|
||||
@@ -1664,6 +1672,8 @@ bool AchievementMgr<T>::IsCompletedCriteria(AchievementCriteriaEntry const* achi
|
||||
return progress->counter >= achievementCriteria->currencyGain.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CRAFT_ITEMS_GUILD:
|
||||
return progress->counter >= achievementCriteria->raw.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL:
|
||||
return progress->counter >= achievementCriteria->catch_from_pool.catchCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA:
|
||||
return achievementCriteria->win_arena.count && progress->counter >= achievementCriteria->win_arena.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
|
||||
@@ -1693,7 +1703,6 @@ bool AchievementMgr<T>::IsCompletedCriteria(AchievementCriteriaEntry const* achi
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED:
|
||||
@@ -2272,7 +2281,7 @@ void AchievementMgr<Guild>::SendAchievementInfo(Player* receiver, uint32 achieve
|
||||
WorldPacket data(SMSG_GUILD_CRITERIA_DATA, 3);
|
||||
data.WriteBits(0, 21);
|
||||
data.FlushBits();
|
||||
receiver->SendDirectMessage(&data);
|
||||
receiver->GetSession()->SendPacket(&data);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2328,8 +2337,17 @@ void AchievementMgr<Guild>::SendAchievementInfo(Player* receiver, uint32 achieve
|
||||
data.WriteBit(guid[6]);
|
||||
data.WriteBit(counter[7]);
|
||||
data.WriteBit(guid[4]);
|
||||
}
|
||||
|
||||
data.FlushBits();
|
||||
for (AchievementCriteriaEntryList::const_iterator itr = criteria->begin(); itr != criteria->end(); ++itr)
|
||||
{
|
||||
uint32 criteriaId = (*itr)->ID;
|
||||
CriteriaProgressMap::const_iterator progress = m_criteriaProgress.find(criteriaId);
|
||||
if (progress == m_criteriaProgress.end())
|
||||
continue;
|
||||
|
||||
counter.Set(progress->second.counter);
|
||||
guid = progress->second.CompletedGUID;
|
||||
|
||||
data.WriteByteSeq(guid[5]);
|
||||
data << uint32(progress->second.date); // unknown date
|
||||
@@ -2378,7 +2396,7 @@ CompletedAchievementData* AchievementMgr<T>::GetCompletedDataForAchievement(uint
|
||||
}
|
||||
|
||||
template<class T>
|
||||
bool AchievementMgr<T>::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer)
|
||||
bool AchievementMgr<T>::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer, GameObject* go)
|
||||
{
|
||||
if (DisableMgr::IsDisabledFor(DISABLE_TYPE_ACHIEVEMENT_CRITERIA, criteria->ID, nullptr))
|
||||
{
|
||||
@@ -2409,7 +2427,7 @@ bool AchievementMgr<T>::CanUpdateCriteria(AchievementCriteriaEntry const* criter
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!RequirementsSatisfied(criteria, miscValue1, miscValue2, miscValue3, unit, referencePlayer))
|
||||
if (!RequirementsSatisfied(criteria, miscValue1, miscValue2, miscValue3, unit, referencePlayer, go))
|
||||
{
|
||||
TC_LOG_TRACE("achievement", "CanUpdateCriteria: %s (Id: %u Type %s) Requirements not satisfied",
|
||||
criteria->name, criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->type));
|
||||
@@ -2460,7 +2478,7 @@ bool AchievementMgr<T>::ConditionsSatisfied(AchievementCriteriaEntry const* crit
|
||||
}
|
||||
|
||||
template<class T>
|
||||
bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* achievementCriteria, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer) const
|
||||
bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* achievementCriteria, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer, GameObject* go) const
|
||||
{
|
||||
switch (AchievementCriteriaTypes(achievementCriteria->type))
|
||||
{
|
||||
@@ -2522,6 +2540,7 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE:
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
|
||||
if (m_completedAchievements.find(achievementCriteria->complete_achievement.linkedAchievement) == m_completedAchievements.end())
|
||||
@@ -2727,6 +2746,10 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->gain_reputation.factionID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->guild_challenge.flag)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
|
||||
// miscValue1 = itemid miscValue2 = itemSlot
|
||||
if (!miscValue1 || miscValue2 != achievementCriteria->equip_epic_item.itemSlot)
|
||||
@@ -2785,9 +2808,6 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
{
|
||||
if (!miscValue1)
|
||||
return false;
|
||||
ItemTemplate const* proto = sObjectMgr->GetItemTemplate(uint32(miscValue1));
|
||||
if (!proto || proto->Quality < ITEM_QUALITY_EPIC)
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
|
||||
@@ -2819,6 +2839,15 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
if (miscValue1 != achievementCriteria->win_arena.mapID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL:
|
||||
{
|
||||
if (!go || go->GetGoType() != GAMEOBJECT_TYPE_FISHINGHOLE)
|
||||
return false;
|
||||
ItemTemplate const* proto = sObjectMgr->GetItemTemplate(uint32(miscValue1));
|
||||
if (!proto || proto->Class == ITEM_CLASS_QUEST)
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -265,7 +265,7 @@ class TC_GAME_API AchievementMgr
|
||||
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult);
|
||||
void SaveToDB(SQLTransaction& trans);
|
||||
void ResetAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, bool evenIfCriteriaComplete = false);
|
||||
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, Unit const* unit = nullptr, Player* referencePlayer = nullptr);
|
||||
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, Unit const* unit = nullptr, Player* referencePlayer = nullptr, GameObject* go = nullptr);
|
||||
void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer);
|
||||
void CheckAllAchievementCriteria(Player* referencePlayer);
|
||||
void SendAllAchievementData(Player* receiver) const;
|
||||
@@ -289,11 +289,11 @@ class TC_GAME_API AchievementMgr
|
||||
void CompletedCriteriaFor(AchievementEntry const* achievement, Player* referencePlayer);
|
||||
bool IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement);
|
||||
bool IsCompletedAchievement(AchievementEntry const* entry);
|
||||
bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer);
|
||||
bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer, GameObject* go = nullptr);
|
||||
void SendPacket(WorldPacket* data) const;
|
||||
|
||||
bool ConditionsSatisfied(AchievementCriteriaEntry const* criteria, Player* referencePlayer) const;
|
||||
bool RequirementsSatisfied(AchievementCriteriaEntry const* criteria, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer) const;
|
||||
bool RequirementsSatisfied(AchievementCriteriaEntry const* criteria, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer, GameObject* go = nullptr) const;
|
||||
bool AdditionalRequirementsSatisfied(AchievementCriteriaEntry const* criteria, uint64 miscValue1, uint64 miscValue2, Unit const* unit, Player* referencePlayer) const;
|
||||
|
||||
T* _owner;
|
||||
|
||||
@@ -452,6 +452,13 @@ struct AchievementCriteriaEntry
|
||||
uint64 duelCount; // 4
|
||||
} win_duel;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM = 90
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint32 count; // 4
|
||||
} loot_epic_item;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96
|
||||
struct
|
||||
{
|
||||
@@ -567,6 +574,13 @@ struct AchievementCriteriaEntry
|
||||
uint32 count;
|
||||
} kill_creature_type_guild;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE = 138
|
||||
struct
|
||||
{
|
||||
uint32 flag; // 1: Guild Dungeon, 2:Guild raid, 3:Guild battleground
|
||||
uint32 count;
|
||||
} guild_challenge;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
|
||||
@@ -25911,7 +25911,7 @@ void Player::AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore cons
|
||||
}
|
||||
}
|
||||
|
||||
void Player::StoreLootItem(uint8 lootSlot, Loot* loot)
|
||||
void Player::StoreLootItem(uint8 lootSlot, Loot* loot, GameObject* go)
|
||||
{
|
||||
NotNormalLootItem* qitem = nullptr;
|
||||
NotNormalLootItem* ffaitem = nullptr;
|
||||
@@ -25993,6 +25993,7 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot)
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, item->itemid, item->count, loot->loot_type);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM, item->itemid, item->count);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL, item->itemid, item->count, 0, nullptr, go);
|
||||
|
||||
// LootItem is being removed (looted) from the container, delete it from the DB.
|
||||
if (loot->containerID > 0)
|
||||
@@ -26321,7 +26322,7 @@ void Player::ResetAchievementCriteria(AchievementCriteriaTypes type, uint64 misc
|
||||
m_achievementMgr->ResetAchievementCriteria(type, miscValue1, miscValue2, evenIfCriteriaComplete);
|
||||
}
|
||||
|
||||
void Player::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 /*= 0*/, uint64 miscValue2 /*= 0*/, uint64 miscValue3 /*= 0*/, Unit* unit /*= nullptr*/)
|
||||
void Player::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 /*= 0*/, uint64 miscValue2 /*= 0*/, uint64 miscValue3 /*= 0*/, Unit* unit /*= nullptr*/, GameObject* go /*= nullptr*/)
|
||||
{
|
||||
m_achievementMgr->UpdateAchievementCriteria(type, miscValue1, miscValue2, miscValue3, unit, this);
|
||||
Guild* guild = sGuildMgr->GetGuildById(GetGuildId());
|
||||
@@ -26333,7 +26334,7 @@ void Player::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 mis
|
||||
if (sAchievementMgr->IsGroupCriteriaType(type))
|
||||
return;
|
||||
|
||||
guild->UpdateAchievementCriteria(type, miscValue1, miscValue2, miscValue3, unit, this);
|
||||
guild->UpdateAchievementCriteria(type, miscValue1, miscValue2, miscValue3, unit, this, go);
|
||||
}
|
||||
|
||||
void Player::CompletedAchievement(AchievementEntry const* entry)
|
||||
|
||||
@@ -1218,7 +1218,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
|
||||
bool StoreNewItemInBestSlots(uint32 item_id, uint32 item_count);
|
||||
void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const& store, bool broadcast = false);
|
||||
void AutoStoreLoot(uint32 loot_id, LootStore const& store, bool broadcast = false) { AutoStoreLoot(NULL_BAG, NULL_SLOT, loot_id, store, broadcast); }
|
||||
void StoreLootItem(uint8 lootSlot, Loot* loot);
|
||||
void StoreLootItem(uint8 lootSlot, Loot* loot, GameObject* go = nullptr);
|
||||
|
||||
InventoryResult CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item* pItem, uint32* no_space_count = nullptr, uint32* itemLimitCategory = nullptr) const;
|
||||
InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 entry, uint32 count, Item* pItem = nullptr, bool swap = false, uint32* no_space_count = nullptr) const;
|
||||
@@ -2312,7 +2312,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
|
||||
bool HasAchieved(uint32 achievementId) const;
|
||||
void ResetAchievements();
|
||||
void ResetAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, bool evenIfCriteriaComplete = false);
|
||||
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, Unit* unit = nullptr);
|
||||
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, Unit* unit = nullptr, GameObject* go = nullptr);
|
||||
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0);
|
||||
void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry);
|
||||
void CompletedAchievement(AchievementEntry const* entry);
|
||||
|
||||
@@ -3876,8 +3876,8 @@ void Guild::CompleteChallenge(uint8 challengeType, Player* source)
|
||||
data << countNeeded;
|
||||
BroadcastPacket(&data);
|
||||
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE, challengeType, 0, 0, NULL, source);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE, 0, 0, 0, NULL, source);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE, challengeType, 0, 0, nullptr, source);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE, 0, 0, 0, nullptr, source);
|
||||
|
||||
// Give Reward now
|
||||
GiveXP(xp, source, true);
|
||||
@@ -4053,9 +4053,9 @@ bool Guild::HasAchieved(uint32 achievementId) const
|
||||
return m_achievementMgr->HasAchieved(achievementId);
|
||||
}
|
||||
|
||||
void Guild::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit* unit, Player* player)
|
||||
void Guild::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit* unit, Player* player, GameObject* go)
|
||||
{
|
||||
m_achievementMgr->UpdateAchievementCriteria(type, miscValue1, miscValue2, miscValue3, unit, player);
|
||||
m_achievementMgr->UpdateAchievementCriteria(type, miscValue1, miscValue2, miscValue3, unit, player, go);
|
||||
}
|
||||
|
||||
void Guild::HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky)
|
||||
|
||||
@@ -870,7 +870,7 @@ public:
|
||||
void ResetTimes(bool weekly);
|
||||
|
||||
bool HasAchieved(uint32 achievementId) const;
|
||||
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit* unit, Player* player);
|
||||
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit* unit, Player* player, GameObject* go = nullptr);
|
||||
|
||||
inline void SetAchievementPointsFor(ObjectGuid guid, uint32 achievementPoint)
|
||||
{
|
||||
|
||||
@@ -41,6 +41,7 @@ void WorldSession::HandleAutostoreLootItemOpcode(WorldPacket& recvData)
|
||||
ObjectGuid lguid = player->GetLootGUID();
|
||||
Loot* loot = nullptr;
|
||||
uint8 lootSlot = 0;
|
||||
GameObject* gameObject = nullptr;
|
||||
|
||||
recvData >> lootSlot;
|
||||
|
||||
@@ -55,6 +56,7 @@ void WorldSession::HandleAutostoreLootItemOpcode(WorldPacket& recvData)
|
||||
return;
|
||||
}
|
||||
|
||||
gameObject = go;
|
||||
loot = &go->loot;
|
||||
}
|
||||
else if (lguid.IsItem())
|
||||
@@ -94,7 +96,7 @@ void WorldSession::HandleAutostoreLootItemOpcode(WorldPacket& recvData)
|
||||
loot = &creature->loot;
|
||||
}
|
||||
|
||||
player->StoreLootItem(lootSlot, loot);
|
||||
player->StoreLootItem(lootSlot, loot, gameObject);
|
||||
|
||||
// If player is removing the last LootItem, delete the empty container.
|
||||
if (loot->isLooted() && lguid.IsItem())
|
||||
|
||||
Reference in New Issue
Block a user