aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
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
parent78f77dbd4150a5eef5864f0189fda566107a83f0 (diff)
Core/PacketIO: Fill new packet fields with data
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp1
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp5
-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
-rw-r--r--src/server/game/Handlers/AuthHandler.cpp10
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp122
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h6
10 files changed, 189 insertions, 87 deletions
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
index e3d01e5d594..5b757d4292a 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
@@ -114,6 +114,7 @@ void AuctionsBucketData::BuildBucketInfo(WorldPackets::AuctionHouse::BucketInfo*
{
bucketInfo->Key = Key;
bucketInfo->MinPrice = MinPrice;
+ bucketInfo->RequiredLevel = RequiredLevel;
bucketInfo->TotalQuantity = 0;
for (AuctionPosting const* auction : Auctions)
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index 08320def248..de4ea7d41b2 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -28,6 +28,7 @@
#include "LFGQueue.h"
#include "LFGScripts.h"
#include "Log.h"
+#include "LootMgr.h"
#include "Map.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
@@ -1463,7 +1464,7 @@ void LFGMgr::FinishDungeon(ObjectGuid gguid, const uint32 dungeonId, Map const*
// if we can take the quest, means that we haven't done this kind of "run", IE: First Heroic Random of Day.
if (player->CanRewardQuest(quest, false))
- player->RewardQuest(quest, 0, nullptr, false);
+ player->RewardQuest(quest, LootItemType::Item, 0, nullptr, false);
else
{
done = true;
@@ -1471,7 +1472,7 @@ void LFGMgr::FinishDungeon(ObjectGuid gguid, const uint32 dungeonId, Map const*
if (!quest)
continue;
// we give reward without informing client (retail does this)
- player->RewardQuest(quest, 0, nullptr, false);
+ player->RewardQuest(quest, LootItemType::Item, 0, nullptr, false);
}
// Give rewards
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)
diff --git a/src/server/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp
index 20c3dc7235f..cd78c2afe4a 100644
--- a/src/server/game/Handlers/AuthHandler.cpp
+++ b/src/server/game/Handlers/AuthHandler.cpp
@@ -103,5 +103,15 @@ void WorldSession::SendFeatureSystemStatusGlueScreen()
features.MinimumExpansionLevel = EXPANSION_CLASSIC;
features.MaximumExpansionLevel = sWorld->getIntConfig(CONFIG_EXPANSION);
+ features.EuropaTicketSystemStatus.emplace();
+ features.EuropaTicketSystemStatus->ThrottleState.MaxTries = 10;
+ features.EuropaTicketSystemStatus->ThrottleState.PerMilliseconds = 60000;
+ features.EuropaTicketSystemStatus->ThrottleState.TryCount = 1;
+ features.EuropaTicketSystemStatus->ThrottleState.LastResetTimeBeforeNow = 111111;
+ features.EuropaTicketSystemStatus->TicketsEnabled = sWorld->getBoolConfig(CONFIG_SUPPORT_TICKETS_ENABLED);
+ features.EuropaTicketSystemStatus->BugsEnabled = sWorld->getBoolConfig(CONFIG_SUPPORT_BUGS_ENABLED);
+ features.EuropaTicketSystemStatus->ComplaintsEnabled = sWorld->getBoolConfig(CONFIG_SUPPORT_COMPLAINTS_ENABLED);
+ features.EuropaTicketSystemStatus->SuggestionsEnabled = sWorld->getBoolConfig(CONFIG_SUPPORT_SUGGESTIONS_ENABLED);
+
SendPacket(features.Write());
}
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 9590356f3dd..b888816666a 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -260,68 +260,100 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest
if (!quest)
return;
- // TODO: currency choice items
- if (packet.Choice.LootItemType != LootItemType::Item)
- return;
-
if (packet.Choice.Item.ItemID)
{
- ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(packet.Choice.Item.ItemID);
- if (!rewardProto)
- {
- TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get invalid reward item (Item Entry: %u) for quest %u (possible packet-hacking detected)",
- _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.Choice.Item.ItemID, packet.QuestID);
- return;
- }
-
- bool itemValid = false;
- for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i)
- {
- if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemId[i] == packet.Choice.Item.ItemID)
- {
- itemValid = true;
- break;
- }
- }
-
- if (!itemValid && quest->GetQuestPackageID())
+ switch (packet.Choice.LootItemType)
{
- if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItems(quest->GetQuestPackageID()))
+ case LootItemType::Item:
{
- for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
+ ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(packet.Choice.Item.ItemID);
+ if (!rewardProto)
{
- if (questPackageItem->ItemID != packet.Choice.Item.ItemID)
- continue;
+ TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get invalid reward item (Item Entry: %u) for quest %u (possible packet-hacking detected)",
+ _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.Choice.Item.ItemID, packet.QuestID);
+ return;
+ }
- if (_player->CanSelectQuestPackageItem(questPackageItem))
+ bool itemValid = false;
+ for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i)
+ {
+ if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemType[i] == LootItemType::Item && quest->RewardChoiceItemId[i] == packet.Choice.Item.ItemID)
{
itemValid = true;
break;
}
}
- }
- if (!itemValid)
- {
- if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItemsFallback(quest->GetQuestPackageID()))
+ if (!itemValid && quest->GetQuestPackageID())
{
- for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
+ if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItems(quest->GetQuestPackageID()))
{
- if (questPackageItem->ItemID != packet.Choice.Item.ItemID)
- continue;
+ for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
+ {
+ if (questPackageItem->ItemID != packet.Choice.Item.ItemID)
+ continue;
+
+ if (_player->CanSelectQuestPackageItem(questPackageItem))
+ {
+ itemValid = true;
+ break;
+ }
+ }
+ }
- itemValid = true;
- break;
+ if (!itemValid)
+ {
+ if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItemsFallback(quest->GetQuestPackageID()))
+ {
+ for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
+ {
+ if (questPackageItem->ItemID != packet.Choice.Item.ItemID)
+ continue;
+
+ itemValid = true;
+ break;
+ }
+ }
}
}
+
+ if (!itemValid)
+ {
+ TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get reward item (Item Entry: %u) wich is not a reward for quest %u (possible packet-hacking detected)",
+ _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.Choice.Item.ItemID, packet.QuestID);
+ return;
+ }
+ break;
}
- }
+ case LootItemType::Currency:
+ {
+ if (!sCurrencyTypesStore.HasRecord(packet.Choice.Item.ItemID))
+ {
+ TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get invalid reward currency (Currency ID: %u) for quest %u (possible packet-hacking detected)",
+ _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.Choice.Item.ItemID, packet.QuestID);
+ return;
+ }
- if (!itemValid)
- {
- TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get reward item (Item Entry: %u) wich is not a reward for quest %u (possible packet-hacking detected)",
- _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.Choice.Item.ItemID, packet.QuestID);
- return;
+ bool currencyValid = false;
+ for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i)
+ {
+ if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemType[i] == LootItemType::Currency && quest->RewardChoiceItemId[i] == packet.Choice.Item.ItemID)
+ {
+ currencyValid = true;
+ break;
+ }
+ }
+
+ if (!currencyValid)
+ {
+ TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get reward currency (Currency ID: %u) wich is not a reward for quest %u (possible packet-hacking detected)",
+ _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.Choice.Item.ItemID, packet.QuestID);
+ return;
+ }
+ break;
+ }
+ default:
+ break;
}
}
@@ -346,9 +378,9 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest
return;
}
- if (_player->CanRewardQuest(quest, packet.Choice.Item.ItemID, true))
+ if (_player->CanRewardQuest(quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID, true))
{
- _player->RewardQuest(quest, packet.Choice.Item.ItemID, object);
+ _player->RewardQuest(quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID, object);
switch (object->GetTypeId())
{
diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp
index 336a6918dbe..7628a7cbac3 100644
--- a/src/server/game/Movement/Spline/MoveSpline.cpp
+++ b/src/server/game/Movement/Spline/MoveSpline.cpp
@@ -54,7 +54,7 @@ Location MoveSpline::computePosition(int32 time_point, int32 point_index) const
}
else
{
- if (!splineflags.hasFlag(MoveSplineFlag::OrientationFixed | MoveSplineFlag::Falling | MoveSplineFlag::Unknown0x8))
+ if (!splineflags.hasFlag(MoveSplineFlag::OrientationFixed | MoveSplineFlag::Falling | MoveSplineFlag::Unknown_0x8))
{
Vector3 hermite;
spline.evaluate_derivative(point_Idx, u, hermite);
diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h
index 730d177e2b4..aca8c9f2097 100644
--- a/src/server/game/Spells/Auras/SpellAuras.h
+++ b/src/server/game/Spells/Auras/SpellAuras.h
@@ -58,8 +58,8 @@ class TC_GAME_API AuraApplication
Aura* const _base;
AuraRemoveMode _removeMode:8; // Store info for know remove aura reason
uint8 _slot; // Aura slot on unit
- uint8 _flags; // Aura info flag
- uint32 _effectsToApply; // Used only at spell hit to determine which effect should be applied
+ uint16 _flags; // Aura info flag
+ uint32 _effectsToApply; // Used only at spell hit to determine which effect should be applied
bool _needClientUpdate:1;
uint32 _effectMask;
@@ -74,7 +74,7 @@ class TC_GAME_API AuraApplication
Aura* GetBase() const { return _base; }
uint8 GetSlot() const { return _slot; }
- uint8 GetFlags() const { return _flags; }
+ uint16 GetFlags() const { return _flags; }
uint32 GetEffectMask() const { return _effectMask; }
bool HasEffect(uint8 effect) const { ASSERT(effect < MAX_SPELL_EFFECTS); return (_effectMask & (1 << effect)) != 0; }
bool IsPositive() const { return (_flags & AFLAG_POSITIVE) != 0; }