Core/PacketIO: Fill new packet fields with data

This commit is contained in:
Shauren
2020-11-05 19:52:18 +01:00
parent 78f77dbd41
commit 83eecaf2c4
11 changed files with 194 additions and 91 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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());

View File

@@ -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;

View File

@@ -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)

View File

@@ -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());
}

View File

@@ -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())
{

View File

@@ -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);

View File

@@ -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; }

View File

@@ -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;
}
};