diff options
| author | Shauren <shauren.trinity@gmail.com> | 2020-11-05 19:52:18 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2020-12-08 18:16:46 +0100 |
| commit | 83eecaf2c40cc72c1dc42335766534eb8d227e60 (patch) | |
| tree | 821f7997d1374ad09f28b392f58ab3db9e88978f /src/server/game/Entities | |
| parent | 78f77dbd4150a5eef5864f0189fda566107a83f0 (diff) | |
Core/PacketIO: Fill new packet fields with data
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 1 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 123 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 5 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 1 |
4 files changed, 94 insertions, 36 deletions
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 012cfa85be0..0fd96f36f82 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -226,6 +226,7 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID) opt.OptionCost = item.BoxMoney; // money required to open menu, 2.0.3 opt.Text = item.Message; // text for gossip item opt.Confirm = item.BoxMessage; // accept text (related to money) pop up box, 2.0.3 + opt.Status = GossipOptionStatus::Available; ++count; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fb0dad4eefd..1cba7b51c82 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15377,7 +15377,7 @@ void Player::AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver) } } -bool Player::CanRewardQuest(Quest const* quest, uint32 reward, bool msg) const +bool Player::CanRewardQuest(Quest const* quest, LootItemType rewardType, uint32 rewardId, bool msg) const { // prevent receive reward with quest items in bank or for not completed quest if (!CanRewardQuest(quest, msg)) @@ -15386,19 +15386,30 @@ bool Player::CanRewardQuest(Quest const* quest, uint32 reward, bool msg) const ItemPosCountVec dest; if (quest->GetRewChoiceItemsCount() > 0) { - for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i) + switch (rewardType) { - if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemId[i] == reward) + case LootItemType::Item: { - InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardChoiceItemId[i], quest->RewardChoiceItemCount[i]); - if (res != EQUIP_ERR_OK) + for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) { - if (msg) - SendQuestFailed(quest->GetQuestId(), res); + if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemType[i] == LootItemType::Item && quest->RewardChoiceItemId[i] == rewardId) + { + InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardChoiceItemId[i], quest->RewardChoiceItemCount[i]); + if (res != EQUIP_ERR_OK) + { + if (msg) + SendQuestFailed(quest->GetQuestId(), res); - return false; + return false; + } + } } + break; } + case LootItemType::Currency: + break; + default: + break; } } @@ -15428,7 +15439,7 @@ bool Player::CanRewardQuest(Quest const* quest, uint32 reward, bool msg) const { for (QuestPackageItemEntry const* questPackageItem : *questPackageItems) { - if (questPackageItem->ItemID != int32(reward)) + if (questPackageItem->ItemID != int32(rewardId)) continue; if (CanSelectQuestPackageItem(questPackageItem)) @@ -15450,7 +15461,7 @@ bool Player::CanRewardQuest(Quest const* quest, uint32 reward, bool msg) const { for (QuestPackageItemEntry const* questPackageItem : *questPackageItems) { - if (questPackageItem->ItemID != int32(reward)) + if (questPackageItem->ItemID != int32(rewardId)) continue; InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, questPackageItem->ItemID, questPackageItem->ItemQuantity); @@ -15581,7 +15592,7 @@ void Player::CompleteQuest(uint32 quest_id) if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id)) if (qInfo->HasFlag(QUEST_FLAGS_TRACKING)) - RewardQuest(qInfo, 0, this, false); + RewardQuest(qInfo, LootItemType::Item, 0, this, false); } if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER)) // check if Quest Tracker is enabled @@ -15699,7 +15710,7 @@ void Player::RewardQuestPackage(uint32 questPackageId, uint32 onlyItemId /*= 0*/ } } -void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, bool announce) +void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rewardId, Object* questGiver, bool announce) { //this THING should be here to protect code from quest, which cast on player far teleport as a reward //should work fine, cause far teleport will be executed in Player::Update() @@ -15754,26 +15765,44 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, } } - ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(reward); - if (rewardProto && quest->GetRewChoiceItemsCount()) + switch (rewardType) { - for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i) + case LootItemType::Item: { - if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemId[i] == reward) + ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(rewardId); + if (rewardProto && quest->GetRewChoiceItemsCount()) { - ItemPosCountVec dest; - if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, reward, quest->RewardChoiceItemCount[i]) == EQUIP_ERR_OK) + for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) { - Item* item = StoreNewItem(dest, reward, true, GenerateItemRandomBonusListId(reward)); - SendNewItem(item, quest->RewardChoiceItemCount[i], true, false); + if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemType[i] == LootItemType::Item && quest->RewardChoiceItemId[i] == rewardId) + { + ItemPosCountVec dest; + if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, rewardId, quest->RewardChoiceItemCount[i]) == EQUIP_ERR_OK) + { + Item* item = StoreNewItem(dest, rewardId, true, GenerateItemRandomBonusListId(rewardId)); + SendNewItem(item, quest->RewardChoiceItemCount[i], true, false); + } + } } } + + // QuestPackageItem.db2 + if (rewardProto && quest->GetQuestPackageID()) + RewardQuestPackage(quest->GetQuestPackageID(), rewardId); + break; } - } + case LootItemType::Currency: + { + if (sCurrencyTypesStore.HasRecord(rewardId) && quest->GetRewChoiceItemsCount()) + for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) + if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemType[i] == LootItemType::Currency && quest->RewardChoiceItemId[i] == rewardId) + ModifyCurrency(quest->RewardChoiceItemId[i], quest->RewardChoiceItemCount[i]); - // QuestPackageItem.db2 - if (rewardProto && quest->GetQuestPackageID()) - RewardQuestPackage(quest->GetQuestPackageID(), reward); + break; + } + default: + break; + } for (uint8 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i) if (quest->RewardCurrencyId[i]) @@ -15864,18 +15893,19 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, } else { - for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i) + for (QuestRewardDisplaySpell displaySpell : quest->RewardDisplaySpell) { - if (quest->RewardDisplaySpell[i] > 0) - { - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->RewardDisplaySpell[i], GetMap()->GetDifficultyID()); - Unit* caster = this; - if (questGiver && questGiver->isType(TYPEMASK_UNIT) && !quest->HasFlag(QUEST_FLAGS_PLAYER_CAST_ON_COMPLETE) && !spellInfo->HasTargetType(TARGET_UNIT_CASTER)) - if (Unit * unit = questGiver->ToUnit()) - caster = unit; + if (PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(displaySpell.PlayerConditionId)) + if (!ConditionMgr::IsPlayerMeetingCondition(this, playerCondition)) + continue; - caster->CastSpell(this, spellInfo, true); - } + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(displaySpell.SpellId, GetMap()->GetDifficultyID()); + Unit* caster = this; + if (questGiver && questGiver->isType(TYPEMASK_UNIT) && !quest->HasFlag(QUEST_FLAGS_PLAYER_CAST_ON_COMPLETE) && !spellInfo->HasTargetType(TARGET_UNIT_CASTER)) + if (Unit* unit = questGiver->ToUnit()) + caster = unit; + + caster->CastSpell(this, spellInfo, true); } } @@ -27986,12 +28016,14 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId) PlayerChoiceResponse const& playerChoiceResponseTemplate = playerChoice->Responses[i]; WorldPackets::Quest::PlayerChoiceResponse& playerChoiceResponse = displayPlayerChoice.Responses[i]; playerChoiceResponse.ResponseID = playerChoiceResponseTemplate.ResponseId; + playerChoiceResponse.ResponseIdentifier = playerChoiceResponseTemplate.ResponseIdentifier; playerChoiceResponse.ChoiceArtFileID = playerChoiceResponseTemplate.ChoiceArtFileId; playerChoiceResponse.Flags = playerChoiceResponseTemplate.Flags; playerChoiceResponse.WidgetSetID = playerChoiceResponseTemplate.WidgetSetID; playerChoiceResponse.UiTextureAtlasElementID = playerChoiceResponseTemplate.UiTextureAtlasElementID; playerChoiceResponse.SoundKitID = playerChoiceResponseTemplate.SoundKitID; playerChoiceResponse.GroupID = playerChoiceResponseTemplate.GroupID; + playerChoiceResponse.UiTextureKitID = playerChoiceResponseTemplate.UiTextureKitID; playerChoiceResponse.Answer = playerChoiceResponseTemplate.Answer; playerChoiceResponse.Header = playerChoiceResponseTemplate.Header; playerChoiceResponse.SubHeader = playerChoiceResponseTemplate.SubHeader; @@ -28048,9 +28080,32 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId) rewardEntry.Item.ItemID = faction.Id; rewardEntry.Quantity = faction.Quantity; } + for (PlayerChoiceResponseRewardItem const& item : playerChoiceResponseTemplate.Reward->ItemChoices) + { + playerChoiceResponse.Reward->ItemChoices.emplace_back(); + WorldPackets::Quest::PlayerChoiceResponseRewardEntry& rewardEntry = playerChoiceResponse.Reward->ItemChoices.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; + } + } } playerChoiceResponse.RewardQuestID = playerChoiceResponseTemplate.RewardQuestID; + + if (playerChoiceResponseTemplate.MawPower) + { + playerChoiceResponse.MawPower.emplace(); + WorldPackets::Quest::PlayerChoiceResponseMawPower& mawPower = playerChoiceResponse.MawPower.get(); + mawPower.TypeArtFileID = playerChoiceResponse.MawPower->TypeArtFileID; + mawPower.Rarity = playerChoiceResponse.MawPower->Rarity; + mawPower.RarityColor = playerChoiceResponse.MawPower->RarityColor; + mawPower.SpellID = playerChoiceResponse.MawPower->SpellID; + mawPower.MaxStacks = playerChoiceResponse.MawPower->MaxStacks; + } } SendDirectMessage(displayPlayerChoice.Write()); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 06e4a5f2c95..66cf959b9b5 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -93,6 +93,7 @@ enum GroupCategory : uint8; enum InventoryType : uint8; enum ItemClass : uint8; enum LootError : uint8; +enum class LootItemType : uint8; enum LootType : uint8; enum PlayerRestState : uint8; enum RestTypes : uint8; @@ -1346,7 +1347,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> bool CanCompleteQuest(uint32 quest_id); bool CanCompleteRepeatableQuest(Quest const* quest); bool CanRewardQuest(Quest const* quest, bool msg) const; - bool CanRewardQuest(Quest const* quest, uint32 reward, bool msg) const; + bool CanRewardQuest(Quest const* quest, LootItemType rewardType, uint32 rewardId, bool msg) const; void AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver); void AddQuest(Quest const* quest, Object* questGiver); void AbandonQuest(uint32 quest_id); @@ -1356,7 +1357,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> 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 RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rewardId, Object* questGiver, bool announce = true); void SetRewardedQuest(uint32 quest_id); void FailQuest(uint32 quest_id); bool SatisfyQuestSkill(Quest const* qInfo, bool msg) const; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f71064390d6..70d6bf72041 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -5206,6 +5206,7 @@ void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log) packet.CasterGUID = log->attacker->GetGUID(); packet.CastID = log->castId; packet.SpellID = log->Spell ? log->Spell->Id : 0; + packet.Visual.SpellXSpellVisualID = log->SpellXSpellVisualID; packet.Damage = log->damage; packet.OriginalDamage = log->originalDamage; if (log->damage > log->preHitHealth) |
