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 | |
parent | 78f77dbd4150a5eef5864f0189fda566107a83f0 (diff) |
Core/PacketIO: Fill new packet fields with data
-rw-r--r-- | src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 1 | ||||
-rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.cpp | 5 | ||||
-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 | ||||
-rw-r--r-- | src/server/game/Handlers/AuthHandler.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 122 | ||||
-rw-r--r-- | src/server/game/Movement/Spline/MoveSpline.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.h | 6 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_quest.cpp | 3 |
11 files changed, 191 insertions, 88 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; } diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index 18840234b31..fa6b1a0a0bd 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -26,6 +26,7 @@ EndScriptData */ #include "Chat.h" #include "DatabaseEnv.h" #include "DB2Stores.h" +#include "LootMgr.h" #include "ObjectMgr.h" #include "Player.h" #include "RBAC.h" @@ -285,7 +286,7 @@ public: return false; } - player->RewardQuest(quest, 0, player); + player->RewardQuest(quest, LootItemType::Item, 0, player); return true; } }; |