mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/PacketIO: Fill new packet fields with data
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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(), reward);
|
||||
// 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]);
|
||||
|
||||
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());
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
switch (packet.Choice.LootItemType)
|
||||
{
|
||||
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)
|
||||
case LootItemType::Item:
|
||||
{
|
||||
itemValid = true;
|
||||
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->RewardChoiceItemType[i] == LootItemType::Item && quest->RewardChoiceItemId[i] == packet.Choice.Item.ItemID)
|
||||
{
|
||||
itemValid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!itemValid && quest->GetQuestPackageID())
|
||||
{
|
||||
if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItems(quest->GetQuestPackageID()))
|
||||
{
|
||||
for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
|
||||
{
|
||||
if (questPackageItem->ItemID != packet.Choice.Item.ItemID)
|
||||
continue;
|
||||
|
||||
if (_player->CanSelectQuestPackageItem(questPackageItem))
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
if (!itemValid && quest->GetQuestPackageID())
|
||||
{
|
||||
if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItems(quest->GetQuestPackageID()))
|
||||
case LootItemType::Currency:
|
||||
{
|
||||
for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
|
||||
if (!sCurrencyTypesStore.HasRecord(packet.Choice.Item.ItemID))
|
||||
{
|
||||
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 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 (_player->CanSelectQuestPackageItem(questPackageItem))
|
||||
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)
|
||||
{
|
||||
itemValid = true;
|
||||
currencyValid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!itemValid)
|
||||
{
|
||||
if (std::vector<QuestPackageItemEntry const*> const* questPackageItems = sDB2Manager.GetQuestPackageItemsFallback(quest->GetQuestPackageID()))
|
||||
if (!currencyValid)
|
||||
{
|
||||
for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
|
||||
{
|
||||
if (questPackageItem->ItemID != packet.Choice.Item.ItemID)
|
||||
continue;
|
||||
|
||||
itemValid = true;
|
||||
break;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
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())
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user