aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-11-05 19:52:18 +0100
committerShauren <shauren.trinity@gmail.com>2020-12-08 18:16:46 +0100
commit83eecaf2c40cc72c1dc42335766534eb8d227e60 (patch)
tree821f7997d1374ad09f28b392f58ab3db9e88978f /src/server/game/Entities
parent78f77dbd4150a5eef5864f0189fda566107a83f0 (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.cpp1
-rw-r--r--src/server/game/Entities/Player/Player.cpp123
-rw-r--r--src/server/game/Entities/Player/Player.h5
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp1
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)