diff options
| author | Shauren <shauren.trinity@gmail.com> | 2017-12-31 18:37:09 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2017-12-31 23:22:55 +0100 |
| commit | 66621a85e970bf370e4e16c690e0401f4e168c1c (patch) | |
| tree | 07e146a35b688778dbb6f86106b2609d3207458d /src/server/game/Entities/Player | |
| parent | 89c91c271b94f34076be7256378610a2a45c9ed2 (diff) | |
Core/Quests: Implemented player choice rewards
Diffstat (limited to 'src/server/game/Entities/Player')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 176 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 3 |
2 files changed, 119 insertions, 60 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 1e084d87850..5c06fe68027 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15066,6 +15066,49 @@ bool Player::CanSelectQuestPackageItem(QuestPackageItemEntry const* questPackage return false; } +void Player::RewardQuestPackage(uint32 questPackageId, uint32 onlyItemId /*= 0*/) +{ + bool hasFilteredQuestPackageReward = false; + if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItems(questPackageId)) + { + for (QuestPackageItemEntry const* questPackageItem : *questPackageItems) + { + if (onlyItemId && questPackageItem->ItemID != onlyItemId) + continue; + + if (CanSelectQuestPackageItem(questPackageItem)) + { + hasFilteredQuestPackageReward = true; + ItemPosCountVec dest; + if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, questPackageItem->ItemID, questPackageItem->ItemCount) == EQUIP_ERR_OK) + { + Item* item = StoreNewItem(dest, questPackageItem->ItemID, true, GenerateItemRandomPropertyId(questPackageItem->ItemID)); + SendNewItem(item, questPackageItem->ItemCount, true, false); + } + } + } + } + + if (!hasFilteredQuestPackageReward) + { + if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItemsFallback(questPackageId)) + { + for (QuestPackageItemEntry const* questPackageItem : *questPackageItems) + { + if (onlyItemId && questPackageItem->ItemID != onlyItemId) + continue; + + ItemPosCountVec dest; + if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, questPackageItem->ItemID, questPackageItem->ItemCount) == EQUIP_ERR_OK) + { + Item* item = StoreNewItem(dest, questPackageItem->ItemID, true, GenerateItemRandomPropertyId(questPackageItem->ItemID)); + SendNewItem(item, questPackageItem->ItemCount, true, false); + } + } + } + } +} + void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, bool announce) { //this THING should be here to protect code from quest, which cast on player far teleport as a reward @@ -15122,47 +15165,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, // QuestPackageItem.db2 if (rewardProto && quest->GetQuestPackageID()) - { - bool hasFilteredQuestPackageReward = false; - if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItems(quest->GetQuestPackageID())) - { - for (QuestPackageItemEntry const* questPackageItem : *questPackageItems) - { - if (questPackageItem->ItemID != reward) - continue; - - if (CanSelectQuestPackageItem(questPackageItem)) - { - hasFilteredQuestPackageReward = true; - ItemPosCountVec dest; - if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, questPackageItem->ItemID, questPackageItem->ItemCount) == EQUIP_ERR_OK) - { - Item* item = StoreNewItem(dest, questPackageItem->ItemID, true, GenerateItemRandomPropertyId(questPackageItem->ItemID)); - SendNewItem(item, questPackageItem->ItemCount, true, false); - } - } - } - } - - if (!hasFilteredQuestPackageReward) - { - if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItemsFallback(quest->GetQuestPackageID())) - { - for (QuestPackageItemEntry const* questPackageItem : *questPackageItems) - { - if (questPackageItem->ItemID != reward) - continue; - - ItemPosCountVec dest; - if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, questPackageItem->ItemID, questPackageItem->ItemCount) == EQUIP_ERR_OK) - { - Item* item = StoreNewItem(dest, questPackageItem->ItemID, true, GenerateItemRandomPropertyId(questPackageItem->ItemID)); - SendNewItem(item, questPackageItem->ItemCount, true, false); - } - } - } - } - } + RewardQuestPackage(quest->GetQuestPackageID(), reward); if (quest->GetRewItemsCount() > 0) { @@ -27121,35 +27124,90 @@ void Player::SendMovementSetCollisionHeight(float height) SendMessageToSet(updateCollisionHeight.Write(), false); } -void Player::SendPlayerChoice(ObjectGuid sender, uint32 choiceID) +void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId) { - PlayerChoice const* playerChoice = sObjectMgr->GetPlayerChoice(choiceID); + PlayerChoice const* playerChoice = sObjectMgr->GetPlayerChoice(choiceId); if (!playerChoice) return; - PlayerChoice localizedPlayerChoice = *playerChoice; - LocaleConstant locale = GetSession()->GetSessionDbLocaleIndex(); - if (locale != DEFAULT_LOCALE) - { - if (PlayerChoiceLocale const* playerChoiceLocale = sObjectMgr->GetPlayerChoiceLocale(localizedPlayerChoice.ChoiceId)) - sObjectMgr->GetLocaleString(playerChoiceLocale->Question, locale, localizedPlayerChoice.Question); + PlayerChoiceLocale const* playerChoiceLocale = locale != DEFAULT_LOCALE ? sObjectMgr->GetPlayerChoiceLocale(choiceId) : nullptr; - for (auto& playerChoiceResponse : localizedPlayerChoice.Responses) - { - if (PlayerChoiceResponseLocale const* playerChoiceResponseLocale = sObjectMgr->GetPlayerChoiceResponseLocale(localizedPlayerChoice.ChoiceId, playerChoiceResponse.second.ResponseID)) + PlayerTalkClass->GetInteractionData().Reset(); + PlayerTalkClass->GetInteractionData().SourceGuid = sender; + PlayerTalkClass->GetInteractionData().PlayerChoiceId = uint32(choiceId); + + WorldPackets::Quest::DisplayPlayerChoice displayPlayerChoice; + displayPlayerChoice.SenderGUID = sender; + displayPlayerChoice.ChoiceID = choiceId; + displayPlayerChoice.Question = playerChoice->Question; + if (playerChoiceLocale) + ObjectMgr::GetLocaleString(playerChoiceLocale->Question, locale, displayPlayerChoice.Question); + + displayPlayerChoice.Responses.resize(playerChoice->Responses.size()); + displayPlayerChoice.CloseChoiceFrame = false; + + for (std::size_t i = 0; i < playerChoice->Responses.size(); ++i) + { + PlayerChoiceResponse const& playerChoiceResponseTemplate = playerChoice->Responses[i]; + WorldPackets::Quest::PlayerChoiceResponse& playerChoiceResponse = displayPlayerChoice.Responses[i]; + playerChoiceResponse.ResponseID = playerChoiceResponseTemplate.ResponseId; + playerChoiceResponse.ChoiceArtFileID = playerChoiceResponseTemplate.ChoiceArtFileId; + playerChoiceResponse.Answer = playerChoiceResponseTemplate.Answer; + playerChoiceResponse.Header = playerChoiceResponseTemplate.Header; + playerChoiceResponse.Description = playerChoiceResponseTemplate.Description; + playerChoiceResponse.Confirmation = playerChoiceResponseTemplate.Confirmation; + if (playerChoiceLocale) + { + if (PlayerChoiceResponseLocale const* playerChoiceResponseLocale = Trinity::Containers::MapGetValuePtr(playerChoiceLocale->Responses, playerChoiceResponseTemplate.ResponseId)) + { + ObjectMgr::GetLocaleString(playerChoiceResponseLocale->Answer, locale, playerChoiceResponse.Answer); + ObjectMgr::GetLocaleString(playerChoiceResponseLocale->Header, locale, playerChoiceResponse.Header); + ObjectMgr::GetLocaleString(playerChoiceResponseLocale->Description, locale, playerChoiceResponse.Description); + ObjectMgr::GetLocaleString(playerChoiceResponseLocale->Confirmation, locale, playerChoiceResponse.Confirmation); + } + } + + if (playerChoiceResponseTemplate.Reward) + { + playerChoiceResponse.Reward = boost::in_place(); + playerChoiceResponse.Reward->TitleID = playerChoiceResponseTemplate.Reward->TitleId; + playerChoiceResponse.Reward->PackageID = playerChoiceResponseTemplate.Reward->PackageId; + playerChoiceResponse.Reward->SkillLineID = playerChoiceResponseTemplate.Reward->SkillLineId; + playerChoiceResponse.Reward->SkillPointCount = playerChoiceResponseTemplate.Reward->SkillPointCount; + playerChoiceResponse.Reward->ArenaPointCount = playerChoiceResponseTemplate.Reward->ArenaPointCount; + playerChoiceResponse.Reward->HonorPointCount = playerChoiceResponseTemplate.Reward->HonorPointCount; + playerChoiceResponse.Reward->Money = playerChoiceResponseTemplate.Reward->Money; + playerChoiceResponse.Reward->Xp = playerChoiceResponseTemplate.Reward->Xp; + for (PlayerChoiceResponseRewardItem const& item : playerChoiceResponseTemplate.Reward->Items) + { + playerChoiceResponse.Reward->Items.emplace_back(); + WorldPackets::Quest::PlayerChoiceResponseRewardEntry& rewardEntry = playerChoiceResponse.Reward->Items.back(); + rewardEntry.Item.ItemID = item.Id; + rewardEntry.Quantity = item.Quantity; + if (!item.BonusListIDs.empty()) + { + rewardEntry.Item.ItemBonus = boost::in_place(); + rewardEntry.Item.ItemBonus->BonusListIDs = item.BonusListIDs; + } + } + for (PlayerChoiceResponseRewardEntry const& currency : playerChoiceResponseTemplate.Reward->Currency) { - sObjectMgr->GetLocaleString(playerChoiceResponseLocale->Header, locale, playerChoiceResponse.second.Header); - sObjectMgr->GetLocaleString(playerChoiceResponseLocale->Answer, locale, playerChoiceResponse.second.Answer); - sObjectMgr->GetLocaleString(playerChoiceResponseLocale->Description, locale, playerChoiceResponse.second.Description); - sObjectMgr->GetLocaleString(playerChoiceResponseLocale->Confirmation, locale, playerChoiceResponse.second.Confirmation); + playerChoiceResponse.Reward->Items.emplace_back(); + WorldPackets::Quest::PlayerChoiceResponseRewardEntry& rewardEntry = playerChoiceResponse.Reward->Items.back(); + rewardEntry.Item.ItemID = currency.Id; + rewardEntry.Quantity = currency.Quantity; + } + for (PlayerChoiceResponseRewardEntry const& faction : playerChoiceResponseTemplate.Reward->Faction) + { + playerChoiceResponse.Reward->Items.emplace_back(); + WorldPackets::Quest::PlayerChoiceResponseRewardEntry& rewardEntry = playerChoiceResponse.Reward->Items.back(); + rewardEntry.Item.ItemID = faction.Id; + rewardEntry.Quantity = faction.Quantity; } } } - WorldPackets::Quest::DisplayPlayerChoice displayPlayerChoice; - displayPlayerChoice.Choice = &localizedPlayerChoice; - displayPlayerChoice.SenderGUID = sender; SendDirectMessage(displayPlayerChoice.Write()); } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 1391ad7e532..5af181dd5a5 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1358,6 +1358,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> uint32 GetQuestMoneyReward(Quest const* quest) const; uint32 GetQuestXPReward(Quest const* quest); bool CanSelectQuestPackageItem(QuestPackageItemEntry const* questPackageItem) const; + void RewardQuestPackage(uint32 questPackageId, uint32 onlyItemId = 0); void RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, bool announce = true); void SetRewardedQuest(uint32 quest_id); void FailQuest(uint32 quest_id); @@ -2338,7 +2339,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> SceneMgr& GetSceneMgr() { return m_sceneMgr; } RestMgr& GetRestMgr() const { return *_restMgr; } - void SendPlayerChoice(ObjectGuid sender, uint32 choiceID); + void SendPlayerChoice(ObjectGuid sender, int32 choiceId); protected: // Gamemaster whisper whitelist |
