AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Player Class Reference

#include "Player.h"

Inheritance diagram for Player:
Unit GridObject< Player > WorldObject Object WorldLocation Position

Classes

struct  BgBattlegroundQueueID_Rec
 
struct  ChatFloodThrottle
 

Public Types

typedef std::unordered_map< ObjectGuid::LowType, Item * > ItemMap
 
typedef std::set< uint32DFQuestsDoneList
 
- Public Types inherited from Unit
typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::list< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 Player (WorldSession *session)
 
 ~Player () override
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void SetObjectScale (float scale) override
 
bool hasSpanishClient ()
 
bool TeleportTo (uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
 
bool TeleportTo (WorldLocation const &loc, uint32 options=0, Unit *target=nullptr)
 
bool TeleportToEntryPoint ()
 
void SetSummonPoint (uint32 mapid, float x, float y, float z, uint32 delay=0, bool asSpectator=false)
 
bool IsSummonAsSpectator () const
 
void SetSummonAsSpectator (bool on)
 
void SummonIfPossible (bool agree, ObjectGuid summoner_guid)
 
time_t GetSummonExpireTimer () const
 
bool Create (ObjectGuid::LowType guidlow, CharacterCreateInfo *createInfo)
 
void Update (uint32 time) override
 
PlayerFlags GetPlayerFlags () const
 
bool HasPlayerFlag (PlayerFlags flags) const
 
void SetPlayerFlag (PlayerFlags flags)
 
void RemovePlayerFlag (PlayerFlags flags)
 
void ReplaceAllPlayerFlags (PlayerFlags flags)
 
bool IsClass (Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
 
void SetInWater (bool apply)
 
bool IsInWater () const override
 
bool IsFalling () const
 
bool IsInAreaTriggerRadius (AreaTrigger const *trigger, float delta=0.f) const
 
void SendInitialPacketsBeforeAddToMap ()
 
void SendInitialPacketsAfterAddToMap ()
 
void SendTransferAborted (uint32 mapid, TransferAbortReason reason, uint8 arg=0)
 
void SendInstanceResetWarning (uint32 mapid, Difficulty difficulty, uint32 time, bool onEnterMap)
 
bool CanInteractWithQuestGiver (Object *questGiver)
 
CreatureGetNPCIfCanInteractWith (ObjectGuid guid, uint32 npcflagmask)
 
GameObjectGetGameObjectIfCanInteractWith (ObjectGuid guid, GameobjectTypes type) const
 
void ToggleAFK ()
 
void ToggleDND ()
 
bool isAFK () const
 
bool isDND () const
 
uint8 GetChatTag () const
 
uint32 GetBarberShopCost (uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const *newSkin=nullptr)
 
PlayerSocialGetSocial ()
 
void InitTaxiNodesForLevel ()
 
bool ActivateTaxiPathTo (std::vector< uint32 > const &nodes, Creature *npc=nullptr, uint32 spellid=1)
 
bool ActivateTaxiPathTo (uint32 taxi_path_id, uint32 spellid=1)
 
void CleanupAfterTaxiFlight ()
 
void ContinueTaxiFlight ()
 
void SendTaxiNodeStatusMultiple ()
 
bool IsCommentator () const
 
void SetCommentator (bool on)
 
bool IsDeveloper () const
 
void SetDeveloper (bool on)
 
bool isAcceptWhispers () const
 
void SetAcceptWhispers (bool on)
 
bool IsGameMaster () const
 
void SetGameMaster (bool on)
 
bool isGMChat () const
 
void SetGMChat (bool on)
 
bool isTaxiCheater () const
 
void SetTaxiCheater (bool on)
 
bool isGMVisible () const
 
void SetGMVisible (bool on)
 
bool Has310Flyer (bool checkAllSpells, uint32 excludeSpellId=0)
 
void SetHas310Flyer (bool on)
 
void SetPvPDeath (bool on)
 
void GiveXP (uint32 xp, Unit *victim, float group_rate=1.0f, bool isLFGReward=false)
 
void GiveLevel (uint8 level)
 
void InitStatsForLevel (bool reapplyMods=false)
 
bool HasActivePowerType (Powers power) override
 
bool GetCommandStatus (uint32 command) const
 
void SetCommandStatusOn (uint32 command)
 
void SetCommandStatusOff (uint32 command)
 
uint32 GetTotalPlayedTime ()
 
uint32 GetLevelPlayedTime ()
 
void setDeathState (DeathState s, bool despawn=false) override
 
void SetRestState (uint32 triggerId)
 
void RemoveRestState ()
 
uint32 GetXPRestBonus (uint32 xp)
 
float GetRestBonus () const
 
void SetRestBonus (float rest_bonus_new)
 
bool HasRestFlag (RestFlag restFlag) const
 
void SetRestFlag (RestFlag restFlag, uint32 triggerId=0)
 
void RemoveRestFlag (RestFlag restFlag)
 
uint32 GetInnTriggerId () const
 
PetStableGetPetStable ()
 
PetStableGetOrInitPetStable ()
 
PetStable const * GetPetStable () const
 
PetGetPet () const
 
PetSummonPet (uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration=0s, uint32 healthPct=0)
 
void RemovePet (Pet *pet, PetSaveMode mode, bool returnreagent=false)
 
bool CanPetResurrect ()
 
bool IsExistPet ()
 
PetCreatePet (Creature *creatureTarget, uint32 spellID=0)
 
PetCreatePet (uint32 creatureEntry, uint32 spellID=0)
 
uint32 GetPhaseMaskForSpawn () const
 
void Say (std::string_view text, Language language, WorldObject const *=nullptr) override
 Handles said message in regular chat based on declared language and in config pre-defined Range. More...
 
void Say (uint32 textId, WorldObject const *target=nullptr) override
 
void Yell (std::string_view text, Language language, WorldObject const *=nullptr) override
 Handles yelled message in regular chat based on declared language and in config pre-defined Range. More...
 
void Yell (uint32 textId, WorldObject const *target=nullptr) override
 
void TextEmote (std::string_view text, WorldObject const *=nullptr, bool=false) override
 Outputs an universal text which is supposed to be an action. More...
 
void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false) override
 
void Whisper (std::string_view text, Language language, Player *receiver, bool=false) override
 Handles whispers from Addons and players based on sender, receiver's guid and language. More...
 
void Whisper (uint32 textId, Player *target, bool isBossWhisper=false) override
 
void SetVirtualItemSlot (uint8 i, Item *item)
 
void SetSheath (SheathState sheathed) override
 
uint8 FindEquipSlot (ItemTemplate const *proto, uint32 slot, bool swap) const
 
uint32 GetItemCount (uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
 
uint32 GetItemCountWithLimitCategory (uint32 limitCategory, Item *skipItem=nullptr) const
 
ItemGetItemByGuid (ObjectGuid guid) const
 
ItemGetItemByEntry (uint32 entry) const
 
ItemGetItemByPos (uint16 pos) const
 
ItemGetItemByPos (uint8 bag, uint8 slot) const
 
BagGetBagByPos (uint8 slot) const
 
uint32 GetFreeInventorySpace () const
 
ItemGetUseableItemByPos (uint8 bag, uint8 slot) const
 
ItemGetWeaponForAttack (WeaponAttackType attackType, bool useable=false) const
 
ItemGetShield (bool useable=false) const
 
std::vector< Item * > & GetItemUpdateQueue ()
 
bool IsValidPos (uint16 pos, bool explicit_pos)
 
bool IsValidPos (uint8 bag, uint8 slot, bool explicit_pos)
 
uint8 GetBankBagSlotCount () const
 
void SetBankBagSlotCount (uint8 count)
 
bool HasItemCount (uint32 item, uint32 count=1, bool inBankAlso=false) const
 
bool HasItemFitToSpellRequirements (SpellInfo const *spellInfo, Item const *ignoreItem=nullptr) const
 
bool CanNoReagentCast (SpellInfo const *spellInfo) const
 
bool HasItemOrGemWithIdEquipped (uint32 item, uint32 count, uint8 except_slot=NULL_SLOT) const
 
bool HasItemOrGemWithLimitCategoryEquipped (uint32 limitCategory, uint32 count, uint8 except_slot=NULL_SLOT) const
 
InventoryResult CanTakeMoreSimilarItems (Item *pItem) const
 
InventoryResult CanTakeMoreSimilarItems (uint32 entry, uint32 count) const
 
InventoryResult CanStoreNewItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
 
InventoryResult CanStoreItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
 
InventoryResult CanStoreItems (Item **pItem, int32 count) const
 
InventoryResult CanEquipNewItem (uint8 slot, uint16 &dest, uint32 item, bool swap) const
 
InventoryResult CanEquipItem (uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading=true) const
 
InventoryResult CanEquipUniqueItem (Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
 
InventoryResult CanEquipUniqueItem (ItemTemplate const *itemProto, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
 
InventoryResult CanUnequipItems (uint32 item, uint32 count) const
 
InventoryResult CanUnequipItem (uint16 src, bool swap) const
 
InventoryResult CanBankItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap, bool not_loading=true) const
 
InventoryResult CanUseItem (Item *pItem, bool not_loading=true) const
 
bool HasItemTotemCategory (uint32 TotemCategory) const
 
bool IsTotemCategoryCompatiableWith (ItemTemplate const *pProto, uint32 requiredTotemCategoryId) const
 
InventoryResult CanUseItem (ItemTemplate const *pItem) const
 
InventoryResult CanUseAmmo (uint32 item) const
 
InventoryResult CanRollForItemInLFG (ItemTemplate const *item, WorldObject const *lootedObject) const
 
ItemStoreNewItem (ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0)
 
ItemStoreNewItem (ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId, AllowedLooterSet &allowedLooters)
 
ItemStoreItem (ItemPosCountVec const &pos, Item *pItem, bool update)
 
ItemEquipNewItem (uint16 pos, uint32 item, bool update)
 
ItemEquipItem (uint16 pos, Item *pItem, bool update)
 
void AutoUnequipOffhandIfNeed (bool force=false)
 
bool StoreNewItemInBestSlots (uint32 item_id, uint32 item_count)
 
void AutoStoreLoot (uint8 bag, uint8 slot, uint32 loot_id, LootStore const &store, bool broadcast=false)
 
void AutoStoreLoot (uint32 loot_id, LootStore const &store, bool broadcast=false)
 
LootItemStoreLootItem (uint8 lootSlot, Loot *loot, InventoryResult &msg)
 
void UpdateLootAchievements (LootItem *item, Loot *loot)
 
void UpdateTitansGrip ()
 
InventoryResult CanTakeMoreSimilarItems (uint32 entry, uint32 count, Item *pItem, uint32 *no_space_count=nullptr) const
 
InventoryResult CanStoreItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 entry, uint32 count, Item *pItem=nullptr, bool swap=false, uint32 *no_space_count=nullptr) const
 
void AddRefundReference (ObjectGuid itemGUID)
 
void DeleteRefundReference (ObjectGuid itemGUID)
 
void ApplyEquipCooldown (Item *pItem)
 
void SetAmmo (uint32 item)
 
void RemoveAmmo ()
 
float GetAmmoDPS () const
 
bool CheckAmmoCompatibility (ItemTemplate const *ammo_proto) const
 
void QuickEquipItem (uint16 pos, Item *pItem)
 
void VisualizeItem (uint8 slot, Item *pItem)
 
void SetVisibleItemSlot (uint8 slot, Item *pItem)
 
ItemBankItem (ItemPosCountVec const &dest, Item *pItem, bool update)
 
ItemBankItem (uint16 pos, Item *pItem, bool update)
 
void RemoveItem (uint8 bag, uint8 slot, bool update, bool swap=false)
 
void MoveItemFromInventory (uint8 bag, uint8 slot, bool update)
 
void MoveItemToInventory (ItemPosCountVec const &dest, Item *pItem, bool update, bool in_characterInventoryDB=false)
 
void RemoveItemDependentAurasAndCasts (Item *pItem)
 
void DestroyItem (uint8 bag, uint8 slot, bool update)
 
void DestroyItemCount (uint32 item, uint32 count, bool update, bool unequip_check=false)
 
void DestroyItemCount (Item *item, uint32 &count, bool update)
 
void DestroyConjuredItems (bool update)
 
void DestroyZoneLimitedItem (bool update, uint32 new_zone)
 
void SplitItem (uint16 src, uint16 dst, uint32 count)
 
void SwapItem (uint16 src, uint16 dst)
 
void AddItemToBuyBackSlot (Item *pItem, uint32 money)
 
ItemGetItemFromBuyBackSlot (uint32 slot)
 
void RemoveItemFromBuyBackSlot (uint32 slot, bool del)
 
uint32 GetMaxKeyringSize () const
 
void SendEquipError (InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0)
 
void SendBuyError (BuyResult msg, Creature *creature, uint32 item, uint32 param)
 
void SendSellError (SellResult msg, Creature *creature, ObjectGuid guid, uint32 param)
 
void AddWeaponProficiency (uint32 newflag)
 
void AddArmorProficiency (uint32 newflag)
 
uint32 GetWeaponProficiency () const
 
uint32 GetArmorProficiency () const
 
bool IsTwoHandUsed () const
 
void SendNewItem (Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
 
bool BuyItemFromVendorSlot (ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot)
 
bool _StoreOrEquipNewItem (uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const *pProto, Creature *pVendor, VendorItem const *crItem, bool bStore)
 
float GetReputationPriceDiscount (Creature const *creature) const
 
float GetReputationPriceDiscount (FactionTemplateEntry const *factionTemplate) const
 
PlayerGetTrader () const
 
TradeDataGetTradeData () const
 
void TradeCancel (bool sendback)
 
CinematicMgrGetCinematicMgr () const
 
void UpdateEnchantTime (uint32 time)
 
void UpdateSoulboundTradeItems ()
 
void AddTradeableItem (Item *item)
 
void RemoveTradeableItem (Item *item)
 
void UpdateItemDuration (uint32 time, bool realtimeonly=false)
 
void AddEnchantmentDurations (Item *item)
 
void RemoveEnchantmentDurations (Item *item)
 
void RemoveEnchantmentDurationsReferences (Item *item)
 
void RemoveArenaEnchantments (EnchantmentSlot slot)
 
void AddEnchantmentDuration (Item *item, EnchantmentSlot slot, uint32 duration)
 
void ApplyEnchantment (Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
 
void ApplyEnchantment (Item *item, bool apply)
 
void UpdateSkillEnchantments (uint16 skill_id, uint16 curr_value, uint16 new_value)
 
void SendEnchantmentDurations ()
 
void UpdateEnchantmentDurations ()
 
void BuildEnchantmentsInfoData (WorldPacket *data)
 
void AddItemDurations (Item *item)
 
void RemoveItemDurations (Item *item)
 
void SendItemDurations ()
 
void LoadCorpse (PreparedQueryResult result)
 
void LoadPet ()
 
bool AddItem (uint32 itemId, uint32 count)
 
void PrepareGossipMenu (WorldObject *source, uint32 menuId=0, bool showQuests=false)
 
void SendPreparedGossip (WorldObject *source)
 
void OnGossipSelect (WorldObject *source, uint32 gossipListId, uint32 menuId)
 
uint32 GetGossipTextId (uint32 menuId, WorldObject *source)
 
uint32 GetGossipTextId (WorldObject *source)
 
void ToggleInstantFlight ()
 
int32 GetQuestLevel (Quest const *quest) const
 
void PrepareQuestMenu (ObjectGuid guid)
 
void SendPreparedQuest (ObjectGuid guid)
 
bool IsActiveQuest (uint32 quest_id) const
 
Quest const * GetNextQuest (ObjectGuid guid, Quest const *quest)
 
bool CanSeeStartQuest (Quest const *quest)
 
bool CanTakeQuest (Quest const *quest, bool msg)
 
bool CanAddQuest (Quest const *quest, bool msg)
 
bool CanCompleteQuest (uint32 quest_id, const QuestStatusData *q_savedStatus=nullptr)
 
bool CanCompleteRepeatableQuest (Quest const *quest)
 
bool CanRewardQuest (Quest const *quest, bool msg)
 
bool CanRewardQuest (Quest const *quest, uint32 reward, bool msg)
 
void AddQuestAndCheckCompletion (Quest const *quest, Object *questGiver)
 
void AddQuest (Quest const *quest, Object *questGiver)
 
void AbandonQuest (uint32 quest_id)
 
void CompleteQuest (uint32 quest_id)
 
void IncompleteQuest (uint32 quest_id)
 
void RewardQuest (Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
 
void FailQuest (uint32 quest_id)
 
bool SatisfyQuestSkill (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestLevel (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestLog (bool msg)
 
bool SatisfyQuestPreviousQuest (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestClass (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestRace (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestReputation (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestStatus (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestConditions (Quest const *qInfo, bool msg)
 
bool SatisfyQuestTimed (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestExclusiveGroup (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestNextChain (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestPrevChain (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestDay (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestWeek (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestMonth (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestSeasonal (Quest const *qInfo, bool msg) const
 
bool GiveQuestSourceItem (Quest const *quest)
 
bool TakeQuestSourceItem (uint32 questId, bool msg)
 
uint32 CalculateQuestRewardXP (Quest const *quest)
 
bool GetQuestRewardStatus (uint32 quest_id) const
 
QuestStatus GetQuestStatus (uint32 quest_id) const
 
void SetQuestStatus (uint32 questId, QuestStatus status, bool update=true)
 
void RemoveActiveQuest (uint32 questId, bool update=true)
 
void RemoveRewardedQuest (uint32 questId, bool update=true)
 
void SendQuestUpdate (uint32 questId)
 
QuestGiverStatus GetQuestDialogStatus (Object *questGiver)
 
float GetQuestRate (bool isDFQuest=false)
 
void SetDailyQuestStatus (uint32 quest_id)
 
bool IsDailyQuestDone (uint32 quest_id)
 
void SetWeeklyQuestStatus (uint32 quest_id)
 
void SetMonthlyQuestStatus (uint32 quest_id)
 
void SetSeasonalQuestStatus (uint32 quest_id)
 
void ResetDailyQuestStatus ()
 
void ResetWeeklyQuestStatus ()
 
void ResetMonthlyQuestStatus ()
 
void ResetSeasonalQuestStatus (uint16 event_id)
 
uint16 FindQuestSlot (uint32 quest_id) const
 
uint32 GetQuestSlotQuestId (uint16 slot) const
 
uint32 GetQuestSlotState (uint16 slot) const
 
uint16 GetQuestSlotCounter (uint16 slot, uint8 counter) const
 
uint32 GetQuestSlotTime (uint16 slot) const
 
void SetQuestSlot (uint16 slot, uint32 quest_id, uint32 timer=0)
 
void SetQuestSlotCounter (uint16 slot, uint8 counter, uint16 count)
 
void SetQuestSlotState (uint16 slot, uint32 state)
 
void RemoveQuestSlotState (uint16 slot, uint32 state)
 
void SetQuestSlotTimer (uint16 slot, uint32 timer)
 
void SwapQuestSlot (uint16 slot1, uint16 slot2)
 
uint16 GetReqKillOrCastCurrentCount (uint32 quest_id, int32 entry)
 
void AreaExploredOrEventHappens (uint32 questId)
 
void GroupEventHappens (uint32 questId, WorldObject const *pEventObject)
 
void ItemAddedQuestCheck (uint32 entry, uint32 count)
 
void ItemRemovedQuestCheck (uint32 entry, uint32 count)
 
void KilledMonster (CreatureTemplate const *cInfo, ObjectGuid guid)
 
void KilledMonsterCredit (uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
 
void KilledPlayerCredit (uint16 count=1)
 
void KilledPlayerCreditForQuest (uint16 count, Quest const *quest)
 
void KillCreditGO (uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
 
void TalkedToCreature (uint32 entry, ObjectGuid guid)
 
void MoneyChanged (uint32 value)
 
void ReputationChanged (FactionEntry const *factionEntry)
 
void ReputationChanged2 (FactionEntry const *factionEntry)
 
bool HasQuestForItem (uint32 itemId, uint32 excludeQuestId=0, bool turnIn=false, bool *showInLoot=nullptr) const
 
bool HasQuestForGO (int32 GOId) const
 
bool HasQuest (uint32 questId) const
 
void UpdateForQuestWorldObjects ()
 
bool CanShareQuest (uint32 quest_id) const
 
void SendQuestComplete (uint32 quest_id)
 
void SendQuestReward (Quest const *quest, uint32 XP)
 
void SendQuestFailed (uint32 questId, InventoryResult reason=EQUIP_ERR_OK)
 
void SendQuestTimerFailed (uint32 quest_id)
 
void SendCanTakeQuestResponse (uint32 msg) const
 
void SendQuestConfirmAccept (Quest const *quest, Player *pReceiver)
 
void SendPushToPartyResponse (Player const *player, uint8 msg) const
 
void SendQuestUpdateAddItem (Quest const *quest, uint32 item_idx, uint16 count)
 
void SendQuestUpdateAddCreatureOrGo (Quest const *quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count)
 
void SendQuestUpdateAddPlayer (Quest const *quest, uint16 old_count, uint16 add_count)
 
ObjectGuid GetDivider ()
 
void SetDivider (ObjectGuid guid=ObjectGuid::Empty)
 
uint32 GetInGameTime ()
 
void SetInGameTime (uint32 time)
 
void AddTimedQuest (uint32 quest_id)
 
void RemoveTimedQuest (uint32 quest_id)
 
bool HasPvPForcingQuest () const
 
bool LoadFromDB (ObjectGuid guid, CharacterDatabaseQueryHolder const &holder)
 
bool isBeingLoaded () const override
 
void Initialize (ObjectGuid::LowType guid)
 
void SaveToDB (bool create, bool logout)
 
void SaveToDB (CharacterDatabaseTransaction trans, bool create, bool logout)
 
void SaveInventoryAndGoldToDB (CharacterDatabaseTransaction trans)
 
void SaveGoldToDB (CharacterDatabaseTransaction trans)
 
void _SaveSkills (CharacterDatabaseTransaction trans)
 
void SetBindPoint (ObjectGuid guid)
 
void SendTalentWipeConfirm (ObjectGuid guid)
 
void ResetPetTalents ()
 
void CalcRage (uint32 damage, bool attacker)
 
void RegenerateAll ()
 
void Regenerate (Powers power)
 
void RegenerateHealth ()
 
void setRegenTimerCount (uint32 time)
 
void setWeaponChangeTimer (uint32 time)
 
uint32 GetMoney () const
 
bool ModifyMoney (int32 amount, bool sendError=true)
 
bool HasEnoughMoney (uint32 amount) const
 
bool HasEnoughMoney (int32 amount) const
 
void SetMoney (uint32 value)
 
RewardedQuestSet const & getRewardedQuests () const
 
QuestStatusMapgetQuestStatusMap ()
 
QuestStatusSaveMapGetQuestStatusSaveMap ()
 
std::size_t GetRewardedQuestCount () const
 
bool IsQuestRewarded (uint32 quest_id) const
 
UnitGetSelectedUnit () const
 
PlayerGetSelectedPlayer () const
 
void SetTarget (ObjectGuid=ObjectGuid::Empty) override
 
void SetSelection (ObjectGuid guid)
 Used for serverside target changes, does not apply to players. More...
 
void SendMailResult (uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError=0, ObjectGuid::LowType item_guid=0, uint32 item_count=0)
 
void SendNewMail ()
 
void UpdateNextMailTimeAndUnreads ()
 
void AddNewMailDeliverTime (time_t deliver_time)
 
void RemoveMail (uint32 id)
 
void AddMail (Mail *mail)
 
uint32 GetMailSize ()
 
MailGetMail (uint32 id)
 
PlayerMails const & GetMails () const
 
void SendItemRetrievalMail (uint32 itemEntry, uint32 count)
 
void SendItemRetrievalMail (std::vector< std::pair< uint32, uint32 > > mailItems)
 
ItemGetMItem (ObjectGuid::LowType itemLowGuid)
 
void AddMItem (Item *it)
 
bool RemoveMItem (ObjectGuid::LowType itemLowGuid)
 
void PetSpellInitialize ()
 
void CharmSpellInitialize ()
 
void PossessSpellInitialize ()
 
void VehicleSpellInitialize ()
 
void SendRemoveControlBar ()
 
bool HasSpell (uint32 spell) const override
 
bool HasActiveSpell (uint32 spell) const
 
TrainerSpellState GetTrainerSpellState (TrainerSpell const *trainer_spell) const
 
bool IsSpellFitByClassAndRace (uint32 spell_id) const
 
bool IsNeedCastPassiveSpellAtLearn (SpellInfo const *spellInfo) const
 
void SendProficiency (ItemClass itemClass, uint32 itemSubclassMask)
 
void SendInitialSpells ()
 
void SendLearnPacket (uint32 spellId, bool learn)
 
bool addSpell (uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary=false, bool learnFromSkill=false)
 
bool _addSpell (uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill=false)
 
void learnSpell (uint32 spellId, bool temporary=false, bool learnFromSkill=false)
 
void removeSpell (uint32 spellId, uint8 removeSpecMask, bool onlyTemporary)
 
void resetSpells ()
 
void LearnCustomSpells ()
 
void LearnDefaultSkills ()
 
void LearnDefaultSkill (uint32 skillId, uint16 rank)
 
void learnQuestRewardedSpells ()
 
void learnQuestRewardedSpells (Quest const *quest)
 
void learnSpellHighRank (uint32 spellid)
 
void SetReputation (uint32 factionentry, float value)
 
uint32 GetReputation (uint32 factionentry) const
 
std::string const & GetGuildName ()
 
uint32 GetFreeTalentPoints () const
 
void SetFreeTalentPoints (uint32 points)
 
bool resetTalents (bool noResetCost=false)
 
uint32 resetTalentsCost () const
 
bool IsMaxLevel () const
 
void InitTalentForLevel ()
 
void BuildPlayerTalentsInfoData (WorldPacket *data)
 
void BuildPetTalentsInfoData (WorldPacket *data)
 
void SendTalentsInfoData (bool pet)
 
void LearnTalent (uint32 talentId, uint32 talentRank, bool command=false)
 
void LearnPetTalent (ObjectGuid petGuid, uint32 talentId, uint32 talentRank)
 
bool addTalent (uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank)
 
void _removeTalent (PlayerTalentMap::iterator &itr, uint8 specMask)
 
void _removeTalent (uint32 spellId, uint8 specMask)
 
void _removeTalentAurasAndSpells (uint32 spellId)
 
void _addTalentAurasAndSpells (uint32 spellId)
 
bool HasTalent (uint32 spell_id, uint8 spec) const
 
uint32 CalculateTalentsPoints () const
 
void UpdateSpecCount (uint8 count)
 
uint8 GetActiveSpec () const
 
uint8 GetActiveSpecMask () const
 
void SetActiveSpec (uint8 spec)
 
uint8 GetSpecsCount () const
 
void SetSpecsCount (uint8 count)
 
void ActivateSpec (uint8 spec)
 
void LoadActions (PreparedQueryResult result)
 
void GetTalentTreePoints (uint8(&specPoints)[3]) const
 
uint8 GetMostPointsTalentTree () const
 
bool HasTankSpec ()
 
bool HasMeleeSpec ()
 
bool HasCasterSpec ()
 
bool HasHealSpec ()
 
uint32 GetSpec (int8 spec=-1)
 
void InitGlyphsForLevel ()
 
void SetGlyphSlot (uint8 slot, uint32 slottype)
 
uint32 GetGlyphSlot (uint8 slot) const
 
void SetGlyph (uint8 slot, uint32 glyph, bool save)
 
uint32 GetGlyph (uint8 slot) const
 
uint32 GetFreePrimaryProfessionPoints () const
 
void SetFreePrimaryProfessions (uint16 profs)
 
void InitPrimaryProfessions ()
 
PlayerSpellMap const & GetSpellMap () const
 
PlayerSpellMapGetSpellMap ()
 
SpellCooldowns const & GetSpellCooldownMap () const
 
SpellCooldownsGetSpellCooldownMap ()
 
void AddSpellMod (SpellModifier *mod, bool apply)
 
bool IsAffectedBySpellmod (SpellInfo const *spellInfo, SpellModifier *mod, Spell *spell=nullptr)
 
bool HasSpellMod (SpellModifier *mod, Spell *spell)
 
template<class T >
void ApplySpellMod (uint32 spellId, SpellModOp op, T &basevalue, Spell *spell=nullptr, bool temporaryPet=false)
 
void RemoveSpellMods (Spell *spell)
 
void RestoreSpellMods (Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
 
void RestoreAllSpellMods (uint32 ownerAuraId=0, Aura *aura=nullptr)
 
void DropModCharge (SpellModifier *mod, Spell *spell)
 
void SetSpellModTakingSpell (Spell *spell, bool apply)
 
bool HasSpellCooldown (uint32 spell_id) const override
 
bool HasSpellItemCooldown (uint32 spell_id, uint32 itemid) const override
 
uint32 GetSpellCooldownDelay (uint32 spell_id) const
 
void AddSpellAndCategoryCooldowns (SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
 
void AddSpellCooldown (uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
 
void _AddSpellCooldown (uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void ModifySpellCooldown (uint32 spellId, int32 cooldown)
 
void SendCooldownEvent (SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
 
void ProhibitSpellSchool (SpellSchoolMask idSchoolMask, uint32 unTimeMs) override
 
void RemoveSpellCooldown (uint32 spell_id, bool update=false)
 
void SendClearCooldown (uint32 spell_id, Unit *target)
 
GlobalCooldownMgrGetGlobalCooldownMgr ()
 
void RemoveCategoryCooldown (uint32 cat)
 
void RemoveArenaSpellCooldowns (bool removeActivePetCooldowns=false)
 
void RemoveAllSpellCooldown ()
 
void _LoadSpellCooldowns (PreparedQueryResult result)
 
void _SaveSpellCooldowns (CharacterDatabaseTransaction trans, bool logout)
 
uint32 GetLastPotionId ()
 
void SetLastPotionId (uint32 item_id)
 
void UpdatePotionCooldown (Spell *spell=nullptr)
 
void setResurrectRequestData (ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
 
void clearResurrectRequestData ()
 
bool isResurrectRequestedBy (ObjectGuid guid) const
 
bool isResurrectRequested () const
 
void ResurectUsingRequestData ()
 
uint8 getCinematic () const
 
void setCinematic (uint8 cine)
 
ActionButtonaddActionButton (uint8 button, uint32 action, uint8 type)
 
void removeActionButton (uint8 button)
 
ActionButton const * GetActionButton (uint8 button)
 
void SendInitialActionButtons () const
 
void SendActionButtons (uint32 state) const
 
bool IsActionButtonDataValid (uint8 button, uint32 action, uint8 type)
 
void UpdatePvPState ()
 
void UpdateFFAPvPState (bool reset=true)
 
void SetPvP (bool state)
 
void UpdatePvP (bool state, bool _override=false)
 
void UpdateZone (uint32 newZone, uint32 newArea)
 
void UpdateArea (uint32 newArea)
 
void SetNeedZoneUpdate (bool needUpdate)
 
void UpdateZoneDependentAuras (uint32 zone_id)
 
void UpdateAreaDependentAuras (uint32 area_id)
 
void UpdateAfkReport (time_t currTime)
 checks the 15 afk reports per 5 minutes limit More...
 
void UpdatePvPFlag (time_t currTime)
 
void UpdateFFAPvPFlag (time_t currTime)
 
void UpdateContestedPvP (uint32 currTime)
 
void SetContestedPvPTimer (uint32 newTime)
 
void ResetContestedPvP ()
 
void UpdateDuelFlag (time_t currTime)
 
void CheckDuelDistance (time_t currTime)
 
void DuelComplete (DuelCompleteType type)
 
void SendDuelCountdown (uint32 counter)
 
bool IsGroupVisibleFor (Player const *p) const
 
bool IsInSameGroupWith (Player const *p) const
 
bool IsInSameRaidWith (Player const *p) const
 
void UninviteFromGroup ()
 
void RemoveFromGroup (RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT)
 
void SendUpdateToOutOfRangeGroupMembers ()
 
void SetInGuild (uint32 GuildId)
 
void SetRank (uint8 rankId)
 
uint8 GetRank () const
 
void SetGuildIdInvited (uint32 GuildId)
 
uint32 GetGuildId () const
 
GuildGetGuild () const
 
uint32 GetGuildIdInvited ()
 
void SetInArenaTeam (uint32 ArenaTeamId, uint8 slot, uint8 type)
 
void SetArenaTeamInfoField (uint8 slot, ArenaTeamInfoType type, uint32 value)
 
uint32 GetArenaPersonalRating (uint8 slot) const
 
uint32 GetArenaTeamId (uint8 slot) const
 
void SetArenaTeamIdInvited (uint32 ArenaTeamId)
 
uint32 GetArenaTeamIdInvited ()
 
Difficulty GetDifficulty (bool isRaid) const
 
Difficulty GetDungeonDifficulty () const
 
Difficulty GetRaidDifficulty () const
 
Difficulty GetStoredRaidDifficulty () const
 
void SetDungeonDifficulty (Difficulty dungeon_difficulty)
 
void SetRaidDifficulty (Difficulty raid_difficulty)
 
void StoreRaidMapDifficulty ()
 
bool UpdateSkill (uint32 skill_id, uint32 step)
 
bool UpdateSkillPro (uint16 SkillId, int32 Chance, uint32 step)
 
bool UpdateCraftSkill (uint32 spellid)
 
bool UpdateGatherSkill (uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator=1)
 
bool UpdateFishingSkill ()
 
uint32 GetBaseDefenseSkillValue () const
 
uint32 GetBaseWeaponSkillValue (WeaponAttackType attType) const
 
uint32 GetSpellByProto (ItemTemplate *proto)
 
float GetHealthBonusFromStamina ()
 
float GetManaBonusFromIntellect ()
 
bool UpdateStats (Stats stat) override
 
bool UpdateAllStats () override
 
void ApplySpellPenetrationBonus (int32 amount, bool apply)
 
void UpdateResistances (uint32 school) override
 
void UpdateArmor () override
 
void UpdateMaxHealth () override
 
void UpdateMaxPower (Powers power) override
 
void ApplyFeralAPBonus (int32 amount, bool apply)
 
void UpdateAttackPowerAndDamage (bool ranged=false) override
 
void UpdateShieldBlockValue ()
 
void ApplySpellPowerBonus (int32 amount, bool apply)
 
void UpdateSpellDamageAndHealingBonus ()
 
void ApplyRatingMod (CombatRating cr, int32 value, bool apply)
 
void UpdateRating (CombatRating cr)
 
void UpdateAllRatings ()
 
void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex) override
 
void UpdateDefenseBonusesMod ()
 
void RecalculateRating (CombatRating cr)
 
float GetMeleeCritFromAgility ()
 
void GetDodgeFromAgility (float &diminishing, float &nondiminishing)
 
float GetMissPercentageFromDefence () const
 
float GetSpellCritFromIntellect ()
 
float OCTRegenHPPerSpirit ()
 
float OCTRegenMPPerSpirit ()
 
float GetRatingMultiplier (CombatRating cr) const
 
float GetRatingBonusValue (CombatRating cr) const
 
uint32 GetBaseSpellPowerBonus ()
 
int32 GetSpellPenetrationItemMod () const
 
float GetExpertiseDodgeOrParryReduction (WeaponAttackType attType) const
 
void UpdateBlockPercentage ()
 
void UpdateCritPercentage (WeaponAttackType attType)
 
void UpdateAllCritPercentages ()
 
void UpdateParryPercentage ()
 
void UpdateDodgePercentage ()
 
void UpdateMeleeHitChances ()
 
void UpdateRangedHitChances ()
 
void UpdateSpellHitChances ()
 
void UpdateAllSpellCritChances ()
 
void UpdateSpellCritChance (uint32 school)
 
void UpdateArmorPenetration (int32 amount)
 
void UpdateExpertise (WeaponAttackType attType)
 
void ApplyManaRegenBonus (int32 amount, bool apply)
 
void ApplyHealthRegenBonus (int32 amount, bool apply)
 
void UpdateManaRegen ()
 
void UpdateRuneRegen (RuneType rune)
 
ObjectGuid GetLootGUID () const
 
void SetLootGUID (ObjectGuid guid)
 
void RemovedInsignia (Player *looterPlr)
 
WorldSessionGetSession () const
 
void SetSession (WorldSession *sess)
 
void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target) override
 
void DestroyForPlayer (Player *target, bool onDeath=false) const override
 
void SendLogXPGain (uint32 GivenXP, Unit *victim, uint32 BonusXP, bool recruitAFriend=false, float group_rate=1.0f)
 
void SendAttackSwingCantAttack ()
 
void SendAttackSwingCancelAttack ()
 
void SendAttackSwingDeadTarget ()
 
void SendAttackSwingNotInRange ()
 
void SendAttackSwingBadFacingAttack ()
 
void SendAutoRepeatCancel (Unit *target)
 
void SendExplorationExperience (uint32 Area, uint32 Experience)
 
void SendDungeonDifficulty (bool IsInGroup)
 
void SendRaidDifficulty (bool IsInGroup, int32 forcedDifficulty=-1)
 
void SendResetInstanceSuccess (uint32 MapId)
 
void SendResetInstanceFailed (uint32 reason, uint32 MapId)
 
void SendResetFailedNotify (uint32 mapid)
 
bool UpdatePosition (float x, float y, float z, float orientation, bool teleport=false) override
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessTerrainStatusUpdate () override
 
void SendMessageToSet (WorldPacket const *data, bool self) const override
 
void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const override
 
void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self, bool includeMargin, bool ownTeamOnly, bool required3dDist=false) const
 
void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const override
 
void SendTeleportAckPacket ()
 
CorpseGetCorpse () const
 
void SpawnCorpseBones (bool triggerSave=true)
 
CorpseCreateCorpse ()
 
void RemoveCorpse ()
 
void KillPlayer ()
 
bool HasCorpse () const
 
WorldLocation GetCorpseLocation () const
 
uint32 GetResurrectionSpellId ()
 
void ResurrectPlayer (float restore_percent, bool applySickness=false)
 
void BuildPlayerRepop ()
 
void RepopAtGraveyard ()
 
void SendDurabilityLoss ()
 
void DurabilityLossAll (double percent, bool inventory)
 
void DurabilityLoss (Item *item, double percent)
 
void DurabilityPointsLossAll (int32 points, bool inventory)
 
void DurabilityPointsLoss (Item *item, int32 points)
 
void DurabilityPointLossForEquipSlot (EquipmentSlots slot)
 
uint32 DurabilityRepairAll (bool cost, float discountMod, bool guildBank)
 
uint32 DurabilityRepair (uint16 pos, bool cost, float discountMod, bool guildBank)
 
void UpdateMirrorTimers ()
 
void StopMirrorTimers ()
 
bool IsMirrorTimerActive (MirrorTimerType type)
 
void SetMovement (PlayerMovementType pType)
 
bool CanJoinConstantChannelInZone (ChatChannelsEntry const *channel, AreaTableEntry const *zone)
 
void JoinedChannel (Channel *c)
 
void LeftChannel (Channel *c)
 
void CleanupChannels ()
 
void ClearChannelWatch ()
 
void UpdateLocalChannels (uint32 newZone)
 
void UpdateDefense ()
 
void UpdateWeaponSkill (Unit *victim, WeaponAttackType attType, Item *item=nullptr)
 
void UpdateCombatSkills (Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
 
void SetSkill (uint16 id, uint16 step, uint16 currVal, uint16 maxVal)
 
uint16 GetMaxSkillValue (uint32 skill) const
 
uint16 GetPureMaxSkillValue (uint32 skill) const
 
uint16 GetSkillValue (uint32 skill) const
 
uint16 GetBaseSkillValue (uint32 skill) const
 
uint16 GetPureSkillValue (uint32 skill) const
 
int16 GetSkillPermBonusValue (uint32 skill) const
 
int16 GetSkillTempBonusValue (uint32 skill) const
 
uint16 GetSkillStep (uint16 skill) const
 
bool HasSkill (uint32 skill) const
 
void learnSkillRewardedSpells (uint32 id, uint32 value)
 
WorldLocationGetTeleportDest ()
 
bool IsBeingTeleported () const
 
bool IsBeingTeleportedNear () const
 
bool IsBeingTeleportedFar () const
 
void SetSemaphoreTeleportNear (time_t tm)
 
void SetSemaphoreTeleportFar (time_t tm)
 
time_t GetSemaphoreTeleportNear () const
 
time_t GetSemaphoreTeleportFar () const
 
void ProcessDelayedOperations ()
 
uint32 GetDelayedOperations () const
 
void ScheduleDelayedOperation (uint32 operation)
 
void CheckAreaExploreAndOutdoor ()
 
TeamId GetTeamId (bool original=false) const
 
void SetFactionForRace (uint8 race)
 
void setTeamId (TeamId teamid)
 
void InitDisplayIds ()
 
bool IsAtGroupRewardDistance (WorldObject const *pRewardSource) const
 
bool IsAtLootRewardDistance (WorldObject const *pRewardSource) const
 
bool IsAtRecruitAFriendDistance (WorldObject const *pOther) const
 
void RewardPlayerAndGroupAtKill (Unit *victim, bool isBattleGround)
 
void RewardPlayerAndGroupAtEvent (uint32 creature_id, WorldObject *pRewardSource)
 
bool isHonorOrXPTarget (Unit *victim) const
 
bool GetsRecruitAFriendBonus (bool forXP)
 
uint8 GetGrantableLevels ()
 
void SetGrantableLevels (uint8 val)
 
ReputationMgrGetReputationMgr ()
 
ReputationMgr const & GetReputationMgr () const
 
ReputationRank GetReputationRank (uint32 faction_id) const
 
void RewardReputation (Unit *victim)
 
void RewardReputation (Quest const *quest)
 
float CalculateReputationGain (ReputationSource source, uint32 creatureOrQuestLevel, float rep, int32 faction, bool noQuestBonus=false)
 
void UpdateSkillsForLevel ()
 
void UpdateSkillsToMaxSkillsForLevel ()
 
void ModifySkillBonus (uint32 skillid, int32 val, bool talent)
 
void RewardExtraBonusTalentPoints (uint32 bonusTalentPoints)
 
void UpdateHonorFields ()
 
bool RewardHonor (Unit *victim, uint32 groupsize, int32 honor=-1, bool awardXP=true)
 
uint32 GetHonorPoints () const
 
uint32 GetArenaPoints () const
 
void ModifyHonorPoints (int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
 
void ModifyArenaPoints (int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
 If trans is specified, honor save query will be added to trans. More...
 
uint32 GetMaxPersonalArenaRatingRequirement (uint32 minarenaslot) const
 If trans is specified, arena point save query will be added to trans. More...
 
void SetHonorPoints (uint32 value)
 
void SetArenaPoints (uint32 value)
 
void SaveHealthBeforeDuel ()
 
void SaveManaBeforeDuel ()
 
void RestoreHealthAfterDuel ()
 
void RestoreManaAfterDuel ()
 
SpellCooldowns GetSpellCooldowns () const
 
void SetDrunkValue (uint8 newDrunkValue, uint32 itemId=0)
 
uint8 GetDrunkValue () const
 
int32 GetFakeDrunkValue () const
 
void UpdateInvisibilityDrunkDetect ()
 
uint32 GetDeathTimer () const
 
uint32 GetCorpseReclaimDelay (bool pvp) const
 
void UpdateCorpseReclaimDelay ()
 
int32 CalculateCorpseReclaimDelay (bool load=false)
 
void SendCorpseReclaimDelay (uint32 delay)
 
uint32 GetShieldBlockValue () const override
 
bool CanParry () const
 
void SetCanParry (bool value)
 
bool CanBlock () const
 
void SetCanBlock (bool value)
 
bool CanTitanGrip () const
 
void SetCanTitanGrip (bool value)
 
bool CanTameExoticPets () const
 
void SetRegularAttackTime ()
 
void SetBaseModValue (BaseModGroup modGroup, BaseModType modType, float value)
 
void HandleBaseModValue (BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
 
float GetBaseModValue (BaseModGroup modGroup, BaseModType modType) const
 
float GetTotalBaseModValue (BaseModGroup modGroup) const
 
float GetTotalPercentageModValue (BaseModGroup modGroup) const
 
void _ApplyAllStatBonuses ()
 
void _RemoveAllStatBonuses ()
 
void ResetAllPowers ()
 
SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const override
 
void _ApplyWeaponDependentAuraMods (Item *item, WeaponAttackType attackType, bool apply)
 
void _ApplyWeaponDependentAuraCritMod (Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
 
void _ApplyWeaponDependentAuraDamageMod (Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
 
void _ApplyItemMods (Item *item, uint8 slot, bool apply)
 
void _RemoveAllItemMods ()
 
void _ApplyAllItemMods ()
 
void _ApplyAllLevelScaleItemMods (bool apply)
 
void _ApplyItemBonuses (ItemTemplate const *proto, uint8 slot, bool apply, bool only_level_scale=false)
 
void _ApplyWeaponDamage (uint8 slot, ItemTemplate const *proto, ScalingStatValuesEntry const *ssv, bool apply)
 
void _ApplyAmmoBonuses ()
 
bool EnchantmentFitsRequirements (uint32 enchantmentcondition, int8 slot)
 
void ToggleMetaGemsActive (uint8 exceptslot, bool apply)
 
void CorrectMetaGemEnchants (uint8 slot, bool apply)
 
void InitDataForForm (bool reapplyMods=false)
 
void ApplyItemEquipSpell (Item *item, bool apply, bool form_change=false)
 
void ApplyEquipSpell (SpellInfo const *spellInfo, Item *item, bool apply, bool form_change=false)
 
void UpdateEquipSpellsAtFormChange ()
 
void CastItemCombatSpell (Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
 
void CastItemUseSpell (Item *item, SpellCastTargets const &targets, uint8 cast_count, uint32 glyphIndex)
 
void CastItemCombatSpell (Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item *item, ItemTemplate const *proto)
 
void SendEquipmentSetList ()
 
void SetEquipmentSet (uint32 index, EquipmentSet eqset)
 
void DeleteEquipmentSet (uint64 setGuid)
 
void SendInitWorldStates (uint32 zone, uint32 area)
 
void SendUpdateWorldState (uint32 variable, uint32 value) const
 
void SendDirectMessage (WorldPacket const *data) const
 
void SendBGWeekendWorldStates ()
 
void SendBattlefieldWorldStates ()
 
void GetAurasForTarget (Unit *target, bool force=false)
 
void SendLoot (ObjectGuid guid, LootType loot_type)
 
void SendLootError (ObjectGuid guid, LootError error)
 
void SendLootRelease (ObjectGuid guid)
 
void SendNotifyLootItemRemoved (uint8 lootSlot)
 
void SendNotifyLootMoneyRemoved ()
 
bool InBattleground () const
 
bool InArena () const
 
uint32 GetBattlegroundId () const
 
BattlegroundTypeId GetBattlegroundTypeId () const
 
uint32 GetCurrentBattlegroundQueueSlot () const
 
bool IsInvitedForBattlegroundInstance () const
 
bool IsCurrentBattlegroundRandom () const
 
BGDataGetBGData ()
 
void SetBGData (BGData &bgdata)
 
BattlegroundGetBattleground (bool create=false) const
 
bool InBattlegroundQueue (bool ignoreArena=false) const
 
bool IsDeserter () const
 
BattlegroundQueueTypeId GetBattlegroundQueueTypeId (uint32 index) const
 
uint32 GetBattlegroundQueueIndex (BattlegroundQueueTypeId bgQueueTypeId) const
 
bool IsInvitedForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId) const
 
bool InBattlegroundQueueForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId) const
 
void SetBattlegroundId (uint32 id, BattlegroundTypeId bgTypeId, uint32 queueSlot, bool invited, bool isRandom, TeamId teamId)
 
uint32 AddBattlegroundQueueId (BattlegroundQueueTypeId val)
 
bool HasFreeBattlegroundQueueId () const
 
void RemoveBattlegroundQueueId (BattlegroundQueueTypeId val)
 
void SetInviteForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId, uint32 instanceId)
 
bool IsInvitedForBattlegroundInstance (uint32 instanceId) const
 
TeamId GetBgTeamId () const
 
void LeaveBattleground (Battleground *bg=nullptr)
 
bool CanJoinToBattleground () const
 
bool CanReportAfkDueToLimit ()
 
void ReportedAfkBy (Player *reporter)
 This player has been blamed to be inactive in a battleground. More...
 
void ClearAfkReports ()
 
bool GetBGAccessByLevel (BattlegroundTypeId bgTypeId) const
 
bool CanUseBattlegroundObject (GameObject *gameobject) const
 
bool isTotalImmune () const
 
bool CanCaptureTowerPoint () const
 
bool GetRandomWinner ()
 
void SetRandomWinner (bool isWinner)
 
OutdoorPvPGetOutdoorPvP () const
 
bool IsOutdoorPvPActive ()
 
bool IsImmuneToEnvironmentalDamage ()
 
uint32 EnvironmentalDamage (EnviromentalDamage type, uint32 damage)
 
void UpdateSpeakTime (ChatFloodThrottle::Index index)
 
bool CanSpeak () const
 
void UpdateFallInformationIfNeed (MovementInfo const &minfo, uint16 opcode)
 
void SetFallInformation (uint32 time, float z)
 
void HandleFall (MovementInfo const &movementInfo)
 
bool canFlyInZone (uint32 mapid, uint32 zone, SpellInfo const *bySpell)
 
void SetClientControl (Unit *target, bool allowMove, bool packetOnly=false)
 
void SetMover (Unit *target)
 
void SetSeer (WorldObject *target)
 
void SetViewpoint (WorldObject *target, bool apply)
 
WorldObjectGetViewpoint () const
 
void StopCastingCharm (Aura *except=nullptr)
 
void StopCastingBindSight (Aura *except=nullptr)
 
uint32 GetSaveTimer () const
 
void SetSaveTimer (uint32 timer)
 
void SaveRecallPosition ()
 
void SetHomebind (WorldLocation const &loc, uint32 areaId)
 
WorldLocation GetStartPosition () const
 
WorldLocation const & GetEntryPoint () const
 
void SetEntryPoint ()
 
bool HaveAtClient (WorldObject const *u) const
 
bool HaveAtClient (ObjectGuid guid) const
 
bool IsNeverVisible () const override
 
bool IsVisibleGloballyFor (Player const *player) const
 
void GetInitialVisiblePackets (Unit *target)
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void UpdateVisibilityForPlayer (bool mapChange=false)
 
void UpdateVisibilityOf (WorldObject *target)
 
void UpdateTriggerVisibility ()
 
template<class T >
void UpdateVisibilityOf (T *target, UpdateData &data, std::vector< Unit * > &visibleNow)
 
bool HasAtLoginFlag (AtLoginFlags f) const
 
void SetAtLoginFlag (AtLoginFlags f)
 
void RemoveAtLoginFlag (AtLoginFlags flags, bool persist=false)
 
bool isUsingLfg ()
 
bool inRandomLfgDungeon ()
 
uint32 GetTemporaryUnsummonedPetNumber () const
 
void SetTemporaryUnsummonedPetNumber (uint32 petnumber)
 
void UnsummonPetTemporaryIfAny ()
 
void ResummonPetTemporaryUnSummonedIfAny ()
 
bool IsPetNeedBeTemporaryUnsummoned () const
 
bool CanResummonPet (uint32 spellid)
 
void SendCinematicStart (uint32 CinematicSequenceId) const
 
void SendMovieStart (uint32 MovieId)
 
uint32 DoRandomRoll (uint32 minimum, uint32 maximum)
 
uint16 GetMaxSkillValueForLevel () const
 
bool IsFFAPvP ()
 
bool IsPvP ()
 
void UpdateHomebindTime (uint32 time)
 
void BindToInstance ()
 
void SetPendingBind (uint32 instanceId, uint32 bindTimer)
 
bool HasPendingBind () const
 
uint32 GetPendingBind () const
 
void SendRaidInfo ()
 
void SendSavedInstances ()
 
void PrettyPrintRequirementsQuestList (const std::vector< const ProgressionRequirement * > &missingQuests) const
 
void PrettyPrintRequirementsAchievementsList (const std::vector< const ProgressionRequirement * > &missingAchievements) const
 
void PrettyPrintRequirementsItemsList (const std::vector< const ProgressionRequirement * > &missingItems) const
 
bool Satisfy (DungeonProgressionRequirements const *ar, uint32 target_map, bool report=false)
 
bool CheckInstanceLoginValid ()
 
bool CheckInstanceCount (uint32 instanceId) const
 
void AddInstanceEnterTime (uint32 instanceId, time_t enterTime)
 
uint32 GetLastPetNumber () const
 
void SetLastPetNumber (uint32 petnumber)
 
uint32 GetLastPetSpell () const
 
void SetLastPetSpell (uint32 petspell)
 
GroupGetGroupInvite ()
 
void SetGroupInvite (Group *group)
 
GroupGetGroup ()
 
const GroupGetGroup () const
 
GroupReferenceGetGroupRef ()
 
void SetGroup (Group *group, int8 subgroup=-1)
 
uint8 GetSubGroup () const
 
uint32 GetGroupUpdateFlag () const
 
void SetGroupUpdateFlag (uint32 flag)
 
uint64 GetAuraUpdateMaskForRaid () const
 
void SetAuraUpdateMaskForRaid (uint8 slot)
 
PlayerGetNextRandomRaidMember (float radius)
 
PartyResult CanUninviteFromGroup (ObjectGuid targetPlayerGUID=ObjectGuid::Empty) const
 
void SetBattlegroundOrBattlefieldRaid (Group *group, int8 subgroup=-1)
 
void RemoveFromBattlegroundOrBattlefieldRaid ()
 
GroupGetOriginalGroup ()
 
GroupReferenceGetOriginalGroupRef ()
 
uint8 GetOriginalSubGroup () const
 
void SetOriginalGroup (Group *group, int8 subgroup=-1)
 
void SetPassOnGroupLoot (bool bPassOnGroupLoot)
 
bool GetPassOnGroupLoot () const
 
MapReferenceGetMapRef ()
 
void SetMap (Map *map) override
 
void ResetMap () override
 
bool CanTeleport ()
 
void SetCanTeleport (bool value)
 
bool CanKnockback ()
 
void SetCanKnockback (bool value)
 
bool isAllowedToLoot (Creature const *creature)
 
DeclinedName const * GetDeclinedNames () const
 
uint8 GetRunesState () const
 
RuneType GetBaseRune (uint8 index) const
 
RuneType GetCurrentRune (uint8 index) const
 
uint32 GetRuneCooldown (uint8 index) const
 
uint32 GetGracePeriod (uint8 index) const
 
uint32 GetRuneBaseCooldown (uint8 index, bool skipGrace)
 
bool IsBaseRuneSlotsOnCooldown (RuneType runeType) const
 
RuneType GetLastUsedRune ()
 
void SetLastUsedRune (RuneType type)
 
void SetBaseRune (uint8 index, RuneType baseRune)
 
void SetCurrentRune (uint8 index, RuneType currentRune)
 
void SetRuneCooldown (uint8 index, uint32 cooldown)
 
void SetGracePeriod (uint8 index, uint32 period)
 
void SetRuneConvertAura (uint8 index, AuraEffect const *aura)
 
void AddRuneByAuraEffect (uint8 index, RuneType newType, AuraEffect const *aura)
 
void RemoveRunesByAuraEffect (AuraEffect const *aura)
 
void RestoreBaseRune (uint8 index)
 
void ConvertRune (uint8 index, RuneType newType)
 
void ResyncRunes (uint8 count)
 
void AddRunePower (uint8 index)
 
void InitRunes ()
 
void SendRespondInspectAchievements (Player *player) const
 
bool HasAchieved (uint32 achievementId) const
 
void ResetAchievements ()
 
void CheckAllAchievementCriteria ()
 
void ResetAchievementCriteria (AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
 
void UpdateAchievementCriteria (AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
 
void StartTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
 
void RemoveTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry)
 
void CompletedAchievement (AchievementEntry const *entry)
 
AchievementMgrGetAchievementMgr () const
 
void SetCreationTime (Seconds creationTime)
 
Seconds GetCreationTime () const
 
bool HasTitle (uint32 bitIndex) const
 
bool HasTitle (CharTitlesEntry const *title) const
 
void SetTitle (CharTitlesEntry const *title, bool lost=false)
 
void SetCurrentTitle (CharTitlesEntry const *title, bool clear=false)
 
bool CanSeeSpellClickOn (Creature const *creature) const
 
bool CanSeeVendor (Creature const *creature) const
 
uint32 GetChampioningFaction () const
 
void SetChampioningFaction (uint32 faction)
 
float GetAverageItemLevel ()
 
float GetAverageItemLevelForDF ()
 
void ClearWhisperWhiteList ()
 
void AddWhisperWhiteList (ObjectGuid guid)
 
bool IsInWhisperWhiteList (ObjectGuid guid)
 
void RemoveFromWhisperWhiteList (ObjectGuid guid)
 
bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true) override
 
bool SetCanFly (bool apply, bool packetOnly=false) override
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity(). More...
 
bool SetWaterWalking (bool apply, bool packetOnly=false) override
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players. More...
 
bool SetFeatherFall (bool apply, bool packetOnly=false) override
 
bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true) override
 
bool CanFly () const override
 
bool CanEnterWater () const override
 
void AdditionalSavingAddMask (uint8 mask)
 
bool IsSpectator () const
 
void SetIsSpectator (bool on)
 
bool NeedSendSpectatorData () const
 
void SetPendingSpectatorForBG (uint32 bgInstanceId)
 
bool HasPendingSpectatorForBG (uint32 bgInstanceId) const
 
void SetPendingSpectatorInviteInstanceId (uint32 bgInstanceId)
 
uint32 GetPendingSpectatorInviteInstanceId () const
 
bool HasReceivedSpectatorResetFor (ObjectGuid guid)
 
void ClearReceivedSpectatorResetFor ()
 
void AddReceivedSpectatorResetFor (ObjectGuid guid)
 
void RemoveReceivedSpectatorResetFor (ObjectGuid guid)
 
void setRuneWeaponGUID (ObjectGuid guid)
 
ObjectGuid getRuneWeaponGUID ()
 
bool CanSeeDKPet () const
 
void SetShowDKPet (bool on)
 
void PrepareCharmAISpells ()
 
bool NeedToSaveGlyphs ()
 
void SetNeedToSaveGlyphs (bool val)
 
uint32 GetMountBlockId ()
 
void SetMountBlockId (uint32 mount)
 
float GetRealParry () const
 
float GetRealDodge () const
 
const PlayerTalentMapGetTalentMap () const
 
uint32 GetNextSave () const
 
SpellModList const & GetSpellModList (uint32 type) const
 
void SetServerSideVisibility (ServerSideVisibilityType type, AccountTypes sec)
 
void SetServerSideVisibilityDetect (ServerSideVisibilityType type, AccountTypes sec)
 
void SetFarSightDistance (float radius)
 
void ResetFarSightDistance ()
 
Optional< float > GetFarSightDistance () const
 
float GetSightRange (WorldObject const *target=nullptr) const override
 
std::string GetPlayerName ()
 
PlayerSetting GetPlayerSetting (std::string source, uint8 index)
 
void UpdatePlayerSetting (std::string source, uint8 index, uint32 value)
 
void SendSystemMessage (std::string_view msg, bool escapeCharacters=false)
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from Unit
 ~Unit () override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
void Update (uint32 time) override
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells. More...
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client. More...
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop() More...
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead. More...
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
bool CanFreeMove () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
uint32 GetResistance (SpellSchools school) const
 
uint32 GetResistance (SpellSchoolMask mask) const
 
void SetResistance (SpellSchools school, int32 val)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
float GetHealthPct () const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
float GetPowerPct (Powers power) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
int32 GetHealthGain (int32 dVal)
 
Powers getPowerType () const
 
void setPowerType (Powers power)
 
virtual bool HasActivePowerType (Powers power)
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h. More...
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h. More...
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only. More...
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h. More...
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint32 GetFaction () const
 
void SetFaction (uint32 faction)
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
bool IsContestedGuard () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
void HandleEmoteCommand (uint32 emoteId)
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
bool CanUseAttackType (uint8 attacktype) const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
NPCFlags GetNpcFlags () const
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
bool IsCritter () const
 
bool IsInFlight () const
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
virtual bool HasSpell (uint32) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
bool HasStealthAura () const
 
bool HasInvisibilityAura () const
 
bool isFeared () const
 
bool isInRoots () const
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
void DeMorph ()
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client. More...
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client. More...
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
void SendMovementFlagUpdate (bool self=false)
 
virtual bool SetWalk (bool enable)
 
virtual bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true)
 
virtual bool SetSwim (bool enable)
 
virtual bool SetCanFly (bool enable, bool packetOnly=false)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity(). More...
 
virtual bool SetWaterWalking (bool enable, bool packetOnly=false)
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players. More...
 
virtual bool SetFeatherFall (bool enable, bool packetOnly=false)
 
virtual bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
PlayerGetSpellModOwner () const
 
UnitGetOwner () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
PlayerGetAffectingPlayer () const
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void SetCharm (Unit *target, bool apply)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void RemoveCharmedBy (Unit *charmer)
 
void RestoreFaction ()
 
UnitGetFirstControlled () const
 
void RemoveAllControlled (bool onDeath=false)
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
void DeleteCharmInfo ()
 
void UpdateCharmAI ()
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
void RemoveBindSightAuras ()
 
void RemoveCharmAuras ()
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
void InitStatBuffMods ()
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
void SetCreateStat (Stats stat, float val)
 
void SetCreateHealth (uint32 val)
 
uint32 GetCreateHealth () const
 
void SetCreateMana (uint32 val)
 
uint32 GetCreateMana () const
 
uint32 GetCreatePowers (Powers power) const
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
float GetCreateStat (Stats stat) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool IsMovementPreventedByCasting () const
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsInFeralForm () const
 
bool IsInDisallowedMountForm () const
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
bool CanModifyStats () const
 
void SetCanModifyStats (bool modifyStats)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
bool CanHaveThreatList () const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
void UnsummonAllTotems (bool onDeath=false)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------— More...
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline. More...
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 --------—Combo point system----------------— More...
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void SendComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SendPetActionFeedback (uint8 msg)
 -------—Pet responses methods--------------— More...
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void propagateSpeedChange ()
 -------—End of Pet responses methods-------— More...
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
void UpdateAuraForGroup (uint8 slot)
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId) const
 
uint32 GetModelForTotem (PlayerTotemType totemType)
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
ObjectGuid GetTransGUID () const override
 
TransportBaseGetDirectTransport () const
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle) More...
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void BuildMovementPacket (ByteBuffer *data) const
 
virtual bool CanSwim () const
 this method checks the current flag of a unit More...
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
float GetHoverHeight () const
 
virtual bool CanEnterWater () const =0
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
virtual float GetFollowAngle () const
 
void OutDebugInfo () const
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
bool CanApplyResilience () const
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, Unit *caster) const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
float GetCollisionHeight () const override
 Return collision height sent to client. More...
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
std::string GetDebugInfo () const override
 
uint32 GetOldFactionId () const
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
virtual void Update (uint32)
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
virtual float GetCombatReach () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
virtual void SetPhaseMask (uint32 newPhaseMask, bool update)
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void CleanupsBeforeDelete (bool finalCleanup=true)
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
virtual uint8 getLevelForTarget (WorldObject const *) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
void DestroyForNearbyPlayers ()
 
virtual void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false)
 
void BuildUpdate (UpdateDataMapType &data_map, UpdatePlayerSet &player_set) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
bool IsFarVisible () const
 
bool IsVisibilityOverridden () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
void SetWorldObject (bool apply)
 
bool IsPermanentWorldObject () const
 
bool IsWorldObject () const
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
virtual ObjectGuid GetTransGUID () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim. More...
 
virtual float GetCollisionHeight () const
 
virtual float GetCollisionWidth () const
 
virtual float GetCollisionRadius () const
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
virtual void AddToWorld ()
 
virtual void RemoveFromWorld ()
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
virtual uint32 GetDynamicFlags () const
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
virtual void ReplaceAllDynamicFlags (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
virtual void BuildUpdate (UpdateDataMapType &, UpdatePlayerSet &)
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual std::string GetDebugInfo () const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
std::string ToString () const
 
- Public Member Functions inherited from GridObject< Player >
bool IsInGrid () const
 
void AddToGrid (GridRefMgr< Player > &m)
 
void RemoveFromGrid ()
 

Static Public Member Functions

static bool BuildEnumData (PreparedQueryResult result, WorldPacket *data)
 
static uint8 GetAttackBySlot (uint8 slot)
 
static bool IsInventoryPos (uint16 pos)
 
static bool IsInventoryPos (uint8 bag, uint8 slot)
 
static bool IsEquipmentPos (uint16 pos)
 
static bool IsEquipmentPos (uint8 bag, uint8 slot)
 
static bool IsBagPos (uint16 pos)
 
static bool IsBankPos (uint16 pos)
 
static bool IsBankPos (uint8 bag, uint8 slot)
 
static uint32 GetDefaultGossipMenuForSource (WorldObject *source)
 
static uint32 GetZoneIdFromDB (ObjectGuid guid)
 
static bool LoadPositionFromDB (uint32 &mapid, float &x, float &y, float &z, float &o, bool &in_flight, ObjectGuid::LowType guid)
 
static bool IsValidGender (uint8 Gender)
 
static void Customize (CharacterCustomizeInfo const *customizeInfo, CharacterDatabaseTransaction trans)
 
static void SavePositionInDB (uint32 mapid, float x, float y, float z, float o, uint32 zone, ObjectGuid guid)
 
static void SavePositionInDB (WorldLocation const &loc, uint16 zoneId, ObjectGuid guid, CharacterDatabaseTransaction trans)
 
static void DeleteFromDB (ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally)
 
static void DeleteOldCharacters ()
 
static void DeleteOldCharacters (uint32 keepDays)
 
static void RemoveFromGroup (Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
 
static void RemovePetitionsAndSigns (ObjectGuid guid, uint32 type)
 
static uint32 GetArenaTeamIdFromDB (ObjectGuid guid, uint8 slot)
 
static void LeaveAllArenaTeams (ObjectGuid guid)
 
static void ResetInstances (ObjectGuid guid, uint8 method, bool isRaid)
 Reset all solo instances and optionally send a message on success for each. More...
 
static void OfflineResurrect (ObjectGuid const guid, CharacterDatabaseTransaction trans)
 
static TeamId TeamIdForRace (uint8 race)
 
static DrunkenState GetDrunkenstateByValue (uint8 value)
 
- Static Public Member Functions inherited from Unit
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

std::string autoReplyMsg
 
PlayerTaxi m_taxi
 
time_t m_logintime
 
time_t m_Last_tick
 
uint32 m_Played_time [MAX_PLAYED_TIME_INDEX]
 
bool m_mailsUpdated
 
uint8 unReadMails
 
time_t m_nextMailDelivereTime
 
ItemMap mMitems
 
PvPInfo pvpInfo
 
std::unique_ptr< DuelInfoduel
 
PlayerMenuPlayerTalkClass
 
std::vector< ItemSetEffect * > ItemSetEff
 
SafeUnitPointer m_mover
 
WorldObjectm_seer
 
std::set< Unit * > m_isInSharedVisionOf
 
uint32 m_recallMap
 
float m_recallX
 
float m_recallY
 
float m_recallZ
 
float m_recallO
 
uint32 m_homebindMapId
 
uint16 m_homebindAreaId
 
float m_homebindX
 
float m_homebindY
 
float m_homebindZ
 
GuidUnorderedSet m_clientGUIDs
 
std::vector< Unit * > m_newVisible
 
uint8 m_forced_speed_changes [MAX_MOVE_TYPE]
 
DFQuestsDoneList m_DFQuests
 
uint32 m_HomebindTimer
 
bool m_InstanceValid
 
Spellm_spellModTakingSpell
 
bool isDebugAreaTriggers
 
uint32 m_pendingSpectatorForBG
 
uint32 m_pendingSpectatorInviteInstanceId
 
GuidSet m_receivedSpectatorResetFor
 
ObjectGuid m_drwGUID
 
uint32 m_charmUpdateTimer
 
- Public Attributes inherited from Unit
uint32 m_extraAttacks
 
bool m_canDualWield
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
EventProcessor m_Events
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ElunaEventProcessor * elunaEvents
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Static Public Attributes

static std::unordered_map< int, bgZoneRefbgZoneIdToFillWorldStates = {}
 

Protected Types

typedef std::set< uint32QuestSet
 
typedef std::set< uint32SeasonalQuestSet
 
typedef std::unordered_map< uint32, SeasonalQuestSetSeasonalEventQuestMap
 
typedef std::list< Channel * > JoinedChannelsList
 
- Protected Types inherited from Unit
typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

void _LoadActions (PreparedQueryResult result)
 
void _LoadAuras (PreparedQueryResult result, uint32 timediff)
 
void _LoadGlyphAuras ()
 
void _LoadInventory (PreparedQueryResult result, uint32 timeDiff)
 
void _LoadMail (PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult)
 
void _LoadQuestStatus (PreparedQueryResult result)
 
void _LoadQuestStatusRewarded (PreparedQueryResult result)
 
void _LoadDailyQuestStatus (PreparedQueryResult result)
 
void _LoadWeeklyQuestStatus (PreparedQueryResult result)
 
void _LoadMonthlyQuestStatus (PreparedQueryResult result)
 
void _LoadSeasonalQuestStatus (PreparedQueryResult result)
 
void _LoadRandomBGStatus (PreparedQueryResult result)
 
void _LoadGroup ()
 
void _LoadSkills (PreparedQueryResult result)
 
void _LoadSpells (PreparedQueryResult result)
 
void _LoadFriendList (PreparedQueryResult result)
 
bool _LoadHomeBind (PreparedQueryResult result)
 
void _LoadDeclinedNames (PreparedQueryResult result)
 
void _LoadArenaTeamInfo ()
 
void _LoadEquipmentSets (PreparedQueryResult result)
 
void _LoadEntryPointData (PreparedQueryResult result)
 
void _LoadGlyphs (PreparedQueryResult result)
 
void _LoadTalents (PreparedQueryResult result)
 
void _LoadInstanceTimeRestrictions (PreparedQueryResult result)
 
void _LoadBrewOfTheMonth (PreparedQueryResult result)
 
void _LoadCharacterSettings (PreparedQueryResult result)
 
void _LoadPetStable (uint8 petStableSlots, PreparedQueryResult result)
 
void _SaveActions (CharacterDatabaseTransaction trans)
 
void _SaveAuras (CharacterDatabaseTransaction trans, bool logout)
 
void _SaveInventory (CharacterDatabaseTransaction trans)
 
void _SaveMail (CharacterDatabaseTransaction trans)
 
void _SaveQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveDailyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveWeeklyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveMonthlyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveSeasonalQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveSpells (CharacterDatabaseTransaction trans)
 
void _SaveEquipmentSets (CharacterDatabaseTransaction trans)
 
void _SaveEntryPoint (CharacterDatabaseTransaction trans)
 
void _SaveGlyphs (CharacterDatabaseTransaction trans)
 
void _SaveTalents (CharacterDatabaseTransaction trans)
 
void _SaveStats (CharacterDatabaseTransaction trans)
 
void _SaveCharacter (bool create, CharacterDatabaseTransaction trans)
 
void _SaveInstanceTimeRestrictions (CharacterDatabaseTransaction trans)
 
void _SavePlayerSettings (CharacterDatabaseTransaction trans)
 
void HandleSobering ()
 The player sobers by 1% every 9 seconds. More...
 
void SendMirrorTimer (MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen)
 
void StopMirrorTimer (MirrorTimerType Type)
 
void HandleDrowning (uint32 time_diff)
 
int32 getMaxTimer (MirrorTimerType timer)
 
void outDebugValues () const
 
void SendQuestGiverStatusMultiple ()
 
bool CanAlwaysSee (WorldObject const *obj) const override
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
- Protected Member Functions inherited from Unit
 Unit (bool isWorldObject)
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool isStun=false)
 
- Protected Member Functions inherited from WorldObject
 WorldObject (bool isWorldObject)
 
virtual void ProcessPositionDataChanged (PositionFullTerrainStatus const &data)
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsAlwaysVisibleFor (WorldObject const *) const
 
virtual bool IsInvisibleDueToDespawn () const
 
virtual bool IsAlwaysDetectableFor (WorldObject const *) const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
virtual void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target)
 
virtual void AddToObjectUpdate ()=0
 
virtual void RemoveFromObjectUpdate ()=0
 
void AddToObjectUpdateIfNeeded ()
 

Static Protected Member Functions

static Item_LoadMailedItem (ObjectGuid const &playerGuid, Player *player, uint32 mailId, Mail *mail, Field *fields)
 

Protected Attributes

WhisperListContainer WhisperList
 
bool m_NeedToSaveGlyphs
 
uint32 m_MountBlockId
 
float m_realDodge
 
float m_realParry
 
uint32 m_charmAISpells [NUM_CAI_SPELLS]
 
uint32 m_AreaID
 
uint32 m_regenTimerCount
 
uint32 m_foodEmoteTimerCount
 
float m_powerFraction [MAX_POWERS]
 
uint32 m_contestedPvPTimer
 
std::array< BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES_BgBattlegroundQueueID
 
BGData m_bgData
 
bool m_IsBGRandomWinner
 
EntryPointData m_entryPointData
 
QuestSet m_timedquests
 
QuestSet m_weeklyquests
 
QuestSet m_monthlyquests
 
SeasonalEventQuestMap m_seasonalquests
 
ObjectGuid m_divider
 
uint32 m_ingametime
 
time_t m_lastHonorUpdateTime
 
ObjectGuid m_lootGuid
 
TeamId m_team
 
uint32 m_nextSave
 
uint16 m_additionalSaveTimer
 
uint8 m_additionalSaveMask
 
uint16 m_hostileReferenceCheckTimer
 
std::array< ChatFloodThrottle, ChatFloodThrottle::MAXm_chatFloodData
 
Difficulty m_dungeonDifficulty
 
Difficulty m_raidDifficulty
 
Difficulty m_raidMapDifficulty
 
uint32 m_atLoginFlags
 
Itemm_items [PLAYER_SLOTS_COUNT]
 
uint32 m_currentBuybackSlot
 
std::vector< Item * > m_itemUpdateQueue
 
bool m_itemUpdateQueueBlocked
 
uint32 m_ExtraFlags
 
QuestStatusMap m_QuestStatus
 
QuestStatusSaveMap m_QuestStatusSave
 
RewardedQuestSet m_RewardedQuests
 
QuestStatusSaveMap m_RewardedQuestsSave
 
SkillStatusMap mSkillStatus
 
uint32 m_GuildIdInvited
 
uint32 m_ArenaTeamIdInvited
 
PlayerMails m_mail
 
PlayerSpellMap m_spells
 
PlayerTalentMap m_talents
 
uint32 m_lastPotionId
 
GlobalCooldownMgr m_GlobalCooldownMgr
 
uint8 m_activeSpec
 
uint8 m_specsCount
 
uint32 m_Glyphs [MAX_TALENT_SPECS][MAX_GLYPH_SLOT_INDEX]
 
ActionButtonList m_actionButtons
 
float m_auraBaseMod [BASEMOD_END][MOD_END]
 
int32 m_baseRatingValue [MAX_COMBAT_RATING]
 
uint32 m_baseSpellPower
 
uint32 m_baseFeralAP
 
uint32 m_baseManaRegen
 
uint32 m_baseHealthRegen
 
int32 m_spellPenetrationItemMod
 
SpellModList m_spellMods [MAX_SPELLMOD]
 
EnchantDurationList m_enchantDuration
 
ItemDurationList m_itemDuration
 
ItemDurationList m_itemSoulboundTradeable
 
std::mutex m_soulboundTradableLock
 
ObjectGuid m_resurrectGUID
 
uint32 m_resurrectMap
 
float m_resurrectX
 
float m_resurrectY
 
float m_resurrectZ
 
uint32 m_resurrectHealth
 
uint32 m_resurrectMana
 
WorldSessionm_session
 
JoinedChannelsList m_channels
 
uint8 m_cinematic
 
TradeDatam_trade
 
bool m_DailyQuestChanged
 
bool m_WeeklyQuestChanged
 
bool m_MonthlyQuestChanged
 
bool m_SeasonalQuestChanged
 
time_t m_lastDailyQuestTime
 
uint32 m_drunkTimer
 
uint32 m_weaponChangeTimer
 
uint32 m_zoneUpdateId
 
uint32 m_zoneUpdateTimer
 
uint32 m_areaUpdateId
 
uint32 m_deathTimer
 
time_t m_deathExpireTime
 
uint32 m_WeaponProficiency
 
uint32 m_ArmorProficiency
 
bool m_canParry
 
bool m_canBlock
 
bool m_canTitanGrip
 
uint8 m_swingErrorMsg
 
float m_ammoDPS
 
time_t _restTime
 
uint32 _innTriggerId
 
float _restBonus
 
uint32 _restFlagMask
 
uint32 m_resetTalentsCost
 
time_t m_resetTalentsTime
 
uint32 m_usedTalentCount
 
uint32 m_questRewardTalentCount
 
uint32 m_extraBonusTalentCount
 
PlayerSocialm_social
 
GroupReference m_group
 
GroupReference m_originalGroup
 
Groupm_groupInvite
 
uint32 m_groupUpdateMask
 
uint64 m_auraRaidUpdateMask
 
bool m_bPassOnGroupLoot
 
uint32 m_lastpetnumber
 
time_t m_summon_expire
 
uint32 m_summon_mapid
 
float m_summon_x
 
float m_summon_y
 
float m_summon_z
 
bool m_summon_asSpectator
 
DeclinedNamem_declinedname
 
Runesm_runes
 
EquipmentSets m_EquipmentSets
 
uint8 m_grantableLevels
 
bool m_needZoneUpdate
 
- Protected Attributes inherited from Unit
UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
uint32 m_rootTimes
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
bool m_isFarVisible
 
Optional< float > m_visibilityDistanceOverride
 
const bool m_isWorldObject
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union {
   int32 *   m_int32Values
 
   uint32 *   m_uint32Values
 
   float *   m_floatValues
 
}; 
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef GuidSet RefundableItemsSet
 

Private Member Functions

InventoryResult CanStoreItem_InSpecificSlot (uint8 bag, uint8 slot, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool swap, Item *pSrcItem) const
 
InventoryResult CanStoreItem_InBag (uint8 bag, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, bool non_specialized, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
 
InventoryResult CanStoreItem_InInventorySlots (uint8 slot_begin, uint8 slot_end, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
 
Item_StoreItem (uint16 pos, Item *pItem, uint32 count, bool clone, bool update)
 
Item_LoadItem (CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field *fields)
 
void SendRefundInfo (Item *item)
 
void RefundItem (Item *item)
 
void AddKnownCurrency (uint32 itemId)
 
void AdjustQuestReqItemCount (Quest const *quest, QuestStatusData &questStatusData)
 
bool MustDelayTeleport () const
 
void SetMustDelayTeleport (bool setting)
 
bool HasDelayedTeleport () const
 
void SetHasDelayedTeleport (bool setting)
 
void UpdateCharmedAI ()
 

Private Attributes

CinematicMgr_cinematicMgr
 
RefundableItemsSet m_refundableItems
 
MapReference m_mapRef
 
uint32 m_lastFallTime
 
float m_lastFallZ
 
int32 m_MirrorTimer [MAX_TIMERS]
 
uint8 m_MirrorTimerFlags
 
uint8 m_MirrorTimerFlagsLast
 
bool m_isInWater
 
WorldLocation teleportStore_dest
 
uint32 teleportStore_options
 
time_t mSemaphoreTeleport_Near
 
time_t mSemaphoreTeleport_Far
 
uint32 m_DelayedOperations
 
bool m_bMustDelayTeleport
 
bool m_bHasDelayedTeleport
 
bool m_canTeleport
 
bool m_canKnockback
 
std::unique_ptr< PetStablem_petStable
 
uint32 m_temporaryUnsummonedPetNumber
 
uint32 m_oldpetspell
 
AchievementMgrm_achievementMgr
 
ReputationMgrm_reputationMgr
 
SpellCooldowns m_spellCooldowns
 
uint32 m_ChampioningFaction
 
InstanceTimeMap _instanceResetTimes
 
uint32 _pendingBindId
 
uint32 _pendingBindTimer
 
uint32 _activeCheats
 
uint32 healthBeforeDuel
 
uint32 manaBeforeDuel
 
bool m_isInstantFlightOn
 
uint32 m_flightSpellActivated
 
WorldLocation _corpseLocation
 
Optional< float > _farSightDistance = { }
 
bool _wasOutdoor
 
PlayerSettingMap m_charSettingsMap
 
Seconds m_creationTime
 

Friends

class WorldSession
 
class CinematicMgr
 
void Item::AddToUpdateQueueOf (Player *player)
 
void Item::RemoveFromUpdateQueueOf (Player *player)
 

Detailed Description

Member Typedef Documentation

◆ DFQuestsDoneList

typedef std::set<uint32> Player::DFQuestsDoneList

◆ ItemMap

typedef std::unordered_map<ObjectGuid::LowType, Item*> Player::ItemMap

◆ JoinedChannelsList

typedef std::list<Channel*> Player::JoinedChannelsList
protected

◆ QuestSet

typedef std::set<uint32> Player::QuestSet
protected

◆ RefundableItemsSet

◆ SeasonalEventQuestMap

typedef std::unordered_map<uint32, SeasonalQuestSet> Player::SeasonalEventQuestMap
protected

◆ SeasonalQuestSet

typedef std::set<uint32> Player::SeasonalQuestSet
protected

Constructor & Destructor Documentation

◆ Player()

Player::Player ( WorldSession session)
explicit
146 : Unit(true), m_mover(this)
147{
148#ifdef _MSC_VER
149#pragma warning(default:4355)
150#endif
151
154
156
157 m_session = session;
158
159 m_ingametime = 0;
160
161 m_ExtraFlags = 0;
162
163 m_spellModTakingSpell = nullptr;
164 //m_pad = 0;
165
166 // players always accept
168 SetAcceptWhispers(true);
169
173
174 m_regenTimer = 0;
178
181
182 m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
183
184 m_areaUpdateId = 0;
186
187 m_needZoneUpdate = false;
188
192
194
195 memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT);
196
197 m_social = nullptr;
198
199 // group is initialized in the reference constructor
200 SetGroupInvite(nullptr);
203 m_bPassOnGroupLoot = false;
204
207
209
212
214 m_bMustDelayTeleport = false;
215 m_bHasDelayedTeleport = false;
217 m_canTeleport = false;
218 m_canKnockback = false;
219
220 m_trade = nullptr;
221
222 m_cinematic = 0;
223
226
227 m_DailyQuestChanged = false;
229
230 for (uint8 i = 0; i < MAX_TIMERS; i++)
232
235 m_isInWater = false;
236 m_drunkTimer = 0;
237 m_deathTimer = 0;
239
241
242 m_swingErrorMsg = 0;
243
244 for (uint8 j = 0; j < PLAYER_MAX_BATTLEGROUND_QUEUES; ++j)
245 {
247 _BgBattlegroundQueueID[j].invitedToInstance = 0;
248 }
249
256 m_canParry = false;
257 m_canBlock = false;
258 m_canTitanGrip = false;
259 m_ammoDPS = 0.0f;
260
262 //cache for UNIT_CREATED_BY_SPELL to allow
263 //returning reagents for temporarily removed pets
264 //when dying/logging out
265 m_oldpetspell = 0;
266 m_lastpetnumber = 0;
267
269 _restTime = 0;
270 _innTriggerId = 0;
271 _restBonus = 0;
272 _restFlagMask = 0;
274
275 m_mailsUpdated = false;
276 unReadMails = 0;
277 m_nextMailDelivereTime = time_t(0);
278
282
283 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
285
287
288 m_HomebindTimer = 0;
289 m_InstanceValid = true;
293
294 m_lastPotionId = 0;
295
296 m_activeSpec = 0;
297 m_specsCount = 1;
298
299 for (uint8 i = 0; i < MAX_TALENT_SPECS; ++i)
300 {
301 for (uint8 g = 0; g < MAX_GLYPH_SLOT_INDEX; ++g)
302 m_Glyphs[i][g] = 0;
303 }
304
305 for (uint8 i = 0; i < BASEMOD_END; ++i)
306 {
307 m_auraBaseMod[i][FLAT_MOD] = 0.0f;
308 m_auraBaseMod[i][PCT_MOD] = 1.0f;
309 }
310
311 for (uint8 i = 0; i < MAX_COMBAT_RATING; i++)
312 m_baseRatingValue[i] = 0;
313
315 m_baseFeralAP = 0;
316 m_baseManaRegen = 0;
319
320 // Honor System
322
323 m_IsBGRandomWinner = false;
324
325 // Player summoning
326 m_summon_expire = 0;
327 m_summon_mapid = 0;
328 m_summon_x = 0.0f;
329 m_summon_y = 0.0f;
330 m_summon_z = 0.0f;
331 m_summon_asSpectator = false;
332
333 //m_mover = this;
335 m_seer = this;
336
337 m_recallMap = 0;
338 m_recallX = 0;
339 m_recallY = 0;
340 m_recallZ = 0;
341 m_recallO = 0;
342
343 m_homebindMapId = 0;
345 m_homebindX = 0;
346 m_homebindY = 0;
347 m_homebindZ = 0;
348
350
351 m_declinedname = nullptr;
352
353 m_isActive = true;
354
355 m_runes = nullptr;
356
357 m_lastFallTime = 0;
358 m_lastFallZ = 0;
359
361
363
364 sWorld->IncreasePlayerCount();
365
367
368 for (uint8 i = 0; i < MAX_POWERS; ++i)
369 m_powerFraction[i] = 0;
370
371 isDebugAreaTriggers = false;
372
373 m_WeeklyQuestChanged = false;
374
375 m_MonthlyQuestChanged = false;
376
378
379 SetPendingBind(0, 0);
380
382
383 m_creationTime = 0s;
384
385 _cinematicMgr = new CinematicMgr(this);
386
388 m_reputationMgr = new ReputationMgr(this);
389
390 // Ours
391 m_NeedToSaveGlyphs = false;
392 m_MountBlockId = 0;
393 m_realDodge = 0.0f;
394 m_realParry = 0.0f;
397
399
400 for( int i = 0; i < NUM_CAI_SPELLS; ++i )
401 m_charmAISpells[i] = 0;
402
403 m_applyResilience = true;
404
405 m_isInstantFlightOn = true;
406
407 _wasOutdoor = true;
408 sScriptMgr->OnConstructPlayer(this);
409}
@ TYPEID_PLAYER
Definition: ObjectGuid.h:36
@ TYPEMASK_PLAYER
Definition: ObjectGuid.h:50
@ PLAYER_END
Definition: UpdateFields.h:392
@ NUM_CAI_SPELLS
Definition: Player.h:925
@ CHEAT_NONE
Definition: Player.h:998
@ BUYBACK_SLOT_START
Definition: Player.h:724
#define MAX_TIMERS
Definition: Player.h:578
#define DISABLED_MIRROR_TIMER
Definition: Player.h:579
@ PLAYED_TIME_TOTAL
Definition: Player.h:855
@ PLAYED_TIME_LEVEL
Definition: Player.h:856
@ UNDERWATER_NONE
Definition: Player.h:100
@ AT_LOGIN_NONE
Definition: Player.h:599
@ PLAYER_SLOTS_COUNT
Definition: Player.h:667
@ FLAT_MOD
Definition: Unit.h:189
@ PCT_MOD
Definition: Unit.h:190
#define MAX_COMBAT_RATING
Definition: Unit.h:244
@ BASEMOD_END
Definition: Unit.h:184
#define MAX_MOVE_TYPE
Definition: UnitDefines.h:339
#define sScriptMgr
Definition: ScriptMgr.h:709
@ CONFIG_INTERVAL_SAVE
Definition: IWorld.h:218
@ RAID_DIFFICULTY_10MAN_NORMAL
Definition: DBCEnums.h:273
@ DUNGEON_DIFFICULTY_NORMAL
Definition: DBCEnums.h:269
@ MAX_POWERS
Definition: SharedDefines.h:276
#define MAX_TALENT_SPECS
Definition: SharedDefines.h:675
#define MAX_GLYPH_SLOT_INDEX
Definition: SharedDefines.h:676
@ BATTLEGROUND_QUEUE_NONE
Definition: SharedDefines.h:3620
@ TEAM_NEUTRAL
Definition: SharedDefines.h:762
#define PLAYER_MAX_BATTLEGROUND_QUEUES
Definition: SharedDefines.h:176
std::uint8_t uint8
Definition: Define.h:109
std::uint32_t uint32
Definition: Define.h:107
#define sWorld
Definition: World.h:444
bool IsPlayerAccount(uint32 gmlevel)
Definition: AccountMgr.cpp:305
uint32 GetSecurity(uint32 accountId)
Definition: AccountMgr.cpp:238
Seconds GetGameTime()
Definition: GameTime.cpp:38
Definition: AchievementMgr.h:294
Definition: GossipDef.h:258
Definition: Item.h:220
uint16 m_objectType
Definition: Object.h:240
uint16 m_valuesCount
Definition: Object.h:254
TypeID m_objectTypeId
Definition: Object.h:242
bool m_isActive
Definition: Object.h:639
bool m_canParry
Definition: Player.h:2836
time_t m_summon_expire
Definition: Player.h:2869
bool m_needZoneUpdate
Definition: Player.h:2886
uint16 m_additionalSaveTimer
Definition: Player.h:2743
float m_ammoDPS
Definition: Player.h:2840
uint32 m_temporaryUnsummonedPetNumber
Definition: Player.h:2940
uint32 m_ChampioningFaction
Definition: Player.h:2948
bool m_bHasDelayedTeleport
Definition: Player.h:2933
bool m_InstanceValid
Definition: Player.h:2413
time_t m_deathExpireTime
Definition: Player.h:2832
ReputationMgr * m_reputationMgr
Definition: Player.h:2944
float m_auraBaseMod[BASEMOD_END][MOD_END]
Definition: Player.h:2787
float m_homebindZ
Definition: Player.h:2350
uint32 m_lastFallTime
Definition: Player.h:2917
uint32 m_lastPotionId
Definition: Player.h:2776
CinematicMgr * _cinematicMgr
Definition: Player.h:2896
bool m_canTeleport
Definition: Player.h:2934
uint32 m_usedTalentCount
Definition: Player.h:2850
friend class CinematicMgr
Definition: Player.h:1066
bool m_MonthlyQuestChanged
Definition: Player.h:2820
PlayerSocial * m_social
Definition: Player.h:2855
uint32 m_homebindMapId
Definition: Player.h:2346
Seconds m_creationTime
Definition: Player.h:2972
void SetAcceptWhispers(bool on)
Definition: Player.h:1157
float m_summon_z
Definition: Player.h:2873
time_t m_lastHonorUpdateTime
Definition: Player.h:2736
time_t _restTime
Definition: Player.h:2843
SafeUnitPointer m_mover
Definition: Player.h:2310
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition: Player.h:2377
uint32 _activeCheats
Definition: Player.h:2954
uint32 m_resetTalentsCost
Definition: Player.h:2848
uint8 m_MirrorTimerFlags
Definition: Player.h:2921
uint32 m_atLoginFlags
Definition: Player.h:2751
uint32 m_ExtraFlags
Definition: Player.h:2759
float m_recallX
Definition: Player.h:2337
uint32 m_ingametime
Definition: Player.h:2666
float m_recallO
Definition: Player.h:2340
bool m_WeeklyQuestChanged
Definition: Player.h:2819
uint8 unReadMails
Definition: Player.h:1645
uint32 m_pendingSpectatorInviteInstanceId
Definition: Player.h:2565
void SetGroupInvite(Group *group)
Definition: Player.h:2444
uint32 m_DelayedOperations
Definition: Player.h:2931
TradeData * m_trade
Definition: Player.h:2816
float m_realParry
Definition: Player.h:2622
uint32 m_nextSave
Definition: Player.h:2742
uint32 m_zoneUpdateTimer
Definition: Player.h:2828
bool m_mailsUpdated
Definition: Player.h:1581
time_t mSemaphoreTeleport_Far
Definition: Player.h:2929
float _restBonus
Definition: Player.h:2845
uint32 m_foodEmoteTimerCount
Definition: Player.h:2628
uint32 m_baseFeralAP
Definition: Player.h:2790
float m_summon_y
Definition: Player.h:2872
WorldObject * m_seer
Definition: Player.h:2311
float m_summon_x
Definition: Player.h:2871
uint32 m_charmAISpells[NUM_CAI_SPELLS]
Definition: Player.h:2624
uint8 m_additionalSaveMask
Definition: Player.h:2744
bool m_bMustDelayTeleport
Definition: Player.h:2932
bool m_SeasonalQuestChanged
Definition: Player.h:2821
TeamId m_team
Definition: Player.h:2741
uint32 m_areaUpdateId
Definition: Player.h:2829
uint8 m_specsCount
Definition: Player.h:2781
uint32 m_extraBonusTalentCount
Definition: Player.h:2852
WorldSession * GetSession() const
Definition: Player.h:1975
float m_powerFraction[MAX_POWERS]
Definition: Player.h:2629
uint32 m_oldpetspell
Definition: Player.h:2941
Runes * m_runes
Definition: Player.h:2877
uint32 m_currentBuybackSlot
Definition: Player.h:2754
uint32 m_deathTimer
Definition: Player.h:2831
uint32 m_regenTimerCount
Definition: Player.h:2627
AchievementMgr * m_achievementMgr
Definition: Player.h:2943
uint8 m_swingErrorMsg
Definition: Player.h:2839
time_t m_nextMailDelivereTime
Definition: Player.h:1646
std::array< BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES > _BgBattlegroundQueueID
Definition: Player.h:2642
void clearResurrectRequestData()
Definition: Player.h:1803
bool m_bPassOnGroupLoot
Definition: Player.h:2863
float m_recallZ
Definition: Player.h:2339
uint32 m_pendingSpectatorForBG
Definition: Player.h:2564
bool m_DailyQuestChanged
Definition: Player.h:2818
uint32 m_Glyphs[MAX_TALENT_SPECS][MAX_GLYPH_SLOT_INDEX]
Definition: Player.h:2783
Difficulty m_dungeonDifficulty
Definition: Player.h:2747
uint32 m_weaponChangeTimer
Definition: Player.h:2825
uint32 m_WeaponProficiency
Definition: Player.h:2834
float m_realDodge
Definition: Player.h:2621
bool m_canKnockback
Definition: Player.h:2935
bool m_isInstantFlightOn
Definition: Player.h:2960
time_t mSemaphoreTeleport_Near
Definition: Player.h:2928
DeclinedName * m_declinedname
Definition: Player.h:2876
bool m_IsBGRandomWinner
Definition: Player.h:2644
uint32 m_drunkTimer
Definition: Player.h:2824
uint32 m_contestedPvPTimer
Definition: Player.h:2630
float m_homebindY
Definition: Player.h:2349
uint32 m_Played_time[MAX_PLAYED_TIME_INDEX]
Definition: Player.h:1185
uint32 m_baseSpellPower
Definition: Player.h:2789
bool _wasOutdoor
Definition: Player.h:2968
void SetPendingBind(uint32 instanceId, uint32 bindTimer)
Definition: Player.h:2415
uint32 _restFlagMask
Definition: Player.h:2846
uint8 m_grantableLevels
Definition: Player.h:2884
Item * m_items[PLAYER_SLOTS_COUNT]
Definition: Player.h:2753
uint16 m_homebindAreaId
Definition: Player.h:2347
Difficulty m_raidMapDifficulty
Definition: Player.h:2749
uint32 m_zoneUpdateId
Definition: Player.h:2827
bool m_isInWater
Definition: Player.h:2923
uint8 m_MirrorTimerFlagsLast
Definition: Player.h:2922
time_t m_lastDailyQuestTime
Definition: Player.h:2822
time_t m_resetTalentsTime
Definition: Player.h:2849
uint32 m_baseHealthRegen
Definition: Player.h:2792
uint32 m_charmUpdateTimer
Definition: Player.h:2576
uint32 m_summon_mapid
Definition: Player.h:2870
Difficulty m_raidDifficulty
Definition: Player.h:2748
float m_lastFallZ
Definition: Player.h:2918
bool m_summon_asSpectator
Definition: Player.h:2874
uint32 m_baseManaRegen
Definition: Player.h:2791
time_t m_logintime
Definition: Player.h:1183
int32 m_MirrorTimer[MAX_TIMERS]
Definition: Player.h:2920
uint32 _innTriggerId
Definition: Player.h:2844
uint32 m_ArenaTeamIdInvited
Definition: Player.h:2771
uint32 m_recallMap
Definition: Player.h:2336
float m_recallY
Definition: Player.h:2338
uint32 m_questRewardTalentCount
Definition: Player.h:2851
bool m_NeedToSaveGlyphs
Definition: Player.h:2617
uint32 m_HomebindTimer
Definition: Player.h:2412
uint64 m_auraRaidUpdateMask
Definition: Player.h:2862
bool m_canTitanGrip
Definition: Player.h:2838
bool m_canBlock
Definition: Player.h:2837
uint8 m_cinematic
Definition: Player.h:2814
int32 m_spellPenetrationItemMod
Definition: Player.h:2793
uint8 m_activeSpec
Definition: Player.h:2780
WorldSession * m_session
Definition: Player.h:2809
uint32 m_flightSpellActivated
Definition: Player.h:2962
uint32 teleportStore_options
Definition: Player.h:2927
int32 m_baseRatingValue[MAX_COMBAT_RATING]
Definition: Player.h:2788
uint32 m_ArmorProficiency
Definition: Player.h:2835
bool isDebugAreaTriggers
Definition: Player.h:2533
uint32 m_groupUpdateMask
Definition: Player.h:2861
Spell * m_spellModTakingSpell
Definition: Player.h:2529
uint32 m_lastpetnumber
Definition: Player.h:2866
time_t m_Last_tick
Definition: Player.h:1184
PlayerMenu * PlayerTalkClass
Definition: Player.h:2216
uint32 m_GuildIdInvited
Definition: Player.h:2770
float m_homebindX
Definition: Player.h:2348
uint16 m_hostileReferenceCheckTimer
Definition: Player.h:2745
bool m_itemUpdateQueueBlocked
Definition: Player.h:2757
uint32 m_MountBlockId
Definition: Player.h:2619
Definition: Unit.h:630
int32 m_regenTimer
Definition: Unit.h:1871
bool m_ControlledByPlayer
Definition: Unit.h:1705
SafeUnitPointer m_movedByPlayer
Definition: Unit.h:1231
bool m_applyResilience
Definition: Unit.h:1884
void Initialize(Unit *defVal)
Definition: UnitUtils.h:51
Definition: ReputationMgr.h:58

References _activeCheats, _BgBattlegroundQueueID, _cinematicMgr, _innTriggerId, _restBonus, _restFlagMask, _restTime, _wasOutdoor, AT_LOGIN_NONE, BASEMOD_END, BATTLEGROUND_QUEUE_NONE, BUYBACK_SLOT_START, CHEAT_NONE, CinematicMgr, clearResurrectRequestData(), CONFIG_INTERVAL_SAVE, DISABLED_MIRROR_TIMER, DUNGEON_DIFFICULTY_NORMAL, FLAT_MOD, GameTime::GetGameTime(), GetSession(), SafeUnitPointer::Initialize(), isDebugAreaTriggers, AccountMgr::IsPlayerAccount(), m_achievementMgr, m_activeSpec, m_additionalSaveMask, m_additionalSaveTimer, m_ammoDPS, Unit::m_applyResilience, m_areaUpdateId, m_ArenaTeamIdInvited, m_ArmorProficiency, m_atLoginFlags, m_auraBaseMod, m_auraRaidUpdateMask, m_baseFeralAP, m_baseHealthRegen, m_baseManaRegen, m_baseRatingValue, m_baseSpellPower, m_bHasDelayedTeleport, m_bMustDelayTeleport, m_bPassOnGroupLoot, m_canBlock, m_canKnockback, m_canParry, m_canTeleport, m_canTitanGrip, m_ChampioningFaction, m_charmAISpells, m_charmUpdateTimer, m_cinematic, m_contestedPvPTimer, Unit::m_ControlledByPlayer, m_creationTime, m_currentBuybackSlot, m_DailyQuestChanged, m_deathExpireTime, m_deathTimer, m_declinedname, m_DelayedOperations, m_drunkTimer, m_dungeonDifficulty, m_extraBonusTalentCount, m_ExtraFlags, m_flightSpellActivated, m_foodEmoteTimerCount, m_forced_speed_changes, m_Glyphs, m_grantableLevels, m_groupUpdateMask, m_GuildIdInvited, m_homebindAreaId, m_homebindMapId, m_HomebindTimer, m_homebindX, m_homebindY, m_homebindZ, m_hostileReferenceCheckTimer, m_ingametime, m_InstanceValid, WorldObject::m_isActive, m_IsBGRandomWinner, m_isInstantFlightOn, m_isInWater, m_items, m_itemUpdateQueueBlocked, m_Last_tick, m_lastDailyQuestTime, m_lastFallTime, m_lastFallZ, m_lastHonorUpdateTime, m_lastpetnumber, m_lastPotionId, m_logintime, m_mailsUpdated, m_MirrorTimer, m_MirrorTimerFlags, m_MirrorTimerFlagsLast, m_MonthlyQuestChanged, m_MountBlockId, Unit::m_movedByPlayer, m_NeedToSaveGlyphs, m_needZoneUpdate, m_nextMailDelivereTime, m_nextSave, Object::m_objectType, Object::m_objectTypeId, m_oldpetspell, m_pendingSpectatorForBG, m_pendingSpectatorInviteInstanceId, m_Played_time, m_powerFraction, m_questRewardTalentCount, m_raidDifficulty, m_raidMapDifficulty, m_realDodge, m_realParry, m_recallMap, m_recallO, m_recallX, m_recallY, m_recallZ, Unit::m_regenTimer, m_regenTimerCount, m_reputationMgr, m_resetTalentsCost, m_resetTalentsTime, m_runes, m_SeasonalQuestChanged, m_seer, m_session, m_social, m_specsCount, m_spellModTakingSpell, m_spellPenetrationItemMod, m_summon_asSpectator, m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, m_swingErrorMsg, m_team, m_temporaryUnsummonedPetNumber, m_trade, m_usedTalentCount, Object::m_valuesCount, m_weaponChangeTimer, m_WeaponProficiency, m_WeeklyQuestChanged, m_zoneUpdateId, m_zoneUpdateTimer, MAX_COMBAT_RATING, MAX_GLYPH_SLOT_INDEX, MAX_MOVE_TYPE, MAX_POWERS, MAX_TALENT_SPECS, MAX_TIMERS, mSemaphoreTeleport_Far, mSemaphoreTeleport_Near, NUM_CAI_SPELLS, PCT_MOD, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER_END, PLAYER_MAX_BATTLEGROUND_QUEUES, PLAYER_SLOTS_COUNT, PlayerTalkClass, RAID_DIFFICULTY_10MAN_NORMAL, SetAcceptWhispers(), SetGroupInvite(), SetPendingBind(), sScriptMgr, sWorld, TEAM_NEUTRAL, teleportStore_options, TYPEID_PLAYER, TYPEMASK_PLAYER, UNDERWATER_NONE, and unReadMails.

◆ ~Player()

Player::~Player ( )
override
412{
413 sScriptMgr->OnDestructPlayer(this);
414
415 // it must be unloaded already in PlayerLogout and accessed only for loggined player
416 //m_social = nullptr;
417
418 // Note: buy back item already deleted from DB when player was saved
419 for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; ++i)
420 delete m_items[i];
421
422 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
423 delete itr->second;
424
425 for (PlayerTalentMap::const_iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
426 delete itr->second;
427
428 //all mailed items should be deleted, also all mail should be deallocated
429 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
430 {
431 delete *itr;
432 }
433
434 for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
435 delete iter->second; //if item is duplicated... then server may crash ... but that item should be deallocated
436
437 delete PlayerTalkClass;
438
439 for (std::size_t x = 0; x < ItemSetEff.size(); x++)
440 delete ItemSetEff[x];
441
442 delete m_declinedname;
443 delete m_runes;
444 delete m_achievementMgr;
445 delete m_reputationMgr;
446 delete _cinematicMgr;
447
448 sWorld->DecreasePlayerCount();
449
450 if (!m_isInSharedVisionOf.empty())
451 {
452 do
453 {
454 Unit* u = *(m_isInSharedVisionOf.begin());
455 u->RemovePlayerFromVision(this);
456 } while (!m_isInSharedVisionOf.empty());
457 }
458}
ItemMap mMitems
Definition: Player.h:1650
PlayerSpellMap m_spells
Definition: Player.h:2774
std::vector< ItemSetEffect * > ItemSetEff
Definition: Player.h:2217
PlayerMails m_mail
Definition: Player.h:2773
PlayerTalentMap m_talents
Definition: Player.h:2775
std::set< Unit * > m_isInSharedVisionOf
Definition: Player.h:2312
void RemovePlayerFromVision(Player *player)
Definition: Unit.cpp:11121

References _cinematicMgr, ItemSetEff, m_achievementMgr, m_declinedname, m_isInSharedVisionOf, m_items, m_mail, m_reputationMgr, m_runes, m_spells, m_talents, mMitems, PLAYER_SLOTS_COUNT, PlayerTalkClass, Unit::RemovePlayerFromVision(), sScriptMgr, and sWorld.

Member Function Documentation

◆ _addSpell()

bool Player::_addSpell ( uint32  spellId,
uint8  addSpecMask,
bool  temporary,
bool  learnFromSkill = false 
)
Todo:
confirm if rogues start wth lockpicking skill at level 1 but only recieve the spell to use it at level 16
3084{
3085 // pussywizard: this can be called to OVERWRITE currently existing spell params! usually to set active = false for lower ranks of a spell
3086
3087 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3088 if (!SpellMgr::CheckSpellValid(spellInfo, spellId, false))
3089 return false;
3090
3091 // pussywizard: already found and temporary, nothing to do
3092 PlayerSpellMap::iterator itr = m_spells.find(spellId);
3093 if (itr != m_spells.end() && itr->second->State == PLAYERSPELL_TEMPORARY)
3094 return false;
3095
3096 // xinef: send packet so client can properly recognize this new spell
3097 // xinef: ignore passive spells and spells with learn effect
3098 // xinef: send spells with no aura effects (ie dual wield)
3099 if (IsInWorld() && !isBeingLoaded() && temporary && !learnFromSkill && (!spellInfo->HasAttribute(SpellAttr0(SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) || !spellInfo->HasAnyAura()) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3100 SendLearnPacket(spellInfo->Id, true);
3101
3102 // xinef: DO NOT allow to learn spell with effect learn spell!
3103 // xinef: if spell possess spell learn effects only, learn those spells as temporary (eg. Metamorphosis, Tree of Life)
3104 if (temporary && spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3105 {
3106 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3107 if (spellInfo->Effects[i].IsEffect())
3108 {
3109 if (spellInfo->Effects[i].Effect != SPELL_EFFECT_LEARN_SPELL)
3110 {
3111 LOG_INFO("entities.player", "TRYING TO LEARN SPELL WITH EFFECT LEARN: {}, PLAYER: {}", spellId, GetGUID().ToString());
3112 return false;
3113 //ABORT();
3114 }
3115 else if (SpellInfo const* learnSpell = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
3117 }
3118
3119 return false;
3120 }
3121
3122 if (itr != m_spells.end()) // pussywizard: already know this spell, so update information
3123 {
3124 // pussywizard: do nothing if already set as wanted
3125 if (itr->second->State != PLAYERSPELL_REMOVED && (itr->second->specMask & addSpecMask) == addSpecMask)
3126 return false;
3127
3128 // pussywizard: need cast auras, learn linked spells, do professions stuff, etc.
3129 // pussywizard: but only for spells that are really added (inactive -> active OR added to current spec)
3130 bool spellIsNew = true;
3131
3132 // pussywizard: present in m_spells, not removed, already in current spec, already active
3133 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec))
3134 spellIsNew = false;
3135
3136 // pussywizard: update info in m_spells
3137 if (itr->second->State != PLAYERSPELL_NEW && (itr->second->specMask & addSpecMask) != addSpecMask)
3138 itr->second->State = PLAYERSPELL_CHANGED;
3139 itr->second->Active = true;
3140 itr->second->specMask |= addSpecMask;
3141
3142 if (!spellIsNew)
3143 return true;
3144 }
3145 else // pussywizard: not found in m_spells
3146 {
3147 PlayerSpell* newspell = new PlayerSpell;
3148 newspell->Active = true;
3150 newspell->specMask = addSpecMask;
3151
3152 m_spells[spellId] = newspell;
3153 }
3154
3155 // pussywizard: return if spell not in current spec
3156 // pussywizard: return true to fix active for ranks, this condition is true only at loading, so no problems with learning packets
3157 if (!((1 << GetActiveSpec()) & addSpecMask))
3158 return true;
3159
3160 // xinef: do not add spells with effect learn spell
3161 if (spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3162 {
3163 LOG_INFO("entities.player", "TRYING TO LEARN SPELL WITH EFFECT LEARN 2: {}, PLAYER: {}", spellId, GetGUID().ToString());
3164 m_spells.erase(spellInfo->Id); // mem leak, but should never happen
3165 return false;
3166 //ABORT();
3167 }
3168 // pussywizard: cast passive spells (including all talents without SPELL_EFFECT_LEARN_SPELL) with additional checks
3169 else if (spellInfo->IsPassive() || (spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY) && spellInfo->Stances))
3170 {
3171 if (IsNeedCastPassiveSpellAtLearn(spellInfo))
3172 CastSpell(this, spellId, true);
3173 }
3174 // pussywizard: cast and return, learnt spells will update profession count, etc.
3175 else if (spellInfo->HasEffect(SPELL_EFFECT_SKILL_STEP))
3176 {
3177 CastSpell(this, spellId, true);
3178 return false;
3179 }
3180
3181 // xinef: unapply aura stats if dont meet requirements
3182 // xinef: handle only if player is not loaded, loading is handled in loadfromdb
3183 if (!isBeingLoaded())
3184 if (Aura* aura = GetAura(spellId))
3185 {
3186 if (aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTHLESS_35_PERCENT ||
3187 aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTH_ABOVE_75_PERCENT ||
3188 aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTHLESS_20_PERCENT )
3189 if (!HasAuraState((AuraStateType)aura->GetSpellInfo()->CasterAuraState))
3190 aura->HandleAllEffects(aura->GetApplicationOfTarget(GetGUID()), AURA_EFFECT_HANDLE_REAL, false);
3191 }
3192
3193 // pussywizard: update free primary prof points
3194 if (uint32 freeProfs = GetFreePrimaryProfessionPoints())
3195 {
3196 if (spellInfo->IsPrimaryProfessionFirstRank())
3197 SetFreePrimaryProfessions(freeProfs - 1);
3198 }
3199
3200 uint16 maxskill = GetMaxSkillValueForLevel();
3201 SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spellId);
3202 SkillLineAbilityMapBounds skill_bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellId);
3203 // xinef: set appropriate skill value
3204 if (spellLearnSkill)
3205 {
3206 uint32 skill_value = GetPureSkillValue(spellLearnSkill->skill);
3207 uint32 skill_max_value = GetPureMaxSkillValue(spellLearnSkill->skill);
3208 uint32 new_skill_max_value = spellLearnSkill->maxvalue == 0 ? maxskill : spellLearnSkill->maxvalue;
3209
3210 if (skill_value < spellLearnSkill->value)
3211 skill_value = spellLearnSkill->value;
3212 if (skill_max_value < new_skill_max_value)
3213 skill_max_value = new_skill_max_value;
3214
3215 SetSkill(spellLearnSkill->skill, spellLearnSkill->step, skill_value, skill_max_value);
3216 }
3217 else
3218 {
3219 // not ranked skills
3220 for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
3221 {
3222 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine);
3223 if (!pSkill)
3224 {
3225 continue;
3226 }
3227
3229 // Added for runeforging, it is confirmed via sniff that this happens when death knights learn the spell, not on character creation.
3230 if ((_spell_idx->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->id)) || ((pSkill->id == SKILL_LOCKPICKING || pSkill->id == SKILL_RUNEFORGING) && _spell_idx->second->TrivialSkillLineRankHigh == 0))
3231 {
3232 LearnDefaultSkill(pSkill->id, 0);
3233 }
3234
3235 if (pSkill->id == SKILL_MOUNTS && !Has310Flyer(false))
3236 {
3237 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3238 {
3239 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && spellInfo->Effects[i].CalcValue() == 310)
3240 {
3241 SetHas310Flyer(true);
3242 }
3243 }
3244 }
3245 }
3246 }
3247
3248 // xinef: update achievement criteria
3249 if (!GetSession()->PlayerLoading())
3250 {
3251 for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
3252 {
3255 }
3257 }
3258
3259 return true;
3260}
DBCStorage< SkillLineEntry > sSkillLineStore(SkillLinefmt)
#define sSpellMgr
Definition: SpellMgr.h:825
std::pair< SkillLineAbilityMap::const_iterator, SkillLineAbilityMap::const_iterator > SkillLineAbilityMapBounds
Definition: SpellMgr.h:584
@ SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
Definition: SpellAuraDefines.h:270
@ AURA_EFFECT_HANDLE_REAL
Definition: SpellAuraDefines.h:42
#define SPEC_MASK_ALL
Definition: Player.h:177
@ PLAYERSPELL_REMOVED
Definition: Player.h:122
@ PLAYERSPELL_UNCHANGED
Definition: Player.h:119
@ PLAYERSPELL_CHANGED
Definition: Player.h:120
@ PLAYERSPELL_NEW
Definition: Player.h:121
@ PLAYERSPELL_TEMPORARY
Definition: Player.h:123
@ SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN
Definition: DBCEnums.h:361
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL
Definition: DBCEnums.h:148
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS
Definition: DBCEnums.h:185
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE
Definition: DBCEnums.h:218
#define MAX_SPELL_EFFECTS
Definition: DBCStructure.h:1637
@ SPELL_EFFECT_LEARN_SPELL
Definition: SharedDefines.h:814
@ SPELL_EFFECT_SKILL_STEP
Definition: SharedDefines.h:822
SpellAttr0
Definition: SharedDefines.h:381
@ SPELL_ATTR0_PASSIVE
Definition: SharedDefines.h:388
@ SPELL_ATTR0_DO_NOT_DISPLAY
Definition: SharedDefines.h:389
AuraStateType
Definition: SharedDefines.h:1288
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition: SharedDefines.h:1305
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition: SharedDefines.h:1315
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition: SharedDefines.h:1293
@ SKILL_RUNEFORGING
Definition: SharedDefines.h:3004
@ SKILL_LOCKPICKING
Definition: SharedDefines.h:2975
@ SKILL_MOUNTS
Definition: SharedDefines.h:3005
#define LOG_INFO(filterType__,...)
Definition: Log.h:164
std::uint16_t uint16
Definition: Define.h:108
bool IsInWorld() const
Definition: Object.h:104
ObjectGuid GetGUID() const
Definition: Object.h:110
std::string ToString() const
Definition: Position.cpp:51
Definition: Player.h:127
PlayerSpellState State
Definition: Player.h:128
bool Active
Definition: Player.h:129
uint8 specMask
Definition: Player.h:130
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: PlayerUpdates.cpp:2127
bool _addSpell(uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill=false)
Definition: Player.cpp:3083
void learnSpell(uint32 spellId, bool temporary=false, bool learnFromSkill=false)
Definition: Player.cpp:3271
void LearnDefaultSkill(uint32 skillId, uint16 rank)
Definition: Player.cpp:11830
bool isBeingLoaded() const override
Definition: PlayerStorage.cpp:4928
void SendLearnPacket(uint32 spellId, bool learn)
Definition: Player.cpp:3019
uint16 GetMaxSkillValueForLevel() const
Definition: Player.cpp:16188
bool IsNeedCastPassiveSpellAtLearn(SpellInfo const *spellInfo) const
Definition: Player.cpp:3262
uint16 GetPureSkillValue(uint32 skill) const
Definition: Player.cpp:5459
bool HasSkill(uint32 skill) const
Definition: Player.cpp:5373
uint16 GetPureMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5429
void SetSkill(uint16 id, uint16 step, uint16 currVal, uint16 maxVal)
Definition: Player.cpp:5273
bool Has310Flyer(bool checkAllSpells, uint32 excludeSpellId=0)
Definition: Player.cpp:3465
uint8 GetActiveSpec() const
Definition: Player.h:1721
void SetHas310Flyer(bool on)
Definition: Player.h:1167
void SetFreePrimaryProfessions(uint16 profs)
Definition: Player.h:1750
uint32 GetFreePrimaryProfessionPoints() const
Definition: Player.h:1749
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5535
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition: Unit.cpp:10492
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1154
Definition: SpellAuras.h:87
Definition: SpellInfo.h:316
uint32 Stances
Definition: SpellInfo.h:333
bool IsPassive() const
Definition: SpellInfo.cpp:1097
uint32 Id
Definition: SpellInfo.h:320
bool HasAnyAura() const
Definition: SpellInfo.cpp:900
bool HasAttribute(SpellAttr0 attribute) const
Definition: SpellInfo.h:415
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition: SpellInfo.h:393
bool IsPrimaryProfessionFirstRank() const
Definition: SpellInfo.cpp:982
bool HasEffect(SpellEffects effect) const
Definition: SpellInfo.cpp:875
Definition: SpellMgr.h:574
uint16 value
Definition: SpellMgr.h:577
uint16 step
Definition: SpellMgr.h:576
uint16 maxvalue
Definition: SpellMgr.h:578
uint16 skill
Definition: SpellMgr.h:575
static bool CheckSpellValid(SpellInfo const *spellInfo, uint32 spellId, bool isTalent)
Definition: SpellMgr.cpp:460
Definition: DBCStructure.h:1583
uint32 id
Definition: DBCStructure.h:1584

References _addSpell(), ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL, PlayerSpell::Active, AURA_EFFECT_HANDLE_REAL, AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, Unit::CastSpell(), SpellMgr::CheckSpellValid(), SpellInfo::Effects, GetActiveSpec(), Unit::GetAura(), GetFreePrimaryProfessionPoints(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetPureMaxSkillValue(), GetPureSkillValue(), GetSession(), Has310Flyer(), SpellInfo::HasAnyAura(), SpellInfo::HasAttribute(), Unit::HasAuraState(), SpellInfo::HasEffect(), HasSkill(), SpellInfo::Id, SkillLineEntry::id, isBeingLoaded(), Object::IsInWorld(), IsNeedCastPassiveSpellAtLearn(), SpellInfo::IsPassive(), SpellInfo::IsPrimaryProfessionFirstRank(), LearnDefaultSkill(), learnSpell(), LOG_INFO, m_activeSpec, m_spells, MAX_SPELL_EFFECTS, SpellLearnSkillNode::maxvalue, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, SendLearnPacket(), SetFreePrimaryProfessions(), SetHas310Flyer(), SetSkill(), SpellLearnSkillNode::skill, SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN, SKILL_LOCKPICKING, SKILL_MOUNTS, SKILL_RUNEFORGING, SPEC_MASK_ALL, PlayerSpell::specMask, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_ATTR0_PASSIVE, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_EFFECT_LEARN_SPELL, SPELL_EFFECT_SKILL_STEP, sSkillLineStore, sSpellMgr, SpellInfo::Stances, PlayerSpell::State, SpellLearnSkillNode::step, Position::ToString(), UpdateAchievementCriteria(), and SpellLearnSkillNode::value.

Referenced by _addSpell(), _addTalentAurasAndSpells(), addSpell(), AuraEffect::HandleAuraModShapeshift(), and AuraEffect::HandleAuraOverrideSpells().

◆ _AddSpellCooldown()

void Player::_AddSpellCooldown ( uint32  spell_id,
uint16  categoryId,
uint32  itemid,
uint32  end_time,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
11021{
11022 SpellCooldown sc;
11023 sc.end = GameTime::GetGameTimeMS().count() + end_time;
11024 sc.category = categoryId;
11025 sc.itemid = itemid;
11026 sc.maxduration = end_time;
11027 sc.sendToSpectator = false;
11028 sc.needSendToClient = needSendToClient;
11029
11031 {
11032 if (NeedSendSpectatorData() && forceSendToSpectator && (itemid || HasActiveSpell(spellid)))
11033 {
11034 sc.sendToSpectator = true;
11035 ArenaSpectator::SendCommand_Cooldown(FindMap(), GetGUID(), "ACD", spellid, end_time / IN_MILLISECONDS, end_time / IN_MILLISECONDS);
11036 }
11037 }
11038
11039 m_spellCooldowns[spellid] = std::move(sc);
11040}
#define SPECTATOR_COOLDOWN_MAX
Definition: ArenaSpectator.h:37
#define SPECTATOR_COOLDOWN_MIN
Definition: ArenaSpectator.h:36
constexpr auto IN_MILLISECONDS
Definition: Common.h:53
void SendCommand_Cooldown(T *o, ObjectGuid targetGUID, const char *prefix, uint32 id, uint32 dur, uint32 maxdur)
Definition: ArenaSpectator.h:89
Milliseconds GetGameTimeMS()
Definition: GameTime.cpp:43
Map * FindMap() const
Definition: Object.h:532
Definition: Player.h:199
uint32 itemid
Definition: Player.h:202
bool sendToSpectator
Definition: Player.h:204
bool needSendToClient
Definition: Player.h:205
uint32 end
Definition: Player.h:200
uint32 maxduration
Definition: Player.h:203
uint16 category
Definition: Player.h:201
bool NeedSendSpectatorData() const
Definition: Player.cpp:15351
bool HasActiveSpell(uint32 spell) const
Definition: Player.cpp:3871
SpellCooldowns m_spellCooldowns
Definition: Player.h:2946

References SpellCooldown::category, SpellCooldown::end, WorldObject::FindMap(), GameTime::GetGameTimeMS(), Object::GetGUID(), HasActiveSpell(), IN_MILLISECONDS, SpellCooldown::itemid, m_spellCooldowns, SpellCooldown::maxduration, NeedSendSpectatorData(), SpellCooldown::needSendToClient, ArenaSpectator::SendCommand_Cooldown(), SpellCooldown::sendToSpectator, SPECTATOR_COOLDOWN_MAX, and SPECTATOR_COOLDOWN_MIN.

Referenced by _LoadSpellCooldowns(), AddSpellAndCategoryCooldowns(), and AddSpellCooldown().

◆ _addTalentAurasAndSpells()

void Player::_addTalentAurasAndSpells ( uint32  spellId)
3003{
3004 // pussywizard: spells learnt from talents are added as TEMPORARY, so not saved to db (only the talent itself is saved)
3005 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3006 if (spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3007 {
3008 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3009 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && !sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
3010 _addSpell(spellInfo->Effects[i].TriggerSpell, SPEC_MASK_ALL, true);
3011 }
3012 else if (spellInfo->IsPassive() || (spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY) && spellInfo->Stances))
3013 {
3014 if (IsNeedCastPassiveSpellAtLearn(spellInfo))
3015 CastSpell(this, spellId, true);
3016 }
3017}

References _addSpell(), Unit::CastSpell(), SpellInfo::Effects, SpellInfo::HasAttribute(), SpellInfo::HasEffect(), IsNeedCastPassiveSpellAtLearn(), SpellInfo::IsPassive(), MAX_SPELL_EFFECTS, SPEC_MASK_ALL, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_EFFECT_LEARN_SPELL, sSpellMgr, and SpellInfo::Stances.

Referenced by ActivateSpec(), and addTalent().

◆ _ApplyAllItemMods()

void Player::_ApplyAllItemMods ( )
7520{
7521 LOG_DEBUG("entities.player.items", "_ApplyAllItemMods start.");
7522
7523 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7524 {
7525 if (m_items[i])
7526 {
7527 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7528 continue;
7529
7530 ItemTemplate const* proto = m_items[i]->GetTemplate();
7531 if (!proto)
7532 continue;
7533
7534 uint32 attacktype = Player::GetAttackBySlot(i);
7535 if (attacktype < MAX_ATTACK)
7537
7538 _ApplyItemBonuses(proto, i, true);
7539
7540 if (i == EQUIPMENT_SLOT_RANGED)
7542 }
7543 }
7544
7545 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7546 {
7547 if (m_items[i])
7548 {
7549 ItemTemplate const* proto = m_items[i]->GetTemplate();
7550 if (!proto)
7551 continue;
7552
7553 // item set bonuses not dependent from item broken state
7554 if (proto->ItemSet)
7555 AddItemsSetItem(this, m_items[i]);
7556
7557 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7558 continue;
7559
7560 ApplyItemEquipSpell(m_items[i], true);
7561 ApplyEnchantment(m_items[i], true);
7562 }
7563 }
7564
7565 LOG_DEBUG("entities.player.items", "_ApplyAllItemMods complete.");
7566}
void AddItemsSetItem(Player *player, Item *item)
Definition: Item.cpp:33
@ INVENTORY_SLOT_BAG_END
Definition: Player.h:700
@ EQUIPMENT_SLOT_RANGED
Definition: Player.h:692
WeaponAttackType
Definition: Unit.h:208
@ MAX_ATTACK
Definition: Unit.h:212
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:168
ItemTemplate const * GetTemplate() const
Definition: Item.cpp:545
Definition: ItemTemplate.h:619
uint32 ItemSet
Definition: ItemTemplate.h:675
void _ApplyAmmoBonuses()
Definition: Player.cpp:7586
void ApplyItemEquipSpell(Item *item, bool apply, bool form_change=false)
Definition: Player.cpp:7053
void ApplyEnchantment(Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
Definition: PlayerStorage.cpp:4319
void _ApplyItemBonuses(ItemTemplate const *proto, uint8 slot, bool apply, bool only_level_scale=false)
Definition: Player.cpp:6549
void _ApplyWeaponDependentAuraMods(Item *item, WeaponAttackType attackType, bool apply)
Definition: Player.cpp:6949
static uint8 GetAttackBySlot(uint8 slot)
Definition: PlayerStorage.cpp:565
bool CanUseAttackType(uint8 attacktype) const
Definition: Unit.h:952

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), AddItemsSetItem(), ApplyEnchantment(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, ItemTemplate::ItemSet, LOG_DEBUG, m_items, and MAX_ATTACK.

Referenced by _ApplyAllStatBonuses(), and _LoadInventory().

◆ _ApplyAllLevelScaleItemMods()

void Player::_ApplyAllLevelScaleItemMods ( bool  apply)
7569{
7570 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7571 {
7572 if (m_items[i])
7573 {
7574 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7575 continue;
7576
7577 ItemTemplate const* proto = m_items[i]->GetTemplate();
7578 if (!proto)
7579 continue;
7580
7581 _ApplyItemMods(m_items[i], i, apply);
7582 }
7583 }
7584}
void _ApplyItemMods(Item *item, uint8 slot, bool apply)
Definition: Player.cpp:6514

References _ApplyItemMods(), Unit::CanUseAttackType(), GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, and m_items.

Referenced by GiveLevel(), and reset_commandscript::HandleResetLevelCommand().

◆ _ApplyAllStatBonuses()

void Player::_ApplyAllStatBonuses ( )
980{
981 SetCanModifyStats(false);
982
985
986 SetCanModifyStats(true);
987
989}
void _ApplyAllItemMods()
Definition: Player.cpp:7519
bool UpdateAllStats() override
Definition: StatSystem.cpp:188
void _ApplyAllAuraStatMods()
Definition: Unit.cpp:5442
void SetCanModifyStats(bool modifyStats)
Definition: Unit.h:1449

References Unit::_ApplyAllAuraStatMods(), _ApplyAllItemMods(), Unit::SetCanModifyStats(), and UpdateAllStats().

Referenced by InitStatsForLevel().

◆ _ApplyAmmoBonuses()

void Player::_ApplyAmmoBonuses ( )
7587{
7588 // check ammo
7590 if (!ammo_id)
7591 return;
7592
7593 float currentAmmoDPS;
7594
7595 ItemTemplate const* ammo_proto = sObjectMgr->GetItemTemplate(ammo_id);
7596 if (!ammo_proto || ammo_proto->Class != ITEM_CLASS_PROJECTILE || !CheckAmmoCompatibility(ammo_proto))
7597 currentAmmoDPS = 0.0f;
7598 else
7599 currentAmmoDPS = (ammo_proto->Damage[0].DamageMin + ammo_proto->Damage[0].DamageMax) / 2;
7600
7601 sScriptMgr->OnApplyAmmoBonuses(this, ammo_proto, currentAmmoDPS);
7602
7603 if (currentAmmoDPS == GetAmmoDPS())
7604 return;
7605
7606 m_ammoDPS = currentAmmoDPS;
7607
7608 if (CanModifyStats())
7610}
#define sObjectMgr
Definition: ObjectMgr.h:1623
@ PLAYER_AMMO_ID
Definition: UpdateFields.h:369
@ ITEM_CLASS_PROJECTILE
Definition: ItemTemplate.h:297
@ RANGED_ATTACK
Definition: Unit.h:211
float DamageMin
Definition: ItemTemplate.h:579
float DamageMax
Definition: ItemTemplate.h:580
_Damage Damage[MAX_ITEM_PROTO_DAMAGES]
Definition: ItemTemplate.h:651
uint32 Class
Definition: ItemTemplate.h:621
uint32 GetUInt32Value(uint16 index) const
Definition: Object.cpp:305
bool CheckAmmoCompatibility(ItemTemplate const *ammo_proto) const
Definition: Player.cpp:7612
float GetAmmoDPS() const
Definition: Player.h:1320
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition: StatSystem.cpp:60
bool CanModifyStats() const
Definition: Unit.h:1448

References Unit::CanModifyStats(), CheckAmmoCompatibility(), ItemTemplate::Class, ItemTemplate::Damage, _Damage::DamageMax, _Damage::DamageMin, GetAmmoDPS(), Object::GetUInt32Value(), ITEM_CLASS_PROJECTILE, m_ammoDPS, PLAYER_AMMO_ID, RANGED_ATTACK, sObjectMgr, sScriptMgr, and Unit::UpdateDamagePhysical().

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and SetAmmo().

◆ _ApplyItemBonuses()

void Player::_ApplyItemBonuses ( ItemTemplate const *  proto,
uint8  slot,
bool  apply,
bool  only_level_scale = false 
)
Deprecated:
item mods
6550{
6551 if (slot >= INVENTORY_SLOT_BAG_END || !proto)
6552 return;
6553
6554 ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
6555 if (only_level_scale && !ssd)
6556 return;
6557
6558 // req. check at equip, but allow use for extended range if range limit max level, set proper level
6559 uint32 ssd_level = GetLevel();
6560 uint32 CustomScalingStatValue = 0;
6561
6562 sScriptMgr->OnCustomScalingStatValueBefore(this, proto, slot, apply, CustomScalingStatValue);
6563
6564 uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
6565
6566 if (ssd && ssd_level > ssd->MaxLevel)
6567 ssd_level = ssd->MaxLevel;
6568
6569 ScalingStatValuesEntry const* ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
6570 if (only_level_scale && !ssv)
6571 return;
6572
6573 for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
6574 {
6575 uint32 statType = 0;
6576 int32 val = 0;
6577 // If set ScalingStatDistribution need get stats and values from it
6578 if (ssv)
6579 {
6580 if (ssd)
6581 {
6582 if (ssd->StatMod[i] < 0)
6583 continue;
6584
6585 statType = ssd->StatMod[i];
6586 val = (ssv->getssdMultiplier(ScalingStatValue) * ssd->Modifier[i]) / 10000;
6587 }
6588 else
6589 {
6590 if (i >= proto->StatsCount)
6591 continue;
6592
6593 // OnCustomScalingStatValue(Player* player, ItemTemplate const* proto, uint32& statType, int32& val, uint8 itemProtoStatNumber, uint32 ScalingStatValue, ScalingStatValuesEntry const* ssv)
6594 sScriptMgr->OnCustomScalingStatValue(this, proto, statType, val, i, ScalingStatValue, ssv);
6595 }
6596 }
6597 else
6598 {
6599 if (i >= proto->StatsCount)
6600 continue;
6601
6602 statType = proto->ItemStat[i].ItemStatType;
6603 val = proto->ItemStat[i].ItemStatValue;
6604
6605 sScriptMgr->OnApplyItemModsBefore(this, slot, apply, i, statType, val);
6606 }
6607
6608 if (val == 0)
6609 continue;
6610
6611 switch (statType)
6612 {
6613 case ITEM_MOD_MANA:
6614 HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(val), apply);
6615 break;
6616 case ITEM_MOD_HEALTH: // modify HP
6617 HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(val), apply);
6618 break;
6619 case ITEM_MOD_AGILITY: // modify agility
6621 ApplyStatBuffMod(STAT_AGILITY, float(val), apply);
6622 break;
6623 case ITEM_MOD_STRENGTH: //modify strength
6625 ApplyStatBuffMod(STAT_STRENGTH, float(val), apply);
6626 break;
6627 case ITEM_MOD_INTELLECT: //modify intellect
6629 ApplyStatBuffMod(STAT_INTELLECT, float(val), apply);
6630 break;
6631 case ITEM_MOD_SPIRIT: //modify spirit
6633 ApplyStatBuffMod(STAT_SPIRIT, float(val), apply);
6634 break;
6635 case ITEM_MOD_STAMINA: //modify stamina
6637 ApplyStatBuffMod(STAT_STAMINA, float(val), apply);
6638 break;
6641 break;
6643 ApplyRatingMod(CR_DODGE, int32(val), apply);
6644 break;
6646 ApplyRatingMod(CR_PARRY, int32(val), apply);
6647 break;
6649 ApplyRatingMod(CR_BLOCK, int32(val), apply);
6650 break;
6652 ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
6653 break;
6655 ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
6656 break;
6658 ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
6659 break;
6661 ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
6662 break;
6664 ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
6665 break;
6667 ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
6668 break;
6671 break;
6674 break;
6677 break;
6680 break;
6683 break;
6686 break;
6688 ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
6689 break;
6691 ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
6692 break;
6694 ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
6695 break;
6697 ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
6698 ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
6699 ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
6700 break;
6702 ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
6703 ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
6704 ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
6705 break;
6710 break;
6716 break;
6718 ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
6719 ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
6720 ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
6721 break;
6723 ApplyRatingMod(CR_EXPERTISE, int32(val), apply);
6724 break;
6728 break;
6731 break;
6732 // case ITEM_MOD_FERAL_ATTACK_POWER:
6733 // ApplyFeralAPBonus(int32(val), apply);
6734 // break;
6736 ApplyManaRegenBonus(int32(val), apply);
6737 break;
6740 break;
6742 ApplySpellPowerBonus(int32(val), apply);
6743 break;
6745 ApplyHealthRegenBonus(int32(val), apply);
6746 break;
6748 ApplySpellPenetrationBonus(val, apply);
6749 break;
6751 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(val), apply);
6752 break;
6756 break;
6757 }
6758 }
6759
6760 // Apply Spell Power from ScalingStatValue if set
6761 if (ssv)
6762 if (int32 spellbonus = ssv->getSpellBonus(ScalingStatValue))
6763 ApplySpellPowerBonus(spellbonus, apply);
6764
6765 // If set ScalingStatValue armor get it or use item armor
6766 uint32 armor = proto->Armor;
6767 if (ssv)
6768 {
6769 if (uint32 ssvarmor = ssv->getArmorMod(ScalingStatValue))
6770 if (proto->ScalingStatValue > 0 || ssvarmor < proto->Armor) //Check to avoid higher values than stat itself (heirloom OR items with correct armor value)
6771 armor = ssvarmor;
6772 }
6773 else if (armor && proto->ArmorDamageModifier)
6774 armor -= uint32(proto->ArmorDamageModifier);
6775
6776 if (armor)
6777 {
6778 UnitModifierType modType = TOTAL_VALUE;
6779 if (proto->Class == ITEM_CLASS_ARMOR)
6780 {
6781 switch (proto->SubClass)
6782 {
6788 modType = BASE_VALUE;
6789 break;
6790 }
6791 }
6792 HandleStatModifier(UNIT_MOD_ARMOR, modType, float(armor), apply);
6793 }
6794
6795 // Add armor bonus from ArmorDamageModifier if > 0
6796 if (proto->ArmorDamageModifier > 0 && sScriptMgr->CanArmorDamageModifier(this))
6797 HandleStatModifier(UNIT_MOD_ARMOR, TOTAL_VALUE, float(proto->ArmorDamageModifier), apply);
6798
6799 if (proto->Block)
6800 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(proto->Block), apply);
6801
6802 if (proto->HolyRes)
6803 HandleStatModifier(UNIT_MOD_RESISTANCE_HOLY, BASE_VALUE, float(proto->HolyRes), apply);
6804
6805 if (proto->FireRes)
6806 HandleStatModifier(UNIT_MOD_RESISTANCE_FIRE, BASE_VALUE, float(proto->FireRes), apply);
6807
6808 if (proto->NatureRes)
6809 HandleStatModifier(UNIT_MOD_RESISTANCE_NATURE, BASE_VALUE, float(proto->NatureRes), apply);
6810
6811 if (proto->FrostRes)
6812 HandleStatModifier(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, float(proto->FrostRes), apply);
6813
6814 if (proto->ShadowRes)
6815 HandleStatModifier(UNIT_MOD_RESISTANCE_SHADOW, BASE_VALUE, float(proto->ShadowRes), apply);
6816
6817 if (proto->ArcaneRes)
6818 HandleStatModifier(UNIT_MOD_RESISTANCE_ARCANE, BASE_VALUE, float(proto->ArcaneRes), apply);
6819
6820 uint8 attType = Player::GetAttackBySlot(slot);
6821 if (attType != MAX_ATTACK)
6822 {
6823 _ApplyWeaponDamage(slot, proto, ssv, apply);
6824 }
6825
6826 // Druids get feral AP bonus from weapon dps (also use DPS from ScalingStatValue)
6828 {
6829 int32 dpsMod = 0;
6830 int32 feral_bonus = 0;
6831 if (ssv)
6832 {
6833 dpsMod = ssv->getDPSMod(ScalingStatValue);
6834 feral_bonus += ssv->getFeralBonus(ScalingStatValue);
6835 }
6836
6837 feral_bonus += proto->getFeralBonus(dpsMod);
6838 sScriptMgr->OnGetFeralApBonus(this, feral_bonus, dpsMod, proto, ssv);
6839 if (feral_bonus)
6840 ApplyFeralAPBonus(feral_bonus, apply);
6841 }
6842}
DBCStorage< ScalingStatDistributionEntry > sScalingStatDistributionStore(ScalingStatDistributionfmt)
DBCStorage< ScalingStatValuesEntry > sScalingStatValuesStore(ScalingStatValuesfmt)
@ ITEM_MOD_CRIT_TAKEN_RANGED_RATING
Definition: ItemTemplate.h:48
@ ITEM_MOD_HIT_MELEE_RATING
Definition: ItemTemplate.h:38
@ ITEM_MOD_HIT_TAKEN_MELEE_RATING
Definition: ItemTemplate.h:44
@ ITEM_MOD_STAMINA
Definition: ItemTemplate.h:33
@ ITEM_MOD_HIT_SPELL_RATING
Definition: ItemTemplate.h:40
@ ITEM_MOD_SPELL_PENETRATION
Definition: ItemTemplate.h:69
@ ITEM_MOD_PARRY_RATING
Definition: ItemTemplate.h:36
@ ITEM_MOD_DEFENSE_SKILL_RATING
Definition: ItemTemplate.h:34
@ ITEM_MOD_HASTE_RANGED_RATING
Definition: ItemTemplate.h:51
@ ITEM_MOD_CRIT_TAKEN_RATING
Definition: ItemTemplate.h:56
@ ITEM_MOD_EXPERTISE_RATING
Definition: ItemTemplate.h:59
@ ITEM_MOD_MANA
Definition: ItemTemplate.h:27
@ ITEM_MOD_RANGED_ATTACK_POWER
Definition: ItemTemplate.h:61
@ ITEM_MOD_HEALTH
Definition: ItemTemplate.h:28
@ ITEM_MOD_CRIT_TAKEN_SPELL_RATING
Definition: ItemTemplate.h:49
@ ITEM_MOD_HIT_TAKEN_SPELL_RATING
Definition: ItemTemplate.h:46
@ ITEM_MOD_SPIRIT
Definition: ItemTemplate.h:32
@ ITEM_MOD_SPELL_POWER
Definition: ItemTemplate.h:67
@ ITEM_MOD_HASTE_SPELL_RATING
Definition: ItemTemplate.h:52
@ ITEM_MOD_ATTACK_POWER
Definition: ItemTemplate.h:60
@ ITEM_MOD_HASTE_RATING
Definition: ItemTemplate.h:58
@ ITEM_MOD_HIT_RANGED_RATING
Definition: ItemTemplate.h:39
@ ITEM_MOD_CRIT_SPELL_RATING
Definition: ItemTemplate.h:43
@ ITEM_MOD_BLOCK_VALUE
Definition: ItemTemplate.h:70
@ ITEM_MOD_CRIT_RANGED_RATING
Definition: ItemTemplate.h:42
@ ITEM_MOD_CRIT_MELEE_RATING
Definition: ItemTemplate.h:41
@ ITEM_MOD_STRENGTH
Definition: ItemTemplate.h:30
@ ITEM_MOD_HEALTH_REGEN
Definition: ItemTemplate.h:68
@ ITEM_MOD_BLOCK_RATING
Definition: ItemTemplate.h:37
@ ITEM_MOD_ARMOR_PENETRATION_RATING
Definition: ItemTemplate.h:66
@ ITEM_MOD_SPELL_HEALING_DONE
Definition: ItemTemplate.h:63
@ ITEM_MOD_CRIT_TAKEN_MELEE_RATING
Definition: ItemTemplate.h:47
@ ITEM_MOD_HIT_TAKEN_RATING
Definition: ItemTemplate.h:55
@ ITEM_MOD_HASTE_MELEE_RATING
Definition: ItemTemplate.h:50
@ ITEM_MOD_MANA_REGENERATION
Definition: ItemTemplate.h:65
@ ITEM_MOD_HIT_RATING
Definition: ItemTemplate.h:53
@ ITEM_MOD_INTELLECT
Definition: ItemTemplate.h:31
@ ITEM_MOD_RESILIENCE_RATING
Definition: ItemTemplate.h:57
@ ITEM_MOD_AGILITY
Definition: ItemTemplate.h:29
@ ITEM_MOD_DODGE_RATING
Definition: ItemTemplate.h:35
@ ITEM_MOD_CRIT_RATING
Definition: ItemTemplate.h:54
@ ITEM_MOD_SPELL_DAMAGE_DONE
Definition: ItemTemplate.h:64
@ ITEM_MOD_HIT_TAKEN_RANGED_RATING
Definition: ItemTemplate.h:45
@ ITEM_SUBCLASS_ARMOR_MAIL
Definition: ItemTemplate.h:393
@ ITEM_SUBCLASS_ARMOR_CLOTH
Definition: ItemTemplate.h:391
@ ITEM_SUBCLASS_ARMOR_LEATHER
Definition: ItemTemplate.h:392
@ ITEM_SUBCLASS_ARMOR_SHIELD
Definition: ItemTemplate.h:396
@ ITEM_SUBCLASS_ARMOR_PLATE
Definition: ItemTemplate.h:394
@ ITEM_CLASS_ARMOR
Definition: ItemTemplate.h:295
#define MAX_ITEM_PROTO_STATS
Definition: ItemTemplate.h:616
@ UNIT_MOD_STAT_INTELLECT
Definition: Unit.h:146
@ UNIT_MOD_STAT_SPIRIT
Definition: Unit.h:147
@ UNIT_MOD_ARMOR
Definition: Unit.h:156
@ UNIT_MOD_RESISTANCE_SHADOW
Definition: Unit.h:161
@ UNIT_MOD_RESISTANCE_FROST
Definition: Unit.h:160
@ UNIT_MOD_ATTACK_POWER
Definition: Unit.h:163
@ UNIT_MOD_RESISTANCE_HOLY
Definition: Unit.h:157
@ UNIT_MOD_RESISTANCE_ARCANE
Definition: Unit.h:162
@ UNIT_MOD_HEALTH
Definition: Unit.h:148
@ UNIT_MOD_RESISTANCE_FIRE
Definition: Unit.h:158
@ UNIT_MOD_STAT_STRENGTH
Definition: Unit.h:143
@ UNIT_MOD_RESISTANCE_NATURE
Definition: Unit.h:159
@ UNIT_MOD_STAT_AGILITY
Definition: Unit.h:144
@ UNIT_MOD_MANA
Definition: Unit.h:149
@ UNIT_MOD_STAT_STAMINA
Definition: Unit.h:145
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition: Unit.h:164
@ SHIELD_BLOCK_VALUE
Definition: Unit.h:183
UnitModifierType
Definition: Unit.h:125
@ BASE_VALUE
Definition: Unit.h:126
@ TOTAL_VALUE
Definition: Unit.h:128
@ CR_EXPERTISE
Definition: Unit.h:240
@ CR_HIT_TAKEN_MELEE
Definition: Unit.h:228
@ CR_HASTE_RANGED
Definition: Unit.h:235
@ CR_HIT_MELEE
Definition: Unit.h:222
@ CR_CRIT_TAKEN_RANGED
Definition: Unit.h:232
@ CR_CRIT_TAKEN_SPELL
Definition: Unit.h:233
@ CR_ARMOR_PENETRATION
Definition: Unit.h:241
@ CR_CRIT_MELEE
Definition: Unit.h:225
@ CR_CRIT_RANGED
Definition: Unit.h:226
@ CR_HIT_TAKEN_SPELL
Definition: Unit.h:230
@ CR_PARRY
Definition: Unit.h:220
@ CR_DODGE
Definition: Unit.h:219
@ CR_DEFENSE_SKILL
Definition: Unit.h:218
@ CR_HASTE_MELEE
Definition: Unit.h:234
@ CR_BLOCK
Definition: Unit.h:221
@ CR_HASTE_SPELL
Definition: Unit.h:236
@ CR_HIT_SPELL
Definition: Unit.h:224
@ CR_HIT_TAKEN_RANGED
Definition: Unit.h:229
@ CR_CRIT_SPELL
Definition: Unit.h:227
@ CR_HIT_RANGED
Definition: Unit.h:223
@ CR_CRIT_TAKEN_MELEE
Definition: Unit.h:231
@ CLASS_CONTEXT_STATS
Definition: UnitDefines.h:209
@ CLASS_DRUID
Definition: SharedDefines.h:151
@ STAT_SPIRIT
Definition: SharedDefines.h:262
@ STAT_INTELLECT
Definition: SharedDefines.h:261
@ STAT_AGILITY
Definition: SharedDefines.h:259
@ STAT_STRENGTH
Definition: SharedDefines.h:258
@ STAT_STAMINA
Definition: SharedDefines.h:260
std::int32_t int32
Definition: Define.h:103
void ApplyRatingMod(CombatRating cr, int32 value, bool apply)
Definition: Player.cpp:5203
void ApplySpellPenetrationBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:219
void _ApplyWeaponDamage(uint8 slot, ItemTemplate const *proto, ScalingStatValuesEntry const *ssv, bool apply)
Definition: Player.cpp:6844
void ApplyManaRegenBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:913
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition: Player.cpp:1280
void ApplySpellPowerBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:167
void ApplyFeralAPBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:324
void ApplyHealthRegenBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:919
void HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
Definition: Player.cpp:4962
void ApplyStatBuffMod(Stats stat, float val, bool apply)
Definition: Unit.h:1377
bool HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
Definition: Unit.cpp:15141
uint8 GetLevel() const
Definition: Unit.h:759
Definition: DBCStructure.h:1473
uint32 MaxLevel
Definition: DBCStructure.h:1477
uint32 Modifier[10]
Definition: DBCStructure.h:1476
int32 StatMod[10]
Definition: DBCStructure.h:1475
Definition: DBCStructure.h:1481
uint32 getArmorMod(uint32 mask) const
Definition: DBCStructure.h:1506
uint32 getDPSMod(uint32 mask) const
Definition: DBCStructure.h:1524
uint32 getFeralBonus(uint32 mask) const
Definition: DBCStructure.h:1554
uint32 getssdMultiplier(uint32 mask) const
Definition: DBCStructure.h:1492
uint32 getSpellBonus(uint32 mask) const
Definition: DBCStructure.h:1548

References _ApplyWeaponDamage(), ApplyFeralAPBonus(), ApplyHealthRegenBonus(), ApplyManaRegenBonus(), ApplyRatingMod(), ApplySpellPenetrationBonus(), ApplySpellPowerBonus(), Unit::ApplyStatBuffMod(), ItemTemplate::ArcaneRes, ItemTemplate::Armor, ItemTemplate::ArmorDamageModifier, BASE_VALUE, ItemTemplate::Block, ItemTemplate::Class, CLASS_CONTEXT_STATS, CLASS_DRUID, CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_HIT_TAKEN_MELEE, CR_HIT_TAKEN_RANGED, CR_HIT_TAKEN_SPELL, CR_PARRY, ItemTemplate::FireRes, FLAT_MOD, ItemTemplate::FrostRes, ScalingStatValuesEntry::getArmorMod(), GetAttackBySlot(), ScalingStatValuesEntry::getDPSMod(), ItemTemplate::getFeralBonus(), ScalingStatValuesEntry::getFeralBonus(), Unit::GetLevel(), ScalingStatValuesEntry::getSpellBonus(), ScalingStatValuesEntry::getssdMultiplier(), HandleBaseModValue(), Unit::HandleStatModifier(), ItemTemplate::HolyRes, INVENTORY_SLOT_BAG_END, IsClass(), ITEM_CLASS_ARMOR, ITEM_MOD_AGILITY, ITEM_MOD_ARMOR_PENETRATION_RATING, ITEM_MOD_ATTACK_POWER, ITEM_MOD_BLOCK_RATING, ITEM_MOD_BLOCK_VALUE, ITEM_MOD_CRIT_MELEE_RATING, ITEM_MOD_CRIT_RANGED_RATING, ITEM_MOD_CRIT_RATING, ITEM_MOD_CRIT_SPELL_RATING, ITEM_MOD_CRIT_TAKEN_MELEE_RATING, ITEM_MOD_CRIT_TAKEN_RANGED_RATING, ITEM_MOD_CRIT_TAKEN_RATING, ITEM_MOD_CRIT_TAKEN_SPELL_RATING, ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_DODGE_RATING, ITEM_MOD_EXPERTISE_RATING, ITEM_MOD_HASTE_MELEE_RATING, ITEM_MOD_HASTE_RANGED_RATING, ITEM_MOD_HASTE_RATING, ITEM_MOD_HASTE_SPELL_RATING, ITEM_MOD_HEALTH, ITEM_MOD_HEALTH_REGEN, ITEM_MOD_HIT_MELEE_RATING, ITEM_MOD_HIT_RANGED_RATING, ITEM_MOD_HIT_RATING, ITEM_MOD_HIT_SPELL_RATING, ITEM_MOD_HIT_TAKEN_MELEE_RATING, ITEM_MOD_HIT_TAKEN_RANGED_RATING, ITEM_MOD_HIT_TAKEN_RATING, ITEM_MOD_HIT_TAKEN_SPELL_RATING, ITEM_MOD_INTELLECT, ITEM_MOD_MANA, ITEM_MOD_MANA_REGENERATION, ITEM_MOD_PARRY_RATING, ITEM_MOD_RANGED_ATTACK_POWER, ITEM_MOD_RESILIENCE_RATING, ITEM_MOD_SPELL_DAMAGE_DONE, ITEM_MOD_SPELL_HEALING_DONE, ITEM_MOD_SPELL_PENETRATION, ITEM_MOD_SPELL_POWER, ITEM_MOD_SPIRIT, ITEM_MOD_STAMINA, ITEM_MOD_STRENGTH, ITEM_SUBCLASS_ARMOR_CLOTH, ITEM_SUBCLASS_ARMOR_LEATHER, ITEM_SUBCLASS_ARMOR_MAIL, ITEM_SUBCLASS_ARMOR_PLATE, ITEM_SUBCLASS_ARMOR_SHIELD, ItemTemplate::ItemStat, _ItemStat::ItemStatType, _ItemStat::ItemStatValue, MAX_ATTACK, MAX_ITEM_PROTO_STATS, ScalingStatDistributionEntry::MaxLevel, ScalingStatDistributionEntry::Modifier, ItemTemplate::NatureRes, ItemTemplate::ScalingStatDistribution, ItemTemplate::ScalingStatValue, ItemTemplate::ShadowRes, SHIELD_BLOCK_VALUE, sScalingStatDistributionStore, sScalingStatValuesStore, sScriptMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, ScalingStatDistributionEntry::StatMod, ItemTemplate::StatsCount, ItemTemplate::SubClass, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), and _RemoveAllItemMods().

◆ _ApplyItemMods()

void Player::_ApplyItemMods ( Item item,
uint8  slot,
bool  apply 
)
6515{
6516 if (slot >= INVENTORY_SLOT_BAG_END || !item)
6517 return;
6518
6519 ItemTemplate const* proto = item->GetTemplate();
6520
6521 if (!proto)
6522 return;
6523
6524 // not apply/remove mods for broken item
6525 if (item->IsBroken())
6526 return;
6527
6528 LOG_DEBUG("entities.player", "applying mods for item {} ", item->GetGUID().ToString());
6529
6530 uint8 attacktype = Player::GetAttackBySlot(slot);
6531
6532 if (item->HasSocket()) //only (un)equipping of items with sockets can influence metagems, so no need to waste time with normal items
6533 CorrectMetaGemEnchants(slot, apply);
6534
6535 if (attacktype < MAX_ATTACK)
6536 _ApplyWeaponDependentAuraMods(item, WeaponAttackType(attacktype), apply);
6537
6538 _ApplyItemBonuses(proto, slot, apply);
6539
6540 if (slot == EQUIPMENT_SLOT_RANGED)
6542
6543 ApplyItemEquipSpell(item, apply);
6544 ApplyEnchantment(item, apply);
6545
6546 LOG_DEBUG("entities.player.items", "_ApplyItemMods complete.");
6547}
bool HasSocket() const
Definition: Item.cpp:1008
bool IsBroken() const
Definition: Item.h:257
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:109
std::string ToString() const
Definition: ObjectGuid.cpp:47
void CorrectMetaGemEnchants(uint8 slot, bool apply)
Definition: Player.cpp:11163

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), ApplyEnchantment(), ApplyItemEquipSpell(), CorrectMetaGemEnchants(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Object::GetGUID(), Item::GetTemplate(), Item::HasSocket(), INVENTORY_SLOT_BAG_END, Item::IsBroken(), LOG_DEBUG, MAX_ATTACK, and ObjectGuid::ToString().

Referenced by _ApplyAllLevelScaleItemMods(), DestroyItem(), DurabilityPointsLoss(), DurabilityRepair(), EquipItem(), and RemoveItem().

◆ _ApplyWeaponDamage()

void Player::_ApplyWeaponDamage ( uint8  slot,
ItemTemplate const *  proto,
ScalingStatValuesEntry const *  ssv,
bool  apply 
)
6845{
6846 uint32 CustomScalingStatValue = 0;
6847
6848 sScriptMgr->OnCustomScalingStatValueBefore(this, proto, slot, apply, CustomScalingStatValue);
6849
6850 uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
6851
6852 // following part fix disarm issue
6853 // that doesn't apply the scaling after disarmed
6854 if (!ssv)
6855 {
6856 ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
6857
6858 // req. check at equip, but allow use for extended range if range limit max level, set proper level
6859 uint32 ssd_level = GetLevel();
6860
6861 if (ssd && ssd_level > ssd->MaxLevel)
6862 ssd_level = ssd->MaxLevel;
6863
6864 ssv = ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
6865 }
6866
6867 uint8 attType = Player::GetAttackBySlot(slot);
6868 if (!IsInFeralForm() && apply && !CanUseAttackType(attType))
6869 {
6870 return;
6871 }
6872
6873 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6874 {
6875 float minDamage = proto->Damage[i].DamageMin;
6876 float maxDamage = proto->Damage[i].DamageMax;
6877
6878 // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage
6879 if (ssv)
6880 {
6881 int32 extraDPS = ssv->getDPSMod(ScalingStatValue);
6882 if (extraDPS)
6883 {
6884 float average = extraDPS * proto->Delay / 1000.0f;
6885 float mod = ssv->IsTwoHand(proto->ScalingStatValue) ? 0.2f : 0.3f;
6886
6887 minDamage = (1.0f - mod) * average;
6888 maxDamage = (1.0f + mod) * average;
6889 }
6890 }
6891
6892 if (apply)
6893 {
6894 if (minDamage > 0.f)
6895 {
6896 SetBaseWeaponDamage(WeaponAttackType(attType), MINDAMAGE, minDamage, i);
6897 }
6898
6899 if (maxDamage > 0.f)
6900 {
6901 SetBaseWeaponDamage(WeaponAttackType(attType), MAXDAMAGE, maxDamage, i);
6902 }
6903 }
6904 }
6905
6906 if (!apply)
6907 {
6908 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6909 {
6912 }
6913
6914 if (attType == BASE_ATTACK)
6915 {
6918 }
6919 }
6920
6921 if (proto->Delay && !IsInFeralForm())
6922 {
6923 if (slot == EQUIPMENT_SLOT_RANGED)
6924 SetAttackTime(RANGED_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6925 else if (slot == EQUIPMENT_SLOT_MAINHAND)
6926 SetAttackTime(BASE_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6927 else if (slot == EQUIPMENT_SLOT_OFFHAND)
6928 SetAttackTime(OFF_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6929 }
6930
6931 // No need to modify any physical damage for ferals as it is calculated from stats only
6932 if (IsInFeralForm())
6933 return;
6934
6935 if (CanModifyStats() && (GetWeaponDamageRange(WeaponAttackType(attType), MAXDAMAGE) || proto->Delay))
6937}
#define MAX_ITEM_PROTO_DAMAGES
Definition: ItemTemplate.h:613
@ EQUIPMENT_SLOT_MAINHAND
Definition: Player.h:690
@ EQUIPMENT_SLOT_OFFHAND
Definition: Player.h:691
@ MINDAMAGE
Definition: Unit.h:135
@ MAXDAMAGE
Definition: Unit.h:136
#define BASE_ATTACK_TIME
Definition: Unit.h:41
@ OFF_ATTACK
Definition: Unit.h:210
@ BASE_ATTACK
Definition: Unit.h:209
#define BASE_MAXDAMAGE
Definition: Unit.h:40
#define BASE_MINDAMAGE
Definition: Unit.h:39
float GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
Definition: Unit.cpp:15390
void SetBaseWeaponDamage(WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
Definition: Unit.h:1461
bool IsInFeralForm() const
Definition: Unit.h:1420
void SetAttackTime(WeaponAttackType att, uint32 val)
Definition: Unit.h:818

References BASE_ATTACK, BASE_ATTACK_TIME, BASE_MAXDAMAGE, BASE_MINDAMAGE, Unit::CanModifyStats(), Unit::CanUseAttackType(), ItemTemplate::Damage, _Damage::DamageMax, _Damage::DamageMin, ItemTemplate::Delay, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), ScalingStatValuesEntry::getDPSMod(), Unit::GetLevel(), Unit::GetWeaponDamageRange(), Unit::IsInFeralForm(), ScalingStatValuesEntry::IsTwoHand(), MAX_ITEM_PROTO_DAMAGES, MAXDAMAGE, ScalingStatDistributionEntry::MaxLevel, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, ItemTemplate::ScalingStatDistribution, ItemTemplate::ScalingStatValue, Unit::SetAttackTime(), Unit::SetBaseWeaponDamage(), sScalingStatDistributionStore, sScalingStatValuesStore, sScriptMgr, and Unit::UpdateDamagePhysical().

Referenced by _ApplyItemBonuses(), AuraEffect::HandleAuraModDisarm(), and AuraEffect::HandleAuraModShapeshift().

◆ _ApplyWeaponDependentAuraCritMod()

void Player::_ApplyWeaponDependentAuraCritMod ( Item item,
WeaponAttackType  attackType,
AuraEffect const *  aura,
bool  apply 
)
6965{
6966 // don't apply mod if item is broken or cannot be used
6967 if (item->IsBroken() || !CanUseAttackType(attackType))
6968 return;
6969
6970 // generic not weapon specific case processes in aura code
6971 if (aura->GetSpellInfo()->EquippedItemClass == -1)
6972 return;
6973
6974 if (!sScriptMgr->CanApplyWeaponDependentAuraDamageMod(this, item, attackType, aura, apply))
6975 return;
6976
6978 switch (attackType)
6979 {
6980 case BASE_ATTACK:
6981 mod = CRIT_PERCENTAGE;
6982 break;
6983 case OFF_ATTACK:
6985 break;
6986 case RANGED_ATTACK:
6988 break;
6989 default:
6990 return;
6991 }
6992
6993 if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
6994 HandleBaseModValue(mod, FLAT_MOD, float (aura->GetAmount()), apply);
6995}
BaseModGroup
Definition: Unit.h:179
@ OFFHAND_CRIT_PERCENTAGE
Definition: Unit.h:182
@ CRIT_PERCENTAGE
Definition: Unit.h:180
@ RANGED_CRIT_PERCENTAGE
Definition: Unit.h:181
bool IsFitToSpellRequirements(SpellInfo const *spellInfo) const
Definition: Item.cpp:885

References BASE_ATTACK, BASEMOD_END, Unit::CanUseAttackType(), CRIT_PERCENTAGE, SpellInfo::EquippedItemClass, FLAT_MOD, AuraEffect::GetAmount(), AuraEffect::GetSpellInfo(), HandleBaseModValue(), Item::IsBroken(), Item::IsFitToSpellRequirements(), OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, and sScriptMgr.

Referenced by _ApplyWeaponDependentAuraMods(), and AuraEffect::HandleAuraModWeaponCritPercent().

◆ _ApplyWeaponDependentAuraDamageMod()

void Player::_ApplyWeaponDependentAuraDamageMod ( Item item,
WeaponAttackType  attackType,
AuraEffect const *  aura,
bool  apply 
)
6998{
6999 // don't apply mod if item is broken or cannot be used
7000 if (item->IsBroken() || !CanUseAttackType(attackType))
7001 return;
7002
7003 // ignore spell mods for not wands
7004 if ((aura->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) == 0 && (getClassMask() & CLASSMASK_WAND_USERS) == 0)
7005 return;
7006
7007 // generic not weapon specific case processes in aura code
7008 if (aura->GetSpellInfo()->EquippedItemClass == -1)
7009 return;
7010
7011 UnitMods unitMod = UNIT_MOD_END;
7012 switch (attackType)
7013 {
7014 case BASE_ATTACK:
7015 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
7016 break;
7017 case OFF_ATTACK:
7018 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
7019 break;
7020 case RANGED_ATTACK:
7021 unitMod = UNIT_MOD_DAMAGE_RANGED;
7022 break;
7023 default:
7024 return;
7025 }
7026
7027 UnitModifierType unitModType = TOTAL_VALUE;
7028 switch (aura->GetAuraType())
7029 {
7031 unitModType = TOTAL_VALUE;
7032 break;
7034 unitModType = TOTAL_PCT;
7035 break;
7036 default:
7037 return;
7038 }
7039
7040 if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
7041 {
7042 HandleStatModifier(unitMod, unitModType, float(aura->GetAmount()), apply);
7043 if (unitModType == TOTAL_VALUE)
7044 {
7045 if (aura->GetAmount() > 0)
7046 ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS, aura->GetAmount(), apply);
7047 else
7048 ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, aura->GetAmount(), apply);
7049 }
7050 }
7051}
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition: SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition: SpellAuraDefines.h:76
@ PLAYER_FIELD_MOD_DAMAGE_DONE_POS
Definition: UpdateFields.h:360
@ PLAYER_FIELD_MOD_DAMAGE_DONE_NEG
Definition: UpdateFields.h:361
UnitMods
Definition: Unit.h:142
@ UNIT_MOD_DAMAGE_OFFHAND
Definition: Unit.h:166
@ UNIT_MOD_END
Definition: Unit.h:168
@ UNIT_MOD_DAMAGE_RANGED
Definition: Unit.h:167
@ UNIT_MOD_DAMAGE_MAINHAND
Definition: Unit.h:165
@ TOTAL_PCT
Definition: Unit.h:129
#define CLASSMASK_WAND_USERS
Definition: SharedDefines.h:174
@ SPELL_SCHOOL_MASK_NORMAL
Definition: SharedDefines.h:297
void ApplyModUInt32Value(uint16 index, int32 val, bool apply)
Definition: Object.cpp:806
uint32 getClassMask() const
Definition: Unit.h:767

References Object::ApplyModUInt32Value(), BASE_ATTACK, Unit::CanUseAttackType(), CLASSMASK_WAND_USERS, SpellInfo::EquippedItemClass, AuraEffect::GetAmount(), AuraEffect::GetAuraType(), Unit::getClassMask(), AuraEffect::GetMiscValue(), AuraEffect::GetSpellInfo(), Unit::HandleStatModifier(), Item::IsBroken(), Item::IsFitToSpellRequirements(), OFF_ATTACK, PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, RANGED_ATTACK, SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_SCHOOL_MASK_NORMAL, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, and UNIT_MOD_END.

Referenced by _ApplyWeaponDependentAuraMods(), AuraEffect::HandleModDamageDone(), and AuraEffect::HandleModDamagePercentDone().

◆ _ApplyWeaponDependentAuraMods()

void Player::_ApplyWeaponDependentAuraMods ( Item item,
WeaponAttackType  attackType,
bool  apply 
)
6950{
6952 for (AuraEffectList::const_iterator itr = auraCritList.begin(); itr != auraCritList.end(); ++itr)
6953 _ApplyWeaponDependentAuraCritMod(item, attackType, *itr, apply);
6954
6956 for (AuraEffectList::const_iterator itr = auraDamageFlatList.begin(); itr != auraDamageFlatList.end(); ++itr)
6957 _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
6958
6960 for (AuraEffectList::const_iterator itr = auraDamagePctList.begin(); itr != auraDamagePctList.end(); ++itr)
6961 _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
6962}
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition: SpellAuraDefines.h:115
void _ApplyWeaponDependentAuraDamageMod(Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
Definition: Player.cpp:6997
void _ApplyWeaponDependentAuraCritMod(Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
Definition: Player.cpp:6964
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition: Unit.h:1310
std::list< AuraEffect * > AuraEffectList
Definition: Unit.h:646

References _ApplyWeaponDependentAuraCritMod(), _ApplyWeaponDependentAuraDamageMod(), Unit::GetAuraEffectsByType(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and AuraEffect::HandleAuraModDisarm().

◆ _LoadActions()

void Player::_LoadActions ( PreparedQueryResult  result)
protected
5689{
5690 m_actionButtons.clear();
5691
5692 if (result)
5693 {
5694 do
5695 {
5696 Field* fields = result->Fetch();
5697 uint8 button = fields[0].Get<uint8>();
5698 uint32 action = fields[1].Get<uint32>();
5699 uint8 type = fields[2].Get<uint8>();
5700
5701 if (ActionButton* ab = addActionButton(button, action, type))
5702 ab->uState = ACTIONBUTTON_UNCHANGED;
5703 else
5704 {
5705 LOG_ERROR("entities.player", "ActionButton loading problem, will be deleted from db...");
5706
5707 // Will deleted in DB at next save (it can create data until save but marked as deleted)
5708 m_actionButtons[button].uState = ACTIONBUTTON_DELETED;
5709 }
5710 } while (result->NextRow());
5711 }
5712}
@ ACTIONBUTTON_UNCHANGED
Definition: Player.h:221
@ ACTIONBUTTON_DELETED
Definition: Player.h:224
#define LOG_ERROR(filterType__,...)
Definition: Log.h:156
Class used to access individual fields of database query result.
Definition: Field.h:99
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition: Field.h:113
Definition: Player.h:253
ActionButton * addActionButton(uint8 button, uint32 action, uint8 type)
Definition: Player.cpp:5566
ActionButtonList m_actionButtons
Definition: Player.h:2785

References ACTIONBUTTON_DELETED, ACTIONBUTTON_UNCHANGED, addActionButton(), Field::Get(), LOG_ERROR, and m_actionButtons.

Referenced by WorldSession::HandleLoadActionsSwitchSpec(), LoadActions(), and LoadFromDB().

◆ _LoadArenaTeamInfo()

void Player::_LoadArenaTeamInfo ( )
protected
4812{
4814
4815 for (auto const& itr : ArenaTeam::ArenaSlotByType)
4816 if (uint32 arenaTeamId = sCharacterCache->GetCharacterArenaTeamIdByGuid(GetGUID(), itr.second))
4817 {
4818 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
4819 if (!arenaTeam)
4820 {
4821 LOG_ERROR("bg.arena", "Player::_LoadArenaTeamInfo: No arena team was found.");
4822 continue;
4823 }
4824 ArenaTeamMember const* member = arenaTeam->GetMember(GetGUID());
4825 if (!member)
4826 {
4827 LOG_ERROR("bg.arena", "Player::_LoadArenaTeamInfo: No members in the arena team ({}) was found.", arenaTeamId);
4828 continue;
4829 }
4830 uint8 slot = itr.second;
4831
4832 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, arenaTeamId);
4833 SetArenaTeamInfoField(slot, ARENA_TEAM_TYPE, arenaTeam->GetType());
4834 SetArenaTeamInfoField(slot, ARENA_TEAM_MEMBER, (arenaTeam->GetCaptain() == GetGUID()) ? 0 : 1);
4839 }
4840}
#define sCharacterCache
Definition: CharacterCache.h:83
#define MAX_ARENA_SLOT
Definition: ArenaTeam.h:135
@ ARENA_TEAM_GAMES_WEEK
Definition: ArenaTeam.h:78
@ ARENA_TEAM_TYPE
Definition: ArenaTeam.h:76
@ ARENA_TEAM_ID
Definition: ArenaTeam.h:75
@ ARENA_TEAM_END
Definition: ArenaTeam.h:82
@ ARENA_TEAM_PERSONAL_RATING
Definition: ArenaTeam.h:81
@ ARENA_TEAM_MEMBER
Definition: ArenaTeam.h:77
@ ARENA_TEAM_WINS_SEASON
Definition: ArenaTeam.h:80
@ ARENA_TEAM_GAMES_SEASON
Definition: ArenaTeam.h:79
#define sArenaTeamMgr
Definition: ArenaTeamMgr.h:67
@ PLAYER_FIELD_ARENA_TEAM_INFO_1_1
Definition: UpdateFields.h:381
Definition: ArenaTeam.h:109
uint16 PersonalRating
Definition: ArenaTeam.h:117
uint16 SeasonWins
Definition: ArenaTeam.h:116
uint16 WeekGames
Definition: ArenaTeam.h:113
uint16 SeasonGames
Definition: ArenaTeam.h:115
Definition: ArenaTeam.h:138
ObjectGuid GetCaptain() const
Definition: ArenaTeam.h:154
ArenaTeamMember * GetMember(ObjectGuid guid)
Definition: ArenaTeam.cpp:1012
uint32 GetType() const
Definition: ArenaTeam.h:150
static std::unordered_map< uint32, uint8 > ArenaSlotByType
Definition: ArenaTeam.h:218
uint32 * m_uint32Values
Definition: Object.h:248
void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value)
Definition: Player.cpp:16146

References ARENA_TEAM_END, ARENA_TEAM_GAMES_SEASON, ARENA_TEAM_GAMES_WEEK, ARENA_TEAM_ID, ARENA_TEAM_MEMBER, ARENA_TEAM_PERSONAL_RATING, ARENA_TEAM_TYPE, ARENA_TEAM_WINS_SEASON, ArenaTeam::ArenaSlotByType, ArenaTeam::GetCaptain(), Object::GetGUID(), ArenaTeam::GetMember(), ArenaTeam::GetType(), LOG_ERROR, Object::m_uint32Values, MAX_ARENA_SLOT, ArenaTeamMember::PersonalRating, PLAYER_FIELD_ARENA_TEAM_INFO_1_1, sArenaTeamMgr, sCharacterCache, ArenaTeamMember::SeasonGames, ArenaTeamMember::SeasonWins, SetArenaTeamInfoField(), and ArenaTeamMember::WeekGames.

Referenced by LoadFromDB().

◆ _LoadAuras()

void Player::_LoadAuras ( PreparedQueryResult  result,
uint32  timediff 
)
protected
5715{
5716 LOG_DEBUG("entities.player.loading", "Loading auras for player {}", GetGUID().ToString());
5717
5718 /* 0 1 2 3 4 5 6 7 8 9 10 11
5719 QueryResult* result = CharacterDatabase.Query("SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2,
5720 12 13 14
5721 maxDuration, remainTime, remainCharges FROM character_aura WHERE guid = '{}'", GetGUID().GetCounter());
5722 */
5723
5724 if (result)
5725 {
5726 do
5727 {
5728 Field* fields = result->Fetch();
5729 int32 damage[3];
5730 int32 baseDamage[3];
5731 ObjectGuid caster_guid = ObjectGuid(fields[0].Get<uint64>());
5732 ObjectGuid itemGuid = ObjectGuid(fields[1].Get<uint64>());
5733 uint32 spellid = fields[2].Get<uint32>();
5734 uint8 effmask = fields[3].Get<uint8>();
5735 uint8 recalculatemask = fields[4].Get<uint8>();
5736 uint8 stackcount = fields[5].Get<uint8>();
5737 damage[0] = fields[6].Get<int32>();
5738 damage[1] = fields[7].Get<int32>();
5739 damage[2] = fields[8].Get<int32>();
5740 baseDamage[0] = fields[9].Get<int32>();
5741 baseDamage[1] = fields[10].Get<int32>();
5742 baseDamage[2] = fields[11].Get<int32>();
5743 int32 maxduration = fields[12].Get<int32>();
5744 int32 remaintime = fields[13].Get<int32>();
5745 uint8 remaincharges = fields[14].Get<uint8>();
5746
5747 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
5748 if (!spellInfo)
5749 {
5750 LOG_ERROR("entities.player", "Unknown aura (spellid {}), ignore.", spellid);
5751 continue;
5752 }
5753
5754 // Xinef: leave this
5755 if (spellInfo->HasAura(SPELL_AURA_MOUNTED))
5756 {
5757 SetMountBlockId(spellInfo->Id);
5758 continue;
5759 }
5760
5761 // negative effects should continue counting down after logout
5762 if (remaintime != -1 && ((!spellInfo->IsPositive() && spellInfo->Id != 15007) || spellInfo->HasAttribute(SPELL_ATTR4_AURA_EXPIRES_OFFLINE))) // Xinef: resurrection sickness should not tick when logged off
5763 {
5764 if (remaintime / IN_MILLISECONDS <= int32(timediff))
5765 continue;
5766
5767 remaintime -= timediff * IN_MILLISECONDS;
5768 }
5769
5770 // prevent wrong values of remaincharges
5771 if (spellInfo->ProcCharges)
5772 {
5773 // we have no control over the order of applying auras and modifiers allow auras
5774 // to have more charges than value in SpellInfo
5775 if (remaincharges <= 0/* || remaincharges > spellproto->procCharges*/)
5776 remaincharges = spellInfo->ProcCharges;
5777 }
5778 else
5779 remaincharges = 0;
5780
5781 if (Aura* aura = Aura::TryCreate(spellInfo, effmask, this, nullptr, &baseDamage[0], nullptr, caster_guid, itemGuid))
5782 {
5783 if (!aura->CanBeSaved())
5784 {
5785 aura->Remove();
5786 continue;
5787 }
5788
5789 aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]);
5790 aura->ApplyForTargets();
5791 LOG_DEBUG("entities.player", "Added aura spellid {}, effectmask {}", spellInfo->Id, effmask);
5792 }
5793 } while (result->NextRow());
5794 }
5795}
@ SPELL_AURA_MOUNTED
Definition: SpellAuraDefines.h:141
@ SPELL_ATTR4_AURA_EXPIRES_OFFLINE
Definition: SharedDefines.h:532
Definition: ObjectGuid.h:118
void SetMountBlockId(uint32 mount)
Definition: Player.h:2582
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition: SpellAuras.cpp:352

References Field::Get(), Object::GetGUID(), IN_MILLISECONDS, LOG_DEBUG, LOG_ERROR, SetMountBlockId(), SPELL_ATTR4_AURA_EXPIRES_OFFLINE, SPELL_AURA_MOUNTED, sSpellMgr, Position::ToString(), and Aura::TryCreate().

Referenced by LoadFromDB().

◆ _LoadBrewOfTheMonth()

void Player::_LoadBrewOfTheMonth ( PreparedQueryResult  result)
protected
15733{
15734 uint32 lastEventId = 0;
15735 if (result)
15736 {
15737 Field* fields = result->Fetch();
15738 lastEventId = fields[0].Get<uint32>();
15739 }
15740
15741 uint16 month = static_cast<uint16>(Acore::Time::GetMonth());
15742 uint16 eventId = month;
15743 if (eventId < 9)
15744 eventId += 3;
15745 else
15746 eventId -= 9;
15747
15748 // Brew of the Month October (first in list)
15749 eventId += 34;
15750
15751 if (lastEventId != eventId && IsEventActive(eventId) && HasAchieved(2796 /* Brew of the Month*/))
15752 {
15753 // Send Mail
15754 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15755 MailSender sender(MAIL_CREATURE, 27487 /*NPC_BREW_OF_THE_MONTH_CLUB*/);
15756 MailDraft draft(uint16(212 + month)); // 212 is starting template id
15757 draft.SendMailTo(trans, MailReceiver(this, GetGUID().GetCounter()), sender);
15758
15759 // Update Event Id
15761 stmt->SetData(0, GetGUID().GetCounter());
15762 stmt->SetData(1, uint32(eventId));
15763 trans->Append(stmt);
15764
15765 CharacterDatabase.CommitTransaction(trans);
15766 }
15767}
@ MAIL_CREATURE
Definition: Mail.h:40
bool IsEventActive(uint16 event_id)
Definition: GameEventMgr.cpp:1925
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition: DatabaseEnvFwd.h:70
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
@ CHAR_REP_BREW_OF_THE_MONTH
Definition: CharacterDatabase.h:103
AC_COMMON_API uint32 GetMonth(Seconds time=0s)
Definition: Timer.cpp:424
Definition: PreparedStatement.h:158
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition: PreparedStatement.h:78
bool HasAchieved(uint32 achievementId) const
Definition: Player.cpp:13864
Definition: Mail.h:84
Definition: Mail.h:106
Definition: Mail.h:120

References CHAR_REP_BREW_OF_THE_MONTH, CharacterDatabase, Field::Get(), Object::GetGUID(), Acore::Time::GetMonth(), HasAchieved(), IsEventActive(), MAIL_CREATURE, MailDraft::SendMailTo(), and PreparedStatementBase::SetData().

Referenced by LoadFromDB().

◆ _LoadCharacterSettings()

void Player::_LoadCharacterSettings ( PreparedQueryResult  result)
protected
27{
28 m_charSettingsMap.clear();
29
30 if (!sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED))
31 {
32 return;
33 }
34
35 if (result)
36 {
37 do
38 {
39 Field* fields = result->Fetch();
40
41 std::string source = fields[0].Get<std::string>();;
42 std::string data = fields[1].Get<std::string>();
43
44 std::vector<std::string_view> tokens = Acore::Tokenize(data, ' ', false);
45
46 PlayerSettingVector setting;
47 setting.resize(tokens.size());
48
49 uint32 count = 0;
50
51 for (auto& token : tokens)
52 {
53 if (token.empty())
54 {
55 continue;
56 }
57
58 PlayerSetting set;
59 set.value = Acore::StringTo<uint32>(token).value();
60 setting[count] = set;
61 ++count;
62 }
63
64 m_charSettingsMap[source] = setting;
65
66 } while (result->NextRow());
67 }
68}
std::vector< PlayerSetting > PlayerSettingVector
Definition: PlayerSettings.h:48
@ CONFIG_PLAYER_SETTINGS_ENABLED
Definition: IWorld.h:176
std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
Definition: Tokenize.cpp:20
PlayerSettingMap m_charSettingsMap
Definition: Player.h:2970
Definition: PlayerSettings.h:39
uint32 value
Definition: PlayerSettings.h:40

References CONFIG_PLAYER_SETTINGS_ENABLED, Field::Get(), m_charSettingsMap, sWorld, Acore::Tokenize(), and PlayerSetting::value.

Referenced by LoadFromDB().

◆ _LoadDailyQuestStatus()

void Player::_LoadDailyQuestStatus ( PreparedQueryResult  result)
protected
6365{
6366 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
6367 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, 0);
6368
6369 m_DFQuests.clear();
6370
6371 //QueryResult* result = CharacterDatabase.Query("SELECT quest, time FROM character_queststatus_daily WHERE guid = '{}'", GetGUID().GetCounter());
6372
6373 if (result)
6374 {
6375 uint32 quest_daily_idx = 0;
6376
6377 do
6378 {
6379 Field* fields = result->Fetch();
6380 if (Quest const* qQuest = sObjectMgr->GetQuestTemplate(fields[0].Get<uint32>()))
6381 {
6382 if (qQuest->IsDFQuest())
6383 {
6384 m_DFQuests.insert(qQuest->GetQuestId());
6385 m_lastDailyQuestTime = time_t(fields[1].Get<uint32>());
6386 continue;
6387 }
6388 }
6389
6390 if (quest_daily_idx >= PLAYER_MAX_DAILY_QUESTS) // max amount with exist data in query
6391 {
6392 LOG_ERROR("entities.player", "Player ({}) have more 25 daily quest records in `charcter_queststatus_daily`", GetGUID().ToString());
6393 break;
6394 }
6395
6396 uint32 quest_id = fields[0].Get<uint32>();
6397
6398 // save _any_ from daily quest times (it must be after last reset anyway)
6399 m_lastDailyQuestTime = time_t(fields[1].Get<uint32>());
6400
6401 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6402 if (!quest)
6403 continue;
6404
6405 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, quest_id);
6406 ++quest_daily_idx;
6407
6408 LOG_DEBUG("entities.player.loading", "Daily quest ({}) cooldown for player ({})", quest_id, GetGUID().ToString());
6409 } while (result->NextRow());
6410 }
6411
6412 m_DailyQuestChanged = false;
6413}
@ PLAYER_FIELD_DAILY_QUESTS_1
Definition: UpdateFields.h:385
#define PLAYER_MAX_DAILY_QUESTS
Definition: Player.h:71
DFQuestsDoneList m_DFQuests
Definition: Player.h:2387
void SetUInt32Value(uint16 index, uint32 value)
Definition: Unit.cpp:21214
Definition: QuestDef.h:209

References Field::Get(), Object::GetGUID(), LOG_DEBUG, LOG_ERROR, m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, Unit::SetUInt32Value(), sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadDeclinedNames()

void Player::_LoadDeclinedNames ( PreparedQueryResult  result)
protected
4801{
4802 if (!result)
4803 return;
4804
4805 delete m_declinedname;
4807 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
4808 m_declinedname->name[i] = (*result)[i].Get<std::string>();
4809}
#define MAX_DECLINED_NAME_CASES
Definition: Unit.h:528
Definition: Unit.h:531
std::string name[MAX_DECLINED_NAME_CASES]
Definition: Unit.h:532

References m_declinedname, MAX_DECLINED_NAME_CASES, and DeclinedName::name.

Referenced by LoadFromDB().

◆ _LoadEntryPointData()

void Player::_LoadEntryPointData ( PreparedQueryResult  result)
protected
4874{
4875 if (!result)
4876 return;
4877
4878 Field* fields = result->Fetch();
4879 m_entryPointData.joinPos = WorldLocation(fields[4].Get<uint32>(), // Map
4880 fields[0].Get<float>(), // X
4881 fields[1].Get<float>(), // Y
4882 fields[2].Get<float>(), // Z
4883 fields[3].Get<float>()); // Orientation
4884
4885 m_entryPointData.taxiPath[0] = fields[5].Get<uint32>();
4886 m_entryPointData.taxiPath[1] = fields[6].Get<uint32>();
4887 m_entryPointData.mountSpell = fields[7].Get<uint32>();
4888}
Definition: Position.h:251
uint32 mountSpell
Definition: Player.h:1055
std::array< uint32, 2 > taxiPath
Definition: Player.h:1056
WorldLocation joinPos
Definition: Player.h:1057
EntryPointData m_entryPointData
Definition: Player.h:2650

References Field::Get(), EntryPointData::joinPos, m_entryPointData, EntryPointData::mountSpell, and EntryPointData::taxiPath.

Referenced by LoadFromDB().

◆ _LoadEquipmentSets()

void Player::_LoadEquipmentSets ( PreparedQueryResult  result)
protected
4843{
4844 // SetQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '{}' ORDER BY setindex", m_guid.GetCounter());
4845 if (!result)
4846 return;
4847
4848 uint32 count = 0;
4849 do
4850 {
4851 Field* fields = result->Fetch();
4852 EquipmentSet eqSet;
4853
4854 eqSet.Guid = fields[0].Get<uint64>();
4855 uint8 index = fields[1].Get<uint8>();
4856 eqSet.Name = fields[2].Get<std::string>();
4857 eqSet.IconName = fields[3].Get<std::string>();
4858 eqSet.IgnoreMask = fields[4].Get<uint32>();
4860
4861 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
4862 eqSet.Items[i] = ObjectGuid::Create<HighGuid::Item>(fields[5 + i].Get<uint32>());
4863
4864 m_EquipmentSets[index] = eqSet;
4865
4866 ++count;
4867
4868 if (count >= MAX_EQUIPMENT_SET_INDEX) // client limit
4869 break;
4870 } while (result->NextRow());
4871}
@ EQUIPMENT_SET_UNCHANGED
Definition: Player.h:742
#define MAX_EQUIPMENT_SET_INDEX
Definition: Player.h:760
@ EQUIPMENT_SLOT_END
Definition: Player.h:694
std::uint64_t uint64
Definition: Define.h:106
Definition: Player.h:749
ObjectGuid Items[EQUIPMENT_SLOT_END]
Definition: Player.h:756
std::string Name
Definition: Player.h:753
std::string IconName
Definition: Player.h:754
EquipmentSetUpdateState state
Definition: Player.h:757
uint64 Guid
Definition: Player.h:752
uint32 IgnoreMask
Definition: Player.h:755
EquipmentSets m_EquipmentSets
Definition: Player.h:2878

References EQUIPMENT_SET_UNCHANGED, EQUIPMENT_SLOT_END, Field::Get(), EquipmentSet::Guid, EquipmentSet::IconName, EquipmentSet::IgnoreMask, EquipmentSet::Items, m_EquipmentSets, MAX_EQUIPMENT_SET_INDEX, EquipmentSet::Name, and EquipmentSet::state.

Referenced by LoadFromDB().

◆ _LoadFriendList()

void Player::_LoadFriendList ( PreparedQueryResult  result)
protected

◆ _LoadGlyphAuras()

void Player::_LoadGlyphAuras ( )
protected
5798{
5799 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
5800 {
5801 if (uint32 glyph = GetGlyph(i))
5802 {
5803 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyph))
5804 {
5805 if (GlyphSlotEntry const* glyphSlotEntry = sGlyphSlotStore.LookupEntry(GetGlyphSlot(i)))
5806 {
5807 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(glyphEntry->SpellId);
5808 if (glyphEntry->TypeFlags == glyphSlotEntry->TypeFlags)
5809 {
5810 if (!spellInfo->Stances)
5812 continue;
5813 }
5814 else
5815 LOG_ERROR("entities.player", "Player {} has glyph with typeflags {} in slot with typeflags {}, removing.", m_name, glyphEntry->TypeFlags, glyphSlotEntry->TypeFlags);
5816 }
5817 else
5818 LOG_ERROR("entities.player", "Player {} has not existing glyph slot entry {} on index {}", m_name, GetGlyphSlot(i), i);
5819 }
5820 else
5821 LOG_ERROR("entities.player", "Player {} has not existing glyph entry {} on index {}", m_name, glyph, i);
5822
5823 // On any error remove glyph
5824 SetGlyph(i, 0, true);
5825 }
5826 }
5827}
DBCStorage< GlyphSlotEntry > sGlyphSlotStore(GlyphSlotfmt)
DBCStorage< GlyphPropertiesEntry > sGlyphPropertiesStore(GlyphPropertiesfmt)
TriggerCastFlags
Definition: SpellDefines.h:130
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition: SpellDefines.h:148
@ TRIGGERED_IGNORE_CASTER_AURASTATE
Will ignore shapeshift checks.
Definition: SpellDefines.h:143
@ TRIGGERED_IGNORE_SHAPESHIFT
Will not adjust facing to target (if any)
Definition: SpellDefines.h:142
std::string m_name
Definition: Object.h:638
uint32 GetGlyph(uint8 slot) const
Definition: Player.h:1747
uint32 GetGlyphSlot(uint8 slot) const
Definition: Player.h:1738
void SetGlyph(uint8 slot, uint32 glyph, bool save)
Definition: Player.h:1739
Definition: DBCStructure.h:1021
Definition: DBCStructure.h:1029

References Unit::CastSpell(), GetGlyph(), GetGlyphSlot(), LOG_ERROR, WorldObject::m_name, MAX_GLYPH_SLOT_INDEX, SetGlyph(), sGlyphPropertiesStore, sGlyphSlotStore, sSpellMgr, SpellInfo::Stances, TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_CASTER_AURASTATE, and TRIGGERED_IGNORE_SHAPESHIFT.

Referenced by LoadFromDB().

◆ _LoadGlyphs()

void Player::_LoadGlyphs ( PreparedQueryResult  result)
protected
14906{
14907 // SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 from character_glyphs WHERE guid = '%u'
14908 if (!result)
14909 return;
14910
14911 do
14912 {
14913 Field* fields = result->Fetch();
14914
14915 uint8 spec = fields[0].Get<uint8>();
14916 if (spec >= m_specsCount)
14917 continue;
14918
14919 m_Glyphs[spec][0] = fields[1].Get<uint16>();
14920 m_Glyphs[spec][1] = fields[2].Get<uint16>();
14921 m_Glyphs[spec][2] = fields[3].Get<uint16>();
14922 m_Glyphs[spec][3] = fields[4].Get<uint16>();
14923 m_Glyphs[spec][4] = fields[5].Get<uint16>();
14924 m_Glyphs[spec][5] = fields[6].Get<uint16>();
14925 } while (result->NextRow());
14926}

References Field::Get(), m_Glyphs, and m_specsCount.

Referenced by LoadFromDB().

◆ _LoadGroup()

void Player::_LoadGroup ( )
protected
6496{
6497 if (ObjectGuid groupId = sCharacterCache->GetCharacterGroupGuidByGuid(GetGUID()))
6498 {
6499 if (Group* group = sGroupMgr->GetGroupByGUID(groupId.GetCounter()))
6500 {
6501 if (group->GetMemberGroup(GetGUID()) <= MAX_RAID_SUBGROUPS)
6502 {
6503 if (group->IsLeader(GetGUID()))
6504 {
6506 }
6507
6508 uint8 subgroup = group->GetMemberGroup(GetGUID());
6509 SetGroup(group, subgroup);
6510
6511 // the group leader may change the instance difficulty while the player is offline
6512 SetDungeonDifficulty(group->GetDungeonDifficulty());
6513 SetRaidDifficulty(group->GetRaidDifficulty());
6514 }
6515 }
6516 }
6517
6518 if (!GetGroup() || !GetGroup()->IsLeader(GetGUID()))
6520}
#define sGroupMgr
Definition: GroupMgr.h:51
#define MAX_RAID_SUBGROUPS
Definition: Group.h:45
@ PLAYER_FLAGS_GROUP_LEADER
Definition: Player.h:474
void SetPlayerFlag(PlayerFlags flags)
Definition: Player.h:1109
void RemovePlayerFlag(PlayerFlags flags)
Definition: Player.h:1110
void SetDungeonDifficulty(Difficulty dungeon_difficulty)
Definition: Player.h:1901
void SetGroup(Group *group, int8 subgroup=-1)
Definition: Player.cpp:11516
void SetRaidDifficulty(Difficulty raid_difficulty)
Definition: Player.h:1902
Group * GetGroup()
Definition: Player.h:2445
Definition: Group.h:169

References GetGroup(), Object::GetGUID(), MAX_RAID_SUBGROUPS, PLAYER_FLAGS_GROUP_LEADER, RemovePlayerFlag(), sCharacterCache, SetDungeonDifficulty(), SetGroup(), SetPlayerFlag(), SetRaidDifficulty(), and sGroupMgr.

Referenced by LoadFromDB().

◆ _LoadHomeBind()

bool Player::_LoadHomeBind ( PreparedQueryResult  result)
protected
7003{
7004 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
7005 if (!info)
7006 {
7007 LOG_ERROR("entities.player", "Player (Name {}) has incorrect race/class pair. Can't be loaded.", GetName());
7008 return false;
7009 }
7010
7011 bool ok = false;
7012 // SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?
7013 if (result)
7014 {
7015 Field* fields = result->Fetch();
7016
7017 m_homebindMapId = fields[0].Get<uint16>();
7018 m_homebindAreaId = fields[1].Get<uint16>();
7019 m_homebindX = fields[2].Get<float>();
7020 m_homebindY = fields[3].Get<float>();
7021 m_homebindZ = fields[4].Get<float>();
7022
7023 MapEntry const* bindMapEntry = sMapStore.LookupEntry(m_homebindMapId);
7024
7025 // accept saved data only for valid position (and non instanceable), and accessable
7027 !bindMapEntry->Instanceable() && GetSession()->Expansion() >= bindMapEntry->Expansion())
7028 ok = true;
7029 else
7030 {
7032 stmt->SetData(0, GetGUID().GetCounter());
7033 CharacterDatabase.Execute(stmt);
7034 }
7035 }
7036
7037 if (!ok)
7038 {
7039 m_homebindMapId = info->mapId;
7040 m_homebindAreaId = info->areaId;
7041 m_homebindX = info->positionX;
7042 m_homebindY = info->positionY;
7043 m_homebindZ = info->positionZ;
7044
7046 stmt->SetData(0, GetGUID().GetCounter());
7047 stmt->SetData(1, m_homebindMapId);
7048 stmt->SetData(2, m_homebindAreaId);
7049 stmt->SetData (3, m_homebindX);
7050 stmt->SetData (4, m_homebindY);
7051 stmt->SetData (5, m_homebindZ);
7052 CharacterDatabase.Execute(stmt);
7053 }
7054
7055 LOG_DEBUG("entities.player", "Setting player home position - mapid: {}, areaid: {}, X: {}, Y: {}, Z: {}",
7057 return true;
7058}
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
@ CHAR_INS_PLAYER_HOMEBIND
Definition: CharacterDatabase.h:240
@ CHAR_DEL_PLAYER_HOMEBIND
Definition: CharacterDatabase.h:242
std::string const & GetName() const
Definition: Object.h:458
LowType GetCounter() const
Definition: ObjectGuid.h:145
Definition: Player.h:335
float positionX
Definition: Player.h:341
uint32 areaId
Definition: Player.h:340
float positionY
Definition: Player.h:342
float positionZ
Definition: Player.h:343
uint32 mapId
Definition: Player.h:339
uint8 getClass() const
Definition: Unit.h:765
uint8 getRace(bool original=false) const
Definition: Unit.cpp:20920
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition: MapMgr.h:91
uint8 Expansion() const
Definition: WorldSession.h:373
Definition: DBCStructure.h:1325

References PlayerInfo::areaId, CHAR_DEL_PLAYER_HOMEBIND, CHAR_INS_PLAYER_HOMEBIND, CharacterDatabase, WorldSession::Expansion(), Field::Get(), Unit::getClass(), ObjectGuid::GetCounter(), Object::GetGUID(), WorldObject::GetName(), Unit::getRace(), GetSession(), MapMgr::IsValidMapCoord(), LOG_DEBUG, LOG_ERROR, m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, PlayerInfo::mapId, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, PreparedStatementBase::SetData(), sMapStore, and sObjectMgr.

Referenced by LoadFromDB().

◆ _LoadInstanceTimeRestrictions()

void Player::_LoadInstanceTimeRestrictions ( PreparedQueryResult  result)
protected
15721{
15722 if (!result)
15723 return;
15724
15725 do
15726 {
15727 Field* fields = result->Fetch();
15728 _instanceResetTimes.insert(InstanceTimeMap::value_type(fields[0].Get<uint32>(), fields[1].Get<uint64>()));
15729 } while (result->NextRow());
15730}
InstanceTimeMap _instanceResetTimes
Definition: Player.h:2950

References _instanceResetTimes.

Referenced by LoadFromDB().

◆ _LoadInventory()

void Player::_LoadInventory ( PreparedQueryResult  result,
uint32  timeDiff 
)
protected
5850{
5851 //QueryResult* result = CharacterDatabase.Query("SELECT data, text, bag, slot, item, item_template FROM character_inventory JOIN item_instance ON character_inventory.item = item_instance.guid WHERE character_inventory.guid = '{}' ORDER BY bag, slot", GetGUID().GetCounter());
5852 //NOTE: the "order by `bag`" is important because it makes sure
5853 //the bagMap is filled before items in the bags are loaded
5854 //NOTE2: the "order by `slot`" is needed because mainhand weapons are (wrongly?)
5855 //expected to be equipped before offhand items (TODO: fixme)
5856
5857 if (result)
5858 {
5859 uint32 zoneId = GetZoneId();
5860
5861 std::map<ObjectGuid::LowType, Bag*> bagMap; // fast guid lookup for bags
5862 std::map<ObjectGuid::LowType, Item*> invalidBagMap; // fast guid lookup for bags
5863 std::list<Item*> problematicItems;
5864 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
5865
5866 // Prevent items from being added to the queue while loading
5868 do
5869 {
5870 Field* fields = result->Fetch();
5871 if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields))
5872 {
5873 ObjectGuid::LowType bagGuid = fields[11].Get<uint32>();
5874 uint8 slot = fields[12].Get<uint8>();
5875
5876 uint8 err = EQUIP_ERR_OK;
5877 // Item is not in bag
5878 if (!bagGuid)
5879 {
5880 item->SetContainer(nullptr);
5881 item->SetSlot(slot);
5882
5884 {
5885 ItemPosCountVec dest;
5886 err = CanStoreItem(INVENTORY_SLOT_BAG_0, slot, dest, item, false);
5887 if (err == EQUIP_ERR_OK)
5888 item = StoreItem(dest, item, true);
5889 }
5890 else if (IsEquipmentPos(INVENTORY_SLOT_BAG_0, slot))
5891 {
5892 uint16 dest;
5893 if (sScriptMgr->CheckItemInSlotAtLoadInventory(this, item, slot, err, dest))
5894 err = CanEquipItem(slot, dest, item, false, false);
5895 if (err == EQUIP_ERR_OK)
5896 QuickEquipItem(dest, item);
5897 }
5898 else if (IsBankPos(INVENTORY_SLOT_BAG_0, slot))
5899 {
5900 ItemPosCountVec dest;
5901 err = CanBankItem(INVENTORY_SLOT_BAG_0, slot, dest, item, false, false);
5902 if (err == EQUIP_ERR_OK)
5903 item = BankItem(dest, item, true);
5904 }
5905
5906 // Remember bags that may contain items in them
5907 if (err == EQUIP_ERR_OK)
5908 {
5909 if (IsBagPos(item->GetPos()))
5910 if (Bag* pBag = item->ToBag())
5911 bagMap[item->GetGUID().GetCounter()] = pBag;
5912 }
5913 else if (IsBagPos(item->GetPos()))
5914 if (item->IsBag())
5915 invalidBagMap[item->GetGUID().GetCounter()] = item;
5916 }
5917 else
5918 {
5919 item->SetSlot(NULL_SLOT);
5920 // Item is in the bag, find the bag
5921 std::map<ObjectGuid::LowType, Bag*>::iterator itr = bagMap.find(bagGuid);
5922 if (itr != bagMap.end())
5923 {
5924 ItemPosCountVec dest;
5925 err = CanStoreItem(itr->second->GetSlot(), slot, dest, item);
5926 if (err == EQUIP_ERR_OK)
5927 item = StoreItem(dest, item, true);
5928 }
5929 else if (invalidBagMap.find(bagGuid) != invalidBagMap.end())
5930 {
5931 std::map<ObjectGuid::LowType, Item*>::iterator iterator = invalidBagMap.find(bagGuid);
5932 if (std::find(problematicItems.begin(), problematicItems.end(), iterator->second) != problematicItems.end())
5933 {
5935 }
5936 }
5937 else
5938 {
5939 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) which doesnt have a valid bag (Bag GUID: {}, slot: {}). Possible cheat?",
5940 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), bagGuid, slot);
5941 item->DeleteFromInventoryDB(trans);
5942 delete item;
5943 continue;
5944 }
5945 }
5946
5947 // Item's state may have changed after storing
5948 if (err == EQUIP_ERR_OK)
5949 item->SetState(ITEM_UNCHANGED, this);
5950 else
5951 {
5952 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) which can't be loaded into inventory (Bag GUID: {}, slot: {}) by reason {}. Item will be sent by mail.",
5953 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), bagGuid, slot, err);
5954 item->DeleteFromInventoryDB(trans);
5955 problematicItems.push_back(item);
5956 }
5957 }
5958 } while (result->NextRow());
5959
5961
5962 // Send problematic items by mail
5963 while (!problematicItems.empty())
5964 {
5965 std::string subject = GetSession()->GetAcoreString(LANG_NOT_EQUIPPED_ITEM);
5966
5967 MailDraft draft(subject, "There were problems with equipping item(s).");
5968 for (uint8 i = 0; !problematicItems.empty() && i < MAX_MAIL_ITEMS; ++i)
5969 {
5970 draft.AddItem(problematicItems.front());
5971 problematicItems.pop_front();
5972 }
5973 draft.SendMailTo(trans, this, MailSender(this, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED);
5974 }
5975 CharacterDatabase.CommitTransaction(trans);
5976 }
5977 //if (IsAlive())
5979}
#define MAX_MAIL_ITEMS
Definition: Mail.h:34
@ MAIL_CHECK_MASK_COPIED
This mail was returned. Do not allow returning mail back again.
Definition: Mail.h:50
@ MAIL_STATIONERY_GM
Definition: Mail.h:60
@ EQUIP_ERR_OK
Definition: Item.h:47
@ EQUIP_ERR_INT_BAG_ERROR
Definition: Item.h:87
@ ITEM_UNCHANGED
Definition: Item.h:209
@ NULL_SLOT
Definition: Item.h:41
std::vector< ItemPosCount > ItemPosCountVec
Definition: Player.h:771
#define INVENTORY_SLOT_BAG_0
Definition: Player.h:670
@ LANG_NOT_EQUIPPED_ITEM
Definition: Language.h:671
Definition: Bag.h:28
Bag * ToBag()
Definition: Item.h:250
uint32 GetZoneId() const
Definition: Object.cpp:3141
uint32 LowType
Definition: ObjectGuid.h:122
static bool IsEquipmentPos(uint16 pos)
Definition: Player.h:1256
InventoryResult CanEquipItem(uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading=true) const
Definition: PlayerStorage.cpp:1828
void QuickEquipItem(uint16 pos, Item *pItem)
Definition: PlayerStorage.cpp:2850
Item * BankItem(ItemPosCountVec const &dest, Item *pItem, bool update)
Definition: Player.h:1325
InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
Definition: Player.h:1276
Item * StoreItem(ItemPosCountVec const &pos, Item *pItem, bool update)
Definition: PlayerStorage.cpp:2589
static bool IsInventoryPos(uint16 pos)
Definition: Player.h:1254
Item * _LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field *fields)
Definition: PlayerStorage.cpp:5981
static bool IsBagPos(uint16 pos)
Definition: PlayerStorage.cpp:613
InventoryResult CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap, bool not_loading=true) const
Definition: PlayerStorage.cpp:2047
static bool IsBankPos(uint16 pos)
Definition: Player.h:1259
char const * GetAcoreString(uint32 entry) const
Definition: WorldSession.cpp:790

References _ApplyAllItemMods(), _LoadItem(), MailDraft::AddItem(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), CharacterDatabase, EQUIP_ERR_INT_BAG_ERROR, EQUIP_ERR_OK, Field::Get(), WorldSession::GetAcoreString(), Object::GetGUID(), WorldObject::GetName(), GetSession(), WorldObject::GetZoneId(), INVENTORY_SLOT_BAG_0, IsBagPos(), IsBankPos(), IsEquipmentPos(), IsInventoryPos(), ITEM_UNCHANGED, LANG_NOT_EQUIPPED_ITEM, LOG_ERROR, m_itemUpdateQueueBlocked, MAIL_CHECK_MASK_COPIED, MAIL_STATIONERY_GM, MAX_MAIL_ITEMS, NULL_SLOT, QuickEquipItem(), MailDraft::SendMailTo(), sScriptMgr, StoreItem(), Item::ToBag(), and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadItem()

Item * Player::_LoadItem ( CharacterDatabaseTransaction  trans,
uint32  zoneId,
uint32  timeDiff,
Field fields 
)
private
5982{
5983 Item* item = nullptr;
5984 ObjectGuid::LowType itemGuid = fields[13].Get<uint32>();
5985 uint32 itemEntry = fields[14].Get<uint32>();
5986 if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry))
5987 {
5988 bool remove = false;
5989 item = NewItemOrBag(proto);
5990 if (item->LoadFromDB(itemGuid, GetGUID(), fields, itemEntry))
5991 {
5992 CharacterDatabasePreparedStatement* stmt = nullptr;
5993
5994 // Do not allow to have item limited to another map/zone in alive state
5995 if (IsAlive() && item->IsLimitedToAnotherMapOrZone(GetMapId(), zoneId))
5996 {
5997 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', map: {}) has item ({}, entry: {}) limited to another map ({}). Deleting item.",
5998 GetGUID().ToString(), GetName(), GetMapId(), item->GetGUID().ToString(), item->GetEntry(), zoneId);
5999 remove = true;
6000 }
6001 // "Conjured items disappear if you are logged out for more than 15 minutes"
6002 else if (timeDiff > 15 * MINUTE && proto->HasFlag(ITEM_FLAG_CONJURED))
6003 {
6004 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', diff: {}) has conjured item ({}, entry: {}) with expired lifetime (15 minutes). Deleting item.",
6005 GetGUID().ToString(), GetName(), timeDiff, item->GetGUID().ToString(), item->GetEntry());
6006 remove = true;
6007 }
6008 else if (item->IsRefundable())
6009 {
6010 if (item->GetPlayedTime() > (2 * HOUR))
6011 {
6012 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with expired refund time ({}). Deleting refund data and removing refundable flag.",
6013 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), item->GetPlayedTime());
6014 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_REFUND_INSTANCE);
6015 stmt->SetData(0, item->GetGUID().GetCounter());
6016 trans->Append(stmt);
6017
6019 }
6020 else
6021 {
6022 // xinef: sync query
6023 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_REFUNDS);
6024 stmt->SetData(0, item->GetGUID().GetCounter());
6025 stmt->SetData(1, GetGUID().GetCounter());
6026 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
6027 {
6028 item->SetRefundRecipient((*result)[0].Get<uint32>());
6029 item->SetPaidMoney((*result)[1].Get<uint32>());
6030 item->SetPaidExtendedCost((*result)[2].Get<uint16>());
6031 AddRefundReference(item->GetGUID());
6032 }
6033 else
6034 {
6035 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with refundable flags, but without data in item_refund_instance. Removing flag.",
6036 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry());
6038 }
6039 }
6040 }
6041 else if (item->IsBOPTradable())
6042 {
6043 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_BOP_TRADE);
6044 stmt->SetData(0, item->GetGUID().GetCounter());
6045
6046 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
6047 {
6048 AllowedLooterSet looters;
6049 for (std::string_view guidStr : Acore::Tokenize((*result)[0].Get<std::string_view>(), ' ', false))
6050 {
6051 if (Optional<ObjectGuid::LowType> guid = Acore::StringTo<ObjectGuid::LowType>(guidStr))
6052 {
6053 looters.insert(ObjectGuid::Create<HighGuid::Player>(*guid));
6054 }
6055 else
6056 {
6057 LOG_WARN("entities.player.loading", "Player::_LoadInventory: invalid item_soulbound_trade_data GUID '{}' for item {}. Skipped.", guidStr, item->GetGUID().ToString());
6058 }
6059 }
6060
6061 if (looters.size() > 1 && item->GetTemplate()->GetMaxStackSize() == 1 && item->IsSoulBound())
6062 {
6063 item->SetSoulboundTradeable(looters);
6064 AddTradeableItem(item);
6065 }
6066 else
6067 item->ClearSoulboundTradeable(this);
6068 }
6069 else
6070 {
6071 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with ITEM_FIELD_FLAG_BOP_TRADEABLE flag, but without data in item_soulbound_trade_data. Removing flag.",
6072 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry());
6074 }
6075 }
6076 else if (proto->HolidayId)
6077 {
6078 remove = true;
6079 GameEventMgr::GameEventDataMap const& events = sGameEventMgr->GetEventMap();
6080 GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();
6081 for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
6082 {
6083 if (uint32(events[*itr].holiday_id) == proto->HolidayId)
6084 {
6085 remove = false;
6086 break;
6087 }
6088 }
6089 }
6090 }
6091 else
6092 {
6093 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has broken item (GUID: {}, entry: {}) in inventory. Deleting item.",
6094 GetGUID().ToString(), GetName(), itemGuid, itemEntry);
6095 remove = true;
6096 }
6097 // Remove item from inventory if necessary
6098 if (remove)
6099 {
6100 Item::DeleteFromInventoryDB(trans, itemGuid);
6101 item->FSetState(ITEM_REMOVED);
6102 item->SaveToDB(trans); // it also deletes item object!
6103 item = nullptr;
6104 }
6105 }
6106 else
6107 {
6108 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has unknown item (entry: {}) in inventory. Deleting item.",
6109 GetGUID().ToString(), GetName(), itemEntry);
6110 Item::DeleteFromInventoryDB(trans, itemGuid);
6111 Item::DeleteFromDB(trans, itemGuid);
6112 }
6113 return item;
6114}
@ ITEM_FIELD_FLAGS
Definition: UpdateFields.h:42
@ ITEM_REMOVED
Definition: Item.h:212
@ ITEM_FIELD_FLAG_REFUNDABLE
Definition: ItemTemplate.h:121
@ ITEM_FIELD_FLAG_BOP_TRADEABLE
Definition: ItemTemplate.h:117
@ ITEM_FLAG_CONJURED
Definition: ItemTemplate.h:148
Item * NewItemOrBag(ItemTemplate const *proto)
Definition: Bag.h:67
GuidSet AllowedLooterSet
Definition: LootMgr.h:152
#define sGameEventMgr
Definition: GameEventMgr.h:186
events
Definition: boss_sartura.cpp:43
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition: DatabaseEnvFwd.h:46
@ CHAR_DEL_ITEM_REFUND_INSTANCE
Definition: CharacterDatabase.h:374
@ CHAR_SEL_ITEM_BOP_TRADE
Definition: CharacterDatabase.h:120
@ CHAR_SEL_ITEM_REFUNDS
Definition: CharacterDatabase.h:119
#define LOG_WARN(filterType__,...)
Definition: Log.h:160
constexpr auto HOUR
Definition: Common.h:48
constexpr auto MINUTE
Definition: Common.h:47
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:24
uint32 GetPlayedTime()
Definition: Item.cpp:1247
static void DeleteFromInventoryDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition: Item.cpp:533
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field *fields, uint32 entry)
Definition: Item.cpp:420
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition: Item.cpp:337
bool IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) const
Definition: Item.cpp:1057
void SetSoulboundTradeable(AllowedLooterSet &allowedLooters)
Definition: Item.cpp:1259
void SetPaidMoney(uint32 money)
Definition: Item.h:345
bool IsSoulBound() const
Definition: Item.h:236
bool IsBOPTradable() const
Definition: Item.h:262
void SetRefundRecipient(ObjectGuid::LowType pGuidLow)
Definition: Item.h:344
bool IsRefundable() const
Definition: Item.h:261
void FSetState(ItemUpdateState state)
Definition: Item.h:330
void SetPaidExtendedCost(uint32 iece)
Definition: Item.h:346
void ClearSoulboundTradeable(Player *currentOwner)
Definition: Item.cpp:1265
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition: Item.cpp:519
uint32 GetMaxStackSize() const
Definition: ItemTemplate.h:729
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:860
uint32 GetEntry() const
Definition: Object.h:112
uint32 GetMapId() const
Definition: Position.h:276
void AddRefundReference(ObjectGuid itemGUID)
Definition: Player.cpp:15458
void AddTradeableItem(Item *item)
Definition: PlayerStorage.cpp:4147
bool IsAlive() const
Definition: Unit.h:1151
std::vector< GameEventData > GameEventDataMap
Definition: GameEventMgr.h:107
std::set< uint16 > ActiveEvents
Definition: GameEventMgr.h:106

References AddRefundReference(), AddTradeableItem(), CHAR_DEL_ITEM_REFUND_INSTANCE, CHAR_SEL_ITEM_BOP_TRADE, CHAR_SEL_ITEM_REFUNDS, CharacterDatabase, Item::ClearSoulboundTradeable(), Item::DeleteFromDB(), Item::DeleteFromInventoryDB(), Item::FSetState(), Field::Get(), ObjectGuid::GetCounter(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), ItemTemplate::GetMaxStackSize(), WorldObject::GetName(), Item::GetPlayedTime(), Item::GetTemplate(), HOUR, Unit::IsAlive(), Item::IsBOPTradable(), Item::IsLimitedToAnotherMapOrZone(), Item::IsRefundable(), Item::IsSoulBound(), ITEM_FIELD_FLAG_BOP_TRADEABLE, ITEM_FIELD_FLAG_REFUNDABLE, ITEM_FIELD_FLAGS, ITEM_FLAG_CONJURED, ITEM_REMOVED, Item::LoadFromDB(), LOG_DEBUG, LOG_ERROR, LOG_WARN, MINUTE, NewItemOrBag(), Object::RemoveFlag(), Item::SaveToDB(), PreparedStatementBase::SetData(), Item::SetPaidExtendedCost(), Item::SetPaidMoney(), Item::SetRefundRecipient(), Item::SetSoulboundTradeable(), sGameEventMgr, sObjectMgr, Acore::Tokenize(), ObjectGuid::ToString(), and Position::ToString().

Referenced by _LoadInventory().

◆ _LoadMail()

void Player::_LoadMail ( PreparedQueryResult  mailsResult,
PreparedQueryResult  mailItemsResult 
)
protected
6170{
6171 time_t cur_time = GameTime::GetGameTime().count();
6172
6173 m_mail.clear();
6174
6175 std::unordered_map<uint32, Mail*> mailById;
6176
6177 if (mailsResult)
6178 {
6179 do
6180 {
6181 Field* fields = mailsResult->Fetch();
6182 Mail* m = new Mail;
6183
6184 m->messageID = fields[0].Get<uint32>();
6185 m->messageType = fields[1].Get<uint8>();
6186 m->sender = fields[2].Get<uint32>();
6187 m->receiver = fields[3].Get<uint32>();
6188 m->subject = fields[4].Get<std::string>();
6189 m->body = fields[5].Get<std::string>();
6190 m->expire_time = time_t(fields[6].Get<uint32>());
6191 m->deliver_time = time_t(fields[7].Get<uint32>());
6192 m->money = fields[8].Get<uint32>();
6193 m->COD = fields[9].Get<uint32>();
6194 m->checked = fields[10].Get<uint8>();
6195 m->stationery = fields[11].Get<uint8>();
6196 m->mailTemplateId = fields[12].Get<int16>();
6197
6198 if (cur_time > m->expire_time)
6199 {
6200 LOG_DEBUG("entities.player", "Player::_LoadMail: Mail ({}) has expired - ignored.", m->messageID);
6201 continue;
6202 }
6203
6204 if (m->mailTemplateId && !sMailTemplateStore.LookupEntry(m->mailTemplateId))
6205 {
6206 LOG_ERROR("entities.player", "Player::_LoadMail: Mail ({}) has nonexistent MailTemplateId ({}), remove at load", m->messageID, m->mailTemplateId);
6207 m->mailTemplateId = 0;
6208 }
6209
6211
6212 m_mail.push_back(m);
6213 mailById[m->messageID] = m;
6214 } while (mailsResult->NextRow());
6215 }
6216
6217 if (mailItemsResult)
6218 {
6219 do
6220 {
6221 Field* fields = mailItemsResult->Fetch();
6222 uint32 mailId = fields[14].Get<uint32>();
6223 _LoadMailedItem(GetGUID(), this, mailId, mailById[mailId], fields);
6224 } while (mailItemsResult->NextRow());
6225 }
6226
6228}
@ MAIL_STATE_UNCHANGED
Definition: Mail.h:69
DBCStorage< MailTemplateEntry > sMailTemplateStore(MailTemplateEntryfmt)
std::int16_t int16
Definition: Define.h:104
void UpdateNextMailTimeAndUnreads()
Definition: PlayerUpdates.cpp:434
static Item * _LoadMailedItem(ObjectGuid const &playerGuid, Player *player, uint32 mailId, Mail *mail, Field *fields)
Definition: PlayerStorage.cpp:6117
Definition: Mail.h:168
ObjectGuid::LowType receiver
Definition: Mail.h:174
uint8 messageType
Definition: Mail.h:170
uint32 messageID
Definition: Mail.h:169
time_t expire_time
Definition: Mail.h:179
uint32 sender
Definition: Mail.h:173
uint8 stationery
Definition: Mail.h:171
std::string subject
Definition: Mail.h:175
std::string body
Definition: Mail.h:176
time_t deliver_time
Definition: Mail.h:180
uint32 COD
Definition: Mail.h:182
uint32 checked
Definition: Mail.h:183
MailState state
Definition: Mail.h:184
uint32 money
Definition: Mail.h:181
uint16 mailTemplateId
Definition: Mail.h:172

References _LoadMailedItem(), Mail::body, Mail::checked, Mail::COD, Mail::deliver_time, Mail::expire_time, Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), LOG_DEBUG, LOG_ERROR, m_mail, MAIL_STATE_UNCHANGED, Mail::mailTemplateId, Mail::messageID, Mail::messageType, Mail::money, Mail::receiver, Mail::sender, sMailTemplateStore, Mail::state, Mail::stationery, Mail::subject, and UpdateNextMailTimeAndUnreads().

Referenced by LoadFromDB().

◆ _LoadMailedItem()

Item * Player::_LoadMailedItem ( ObjectGuid const &  playerGuid,
Player player,
uint32  mailId,
Mail mail,
Field fields 
)
staticprotected
6118{
6119 ObjectGuid::LowType itemGuid = fields[11].Get<uint32>();
6120 uint32 itemEntry = fields[12].Get<uint32>();
6121
6122 ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry);
6123 if (!proto)
6124 {
6125 LOG_ERROR("entities.player", "Player {} ({}) has unknown item in mailed items (GUID: {}, Entry: {}) in mail ({}), deleted.",
6126 player ? player->GetName() : "<unknown>", playerGuid.ToString(), itemGuid, itemEntry, mailId);
6127
6128 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
6129
6131 stmt->SetData(0, itemGuid);
6132 trans->Append(stmt);
6133
6134 CharacterDatabase.CommitTransaction(trans);
6135 return nullptr;
6136 }
6137
6138 Item* item = NewItemOrBag(proto);
6139
6140 ObjectGuid ownerGuid = fields[13].Get<uint32>() ? ObjectGuid::Create<HighGuid::Player>(fields[13].Get<uint32>()) : ObjectGuid::Empty;
6141 if (!item->LoadFromDB(itemGuid, ownerGuid, fields, itemEntry))
6142 {
6143 LOG_ERROR("entities.player", "Player::_LoadMailedItems: Item (GUID: {}) in mail ({}) doesn't exist, deleted from mail.", itemGuid, mailId);
6144
6146 stmt->SetData(0, itemGuid);
6147 CharacterDatabase.Execute(stmt);
6148
6149 item->FSetState(ITEM_REMOVED);
6150
6152 item->SaveToDB(temp);
6153 return nullptr;
6154 }
6155
6156 if (mail)
6157 {
6158 mail->AddItem(itemGuid, itemEntry);
6159 }
6160
6161 if (player)
6162 {
6163 player->AddMItem(item);
6164 }
6165
6166 return item;
6167}
@ CHAR_DEL_INVALID_MAIL_ITEM
Definition: CharacterDatabase.h:113
@ CHAR_DEL_MAIL_ITEM
Definition: CharacterDatabase.h:112
static ObjectGuid const Empty
Definition: ObjectGuid.h:120
void AddMItem(Item *it)
Definition: Player.h:1658
void AddItem(ObjectGuid::LowType itemGuidLow, uint32 item_template)
Definition: Mail.h:186

References Mail::AddItem(), AddMItem(), CHAR_DEL_INVALID_MAIL_ITEM, CHAR_DEL_MAIL_ITEM, CharacterDatabase, ObjectGuid::Empty, Item::FSetState(), Field::Get(), WorldObject::GetName(), ITEM_REMOVED, Item::LoadFromDB(), LOG_ERROR, NewItemOrBag(), Item::SaveToDB(), PreparedStatementBase::SetData(), sObjectMgr, and ObjectGuid::ToString().

Referenced by _LoadMail(), and DeleteFromDB().

◆ _LoadMonthlyQuestStatus()

void Player::_LoadMonthlyQuestStatus ( PreparedQueryResult  result)
protected
6461{
6462 m_monthlyquests.clear();
6463
6464 if (result)
6465 {
6466 do
6467 {
6468 Field* fields = result->Fetch();
6469 uint32 quest_id = fields[0].Get<uint32>();
6470 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6471 if (!quest)
6472 continue;
6473
6474 m_monthlyquests.insert(quest_id);
6475 LOG_DEBUG("entities.player.loading", "Monthly quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6476 } while (result->NextRow());
6477 }
6478
6479 m_MonthlyQuestChanged = false;
6480}
QuestSet m_monthlyquests
Definition: Player.h:2662

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_MonthlyQuestChanged, m_monthlyquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadPetStable()

void Player::_LoadPetStable ( uint8  petStableSlots,
PreparedQueryResult  result 
)
protected
15770{
15771 if (!petStableSlots && !result)
15772 return;
15773
15774 m_petStable = std::make_unique<PetStable>();
15775 m_petStable->MaxStabledPets = petStableSlots;
15776
15777 if (m_petStable->MaxStabledPets > MAX_PET_STABLES)
15778 {
15779 LOG_ERROR("entities.player", "Player::LoadFromDB: Player ({}) can't have more stable slots than {}, but has {} in DB",
15780 GetGUID().ToString(), MAX_PET_STABLES, m_petStable->MaxStabledPets);
15781
15782 m_petStable->MaxStabledPets = MAX_PET_STABLES;
15783 }
15784
15785 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
15786 // SELECT id, entry, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ?
15787 if (result)
15788 {
15789 do
15790 {
15791 Field* fields = result->Fetch();
15792 PetStable::PetInfo petInfo;
15793 petInfo.PetNumber = fields[0].Get<uint32>();
15794 petInfo.CreatureId = fields[1].Get<uint32>();
15795 petInfo.DisplayId = fields[2].Get<uint32>();
15796 petInfo.Level = fields[3].Get<uint16>();
15797 petInfo.Experience = fields[4].Get<uint32>();
15798 petInfo.ReactState = ReactStates(fields[5].Get<uint8>());
15799 PetSaveMode slot = PetSaveMode(fields[6].Get<uint8>());
15800 petInfo.Name = fields[7].Get<std::string>();
15801 petInfo.WasRenamed = fields[8].Get<bool>();
15802 petInfo.Health = fields[9].Get<uint32>();
15803 petInfo.Mana = fields[10].Get<uint32>();
15804 petInfo.Happiness = fields[11].Get<uint32>();
15805 petInfo.ActionBar = fields[12].Get<std::string>();
15806 petInfo.LastSaveTime = fields[13].Get<uint32>();
15807 petInfo.CreatedBySpellId = fields[14].Get<uint32>();
15808 petInfo.Type = PetType(fields[15].Get<uint8>());
15809
15810 if (slot == PET_SAVE_AS_CURRENT)
15811 m_petStable->CurrentPet = std::move(petInfo);
15812 else if (slot >= PET_SAVE_FIRST_STABLE_SLOT && slot <= PET_SAVE_LAST_STABLE_SLOT)
15813 m_petStable->StabledPets[slot - 1] = std::move(petInfo);
15814 else if (slot == PET_SAVE_NOT_IN_SLOT)
15815 m_petStable->UnslottedPets.push_back(std::move(petInfo));
15816
15817 } while (result->NextRow());
15818 }
15819}
PetSaveMode
Definition: PetDefines.h:40
@ PET_SAVE_FIRST_STABLE_SLOT
Definition: PetDefines.h:43
@ PET_SAVE_LAST_STABLE_SLOT
Definition: PetDefines.h:44
@ PET_SAVE_NOT_IN_SLOT
Definition: PetDefines.h:45
@ PET_SAVE_AS_CURRENT
Definition: PetDefines.h:42
PetType
Definition: PetDefines.h:30
constexpr auto MAX_PET_STABLES
Definition: PetDefines.h:36
ReactStates
Definition: Unit.h:547
Definition: PetDefines.h:205
uint32 Mana
Definition: PetDefines.h:215
uint32 Happiness
Definition: PetDefines.h:216
uint32 CreatedBySpellId
Definition: PetDefines.h:218
uint32 Health
Definition: PetDefines.h:214
uint32 CreatureId
Definition: PetDefines.h:211
bool WasRenamed
Definition: PetDefines.h:222
uint8 Level
Definition: PetDefines.h:219
uint32 DisplayId
Definition: PetDefines.h:212
ReactStates ReactState
Definition: PetDefines.h:220
std::string Name
Definition: PetDefines.h:208
PetType Type
Definition: PetDefines.h:221
uint32 Experience
Definition: PetDefines.h:213
uint32 PetNumber
Definition: PetDefines.h:210
uint32 LastSaveTime
Definition: PetDefines.h:217
std::string ActionBar
Definition: PetDefines.h:209
std::unique_ptr< PetStable > m_petStable
Definition: Player.h:2937

References PetStable::PetInfo::ActionBar, PetStable::PetInfo::CreatedBySpellId, PetStable::PetInfo::CreatureId, PetStable::PetInfo::DisplayId, PetStable::PetInfo::Experience, Field::Get(), Object::GetGUID(), PetStable::PetInfo::Happiness, PetStable::PetInfo::Health, PetStable::PetInfo::LastSaveTime, PetStable::PetInfo::Level, LOG_ERROR, m_petStable, PetStable::PetInfo::Mana, MAX_PET_STABLES, PetStable::PetInfo::Name, PET_SAVE_AS_CURRENT, PET_SAVE_FIRST_STABLE_SLOT, PET_SAVE_LAST_STABLE_SLOT, PET_SAVE_NOT_IN_SLOT, PetStable::PetInfo::PetNumber, PetStable::PetInfo::ReactState, Position::ToString(), PetStable::PetInfo::Type, and PetStable::PetInfo::WasRenamed.

Referenced by LoadFromDB().

◆ _LoadQuestStatus()

void Player::_LoadQuestStatus ( PreparedQueryResult  result)
protected
6243{
6244 uint16 slot = 0;
6245
6247 //QueryResult* result = CharacterDatabase.Query("SELECT quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, itemcount1, itemcount2, itemcount3,
6248 // 11 12 13 14
6249 // itemcount4, itemcount5, itemcount6, playercount FROM character_queststatus WHERE guid = '{}'", GetGUID().GetCounter());
6250
6251 if (result)
6252 {
6253 do
6254 {
6255 Field* fields = result->Fetch();
6256
6257 uint32 quest_id = fields[0].Get<uint32>();
6258 // used to be new, no delete?
6259 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6260 if (quest)
6261 {
6262 // find or create
6263 QuestStatusData& questStatusData = m_QuestStatus[quest_id];
6264
6265 uint8 qstatus = fields[1].Get<uint8>();
6266 if (qstatus < MAX_QUEST_STATUS)
6267 questStatusData.Status = QuestStatus(qstatus);
6268 else
6269 {
6270 questStatusData.Status = QUEST_STATUS_INCOMPLETE;
6271 LOG_ERROR("entities.player", "Player {} ({}) has invalid quest {} status ({}), replaced by QUEST_STATUS_INCOMPLETE(3).",
6272 GetName(), GetGUID().ToString(), quest_id, qstatus);
6273 }
6274
6275 questStatusData.Explored = (fields[2].Get<uint8>() > 0);
6276
6277 time_t quest_time = time_t(fields[3].Get<uint32>());
6278
6279 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && !GetQuestRewardStatus(quest_id))
6280 {
6281 AddTimedQuest(quest_id);
6282
6283 if (quest_time <= GameTime::GetGameTime().count())
6284 questStatusData.Timer = 1;
6285 else
6286 questStatusData.Timer = uint32((quest_time - GameTime::GetGameTime().count()) * IN_MILLISECONDS);
6287 }
6288 else
6289 quest_time = 0;
6290
6291 for (uint32 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
6292 questStatusData.CreatureOrGOCount[i] = fields[4 + i].Get<uint16>();
6293
6294 for (uint32 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
6295 questStatusData.ItemCount[i] = fields[8 + i].Get<uint16>();
6296
6297 questStatusData.PlayerCount = fields[14].Get<uint16>();
6298
6299 // add to quest log
6300 if (slot < MAX_QUEST_LOG_SIZE && questStatusData.Status != QUEST_STATUS_NONE)
6301 {
6302 SetQuestSlot(slot, quest_id, uint32(quest_time)); // cast can't be helped
6303
6304 if (questStatusData.Status == QUEST_STATUS_COMPLETE)
6306 else if (questStatusData.Status == QUEST_STATUS_FAILED)
6308
6309 for (uint8 idx = 0; idx < QUEST_OBJECTIVES_COUNT; ++idx)
6310 if (questStatusData.CreatureOrGOCount[idx])
6311 SetQuestSlotCounter(slot, idx, questStatusData.CreatureOrGOCount[idx]);
6312
6313 if (questStatusData.PlayerCount)
6314 SetQuestSlotCounter(slot, QUEST_PVP_KILL_SLOT, questStatusData.PlayerCount);
6315
6316 ++slot;
6317 }
6318
6319 LOG_DEBUG("entities.player.loading", "Quest status is {{}} for quest {{}} for player ({})", questStatusData.Status, quest_id, GetGUID().ToString());
6320 }
6321 } while (result->NextRow());
6322 }
6323
6324 // clear quest log tail
6325 for (uint16 i = slot; i < MAX_QUEST_LOG_SIZE; ++i)
6326 SetQuestSlot(i, 0);
6327}
#define QUEST_ITEM_OBJECTIVES_COUNT
Definition: QuestDef.h:36
#define QUEST_OBJECTIVES_COUNT
Definition: QuestDef.h:35
#define MAX_QUEST_LOG_SIZE
Definition: QuestDef.h:33
#define QUEST_PVP_KILL_SLOT
Definition: QuestDef.h:43
QuestStatus
Definition: QuestDef.h:99
@ QUEST_STATUS_FAILED
Definition: QuestDef.h:105
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:103
@ QUEST_STATUS_NONE
Definition: QuestDef.h:100
@ MAX_QUEST_STATUS
Definition: QuestDef.h:107
@ QUEST_STATUS_COMPLETE
Definition: QuestDef.h:101
@ QUEST_SPECIAL_FLAGS_TIMED
Definition: QuestDef.h:177
@ QUEST_STATE_COMPLETE
Definition: Player.h:633
@ QUEST_STATE_FAIL
Definition: Player.h:634
QuestStatusMap m_QuestStatus
Definition: Player.h:2761
bool GetQuestRewardStatus(uint32 quest_id) const
Definition: PlayerQuest.cpp:1409
void SetQuestSlotCounter(uint16 slot, uint8 counter, uint16 count)
Definition: Player.h:1486
void SetQuestSlot(uint16 slot, uint32 quest_id, uint32 timer=0)
Definition: Player.h:1478
void SetQuestSlotState(uint16 slot, uint32 state)
Definition: Player.h:1493
void AddTimedQuest(uint32 quest_id)
Definition: Player.h:1545
Definition: QuestDef.h:406
uint32 Timer
Definition: QuestDef.h:414
uint16 PlayerCount
Definition: QuestDef.h:417
uint16 ItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition: QuestDef.h:415
QuestStatus Status
Definition: QuestDef.h:413
bool Explored
Definition: QuestDef.h:418
uint16 CreatureOrGOCount[QUEST_OBJECTIVES_COUNT]
Definition: QuestDef.h:416

References AddTimedQuest(), QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), WorldObject::GetName(), GetQuestRewardStatus(), IN_MILLISECONDS, QuestStatusData::ItemCount, LOG_DEBUG, LOG_ERROR, m_QuestStatus, MAX_QUEST_LOG_SIZE, MAX_QUEST_STATUS, QuestStatusData::PlayerCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_PVP_KILL_SLOT, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATE_COMPLETE, QUEST_STATE_FAIL, QUEST_STATUS_COMPLETE, QUEST_STATUS_FAILED, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, SetQuestSlot(), SetQuestSlotCounter(), SetQuestSlotState(), sObjectMgr, QuestStatusData::Status, QuestStatusData::Timer, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadQuestStatusRewarded()

void Player::_LoadQuestStatusRewarded ( PreparedQueryResult  result)
protected
6330{
6331 // SELECT quest FROM character_queststatus_rewarded WHERE guid = ?
6332
6333 if (result)
6334 {
6335 m_RewardedQuests.rehash(result->GetRowCount());
6336 do
6337 {
6338 Field* fields = result->Fetch();
6339
6340 uint32 quest_id = fields[0].Get<uint32>();
6341 // used to be new, no delete?
6342 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6343 if (quest)
6344 {
6345 // learn rewarded spell if unknown
6347
6348 // set rewarded title if any
6349 if (quest->GetCharTitleId())
6350 {
6351 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(quest->GetCharTitleId()))
6352 SetTitle(titleEntry);
6353 }
6354
6355 if (quest->GetBonusTalents())
6356 m_questRewardTalentCount += quest->GetBonusTalents();
6357 }
6358
6359 m_RewardedQuests.insert(quest_id);
6360 } while (result->NextRow());
6361 }
6362}
DBCStorage< CharTitlesEntry > sCharTitlesStore(CharTitlesEntryfmt)
RewardedQuestSet m_RewardedQuests
Definition: Player.h:2764
void SetTitle(CharTitlesEntry const *title, bool lost=false)
Definition: Player.cpp:13283
void learnQuestRewardedSpells()
Definition: Player.cpp:11932
Definition: DBCStructure.h:632

References Field::Get(), learnQuestRewardedSpells(), m_questRewardTalentCount, m_RewardedQuests, sCharTitlesStore, SetTitle(), and sObjectMgr.

Referenced by LoadFromDB().

◆ _LoadRandomBGStatus()

void Player::_LoadRandomBGStatus ( PreparedQueryResult  result)
protected
15668{
15669 if (result)
15670 m_IsBGRandomWinner = true;
15671}

References m_IsBGRandomWinner.

Referenced by LoadFromDB().

◆ _LoadSeasonalQuestStatus()

void Player::_LoadSeasonalQuestStatus ( PreparedQueryResult  result)
protected
6438{
6439 m_seasonalquests.clear();
6440
6441 if (result)
6442 {
6443 do
6444 {
6445 Field* fields = result->Fetch();
6446 uint32 quest_id = fields[0].Get<uint32>();
6447 uint32 event_id = fields[1].Get<uint32>();
6448 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6449 if (!quest)
6450 continue;
6451
6452 m_seasonalquests[event_id].insert(quest_id);
6453 LOG_DEBUG("entities.player.loading", "Seasonal quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6454 } while (result->NextRow());
6455 }
6456
6457 m_SeasonalQuestChanged = false;
6458}
SeasonalEventQuestMap m_seasonalquests
Definition: Player.h:2663

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_SeasonalQuestChanged, m_seasonalquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSkills()

void Player::_LoadSkills ( PreparedQueryResult  result)
protected
13621{
13622 // 0 1 2
13623 // SetQuery(PLAYER_LOGIN_QUERY_LOADSKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = '{}'", m_guid.GetCounter());
13624
13625 uint32 count = 0;
13626 std::unordered_map<uint32, uint32> loadedSkillValues;
13627 if (result)
13628 {
13629 do
13630 {
13631 Field* fields = result->Fetch();
13632 uint16 skill = fields[0].Get<uint16>();
13633 uint16 value = fields[1].Get<uint16>();
13634 uint16 max = fields[2].Get<uint16>();
13635
13636 SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skill, getRace(), getClass());
13637 if (!rcEntry)
13638 {
13639 LOG_ERROR("entities.player", "Character {} has skill {} that does not exist.", GetGUID().ToString(), skill);
13640 continue;
13641 }
13642
13643 // set fixed skill ranges
13644 switch (GetSkillRangeType(rcEntry))
13645 {
13646 case SKILL_RANGE_LANGUAGE: // 300..300
13647 value = max = 300;
13648 break;
13649 case SKILL_RANGE_MONO: // 1..1, grey monolite bar
13650 value = max = 1;
13651 break;
13652 case SKILL_RANGE_LEVEL:
13654 default:
13655 break;
13656 }
13657
13658 if (value == 0)
13659 {
13660 LOG_ERROR("entities.player", "Character {} has skill {} with value 0. Will be deleted.", GetGUID().ToString(), skill);
13661
13663
13664 stmt->SetData(0, GetGUID().GetCounter());
13665 stmt->SetData(1, skill);
13666
13667 CharacterDatabase.Execute(stmt);
13668
13669 continue;
13670 }
13671
13672 uint16 skillStep = 0;
13673 if (SkillTiersEntry const* skillTier = sSkillTiersStore.LookupEntry(rcEntry->SkillTierID))
13674 {
13675 for (uint32 i = 0; i < MAX_SKILL_STEP; ++i)
13676 {
13677 if (skillTier->Value[skillStep] == max)
13678 {
13679 skillStep = i + 1;
13680 break;
13681 }
13682 }
13683 }
13684
13685 SetUInt32Value(PLAYER_SKILL_INDEX(count), MAKE_PAIR32(skill, skillStep));
13686
13689
13690 mSkillStatus.insert(SkillStatusMap::value_type(skill, SkillStatusData(count, SKILL_UNCHANGED)));
13691
13692 loadedSkillValues[skill] = value;
13693
13694 ++count;
13695
13696 if (count >= PLAYER_MAX_SKILLS) // client limit
13697 {
13698 LOG_ERROR("entities.player", "Character {} has more than {} skills.", GetGUID().ToString(), PLAYER_MAX_SKILLS);
13699 break;
13700 }
13701 } while (result->NextRow());
13702 }
13703
13704 // Learn skill rewarded spells after all skills have been loaded to prevent learning a skill from them before its loaded with proper value from DB
13705 for (auto& skill : loadedSkillValues)
13706 {
13707 learnSkillRewardedSpells(skill.first, skill.second);
13708 }
13709
13710 for (; count < PLAYER_MAX_SKILLS; ++count)
13711 {
13715 }
13716}
SkillRaceClassInfoEntry const * GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_)
Definition: DBCStores.cpp:895
DBCStorage< SkillTiersEntry > sSkillTiersStore(SkillTiersfmt)
SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const *rcEntry)
Definition: ObjectMgr.cpp:8806
@ SKILL_RANGE_MONO
Definition: ObjectMgr.h:676
@ SKILL_RANGE_LANGUAGE
Definition: ObjectMgr.h:674
@ SKILL_RANGE_LEVEL
Definition: ObjectMgr.h:675
uint32 MAKE_PAIR32(uint16 l, uint16 h)
Definition: ObjectDefines.h:87
#define PLAYER_SKILL_BONUS_INDEX(x)
Definition: Player.h:80
#define PLAYER_SKILL_VALUE_INDEX(x)
Definition: Player.h:79
#define PLAYER_SKILL_INDEX(x)
Definition: Player.h:78
#define PLAYER_MAX_SKILLS
Definition: Player.h:70
@ SKILL_UNCHANGED
Definition: Player.h:639
#define MAKE_SKILL_VALUE(v, m)
Definition: Player.h:84
@ CHAR_DEL_CHARACTER_SKILL
Definition: CharacterDatabase.h:316
#define MAX_SKILL_STEP
Definition: DBCStructure.h:1580
Definition: Player.h:646
SkillStatusMap mSkillStatus
Definition: Player.h:2768
void learnSkillRewardedSpells(uint32 id, uint32 value)
Definition: Player.cpp:11945
Definition: DBCStructure.h:1569
Definition: DBCStructure.h:1615

References CHAR_DEL_CHARACTER_SKILL, CharacterDatabase, Field::Get(), Unit::getClass(), Object::GetGUID(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), learnSkillRewardedSpells(), LOG_ERROR, MAKE_PAIR32(), MAKE_SKILL_VALUE, MAX_SKILL_STEP, mSkillStatus, PLAYER_MAX_SKILLS, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_INDEX, PLAYER_SKILL_VALUE_INDEX, PreparedStatementBase::SetData(), Unit::SetUInt32Value(), SKILL_RANGE_LANGUAGE, SKILL_RANGE_LEVEL, SKILL_RANGE_MONO, SKILL_UNCHANGED, sSkillTiersStore, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSpellCooldowns()

void Player::_LoadSpellCooldowns ( PreparedQueryResult  result)
3568{
3569 // some cooldowns can be already set at aura loading...
3570
3571 //QueryResult* result = CharacterDatabase.Query("SELECT spell, category, item, time FROM character_spell_cooldown WHERE guid = '{}'", GetGUID().GetCounter()());
3572
3573 if (result)
3574 {
3575 time_t curTime = GameTime::GetGameTime().count();
3576
3577 do
3578 {
3579 Field* fields = result->Fetch();
3580 uint32 spell_id = fields[0].Get<uint32>();
3581 uint16 category = fields[1].Get<uint16>();
3582 uint32 item_id = fields[2].Get<uint32>();
3583 uint32 db_time = fields[3].Get<uint32>();
3584 bool needSend = fields[4].Get<bool>();
3585
3586 if (!sSpellMgr->GetSpellInfo(spell_id))
3587 {
3588 LOG_ERROR("entities.player", "Player {} has unknown spell {} in `character_spell_cooldown`, skipping.", GetGUID().ToString(), spell_id);
3589 continue;
3590 }
3591
3592 // skip outdated cooldown
3593 if (db_time <= curTime)
3594 continue;
3595
3596 _AddSpellCooldown(spell_id, category, item_id, (db_time - curTime) * IN_MILLISECONDS, needSend);
3597
3598 LOG_DEBUG("entities.player.loading", "Player ({}) spell {}, item {} cooldown loaded ({} secs).", GetGUID().ToString(), spell_id, item_id, uint32(db_time - curTime));
3599 } while (result->NextRow());
3600 }
3601}
void _AddSpellCooldown(uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition: Player.cpp:11020

References _AddSpellCooldown(), Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), IN_MILLISECONDS, LOG_DEBUG, LOG_ERROR, sSpellMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSpells()

void Player::_LoadSpells ( PreparedQueryResult  result)
protected
6483{
6484 //QueryResult* result = CharacterDatabase.Query("SELECT spell, specMask FROM character_spell WHERE guid = '{}'", GetGUID().GetCounter());
6485
6486 if (result)
6487 {
6488 do
6489 // xinef: checked
6490 addSpell((*result)[0].Get<uint32>(), (*result)[1].Get<uint8>(), true);
6491 while (result->NextRow());
6492 }
6493}
bool addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary=false, bool learnFromSkill=false)
Definition: Player.cpp:3036

References addSpell().

Referenced by LoadFromDB().

◆ _LoadTalents()

void Player::_LoadTalents ( PreparedQueryResult  result)
protected
14955{
14956 // SetQuery(PLAYER_LOGIN_QUERY_LOADTALENTS, "SELECT spell, specMask FROM character_talent WHERE guid = '{}'", m_guid.GetCounter());
14957 if (result)
14958 {
14959 do
14960 {
14961 // xinef: checked
14962 uint32 spellId = (*result)[0].Get<uint32>();
14963 uint8 specMask = (*result)[1].Get<uint8>();
14964 addTalent(spellId, specMask, 0);
14965 TalentSpellPos const* talentPos = GetTalentSpellPos(spellId);
14966 ASSERT(talentPos);
14967
14968 // xinef: increase used talent points count
14969 if (GetActiveSpecMask() & specMask)
14970 m_usedTalentCount += talentPos->rank + 1;
14971 } while (result->NextRow());
14972 }
14973}
TalentSpellPos const * GetTalentSpellPos(uint32 spellId)
Definition: DBCStores.cpp:677
#define ASSERT
Definition: Errors.h:68
bool addTalent(uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank)
Definition: Player.cpp:2891
uint8 GetActiveSpecMask() const
Definition: Player.h:1722
Definition: DBCStructure.h:2232
uint8 rank
Definition: DBCStructure.h:2237

References addTalent(), ASSERT, GetActiveSpecMask(), GetTalentSpellPos(), m_usedTalentCount, and TalentSpellPos::rank.

Referenced by LoadFromDB().

◆ _LoadWeeklyQuestStatus()

void Player::_LoadWeeklyQuestStatus ( PreparedQueryResult  result)
protected
6416{
6417 m_weeklyquests.clear();
6418
6419 if (result)
6420 {
6421 do
6422 {
6423 Field* fields = result->Fetch();
6424 uint32 quest_id = fields[0].Get<uint32>();
6425 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6426 if (!quest)
6427 continue;
6428
6429 m_weeklyquests.insert(quest_id);
6430 LOG_DEBUG("entities.player.loading", "Weekly quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6431 } while (result->NextRow());
6432 }
6433
6434 m_WeeklyQuestChanged = false;
6435}
QuestSet m_weeklyquests
Definition: Player.h:2661

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_WeeklyQuestChanged, m_weeklyquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _RemoveAllItemMods()

void Player::_RemoveAllItemMods ( )
7472{
7473 LOG_DEBUG("entities.player.items", "_RemoveAllItemMods start.");
7474
7475 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7476 {
7477 if (m_items[i])
7478 {
7479 ItemTemplate const* proto = m_items[i]->GetTemplate();
7480 if (!proto)
7481 continue;
7482
7483 // item set bonuses not dependent from item broken state
7484 if (proto->ItemSet)
7485 RemoveItemsSetItem(this, proto);
7486
7487 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7488 continue;
7489
7490 ApplyItemEquipSpell(m_items[i], false);
7491 ApplyEnchantment(m_items[i], false);
7492 }
7493 }
7494
7495 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7496 {
7497 if (m_items[i])
7498 {
7499 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7500 continue;
7501 ItemTemplate const* proto = m_items[i]->GetTemplate();
7502 if (!proto)
7503 continue;
7504
7505 uint32 attacktype = Player::GetAttackBySlot(i);
7506 if (attacktype < MAX_ATTACK)
7508
7509 _ApplyItemBonuses(proto, i, false);
7510
7511 if (i == EQUIPMENT_SLOT_RANGED)
7513 }
7514 }
7515
7516 LOG_DEBUG("entities.player.items", "_RemoveAllItemMods complete.");
7517}
void RemoveItemsSetItem(Player *player, ItemTemplate const *proto)
Definition: Item.cpp:119

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), ApplyEnchantment(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, ItemTemplate::ItemSet, LOG_DEBUG, m_items, MAX_ATTACK, and RemoveItemsSetItem().

Referenced by _RemoveAllStatBonuses().

◆ _RemoveAllStatBonuses()

void Player::_RemoveAllStatBonuses ( )
992{
993 SetCanModifyStats(false);
994
997
998 SetCanModifyStats(true);
999
1001}
void _RemoveAllItemMods()
Definition: Player.cpp:7471
void _RemoveAllAuraStatMods()
Definition: Unit.cpp:5436

References Unit::_RemoveAllAuraStatMods(), _RemoveAllItemMods(), Unit::SetCanModifyStats(), and UpdateAllStats().

Referenced by InitStatsForLevel().

◆ _removeTalent() [1/2]

void Player::_removeTalent ( PlayerTalentMap::iterator &  itr,
uint8  specMask 
)
2956{
2957 // xinef: remove spec mask from iterator
2958 itr->second->specMask &= ~specMask;
2959
2960 // xinef: if talent is not present in any spec - remove
2961 if (itr->second->specMask == 0)
2962 {
2963 if (itr->second->State == PLAYERSPELL_NEW)
2964 {
2965 delete itr->second;
2966 m_talents.erase(itr);
2967 return;
2968 }
2969 else
2970 itr->second->State = PLAYERSPELL_REMOVED;
2971 }
2972 // xinef: otherwise save changes to DB
2973 else if (itr->second->State != PLAYERSPELL_NEW)
2974 itr->second->State = PLAYERSPELL_CHANGED;
2975}

References m_talents, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, and PLAYERSPELL_REMOVED.

Referenced by _removeTalent(), addTalent(), and resetTalents().

◆ _removeTalent() [2/2]

void Player::_removeTalent ( uint32  spellId,
uint8  specMask 
)
2947{
2948 PlayerTalentMap::iterator itr = m_talents.find(spellId);
2949 if (itr == m_talents.end() || itr->second->State == PLAYERSPELL_REMOVED)
2950 return;
2951
2952 _removeTalent(itr, specMask);
2953}
void _removeTalent(PlayerTalentMap::iterator &itr, uint8 specMask)
Definition: Player.cpp:2955

References _removeTalent(), m_talents, and PLAYERSPELL_REMOVED.

◆ _removeTalentAurasAndSpells()

void Player::_removeTalentAurasAndSpells ( uint32  spellId)
2978{
2979 RemoveOwnedAura(spellId);
2980
2981 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
2982 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
2983 {
2984 // pussywizard: remove pet auras
2985 if (PetAura const* petSpell = sSpellMgr->GetPetAura(spellId, i))
2986 RemovePetAura(petSpell);
2987
2988 // pussywizard: remove all triggered auras
2989 if (spellInfo->Effects[i].TriggerSpell > 0)
2990 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
2991
2992 // xinef: remove temporary spells added by talent
2993 // xinef: recursively remove all learnt spells
2994 if (spellInfo->Effects[i].TriggerSpell > 0 && spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
2995 {
2996 removeSpell(spellInfo->Effects[i].TriggerSpell, SPEC_MASK_ALL, true);
2997 _removeTalentAurasAndSpells(spellInfo->Effects[i].TriggerSpell);
2998 }
2999 }
3000}
void removeSpell(uint32 spellId, uint8 removeSpecMask, bool onlyTemporary)
Definition: Player.cpp:3312
void _removeTalentAurasAndSpells(uint32 spellId)
Definition: Player.cpp:2977
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4670
void RemovePetAura(PetAura const *petSpell)
Definition: Unit.cpp:17237
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4874
Definition: SpellMgr.h:470

References _removeTalentAurasAndSpells(), SpellInfo::Effects, MAX_SPELL_EFFECTS, Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), Unit::RemovePetAura(), removeSpell(), SPEC_MASK_ALL, SPELL_EFFECT_LEARN_SPELL, and sSpellMgr.

Referenced by _removeTalentAurasAndSpells(), ActivateSpec(), addTalent(), and resetTalents().

◆ _SaveActions()

void Player::_SaveActions ( CharacterDatabaseTransaction  trans)
protected
7150{
7151 CharacterDatabasePreparedStatement* stmt = nullptr;
7152
7153 for (ActionButtonList::iterator itr = m_actionButtons.begin(); itr != m_actionButtons.end();)
7154 {
7155 switch (itr->second.uState)
7156 {
7157 case ACTIONBUTTON_NEW:
7158 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
7159 stmt->SetData(0, GetGUID().GetCounter());
7160 stmt->SetData(1, m_activeSpec);
7161 stmt->SetData(2, itr->first);
7162 stmt->SetData(3, itr->second.GetAction());
7163 stmt->SetData(4, uint8(itr->second.GetType()));
7164 trans->Append(stmt);
7165
7166 itr->second.uState = ACTIONBUTTON_UNCHANGED;
7167 ++itr;
7168 break;
7170 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ACTION);
7171 stmt->SetData(0, itr->second.GetAction());
7172 stmt->SetData(1, uint8(itr->second.GetType()));
7173 stmt->SetData(2, GetGUID().GetCounter());
7174 stmt->SetData(3, itr->first);
7175 stmt->SetData(4, m_activeSpec);
7176 trans->Append(stmt);
7177
7178 itr->second.uState = ACTIONBUTTON_UNCHANGED;
7179 ++itr;
7180 break;
7182 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC);
7183 stmt->SetData(0, GetGUID().GetCounter());
7184 stmt->SetData(1, itr->first);
7185 stmt->SetData(2, m_activeSpec);
7186 trans->Append(stmt);
7187
7188 m_actionButtons.erase(itr++);
7189 break;
7190 default:
7191 ++itr;
7192 break;
7193 }
7194 }
7195}
@ ACTIONBUTTON_NEW
Definition: Player.h:223
@ ACTIONBUTTON_CHANGED
Definition: Player.h:222
@ CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC
Definition: CharacterDatabase.h:432
@ CHAR_UPD_CHAR_ACTION
Definition: CharacterDatabase.h:431
@ CHAR_INS_CHAR_ACTION
Definition: CharacterDatabase.h:430

References ACTIONBUTTON_CHANGED, ACTIONBUTTON_DELETED, ACTIONBUTTON_NEW, ACTIONBUTTON_UNCHANGED, CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC, CHAR_INS_CHAR_ACTION, CHAR_UPD_CHAR_ACTION, CharacterDatabase, Object::GetGUID(), m_actionButtons, m_activeSpec, and PreparedStatementBase::SetData().

Referenced by ActivateSpec(), SaveToDB(), and UpdateSpecCount().

◆ _SaveAuras()

void Player::_SaveAuras ( CharacterDatabaseTransaction  trans,
bool  logout 
)
protected
7198{
7200 stmt->SetData(0, GetGUID().GetCounter());
7201 trans->Append(stmt);
7202
7203 for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end(); ++itr)
7204 {
7205 if (!itr->second->CanBeSaved())
7206 continue;
7207
7208 Aura* aura = itr->second;
7209 if( !logout && aura->GetDuration() < 60 * IN_MILLISECONDS )
7210 continue;
7211
7212 int32 damage[MAX_SPELL_EFFECTS];
7213 int32 baseDamage[MAX_SPELL_EFFECTS];
7214 uint8 effMask = 0;
7215 uint8 recalculateMask = 0;
7216 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
7217 {
7218 if (AuraEffect const* effect = aura->GetEffect(i))
7219 {
7220 baseDamage[i] = effect->GetBaseAmount();
7221 damage[i] = effect->GetAmount();
7222 effMask |= 1 << i;
7223 if (effect->CanBeRecalculated())
7224 recalculateMask |= 1 << i;
7225 }
7226 else
7227 {
7228 baseDamage[i] = 0;
7229 damage[i] = 0;
7230 }
7231 }
7232
7233 uint8 index = 0;
7234 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AURA);
7235 stmt->SetData(index++, GetGUID().GetCounter());
7236 stmt->SetData(index++, itr->second->GetCasterGUID().GetRawValue());
7237 stmt->SetData(index++, itr->second->GetCastItemGUID().GetRawValue());
7238 stmt->SetData(index++, itr->second->GetId());
7239 stmt->SetData(index++, effMask);
7240 stmt->SetData(index++, recalculateMask);
7241 stmt->SetData(index++, itr->second->GetStackAmount());
7242 stmt->SetData(index++, damage[0]);
7243 stmt->SetData(index++, damage[1]);
7244 stmt->SetData(index++, damage[2]);
7245 stmt->SetData(index++, baseDamage[0]);
7246 stmt->SetData(index++, baseDamage[1]);
7247 stmt->SetData(index++, baseDamage[2]);
7248 stmt->SetData(index++, itr->second->GetMaxDuration());
7249 stmt->SetData(index++, itr->second->GetDuration());
7250 stmt->SetData(index, itr->second->GetCharges());
7251 trans->Append(stmt);
7252 }
7253}
@ CHAR_INS_AURA
Definition: CharacterDatabase.h:196
@ CHAR_DEL_CHAR_AURA
Definition: CharacterDatabase.h:407
AuraMap m_ownedAuras
Definition: Unit.h:1846
Definition: SpellAuraEffects.h:39
int32 GetDuration() const
Definition: SpellAuras.h:133
AuraEffect * GetEffect(uint8 effIndex) const
Definition: SpellAuras.h:175

References CHAR_DEL_CHAR_AURA, CHAR_INS_AURA, CharacterDatabase, Aura::GetDuration(), Aura::GetEffect(), Object::GetGUID(), IN_MILLISECONDS, Unit::m_ownedAuras, MAX_SPELL_EFFECTS, and PreparedStatementBase::SetData().

Referenced by SaveToDB(), and SpawnCorpseBones().

◆ _SaveCharacter()

void Player::_SaveCharacter ( bool  create,
CharacterDatabaseTransaction  trans 
)
protected

Insert query TO DO: Filter out more redundant fields that can take their default value at player create

14630{
14631 CharacterDatabasePreparedStatement* stmt = nullptr;
14632 uint8 index = 0;
14633
14634 auto finiteAlways = [](float f) { return std::isfinite(f) ? f : 0.0f; };
14635
14636 if (create)
14637 {
14640 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER);
14641 stmt->SetData(index++, GetGUID().GetCounter());
14642 stmt->SetData(index++, GetSession()->GetAccountId());
14643 stmt->SetData(index++, GetName());
14644 stmt->SetData(index++, getRace(true));
14645 stmt->SetData(index++, getClass());
14646 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
14647 stmt->SetData(index++, GetLevel());
14648 stmt->SetData(index++, GetUInt32Value(PLAYER_XP));
14649 stmt->SetData(index++, GetMoney());
14650 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 0));
14651 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 1));
14652 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 2));
14653 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 3));
14654 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 0));
14655 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 2));
14656 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 3));
14657 stmt->SetData(index++, (uint32)GetPlayerFlags());
14658 stmt->SetData(index++, (uint16)GetMapId());
14659 stmt->SetData(index++, (uint32)GetInstanceId());
14660 stmt->SetData(index++, (uint8(GetDungeonDifficulty()) | uint8(GetRaidDifficulty()) << 4));
14661 stmt->SetData(index++, finiteAlways(GetPositionX()));
14662 stmt->SetData(index++, finiteAlways(GetPositionY()));
14663 stmt->SetData(index++, finiteAlways(GetPositionZ()));
14664 stmt->SetData(index++, finiteAlways(GetOrientation()));
14665 stmt->SetData(index++, finiteAlways(GetTransOffsetX()));
14666 stmt->SetData(index++, finiteAlways(GetTransOffsetY()));
14667 stmt->SetData(index++, finiteAlways(GetTransOffsetZ()));
14668 stmt->SetData(index++, finiteAlways(GetTransOffsetO()));
14669
14670 int32 lowGuidOrSpawnId = 0;
14671 if (Transport* transport = GetTransport())
14672 {
14673 if (transport->IsMotionTransport())
14674 lowGuidOrSpawnId = static_cast<int32>(transport->GetGUID().GetCounter());
14675 else if (transport->IsStaticTransport())
14676 lowGuidOrSpawnId = -static_cast<int32>(transport->GetSpawnId());
14677 }
14678 stmt->SetData(index++, lowGuidOrSpawnId);
14679
14680 std::ostringstream ss;
14681 ss << m_taxi;
14682 stmt->SetData(index++, ss.str());
14683 stmt->SetData(index++, m_cinematic);
14684 stmt->SetData(index++, m_Played_time[PLAYED_TIME_TOTAL]);
14685 stmt->SetData(index++, m_Played_time[PLAYED_TIME_LEVEL]);
14686 stmt->SetData(index++, finiteAlways(_restBonus));
14687 stmt->SetData(index++, uint32(GameTime::GetGameTime().count()));
14688 stmt->SetData(index++, (HasPlayerFlag(PLAYER_FLAGS_RESTING) ? 1 : 0));
14689 //save, far from tavern/city
14690 //save, but in tavern/city
14691 stmt->SetData(index++, m_resetTalentsCost);
14692 stmt->SetData(index++, uint32(m_resetTalentsTime));
14693 stmt->SetData(index++, (uint16)m_ExtraFlags);
14694 stmt->SetData(index++, m_petStable ? m_petStable->MaxStabledPets : 0);
14695 stmt->SetData(index++, (uint16)m_atLoginFlags);
14696 stmt->SetData(index++, GetZoneId());
14697 stmt->SetData(index++, uint32(m_deathExpireTime));
14698
14699 ss.str("");
14701
14702 stmt->SetData(index++, ss.str());
14703 stmt->SetData(index++, GetArenaPoints());
14704 stmt->SetData(index++, GetHonorPoints());
14708 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0));
14709 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1));
14713 stmt->SetData(index++, GetDrunkValue());
14714 stmt->SetData(index++, GetHealth());
14715
14716 for (uint32 i = 0; i < MAX_POWERS; ++i)
14717 stmt->SetData(index++, GetPower(Powers(i)));
14718
14719 stmt->SetData(index++, GetSession()->GetLatency());
14720
14721 stmt->SetData(index++, m_specsCount);
14722 stmt->SetData(index++, m_activeSpec);
14723
14724 ss.str("");
14725 for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
14726 ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' ';
14727 stmt->SetData(index++, ss.str());
14728
14729 ss.str("");
14730 // cache equipment...
14731 for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i)
14733
14734 // ...and bags for enum opcode
14736 {
14737 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
14738 ss << item->GetEntry();
14739 else
14740 ss << '0';
14741 ss << " 0 ";
14742 }
14743
14744 stmt->SetData(index++, ss.str());
14745 stmt->SetData(index++, GetUInt32Value(PLAYER_AMMO_ID));
14746
14747 ss.str("");
14748 for (uint32 i = 0; i < KNOWN_TITLES_SIZE * 2; ++i)
14750
14751 stmt->SetData(index++, ss.str());
14752 stmt->SetData(index++, GetByteValue(PLAYER_FIELD_BYTES, 2));
14753 stmt->SetData(index++, m_grantableLevels);
14754 stmt->SetData(index++, _innTriggerId);
14755 stmt->SetData(index++, m_extraBonusTalentCount);
14756 }
14757 else
14758 {
14759 // Update query
14760 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER);
14761 stmt->SetData(index++, GetName());
14762 stmt->SetData(index++, getRace(true));
14763 stmt->SetData(index++, getClass());
14764 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
14765 stmt->SetData(index++, GetLevel());
14766 stmt->SetData(index++, GetUInt32Value(PLAYER_XP));
14767 stmt->SetData(index++, GetMoney());
14768 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 0));
14769 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 1));
14770 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 2));
14771 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 3));
14772 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 0));
14773 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 2));
14774 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 3));
14775 stmt->SetData(index++, GetPlayerFlags());
14776
14777 if (!IsBeingTeleported())
14778 {
14780 if (Map* m = FindMap())
14781 if (m->IsDungeon())
14782 {
14783 if (m->IsNonRaidDungeon()) dd = m->GetDifficulty();
14784 else rd = m->GetDifficulty();
14785 }
14786 stmt->SetData(index++, (uint16)GetMapId());
14787 stmt->SetData(index++, (uint32)GetInstanceId());
14788 stmt->SetData(index++, (uint8(dd) | uint8(rd) << 4));
14789 stmt->SetData(index++, finiteAlways(GetPositionX()));
14790 stmt->SetData(index++, finiteAlways(GetPositionY()));
14791 stmt->SetData(index++, finiteAlways(GetPositionZ()));
14792 stmt->SetData(index++, finiteAlways(GetOrientation()));
14793 }
14794 else
14795 {
14796 stmt->SetData(index++, (uint16)GetTeleportDest().GetMapId());
14797 stmt->SetData(index++, (uint32)0);
14798 stmt->SetData(index++, (uint8(GetDungeonDifficulty()) | uint8(GetRaidDifficulty()) << 4));
14799 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionX()));
14800 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionY()));
14801 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionZ()));
14802 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetOrientation()));
14803 }
14804
14805 stmt->SetData(index++, finiteAlways(GetTransOffsetX()));
14806 stmt->SetData(index++, finiteAlways(GetTransOffsetY()));
14807 stmt->SetData(index++, finiteAlways(GetTransOffsetZ()));
14808 stmt->SetData(index++, finiteAlways(GetTransOffsetO()));
14809
14810 int32 lowGuidOrSpawnId = 0;
14811 if (Transport* transport = GetTransport())
14812 {
14813 if (transport->IsMotionTransport())
14814 lowGuidOrSpawnId = static_cast<int32>(transport->GetGUID().GetCounter());
14815 else if (transport->IsStaticTransport())
14816 lowGuidOrSpawnId = -static_cast<int32>(transport->GetSpawnId());
14817 }
14818 stmt->SetData(index++, lowGuidOrSpawnId);
14819
14820 std::ostringstream ss;
14821 ss << m_taxi;
14822 stmt->SetData(index++, ss.str());
14823 stmt->SetData(index++, m_cinematic);
14824 stmt->SetData(index++, m_Played_time[PLAYED_TIME_TOTAL]);
14825 stmt->SetData(index++, m_Played_time[PLAYED_TIME_LEVEL]);
14826 stmt->SetData(index++, finiteAlways(_restBonus));
14827 stmt->SetData(index++, uint32(GameTime::GetGameTime().count()));
14828 stmt->SetData(index++, (HasPlayerFlag(PLAYER_FLAGS_RESTING) ? 1 : 0));
14829 //save, far from tavern/city
14830 //save, but in tavern/city
14831 stmt->SetData(index++, m_resetTalentsCost);
14832 stmt->SetData(index++, uint32(m_resetTalentsTime));
14833 stmt->SetData(index++, (uint16)m_ExtraFlags);
14834 stmt->SetData(index++, m_petStable ? m_petStable->MaxStabledPets : 0);
14835 stmt->SetData(index++, (uint16)m_atLoginFlags);
14836 stmt->SetData(index++, GetZoneId());
14837 stmt->SetData(index++, uint32(m_deathExpireTime));
14838
14839 ss.str("");
14841
14842 stmt->SetData(index++, ss.str());
14843 stmt->SetData(index++, GetArenaPoints());
14844 stmt->SetData(index++, GetHonorPoints());
14848 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0));
14849 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1));
14853 stmt->SetData(index++, GetDrunkValue());
14854 stmt->SetData(index++, GetHealth());
14855
14856 for (uint32 i = 0; i < MAX_POWERS; ++i)
14857 stmt->SetData(index++, GetPower(Powers(i)));
14858
14859 stmt->SetData(index++, GetSession()->GetLatency());
14860
14861 stmt->SetData(index++, m_specsCount);
14862 stmt->SetData(index++, m_activeSpec);
14863
14864 ss.str("");
14865 for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
14866 ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' ';
14867 stmt->SetData(index++, ss.str());
14868
14869 ss.str("");
14870 // cache equipment...
14871 for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i)
14873
14874 // ...and bags for enum opcode
14876 {
14877 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
14878 ss << item->GetEntry();
14879 else
14880 ss << '0';
14881 ss << " 0 ";
14882 }
14883
14884 stmt->SetData(index++, ss.str());
14885 stmt->SetData(index++, GetUInt32Value(PLAYER_AMMO_ID));
14886
14887 ss.str("");
14888 for (uint32 i = 0; i < KNOWN_TITLES_SIZE * 2; ++i)
14890
14891 stmt->SetData(index++, ss.str());
14892 stmt->SetData(index++, GetByteValue(PLAYER_FIELD_BYTES, 2));
14893 stmt->SetData(index++, m_grantableLevels);
14894 stmt->SetData(index++, _innTriggerId);
14895 stmt->SetData(index++, m_extraBonusTalentCount);
14896
14897 stmt->SetData(index++, IsInWorld() && !GetSession()->PlayerLogout() ? 1 : 0);
14898 // Index
14899 stmt->SetData(index++, GetGUID().GetCounter());
14900 }
14901
14902 trans->Append(stmt);
14903}
@ PLAYER_FIELD_TODAY_CONTRIBUTION
Definition: UpdateFields.h:375
@ PLAYER_BYTES_3
Definition: UpdateFields.h:183
@ PLAYER_XP
Definition: UpdateFields.h:339
@ PLAYER_CHOSEN_TITLE
Definition: UpdateFields.h:324
@ PLAYER_EXPLORED_ZONES_1
Definition: UpdateFields.h:357
@ PLAYER_FIELD_KNOWN_CURRENCIES
Definition: UpdateFields.h:338
@ PLAYER_BYTES_2
Definition: UpdateFields.h:182
@ PLAYER__FIELD_KNOWN_TITLES
Definition: UpdateFields.h:335
@ PLAYER_BYTES
Definition: UpdateFields.h:181
@ PLAYER_FIELD_KILLS
Definition: UpdateFields.h:374
@ PLAYER_FIELD_YESTERDAY_CONTRIBUTION
Definition: UpdateFields.h:376
@ PLAYER_FIELD_WATCHED_FACTION_INDEX
Definition: UpdateFields.h:379
@ PLAYER_VISIBLE_ITEM_1_ENTRYID
Definition: UpdateFields.h:286
@ PLAYER_FIELD_LIFETIME_HONORABLE_KILLS
Definition: UpdateFields.h:377
@ PLAYER_FIELD_BYTES
Definition: UpdateFields.h:368
#define KNOWN_TITLES_SIZE
Definition: Player.h:553
@ PLAYER_FLAGS_RESTING
Definition: Player.h:479
@ INVENTORY_SLOT_BAG_START
Definition: Player.h:699
#define PLAYER_EXPLORED_ZONES_SIZE
Definition: Player.h:72
@ CHAR_INS_CHARACTER
Definition: CharacterDatabase.h:271
@ CHAR_UPD_CHARACTER
Definition: CharacterDatabase.h:272
Difficulty
Definition: DBCEnums.h:266
Powers
Definition: SharedDefines.h:268
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition: Object.cpp:323
uint16 GetUInt16Value(uint16 index, uint8 offset) const
Definition: Object.cpp:330
uint64 GetUInt64Value(uint16 index) const
Definition: Object.cpp:311
float GetTransOffsetX() const
Definition: Object.h:600
uint32 GetInstanceId() const
Definition: Object.h:443
float GetTransOffsetY() const
Definition: Object.h:601
float GetTransOffsetZ() const
Definition: Object.h:602
Transport * GetTransport() const
Definition: Object.h:599
float GetTransOffsetO() const
Definition: Object.h:603
float GetPositionZ() const
Definition: Position.h:119
float GetOrientation() const
Definition: Position.h:120
float GetPositionX() const
Definition: Position.h:117
float GetPositionY() const
Definition: Position.h:118
Difficulty GetRaidDifficulty() const
Definition: Player.h:1899
WorldLocation & GetTeleportDest()
Definition: Player.h:2066
uint32 GetArenaPoints() const
Definition: Player.h:2130
uint8 GetDrunkValue() const
Definition: Player.h:2148
Item * GetItemByPos(uint16 pos) const
Definition: PlayerStorage.cpp:464
uint32 GetHonorPoints() const
Definition: Player.h:2129
PlayerFlags GetPlayerFlags() const
Definition: Player.h:1107
uint32 GetMoney() const
Definition: Player.h:1593
PlayerTaxi m_taxi
Definition: Player.h:1143
bool HasPlayerFlag(PlayerFlags flags) const
Definition: Player.h:1108
Difficulty GetDungeonDifficulty() const
Definition: Player.h:1898
bool IsBeingTeleported() const
Definition: Player.h:2067
std::string SaveTaxiDestinationsToString()
Definition: PlayerTaxi.cpp:193
Definition: Transport.h:29
uint32 GetHealth() const
Definition: Unit.h:782
uint32 GetPower(Powers power) const
Definition: Unit.h:804
Definition: Map.h:313
bool PlayerLogout() const
Definition: WorldSession.h:338
uint32 GetLatency() const
Definition: WorldSession.h:502

References _innTriggerId, _restBonus, CHAR_INS_CHARACTER, CHAR_UPD_CHARACTER, CharacterDatabase, EQUIPMENT_SLOT_END, WorldObject::FindMap(), GetArenaPoints(), Object::GetByteValue(), Unit::getClass(), ObjectGuid::GetCounter(), GetDrunkValue(), GetDungeonDifficulty(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetHealth(), GetHonorPoints(), WorldObject::GetInstanceId(), GetItemByPos(), WorldSession::GetLatency(), Unit::GetLevel(), WorldLocation::GetMapId(), GetMoney(), WorldObject::GetName(), Position::GetOrientation(), GetPlayerFlags(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Unit::GetPower(), Unit::getRace(), GetRaidDifficulty(), GetSession(), GetTeleportDest(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), Object::GetUInt16Value(), Object::GetUInt32Value(), Object::GetUInt64Value(), WorldObject::GetZoneId(), HasPlayerFlag(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, IsBeingTeleported(), Object::IsInWorld(), KNOWN_TITLES_SIZE, m_activeSpec, m_atLoginFlags, m_cinematic, m_deathExpireTime, m_extraBonusTalentCount, m_ExtraFlags, m_grantableLevels, m_petStable, m_Played_time, m_resetTalentsCost, m_resetTalentsTime, m_specsCount, m_taxi, MAX_POWERS, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER__FIELD_KNOWN_TITLES, PLAYER_AMMO_ID, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, PLAYER_FIELD_BYTES, PLAYER_FIELD_KILLS, PLAYER_FIELD_KNOWN_CURRENCIES, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_FLAGS_RESTING, PLAYER_VISIBLE_ITEM_1_ENTRYID, PLAYER_XP, WorldSession::PlayerLogout(), PlayerTaxi::SaveTaxiDestinationsToString(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveDailyQuestStatus()

void Player::_SaveDailyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7536{
7538 return;
7539
7540 m_DailyQuestChanged = false;
7541
7542 // save last daily quest time for all quests: we need only mostly reset time for reset check anyway
7543
7544 // we don't need transactions here.
7546 stmt->SetData(0, GetGUID().GetCounter());
7547 trans->Append(stmt);
7548 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
7549 {
7550 if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
7551 {
7552 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
7553 stmt->SetData(0, GetGUID().GetCounter());
7554 stmt->SetData(1, GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx));
7556 trans->Append(stmt);
7557 }
7558 }
7559
7560 if (!m_DFQuests.empty())
7561 {
7562 for (DFQuestsDoneList::iterator itr = m_DFQuests.begin(); itr != m_DFQuests.end(); ++itr)
7563 {
7564 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
7565 stmt->SetData(0, GetGUID().GetCounter());
7566 stmt->SetData(1, (*itr));
7568 trans->Append(stmt);
7569 }
7570 }
7571}
@ CHAR_DEL_QUEST_STATUS_DAILY_CHAR
Definition: CharacterDatabase.h:59
@ CHAR_INS_CHARACTER_DAILYQUESTSTATUS
Definition: CharacterDatabase.h:74

References CHAR_DEL_QUEST_STATUS_DAILY_CHAR, CHAR_INS_CHARACTER_DAILYQUESTSTATUS, CharacterDatabase, Object::GetGUID(), Object::GetUInt32Value(), m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveEntryPoint()

void Player::_SaveEntryPoint ( CharacterDatabaseTransaction  trans)
protected
14547{
14548 // xinef: dont save joinpos with invalid mapid
14549 MapEntry const* mEntry = sMapStore.LookupEntry(m_entryPointData.joinPos.GetMapId());
14550 if (!mEntry)
14551 return;
14552
14554 stmt->SetData(0, GetGUID().GetCounter());
14555 trans->Append(stmt);
14556
14557 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PLAYER_ENTRY_POINT);
14558 stmt->SetData(0, GetGUID().GetCounter());
14564 stmt->SetData(6, m_entryPointData.taxiPath[0]);
14565 stmt->SetData(7, m_entryPointData.taxiPath[1]);
14567 trans->Append(stmt);
14568}
@ CHAR_INS_PLAYER_ENTRY_POINT
Definition: CharacterDatabase.h:237
@ CHAR_DEL_PLAYER_ENTRY_POINT
Definition: CharacterDatabase.h:238

References CHAR_DEL_PLAYER_ENTRY_POINT, CHAR_INS_PLAYER_ENTRY_POINT, CharacterDatabase, Object::GetGUID(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), EntryPointData::joinPos, m_entryPointData, EntryPointData::mountSpell, PreparedStatementBase::SetData(), sMapStore, and EntryPointData::taxiPath.

Referenced by SaveToDB().

◆ _SaveEquipmentSets()

void Player::_SaveEquipmentSets ( CharacterDatabaseTransaction  trans)
protected
14496{
14497 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end();)
14498 {
14499 uint32 index = itr->first;
14500 EquipmentSet& eqset = itr->second;
14501 CharacterDatabasePreparedStatement* stmt = nullptr;
14502 uint8 j = 0;
14503 switch (eqset.state)
14504 {
14506 ++itr;
14507 break; // nothing do
14509 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_EQUIP_SET);
14510 stmt->SetData(j++, eqset.Name.c_str());
14511 stmt->SetData(j++, eqset.IconName.c_str());
14512 stmt->SetData(j++, eqset.IgnoreMask);
14513 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14514 stmt->SetData(j++, eqset.Items[i].GetCounter());
14515 stmt->SetData(j++, GetGUID().GetCounter());
14516 stmt->SetData(j++, eqset.Guid);
14517 stmt->SetData(j, index);
14518 trans->Append(stmt);
14520 ++itr;
14521 break;
14522 case EQUIPMENT_SET_NEW:
14523 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_EQUIP_SET);
14524 stmt->SetData(j++, GetGUID().GetCounter());
14525 stmt->SetData(j++, eqset.Guid);
14526 stmt->SetData(j++, index);
14527 stmt->SetData(j++, eqset.Name.c_str());
14528 stmt->SetData(j++, eqset.IconName.c_str());
14529 stmt->SetData(j++, eqset.IgnoreMask);
14530 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14531 stmt->SetData(j++, eqset.Items[i].GetCounter());
14532 trans->Append(stmt);
14534 ++itr;
14535 break;
14537 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EQUIP_SET);
14538 stmt->SetData(0, eqset.Guid);
14539 trans->Append(stmt);
14540 m_EquipmentSets.erase(itr++);
14541 break;
14542 }
14543 }
14544}
@ EQUIPMENT_SET_CHANGED
Definition: Player.h:743
@ EQUIPMENT_SET_DELETED
Definition: Player.h:745
@ EQUIPMENT_SET_NEW
Definition: Player.h:744
@ CHAR_UPD_EQUIP_SET
Definition: CharacterDatabase.h:192
@ CHAR_INS_EQUIP_SET
Definition: CharacterDatabase.h:193
@ CHAR_DEL_EQUIP_SET
Definition: CharacterDatabase.h:194

References CHAR_DEL_EQUIP_SET, CHAR_INS_EQUIP_SET, CHAR_UPD_EQUIP_SET, CharacterDatabase, EQUIPMENT_SET_CHANGED, EQUIPMENT_SET_DELETED, EQUIPMENT_SET_NEW, EQUIPMENT_SET_UNCHANGED, EQUIPMENT_SLOT_END, ObjectGuid::GetCounter(), Object::GetGUID(), EquipmentSet::Guid, EquipmentSet::IconName, EquipmentSet::IgnoreMask, EquipmentSet::Items, m_EquipmentSets, EquipmentSet::Name, PreparedStatementBase::SetData(), and EquipmentSet::state.

Referenced by SaveToDB().

◆ _SaveGlyphs()

void Player::_SaveGlyphs ( CharacterDatabaseTransaction  trans)
protected
14929{
14930 if (!NeedToSaveGlyphs())
14931 return;
14932
14934 stmt->SetData(0, GetGUID().GetCounter());
14935 trans->Append(stmt);
14936
14937 for (uint8 spec = 0; spec < m_specsCount; ++spec)
14938 {
14939 uint8 index = 0;
14940
14941 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_GLYPHS);
14942 stmt->SetData(index++, GetGUID().GetCounter());
14943 stmt->SetData(index++, spec);
14944
14945 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
14946 stmt->SetData(index++, uint16(m_Glyphs[spec][i]));
14947
14948 trans->Append(stmt);
14949 }
14950
14951 SetNeedToSaveGlyphs(false);
14952}
@ CHAR_DEL_CHAR_GLYPHS
Definition: CharacterDatabase.h:420
@ CHAR_INS_CHAR_GLYPHS
Definition: CharacterDatabase.h:454
void SetNeedToSaveGlyphs(bool val)
Definition: Player.h:2579
bool NeedToSaveGlyphs()
Definition: Player.h:2578

References CHAR_DEL_CHAR_GLYPHS, CHAR_INS_CHAR_GLYPHS, CharacterDatabase, Object::GetGUID(), m_Glyphs, m_specsCount, MAX_GLYPH_SLOT_INDEX, NeedToSaveGlyphs(), PreparedStatementBase::SetData(), and SetNeedToSaveGlyphs().

Referenced by SaveToDB().

◆ _SaveInstanceTimeRestrictions()

void Player::_SaveInstanceTimeRestrictions ( CharacterDatabaseTransaction  trans)
protected
15822{
15823 if (_instanceResetTimes.empty())
15824 return;
15825
15827 stmt->SetData(0, GetSession()->GetAccountId());
15828 trans->Append(stmt);
15829
15830 for (InstanceTimeMap::const_iterator itr = _instanceResetTimes.begin(); itr != _instanceResetTimes.end(); ++itr)
15831 {
15832 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES);
15833 stmt->SetData(0, GetSession()->GetAccountId());
15834 stmt->SetData(1, itr->first);
15835 stmt->SetData(2, (int64)itr->second);
15836 trans->Append(stmt);
15837 }
15838}
@ CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES
Definition: CharacterDatabase.h:133
@ CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES
Definition: CharacterDatabase.h:134
std::int64_t int64
Definition: Define.h:102

References _instanceResetTimes, CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES, CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES, CharacterDatabase, GetSession(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveInventory()

void Player::_SaveInventory ( CharacterDatabaseTransaction  trans)
protected
7256{
7257 CharacterDatabasePreparedStatement* stmt = nullptr;
7258 // force items in buyback slots to new state
7259 // and remove those that aren't already
7260 for (uint8 i = BUYBACK_SLOT_START; i < BUYBACK_SLOT_END; ++i)
7261 {
7262 Item* item = m_items[i];
7263 if (!item)
7264 continue;
7265
7266 if (item->GetState() == ITEM_NEW)
7267 {
7268 // Xinef: item is removed, remove loot from storage if any
7270 sLootItemStorage->RemoveStoredLoot(item->GetGUID());
7271 continue;
7272 }
7273
7274 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
7275 stmt->SetData(0, item->GetGUID().GetCounter());
7276 trans->Append(stmt);
7277
7278 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
7279 stmt->SetData(0, item->GetGUID().GetCounter());
7280 trans->Append(stmt);
7282
7283 // Xinef: item is removed, remove loot from storage if any
7285 sLootItemStorage->RemoveStoredLoot(item->GetGUID());
7286 }
7287
7288 // Updated played time for refundable items. We don't do this in Player::Update because there's simply no need for it,
7289 // the client auto counts down in real time after having received the initial played time on the first
7290 // SMSG_ITEM_REFUND_INFO_RESPONSE packet.
7291 // Item::UpdatePlayedTime is only called when needed, which is in DB saves, and item refund info requests.
7292 RefundableItemsSet::iterator i_next;
7293 for (RefundableItemsSet::iterator itr = m_refundableItems.begin(); itr != m_refundableItems.end(); itr = i_next)
7294 {
7295 // use copy iterator because itr may be invalid after operations in this loop
7296 i_next = itr;
7297 ++i_next;
7298
7299 Item* iPtr = GetItemByGuid((*itr));
7300 if (iPtr)
7301 {
7302 iPtr->UpdatePlayedTime(this);
7303 continue;
7304 }
7305 else
7306 {
7307 LOG_ERROR("entities.player", "Can't find item {} but is in refundable storage for player {} ! Removing.", (*itr).ToString(), GetGUID().ToString());
7308 m_refundableItems.erase(itr);
7309 }
7310 }
7311
7312 // update enchantment durations
7313 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
7314 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
7315
7316 // if no changes
7317 if (m_itemUpdateQueue.empty())
7318 return;
7319
7321 for (std::size_t i = 0; i < m_itemUpdateQueue.size(); ++i)
7322 {
7323 Item* item = m_itemUpdateQueue[i];
7324 if (!item)
7325 continue;
7326
7327 Bag* container = item->GetContainer();
7328 ObjectGuid::LowType bag_guid = container ? container->GetGUID().GetCounter() : 0;
7329
7330 if (item->GetState() != ITEM_REMOVED)
7331 {
7332 Item* test = GetItemByPos(item->GetBagSlot(), item->GetSlot());
7333 if (!test)
7334 {
7335 ObjectGuid::LowType bagTestGUID = 0;
7336 if (Item* test2 = GetItemByPos(INVENTORY_SLOT_BAG_0, item->GetBagSlot()))
7337 bagTestGUID = test2->GetGUID().GetCounter();
7338 LOG_ERROR("entities.player", "Player(GUID: {} Name: {})::_SaveInventory - the bag({}) and slot({}) values for the item {} (state {}) are incorrect, the player doesn't have an item at that position!",
7339 lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), (int32)item->GetState());
7340 // according to the test that was just performed nothing should be in this slot, delete
7341 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT);
7342 stmt->SetData(0, bagTestGUID);
7343 stmt->SetData(1, item->GetSlot());
7344 stmt->SetData(2, lowGuid);
7345 trans->Append(stmt);
7346
7347 RemoveTradeableItem(item); // pussywizard
7348 RemoveEnchantmentDurationsReferences(item); // pussywizard
7349 RemoveItemDurations(item); // pussywizard
7350
7351 // also THIS item should be somewhere else, cheat attempt
7352 item->FSetState(ITEM_REMOVED); // we are IN updateQueue right now, can't use SetState which modifies the queue
7354 // don't skip, let the switch delete it
7355 continue;
7356 }
7357 else if (test != item)
7358 {
7359 LOG_ERROR("entities.player", "Player(GUID: {} Name: {})::_SaveInventory - the bag({}) and slot({}) values for the item ({}) are incorrect, the item ({}) is there instead!",
7360 lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), test->GetGUID().ToString());
7361 // save all changes to the item...
7362 if (item->GetState() != ITEM_NEW) // only for existing items, no dupes
7363 item->SaveToDB(trans);
7364 // ...but do not save position in invntory
7365 continue;
7366 }
7367 }
7368
7369 switch (item->GetState())
7370 {
7371 case ITEM_NEW:
7372 case ITEM_CHANGED:
7373 stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_INVENTORY_ITEM);
7374 stmt->SetData(0, lowGuid);
7375 stmt->SetData(1, bag_guid);
7376 stmt->SetData (2, item->GetSlot());
7377 stmt->SetData(3, item->GetGUID().GetCounter());
7378 trans->Append(stmt);
7379 break;
7380 case ITEM_REMOVED:
7381 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
7382 stmt->SetData(0, item->GetGUID().GetCounter());
7383 trans->Append(stmt);
7384 case ITEM_UNCHANGED:
7385 break;
7386 }
7387
7388 item->SaveToDB(trans); // item have unchanged inventory record and can be save standalone
7389 }
7390 m_itemUpdateQueue.clear();
7391}
@ ITEM_CHANGED
Definition: Item.h:210
@ ITEM_NEW
Definition: Item.h:211
@ ITEM_FLAG_HAS_LOOT
Definition: ItemTemplate.h:149
@ BUYBACK_SLOT_END
Definition: Player.h:725
#define sLootItemStorage
Definition: LootItemStorage.h:75
@ CHAR_DEL_ITEM_INSTANCE
Definition: CharacterDatabase.h:127
@ CHAR_DEL_CHAR_INVENTORY_BY_ITEM
Definition: CharacterDatabase.h:433
@ CHAR_REP_INVENTORY_ITEM
Definition: CharacterDatabase.h:123
@ CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT
Definition: CharacterDatabase.h:434
uint8 GetSlot() const
Definition: Item.h:281
Bag * GetContainer()
Definition: Item.h:282
ItemUpdateState GetState() const
Definition: Item.h:324
void UpdatePlayedTime(Player *owner)
Definition: Item.cpp:1219
uint8 GetBagSlot() const
Definition: Item.cpp:785
bool HasFlag(ItemFlags flag) const
Definition: ItemTemplate.h:827
std::vector< Item * > m_itemUpdateQueue
Definition: Player.h:2756
void DeleteRefundReference(ObjectGuid itemGUID)
Definition: Player.cpp:15463
void RemoveTradeableItem(Item *item)
Definition: PlayerStorage.cpp:4154
EnchantDurationList m_enchantDuration
Definition: Player.h:2799
void RemoveItemDurations(Item *item)
Definition: Player.cpp:12395
void RemoveEnchantmentDurationsReferences(Item *item)
Definition: PlayerStorage.cpp:4229
RefundableItemsSet m_refundableItems
Definition: Player.h:2899
Item * GetItemByGuid(ObjectGuid guid) const
Definition: PlayerStorage.cpp:430

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT, CHAR_DEL_CHAR_INVENTORY_BY_ITEM, CHAR_DEL_ITEM_INSTANCE, CHAR_REP_INVENTORY_ITEM, CharacterDatabase, DeleteRefundReference(), Item::FSetState(), Item::GetBagSlot(), Item::GetContainer(), ObjectGuid::GetCounter(), Object::GetGUID(), GetItemByGuid(), GetItemByPos(), WorldObject::GetName(), Item::GetSlot(), Item::GetState(), Item::GetTemplate(), ItemTemplate::HasFlag(), INVENTORY_SLOT_BAG_0, ITEM_CHANGED, ITEM_FLAG_HAS_LOOT, ITEM_NEW, ITEM_REMOVED, ITEM_UNCHANGED, LOG_ERROR, m_enchantDuration, m_items, m_itemUpdateQueue, m_refundableItems, RemoveEnchantmentDurationsReferences(), RemoveItemDurations(), RemoveTradeableItem(), Item::SaveToDB(), PreparedStatementBase::SetData(), sLootItemStorage, ObjectGuid::ToString(), Position::ToString(), and Item::UpdatePlayedTime().

Referenced by SaveInventoryAndGoldToDB(), and SaveToDB().

◆ _SaveMail()

void Player::_SaveMail ( CharacterDatabaseTransaction  trans)
protected
7394{
7395 if (!GetMailSize() || !m_mailsUpdated)
7396 {
7397 return;
7398 }
7399
7400 CharacterDatabasePreparedStatement* stmt = nullptr;
7401
7402 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
7403 {
7404 Mail* m = (*itr);
7405 if (m->state == MAIL_STATE_CHANGED)
7406 {
7407 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL);
7408 stmt->SetData(0, uint8(m->HasItems() ? 1 : 0));
7409 stmt->SetData(1, uint32(m->expire_time));
7410 stmt->SetData(2, uint32(m->deliver_time));
7411 stmt->SetData(3, m->money);
7412 stmt->SetData(4, m->COD);
7413 stmt->SetData(5, uint8(m->checked));
7414 stmt->SetData(6, m->messageID);
7415
7416 trans->Append(stmt);
7417
7418 if (!m->removedItems.empty())
7419 {
7420 for (std::vector<uint32>::iterator itr2 = m->removedItems.begin(); itr2 != m->removedItems.end(); ++itr2)
7421 {
7422 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM);
7423 stmt->SetData(0, *itr2);
7424 trans->Append(stmt);
7425 }
7426 m->removedItems.clear();
7427 }
7429 }
7430 else if (m->state == MAIL_STATE_DELETED)
7431 {
7432 if (m->HasItems())
7433 {
7434 for (MailItemInfoVec::iterator itr2 = m->items.begin(); itr2 != m->items.end(); ++itr2)
7435 {
7436 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
7437 stmt->SetData(0, itr2->item_guid);
7438 trans->Append(stmt);
7439 }
7440 }
7441 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
7442 stmt->SetData(0, m->messageID);
7443 trans->Append(stmt);
7444
7445 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
7446 stmt->SetData(0, m->messageID);
7447 trans->Append(stmt);
7448 }
7449 }
7450
7451 //deallocate deleted mails...
7452 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end();)
7453 {
7454 if ((*itr)->state == MAIL_STATE_DELETED)
7455 {
7456 Mail* m = *itr;
7457 m_mail.erase(itr);
7458 delete m;
7459 itr = m_mail.begin();
7460 }
7461 else
7462 ++itr;
7463 }
7464
7465 m_mailsUpdated = false;
7466}
@ MAIL_STATE_DELETED
Definition: Mail.h:71
@ MAIL_STATE_CHANGED
Definition: Mail.h:70
@ CHAR_UPD_MAIL
Definition: CharacterDatabase.h:435
@ CHAR_DEL_MAIL_BY_ID
Definition: CharacterDatabase.h:110
@ CHAR_DEL_MAIL_ITEM_BY_ID
Definition: CharacterDatabase.h:380
uint32 GetMailSize()
Definition: Player.h:1634
bool HasItems() const
Definition: Mail.h:207
std::vector< uint32 > removedItems
Definition: Mail.h:178
std::vector< MailItemInfo > items
Definition: Mail.h:177

References CHAR_DEL_ITEM_INSTANCE, CHAR_DEL_MAIL_BY_ID, CHAR_DEL_MAIL_ITEM, CHAR_DEL_MAIL_ITEM_BY_ID, CHAR_UPD_MAIL, CharacterDatabase, Mail::checked, Mail::COD, Mail::deliver_time, Mail::expire_time, GetMailSize(), Mail::HasItems(), Mail::items, m_mail, m_mailsUpdated, MAIL_STATE_CHANGED, MAIL_STATE_DELETED, MAIL_STATE_UNCHANGED, Mail::messageID, Mail::money, Mail::removedItems, PreparedStatementBase::SetData(), and Mail::state.

Referenced by WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), and SaveToDB().

◆ _SaveMonthlyQuestStatus()

void Player::_SaveMonthlyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7631{
7632 if (!m_MonthlyQuestChanged || m_monthlyquests.empty())
7633 return;
7634
7635 // we don't need transactions here.
7637 stmt->SetData(0, GetGUID().GetCounter());
7638 trans->Append(stmt);
7639
7640 for (QuestSet::const_iterator iter = m_monthlyquests.begin(); iter != m_monthlyquests.end(); ++iter)
7641 {
7642 uint32 quest_id = *iter;
7643 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS);
7644 stmt->SetData(0, GetGUID().GetCounter());
7645 stmt->SetData(1, quest_id);
7646 trans->Append(stmt);
7647 }
7648
7649 m_MonthlyQuestChanged = false;
7650}
@ CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS
Definition: CharacterDatabase.h:76
@ CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR
Definition: CharacterDatabase.h:61

References CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS, CharacterDatabase, Object::GetGUID(), m_MonthlyQuestChanged, m_monthlyquests, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SavePlayerSettings()

void Player::_SavePlayerSettings ( CharacterDatabaseTransaction  trans)
protected
92{
93 if (!sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED))
94 {
95 return;
96 }
97
98 for (auto& itr : m_charSettingsMap)
99 {
100 std::ostringstream data;
101
102 for (auto& setting : itr.second)
103 {
104 data << setting.value << ' ';
105 }
106
108 stmt->SetData(0, GetGUID().GetCounter());
109 stmt->SetData(1, itr.first);
110 stmt->SetData(2, data.str());
111 trans->Append(stmt);
112 }
113}
@ CHAR_REP_CHAR_SETTINGS
Definition: CharacterDatabase.h:519

References CHAR_REP_CHAR_SETTINGS, CharacterDatabase, CONFIG_PLAYER_SETTINGS_ENABLED, Object::GetGUID(), m_charSettingsMap, PreparedStatementBase::SetData(), and sWorld.

Referenced by SaveToDB().

◆ _SaveQuestStatus()

void Player::_SaveQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7469{
7470 bool isTransaction = static_cast<bool>(trans);
7471 if (!isTransaction)
7472 trans = CharacterDatabase.BeginTransaction();
7473
7474 QuestStatusSaveMap::iterator saveItr;
7475 QuestStatusMap::iterator statusItr;
7476 CharacterDatabasePreparedStatement* stmt = nullptr;
7477
7478 bool keepAbandoned = !(sWorld->GetCleaningFlags() & CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS);
7479
7480 for (saveItr = m_QuestStatusSave.begin(); saveItr != m_QuestStatusSave.end(); ++saveItr)
7481 {
7482 if (saveItr->second)
7483 {
7484 statusItr = m_QuestStatus.find(saveItr->first);
7485 if (statusItr != m_QuestStatus.end() && (keepAbandoned || statusItr->second.Status != QUEST_STATUS_NONE))
7486 {
7487 uint8 index = 0;
7488 stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_QUESTSTATUS);
7489
7490 stmt->SetData(index++, GetGUID().GetCounter());
7491 stmt->SetData(index++, statusItr->first);
7492 stmt->SetData(index++, uint8(statusItr->second.Status));
7493 stmt->SetData(index++, statusItr->second.Explored);
7494 stmt->SetData(index++, uint32(statusItr->second.Timer / IN_MILLISECONDS + GameTime::GetGameTime().count()));
7495
7496 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
7497 stmt->SetData(index++, statusItr->second.CreatureOrGOCount[i]);
7498
7499 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
7500 stmt->SetData(index++, statusItr->second.ItemCount[i]);
7501
7502 stmt->SetData(index, statusItr->second.PlayerCount);
7503 trans->Append(stmt);
7504 }
7505 }
7506 else
7507 {
7508 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST);
7509 stmt->SetData(0, GetGUID().GetCounter());
7510 stmt->SetData(1, saveItr->first);
7511 trans->Append(stmt);
7512 }
7513 }
7514
7515 m_QuestStatusSave.clear();
7516
7517 for (saveItr = m_RewardedQuestsSave.begin(); saveItr != m_RewardedQuestsSave.end(); ++saveItr)
7518 {
7519 if (saveItr->second)
7520 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_QUESTSTATUS_REWARDED);
7521 else // xinef: what the is this? quest can be removed by spelleffect if (!keepAbandoned)
7523
7524 stmt->SetData(0, GetGUID().GetCounter());
7525 stmt->SetData(1, saveItr->first);
7526 trans->Append(stmt);
7527 }
7528
7529 m_RewardedQuestsSave.clear();
7530
7531 if (!isTransaction)
7532 CharacterDatabase.CommitTransaction(trans);
7533}
@ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST
Definition: CharacterDatabase.h:439
@ CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST
Definition: CharacterDatabase.h:437
@ CHAR_REP_CHAR_QUESTSTATUS
Definition: CharacterDatabase.h:436
@ CHAR_INS_CHAR_QUESTSTATUS_REWARDED
Definition: CharacterDatabase.h:438
@ CLEANING_FLAG_QUESTSTATUS
Definition: CharacterDatabaseCleaner.h:31
QuestStatusSaveMap m_QuestStatusSave
Definition: Player.h:2762
QuestStatusSaveMap m_RewardedQuestsSave
Definition: Player.h:2765

References CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, CHAR_INS_CHAR_QUESTSTATUS_REWARDED, CHAR_REP_CHAR_QUESTSTATUS, CharacterDatabase, CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS, ObjectGuid::GetCounter(), GameTime::GetGameTime(), Object::GetGUID(), IN_MILLISECONDS, m_QuestStatus, m_QuestStatusSave, m_RewardedQuestsSave, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_STATUS_NONE, PreparedStatementBase::SetData(), and sWorld.

Referenced by SaveToDB().

◆ _SaveSeasonalQuestStatus()

void Player::_SaveSeasonalQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7597{
7599 {
7600 return;
7601 }
7602
7603 // we don't need transactions here.
7605 stmt->SetData(0, GetGUID().GetCounter());
7606 trans->Append(stmt);
7607
7608 m_SeasonalQuestChanged = false;
7609
7610 if (m_seasonalquests.empty())
7611 {
7612 return;
7613 }
7614
7615 for (SeasonalEventQuestMap::const_iterator iter = m_seasonalquests.begin(); iter != m_seasonalquests.end(); ++iter)
7616 {
7617 uint16 eventId = iter->first;
7618
7619 for (SeasonalQuestSet::const_iterator itr = iter->second.begin(); itr != iter->second.end(); ++itr)
7620 {
7621 uint32 questId = *itr;
7622
7623 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS);
7624 stmt->SetArguments(GetGUID().GetCounter(), questId, eventId);
7625 trans->Append(stmt);
7626 }
7627 }
7628}
@ CHAR_INS_CHARACTER_SEASONALQUESTSTATUS
Definition: CharacterDatabase.h:77
@ CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR
Definition: CharacterDatabase.h:62
void SetArguments(Args &&... args)
Definition: PreparedStatement.h:119

References CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, CHAR_INS_CHARACTER_SEASONALQUESTSTATUS, CharacterDatabase, Object::GetGUID(), m_SeasonalQuestChanged, m_seasonalquests, PreparedStatementBase::SetArguments(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveSkills()

void Player::_SaveSkills ( CharacterDatabaseTransaction  trans)
7653{
7654 CharacterDatabasePreparedStatement* stmt = nullptr;
7655 // we don't need transactions here.
7656 for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end();)
7657 {
7658 if (itr->second.uState == SKILL_UNCHANGED)
7659 {
7660 ++itr;
7661 continue;
7662 }
7663
7664 if (itr->second.uState == SKILL_DELETED)
7665 {
7666 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILL_BY_SKILL);
7667 stmt->SetData(0, GetGUID().GetCounter());
7668 stmt->SetData(1, itr->first);
7669 trans->Append(stmt);
7670
7671 mSkillStatus.erase(itr++);
7672 continue;
7673 }
7674
7675 uint32 valueData = GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos));
7676 uint16 value = SKILL_VALUE(valueData);
7677 uint16 max = SKILL_MAX(valueData);
7678
7679 switch (itr->second.uState)
7680 {
7681 case SKILL_NEW:
7682 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILLS);
7683 stmt->SetData(0, GetGUID().GetCounter());
7684 stmt->SetData(1, uint16(itr->first));
7685 stmt->SetData(2, value);
7686 stmt->SetData(3, max);
7687 trans->Append(stmt);
7688
7689 break;
7690 case SKILL_CHANGED:
7691 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_SKILLS);
7692 stmt->SetData(0, value);
7693 stmt->SetData(1, max);
7694 stmt->SetData(2, GetGUID().GetCounter());
7695 stmt->SetData(3, uint16(itr->first));
7696 trans->Append(stmt);
7697
7698 break;
7699 default:
7700 break;
7701 }
7702 itr->second.uState = SKILL_UNCHANGED;
7703
7704 ++itr;
7705 }
7706}
#define SKILL_MAX(x)
Definition: Player.h:83
#define SKILL_VALUE(x)
Definition: Player.h:82
@ SKILL_DELETED
Definition: Player.h:642
@ SKILL_CHANGED
Definition: Player.h:640
@ SKILL_NEW
Definition: Player.h:641
@ CHAR_INS_CHAR_SKILLS
Definition: CharacterDatabase.h:444
@ CHAR_UDP_CHAR_SKILLS
Definition: CharacterDatabase.h:445
@ CHAR_DEL_CHAR_SKILL_BY_SKILL
Definition: CharacterDatabase.h:443

References CHAR_DEL_CHAR_SKILL_BY_SKILL, CHAR_INS_CHAR_SKILLS, CHAR_UDP_CHAR_SKILLS, CharacterDatabase, Object::GetGUID(), Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_VALUE_INDEX, PreparedStatementBase::SetData(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_UNCHANGED, and SKILL_VALUE.

Referenced by SaveToDB().

◆ _SaveSpellCooldowns()

void Player::_SaveSpellCooldowns ( CharacterDatabaseTransaction  trans,
bool  logout 
)
3604{
3606 stmt->SetData(0, GetGUID().GetCounter());
3607 trans->Append(stmt);
3608
3609 time_t curTime = GameTime::GetGameTime().count();
3610 uint32 curMSTime = GameTime::GetGameTimeMS().count();
3611 uint32 infTime = curMSTime + infinityCooldownDelayCheck;
3612
3613 bool first_round = true;
3614 std::ostringstream ss;
3615
3616 // remove outdated and save active
3617 for (SpellCooldowns::iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end();)
3618 {
3619 // Xinef: dummy cooldown for procs
3620 if (itr->first == uint32(-1))
3621 {
3622 ++itr;
3623 continue;
3624 }
3625
3626 if (itr->second.end <= curMSTime + 1000)
3627 m_spellCooldowns.erase(itr++);
3628 else if (itr->second.end <= infTime && (logout || itr->second.end > (curMSTime + 5 * MINUTE * IN_MILLISECONDS))) // not save locked cooldowns, it will be reset or set at reload
3629 {
3630 if (first_round)
3631 {
3632 ss << "INSERT INTO character_spell_cooldown (guid, spell, category, item, time, needSend) VALUES ";
3633 first_round = false;
3634 }
3635 // next new/changed record prefix
3636 else
3637 ss << ',';
3638
3639 uint64 cooldown = uint64(((itr->second.end - curMSTime) / IN_MILLISECONDS) + curTime);
3640 ss << '(' << GetGUID().GetCounter() << ',' << itr->first << ',' << itr->second.category << "," << itr->second.itemid << ',' << cooldown << ',' << (itr->second.needSendToClient ? '1' : '0') << ')';
3641 ++itr;
3642 }
3643 else
3644 ++itr;
3645 }
3646 // if something changed execute
3647 if (!first_round)
3648 trans->Append(ss.str().c_str());
3649}
static constexpr uint32 infinityCooldownDelayCheck
Definition: Unit.h:47
@ CHAR_DEL_CHAR_SPELL_COOLDOWN
Definition: CharacterDatabase.h:404

References CHAR_DEL_CHAR_SPELL_COOLDOWN, CharacterDatabase, ObjectGuid::GetCounter(), GameTime::GetGameTime(), GameTime::GetGameTimeMS(), Object::GetGUID(), IN_MILLISECONDS, infinityCooldownDelayCheck, m_spellCooldowns, MINUTE, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveSpells()

void Player::_SaveSpells ( CharacterDatabaseTransaction  trans)
protected
7709{
7710 CharacterDatabasePreparedStatement* stmt = nullptr;
7711
7712 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end();)
7713 {
7714 // xinef: skip temporary spells
7715 if (itr->second->State == PLAYERSPELL_TEMPORARY)
7716 {
7717 ++itr;
7718 continue;
7719 }
7720
7721 // xinef: Delete statement for removed / updated spell
7722 if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
7723 {
7724 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_BY_SPELL);
7725 stmt->SetData(0, GetGUID().GetCounter());
7726 stmt->SetData(1, itr->first);
7727 trans->Append(stmt);
7728 }
7729
7730 // xinef: insert statement for new / updated spell
7731 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
7732 {
7733 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SPELL);
7734 stmt->SetData(0, GetGUID().GetCounter());
7735 stmt->SetData(1, itr->first);
7736 stmt->SetData(2, itr->second->specMask);
7737 trans->Append(stmt);
7738 }
7739
7740 if (itr->second->State == PLAYERSPELL_REMOVED)
7741 {
7742 delete itr->second;
7743 m_spells.erase(itr++);
7744 }
7745 else
7746 {
7747 itr->second->State = PLAYERSPELL_UNCHANGED;
7748 ++itr;
7749 }
7750 }
7751}
@ CHAR_INS_CHAR_SPELL
Definition: CharacterDatabase.h:446
@ CHAR_DEL_CHAR_SPELL_BY_SPELL
Definition: CharacterDatabase.h:397

References CHAR_DEL_CHAR_SPELL_BY_SPELL, CHAR_INS_CHAR_SPELL, CharacterDatabase, Object::GetGUID(), m_spells, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveStats()

void Player::_SaveStats ( CharacterDatabaseTransaction  trans)
protected
7756{
7757 // check if stat saving is enabled and if char level is high enough
7758 if (!sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE) || GetLevel() < sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE))
7759 return;
7760
7761 CharacterDatabasePreparedStatement* stmt = nullptr;
7762
7763 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_STATS);
7764 stmt->SetData(0, GetGUID().GetCounter());
7765 trans->Append(stmt);
7766
7767 uint8 index = 0;
7768
7769 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_STATS);
7770 stmt->SetData(index++, GetGUID().GetCounter());
7771 stmt->SetData(index++, GetMaxHealth());
7772
7773 for (uint8 i = 0; i < MAX_POWERS; ++i)
7774 stmt->SetData(index++, GetMaxPower(Powers(i)));
7775
7776 for (uint8 i = 0; i < MAX_STATS; ++i)
7777 stmt->SetData(index++, GetStat(Stats(i)));
7778
7779 for (int i = 0; i < MAX_SPELL_SCHOOL; ++i)
7780 stmt->SetData(index++, GetResistance(SpellSchools(i)));
7781
7790 stmt->SetData(index++, GetBaseSpellPowerBonus());
7792
7793 trans->Append(stmt);
7794}
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition: UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition: UpdateFields.h:351
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition: UpdateFields.h:354
@ PLAYER_FIELD_COMBAT_RATING_1
Definition: UpdateFields.h:380
@ PLAYER_PARRY_PERCENTAGE
Definition: UpdateFields.h:348
@ PLAYER_BLOCK_PERCENTAGE
Definition: UpdateFields.h:346
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition: UpdateFields.h:165
@ PLAYER_DODGE_PERCENTAGE
Definition: UpdateFields.h:347
@ UNIT_FIELD_ATTACK_POWER
Definition: UpdateFields.h:162
@ CONFIG_MIN_LEVEL_STAT_SAVE
Definition: IWorld.h:352
@ CHAR_DEL_CHAR_STATS
Definition: CharacterDatabase.h:447
@ CHAR_INS_CHAR_STATS
Definition: CharacterDatabase.h:448
#define MAX_STATS
Definition: SharedDefines.h:265
SpellSchools
Definition: SharedDefines.h:282
constexpr auto MAX_SPELL_SCHOOL
Definition: SharedDefines.h:292
Stats
Definition: SharedDefines.h:257
float GetFloatValue(uint16 index) const
Definition: Object.cpp:317
uint32 GetBaseSpellPowerBonus()
Definition: Player.h:1948
uint32 GetResistance(SpellSchools school) const
Definition: Unit.h:777
uint32 GetMaxHealth() const
Definition: Unit.h:783
uint32 GetMaxPower(Powers power) const
Definition: Unit.h:805
float GetStat(Stats stat) const
Definition: Unit.h:772

References CHAR_DEL_CHAR_STATS, CHAR_INS_CHAR_STATS, CharacterDatabase, CONFIG_MIN_LEVEL_STAT_SAVE, CR_CRIT_TAKEN_SPELL, GetBaseSpellPowerBonus(), Object::GetFloatValue(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetResistance(), Unit::GetStat(), Object::GetUInt32Value(), MAX_POWERS, MAX_SPELL_SCHOOL, MAX_STATS, PLAYER_BLOCK_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_DODGE_PERCENTAGE, PLAYER_FIELD_COMBAT_RATING_1, PLAYER_PARRY_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, PreparedStatementBase::SetData(), sWorld, UNIT_FIELD_ATTACK_POWER, and UNIT_FIELD_RANGED_ATTACK_POWER.

Referenced by SaveToDB().

◆ _SaveTalents()

void Player::_SaveTalents ( CharacterDatabaseTransaction  trans)
protected
14976{
14977 CharacterDatabasePreparedStatement* stmt = nullptr;
14978
14979 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end();)
14980 {
14981 // xinef: skip temporary spells
14982 if (itr->second->State == PLAYERSPELL_TEMPORARY)
14983 {
14984 ++itr;
14985 continue;
14986 }
14987
14988 // xinef: delete statement for removed / updated talent
14989 if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
14990 {
14991 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL);
14992 stmt->SetData(0, GetGUID().GetCounter());
14993 stmt->SetData(1, itr->first);
14994 trans->Append(stmt);
14995 }
14996
14997 // xinef: insert statement for new / updated spell
14998 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
14999 {
15000 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_TALENT);
15001 stmt->SetData(0, GetGUID().GetCounter());
15002 stmt->SetData(1, itr->first);
15003 stmt->SetData(2, itr->second->specMask);
15004 trans->Append(stmt);
15005 }
15006
15007 if (itr->second->State == PLAYERSPELL_REMOVED)
15008 {
15009 delete itr->second;
15010 m_talents.erase(itr++);
15011 }
15012 else
15013 {
15014 itr->second->State = PLAYERSPELL_UNCHANGED;
15015 ++itr;
15016 }
15017 }
15018}
@ CHAR_INS_CHAR_TALENT
Definition: CharacterDatabase.h:456
@ CHAR_DEL_CHAR_TALENT_BY_SPELL
Definition: CharacterDatabase.h:455

References CHAR_DEL_CHAR_TALENT_BY_SPELL, CHAR_INS_CHAR_TALENT, CharacterDatabase, Object::GetGUID(), m_talents, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveWeeklyQuestStatus()

void Player::_SaveWeeklyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7574{
7575 if (!m_WeeklyQuestChanged || m_weeklyquests.empty())
7576 return;
7577
7578 // we don't need transactions here.
7580 stmt->SetData(0, GetGUID().GetCounter());
7581 trans->Append(stmt);
7582
7583 for (QuestSet::const_iterator iter = m_weeklyquests.begin(); iter != m_weeklyquests.end(); ++iter)
7584 {
7585 uint32 quest_id = *iter;
7586
7587 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS);
7588 stmt->SetData(0, GetGUID().GetCounter());
7589 stmt->SetData(1, quest_id);
7590 trans->Append(stmt);
7591 }
7592
7593 m_WeeklyQuestChanged = false;
7594}
@ CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR
Definition: CharacterDatabase.h:60
@ CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS
Definition: CharacterDatabase.h:75

References CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS, CharacterDatabase, Object::GetGUID(), m_WeeklyQuestChanged, m_weeklyquests, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _StoreItem()

Item * Player::_StoreItem ( uint16  pos,
Item pItem,
uint32  count,
bool  clone,
bool  update 
)
private
2625{
2626 if (!pItem)
2627 return nullptr;
2628
2629 uint8 bag = pos >> 8;
2630 uint8 slot = pos & 255;
2631
2632 LOG_DEBUG("entities.player.items", "STORAGE: StoreItem bag = {}, slot = {}, item = {}, count = {}, {}", bag, slot, pItem->GetEntry(), count, pItem->GetGUID().ToString());
2633
2634 Item* pItem2 = GetItemByPos(bag, slot);
2635
2636 if (!pItem2)
2637 {
2638 if (clone)
2639 pItem = pItem->CloneItem(count, this);
2640 else
2641 pItem->SetCount(count);
2642
2643 if (!pItem)
2644 return nullptr;
2645
2646 if (pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP ||
2647 pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM ||
2648 (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos)))
2649 pItem->SetBinding(true);
2650
2651 Bag* pBag = (bag == INVENTORY_SLOT_BAG_0) ? nullptr : GetBagByPos(bag);
2652 if (!pBag)
2653 {
2654 m_items[slot] = pItem;
2655 SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID());
2658
2659 pItem->SetSlot(slot);
2660 pItem->SetContainer(nullptr);
2661
2662 // need update known currency
2664 AddKnownCurrency(pItem->GetEntry());
2665 }
2666 else
2667 pBag->StoreItem(slot, pItem, update);
2668
2669 if (IsInWorld() && update)
2670 {
2671 pItem->AddToWorld();
2672 pItem->SendUpdateToPlayer(this);
2673 }
2674
2675 pItem->SetState(ITEM_CHANGED, this);
2676 if (pBag)
2677 pBag->SetState(ITEM_CHANGED, this);
2678
2680 AddItemDurations(pItem);
2681
2682 return pItem;
2683 }
2684 else
2685 {
2686 if (pItem2->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP ||
2687 pItem2->GetTemplate()->Bonding == BIND_QUEST_ITEM ||
2688 (pItem2->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos)))
2689 pItem2->SetBinding(true);
2690
2691 pItem2->SetCount(pItem2->GetCount() + count);
2692 if (IsInWorld() && update)
2693 pItem2->SendUpdateToPlayer(this);
2694
2695 if (!clone)
2696 {
2697 // delete item (it not in any slot currently)
2698 if (IsInWorld() && update)
2699 {
2700 pItem->RemoveFromWorld();
2701 pItem->DestroyForPlayer(this);
2702 }
2703
2705 RemoveItemDurations(pItem);
2706
2707 pItem->SetOwnerGUID(GetGUID()); // prevent error at next SetState in case trade/mail/buy from vendor
2708 pItem->SetNotRefundable(this);
2709 pItem->ClearSoulboundTradeable(this);
2710 RemoveTradeableItem(pItem);
2711 pItem->SetState(ITEM_REMOVED, this);
2712 }
2713
2715
2716 pItem2->SetState(ITEM_CHANGED, this);
2717
2718 return pItem2;
2719 }
2720}
@ PLAYER_FIELD_INV_SLOT_HEAD
Definition: UpdateFields.h:327
@ ITEM_FIELD_OWNER
Definition: UpdateFields.h:35
@ ITEM_FIELD_CONTAINED
Definition: UpdateFields.h:36
@ BIND_WHEN_EQUIPPED
Definition: ItemTemplate.h:97
@ BIND_QUEST_ITEM
Definition: ItemTemplate.h:99
@ BIND_WHEN_PICKED_UP
Definition: ItemTemplate.h:96
@ CURRENCYTOKEN_SLOT_END
Definition: Player.h:737
@ CURRENCYTOKEN_SLOT_START
Definition: Player.h:736
void StoreItem(uint8 slot, Item *pItem, bool update)
Definition: Bag.cpp:154
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
Definition: Item.cpp:715
void SetBinding(bool val)
Definition: Item.h:235
Item * CloneItem(uint32 count, Player const *player=nullptr) const
Definition: Item.cpp:1119
void SetCount(uint32 value)
Definition: Item.h:273
void SetNotRefundable(Player *owner, bool changestate=true, CharacterDatabaseTransaction *trans=nullptr)
Definition: Item.cpp:1201
void SetSlot(uint8 slot)
Definition: Item.h:284
uint32 GetCount() const
Definition: Item.h:272
void SetOwnerGUID(ObjectGuid guid)
Definition: Item.h:232
void SetContainer(Bag *container)
Definition: Item.h:286
uint32 Bonding
Definition: ItemTemplate.h:663
virtual void DestroyForPlayer(Player *target, bool onDeath=false) const
Definition: Object.cpp:274
void SetGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:723
virtual void AddToWorld()
Definition: Object.cpp:152
virtual void RemoveFromWorld()
Definition: Object.cpp:166
void SendUpdateToPlayer(Player *player)
Definition: Object.cpp:246
Bag * GetBagByPos(uint8 slot) const
Definition: PlayerStorage.cpp:480
void AddEnchantmentDurations(Item *item)
Definition: PlayerStorage.cpp:4201
void RemoveEnchantmentDurations(Item *item)
Definition: PlayerStorage.cpp:4214
void AddItemDurations(Item *item)
Definition: Player.cpp:12407
void AddKnownCurrency(uint32 itemId)
Definition: Player.cpp:14160

References AddEnchantmentDurations(), AddItemDurations(), AddKnownCurrency(), Object::AddToWorld(), BIND_QUEST_ITEM, BIND_WHEN_EQUIPPED, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, Item::ClearSoulboundTradeable(), Item::CloneItem(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, Object::DestroyForPlayer(), GetBagByPos(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, IsBagPos(), Object::IsInWorld(), ITEM_CHANGED, ITEM_FIELD_CONTAINED, ITEM_FIELD_OWNER, ITEM_REMOVED, LOG_DEBUG, m_items, PLAYER_FIELD_INV_SLOT_HEAD, RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDurations(), RemoveTradeableItem(), Object::SendUpdateToPlayer(), Item::SetBinding(), Item::SetContainer(), Item::SetCount(), Object::SetGuidValue(), Item::SetNotRefundable(), Item::SetOwnerGUID(), Item::SetSlot(), Item::SetState(), Bag::StoreItem(), and ObjectGuid::ToString().

Referenced by StoreItem().

◆ _StoreOrEquipNewItem()

bool Player::_StoreOrEquipNewItem ( uint32  vendorslot,
uint32  item,
uint8  count,
uint8  bag,
uint8  slot,
int32  price,
ItemTemplate const *  pProto,
Creature pVendor,
VendorItem const *  crItem,
bool  bStore 
)
inline
10600{
10601 ItemPosCountVec vDest;
10602 uint16 uiDest = 0;
10603 InventoryResult msg = bStore ?
10604 CanStoreNewItem(bag, slot, vDest, item, pProto->BuyCount * count) :
10605 CanEquipNewItem(slot, uiDest, item, false);
10606 if (msg != EQUIP_ERR_OK)
10607 {
10608 SendEquipError(msg, nullptr, nullptr, item);
10609 return false;
10610 }
10611
10612 ModifyMoney(-price);
10613
10614 if (crItem->ExtendedCost) // case for new honor system
10615 {
10616 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost);
10617 if (iece->reqhonorpoints)
10618 ModifyHonorPoints(- int32(iece->reqhonorpoints * count));
10619
10620 if (iece->reqarenapoints)
10621 ModifyArenaPoints(- int32(iece->reqarenapoints * count));
10622
10623 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
10624 {
10625 if (iece->reqitem[i])
10626 DestroyItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count), true);
10627 }
10628 }
10629
10630 sScriptMgr->OnBeforeStoreOrEquipNewItem(this, vendorslot, item, count, bag, slot, pProto, pVendor, crItem, bStore);
10631
10632 Item* it = bStore ? StoreNewItem(vDest, item, true) : EquipNewItem(uiDest, item, true);
10633 if (it)
10634 {
10635 uint32 new_count = pVendor->UpdateVendorItemCurrentCount(crItem, pProto->BuyCount * count);
10636
10637 WorldPacket data(SMSG_BUY_ITEM, (8 + 4 + 4 + 4));
10638 data << pVendor->GetGUID();
10639 data << uint32(vendorslot + 1); // numbered from 1 at client
10640 data << int32(crItem->maxcount > 0 ? new_count : 0xFFFFFFFF);
10641 data << uint32(count);
10642 GetSession()->SendPacket(&data);
10643 SendNewItem(it, pProto->BuyCount * count, true, false, false);
10644
10645 if (!bStore)
10647
10648 if (pProto->HasFlag(ITEM_FLAG_ITEM_PURCHASE_RECORD) && crItem->ExtendedCost && pProto->GetMaxStackSize() == 1)
10649 {
10651 it->SetRefundRecipient(GetGUID().GetCounter());
10652 it->SetPaidMoney(price);
10653 it->SetPaidExtendedCost(crItem->ExtendedCost);
10654 it->SaveRefundDataToDB();
10656 }
10657 }
10658
10659 sScriptMgr->OnAfterStoreOrEquipNewItem(this, vendorslot, it, count, bag, slot, pProto, pVendor, crItem, bStore);
10660
10661 return true;
10662}
DBCStorage< ItemExtendedCostEntry > sItemExtendedCostStore(ItemExtendedCostEntryfmt)
InventoryResult
Definition: Item.h:46
@ ITEM_FLAG_ITEM_PURCHASE_RECORD
Definition: ItemTemplate.h:159
#define MAX_ITEM_EXTENDED_COST_REQUIREMENTS
Definition: DBCStructure.h:1182
@ SMSG_BUY_ITEM
Definition: Opcodes.h:450
uint32 UpdateVendorItemCurrentCount(VendorItem const *vItem, uint32 used_count)
Definition: Creature.cpp:3090
void SaveRefundDataToDB()
Definition: Item.cpp:1173
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:845
InventoryResult CanEquipNewItem(uint8 slot, uint16 &dest, uint32 item, bool swap) const
Definition: PlayerStorage.cpp:1814
bool ModifyMoney(int32 amount, bool sendError=true)
Definition: Player.cpp:11468
Item * EquipNewItem(uint16 pos, uint32 item, bool update)
Definition: PlayerStorage.cpp:2722
void SendNewItem(Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
Definition: PlayerStorage.cpp:4765
void AutoUnequipOffhandIfNeed(bool force=false)
Definition: Player.cpp:12416
void DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
Definition: PlayerStorage.cpp:3136
void ModifyHonorPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
Definition: Player.cpp:6228
void ModifyArenaPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
If trans is specified, honor save query will be added to trans.
Definition: Player.cpp:6244
Item * StoreNewItem(ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0)
Definition: PlayerStorage.cpp:2539
void SendEquipError(InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0)
Definition: PlayerStorage.cpp:4036
InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
Definition: Player.h:1272
Definition: WorldPacket.h:27
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition: WorldSession.cpp:214
Definition: DBCStructure.h:1185
uint32 reqarenapoints
Definition: DBCStructure.h:1188
uint32 reqitemcount[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition: DBCStructure.h:1191
uint32 reqitem[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition: DBCStructure.h:1190
uint32 reqhonorpoints
Definition: DBCStructure.h:1187

References AddRefundReference(), AutoUnequipOffhandIfNeed(), ItemTemplate::BuyCount, CanEquipNewItem(), CanStoreNewItem(), DestroyItemCount(), EQUIP_ERR_OK, EquipNewItem(), VendorItem::ExtendedCost, Object::GetGUID(), ItemTemplate::GetMaxStackSize(), GetSession(), ItemTemplate::HasFlag(), ITEM_FIELD_FLAG_REFUNDABLE, ITEM_FIELD_FLAGS, ITEM_FLAG_ITEM_PURCHASE_RECORD, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, VendorItem::maxcount, ModifyArenaPoints(), ModifyHonorPoints(), ModifyMoney(), ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, Item::SaveRefundDataToDB(), SendEquipError(), SendNewItem(), WorldSession::SendPacket(), Object::SetFlag(), Item::SetPaidExtendedCost(), Item::SetPaidMoney(), Item::SetRefundRecipient(), sItemExtendedCostStore, SMSG_BUY_ITEM, sScriptMgr, StoreNewItem(), and Creature::UpdateVendorItemCurrentCount().

Referenced by BuyItemFromVendorSlot().

◆ AbandonQuest()

void Player::AbandonQuest ( uint32  quest_id)
925{
926 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
927 {
928 // It will Destroy quest items on quests abandons.
929 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
930 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
931 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
932 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
933
934 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
935 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
936 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
937 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
938 }
939}
#define QUEST_SOURCE_ITEM_IDS_COUNT
Definition: QuestDef.h:37

References BIND_QUEST_ITEM, DestroyItemCount(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, and sObjectMgr.

Referenced by WorldSession::HandleQuestLogRemoveQuest().

◆ ActivateSpec()

void Player::ActivateSpec ( uint8  spec)
15021{
15022 // xinef: some basic checks
15023 if (GetActiveSpec() == spec)
15024 return;
15025
15026 if (spec > GetSpecsCount())
15027 return;
15028
15029 // xinef: interrupt currently casted spell just in case
15030 if (IsNonMeleeSpellCast(false))
15032
15033 // xinef: save current actions order
15034 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15035 _SaveActions(trans);
15036 CharacterDatabase.CommitTransaction(trans);
15037
15038 // xinef: remove pet, it will be resummoned later
15039 if (Pet* pet = GetPet())
15041
15042 // xinef: remove other summoned units and clear reactives
15046
15047 // xinef: let client clear his current Actions
15049 uint8 oldSpec = GetActiveSpec();
15050
15051 std::unordered_set<uint32> removedSpecAuras;
15052
15053 // xinef: reset talent auras
15054 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
15055 {
15056 if (itr->second->State == PLAYERSPELL_REMOVED)
15057 continue;
15058
15059 // xinef: remove all active talent auras
15060 if (!(itr->second->specMask & GetActiveSpecMask()))
15061 continue;
15062
15063 _removeTalentAurasAndSpells(itr->first);
15064
15065 // pussywizard: was => isn't
15066 if (!itr->second->IsInSpec(spec) && !itr->second->inSpellBook)
15067 SendLearnPacket(itr->first, false);
15068
15069 removedSpecAuras.insert(itr->first);
15070 }
15071
15072 // xinef: remove glyph auras
15073 for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
15074 if (uint32 glyphId = m_Glyphs[GetActiveSpec()][slot])
15075 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyphId))
15076 {
15077 RemoveAurasDueToSpell(glyphEntry->SpellId);
15078 removedSpecAuras.insert(glyphEntry->SpellId);
15079 }
15080
15081 // xinef: set active spec as new one
15082 SetActiveSpec(spec);
15083 uint32 spentTalents = 0;
15084
15085 // xinef: add talent auras
15086 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
15087 {
15088 if (itr->second->State == PLAYERSPELL_REMOVED)
15089 continue;
15090
15091 // xinef: talent not in new spec
15092 if (!(itr->second->specMask & GetActiveSpecMask()))
15093 continue;
15094
15095 // pussywizard: wasn't => is
15096 if (!itr->second->IsInSpec(oldSpec) && !itr->second->inSpellBook)
15097 SendLearnPacket(itr->first, true);
15098
15099 _addTalentAurasAndSpells(itr->first);
15100 TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first);
15101 spentTalents += talentPos->rank + 1;
15102
15103 removedSpecAuras.erase(itr->first);
15104 }
15105
15106 // pussywizard: remove spells that are in previous spec, but are not present in new one (or are in new spec, but not in the old one)
15107 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
15108 {
15109 if (!itr->second->Active || itr->second->State == PLAYERSPELL_REMOVED)
15110 continue;
15111
15112 // pussywizard: was => isn't
15113 if (itr->second->IsInSpec(oldSpec) && !itr->second->IsInSpec(spec))
15114 {
15115 SendLearnPacket(itr->first, false);
15116 // We want to remove all auras of the unlearned spell
15117 _removeTalentAurasAndSpells(itr->first);
15118
15119 removedSpecAuras.insert(itr->first);
15120 }
15121 // pussywizard: wasn't => is
15122 else if (!itr->second->IsInSpec(oldSpec) && itr->second->IsInSpec(spec))
15123 {
15124 SendLearnPacket(itr->first, true);
15125
15126 removedSpecAuras.erase(itr->first);
15127 }
15128 }
15129
15130 // xinef: apply glyphs from second spec
15131 if (GetActiveSpec() != oldSpec)
15132 {
15133 for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
15134 {
15135 uint32 glyphId = m_Glyphs[GetActiveSpec()][slot];
15136 if (glyphId)
15137 {
15138 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyphId))
15139 {
15141 removedSpecAuras.erase(glyphEntry->SpellId);
15142 }
15143 }
15144
15145 SetGlyph(slot, glyphId, true);
15146 }
15147 }
15148
15149 // Remove auras triggered/activated by talents/glyphs
15150 // Mostly explicit casts in dummy aura scripts
15151 if (!removedSpecAuras.empty())
15152 {
15153 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
15154 {
15155 Aura* aura = iter->second;
15156 if (SpellInfo const* triggeredByAuraSpellInfo = aura->GetTriggeredByAuraSpellInfo())
15157 {
15158 if (removedSpecAuras.find(triggeredByAuraSpellInfo->Id) != removedSpecAuras.end())
15159 {
15160 RemoveOwnedAura(iter);
15161 continue;
15162 }
15163 }
15164 ++iter;
15165 }
15166 }
15167
15168 m_usedTalentCount = spentTalents;
15170
15171 // load them asynchronously
15172 {
15174 stmt->SetData(0, GetGUID().GetCounter());
15175 stmt->SetData(1, m_activeSpec);
15176
15177 WorldSession* mySess = GetSession();
15178 mySess->GetQueryProcessor().AddCallback(CharacterDatabase.AsyncQuery(stmt)
15179 .WithPreparedCallback([mySess](PreparedQueryResult result)
15180 {
15181 // safe callback, we can't pass this pointer directly
15182 // in case player logs out before db response (player would be deleted in that case)
15183 if (Player* thisPlayer = mySess->GetPlayer())
15184 thisPlayer->LoadActions(result);
15185 }));
15186 }
15187
15188 // xinef: reset power
15189 Powers pw = getPowerType();
15190 if (pw != POWER_MANA)
15191 SetPower(POWER_MANA, 0); // Mana must be 0 even if it isn't the active power type.
15192 SetPower(pw, 0);
15193
15194 // xinef: remove titan grip if player had it set and does not have appropriate talent
15195 if (!HasTalent(46917, GetActiveSpec()) && m_canTitanGrip)
15196 SetCanTitanGrip(false);
15197 // xinef: remove dual wield if player does not have dual wield spell (shamans)
15198 if (!HasSpell(674) && m_canDualWield)
15199 SetCanDualWield(false);
15200
15202
15203 // Xinef: Patch 3.2.0: Switching spec removes paladins spell Righteous Fury (25780)
15205 RemoveAurasDueToSpell(25780);
15206
15207 // Xinef: Remove talented single target auras at other targets
15208 AuraList& scAuras = GetSingleCastAuras();
15209 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
15210 {
15211 Aura* aura = *iter;
15212 if (!HasActiveSpell(aura->GetId()) && !HasTalent(aura->GetId(), GetActiveSpec()) && !aura->GetCastItemGUID())
15213 {
15214 aura->Remove();
15215 iter = scAuras.begin();
15216 }
15217 else
15218 ++iter;
15219 }
15220
15221 sScriptMgr->OnAfterSpecSlotChanged(this, GetActiveSpec());
15222}
@ CLASS_CONTEXT_ABILITY
Definition: UnitDefines.h:213
@ CHAR_SEL_CHARACTER_ACTIONS_SPEC
Definition: CharacterDatabase.h:81
@ POWER_MANA
Definition: SharedDefines.h:269
@ CLASS_PALADIN
Definition: SharedDefines.h:142
T & AddCallback(T &&query)
Definition: AsyncCallbackProcessor.h:34
Definition: Pet.h:41
void InitTalentForLevel()
Definition: Player.cpp:2553
void SetCanTitanGrip(bool value)
Definition: Player.cpp:13091
void SetActiveSpec(uint8 spec)
Definition: Player.h:1723
Pet * GetPet() const
Definition: Player.cpp:8863
bool HasTalent(uint32 spell_id, uint8 spec) const
Definition: Player.cpp:3865
void RemovePet(Pet *pet, PetSaveMode mode, bool returnreagent=false)
Definition: Player.cpp:9014
void _SaveActions(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7149
uint8 GetSpecsCount() const
Definition: Player.h:1724
bool HasSpell(uint32 spell) const override
Definition: Player.cpp:3859
void SendActionButtons(uint32 state) const
Definition: Player.cpp:5495
void _addTalentAurasAndSpells(uint32 spellId)
Definition: Player.cpp:3002
virtual void SetCanDualWield(bool value)
Definition: Unit.h:686
std::list< Aura * > AuraList
Definition: Unit.h:647
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4094
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition: Unit.cpp:15504
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition: Unit.cpp:4064
void ClearAllReactives()
Definition: Unit.cpp:16866
void UnsummonAllTotems(bool onDeath=false)
Definition: Unit.cpp:11145
bool m_canDualWield
Definition: Unit.h:696
Powers getPowerType() const
Definition: Unit.h:801
AuraList & GetSingleCastAuras()
Definition: Unit.h:1311
void RemoveAllControlled(bool onDeath=false)
Definition: Unit.cpp:11026
Player session in the World.
Definition: WorldSession.h:330
QueryCallbackProcessor & GetQueryProcessor()
Definition: WorldSession.h:1077
uint32 GetId() const
Definition: SpellAuras.cpp:466
ObjectGuid GetCastItemGUID() const
Definition: SpellAuras.h:103
SpellInfo const * GetTriggeredByAuraSpellInfo() const
Definition: SpellAuras.cpp:2761
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0

References _addTalentAurasAndSpells(), _removeTalentAurasAndSpells(), _SaveActions(), AsyncCallbackProcessor< T >::AddCallback(), AutoUnequipOffhandIfNeed(), Unit::CastSpell(), CHAR_SEL_CHARACTER_ACTIONS_SPEC, CharacterDatabase, CLASS_CONTEXT_ABILITY, CLASS_PALADIN, Unit::ClearAllReactives(), GetActiveSpec(), GetActiveSpecMask(), Aura::GetCastItemGUID(), Object::GetGUID(), Aura::GetId(), GetPet(), Unit::getPowerType(), WorldSession::GetQueryProcessor(), GetSession(), Unit::GetSingleCastAuras(), GetSpecsCount(), GetTalentSpellPos(), Aura::GetTriggeredByAuraSpellInfo(), HasActiveSpell(), HasSpell(), HasTalent(), InitTalentForLevel(), Unit::InterruptNonMeleeSpells(), IsClass(), Unit::IsNonMeleeSpellCast(), m_activeSpec, Unit::m_canDualWield, m_canTitanGrip, m_Glyphs, Unit::m_ownedAuras, m_spells, m_talents, m_usedTalentCount, MAX_GLYPH_SLOT_INDEX, PET_SAVE_NOT_IN_SLOT, PLAYERSPELL_REMOVED, POWER_MANA, TalentSpellPos::rank, Aura::Remove(), Unit::RemoveAllControlled(), Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), RemovePet(), SendActionButtons(), SendLearnPacket(), SetActiveSpec(), Unit::SetCanDualWield(), SetCanTitanGrip(), PreparedStatementBase::SetData(), SetGlyph(), Unit::SetPower(), sGlyphPropertiesStore, sScriptMgr, TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_CASTER_AURASTATE, TRIGGERED_IGNORE_SHAPESHIFT, and Unit::UnsummonAllTotems().

Referenced by UpdateSpecCount().

◆ ActivateTaxiPathTo() [1/2]

bool Player::ActivateTaxiPathTo ( std::vector< uint32 > const &  nodes,
Creature npc = nullptr,
uint32  spellid = 1 
)
10188{
10189 if (nodes.size() < 2)
10190 return false;
10191
10192 // not let cheating with start flight in time of logout process || while in combat || has type state: stunned || has type state: root
10194 {
10196 return false;
10197 }
10198
10200 return false;
10201
10202 // taximaster case
10203 if (npc)
10204 {
10205 // not let cheating with start flight mounted
10206 if (IsMounted())
10207 {
10209 return false;
10210 }
10211
10213 {
10215 return false;
10216 }
10217
10218 // not let cheating with start flight in time of logout process || if casting not finished || while in combat || if not use Spell's with EffectSendTaxi
10219 if (IsNonMeleeSpellCast(false))
10220 {
10222 return false;
10223 }
10224 }
10225 // cast case or scripted call case
10226 else
10227 {
10229
10232
10234 if (spell->m_spellInfo->Id != spellid)
10236
10238
10240 if (spell->m_spellInfo->Id != spellid)
10242 }
10243
10244 uint32 sourcenode = nodes[0];
10245
10246 // starting node too far away (cheat?)
10247 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(sourcenode);
10248 if (!node)
10249 {
10251 return false;
10252 }
10253
10254 // Prepare to flight start now
10255
10256 // stop combat at start taxi flight if any
10257 CombatStop();
10258
10261 ExitVehicle();
10262
10263 // stop trade (client cancel trade at taxi map open but cheating tools can be used for reopen it)
10264 TradeCancel(true);
10265
10266 // clean not finished taxi path if any
10268
10269 // 0 element current node
10270 m_taxi.AddTaxiDestination(sourcenode);
10271
10272 // fill destinations path tail
10273 uint32 sourcepath = 0;
10274 uint32 totalcost = 0;
10275 uint32 firstcost = 0;
10276
10277 uint32 prevnode = sourcenode;
10278 uint32 lastnode = 0;
10279
10280 for (uint32 i = 1; i < nodes.size(); ++i)
10281 {
10282 uint32 path, cost;
10283
10284 lastnode = nodes[i];
10285 sObjectMgr->GetTaxiPath(prevnode, lastnode, path, cost);
10286
10287 if (!path)
10288 {
10290 return false;
10291 }
10292
10293 totalcost += cost;
10294 if (i == 1)
10295 firstcost = cost;
10296
10297 if (prevnode == sourcenode)
10298 sourcepath = path;
10299
10300 m_taxi.AddTaxiDestination(lastnode);
10301
10302 prevnode = lastnode;
10303 }
10304
10305 // get mount model (in case non taximaster (npc == nullptr) allow more wide lookup)
10306 //
10307 // Hack-Fix for Alliance not being able to use Acherus taxi. There is
10308 // only one mount ID for both sides. Probably not good to use 315 in case DBC nodes
10309 // change but I couldn't find a suitable alternative. OK to use class because only DK
10310 // can use this taxi.
10311 uint32 mount_display_id = sObjectMgr->GetTaxiMountDisplayId(sourcenode, GetTeamId(true), npc == nullptr || (sourcenode == 315 && IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TAXI)));
10312
10313 // in spell case allow 0 model
10314 if ((mount_display_id == 0 && spellid == 0) || sourcepath == 0)
10315 {
10318 return false;
10319 }
10320
10321 uint32 money = GetMoney();
10322
10323 if (npc)
10324 {
10325 float discount = GetReputationPriceDiscount(npc);
10326 totalcost = uint32(ceil(totalcost * discount));
10327 firstcost = uint32(ceil(firstcost * discount));
10329 }
10330 else
10331 {
10333 }
10334
10335 if (money < totalcost)
10336 {
10339 return false;
10340 }
10341
10342 //Checks and preparations done, DO FLIGHT
10344
10345 // prevent stealth flight
10346 //RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK);
10347
10348 // Xinef: dont use instant flight paths if spellid is present (custom calls use spellid = 1)
10349 if ((sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 1 || (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && m_isInstantFlightOn)) && !spellid)
10350 {
10351 TaxiNodesEntry const* lastPathNode = sTaxiNodesStore.LookupEntry(nodes[nodes.size() - 1]);
10353 ModifyMoney(-(int32)totalcost);
10355 TeleportTo(lastPathNode->map_id, lastPathNode->x, lastPathNode->y, lastPathNode->z, GetOrientation());
10356 return false;
10357 }
10358 else
10359 {
10360 m_flightSpellActivated = spellid;
10361 ModifyMoney(-(int32)firstcost);
10364 GetSession()->SendDoFlight(mount_display_id, sourcepath);
10365 }
10366 return true;
10367}
DBCStorage< TaxiNodesEntry > sTaxiNodesStore(TaxiNodesEntryfmt)
@ SPELL_AURA_MOD_SHAPESHIFT
Definition: SpellAuraDefines.h:99
npc
Definition: BattlegroundSA.h:75
@ CURRENT_CHANNELED_SPELL
Definition: Unit.h:539
@ CURRENT_GENERIC_SPELL
Definition: Unit.h:538
@ CURRENT_AUTOREPEAT_SPELL
Definition: Unit.h:540
@ CLASS_CONTEXT_TAXI
Definition: UnitDefines.h:210
@ UNIT_STATE_ROOT
Definition: UnitDefines.h:159
@ UNIT_STATE_STUNNED
Definition: UnitDefines.h:152
@ UNIT_FLAG_DISABLE_MOVE
Definition: UnitDefines.h:231
@ CONFIG_INSTANT_TAXI
Definition: IWorld.h:386
@ ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN
Definition: DBCEnums.h:215
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING
Definition: DBCEnums.h:176
@ CLASS_DEATH_KNIGHT
Definition: SharedDefines.h:146
@ ERR_TAXIPLAYERBUSY
Definition: SharedDefines.h:3602
@ ERR_TAXIOK
Definition: SharedDefines.h:3595
@ ERR_TAXINOSUCHPATH
Definition: SharedDefines.h:3597
@ ERR_TAXIUNSPECIFIEDSERVERERROR
Definition: SharedDefines.h:3596
@ ERR_TAXIPLAYERSHAPESHIFTED
Definition: SharedDefines.h:3604
@ ERR_TAXIPLAYERALREADYMOUNTED
Definition: SharedDefines.h:3603
@ ERR_TAXINOTENOUGHMONEY
Definition: SharedDefines.h:3598
TeamId GetTeamId(bool original=false) const
Definition: Player.h:2085
float GetReputationPriceDiscount(Creature const *creature) const
Definition: Player.cpp:12289
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition: Player.cpp:1330
void TradeCancel(bool sendback)
Definition: PlayerStorage.cpp:4103
void StopCastingCharm(Aura *except=nullptr)
Definition: Player.cpp:9251
void StopCastingBindSight(Aura *except=nullptr)
Definition: Player.cpp:13104
void AddTaxiDestination(uint32 dest)
Definition: PlayerTaxi.h:62
void SetFlightMasterFactionTemplateId(uint32 factionTemplateId)
Definition: PlayerTaxi.h:75
void ClearTaxiDestinations()
Definition: PlayerTaxi.h:61
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4027
void CombatStop(bool includingCast=false)
Definition: Unit.cpp:10381
bool IsInDisallowedMountForm() const
Definition: Unit.cpp:21159
bool HasUnitFlag(UnitFlags flags) const
Definition: Unit.h:825
bool IsMounted() const
Definition: Unit.h:887
bool HasUnitState(const uint32 f) const
Definition: Unit.h:739
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition: Unit.cpp:5064
bool IsInCombat() const
Definition: Unit.h:1032
void ExitVehicle(Position const *exitPosition=nullptr)
Definition: Unit.cpp:19653
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition: Unit.h:1404
void SendActivateTaxiReply(ActivateTaxiReply reply)
Definition: TaxiHandler.cpp:280
void SendDoFlight(uint32 mountDisplayId, uint32 path, uint32 pathNode=0)
Definition: TaxiHandler.cpp:110
Definition: Spell.h:284
Definition: DBCStructure.h:1953
float z
Definition: DBCStructure.h:1958
uint32 map_id
Definition: DBCStructure.h:1955
float x
Definition: DBCStructure.h:1956
float y
Definition: DBCStructure.h:1957

References ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, PlayerTaxi::AddTaxiDestination(), CLASS_CONTEXT_TAXI, CLASS_DEATH_KNIGHT, PlayerTaxi::ClearTaxiDestinations(), Unit::CombatStop(), CONFIG_INSTANT_TAXI, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, ERR_TAXINOSUCHPATH, ERR_TAXINOTENOUGHMONEY, ERR_TAXIOK, ERR_TAXIPLAYERALREADYMOUNTED, ERR_TAXIPLAYERBUSY, ERR_TAXIPLAYERSHAPESHIFTED, ERR_TAXIUNSPECIFIEDSERVERERROR, Unit::ExitVehicle(), Unit::GetCurrentSpell(), GetMoney(), Position::GetOrientation(), GetReputationPriceDiscount(), GetSession(), GetTeamId(), Unit::HasUnitFlag(), Unit::HasUnitState(), Unit::InterruptSpell(), IsClass(), Unit::IsInCombat(), Unit::IsInDisallowedMountForm(), Unit::IsMounted(), Unit::IsNonMeleeSpellCast(), m_flightSpellActivated, m_isInstantFlightOn, m_taxi, TaxiNodesEntry::map_id, ModifyMoney(), Unit::RemoveAurasByType(), WorldSession::SendActivateTaxiReply(), WorldSession::SendDoFlight(), PlayerTaxi::SetFlightMasterFactionTemplateId(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sTaxiNodesStore, StopCastingBindSight(), StopCastingCharm(), sWorld, TeleportTo(), TradeCancel(), UNIT_FLAG_DISABLE_MOVE, UNIT_STATE_ROOT, UNIT_STATE_STUNNED, UpdateAchievementCriteria(), TaxiNodesEntry::x, TaxiNodesEntry::y, and TaxiNodesEntry::z.

Referenced by ActivateTaxiPathTo(), WorldSession::HandleActivateTaxiExpressOpcode(), WorldSession::HandleActivateTaxiOpcode(), Aura::HandleAuraSpecificMods(), OPvPCapturePointNA::HandleCustomSpell(), npc_taxi::OnGossipSelect(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), and npc_karynaku::OnQuestAccept().

◆ ActivateTaxiPathTo() [2/2]

bool Player::ActivateTaxiPathTo ( uint32  taxi_path_id,
uint32  spellid = 1 
)
10370{
10371 TaxiPathEntry const* entry = sTaxiPathStore.LookupEntry(taxi_path_id);
10372 if (!entry)
10373 return false;
10374
10375 std::vector<uint32> nodes;
10376
10377 nodes.resize(2);
10378 nodes[0] = entry->from;
10379 nodes[1] = entry->to;
10380
10381 return ActivateTaxiPathTo(nodes, nullptr, spellid);
10382}
DBCStorage< TaxiPathEntry > sTaxiPathStore(TaxiPathEntryfmt)
bool ActivateTaxiPathTo(std::vector< uint32 > const &nodes, Creature *npc=nullptr, uint32 spellid=1)
Definition: Player.cpp:10187
Definition: DBCStructure.h:1965
uint32 to
Definition: DBCStructure.h:1968
uint32 from
Definition: DBCStructure.h:1967

References ActivateTaxiPathTo(), TaxiPathEntry::from, sTaxiPathStore, and TaxiPathEntry::to.

◆ addActionButton()

ActionButton * Player::addActionButton ( uint8  button,
uint32  action,
uint8  type 
)
5567{
5568 if (!IsActionButtonDataValid(button, action, type))
5569 return nullptr;
5570
5571 // it create new button (NEW state) if need or return existed
5572 ActionButton& ab = m_actionButtons[button];
5573
5574 // set data and update to CHANGED if not NEW
5575 ab.SetActionAndType(action, ActionButtonType(type));
5576
5577 LOG_DEBUG("entities.player", "Player {} Added Action {} (type {}) to Button {}", GetGUID().ToString(), action, type, button);
5578 return &ab;
5579}
ActionButtonType
Definition: Player.h:228
void SetActionAndType(uint32 action, ActionButtonType type)
Definition: Player.h:262
bool IsActionButtonDataValid(uint8 button, uint32 action, uint8 type)
Definition: Player.cpp:5523

References Object::GetGUID(), IsActionButtonDataValid(), LOG_DEBUG, m_actionButtons, ActionButton::SetActionAndType(), and Position::ToString().

Referenced by _LoadActions(), Create(), and WorldSession::HandleSetActionButtonOpcode().

◆ AddArmorProficiency()

void Player::AddArmorProficiency ( uint32  newflag)
inline
1351{ m_ArmorProficiency |= newflag; }

References m_ArmorProficiency.

Referenced by Spell::EffectProficiency().

◆ AddBattlegroundQueueId()

uint32 Player::AddBattlegroundQueueId ( BattlegroundQueueTypeId  val)
12198{
12199 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12200 {
12201 if (_BgBattlegroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE || _BgBattlegroundQueueID[i].bgQueueTypeId == val)
12202 {
12203 _BgBattlegroundQueueID[i].bgQueueTypeId = val;
12204 _BgBattlegroundQueueID[i].invitedToInstance = 0;
12205 return i;
12206 }
12207 }
12208
12210}

References _BgBattlegroundQueueID, BATTLEGROUND_QUEUE_NONE, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by WorldSession::HandleBattlemasterJoinArena(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ AddEnchantmentDuration()

void Player::AddEnchantmentDuration ( Item item,
EnchantmentSlot  slot,
uint32  duration 
)
4290{
4291 if (!item)
4292 return;
4293
4294 if (slot >= MAX_ENCHANTMENT_SLOT)
4295 return;
4296
4297 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4298 {
4299 if (itr->item == item && itr->slot == slot)
4300 {
4301 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
4302 m_enchantDuration.erase(itr);
4303 break;
4304 }
4305 }
4306 if (item && duration > 0)
4307 {
4308 GetSession()->SendItemEnchantTimeUpdate(GetGUID(), item->GetGUID(), slot, uint32(duration / 1000));
4309 m_enchantDuration.push_back(EnchantDuration(item, slot, duration));
4310 }
4311}
@ MAX_ENCHANTMENT_SLOT
Definition: Item.h:183
Definition: Player.h:441
void SendItemEnchantTimeUpdate(ObjectGuid Playerguid, ObjectGuid Itemguid, uint32 slot, uint32 Duration)
Definition: ItemHandler.cpp:1233

References Object::GetGUID(), GetSession(), m_enchantDuration, MAX_ENCHANTMENT_SLOT, and WorldSession::SendItemEnchantTimeUpdate().

Referenced by AddEnchantmentDurations(), and ApplyEnchantment().

◆ AddEnchantmentDurations()

void Player::AddEnchantmentDurations ( Item item)
4202{
4203 for (int x = 0; x < MAX_ENCHANTMENT_SLOT; ++x)
4204 {
4205 if (!item->GetEnchantmentId(EnchantmentSlot(x)))
4206 continue;
4207
4208 uint32 duration = item->GetEnchantmentDuration(EnchantmentSlot(x));
4209 if (duration > 0)
4210 AddEnchantmentDuration(item, EnchantmentSlot(x), duration);
4211 }
4212}
EnchantmentSlot
Definition: Item.h:168
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition: Item.h:304
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
Definition: Item.h:305
void AddEnchantmentDuration(Item *item, EnchantmentSlot slot, uint32 duration)
Definition: PlayerStorage.cpp:4289

References AddEnchantmentDuration(), Item::GetEnchantmentDuration(), Item::GetEnchantmentId(), and MAX_ENCHANTMENT_SLOT.

Referenced by _StoreItem(), EquipItem(), and QuickEquipItem().

◆ AddInstanceEnterTime()

void Player::AddInstanceEnterTime ( uint32  instanceId,
time_t  enterTime 
)
inline
2428 {
2429 if (_instanceResetTimes.find(instanceId) == _instanceResetTimes.end())
2430 _instanceResetTimes.insert(InstanceTimeMap::value_type(instanceId, enterTime + HOUR));
2431 }

References _instanceResetTimes, and HOUR.

Referenced by InstanceMap::AddPlayerToMap().

◆ AddItem()

bool Player::AddItem ( uint32  itemId,
uint32  count 
)
15511{
15512 uint32 noSpaceForCount = 0;
15513 ItemPosCountVec dest;
15514 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount);
15515 if (msg != EQUIP_ERR_OK)
15516 count -= noSpaceForCount;
15517
15518 if (count == 0 || dest.empty())
15519 {
15520 // -- TODO: Send to mailbox if no space
15521 ChatHandler(GetSession()).PSendSysMessage("You don't have any space in your bags.");
15522 return false;
15523 }
15524
15525 Item* item = StoreNewItem(dest, itemId, true);
15526 if (item)
15527 SendNewItem(item, count, true, false);
15528 else
15529 return false;
15530 return true;
15531}
@ NULL_BAG
Definition: Item.h:40
Definition: Chat.h:39
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:213

References CanStoreNewItem(), EQUIP_ERR_OK, GetSession(), NULL_BAG, NULL_SLOT, ChatHandler::PSendSysMessage(), SendNewItem(), and StoreNewItem().

Referenced by spell_brewfest_fill_keg::HandleAfterHit(), spell_brewfest_unfill_keg::HandleAfterHit(), spell_q9452_cast_net::HandleDummy(), spell_catch_the_wild_wolpertinger::HandleEffectApply(), RewardHonor(), and npc_tharnarian::npc_tharnarianAI::sGossipSelect().

◆ AddItemDurations()

void Player::AddItemDurations ( Item item)
12408{
12410 {
12411 m_itemDuration.push_back(item);
12412 item->SendTimeUpdate(this);
12413 }
12414}
@ ITEM_FIELD_DURATION
Definition: UpdateFields.h:40
void SendTimeUpdate(Player *owner)
Definition: Item.cpp:1076
ItemDurationList m_itemDuration
Definition: Player.h:2800

References Object::GetUInt32Value(), ITEM_FIELD_DURATION, m_itemDuration, and Item::SendTimeUpdate().

Referenced by _StoreItem(), EquipItem(), and QuickEquipItem().

◆ AddItemToBuyBackSlot()

void Player::AddItemToBuyBackSlot ( Item pItem,
uint32  money 
)
3952{
3953 if (pItem)
3954 {
3956 // if current back slot non-empty search oldest or free
3957 if (m_items[slot])
3958 {
3960 uint32 oldest_slot = BUYBACK_SLOT_START;
3961
3962 for (uint32 i = BUYBACK_SLOT_START + 1; i < BUYBACK_SLOT_END; ++i)
3963 {
3964 // found empty
3965 if (!m_items[i])
3966 {
3967 slot = i;
3968 break;
3969 }
3970
3972
3973 if (oldest_time > i_time)
3974 {
3975 oldest_time = i_time;
3976 oldest_slot = i;
3977 }
3978 }
3979
3980 // find oldest
3981 slot = oldest_slot;
3982 }
3983
3984 RemoveItemFromBuyBackSlot(slot, true);
3985 LOG_DEBUG("entities.player.items", "STORAGE: AddItemToBuyBackSlot item = {}, slot = {}", pItem->GetEntry(), slot);
3986
3987 m_items[slot] = pItem;
3988 time_t base = GameTime::GetGameTime().count();
3989 uint32 etime = uint32(base - m_logintime + (30 * 3600));
3990 uint32 eslot = slot - BUYBACK_SLOT_START;
3991
3995
3996 // move to next (for non filled list is move most optimized choice)
3999 }
4000}
@ PLAYER_FIELD_BUYBACK_PRICE_1
Definition: UpdateFields.h:372
@ PLAYER_FIELD_VENDORBUYBACK_SLOT_1
Definition: UpdateFields.h:331
@ PLAYER_FIELD_BUYBACK_TIMESTAMP_1
Definition: UpdateFields.h:373
void RemoveItemFromBuyBackSlot(uint32 slot, bool del)
Definition: PlayerStorage.cpp:4010

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, Object::GetEntry(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetUInt32Value(), LOG_DEBUG, m_currentBuybackSlot, m_items, m_logintime, PLAYER_FIELD_BUYBACK_PRICE_1, PLAYER_FIELD_BUYBACK_TIMESTAMP_1, PLAYER_FIELD_VENDORBUYBACK_SLOT_1, RemoveItemFromBuyBackSlot(), Object::SetGuidValue(), and Unit::SetUInt32Value().

Referenced by WorldSession::HandleSellItemOpcode().

◆ AdditionalSavingAddMask()

◆ AddKnownCurrency()

void Player::AddKnownCurrency ( uint32  itemId)
private
14161{
14162 if (CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(itemId))
14163 SetFlag64(PLAYER_FIELD_KNOWN_CURRENCIES, (1LL << (ctEntry->BitIndex - 1)));
14164}
DBCStorage< CurrencyTypesEntry > sCurrencyTypesStore(CurrencyTypesfmt)
void SetFlag64(uint16 index, uint64 newFlag)
Definition: Object.cpp:956
Definition: DBCStructure.h:835

References PLAYER_FIELD_KNOWN_CURRENCIES, sCurrencyTypesStore, and Object::SetFlag64().

Referenced by _StoreItem(), SetArenaPoints(), and SetHonorPoints().

◆ AddMail()

void Player::AddMail ( Mail mail)
inline
1633{ m_mail.push_front(mail); }// for call from WorldSession::SendMailTo

References m_mail.

Referenced by MailDraft::SendMailTo().

◆ AddMItem()

void Player::AddMItem ( Item it)
inline
1659 {
1660 ASSERT(it);
1661 //ASSERT deleted, because items can be added before loading
1662 mMitems[it->GetGUID().GetCounter()] = it;
1663 }

References ASSERT, ObjectGuid::GetCounter(), Object::GetGUID(), and mMitems.

Referenced by _LoadMailedItem(), and MailDraft::SendMailTo().

◆ AddNewMailDeliverTime()

void Player::AddNewMailDeliverTime ( time_t  deliver_time)
2878{
2879 if (deliver_time <= GameTime::GetGameTime().count()) // ready now
2880 {
2881 ++unReadMails;
2882 SendNewMail();
2883 }
2884 else // not ready and no have ready mails
2885 {
2886 if (!m_nextMailDelivereTime || m_nextMailDelivereTime > deliver_time)
2887 m_nextMailDelivereTime = deliver_time;
2888 }
2889}
void SendNewMail()
Definition: Player.cpp:2869

References GameTime::GetGameTime(), m_nextMailDelivereTime, SendNewMail(), and unReadMails.

Referenced by MailDraft::SendMailTo().

◆ AddQuest()

void Player::AddQuest ( Quest const *  quest,
Object questGiver 
)
507{
508 uint16 log_slot = FindQuestSlot(0);
509
510 if (log_slot >= MAX_QUEST_LOG_SIZE) // Player does not have any free slot in the quest log
511 return;
512
513 uint32 quest_id = quest->GetQuestId();
514
515 // if not exist then created with set uState == NEW and rewarded=false
516 QuestStatusData& questStatusData = m_QuestStatus[quest_id];
517
518 // check for repeatable quests status reset
519 questStatusData.Status = QUEST_STATUS_INCOMPLETE;
520 questStatusData.Explored = false;
521
522 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
523 {
524 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
525 questStatusData.ItemCount[i] = 0;
526 }
527
529 {
530 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
531 questStatusData.CreatureOrGOCount[i] = 0;
532 }
533
534 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL))
535 questStatusData.PlayerCount = 0;
536
537 GiveQuestSourceItem(quest);
538 AdjustQuestReqItemCount(quest, questStatusData);
539
540 if (quest->GetRepObjectiveFaction())
541 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->GetRepObjectiveFaction()))
542 GetReputationMgr().SetVisible(factionEntry);
543
544 if (quest->GetRepObjectiveFaction2())
545 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->GetRepObjectiveFaction2()))
546 GetReputationMgr().SetVisible(factionEntry);
547
548 uint32 qtime = 0;
549 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
550 {
551 uint32 timeAllowed = quest->GetTimeAllowed();
552
553 // shared timed quest
554 if (questGiver && questGiver->IsPlayer())
555 timeAllowed = questGiver->ToPlayer()->getQuestStatusMap()[quest_id].Timer / IN_MILLISECONDS;
556
557 AddTimedQuest(quest_id);
558 questStatusData.Timer = timeAllowed * IN_MILLISECONDS;
559 qtime = static_cast<uint32>(GameTime::GetGameTime().count()) + timeAllowed;
560 }
561 else
562 questStatusData.Timer = 0;
563
564 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
565 {
566 pvpInfo.IsHostile = true;
568 }
569
570 SetQuestSlot(log_slot, quest_id, qtime);
571
572 m_QuestStatusSave[quest_id] = true;
573
575
576 SendQuestUpdate(quest_id);
577
578 // check if Quest Tracker is enabled
579 if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
580 {
581 // prepare Quest Tracker datas
582 auto stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_QUEST_TRACK);
583 stmt->SetData(0, quest_id);
584 stmt->SetData(1, GetGUID().GetCounter());
585 stmt->SetData(2, GitRevision::GetHash());
586 stmt->SetData(3, GitRevision::GetDate());
587
588 // add to Quest Tracker
589 CharacterDatabase.Execute(stmt);
590 }
591
592 // Xinef: area auras may change on quest accept!
595}
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ QUEST_FLAGS_FLAGS_PVP
Definition: QuestDef.h:145
@ QUEST_SPECIAL_FLAGS_CAST
Definition: QuestDef.h:165
@ QUEST_SPECIAL_FLAGS_DELIVER
Definition: QuestDef.h:174
@ QUEST_SPECIAL_FLAGS_KILL
Definition: QuestDef.h:176
@ QUEST_SPECIAL_FLAGS_SPEAKTO
Definition: QuestDef.h:175
@ QUEST_SPECIAL_FLAGS_PLAYER_KILL
Definition: QuestDef.h:178
@ CONFIG_QUEST_ENABLE_QUEST_TRACKER
Definition: IWorld.h:152
@ CHAR_INS_QUEST_TRACK
Definition: CharacterDatabase.h:501
@ ACHIEVEMENT_TIMED_TYPE_QUEST
Definition: DBCEnums.h:111
AC_COMMON_API char const * GetDate()
Definition: GitRevision.cpp:26
AC_COMMON_API char const * GetHash()
Definition: GitRevision.cpp:21
bool IsPlayer() const
Definition: Object.h:197
Player * ToPlayer()
Definition: Object.h:198
uint32 GetAreaId() const
Definition: Object.cpp:3149
bool IsHostile
Definition: Player.h:360
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
Definition: Player.cpp:13869
QuestStatusMap & getQuestStatusMap()
Definition: Player.h:1611
uint16 FindQuestSlot(uint32 quest_id) const
Definition: PlayerQuest.cpp:1776
void UpdatePvPState()
Definition: PlayerUpdates.cpp:1390
void UpdateAreaDependentAuras(uint32 area_id)
Definition: PlayerUpdates.cpp:1817
void SendQuestUpdate(uint32 questId)
Definition: PlayerQuest.cpp:1520
void AdjustQuestReqItemCount(Quest const *quest, QuestStatusData &questStatusData)
Definition: PlayerQuest.cpp:1758
PvPInfo pvpInfo
Definition: Player.h:1824
void UpdateZoneDependentAuras(uint32 zone_id)
Definition: PlayerUpdates.cpp:1803
bool GiveQuestSourceItem(Quest const *quest)
Definition: PlayerQuest.cpp:1329
ReputationMgr & GetReputationMgr()
Definition: Player.h:2102
void SetVisible(FactionTemplateEntry const *factionTemplateEntry)
Definition: ReputationMgr.cpp:458
Definition: DBCStructure.h:907

References ACHIEVEMENT_TIMED_TYPE_QUEST, AddTimedQuest(), AdjustQuestReqItemCount(), CHAR_INS_QUEST_TRACK, CharacterDatabase, CONFIG_QUEST_ENABLE_QUEST_TRACKER, QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, FindQuestSlot(), WorldObject::GetAreaId(), GitRevision::GetDate(), GameTime::GetGameTime(), Object::GetGUID(), GitRevision::GetHash(), Quest::GetQuestId(), getQuestStatusMap(), Quest::GetRepObjectiveFaction(), Quest::GetRepObjectiveFaction2(), GetReputationMgr(), Quest::GetTimeAllowed(), WorldObject::GetZoneId(), GiveQuestSourceItem(), Quest::HasFlag(), Quest::HasSpecialFlag(), IN_MILLISECONDS, PvPInfo::IsHostile, Object::IsPlayer(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QuestStatusData::PlayerCount, pvpInfo, QUEST_FLAGS_FLAGS_PVP, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATUS_INCOMPLETE, SendQuestUpdate(), SetQuestSlot(), ReputationMgr::SetVisible(), sFactionStore, StartTimedAchievement(), QuestStatusData::Status, sWorld, QuestStatusData::Timer, Object::ToPlayer(), UpdateAreaDependentAuras(), UpdatePvPState(), and UpdateZoneDependentAuras().

Referenced by AddQuestAndCheckCompletion().

◆ AddQuestAndCheckCompletion()

void Player::AddQuestAndCheckCompletion ( Quest const *  quest,
Object questGiver 
)
421{
422 AddQuest(quest, questGiver);
423
424 if (CanCompleteQuest(quest->GetQuestId()))
425 CompleteQuest(quest->GetQuestId());
426
427 if (!questGiver)
428 return;
429
430 switch (questGiver->GetTypeId())
431 {
432 case TYPEID_UNIT:
433 sScriptMgr->OnQuestAccept(this, questGiver->ToCreature(), quest);
434 questGiver->ToCreature()->AI()->sQuestAccept(this, quest);
435 break;
436 case TYPEID_ITEM:
437 case TYPEID_CONTAINER:
438 {
439 Item* item = (Item*)questGiver;
440 sScriptMgr->OnQuestAccept(this, item, quest);
441
442 // destroy not required for quest finish quest starting item
443 bool destroyItem = true;
444 for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
445 {
446 if (quest->RequiredItemId[i] == item->GetEntry() && item->GetTemplate()->MaxCount > 0)
447 {
448 destroyItem = false;
449 break;
450 }
451 }
452
453 if (destroyItem)
454 DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
455
456 break;
457 }
459 sScriptMgr->OnQuestAccept(this, questGiver->ToGameObject(), quest);
460 questGiver->ToGameObject()->AI()->QuestAccept(this, quest);
461 break;
462 default:
463 break;
464 }
465}
@ TYPEID_GAMEOBJECT
Definition: ObjectGuid.h:37
@ TYPEID_UNIT
Definition: ObjectGuid.h:35
@ TYPEID_ITEM
Definition: ObjectGuid.h:33
@ TYPEID_CONTAINER
Definition: ObjectGuid.h:34
virtual bool QuestAccept(Player *, Quest const *)
Definition: GameObjectAI.h:58
virtual void sQuestAccept(Player *, Quest const *)
Definition: UnitAI.h:416
CreatureAI * AI() const
Definition: Creature.h:143
GameObjectAI * AI() const
Definition: GameObject.h:307
int32 MaxCount
Definition: ItemTemplate.h:644
TypeID GetTypeId() const
Definition: Object.h:124
GameObject * ToGameObject()
Definition: Object.h:210
Creature * ToCreature()
Definition: Object.h:202
void AddQuest(Quest const *quest, Object *questGiver)
Definition: PlayerQuest.cpp:506
void CompleteQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:597
void DestroyItem(uint8 bag, uint8 slot, bool update)
Definition: PlayerStorage.cpp:3038
bool CanCompleteQuest(uint32 quest_id, const QuestStatusData *q_savedStatus=nullptr)
Definition: PlayerQuest.cpp:288

References AddQuest(), Creature::AI(), GameObject::AI(), CanCompleteQuest(), CompleteQuest(), DestroyItem(), Item::GetBagSlot(), Object::GetEntry(), Quest::GetQuestId(), Item::GetSlot(), Item::GetTemplate(), Object::GetTypeId(), ItemTemplate::MaxCount, QUEST_ITEM_OBJECTIVES_COUNT, GameObjectAI::QuestAccept(), Quest::RequiredItemId, UnitAI::sQuestAccept(), sScriptMgr, Object::ToCreature(), Object::ToGameObject(), TYPEID_CONTAINER, TYPEID_GAMEOBJECT, TYPEID_ITEM, and TYPEID_UNIT.

Referenced by Spell::EffectQuestStart(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), and SendPreparedQuest().

◆ AddReceivedSpectatorResetFor()

void Player::AddReceivedSpectatorResetFor ( ObjectGuid  guid)
inline
2562{ m_receivedSpectatorResetFor.insert(guid); }
GuidSet m_receivedSpectatorResetFor
Definition: Player.h:2566

References m_receivedSpectatorResetFor.

Referenced by ArenaSpectator::HandleResetCommand().

◆ AddRefundReference()

void Player::AddRefundReference ( ObjectGuid  itemGUID)
15459{
15460 m_refundableItems.insert(itemGUID);
15461}

References m_refundableItems.

Referenced by _LoadItem(), and _StoreOrEquipNewItem().

◆ AddRuneByAuraEffect()

void Player::AddRuneByAuraEffect ( uint8  index,
RuneType  newType,
AuraEffect const *  aura 
)
inline
2496{ SetRuneConvertAura(index, aura); ConvertRune(index, newType); }
void ConvertRune(uint8 index, RuneType newType)
Definition: Player.cpp:13365
void SetRuneConvertAura(uint8 index, AuraEffect const *aura)
Definition: Player.h:2495

References ConvertRune(), and SetRuneConvertAura().

Referenced by AuraEffect::HandleAuraConvertRune().

◆ AddRunePower()

void Player::AddRunePower ( uint8  index)
13388{
13390 data << uint32(1 << index); // mask (0x00-0x3F probably)
13391 GetSession()->SendPacket(&data);
13392}
@ SMSG_ADD_RUNE_POWER
Definition: Opcodes.h:1190

References GetSession(), WorldSession::SendPacket(), and SMSG_ADD_RUNE_POWER.

◆ addSpell()

bool Player::addSpell ( uint32  spellId,
uint8  addSpecMask,
bool  updateActive,
bool  temporary = false,
bool  learnFromSkill = false 
)
3037{
3038 if (!_addSpell(spellId, addSpecMask, temporary, learnFromSkill))
3039 return false;
3040
3041 if (!updateActive)
3042 return true;
3043
3044 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); // must exist, checked in _addSpell
3045
3046 // pussywizard: now update active state for all ranks of this spell! and send packet to swap on action bar
3047 // pussywizard: assumption - it's in all specs, can't be a talent
3048 if (!spellInfo->IsStackableWithRanks() && spellInfo->IsRanked())
3049 {
3050 SpellInfo const* nextSpellInfo = sSpellMgr->GetSpellInfo(sSpellMgr->GetFirstSpellInChain(spellInfo->Id));
3051 while (nextSpellInfo)
3052 {
3053 PlayerSpellMap::iterator itr = m_spells.find(nextSpellInfo->Id);
3054 if (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->Active)
3055 {
3056 if (nextSpellInfo->GetRank() < spellInfo->GetRank())
3057 {
3058 itr->second->Active = false;
3059 if (IsInWorld())
3060 {
3062 data << uint32(nextSpellInfo->Id);
3063 data << uint32(spellInfo->Id);
3064 GetSession()->SendPacket(&data);
3065 }
3066 return false;
3067 }
3068 else if (nextSpellInfo->GetRank() > spellInfo->GetRank())
3069 {
3070 PlayerSpellMap::iterator itr2 = m_spells.find(spellInfo->Id);
3071 if (itr2 != m_spells.end())
3072 itr2->second->Active = false;
3073 return false;
3074 }
3075 }
3076 nextSpellInfo = nextSpellInfo->GetNextRankSpell();
3077 }
3078 }
3079
3080 return true;
3081}
@ SMSG_SUPERCEDED_SPELL
Definition: Opcodes.h:330
uint8 GetRank() const
Definition: SpellInfo.cpp:2493
bool IsRanked() const
Definition: SpellInfo.cpp:2488
bool IsStackableWithRanks() const
Definition: SpellInfo.cpp:1144
SpellInfo const * GetNextRankSpell() const
Definition: SpellInfo.cpp:2512

References _addSpell(), SpellInfo::GetNextRankSpell(), SpellInfo::GetRank(), GetSession(), SpellInfo::Id, Object::IsInWorld(), SpellInfo::IsRanked(), SpellInfo::IsStackableWithRanks(), m_spells, PLAYERSPELL_REMOVED, WorldSession::SendPacket(), SMSG_SUPERCEDED_SPELL, and sSpellMgr.

Referenced by _LoadSpells(), LearnCustomSpells(), learnSkillRewardedSpells(), and learnSpell().

◆ AddSpellAndCategoryCooldowns()

void Player::AddSpellAndCategoryCooldowns ( SpellInfo const *  spellInfo,
uint32  itemId,
Spell spell = nullptr,
bool  infinityCooldown = false 
)
10865{
10866 // init cooldown values
10867 uint32 cat = 0;
10868 int32 rec = -1;
10869 int32 catrec = -1;
10870
10871 // some special item spells without correct cooldown in SpellInfo
10872 // cooldown information stored in item prototype
10873 // This used in same way in WorldSession::HandleItemQuerySingleOpcode data sending to client.
10874
10875 if (itemId)
10876 {
10877 if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))
10878 {
10879 for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
10880 {
10881 if (uint32(proto->Spells[idx].SpellId) == spellInfo->Id)
10882 {
10883 cat = proto->Spells[idx].SpellCategory;
10884 rec = proto->Spells[idx].SpellCooldown;
10885 catrec = proto->Spells[idx].SpellCategoryCooldown;
10886 break;
10887 }
10888 }
10889 }
10890 }
10891
10892 // if no cooldown found above then base at DBC data
10893 if (rec < 0 && catrec < 0)
10894 {
10895 cat = spellInfo->GetCategory();
10896 rec = spellInfo->RecoveryTime;
10897 catrec = spellInfo->CategoryRecoveryTime;
10898 }
10899
10900 time_t catrecTime;
10901 time_t recTime;
10902
10903 bool needsCooldownPacket = false;
10904
10905 // overwrite time for selected category
10906 if (infinityCooldown)
10907 {
10908 // use +MONTH as infinity mark for spell cooldown (will checked as MONTH/2 at save ans skipped)
10909 // but not allow ignore until reset or re-login
10910 catrecTime = catrec > 0 ? infinityCooldownDelay : 0;
10911 recTime = rec > 0 ? infinityCooldownDelay : catrecTime;
10912 }
10913 else
10914 {
10915 // shoot spells used equipped item cooldown values already assigned in GetAttackTime(RANGED_ATTACK)
10916 // prevent 0 cooldowns set by another way
10917 if (rec <= 0 && catrec <= 0 && (cat == 76 || (spellInfo->IsAutoRepeatRangedSpell() && spellInfo->Id != 75)))
10919
10920 // Now we have cooldown data (if found any), time to apply mods
10921 if (rec > 0)
10922 ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, rec, spell);
10923
10924 if (catrec > 0 && !spellInfo->HasAttribute(SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS))
10925 {
10926 ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, catrec, spell);
10927 }
10928
10930 {
10931 // Apply SPELL_AURA_MOD_COOLDOWN only to own spells
10932 if (HasSpell(spellInfo->Id))
10933 {
10934 needsCooldownPacket = true;
10935 rec += cooldownMod * IN_MILLISECONDS; // SPELL_AURA_MOD_COOLDOWN does not affect category cooldows, verified with shaman shocks
10936 }
10937 }
10938
10939 // replace negative cooldowns by 0
10940 if (rec < 0) rec = 0;
10941 if (catrec < 0) catrec = 0;
10942
10943 // no cooldown after applying spell mods
10944 if (rec == 0 && catrec == 0)
10945 return;
10946
10947 catrecTime = catrec ? catrec : 0;
10948 recTime = rec ? rec : catrecTime;
10949 }
10950
10951 // category spells
10952 if (cat && catrec > 0)
10953 {
10954 _AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
10955 if (needsCooldownPacket)
10956 {
10957 WorldPacket data;
10958 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, recTime);
10959 SendDirectMessage(&data);
10960 }
10961
10962 PacketCooldowns forcedCategoryCooldowns;
10963
10964 SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat);
10965 if (i_scstore != sSpellsByCategoryStore.end())
10966 {
10967 for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset)
10968 {
10969 if (i_scset->second == spellInfo->Id) // skip main spell, already handled above
10970 {
10971 continue;
10972 }
10973
10974 // If spell category is applied by item, then other spells should be exists in item templates
10975 if ((itemId > 0) != i_scset->first)
10976 {
10977 continue;
10978 }
10979
10980 // Only within the same spellfamily
10981 SpellInfo const* categorySpellInfo = sSpellMgr->GetSpellInfo(i_scset->second);
10982 if (!categorySpellInfo || categorySpellInfo->SpellFamilyName != spellInfo->SpellFamilyName)
10983 {
10984 continue;
10985 }
10986
10987 _AddSpellCooldown(i_scset->second, cat, itemId, catrecTime, !spellInfo->IsCooldownStartedOnEvent() && catrec && rec && catrec != rec);
10988
10989 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS))
10990 {
10991 forcedCategoryCooldowns[i_scset->second] = catrecTime;
10992 }
10993 }
10994 }
10995
10996 if (!forcedCategoryCooldowns.empty())
10997 {
10998 WorldPacket data;
10999 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, forcedCategoryCooldowns);
11000 SendDirectMessage(&data);
11001 }
11002 }
11003 else
11004 {
11005 // self spell cooldown
11006 if (recTime > 0)
11007 {
11008 _AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
11009
11010 if (needsCooldownPacket)
11011 {
11012 WorldPacket data;
11013 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, rec);
11014 SendDirectMessage(&data);
11015 }
11016 }
11017 }
11018}
SpellCategoryStore sSpellsByCategoryStore
Definition: DBCStores.cpp:152
@ SPELLMOD_COOLDOWN
Definition: SpellDefines.h:88
@ SPELL_AURA_MOD_COOLDOWN
Definition: SpellAuraDefines.h:259
@ SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS
Definition: SpellInfo.h:204
#define MAX_ITEM_SPELLS
Definition: Item.h:215
static constexpr uint32 infinityCooldownDelay
Definition: Unit.h:46
@ SPELL_COOLDOWN_FLAG_NONE
Definition: Unit.h:616
std::unordered_map< uint32, uint32 > PacketCooldowns
Definition: Unit.h:621
@ SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS
Definition: SharedDefines.h:635
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:5649
void ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell *spell=nullptr, bool temporaryPet=false)
Definition: Player.cpp:9686
void BuildCooldownPacket(WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
Definition: Unit.cpp:20899
uint32 GetAttackTime(WeaponAttackType att) const
Definition: Unit.h:812
int32 GetTotalAuraModifier(AuraType auratype) const
Definition: Unit.cpp:5864
uint32 SpellFamilyName
Definition: SpellInfo.h:387

References _AddSpellCooldown(), ApplySpellMod(), Unit::BuildCooldownPacket(), SpellInfo::CategoryRecoveryTime, Unit::GetAttackTime(), SpellInfo::GetCategory(), Unit::GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasSpell(), SpellInfo::Id, IN_MILLISECONDS, infinityCooldownDelay, SpellInfo::IsAutoRepeatRangedSpell(), SpellInfo::IsCooldownStartedOnEvent(), MAX_ITEM_SPELLS, RANGED_ATTACK, SpellInfo::RecoveryTime, SendDirectMessage(), sObjectMgr, SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS, SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS, SPELL_AURA_MOD_COOLDOWN, SPELL_COOLDOWN_FLAG_NONE, SpellInfo::SpellFamilyName, SPELLMOD_COOLDOWN, sSpellMgr, and sSpellsByCategoryStore.

Referenced by Aura::_ApplyForTarget(), Unit::AddGameObject(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), SendCooldownEvent(), Spell::SendSpellCooldown(), and Unit::SetMinion().

◆ AddSpellCooldown()

void Player::AddSpellCooldown ( uint32  spell_id,
uint32  itemid,
uint32  end_time,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
overridevirtual

◆ AddSpellMod()

void Player::AddSpellMod ( SpellModifier mod,
bool  apply 
)
9845{
9846 LOG_DEBUG("spells.aura", "Player::AddSpellMod {}", mod->spellId);
9848
9849 int i = 0;
9850 flag96 _mask = 0;
9851 for (int eff = 0; eff < 96; ++eff)
9852 {
9853 if (eff != 0 && eff % 32 == 0)
9854 _mask[i++] = 0;
9855
9856 _mask[i] = uint32(1) << (eff - (32 * i));
9857 if (mod->mask & _mask)
9858 {
9859 int32 val = 0;
9860 for (SpellModList::iterator itr = m_spellMods[mod->op].begin(); itr != m_spellMods[mod->op].end(); ++itr)
9861 {
9862 if ((*itr)->type == mod->type && (*itr)->mask & _mask)
9863 val += (*itr)->value;
9864 }
9865 val += apply ? mod->value : -(mod->value);
9866 WorldPacket data(Opcode, (1 + 1 + 4));
9867 data << uint8(eff);
9868 data << uint8(mod->op);
9869 data << int32(val);
9870 SendDirectMessage(&data);
9871 }
9872 }
9873
9874 if (apply)
9875 {
9876 m_spellMods[mod->op].push_back(mod);
9878 m_spellMods[mod->op].sort(MageSpellModPred());
9879 else
9880 m_spellMods[mod->op].sort(SpellModPred());
9881 }
9882 else
9883 {
9884 m_spellMods[mod->op].remove(mod);
9885 // mods bound to aura will be removed in AuraEffect::~AuraEffect
9886 if (!mod->ownerAura)
9887 delete mod;
9888 }
9889}
@ SPELLMOD_FLAT
Definition: Player.h:93
@ CLASS_MAGE
Definition: SharedDefines.h:148
@ SMSG_SET_FLAT_SPELL_MODIFIER
Definition: Opcodes.h:644
@ SMSG_SET_PCT_SPELL_MODIFIER
Definition: Opcodes.h:645
void apply(T *val)
Definition: ByteConverter.h:40
Definition: Util.h:451
Definition: Player.cpp:9818
Definition: Player.cpp:9829
SpellModOp op
Definition: Player.h:183
SpellModType type
Definition: Player.h:184
int32 value
Definition: Player.h:186
uint32 spellId
Definition: Player.h:188
Aura *const ownerAura
Definition: Player.h:189
flag96 mask
Definition: Player.h:187
SpellModList m_spellMods[MAX_SPELLMOD]
Definition: Player.h:2795

References CLASS_CONTEXT_ABILITY, CLASS_MAGE, IsClass(), LOG_DEBUG, m_spellMods, SpellModifier::mask, SpellModifier::op, SpellModifier::ownerAura, SendDirectMessage(), SMSG_SET_FLAT_SPELL_MODIFIER, SMSG_SET_PCT_SPELL_MODIFIER, SpellModifier::spellId, SPELLMOD_FLAT, SpellModifier::type, and SpellModifier::value.

Referenced by AuraEffect::ApplySpellMod().

◆ addTalent()

bool Player::addTalent ( uint32  spellId,
uint8  addSpecMask,
uint8  oldTalentRank 
)
2892{
2893 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
2894 if (!SpellMgr::CheckSpellValid(spellInfo, spellId, true))
2895 return false;
2896
2897 TalentSpellPos const* talentPos = GetTalentSpellPos(spellId);
2898 if (!talentPos)
2899 return false;
2900
2901 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentPos->talent_id);
2902 if (!talentInfo)
2903 return false;
2904
2905 // xinef: remove old talent rank if any
2906 if (oldTalentRank)
2907 {
2908 _removeTalent(talentInfo->RankID[oldTalentRank - 1], addSpecMask);
2909 _removeTalentAurasAndSpells(talentInfo->RankID[oldTalentRank - 1]);
2910 SendLearnPacket(talentInfo->RankID[oldTalentRank - 1], false);
2911 }
2912
2913 // xinef: add talent auras and spells
2914 if (GetActiveSpecMask() & addSpecMask)
2915 _addTalentAurasAndSpells(spellId);
2916
2917 // xinef: find the spell on our talent map
2918 PlayerTalentMap::iterator itr = m_talents.find(spellId);
2919
2920 // xinef: we do not have such a spell on our talent map
2921 if (itr == m_talents.end())
2922 {
2924 PlayerTalent* newTalent = new PlayerTalent();
2925 newTalent->State = state;
2926 newTalent->specMask = addSpecMask;
2927 newTalent->talentID = talentInfo->TalentID;
2928 newTalent->inSpellBook = talentInfo->addToSpellBook && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL);
2929
2930 m_talents[spellId] = newTalent;
2931 return true;
2932 }
2933 // xinef: if current mask does not cover addMask, add it to iterator and save changes to DB
2934 else if (!(itr->second->specMask & addSpecMask))
2935 {
2936 itr->second->specMask |= addSpecMask;
2937 if (itr->second->State != PLAYERSPELL_NEW)
2938 itr->second->State = PLAYERSPELL_CHANGED;
2939
2940 return true;
2941 }
2942
2943 return false;
2944}
DBCStorage< TalentEntry > sTalentStore(TalentEntryfmt)
PlayerSpellState
Definition: Player.h:118
Definition: Player.h:135
PlayerSpellState State
Definition: Player.h:136
bool inSpellBook
Definition: Player.h:139
uint32 talentID
Definition: Player.h:138
uint8 specMask
Definition: Player.h:137
Definition: DBCStructure.h:1923
std::array< uint32, MAX_TALENT_RANK > RankID
Definition: DBCStructure.h:1928
uint32 TalentID
Definition: DBCStructure.h:1924
uint32 addToSpellBook
Definition: DBCStructure.h:1934
uint16 talent_id
Definition: DBCStructure.h:2236

References _addTalentAurasAndSpells(), _removeTalent(), _removeTalentAurasAndSpells(), TalentEntry::addToSpellBook, SpellMgr::CheckSpellValid(), GetActiveSpecMask(), GetTalentSpellPos(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), PlayerTalent::inSpellBook, isBeingLoaded(), m_talents, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_UNCHANGED, TalentEntry::RankID, SendLearnPacket(), PlayerTalent::specMask, SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sSpellMgr, sTalentStore, PlayerTalent::State, TalentSpellPos::talent_id, PlayerTalent::talentID, and TalentEntry::TalentID.

Referenced by _LoadTalents(), and LearnTalent().

◆ AddTimedQuest()

void Player::AddTimedQuest ( uint32  quest_id)
inline
1545{ m_timedquests.insert(quest_id); }
QuestSet m_timedquests
Definition: Player.h:2660

References m_timedquests.

Referenced by _LoadQuestStatus(), and AddQuest().

◆ AddToWorld()

void Player::AddToWorld ( )
overridevirtual
  • Do not add/remove the player from the object storage
  • It will crash when updating the ObjectAccessor
  • The player should only be added when logging in

Reimplemented from WorldObject.

1699{
1704
1705 for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
1706 if (m_items[i])
1707 m_items[i]->AddToWorld();
1708}
@ PLAYER_SLOT_START
Definition: Player.h:664
@ PLAYER_SLOT_END
Definition: Player.h:666
void AddToWorld() override
Definition: Unit.cpp:15626

References Object::AddToWorld(), Unit::AddToWorld(), m_items, PLAYER_SLOT_END, and PLAYER_SLOT_START.

Referenced by Map::AddPlayerToMap().

◆ AddTradeableItem()

void Player::AddTradeableItem ( Item item)
4148{
4149 std::lock_guard<std::mutex> guard(m_soulboundTradableLock);
4150 m_itemSoulboundTradeable.push_back(item);
4151}
std::mutex m_soulboundTradableLock
Definition: Player.h:2802
ItemDurationList m_itemSoulboundTradeable
Definition: Player.h:2801

References m_itemSoulboundTradeable, and m_soulboundTradableLock.

Referenced by _LoadItem(), MoveItemToInventory(), and StoreNewItem().

◆ AddWeaponProficiency()

void Player::AddWeaponProficiency ( uint32  newflag)
inline
1350{ m_WeaponProficiency |= newflag; }

References m_WeaponProficiency.

Referenced by Spell::EffectProficiency().

◆ AddWhisperWhiteList()

void Player::AddWhisperWhiteList ( ObjectGuid  guid)
inline
2536{ WhisperList.push_back(guid); }
WhisperListContainer WhisperList
Definition: Player.h:2614

References WhisperList.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ AdjustQuestReqItemCount()

void Player::AdjustQuestReqItemCount ( Quest const *  quest,
QuestStatusData questStatusData 
)
private
1759{
1760 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
1761 {
1762 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
1763 {
1764 uint32 reqitemcount = quest->RequiredItemCount[i];
1765 if (reqitemcount != 0)
1766 {
1767 uint32 curitemcount = GetItemCount(quest->RequiredItemId[i], true);
1768
1769 questStatusData.ItemCount[i] = std::min(curitemcount, reqitemcount);
1770 m_QuestStatusSave[quest->GetQuestId()] = true;
1771 }
1772 }
1773 }
1774}
uint32 GetItemCount(uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
Definition: PlayerStorage.cpp:350

References GetItemCount(), Quest::GetQuestId(), Quest::HasSpecialFlag(), QuestStatusData::ItemCount, m_QuestStatusSave, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, and Quest::RequiredItemId.

Referenced by AddQuest().

◆ ApplyEnchantment() [1/2]

void Player::ApplyEnchantment ( Item item,
bool  apply 
)
4314{
4315 for (uint32 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
4316 ApplyEnchantment(item, EnchantmentSlot(slot), apply);
4317}

References ApplyEnchantment(), and MAX_ENCHANTMENT_SLOT.

◆ ApplyEnchantment() [2/2]

void Player::ApplyEnchantment ( Item item,
EnchantmentSlot  slot,
bool  apply,
bool  apply_dur = true,
bool  ignore_condition = false 
)
4320{
4321 if (!item || !item->IsEquipped())
4322 return;
4323
4324 if (slot >= MAX_ENCHANTMENT_SLOT)
4325 return;
4326
4327 uint32 enchant_id = item->GetEnchantmentId(slot);
4328 if (!enchant_id)
4329 return;
4330
4331 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
4332 if (!pEnchant)
4333 return;
4334
4335 if (!ignore_condition && pEnchant->EnchantmentCondition && !EnchantmentFitsRequirements(pEnchant->EnchantmentCondition, -1))
4336 return;
4337
4338 if (pEnchant->requiredLevel > GetLevel())
4339 return;
4340
4341 if (pEnchant->requiredSkill > 0 && pEnchant->requiredSkillValue > GetSkillValue(pEnchant->requiredSkill))
4342 return;
4343
4344 if (!sScriptMgr->CanApplyEnchantment(this, item, slot, apply, apply_dur, ignore_condition))
4345 return;
4346
4347 // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements
4348 // rather than the gem requirements itself. If the socket has no color it is a prismatic socket.
4350 && !item->GetTemplate()->Socket[slot - SOCK_ENCHANTMENT_SLOT].Color)
4351 {
4352 // Check if the requirements for the prismatic socket are met before applying the gem stats
4354 if (!pPrismaticEnchant || (pPrismaticEnchant->requiredSkill > 0 && pPrismaticEnchant->requiredSkillValue > GetSkillValue(pPrismaticEnchant->requiredSkill)))
4355 return;
4356 }
4357
4358 if (!item->IsBroken())
4359 {
4360 for (int s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
4361 {
4362 uint32 enchant_display_type = pEnchant->type[s];
4363 uint32 enchant_amount = pEnchant->amount[s];
4364 uint32 enchant_spell_id = pEnchant->spellid[s];
4365
4366 switch (enchant_display_type)
4367 {
4369 break;
4371 // processed in Player::CastItemCombatSpell
4372 break;
4374 if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
4375 HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, float(enchant_amount), apply);
4376 else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
4377 HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, float(enchant_amount), apply);
4378 else if (item->GetSlot() == EQUIPMENT_SLOT_RANGED)
4379 HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4380 break;
4382 if (enchant_spell_id)
4383 {
4384 if (apply)
4385 {
4386 int32 basepoints = 0;
4387 // Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor)
4388 if (item->GetItemRandomPropertyId())
4389 {
4390 ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4391 if (item_rand)
4392 {
4393 // Search enchant_amount
4394 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4395 {
4396 if (item_rand->Enchantment[k] == enchant_id)
4397 {
4398 basepoints = int32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4399 break;
4400 }
4401 }
4402 }
4403 }
4404 // Cast custom spell vs all equal basepoints got from enchant_amount
4405 if (basepoints)
4406 CastCustomSpell(this, enchant_spell_id, &basepoints, &basepoints, &basepoints, true, item);
4407 else
4408 CastSpell(this, enchant_spell_id, true, item);
4409 }
4410 else
4411 RemoveAurasDueToItemSpell(enchant_spell_id, item->GetGUID());
4412 }
4413 break;
4415 if (!enchant_amount)
4416 {
4417 ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4418 if (item_rand)
4419 {
4420 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4421 {
4422 if (item_rand->Enchantment[k] == enchant_id)
4423 {
4424 enchant_amount = uint32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4425 break;
4426 }
4427 }
4428 }
4429 }
4430
4431 HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + enchant_spell_id), TOTAL_VALUE, float(enchant_amount), apply);
4432 break;
4434 {
4435 if (!enchant_amount)
4436 {
4437 ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4438 if (item_rand_suffix)
4439 {
4440 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4441 {
4442 if (item_rand_suffix->Enchantment[k] == enchant_id)
4443 {
4444 enchant_amount = uint32((item_rand_suffix->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4445 break;
4446 }
4447 }
4448 }
4449 }
4450
4451 sScriptMgr->OnApplyEnchantmentItemModsBefore(this, item, slot, apply, enchant_spell_id, enchant_amount);
4452
4453 LOG_DEBUG("entities.player.items", "Adding {} to stat nb {}", enchant_amount, enchant_spell_id);
4454 switch (enchant_spell_id)
4455 {
4456 case ITEM_MOD_MANA:
4457 LOG_DEBUG("entities.player.items", "+ {} MANA", enchant_amount);
4458 HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(enchant_amount), apply);
4459 break;
4460 case ITEM_MOD_HEALTH:
4461 LOG_DEBUG("entities.player.items", "+ {} HEALTH", enchant_amount);
4462 HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(enchant_amount), apply);
4463 break;
4464 case ITEM_MOD_AGILITY:
4465 LOG_DEBUG("entities.player.items", "+ {} AGILITY", enchant_amount);
4466 HandleStatModifier(UNIT_MOD_STAT_AGILITY, TOTAL_VALUE, float(enchant_amount), apply);
4467 ApplyStatBuffMod(STAT_AGILITY, (float)enchant_amount, apply);
4468 break;
4469 case ITEM_MOD_STRENGTH:
4470 LOG_DEBUG("entities.player.items", "+ {} STRENGTH", enchant_amount);
4471 HandleStatModifier(UNIT_MOD_STAT_STRENGTH, TOTAL_VALUE, float(enchant_amount), apply);
4472 ApplyStatBuffMod(STAT_STRENGTH, (float)enchant_amount, apply);
4473 break;
4474 case ITEM_MOD_INTELLECT:
4475 LOG_DEBUG("entities.player.items", "+ {} INTELLECT", enchant_amount);
4476 HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, float(enchant_amount), apply);
4477 ApplyStatBuffMod(STAT_INTELLECT, (float)enchant_amount, apply);
4478 break;
4479 case ITEM_MOD_SPIRIT:
4480 LOG_DEBUG("entities.player.items", "+ {} SPIRIT", enchant_amount);
4481 HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, float(enchant_amount), apply);
4482 ApplyStatBuffMod(STAT_SPIRIT, (float)enchant_amount, apply);
4483 break;
4484 case ITEM_MOD_STAMINA:
4485 LOG_DEBUG("entities.player.items", "+ {} STAMINA", enchant_amount);
4486 HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, float(enchant_amount), apply);
4487 ApplyStatBuffMod(STAT_STAMINA, (float)enchant_amount, apply);
4488 break;
4490 ApplyRatingMod(CR_DEFENSE_SKILL, enchant_amount, apply);
4491 LOG_DEBUG("entities.player.items", "+ {} DEFENCE", enchant_amount);
4492 break;
4494 ApplyRatingMod(CR_DODGE, enchant_amount, apply);
4495 LOG_DEBUG("entities.player.items", "+ {} DODGE", enchant_amount);
4496 break;
4498 ApplyRatingMod(CR_PARRY, enchant_amount, apply);
4499 LOG_DEBUG("entities.player.items", "+ {} PARRY", enchant_amount);
4500 break;
4502 ApplyRatingMod(CR_BLOCK, enchant_amount, apply);
4503 LOG_DEBUG("entities.player.items", "+ {} SHIELD_BLOCK", enchant_amount);
4504 break;
4506 ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
4507 LOG_DEBUG("entities.player.items", "+ {} MELEE_HIT", enchant_amount);
4508 break;
4510 ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
4511 LOG_DEBUG("entities.player.items", "+ {} RANGED_HIT", enchant_amount);
4512 break;
4514 ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
4515 LOG_DEBUG("entities.player.items", "+ {} SPELL_HIT", enchant_amount);
4516 break;
4518 ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
4519 LOG_DEBUG("entities.player.items", "+ {} MELEE_CRIT", enchant_amount);
4520 break;
4522 ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
4523 LOG_DEBUG("entities.player.items", "+ {} RANGED_CRIT", enchant_amount);
4524 break;
4526 ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
4527 LOG_DEBUG("entities.player.items", "+ {} SPELL_CRIT", enchant_amount);
4528 break;
4529 // Values from ITEM_STAT_MELEE_HA_RATING to ITEM_MOD_HASTE_RANGED_RATING are never used
4530 // in Enchantments
4531 // case ITEM_MOD_HIT_TAKEN_MELEE_RATING:
4532 // ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
4533 // break;
4534 // case ITEM_MOD_HIT_TAKEN_RANGED_RATING:
4535 // ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
4536 // break;
4537 // case ITEM_MOD_HIT_TAKEN_SPELL_RATING:
4538 // ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
4539 // break;
4540 // case ITEM_MOD_CRIT_TAKEN_MELEE_RATING:
4541 // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4542 // break;
4543 // case ITEM_MOD_CRIT_TAKEN_RANGED_RATING:
4544 // ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4545 // break;
4546 // case ITEM_MOD_CRIT_TAKEN_SPELL_RATING:
4547 // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4548 // break;
4549 // case ITEM_MOD_HASTE_MELEE_RATING:
4550 // ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
4551 // break;
4553 ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
4554 break;
4556 ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
4557 break;
4559 ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
4560 ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
4561 ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
4562 LOG_DEBUG("entities.player.items", "+ {} HIT", enchant_amount);
4563 break;
4565 ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
4566 ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
4567 ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
4568 LOG_DEBUG("entities.player.items", "+ {} CRITICAL", enchant_amount);
4569 break;
4570 // Values ITEM_MOD_HIT_TAKEN_RATING and ITEM_MOD_CRIT_TAKEN_RATING are never used in Enchantment
4571 // case ITEM_MOD_HIT_TAKEN_RATING:
4572 // ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
4573 // ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
4574 // ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
4575 // break;
4576 // case ITEM_MOD_CRIT_TAKEN_RATING:
4577 // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4578 // ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4579 // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4580 // break;
4582 ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4583 ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4584 ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4585 LOG_DEBUG("entities.player.items", "+ {} RESILIENCE", enchant_amount);
4586 break;
4588 ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
4589 ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
4590 ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
4591 LOG_DEBUG("entities.player.items", "+ {} HASTE", enchant_amount);
4592 break;
4594 ApplyRatingMod(CR_EXPERTISE, enchant_amount, apply);
4595 LOG_DEBUG("entities.player.items", "+ {} EXPERTISE", enchant_amount);
4596 break;
4598 HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(enchant_amount), apply);
4599 HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4600 LOG_DEBUG("entities.player.items", "+ {} ATTACK_POWER", enchant_amount);
4601 break;
4603 HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4604 LOG_DEBUG("entities.player.items", "+ {} RANGED_ATTACK_POWER", enchant_amount);
4605 break;
4606 // case ITEM_MOD_FERAL_ATTACK_POWER:
4607 // ApplyFeralAPBonus(enchant_amount, apply);
4608 // LOG_DEBUG("entities.player.items", "+ {} FERAL_ATTACK_POWER", enchant_amount);
4609 // break;
4611 ApplyManaRegenBonus(enchant_amount, apply);
4612 LOG_DEBUG("entities.player.items", "+ {} MANA_REGENERATION", enchant_amount);
4613 break;
4615 ApplyRatingMod(CR_ARMOR_PENETRATION, enchant_amount, apply);
4616 LOG_DEBUG("entities.player.items", "+ {} ARMOR PENETRATION", enchant_amount);
4617 break;
4619 ApplySpellPowerBonus(enchant_amount, apply);
4620 LOG_DEBUG("entities.player.items", "+ {} SPELL_POWER", enchant_amount);
4621 break;
4623 ApplyHealthRegenBonus(enchant_amount, apply);
4624 LOG_DEBUG("entities.player.items", "+ {} HEALTH_REGENERATION", enchant_amount);
4625 break;
4627 ApplySpellPenetrationBonus(enchant_amount, apply);
4628 LOG_DEBUG("entities.player.items", "+ {} SPELL_PENETRATION", enchant_amount);
4629 break;
4631 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(enchant_amount), apply);
4632 LOG_DEBUG("entities.player.items", "+ {} BLOCK_VALUE", enchant_amount);
4633 break;
4634 case ITEM_MOD_SPELL_HEALING_DONE: // deprecated
4635 case ITEM_MOD_SPELL_DAMAGE_DONE: // deprecated
4636 default:
4637 break;
4638 }
4639 break;
4640 }
4641 case ITEM_ENCHANTMENT_TYPE_TOTEM: // Shaman Rockbiter Weapon
4642 {
4644 {
4645 float addValue = 0.0f;
4646 if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
4647 {
4648 addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f);
4650 }
4651 else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
4652 {
4653 addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f);
4655 }
4656 }
4657 break;
4658 }
4660 // processed in Player::CastItemUseSpell
4661 break;
4663 // nothing do..
4664 break;
4665 default:
4666 LOG_ERROR("entities.player", "Unknown item enchantment (id = {}) display type: {}", enchant_id, enchant_display_type);
4667 break;
4668 } /*switch (enchant_display_type)*/
4669 } /*for*/
4670 }
4671
4672 // visualize enchantment at player and equipped items
4673 if (slot == PERM_ENCHANTMENT_SLOT)
4674 SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 0, apply ? item->GetEnchantmentId(slot) : 0);
4675
4676 if (slot == TEMP_ENCHANTMENT_SLOT)
4677 SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 1, apply ? item->GetEnchantmentId(slot) : 0);
4678
4679 if (apply_dur)
4680 {
4681 if (apply)
4682 {
4683 // set duration
4684 uint32 duration = item->GetEnchantmentDuration(slot);
4685 if (duration > 0)
4686 AddEnchantmentDuration(item, slot, duration);
4687 }
4688 else
4689 {
4690 // duration == 0 will remove EnchantDuration
4691 AddEnchantmentDuration(item, slot, 0);
4692 }
4693 }
4694}
DBCStorage< SpellItemEnchantmentEntry > sSpellItemEnchantmentStore(SpellItemEnchantmentfmt)
DBCStorage< ItemRandomSuffixEntry > sItemRandomSuffixStore(ItemRandomSuffixfmt)
@ PLAYER_VISIBLE_ITEM_1_ENCHANTMENT
Definition: UpdateFields.h:287
@ PERM_ENCHANTMENT_SLOT
Definition: Item.h:169
@ SOCK_ENCHANTMENT_SLOT_3
Definition: Item.h:173
@ TEMP_ENCHANTMENT_SLOT
Definition: Item.h:170
@ SOCK_ENCHANTMENT_SLOT_2
Definition: Item.h:172
@ PRISMATIC_ENCHANTMENT_SLOT
Definition: Item.h:175
@ SOCK_ENCHANTMENT_SLOT
Definition: Item.h:171
@ UNIT_MOD_RESISTANCE_START
Definition: Unit.h:172
@ ITEM_ENCHANTMENT_TYPE_DAMAGE
Definition: DBCEnums.h:368
@ ITEM_ENCHANTMENT_TYPE_USE_SPELL
Definition: DBCEnums.h:373
@ ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL
Definition: DBCEnums.h:367
@ ITEM_ENCHANTMENT_TYPE_STAT
Definition: DBCEnums.h:371
@ ITEM_ENCHANTMENT_TYPE_RESISTANCE
Definition: DBCEnums.h:370
@ ITEM_ENCHANTMENT_TYPE_NONE
Definition: DBCEnums.h:366
@ ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL
Definition: DBCEnums.h:369
@ ITEM_ENCHANTMENT_TYPE_TOTEM
Definition: DBCEnums.h:372
@ ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET
Definition: DBCEnums.h:374
#define MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS
Definition: DBCStructure.h:1838
#define MAX_ITEM_ENCHANTMENT_EFFECTS
Definition: DBCStructure.h:1204
@ CLASS_SHAMAN
Definition: SharedDefines.h:147
int32 GetItemRandomPropertyId() const
Definition: Item.h:295
uint32 GetItemSuffixFactor() const
Definition: Item.h:296
bool IsEquipped() const
Definition: Item.cpp:790
uint32 Color
Definition: ItemTemplate.h:602
uint32 Delay
Definition: ItemTemplate.h:659
_Socket Socket[MAX_ITEM_PROTO_SOCKETS]
Definition: ItemTemplate.h:681
void SetUInt16Value(uint16 index, uint8 offset, uint16 value)
Definition: Object.cpp:770
uint16 GetSkillValue(uint32 skill) const
Definition: Player.cpp:5394
bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot)
Definition: Player.cpp:11076
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1211
void RemoveAurasDueToItemSpell(uint32 spellId, ObjectGuid castItemGuid)
Definition: Unit.cpp:5050
Definition: DBCStructure.h:1217
std::array< uint32, MAX_ITEM_ENCHANTMENT_EFFECTS > AllocationPct
Definition: DBCStructure.h:1224
std::array< uint32, MAX_ITEM_ENCHANTMENT_EFFECTS > Enchantment
Definition: DBCStructure.h:1222
Definition: DBCStructure.h:1841
uint32 EnchantmentCondition
Definition: DBCStructure.h:1853
uint32 amount[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition: DBCStructure.h:1845
uint32 requiredLevel
Definition: DBCStructure.h:1856
uint32 spellid[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition: DBCStructure.h:1847
uint32 requiredSkill
Definition: DBCStructure.h:1854
uint32 requiredSkillValue
Definition: DBCStructure.h:1855
uint32 type[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition: DBCStructure.h:1844

References AddEnchantmentDuration(), ItemRandomSuffixEntry::AllocationPct, SpellItemEnchantmentEntry::amount, ApplyHealthRegenBonus(), ApplyManaRegenBonus(), ApplyRatingMod(), ApplySpellPenetrationBonus(), ApplySpellPowerBonus(), Unit::ApplyStatBuffMod(), BASE_VALUE, Unit::CastCustomSpell(), Unit::CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_SHAMAN, _Socket::Color, CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_PARRY, ItemTemplate::Delay, ItemRandomSuffixEntry::Enchantment, SpellItemEnchantmentEntry::EnchantmentCondition, EnchantmentFitsRequirements(), EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, FLAT_MOD, Item::GetEnchantmentDuration(), Item::GetEnchantmentId(), Object::GetGUID(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), Unit::GetLevel(), GetSkillValue(), Item::GetSlot(), Item::GetTemplate(), HandleBaseModValue(), Unit::HandleStatModifier(), Item::IsBroken(), IsClass(), Item::IsEquipped(), ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL, ITEM_ENCHANTMENT_TYPE_DAMAGE, ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL, ITEM_ENCHANTMENT_TYPE_NONE, ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET, ITEM_ENCHANTMENT_TYPE_RESISTANCE, ITEM_ENCHANTMENT_TYPE_STAT, ITEM_ENCHANTMENT_TYPE_TOTEM, ITEM_ENCHANTMENT_TYPE_USE_SPELL, ITEM_MOD_AGILITY, ITEM_MOD_ARMOR_PENETRATION_RATING, ITEM_MOD_ATTACK_POWER, ITEM_MOD_BLOCK_RATING, ITEM_MOD_BLOCK_VALUE, ITEM_MOD_CRIT_MELEE_RATING, ITEM_MOD_CRIT_RANGED_RATING, ITEM_MOD_CRIT_RATING, ITEM_MOD_CRIT_SPELL_RATING, ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_DODGE_RATING, ITEM_MOD_EXPERTISE_RATING, ITEM_MOD_HASTE_RANGED_RATING, ITEM_MOD_HASTE_RATING, ITEM_MOD_HASTE_SPELL_RATING, ITEM_MOD_HEALTH, ITEM_MOD_HEALTH_REGEN, ITEM_MOD_HIT_MELEE_RATING, ITEM_MOD_HIT_RANGED_RATING, ITEM_MOD_HIT_RATING, ITEM_MOD_HIT_SPELL_RATING, ITEM_MOD_INTELLECT, ITEM_MOD_MANA, ITEM_MOD_MANA_REGENERATION, ITEM_MOD_PARRY_RATING, ITEM_MOD_RANGED_ATTACK_POWER, ITEM_MOD_RESILIENCE_RATING, ITEM_MOD_SPELL_DAMAGE_DONE, ITEM_MOD_SPELL_HEALING_DONE, ITEM_MOD_SPELL_PENETRATION, ITEM_MOD_SPELL_POWER, ITEM_MOD_SPIRIT, ITEM_MOD_STAMINA, ITEM_MOD_STRENGTH, LOG_DEBUG, LOG_ERROR, MAX_ENCHANTMENT_SLOT, MAX_ITEM_ENCHANTMENT_EFFECTS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, PERM_ENCHANTMENT_SLOT, PLAYER_VISIBLE_ITEM_1_ENCHANTMENT, PRISMATIC_ENCHANTMENT_SLOT, Unit::RemoveAurasDueToItemSpell(), SpellItemEnchantmentEntry::requiredLevel, SpellItemEnchantmentEntry::requiredSkill, SpellItemEnchantmentEntry::requiredSkillValue, Object::SetUInt16Value(), SHIELD_BLOCK_VALUE, sItemRandomSuffixStore, SOCK_ENCHANTMENT_SLOT, SOCK_ENCHANTMENT_SLOT_2, SOCK_ENCHANTMENT_SLOT_3, ItemTemplate::Socket, SpellItemEnchantmentEntry::spellid, sScriptMgr, sSpellItemEnchantmentStore, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, TEMP_ENCHANTMENT_SLOT, TOTAL_VALUE, SpellItemEnchantmentEntry::type, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RESISTANCE_START, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), ApplyEnchantment(), CastItemCombatSpell(), CorrectMetaGemEnchants(), Spell::EffectEnchantHeldItem(), Spell::EffectEnchantItemPerm(), Spell::EffectEnchantItemPrismatic(), Spell::EffectEnchantItemTmp(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleCancelTempEnchantmentOpcode(), WorldSession::HandleSocketOpcode(), RemoveArenaEnchantments(), SetVirtualItemSlot(), SwapItem(), ToggleMetaGemsActive(), UpdateEnchantTime(), and UpdateSkillEnchantments().

◆ ApplyEquipCooldown()

void Player::ApplyEquipCooldown ( Item pItem)
11725{
11727 return;
11728
11729 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
11730 {
11731 _Spell const& spellData = pItem->GetTemplate()->Spells[i];
11732
11733 // no spell
11734 if (!spellData.SpellId)
11735 continue;
11736
11737 // xinef: apply hidden cooldown for procs
11739 {
11740 // xinef: uint32(-1) special marker for proc cooldowns
11741 AddSpellCooldown(spellData.SpellId, uint32(-1), 30 * IN_MILLISECONDS);
11742 continue;
11743 }
11744
11745 // wrong triggering type (note: ITEM_SPELLTRIGGER_ON_NO_DELAY_USE not have cooldown)
11746 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
11747 continue;
11748
11749 // xinef: dont apply equip cooldown if spell on item has insignificant cooldown
11750 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
11751 if (spellData.SpellCooldown <= 3000 && spellData.SpellCategoryCooldown <= 3000 && (!spellInfo || (spellInfo->RecoveryTime <= 3000 && spellInfo->CategoryRecoveryTime <= 3000)))
11752 continue;
11753
11754 // Don't replace longer cooldowns by equip cooldown if we have any.
11755 SpellCooldowns::iterator itr = m_spellCooldowns.find(spellData.SpellId);
11756 if (itr != m_spellCooldowns.end() && itr->second.itemid == pItem->GetEntry() && itr->second.end > GameTime::GetGameTimeMS().count() + 30 * IN_MILLISECONDS)
11757 continue;
11758
11759 // xinef: dont apply eqiup cooldown for spells with this attribute
11760 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL))
11761 continue;
11762
11763 AddSpellCooldown(spellData.SpellId, pItem->GetEntry(), 30 * IN_MILLISECONDS, true, true);
11764
11766 data << pItem->GetGUID();
11767 data << uint32(spellData.SpellId);
11768 GetSession()->SendPacket(&data);
11769 }
11770}
@ ITEM_SPELLTRIGGER_ON_USE
Definition: ItemTemplate.h:77
@ ITEM_SPELLTRIGGER_ON_EQUIP
Definition: ItemTemplate.h:78
@ ITEM_FLAG_NO_EQUIP_COOLDOWN
Definition: ItemTemplate.h:154
#define MAX_ITEM_PROTO_SPELLS
Definition: ItemTemplate.h:615
@ SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL
Definition: SharedDefines.h:410
@ SMSG_ITEM_COOLDOWN
Definition: Opcodes.h:206
Definition: ItemTemplate.h:590
uint32 SpellTrigger
Definition: ItemTemplate.h:592
int32 SpellCategoryCooldown
Definition: ItemTemplate.h:597
int32 SpellCooldown
Definition: ItemTemplate.h:595
int32 SpellId
Definition: ItemTemplate.h:591
_Spell Spells[MAX_ITEM_PROTO_SPELLS]
Definition: ItemTemplate.h:662
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition: Player.cpp:11042
uint32 RecoveryTime
Definition: SpellInfo.h:348
uint32 CategoryRecoveryTime
Definition: SpellInfo.h:349

References AddSpellCooldown(), SpellInfo::CategoryRecoveryTime, Object::GetEntry(), GameTime::GetGameTimeMS(), Object::GetGUID(), GetSession(), Item::GetTemplate(), SpellInfo::HasAttribute(), ItemTemplate::HasFlag(), IN_MILLISECONDS, ITEM_FLAG_NO_EQUIP_COOLDOWN, ITEM_SPELLTRIGGER_ON_EQUIP, ITEM_SPELLTRIGGER_ON_USE, m_spellCooldowns, MAX_ITEM_PROTO_SPELLS, SpellInfo::RecoveryTime, WorldSession::SendPacket(), SMSG_ITEM_COOLDOWN, SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL, _Spell::SpellCategoryCooldown, _Spell::SpellCooldown, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, and sSpellMgr.

Referenced by EquipItem().

◆ ApplyEquipSpell()

void Player::ApplyEquipSpell ( SpellInfo const *  spellInfo,
Item item,
bool  apply,
bool  form_change = false 
)
7105{
7106 if (apply)
7107 {
7108 if (!sScriptMgr->CanApplyEquipSpell(this, spellInfo, item, apply, form_change))
7109 return;
7110
7111 // Cannot be used in this stance/form
7112 if (spellInfo->CheckShapeshift(GetShapeshiftForm()) != SPELL_CAST_OK)
7113 return;
7114
7115 if (form_change) // check aura active state from other form
7116 {
7117 AuraApplicationMapBounds range = GetAppliedAuras().equal_range(spellInfo->Id);
7118 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
7119 if (!item || itr->second->GetBase()->GetCastItemGUID() == item->GetGUID())
7120 return;
7121 }
7122
7123 LOG_DEBUG("entities.player", "WORLD: cast {} Equip spellId - {}", (item ? "item" : "itemset"), spellInfo->Id);
7124
7125 //Ignore spellInfo->DurationEntry, cast with -1 duration
7126 CastCustomSpell(spellInfo->Id, SPELLVALUE_AURA_DURATION, -1, this, true, item);
7127 }
7128 else
7129 {
7130 if (form_change) // check aura compatibility
7131 {
7132 // Cannot be used in this stance/form
7133 if (spellInfo->CheckShapeshift(GetShapeshiftForm()) == SPELL_CAST_OK)
7134 return; // and remove only not compatible at form change
7135 }
7136
7137 if (item)
7138 RemoveAurasDueToItemSpell(spellInfo->Id, item->GetGUID()); // un-apply all spells, not only at-equipped
7139 else
7140 RemoveAurasDueToSpell(spellInfo->Id); // un-apply spell (item set case)
7141
7142 // Xinef: Remove Proc Spells and Summons
7143 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
7144 {
7145 // Xinef: Remove procs
7146 if (spellInfo->Effects[i].TriggerSpell)
7147 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
7148
7149 // Xinef: remove minions summoned by item
7150 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_SUMMON)
7151 RemoveAllMinionsByEntry(spellInfo->Effects[i].MiscValue);
7152 }
7153 }
7154}
@ SPELLVALUE_AURA_DURATION
Definition: SpellDefines.h:120
@ EFFECT_0
Definition: SharedDefines.h:31
@ SPELL_EFFECT_SUMMON
Definition: SharedDefines.h:806
@ SPELL_CAST_OK
Definition: SharedDefines.h:1138
ShapeshiftForm GetShapeshiftForm() const
Definition: Unit.h:1414
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition: Unit.h:640
AuraApplicationMap & GetAppliedAuras()
Definition: Unit.h:1267
void RemoveAllMinionsByEntry(uint32 entry)
Definition: Unit.cpp:10803

References Unit::CastCustomSpell(), SpellInfo::CheckShapeshift(), EFFECT_0, SpellInfo::Effects, Unit::GetAppliedAuras(), Object::GetGUID(), Unit::GetShapeshiftForm(), SpellInfo::Id, LOG_DEBUG, MAX_SPELL_EFFECTS, Unit::RemoveAllMinionsByEntry(), Unit::RemoveAurasDueToItemSpell(), Unit::RemoveAurasDueToSpell(), SPELL_CAST_OK, SPELL_EFFECT_SUMMON, SPELLVALUE_AURA_DURATION, and sScriptMgr.

Referenced by AddItemsSetItem(), ApplyItemEquipSpell(), RemoveItemsSetItem(), and UpdateEquipSpellsAtFormChange().

◆ ApplyFeralAPBonus()

void Player::ApplyFeralAPBonus ( int32  amount,
bool  apply 
)
325{
326 _ModifyUInt32(apply, m_baseFeralAP, amount);
328}
bool _ModifyUInt32(bool apply, uint32 &baseValue, int32 &amount)
Definition: StatSystem.cpp:28
void UpdateAttackPowerAndDamage(bool ranged=false) override
Definition: StatSystem.cpp:330

References _ModifyUInt32(), m_baseFeralAP, and UpdateAttackPowerAndDamage().

Referenced by _ApplyItemBonuses().

◆ ApplyHealthRegenBonus()

void Player::ApplyHealthRegenBonus ( int32  amount,
bool  apply 
)
920{
921 _ModifyUInt32(apply, m_baseHealthRegen, amount);
922}

References _ModifyUInt32(), and m_baseHealthRegen.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplyItemEquipSpell()

void Player::ApplyItemEquipSpell ( Item item,
bool  apply,
bool  form_change = false 
)
7054{
7055 if (!item)
7056 return;
7057
7058 ItemTemplate const* proto = item->GetTemplate();
7059 if (!proto)
7060 return;
7061
7062 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
7063 {
7064 _Spell const& spellData = proto->Spells[i];
7065
7066 // no spell
7067 if (!spellData.SpellId)
7068 continue;
7069
7070 // Spells that should stay on the caster after removing the item.
7071 constexpr std::array<int32, 2> spellExceptions =
7072 {
7073 11826, //Electromagnetic Gigaflux Reactivator
7074 17490 //Book of the Dead - Summon Skeleton
7075 };
7076 const auto found = std::find(std::begin(spellExceptions), std::end(spellExceptions), spellData.SpellId);
7077
7078 // wrong triggering type
7079 if (apply)
7080 {
7082 {
7083 continue;
7084 }
7085 }
7086 else
7087 {
7088 // If the spell is an exception do not remove it.
7089 if (found != std::end(spellExceptions))
7090 {
7091 continue;
7092 }
7093 }
7094
7095 // check if it is valid spell
7096 SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(spellData.SpellId);
7097 if (!spellproto)
7098 continue;
7099
7100 ApplyEquipSpell(spellproto, item, apply, form_change);
7101 }
7102}
void ApplyEquipSpell(SpellInfo const *spellInfo, Item *item, bool apply, bool form_change=false)
Definition: Player.cpp:7104

References ApplyEquipSpell(), Item::GetTemplate(), ITEM_SPELLTRIGGER_ON_EQUIP, MAX_ITEM_PROTO_SPELLS, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, and sSpellMgr.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and UpdateEquipSpellsAtFormChange().

◆ ApplyManaRegenBonus()

void Player::ApplyManaRegenBonus ( int32  amount,
bool  apply 
)
914{
915 _ModifyUInt32(apply, m_baseManaRegen, amount);
917}
void UpdateManaRegen()
Definition: StatSystem.cpp:924

References _ModifyUInt32(), m_baseManaRegen, and UpdateManaRegen().

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplyRatingMod()

void Player::ApplyRatingMod ( CombatRating  cr,
int32  value,
bool  apply 
)
5204{
5205 float oldRating = m_baseRatingValue[cr];
5206 m_baseRatingValue[cr] += (apply ? value : -value);
5207 // explicit affected values
5208 if (cr == CR_HASTE_MELEE || cr == CR_HASTE_RANGED || cr == CR_HASTE_SPELL)
5209 {
5210 float const mult = GetRatingMultiplier(cr);
5211 float const oldVal = oldRating * mult;
5212 float const newVal = m_baseRatingValue[cr] * mult;
5213 switch (cr)
5214 {
5215 case CR_HASTE_MELEE:
5216 ApplyAttackTimePercentMod(BASE_ATTACK, oldVal, false);
5217 ApplyAttackTimePercentMod(OFF_ATTACK, oldVal, false);
5220 break;
5221 case CR_HASTE_RANGED:
5224 break;
5225 case CR_HASTE_SPELL:
5226 ApplyCastTimePercentMod(oldVal, false);
5227 ApplyCastTimePercentMod(newVal, true);
5228 break;
5229 default:
5230 break;
5231 }
5232 }
5233
5234 UpdateRating(cr);
5235}
float GetRatingMultiplier(CombatRating cr) const
Definition: Player.cpp:5126
void UpdateRating(CombatRating cr)
Definition: PlayerUpdates.cpp:571
void ApplyAttackTimePercentMod(WeaponAttackType att, float val, bool apply)
Definition: Unit.cpp:16993
void ApplyCastTimePercentMod(float val, bool apply)
Definition: Unit.cpp:17009

References Unit::ApplyAttackTimePercentMod(), Unit::ApplyCastTimePercentMod(), BASE_ATTACK, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, GetRatingMultiplier(), m_baseRatingValue, OFF_ATTACK, RANGED_ATTACK, and UpdateRating().

Referenced by _ApplyItemBonuses(), ApplyEnchantment(), AuraEffect::HandleModRating(), AuraEffect::HandleModRatingFromStat(), RecalculateRating(), and UpdateStats().

◆ ApplySpellMod()

template<class T >
template AC_GAME_API void Player::ApplySpellMod ( uint32  spellId,
SpellModOp  op,
T &  basevalue,
Spell spell = nullptr,
bool  temporaryPet = false 
)
9687{
9688 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9689 if (!spellInfo)
9690 {
9691 return;
9692 }
9693
9694 float totalmul = 1.0f;
9695 int32 totalflat = 0;
9696
9697 auto calculateSpellMod = [&](SpellModifier* mod)
9698 {
9699 // xinef: temporary pets cannot use charged mods of owner, needed for mirror image QQ they should use their own auras
9700 if (temporaryPet && mod->charges != 0)
9701 {
9702 return;
9703 }
9704
9705 if (mod->type == SPELLMOD_FLAT)
9706 {
9707 // xinef: do not allow to consume more than one 100% crit increasing spell
9708 if (mod->op == SPELLMOD_CRITICAL_CHANCE && totalflat >= 100)
9709 {
9710 return;
9711 }
9712
9713 int32 flatValue = mod->value;
9714
9715 // SPELL_MOD_THREAT - divide by 100 (in packets we send threat * 100)
9716 if (mod->op == SPELLMOD_THREAT)
9717 {
9718 flatValue /= 100;
9719 }
9720
9721 totalflat += flatValue;
9722 }
9723 else if (mod->type == SPELLMOD_PCT)
9724 {
9725 // skip percent mods for null basevalue (most important for spell mods with charges)
9726 if (basevalue == T(0) || totalmul == 0.0f)
9727 {
9728 return;
9729 }
9730
9731 // special case (skip > 10sec spell casts for instant cast setting)
9732 if (mod->op == SPELLMOD_CASTING_TIME && basevalue >= T(10000) && mod->value <= -100)
9733 {
9734 return;
9735 }
9736 // xinef: special exception for surge of light, dont affect crit chance if previous mods were not applied
9737 else if (mod->op == SPELLMOD_CRITICAL_CHANCE && spell && !HasSpellMod(mod, spell))
9738 {
9739 return;
9740 }
9741 // xinef: special case for backdraft gcd reduce with backlast time reduction, dont affect gcd if cast time was not applied
9742 else if (mod->op == SPELLMOD_GLOBAL_COOLDOWN && spell && !HasSpellMod(mod, spell))
9743 {
9744 return;
9745 }
9746
9747 // xinef: those two mods should be multiplicative (Glyph of Renew)
9748 if (mod->op == SPELLMOD_DAMAGE || mod->op == SPELLMOD_DOT)
9749 {
9750 totalmul *= CalculatePct(1.0f, 100.0f + mod->value);
9751 }
9752 else
9753 {
9754 totalmul += CalculatePct(1.0f, mod->value);
9755 }
9756 }
9757
9758 DropModCharge(mod, spell);
9759 };
9760
9761 // Drop charges for triggering spells instead of triggered ones
9763 {
9764 spell = m_spellModTakingSpell;
9765 }
9766
9767 SpellModifier* chargedMod = nullptr;
9768 for (auto mod : m_spellMods[op])
9769 {
9770 // Charges can be set only for mods with auras
9771 if (!mod->ownerAura)
9772 {
9773 ASSERT(!mod->charges);
9774 }
9775
9776 if (!IsAffectedBySpellmod(spellInfo, mod, spell))
9777 {
9778 continue;
9779 }
9780
9781 if (mod->ownerAura->IsUsingCharges())
9782 {
9783 if (!chargedMod || (chargedMod->ownerAura->GetSpellInfo()->SpellPriority < mod->ownerAura->GetSpellInfo()->SpellPriority))
9784 {
9785 chargedMod = mod;
9786 }
9787
9788 continue;
9789 }
9790
9791 calculateSpellMod(mod);
9792 }
9793
9794 if (chargedMod)
9795 {
9796 calculateSpellMod(chargedMod);
9797 }
9798
9799 float diff = 0.0f;
9800 if (op == SPELLMOD_CASTING_TIME || op == SPELLMOD_DURATION)
9801 {
9802 diff = ((float)basevalue + totalflat) * (totalmul - 1.0f) + (float)totalflat;
9803 }
9804 else
9805 {
9806 diff = (float)basevalue * (totalmul - 1.0f) + (float)totalflat;
9807 }
9808
9809 basevalue = T((float)basevalue + diff);
9810}
@ SPELLMOD_DAMAGE
Definition: SpellDefines.h:77
@ SPELLMOD_DOT
Definition: SpellDefines.h:99
@ SPELLMOD_CRITICAL_CHANCE
Definition: SpellDefines.h:84
@ SPELLMOD_GLOBAL_COOLDOWN
Definition: SpellDefines.h:98
@ SPELLMOD_THREAT
Definition: SpellDefines.h:79
@ SPELLMOD_DURATION
Definition: SpellDefines.h:78
@ SPELLMOD_CASTING_TIME
Definition: SpellDefines.h:87
@ SPELLMOD_PCT
Definition: Player.h:94
T CalculatePct(T base, U pct)
Definition: Util.h:61
Definition: Player.h:181
void DropModCharge(SpellModifier *mod, Spell *spell)
Definition: Player.cpp:10023
bool HasSpellMod(SpellModifier *mod, Spell *spell)
Definition: Player.cpp:9661
bool IsAffectedBySpellmod(SpellInfo const *spellInfo, SpellModifier *mod, Spell *spell=nullptr)
Definition: Player.cpp:9669
SpellInfo const * GetSpellInfo() const
Definition: SpellAuras.h:100
uint32 SpellPriority
Definition: SpellInfo.h:382

References ASSERT, CalculatePct(), DropModCharge(), Aura::GetSpellInfo(), HasSpellMod(), IsAffectedBySpellmod(), m_spellMods, m_spellModTakingSpell, SpellModifier::ownerAura, SPELLMOD_CASTING_TIME, SPELLMOD_CRITICAL_CHANCE, SPELLMOD_DAMAGE, SPELLMOD_DOT, SPELLMOD_DURATION, SPELLMOD_FLAT, SPELLMOD_GLOBAL_COOLDOWN, SPELLMOD_PCT, SPELLMOD_THREAT, SpellInfo::SpellPriority, and sSpellMgr.

Referenced by AddSpellAndCategoryCooldowns(), Aura::CalcMaxDuration(), AuraEffect::CalculatePeriodic(), CastItemCombatSpell(), Spell::Delayed(), Spell::DelayedChannel(), and Spell::TriggerGlobalCooldown().

◆ ApplySpellPenetrationBonus()

void Player::ApplySpellPenetrationBonus ( int32  amount,
bool  apply 
)
220{
222 m_spellPenetrationItemMod += apply ? amount : -amount;
223}
@ PLAYER_FIELD_MOD_TARGET_RESISTANCE
Definition: UpdateFields.h:366
void ApplyModInt32Value(uint16 index, int32 val, bool apply)
Definition: Object.cpp:815

References Object::ApplyModInt32Value(), m_spellPenetrationItemMod, and PLAYER_FIELD_MOD_TARGET_RESISTANCE.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplySpellPowerBonus()

void Player::ApplySpellPowerBonus ( int32  amount,
bool  apply 
)
168{
169 apply = _ModifyUInt32(apply, m_baseSpellPower, amount);
170
171 // For speed just update for client
173 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
175}
@ PLAYER_FIELD_MOD_HEALING_DONE_POS
Definition: UpdateFields.h:363
@ SPELL_SCHOOL_HOLY
Definition: SharedDefines.h:284

References _ModifyUInt32(), Object::ApplyModInt32Value(), Object::ApplyModUInt32Value(), m_baseSpellPower, MAX_SPELL_SCHOOL, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, and SPELL_SCHOOL_HOLY.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ AreaExploredOrEventHappens()

void Player::AreaExploredOrEventHappens ( uint32  questId)
1786{
1787 if (questId)
1788 {
1789 uint16 log_slot = FindQuestSlot(questId);
1790 QuestStatusData* q_status = nullptr;
1791 if (log_slot < MAX_QUEST_LOG_SIZE)
1792 {
1793 q_status = &m_QuestStatus[questId];
1794
1795 // xinef: added failed check
1796 if (!q_status->Explored && q_status->Status != QUEST_STATUS_FAILED)
1797 {
1798 q_status->Explored = true;
1799 m_QuestStatusSave[questId] = true;
1800
1801 SendQuestComplete(questId);
1802 }
1803 }
1804 if (CanCompleteQuest(questId, q_status))
1805 CompleteQuest(questId);
1806 else
1808 }
1809}
@ ADDITIONAL_SAVING_QUEST_STATUS
Definition: Player.h:993
void SendQuestComplete(uint32 quest_id)
Definition: PlayerQuest.cpp:2340
void AdditionalSavingAddMask(uint8 mask)
Definition: Player.h:2551

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::Explored, FindQuestSlot(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_STATUS_FAILED, SendQuestComplete(), and QuestStatusData::Status.

Referenced by npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), Spell::EffectQuestComplete(), SmartAI::EndPath(), go_ahune_ice_stone::GossipSelect(), GroupEventHappens(), WorldSession::HandleAreaTriggerOpcode(), go_table_theka::OnGossipHello(), npc_parqual_fintallas::OnGossipSelect(), npc_great_bear_spirit::OnGossipSelect(), npc_thrall_warchief::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_stone_watcher_of_norgannon::OnGossipSelect(), npc_vekjik::OnGossipSelect(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), npc_doctor::npc_doctorAI::PatientSaved(), npc_shenthul::npc_shenthulAI::ReceiveEmote(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), and npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI().

◆ AutoStoreLoot() [1/2]

void Player::AutoStoreLoot ( uint32  loot_id,
LootStore const &  store,
bool  broadcast = false 
)
inline
1306{ AutoStoreLoot(NULL_BAG, NULL_SLOT, loot_id, store, broadcast); }
void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const &store, bool broadcast=false)
Definition: Player.cpp:13437

References AutoStoreLoot(), NULL_BAG, and NULL_SLOT.

Referenced by AutoStoreLoot().

◆ AutoStoreLoot() [2/2]

void Player::AutoStoreLoot ( uint8  bag,
uint8  slot,
uint32  loot_id,
LootStore const &  store,
bool  broadcast = false 
)
13438{
13439 Loot loot;
13440 loot.FillLoot (loot_id, store, this, true);
13441
13442 uint32 max_slot = loot.GetMaxSlotInLootFor(this);
13443 for (uint32 i = 0; i < max_slot; ++i)
13444 {
13445 LootItem* lootItem = loot.LootItemInSlot(i, this);
13446
13447 ItemPosCountVec dest;
13448 InventoryResult msg = CanStoreNewItem(bag, slot, dest, lootItem->itemid, lootItem->count);
13449 if (msg != EQUIP_ERR_OK && slot != NULL_SLOT)
13450 msg = CanStoreNewItem(bag, NULL_SLOT, dest, lootItem->itemid, lootItem->count);
13451 if (msg != EQUIP_ERR_OK && bag != NULL_BAG)
13452 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, lootItem->itemid, lootItem->count);
13453 if (msg != EQUIP_ERR_OK)
13454 {
13455 SendEquipError(msg, nullptr, nullptr, lootItem->itemid);
13456 continue;
13457 }
13458
13459 Item* pItem = StoreNewItem(dest, lootItem->itemid, true, lootItem->randomPropertyId);
13460 SendNewItem(pItem, lootItem->count, false, false, broadcast);
13461 }
13462}
Definition: LootMgr.h:155
uint32 itemid
Definition: LootMgr.h:156
int32 randomPropertyId
Definition: LootMgr.h:159
uint8 count
Definition: LootMgr.h:163
Definition: LootMgr.h:313
uint32 GetMaxSlotInLootFor(Player *player) const
Definition: LootMgr.cpp:907
LootItem * LootItemInSlot(uint32 lootslot, Player *player, QuestItem **qitem=nullptr, QuestItem **ffaitem=nullptr, QuestItem **conditem=nullptr)
Definition: LootMgr.cpp:842
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition: LootMgr.cpp:564

References CanStoreNewItem(), LootItem::count, EQUIP_ERR_OK, Loot::FillLoot(), Loot::GetMaxSlotInLootFor(), LootItem::itemid, Loot::LootItemInSlot(), NULL_BAG, NULL_SLOT, LootItem::randomPropertyId, SendEquipError(), SendNewItem(), and StoreNewItem().

Referenced by Group::CountTheRoll(), Spell::EffectCreateItem2(), Spell::EffectCreateRandomItem(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ AutoUnequipOffhandIfNeed()

void Player::AutoUnequipOffhandIfNeed ( bool  force = false)
12417{
12419 if (!offItem)
12420 {
12422 return;
12423 }
12424
12425 // unequip offhand weapon if player doesn't have dual wield anymore
12427 force = true;
12428
12429 // need unequip offhand for 2h-weapon without TitanGrip (in any from hands)
12430 if (!force && (CanTitanGrip() || (offItem->GetTemplate()->InventoryType != INVTYPE_2HWEAPON && !IsTwoHandUsed())))
12431 {
12433 return;
12434 }
12435
12436 ItemPosCountVec off_dest;
12437 uint8 off_msg = CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false);
12438 if (off_msg == EQUIP_ERR_OK)
12439 {
12441 StoreItem(off_dest, offItem, true);
12442 }
12443 else
12444 {
12446 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
12447 offItem->DeleteFromInventoryDB(trans); // deletes item from character's inventory
12448 offItem->SaveToDB(trans); // recursive and not have transaction guard into self, item not in inventory and can be save standalone
12449
12450 std::string subject = GetSession()->GetAcoreString(LANG_NOT_EQUIPPED_ITEM);
12451 MailDraft(subject, "There were problems with equipping one or several items").AddItem(offItem).SendMailTo(trans, this, MailSender(this, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED);
12452
12453 CharacterDatabase.CommitTransaction(trans);
12454 }
12456}
@ INVTYPE_WEAPON
Definition: ItemTemplate.h:269
@ INVTYPE_WEAPONOFFHAND
Definition: ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition: ItemTemplate.h:273
uint32 InventoryType
Definition: ItemTemplate.h:632
bool CanTitanGrip() const
Definition: Player.h:2164
bool IsTwoHandUsed() const
Definition: Player.h:1355
void MoveItemFromInventory(uint8 bag, uint8 slot, bool update)
Definition: PlayerStorage.cpp:2993
void RemoveItem(uint8 bag, uint8 slot, bool update, bool swap=false)
Definition: PlayerStorage.cpp:2914
void UpdateTitansGrip()
Definition: PlayerUpdates.cpp:1794
bool CanDualWield() const
Definition: Unit.h:685
void SendMailTo(CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0, uint32 custom_expiration=0, bool deleteMailItemsFromDB=false, bool sendMail=true)
Definition: Mail.cpp:186
MailDraft & AddItem(Item *item)
Definition: Mail.cpp:94

References MailDraft::AddItem(), Unit::CanDualWield(), CanStoreItem(), CanTitanGrip(), CharacterDatabase, Item::DeleteFromInventoryDB(), EQUIP_ERR_OK, EQUIPMENT_SLOT_OFFHAND, WorldSession::GetAcoreString(), GetItemByPos(), GetSession(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_WEAPON, INVTYPE_WEAPONOFFHAND, IsTwoHandUsed(), LANG_NOT_EQUIPPED_ITEM, MAIL_CHECK_MASK_COPIED, MAIL_STATIONERY_GM, MoveItemFromInventory(), NULL_BAG, NULL_SLOT, RemoveItem(), Item::SaveToDB(), MailDraft::SendMailTo(), StoreItem(), and UpdateTitansGrip().

Referenced by _StoreOrEquipNewItem(), ActivateSpec(), Spell::EffectSummonChangeItem(), FindEquipSlot(), WorldSession::HandleAutoEquipItemOpcode(), resetTalents(), SplitItem(), StoreNewItemInBestSlots(), SwapItem(), and UpdateZone().

◆ BankItem() [1/2]

Item * Player::BankItem ( ItemPosCountVec const &  dest,
Item pItem,
bool  update 
)
inline

◆ BankItem() [2/2]

Item * Player::BankItem ( uint16  pos,
Item pItem,
bool  update 
)

◆ BindToInstance()

void Player::BindToInstance ( )
6523{
6524 InstanceSave* mapSave = sInstanceSaveMgr->GetInstanceSave(_pendingBindId);
6525 if (!mapSave) //it seems sometimes mapSave is nullptr, but I did not check why
6526 return;
6527
6529 data << uint32(0);
6530 GetSession()->SendPacket(&data);
6531 sInstanceSaveMgr->PlayerBindToInstance(this->GetGUID(), mapSave, true, this);
6532}
#define sInstanceSaveMgr
Definition: InstanceSaveMgr.h:202
@ SMSG_INSTANCE_SAVE_CREATED
Definition: Opcodes.h:745
uint32 _pendingBindId
Definition: Player.h:2951
Definition: InstanceSaveMgr.h:56

References _pendingBindId, Object::GetGUID(), GetSession(), WorldSession::SendPacket(), sInstanceSaveMgr, and SMSG_INSTANCE_SAVE_CREATED.

Referenced by WorldSession::HandleInstanceLockResponse(), and Update().

◆ BuildCreateUpdateBlockForPlayer()

void Player::BuildCreateUpdateBlockForPlayer ( UpdateData data,
Player target 
)
overridevirtual

Reimplemented from Object.

3798{
3799 if (target == this)
3800 {
3801 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
3802 {
3803 if (!m_items[i])
3804 continue;
3805
3806 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3807 }
3808
3810 {
3811 if (!m_items[i])
3812 continue;
3813
3814 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3815 }
3817 {
3818 if (!m_items[i])
3819 continue;
3820
3821 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3822 }
3823 }
3824
3826}
@ KEYRING_SLOT_START
Definition: Player.h:730
@ BANK_SLOT_BAG_END
Definition: Player.h:718
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition: Object.cpp:189

References BANK_SLOT_BAG_END, Object::BuildCreateUpdateBlockForPlayer(), CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_START, KEYRING_SLOT_START, and m_items.

Referenced by Map::SendInitSelf().

◆ BuildEnchantmentsInfoData()

void Player::BuildEnchantmentsInfoData ( WorldPacket data)
14382{
14383 uint32 slotUsedMask = 0;
14384 std::size_t slotUsedMaskPos = data->wpos();
14385 *data << uint32(slotUsedMask); // slotUsedMask < 0x80000
14386
14387 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14388 {
14390
14391 if (!item)
14392 continue;
14393
14394 slotUsedMask |= (1 << i);
14395
14396 *data << uint32(item->GetEntry()); // item entry
14397
14398 uint16 enchantmentMask = 0;
14399 std::size_t enchantmentMaskPos = data->wpos();
14400 *data << uint16(enchantmentMask); // enchantmentMask < 0x1000
14401
14402 for (uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
14403 {
14404 uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(j));
14405
14406 if (!enchId)
14407 continue;
14408
14409 enchantmentMask |= (1 << j);
14410
14411 *data << uint16(enchId); // enchantmentId?
14412 }
14413
14414 data->put<uint16>(enchantmentMaskPos, enchantmentMask);
14415
14416 *data << int16(item->GetItemRandomPropertyId()); // item random property id
14417 *data << item->GetGuidValue(ITEM_FIELD_CREATOR).WriteAsPacked(); // item creator
14418 *data << uint32(item->GetItemSuffixFactor()); // item suffix factor
14419 }
14420
14421 data->put<uint32>(slotUsedMaskPos, slotUsedMask);
14422}
@ ITEM_FIELD_CREATOR
Definition: UpdateFields.h:37
ObjectGuid GetGuidValue(uint16 index) const
Definition: Object.cpp:337
PackedGuid WriteAsPacked() const
Definition: ObjectGuid.h:316
std::size_t wpos() const
Definition: ByteBuffer.h:330
void put(std::size_t pos, T value)
Definition: ByteBuffer.h:137

References EQUIPMENT_SLOT_END, Item::GetEnchantmentId(), Object::GetEntry(), Object::GetGuidValue(), GetItemByPos(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), INVENTORY_SLOT_BAG_0, ITEM_FIELD_CREATOR, MAX_ENCHANTMENT_SLOT, ByteBuffer::put(), ByteBuffer::wpos(), and ObjectGuid::WriteAsPacked().

Referenced by WorldSession::HandleInspectOpcode().

◆ BuildEnumData()

bool Player::BuildEnumData ( PreparedQueryResult  result,
WorldPacket data 
)
static
1087{
1088 // 0 1 2 3 4 5 6 7
1089 // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.skin, characters.face, characters.hairStyle,
1090 // 8 9 10 11 12 13 14 15
1091 // characters.hairColor, characters.facialStyle, character.level, characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z,
1092 // 16 17 18 19 20 21 22 23
1093 // guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, character_banned.guid,
1094 // 24 25
1095 // characters.extra_flags, character_declinedname.genitive
1096
1097 Field* fields = result->Fetch();
1098
1099 ObjectGuid::LowType guidLow = fields[0].Get<uint32>();
1100 uint8 plrRace = fields[2].Get<uint8>();
1101 uint8 plrClass = fields[3].Get<uint8>();
1102 uint8 gender = fields[4].Get<uint8>();
1103
1104 ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>(guidLow);
1105
1106 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(plrRace, plrClass);
1107 if (!info)
1108 {
1109 LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Don't build enum.", guid.ToString());
1110 return false;
1111 }
1112 else if (!IsValidGender(gender))
1113 {
1114 LOG_ERROR("entities.player", "Player ({}) has incorrect gender ({}), don't build enum.", guid.ToString(), gender);
1115 return false;
1116 }
1117
1118 *data << guid;
1119 *data << fields[1].Get<std::string>(); // name
1120 *data << uint8(plrRace); // race
1121 *data << uint8(plrClass); // class
1122 *data << uint8(gender); // gender
1123
1124 uint8 skin = fields[5].Get<uint8>();
1125 uint8 face = fields[6].Get<uint8>();
1126 uint8 hairStyle = fields[7].Get<uint8>();
1127 uint8 hairColor = fields[8].Get<uint8>();
1128 uint8 facialStyle = fields[9].Get<uint8>();
1129
1130 uint32 charFlags = 0;
1131 uint32 playerFlags = fields[17].Get<uint32>();
1132 uint16 atLoginFlags = fields[18].Get<uint16>();
1133 uint32 zone = (atLoginFlags & AT_LOGIN_FIRST) != 0 ? 0 : fields[11].Get<uint16>(); // if first login do not show the zone
1134
1135 *data << uint8(skin);
1136 *data << uint8(face);
1137 *data << uint8(hairStyle);
1138 *data << uint8(hairColor);
1139 *data << uint8(facialStyle);
1140
1141 *data << uint8(fields[10].Get<uint8>()); // level
1142 *data << uint32(zone); // zone
1143 *data << uint32(fields[12].Get<uint16>()); // map
1144
1145 *data << fields[13].Get<float>(); // x
1146 *data << fields[14].Get<float>(); // y
1147 *data << fields[15].Get<float>(); // z
1148
1149 *data << uint32(fields[16].Get<uint32>()); // guild id
1150
1151 if (atLoginFlags & AT_LOGIN_RESURRECT)
1152 playerFlags &= ~PLAYER_FLAGS_GHOST;
1153 if (playerFlags & PLAYER_FLAGS_HIDE_HELM)
1154 charFlags |= CHARACTER_FLAG_HIDE_HELM;
1155 if (playerFlags & PLAYER_FLAGS_HIDE_CLOAK)
1156 charFlags |= CHARACTER_FLAG_HIDE_CLOAK;
1157 if (playerFlags & PLAYER_FLAGS_GHOST)
1158 charFlags |= CHARACTER_FLAG_GHOST;
1159 if (atLoginFlags & AT_LOGIN_RENAME)
1160 charFlags |= CHARACTER_FLAG_RENAME;
1161 if (fields[23].Get<uint32>())
1163 if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED))
1164 {
1165 if (!fields[25].Get<std::string>().empty())
1166 charFlags |= CHARACTER_FLAG_DECLINED;
1167 }
1168 else
1169 charFlags |= CHARACTER_FLAG_DECLINED;
1170
1171 *data << uint32(charFlags); // character flags
1172
1173 // character customize flags
1174 if (atLoginFlags & AT_LOGIN_CUSTOMIZE)
1176 else if (atLoginFlags & AT_LOGIN_CHANGE_FACTION)
1178 else if (atLoginFlags & AT_LOGIN_CHANGE_RACE)
1180 else
1182
1183 // First login
1184 *data << uint8(atLoginFlags & AT_LOGIN_FIRST ? 1 : 0);
1185
1186 // Pets info
1187 uint32 petDisplayId = 0;
1188 uint32 petLevel = 0;
1189 uint32 petFamily = 0;
1190
1191 // show pet at selection character in character list only for non-ghost character
1192 if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (plrClass == CLASS_WARLOCK || plrClass == CLASS_HUNTER || (plrClass == CLASS_DEATH_KNIGHT && (fields[21].Get<uint32>()&PLAYER_EXTRA_SHOW_DK_PET))))
1193 {
1194 uint32 entry = fields[19].Get<uint32>();
1195 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(entry);
1196 if (creatureInfo)
1197 {
1198 petDisplayId = fields[20].Get<uint32>();
1199 petLevel = fields[21].Get<uint16>();
1200 petFamily = creatureInfo->family;
1201 }
1202 }
1203
1204 *data << uint32(petDisplayId);
1205 *data << uint32(petLevel);
1206 *data << uint32(petFamily);
1207
1208 std::vector<std::string_view> equipment = Acore::Tokenize(fields[22].Get<std::string_view>(), ' ', false);
1209 for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot)
1210 {
1211 uint32 const visualBase = slot * 2;
1212 Optional<uint32> itemId;
1213
1214 if (visualBase < equipment.size())
1215 {
1216 itemId = Acore::StringTo<uint32>(equipment[visualBase]);
1217 }
1218
1219 ItemTemplate const* proto = nullptr;
1220 if (itemId)
1221 {
1222 proto = sObjectMgr->GetItemTemplate(*itemId);
1223 }
1224
1225 if (!proto)
1226 {
1227 if (!itemId || *itemId)
1228 {
1229 LOG_WARN("entities.player.loading", "Player {} has invalid equipment '{}' in `equipmentcache` at index {}. Skipped.",
1230 guid.ToString(), (visualBase < equipment.size()) ? equipment[visualBase] : "<none>", visualBase);
1231 }
1232
1233 *data << uint32(0);
1234 *data << uint8(0);
1235 *data << uint32(0);
1236
1237 continue;
1238 }
1239
1240 SpellItemEnchantmentEntry const* enchant = nullptr;
1241
1242 Optional<uint32> enchants = {};
1243 if ((visualBase + 1) < equipment.size())
1244 {
1245 enchants = Acore::StringTo<uint32>(equipment[visualBase + 1]);
1246 }
1247
1248 if (!enchants)
1249 {
1250 LOG_WARN("entities.player.loading", "Player {} has invalid enchantment info '{}' in `equipmentcache` at index {}. Skipped.",
1251 guid.ToString(), ((visualBase + 1) < equipment.size()) ? equipment[visualBase + 1] : "<none>", visualBase + 1);
1252
1253 enchants = 0;
1254 }
1255
1256 for (uint8 enchantSlot = PERM_ENCHANTMENT_SLOT; enchantSlot <= TEMP_ENCHANTMENT_SLOT; ++enchantSlot)
1257 {
1258 // values stored in 2 uint16
1259 uint32 enchantId = 0x0000FFFF & ((*enchants) >> enchantSlot * 16);
1260 if (!enchantId)
1261 {
1262 continue;
1263 }
1264
1265 enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId);
1266 if (enchant)
1267 {
1268 break;
1269 }
1270 }
1271
1272 *data << uint32(proto->DisplayInfoID);
1273 *data << uint8(proto->InventoryType);
1274 *data << uint32(enchant ? enchant->aura_id : 0);
1275 }
1276
1277 return true;
1278}
@ CHAR_CUSTOMIZE_FLAG_RACE
Definition: Player.cpp:136
@ CHAR_CUSTOMIZE_FLAG_NONE
Definition: Player.cpp:133
@ CHAR_CUSTOMIZE_FLAG_FACTION
Definition: Player.cpp:135
@ CHAR_CUSTOMIZE_FLAG_CUSTOMIZE
Definition: Player.cpp:134
@ CHARACTER_FLAG_GHOST
Definition: Player.cpp:110
@ CHARACTER_FLAG_DECLINED
Definition: Player.cpp:122
@ CHARACTER_FLAG_HIDE_HELM
Definition: Player.cpp:107
@ CHARACTER_FLAG_HIDE_CLOAK
Definition: Player.cpp:108
@ CHARACTER_FLAG_LOCKED_BY_BILLING
Definition: Player.cpp:121
@ CHARACTER_FLAG_RENAME
Definition: Player.cpp:111
@ PLAYER_EXTRA_SHOW_DK_PET
Definition: Player.h:593
@ PLAYER_FLAGS_HIDE_CLOAK
Definition: Player.h:485
@ PLAYER_FLAGS_GHOST
Definition: Player.h:478
@ PLAYER_FLAGS_HIDE_HELM
Definition: Player.h:484
@ AT_LOGIN_FIRST
Definition: Player.h:605
@ AT_LOGIN_RESURRECT
Definition: Player.h:611
@ AT_LOGIN_CUSTOMIZE
Definition: Player.h:603
@ AT_LOGIN_RENAME
Definition: Player.h:600
@ AT_LOGIN_CHANGE_RACE
Definition: Player.h:607
@ AT_LOGIN_CHANGE_FACTION
Definition: Player.h:606
@ CONFIG_DECLINED_NAMES_USED
Definition: IWorld.h:113
@ CLASS_HUNTER
Definition: SharedDefines.h:143
@ CLASS_WARLOCK
Definition: SharedDefines.h:149
Definition: CreatureData.h:189
uint32 DisplayInfoID
Definition: ItemTemplate.h:625
static bool IsValidGender(uint8 Gender)
Definition: Player.h:1561
uint32 aura_id
Definition: DBCStructure.h:1850

References AT_LOGIN_CHANGE_FACTION, AT_LOGIN_CHANGE_RACE, AT_LOGIN_CUSTOMIZE, AT_LOGIN_FIRST, AT_LOGIN_RENAME, AT_LOGIN_RESURRECT, SpellItemEnchantmentEntry::aura_id, CHAR_CUSTOMIZE_FLAG_CUSTOMIZE, CHAR_CUSTOMIZE_FLAG_FACTION, CHAR_CUSTOMIZE_FLAG_NONE, CHAR_CUSTOMIZE_FLAG_RACE, CHARACTER_FLAG_DECLINED, CHARACTER_FLAG_GHOST, CHARACTER_FLAG_HIDE_CLOAK, CHARACTER_FLAG_HIDE_HELM, CHARACTER_FLAG_LOCKED_BY_BILLING, CHARACTER_FLAG_RENAME, CLASS_DEATH_KNIGHT, CLASS_HUNTER, CLASS_WARLOCK, CONFIG_DECLINED_NAMES_USED, ItemTemplate::DisplayInfoID, Field::Get(), INVENTORY_SLOT_BAG_END, ItemTemplate::InventoryType, IsValidGender(), LOG_ERROR, LOG_WARN, PERM_ENCHANTMENT_SLOT, PLAYER_EXTRA_SHOW_DK_PET, PLAYER_FLAGS_GHOST, PLAYER_FLAGS_HIDE_CLOAK, PLAYER_FLAGS_HIDE_HELM, sObjectMgr, sSpellItemEnchantmentStore, sWorld, TEMP_ENCHANTMENT_SLOT, and Acore::Tokenize().

Referenced by WorldSession::HandleCharEnum().

◆ BuildPetTalentsInfoData()

void Player::BuildPetTalentsInfoData ( WorldPacket data)
14299{
14300 uint32 unspentTalentPoints = 0;
14301 std::size_t pointsPos = data->wpos();
14302 *data << uint32(unspentTalentPoints); // [PH], unspentTalentPoints
14303
14304 uint8 talentIdCount = 0;
14305 std::size_t countPos = data->wpos();
14306 *data << uint8(talentIdCount); // [PH], talentIdCount
14307
14308 Pet* pet = GetPet();
14309 if (!pet)
14310 return;
14311
14312 unspentTalentPoints = pet->GetFreeTalentPoints();
14313
14314 data->put<uint32>(pointsPos, unspentTalentPoints); // put real points
14315
14316 CreatureTemplate const* ci = pet->GetCreatureTemplate();
14317 if (!ci)
14318 return;
14319
14320 CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
14321 if (!pet_family || pet_family->petTalentType < 0)
14322 return;
14323
14324 for (uint32 talentTabId = 1; talentTabId < sTalentTabStore.GetNumRows(); ++talentTabId)
14325 {
14326 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentTabId);
14327 if (!talentTabInfo)
14328 continue;
14329
14330 if (!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
14331 continue;
14332
14333 for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
14334 {
14335 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14336 if (!talentInfo)
14337 continue;
14338
14339 // skip another tab talents
14340 if (talentInfo->TalentTab != talentTabId)
14341 continue;
14342
14343 // find max talent rank (0~4)
14344 int8 curtalent_maxrank = -1;
14345 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
14346 {
14347 if (talentInfo->RankID[rank] && pet->HasSpell(talentInfo->RankID[rank]))
14348 {
14349 curtalent_maxrank = rank;
14350 break;
14351 }
14352 }
14353
14354 // not learned talent
14355 if (curtalent_maxrank < 0)
14356 continue;
14357
14358 *data << uint32(talentInfo->TalentID); // Talent.dbc
14359 *data << uint8(curtalent_maxrank); // talentMaxRank (0-4)
14360
14361 ++talentIdCount;
14362 }
14363
14364 data->put<uint8>(countPos, talentIdCount); // put real count
14365
14366 break;
14367 }
14368}
DBCStorage< TalentTabEntry > sTalentTabStore(TalentTabEntryfmt)
DBCStorage< CreatureFamilyEntry > sCreatureFamilyStore(CreatureFamilyfmt)
#define MAX_TALENT_RANK
Definition: DBCStructure.h:1918
std::int8_t int8
Definition: Define.h:105
CreatureTemplate const * GetCreatureTemplate() const
Definition: Creature.h:206
uint8 GetFreeTalentPoints()
Definition: Pet.h:131
bool HasSpell(uint32 spell) const override
Definition: Pet.cpp:2340
Definition: DBCStructure.h:754
int32 petTalentType
Definition: DBCStructure.h:762
uint32 TalentTab
Definition: DBCStructure.h:1925
Definition: DBCStructure.h:1940
uint32 petTalentMask
Definition: DBCStructure.h:1947

References Creature::GetCreatureTemplate(), Pet::GetFreeTalentPoints(), GetPet(), Pet::HasSpell(), MAX_TALENT_RANK, TalentTabEntry::petTalentMask, CreatureFamilyEntry::petTalentType, ByteBuffer::put(), TalentEntry::RankID, sCreatureFamilyStore, sTalentStore, sTalentTabStore, TalentEntry::TalentID, TalentEntry::TalentTab, and ByteBuffer::wpos().

Referenced by SendTalentsInfoData().

◆ BuildPlayerRepop()

void Player::BuildPlayerRepop ( )
4368{
4370 data << GetPackGUID();
4371 GetSession()->SendPacket(&data);
4372 if (getRace(true) == RACE_NIGHTELF)
4373 {
4374 CastSpell(this, 20584, true);
4375 }
4376 CastSpell(this, 8326, true);
4377
4378 // there must be SMSG.FORCE_RUN_SPEED_CHANGE, SMSG.FORCE_SWIM_SPEED_CHANGE, SMSG.MOVE_WATER_WALK
4379 // there must be SMSG.STOP_MIRROR_TIMER
4380
4381 // the player cannot have a corpse already on current map, only bones which are not returned by GetCorpse
4382 WorldLocation corpseLocation = GetCorpseLocation();
4383 if (GetCorpse() && corpseLocation.GetMapId() == GetMapId())
4384 {
4385 LOG_ERROR("entities.player", "BuildPlayerRepop: player {} ({}) already has a corpse", GetName(), GetGUID().ToString());
4386 return;
4387 }
4388
4389 // create a corpse and place it at the player's location
4390 Corpse* corpse = CreateCorpse();
4391 if (!corpse)
4392 {
4393 LOG_ERROR("entities.player", "Error creating corpse for Player {} [{}]", GetName(), GetGUID().ToString());
4394 return;
4395 }
4396 GetMap()->AddToMap(corpse);
4397 SetHealth(1); // convert player body to ghost
4399 SetWaterWalking(true);
4400 if (!GetSession()->isLogingOut())
4401 {
4403 }
4404 RemoveUnitFlag(UNIT_FLAG_SKINNABLE); // BG - remove insignia related
4405 int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
4406 if (corpseReclaimDelay >= 0)
4407 {
4408 SendCorpseReclaimDelay(corpseReclaimDelay);
4409 }
4410 corpse->ResetGhostTime(); // to prevent cheating
4411 StopMirrorTimers(); // disable timers on bars
4413 sScriptMgr->OnPlayerReleasedGhost(this);
4414}
@ UNIT_FIELD_BYTES_1
Definition: UpdateFields.h:131
@ MOVE_UNROOT
Definition: Player.h:457
@ MOVE_WATER_WALK
Definition: Player.h:458
@ UNIT_BYTE1_FLAG_ALWAYS_STAND
Definition: UnitDefines.h:59
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition: UnitDefines.h:26
@ UNIT_FLAG_SKINNABLE
Definition: UnitDefines.h:255
@ RACE_NIGHTELF
Definition: SharedDefines.h:74
@ SMSG_PRE_RESURRECT
Definition: Opcodes.h:1202
Definition: Corpse.h:49
void ResetGhostTime()
Definition: Corpse.cpp:195
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:750
PackedGuid const & GetPackGUID() const
Definition: Object.h:111
Map * GetMap() const
Definition: Object.h:531
void SendCorpseReclaimDelay(uint32 delay)
Definition: Player.cpp:12925
void StopMirrorTimers()
Definition: Player.h:2032
WorldLocation GetCorpseLocation() const
Definition: Player.h:2016
Corpse * GetCorpse() const
Definition: Player.cpp:4649
bool SetWaterWalking(bool apply, bool packetOnly=false) override
Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for...
Definition: Player.cpp:15913
int32 CalculateCorpseReclaimDelay(bool load=false)
Definition: Player.cpp:12884
Corpse * CreateCorpse()
Definition: Player.cpp:4534
void SetMovement(PlayerMovementType pType)
Definition: Player.cpp:4337
void SetHealth(uint32 val)
Definition: Unit.cpp:15416
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:827
bool AddToMap(T *, bool checkTransport=false)
Definition: Map.cpp:555

References Map::AddToMap(), CalculateCorpseReclaimDelay(), Unit::CastSpell(), CreateCorpse(), GetCorpse(), GetCorpseLocation(), Object::GetGUID(), WorldObject::GetMap(), WorldLocation::GetMapId(), WorldObject::GetName(), Object::GetPackGUID(), Unit::getRace(), GetSession(), LOG_ERROR, MOVE_UNROOT, MOVE_WATER_WALK, RACE_NIGHTELF, Unit::RemoveUnitFlag(), Corpse::ResetGhostTime(), SendCorpseReclaimDelay(), WorldSession::SendPacket(), Object::SetByteValue(), Unit::SetHealth(), SetMovement(), SetWaterWalking(), SMSG_PRE_RESURRECT, sScriptMgr, StopMirrorTimers(), Position::ToString(), UNIT_BYTE1_FLAG_ALWAYS_STAND, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, and UNIT_FLAG_SKINNABLE.

Referenced by Spell::EffectStuck(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleRepopRequestOpcode(), WorldSession::LogoutPlayer(), RemovedInsignia(), and Update().

◆ BuildPlayerTalentsInfoData()

void Player::BuildPlayerTalentsInfoData ( WorldPacket data)
14265{
14266 *data << uint32(GetFreeTalentPoints()); // unspentTalentPoints
14267 *data << uint8(m_specsCount); // talent group count (0, 1 or 2)
14268 *data << uint8(m_activeSpec); // talent group index (0 or 1)
14269
14272
14273 for (uint32 specIdx = 0; specIdx < m_specsCount; ++specIdx)
14274 {
14275 uint8 talentIdCount = 0;
14276 std::size_t pos = data->wpos();
14277 *data << uint8(talentIdCount); // [PH], talentIdCount
14278
14279 const PlayerTalentMap& talentMap = GetTalentMap();
14280 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
14281 if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first))
14282 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(specIdx)) // pussywizard
14283 {
14284 *data << uint32(talentPos->talent_id); // Talent.dbc
14285 *data << uint8(talentPos->rank); // talentMaxRank (0-4)
14286 ++talentIdCount;
14287 }
14288
14289 data->put<uint8>(pos, talentIdCount); // put real count
14290
14291 *data << uint8(MAX_GLYPH_SLOT_INDEX); // glyphs count
14292
14293 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
14294 *data << uint16(m_Glyphs[specIdx][i]); // GlyphProperties.dbc
14295 }
14296}
std::unordered_map< uint32, PlayerTalent * > PlayerTalentMap
Definition: Player.h:192
uint32 GetFreeTalentPoints() const
Definition: Player.h:1698
const PlayerTalentMap & GetTalentMap() const
Definition: Player.h:2587

References GetFreeTalentPoints(), GetTalentMap(), GetTalentSpellPos(), m_activeSpec, m_Glyphs, m_specsCount, MAX_GLYPH_SLOT_INDEX, MAX_TALENT_SPECS, PLAYERSPELL_REMOVED, ByteBuffer::put(), and ByteBuffer::wpos().

Referenced by WorldSession::HandleInspectOpcode(), and SendTalentsInfoData().

◆ BuyItemFromVendorSlot()

bool Player::BuyItemFromVendorSlot ( ObjectGuid  vendorguid,
uint32  vendorslot,
uint32  item,
uint8  count,
uint8  bag,
uint8  slot 
)
10666{
10667 sScriptMgr->OnBeforeBuyItemFromVendor(this, vendorguid, vendorslot, item, count, bag, slot);
10668
10669 // this check can be used from the hook to implement a custom vendor process
10670 if (item == 0)
10671 return true;
10672
10673 // cheating attempt
10674 if (count < 1) count = 1;
10675
10676 // cheating attempt
10677 if (slot > MAX_BAG_SIZE && slot != NULL_SLOT)
10678 return false;
10679
10680 if (!IsAlive())
10681 return false;
10682
10683 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
10684 if (!pProto)
10685 {
10686 SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);
10687 return false;
10688 }
10689
10690 if (!(pProto->AllowableClass & getClassMask()) && pProto->Bonding == BIND_WHEN_PICKED_UP && !IsGameMaster())
10691 {
10692 SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);
10693 return false;
10694 }
10695
10697 {
10698 return false;
10699 }
10700
10701 Creature* creature = GetNPCIfCanInteractWith(vendorguid, UNIT_NPC_FLAG_VENDOR);
10702 if (!creature)
10703 {
10704 LOG_DEBUG("network", "WORLD: BuyItemFromVendor - Unit ({}) not found or you can't interact with him.", vendorguid.ToString());
10705 SendBuyError(BUY_ERR_DISTANCE_TOO_FAR, nullptr, item, 0);
10706 return false;
10707 }
10708
10709 ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), item);
10710 if (!sConditionMgr->IsObjectMeetToConditions(this, creature, conditions))
10711 {
10712 //LOG_DEBUG("condition", "BuyItemFromVendor: conditions not met for creature entry {} item {}", creature->GetEntry(), item);
10713 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10714 return false;
10715 }
10716
10717 VendorItemData const* vItems = GetSession()->GetCurrentVendor() ? sObjectMgr->GetNpcVendorItemList(GetSession()->GetCurrentVendor()) : creature->GetVendorItems();
10718 if (!vItems || vItems->Empty())
10719 {
10720 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10721 return false;
10722 }
10723
10724 if (vendorslot >= vItems->GetItemCount())
10725 {
10726 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10727 return false;
10728 }
10729
10730 VendorItem const* crItem = vItems->GetItem(vendorslot);
10731 // store diff item (cheating)
10732 if (!crItem || crItem->item != item)
10733 {
10734 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10735 return false;
10736 }
10737
10738 // check current item amount if it limited
10739 if (crItem->maxcount != 0)
10740 {
10741 if (creature->GetVendorItemCurrentCount(crItem) < pProto->BuyCount * count)
10742 {
10743 SendBuyError(BUY_ERR_ITEM_ALREADY_SOLD, creature, item, 0);
10744 return false;
10745 }
10746 }
10747
10749 {
10750 SendBuyError(BUY_ERR_REPUTATION_REQUIRE, creature, item, 0);
10751 return false;
10752 }
10753
10754 if (crItem->ExtendedCost)
10755 {
10756 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost);
10757 if (!iece)
10758 {
10759 LOG_ERROR("entities.player", "Item {} have wrong ExtendedCost field value {}", pProto->ItemId, crItem->ExtendedCost);
10760 return false;
10761 }
10762
10763 // honor points price
10764 if (GetHonorPoints() < (iece->reqhonorpoints * count))
10765 {
10767 return false;
10768 }
10769
10770 // arena points price
10771 if (GetArenaPoints() < (iece->reqarenapoints * count))
10772 {
10774 return false;
10775 }
10776
10777 // item base price
10778 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
10779 {
10780 if (iece->reqitem[i] && !HasItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count)))
10781 {
10783 return false;
10784 }
10785 }
10786
10787 // check for personal arena rating requirement
10789 {
10790 // probably not the proper equip err
10791 SendEquipError(EQUIP_ERR_CANT_EQUIP_RANK, nullptr, nullptr);
10792 return false;
10793 }
10794 }
10795
10796 uint32 price = 0;
10797 if (crItem->IsGoldRequired(pProto) && pProto->BuyPrice > 0) //Assume price cannot be negative (do not know why it is int32)
10798 {
10799 uint32 maxCount = MAX_MONEY_AMOUNT / pProto->BuyPrice;
10800 if ((uint32)count > maxCount)
10801 {
10802 LOG_ERROR("entities.player", "Player {} tried to buy {} item id {}, causing overflow", GetName(), (uint32)count, pProto->ItemId);
10803 count = (uint8)maxCount;
10804 }
10805 price = pProto->BuyPrice * count; //it should not exceed MAX_MONEY_AMOUNT
10806
10807 // reputation discount
10808 price = uint32(std::floor(price * GetReputationPriceDiscount(creature)));
10809
10810 if (!HasEnoughMoney(price))
10811 {
10812 SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, item, 0);
10813 return false;
10814 }
10815 }
10816
10817 if ((bag == NULL_BAG && slot == NULL_SLOT) || IsInventoryPos(bag, slot))
10818 {
10819 if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, true))
10820 return false;
10821 }
10822 else if (IsEquipmentPos(bag, slot))
10823 {
10824 if (pProto->BuyCount * count != 1)
10825 {
10827 return false;
10828 }
10829 if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, false))
10830 return false;
10831 }
10832 else
10833 {
10835 return false;
10836 }
10837
10838 return crItem->maxcount != 0;
10839}
@ EQUIP_ERR_CANT_EQUIP_RANK
Definition: Item.h:110
@ EQUIP_ERR_ITEM_CANT_BE_EQUIPPED
Definition: Item.h:67
@ EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS
Definition: Item.h:116
@ EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT
Definition: Item.h:50
@ EQUIP_ERR_VENDOR_MISSING_TURNINS
Definition: Item.h:115
@ EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS
Definition: Item.h:117
@ BUY_ERR_CANT_FIND_ITEM
Definition: Item.h:141
@ BUY_ERR_DISTANCE_TOO_FAR
Definition: Item.h:145
@ BUY_ERR_NOT_ENOUGHT_MONEY
Definition: Item.h:143
@ BUY_ERR_REPUTATION_REQUIRE
Definition: Item.h:149
@ BUY_ERR_ITEM_ALREADY_SOLD
Definition: Item.h:142
@ ITEM_FLAG2_FACTION_HORDE
Definition: ItemTemplate.h:183
@ ITEM_FLAG2_FACTION_ALLIANCE
Definition: ItemTemplate.h:184
#define MAX_BAG_SIZE
Definition: Bag.h:22
#define MAX_MONEY_AMOUNT
Definition: Player.h:930
@ UNIT_NPC_FLAG_VENDOR
Definition: UnitDefines.h:301
#define sConditionMgr
Definition: ConditionMgr.h:289
std::list< Condition * > ConditionList
Definition: ConditionMgr.h:236
@ TEAM_ALLIANCE
Definition: SharedDefines.h:760
@ TEAM_HORDE
Definition: SharedDefines.h:761
Definition: Creature.h:46
VendorItemData const * GetVendorItems() const
Definition: Creature.cpp:3050
uint32 GetVendorItemCurrentCount(VendorItem const *vItem)
Definition: Creature.cpp:3055
Definition: CreatureData.h:457
uint32 ExtendedCost
Definition: CreatureData.h:464
bool IsGoldRequired(ItemTemplate const *pProto) const
Definition: CreatureData.h:467
uint32 item
Definition: CreatureData.h:461
uint32 maxcount
Definition: CreatureData.h:462
Definition: CreatureData.h:472
VendorItem * GetItem(uint32 slot) const
Definition: CreatureData.h:475
bool Empty() const
Definition: CreatureData.h:482
uint8 GetItemCount() const
Definition: CreatureData.h:483
uint32 BuyCount
Definition: ItemTemplate.h:629
uint32 AllowableClass
Definition: ItemTemplate.h:633
int32 BuyPrice
Definition: ItemTemplate.h:630
bool HasFlag2(ItemFlags2 flag) const
Definition: ItemTemplate.h:828
uint32 RequiredReputationRank
Definition: ItemTemplate.h:643
uint32 RequiredReputationFaction
Definition: ItemTemplate.h:642
uint32 ItemId
Definition: ItemTemplate.h:620
bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const *pProto, Creature *pVendor, VendorItem const *crItem, bool bStore)
Definition: Player.cpp:10599
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition: PlayerStorage.cpp:678
bool HasEnoughMoney(uint32 amount) const
Definition: Player.h:1595
Creature * GetNPCIfCanInteractWith(ObjectGuid guid, uint32 npcflagmask)
Definition: Player.cpp:2075
bool IsGameMaster() const
Definition: Player.h:1158
ReputationRank GetReputationRank(uint32 faction_id) const
Definition: Player.cpp:5819
void SendBuyError(BuyResult msg, Creature *creature, uint32 item, uint32 param)
Definition: PlayerStorage.cpp:4079
uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const
If trans is specified, arena point save query will be added to trans.
Definition: Player.cpp:10841
uint32 GetCurrentVendor() const
Definition: WorldSession.h:366
uint32 reqarenaslot
Definition: DBCStructure.h:1189
uint32 reqpersonalarenarating
Definition: DBCStructure.h:1192

References _StoreOrEquipNewItem(), ItemTemplate::AllowableClass, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, BUY_ERR_CANT_FIND_ITEM, BUY_ERR_DISTANCE_TOO_FAR, BUY_ERR_ITEM_ALREADY_SOLD, BUY_ERR_NOT_ENOUGHT_MONEY, BUY_ERR_REPUTATION_REQUIRE, ItemTemplate::BuyCount, ItemTemplate::BuyPrice, VendorItemData::Empty(), EQUIP_ERR_CANT_EQUIP_RANK, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS, EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS, EQUIP_ERR_VENDOR_MISSING_TURNINS, VendorItem::ExtendedCost, GetArenaPoints(), Unit::getClassMask(), WorldSession::GetCurrentVendor(), Object::GetEntry(), GetHonorPoints(), VendorItemData::GetItem(), VendorItemData::GetItemCount(), GetMaxPersonalArenaRatingRequirement(), WorldObject::GetName(), GetNPCIfCanInteractWith(), GetReputationPriceDiscount(), GetReputationRank(), GetSession(), GetTeamId(), Creature::GetVendorItemCurrentCount(), Creature::GetVendorItems(), HasEnoughMoney(), ItemTemplate::HasFlag2(), HasItemCount(), Unit::IsAlive(), IsEquipmentPos(), IsGameMaster(), VendorItem::IsGoldRequired(), IsInventoryPos(), VendorItem::item, ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ItemTemplate::ItemId, LOG_DEBUG, LOG_ERROR, MAX_BAG_SIZE, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, MAX_MONEY_AMOUNT, VendorItem::maxcount, NULL_BAG, NULL_SLOT, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqarenaslot, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, ItemExtendedCostEntry::reqpersonalarenarating, ItemTemplate::RequiredReputationFaction, ItemTemplate::RequiredReputationRank, sConditionMgr, SendBuyError(), SendEquipError(), sItemExtendedCostStore, sObjectMgr, sScriptMgr, TEAM_ALLIANCE, TEAM_HORDE, ObjectGuid::ToString(), and UNIT_NPC_FLAG_VENDOR.

Referenced by WorldSession::HandleBuyItemInSlotOpcode(), and WorldSession::HandleBuyItemOpcode().

◆ CalcRage()

void Player::CalcRage ( uint32  damage,
bool  attacker 
)

◆ CalculateCorpseReclaimDelay()

int32 Player::CalculateCorpseReclaimDelay ( bool  load = false)
12885{
12886 Corpse* corpse = GetCorpse();
12887
12888 if (load && !corpse)
12889 return -1;
12890
12891 bool pvp = corpse ? corpse->GetType() == CORPSE_RESURRECTABLE_PVP : m_ExtraFlags & PLAYER_EXTRA_PVP_DEATH;
12892
12893 uint32 delay;
12894
12895 if (load)
12896 {
12897 if (corpse->GetGhostTime() > m_deathExpireTime)
12898 return -1;
12899
12900 uint64 count = 0;
12901
12902 if ((pvp && sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP)) ||
12903 (!pvp && sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)))
12904 {
12905 count = (m_deathExpireTime - corpse->GetGhostTime()) / DEATH_EXPIRE_STEP;
12906
12907 if (count >= MAX_DEATH_COUNT)
12908 count = MAX_DEATH_COUNT - 1;
12909 }
12910
12911 time_t expected_time = corpse->GetGhostTime() + copseReclaimDelay[count];
12912 time_t now = GameTime::GetGameTime().count();
12913
12914 if (now >= expected_time)
12915 return -1;
12916
12917 delay = expected_time - now;
12918 }
12919 else
12920 delay = GetCorpseReclaimDelay(pvp);
12921
12922 return delay * IN_MILLISECONDS;
12923}
@ CORPSE_RESURRECTABLE_PVP
Definition: Corpse.h:30
static uint32 copseReclaimDelay[MAX_DEATH_COUNT]
Definition: Player.cpp:139
@ PLAYER_EXTRA_PVP_DEATH
Definition: Player.h:592
#define DEATH_EXPIRE_STEP
Definition: Player.h:75
#define MAX_DEATH_COUNT
Definition: Player.h:76
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP
Definition: IWorld.h:108
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE
Definition: IWorld.h:109
time_t const & GetGhostTime() const
Definition: Corpse.h:70
CorpseType GetType() const
Definition: Corpse.h:72
uint32 GetCorpseReclaimDelay(bool pvp) const
Definition: Player.cpp:12867

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, copseReclaimDelay, CORPSE_RESURRECTABLE_PVP, DEATH_EXPIRE_STEP, GetCorpse(), GetCorpseReclaimDelay(), GameTime::GetGameTime(), Corpse::GetGhostTime(), Corpse::GetType(), IN_MILLISECONDS, m_deathExpireTime, m_ExtraFlags, MAX_DEATH_COUNT, PLAYER_EXTRA_PVP_DEATH, and sWorld.

Referenced by BuildPlayerRepop(), and KillPlayer().

◆ CalculateMinMaxDamage()

void Player::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex 
)
overridevirtual

Implements Unit.

528{
529 // Only proto damage, not affected by any mods
530 if (damageIndex != 0)
531 {
532 minDamage = 0.0f;
533 maxDamage = 0.0f;
534
535 if (!IsInFeralForm() && CanUseAttackType(attType))
536 {
537 minDamage = GetWeaponDamageRange(attType, MINDAMAGE, damageIndex);
538 maxDamage = GetWeaponDamageRange(attType, MAXDAMAGE, damageIndex);
539 }
540
541 return;
542 }
543
544 UnitMods unitMod;
545
546 switch (attType)
547 {
548 case BASE_ATTACK:
549 default:
550 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
551 break;
552 case OFF_ATTACK:
553 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
554 break;
555 case RANGED_ATTACK:
556 unitMod = UNIT_MOD_DAMAGE_RANGED;
557 break;
558 }
559
560 float attackSpeedMod = GetAPMultiplier(attType, normalized);
561
562 float baseValue = GetModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType) / 14.0f * attackSpeedMod;
563 float basePct = GetModifierValue(unitMod, BASE_PCT);
564 float totalValue = GetModifierValue(unitMod, TOTAL_VALUE);
565 float totalPct = addTotalPct ? GetModifierValue(unitMod, TOTAL_PCT) : 1.0f;
566
567 float weaponMinDamage = GetWeaponDamageRange(attType, MINDAMAGE);
568 float weaponMaxDamage = GetWeaponDamageRange(attType, MAXDAMAGE);
569
570 if (IsInFeralForm()) // check if player is druid and in cat or bear forms
571 {
572 uint8 lvl = GetLevel();
573 if (lvl > 60)
574 lvl = 60;
575
576 weaponMinDamage = lvl * 0.85f * attackSpeedMod;
577 weaponMaxDamage = lvl * 1.25f * attackSpeedMod;
578 }
579 else if (!CanUseAttackType(attType)) // check if player not in form but still can't use (disarm case)
580 {
581 // cannot use ranged/off attack, set values to 0
582 if (attType != BASE_ATTACK)
583 {
584 minDamage = 0.0f;
585 maxDamage = 0.0f;
586 return;
587 }
588 weaponMinDamage = BASE_MINDAMAGE;
589 weaponMaxDamage = BASE_MAXDAMAGE;
590 }
591 else if (attType == RANGED_ATTACK) // add ammo DPS to ranged damage
592 {
593 weaponMinDamage += GetAmmoDPS() * attackSpeedMod;
594 weaponMaxDamage += GetAmmoDPS() * attackSpeedMod;
595 }
596
597 minDamage = ((weaponMinDamage + baseValue) * basePct + totalValue) * totalPct;
598 maxDamage = ((weaponMaxDamage + baseValue) * basePct + totalValue) * totalPct;
599
600 // pussywizard: crashfix (casting negative to uint => min > max => assertion in urand)
601 if (minDamage < 0.0f || minDamage > 1000000000.0f)
602 minDamage = 0.0f;
603 if (maxDamage < 0.0f || maxDamage > 1000000000.0f)
604 maxDamage = 0.0f;
605 if (minDamage > maxDamage)
606 minDamage = maxDamage;
607}
@ BASE_PCT
Definition: Unit.h:127
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition: Unit.cpp:15366
float GetModifierValue(UnitMods unitMod, UnitModifierType modifierType) const
Definition: Unit.cpp:15226
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition: Unit.cpp:17157

References BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, Unit::CanUseAttackType(), GetAmmoDPS(), Unit::GetAPMultiplier(), Unit::GetLevel(), Unit::GetModifierValue(), Unit::GetTotalAttackPowerValue(), Unit::GetWeaponDamageRange(), Unit::IsInFeralForm(), MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, and UNIT_MOD_DAMAGE_RANGED.

◆ CalculateQuestRewardXP()

uint32 Player::CalculateQuestRewardXP ( Quest const *  quest)
1397{
1398 // apply world quest rate
1399 uint32 xp = uint32(quest->XPValue(GetLevel()) * GetQuestRate(quest->IsDFQuest()));
1400
1401 // handle SPELL_AURA_MOD_XP_QUEST_PCT auras
1403 for (Unit::AuraEffectList::const_iterator i = ModXPPctAuras.begin(); i != ModXPPctAuras.end(); ++i)
1404 AddPct(xp, (*i)->GetAmount());
1405
1406 return xp;
1407}
@ SPELL_AURA_MOD_XP_QUEST_PCT
Definition: SpellAuraDefines.h:354
T AddPct(T &base, U pct)
Definition: Util.h:67
float GetQuestRate(bool isDFQuest=false)
Definition: Player.cpp:16197

References AddPct(), Unit::GetAuraEffectsByType(), Unit::GetLevel(), GetQuestRate(), Quest::IsDFQuest(), SPELL_AURA_MOD_XP_QUEST_PCT, and Quest::XPValue().

Referenced by RewardQuest(), PlayerMenu::SendQuestGiverOfferReward(), and PlayerMenu::SendQuestGiverQuestDetails().

◆ CalculateReputationGain()

float Player::CalculateReputationGain ( ReputationSource  source,
uint32  creatureOrQuestLevel,
float  rep,
int32  faction,
bool  noQuestBonus = false 
)
5827{
5828 float percent = 100.0f;
5829
5830 float repMod = noQuestBonus ? 0.0f : float(GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN));
5831
5832 // faction specific auras only seem to apply to kills
5833 if (source == REPUTATION_SOURCE_KILL)
5835
5836 percent += rep > 0.f ? repMod : -repMod;
5837
5838 float rate;
5839 switch (source)
5840 {
5842 rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_KILL);
5843 break;
5849 rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_QUEST);
5850 break;
5852 default:
5853 rate = 1.0f;
5854 break;
5855 }
5856
5857 if (rate != 1.0f && creatureOrQuestLevel <= Acore::XP::GetGrayLevel(GetLevel()))
5858 percent *= rate;
5859
5860 if (percent <= 0.0f)
5861 return 0;
5862
5863 // Multiply result with the faction specific rate
5864 if (RepRewardRate const* repData = sObjectMgr->GetRepRewardRate(faction))
5865 {
5866 float repRate = 0.0f;
5867 switch (source)
5868 {
5870 repRate = repData->creatureRate;
5871 break;
5873 repRate = repData->questRate;
5874 break;
5876 repRate = repData->questDailyRate;
5877 break;
5879 repRate = repData->questWeeklyRate;
5880 break;
5882 repRate = repData->questMonthlyRate;
5883 break;
5885 repRate = repData->questRepeatableRate;
5886 break;
5888 repRate = repData->spellRate;
5889 break;
5890 }
5891
5892 // for custom, a rate of 0.0 will totally disable reputation gain for this faction/type
5893 if (repRate <= 0.0f)
5894 return 0;
5895
5896 percent *= repRate;
5897 }
5898
5899 if (source != REPUTATION_SOURCE_SPELL && GetsRecruitAFriendBonus(false))
5900 percent *= 1.0f + sWorld->getRate(RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS);
5901
5902 return CalculatePct(rep, percent);
5903}
@ SPELL_AURA_MOD_REPUTATION_GAIN
Definition: SpellAuraDefines.h:219
@ SPELL_AURA_MOD_FACTION_REPUTATION_GAIN
Definition: SpellAuraDefines.h:253
@ REPUTATION_SOURCE_KILL
Definition: Player.h:239
@ REPUTATION_SOURCE_SPELL
Definition: Player.h:245
@ REPUTATION_SOURCE_QUEST
Definition: Player.h:240
@ REPUTATION_SOURCE_MONTHLY_QUEST
Definition: Player.h:243
@ REPUTATION_SOURCE_REPEATABLE_QUEST
Definition: Player.h:244
@ REPUTATION_SOURCE_WEEKLY_QUEST
Definition: Player.h:242
@ REPUTATION_SOURCE_DAILY_QUEST
Definition: Player.h:241
@ RATE_REPUTATION_LOWLEVEL_QUEST
Definition: IWorld.h:484
@ RATE_REPUTATION_LOWLEVEL_KILL
Definition: IWorld.h:483
@ RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS
Definition: IWorld.h:485
uint8 GetGrayLevel(uint8 pl_level)
Definition: Formulas.h:46
bool GetsRecruitAFriendBonus(bool forXP)
Definition: Player.cpp:12636
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:5968
Definition: ObjectMgr.h:557

References CalculatePct(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), GetsRecruitAFriendBonus(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierByMiscValue(), RATE_REPUTATION_LOWLEVEL_KILL, RATE_REPUTATION_LOWLEVEL_QUEST, RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS, REPUTATION_SOURCE_DAILY_QUEST, REPUTATION_SOURCE_KILL, REPUTATION_SOURCE_MONTHLY_QUEST, REPUTATION_SOURCE_QUEST, REPUTATION_SOURCE_REPEATABLE_QUEST, REPUTATION_SOURCE_SPELL, REPUTATION_SOURCE_WEEKLY_QUEST, sObjectMgr, SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, SPELL_AURA_MOD_REPUTATION_GAIN, and sWorld.

Referenced by Spell::EffectReputation(), and RewardReputation().

◆ CalculateTalentsPoints()

uint32 Player::CalculateTalentsPoints ( ) const
13568{
13569 uint32 base_talent = GetLevel() < 10 ? 0 : GetLevel() - 9;
13570
13571 uint32 talentPointsForLevel = 0;
13573 {
13574 talentPointsForLevel = base_talent;
13575 }
13576 else
13577 {
13578 talentPointsForLevel = GetLevel() < 56 ? 0 : GetLevel() - 55;
13579 talentPointsForLevel += m_questRewardTalentCount;
13580
13581 if (talentPointsForLevel > base_talent)
13582 {
13583 talentPointsForLevel = base_talent;
13584 }
13585 }
13586
13587 talentPointsForLevel += m_extraBonusTalentCount;
13588 sScriptMgr->OnCalculateTalentsPoints(this, talentPointsForLevel);
13589 return uint32(talentPointsForLevel * sWorld->getRate(RATE_TALENT));
13590}
@ CLASS_CONTEXT_TALENT_POINT_CALC
Definition: UnitDefines.h:212
@ RATE_TALENT
Definition: IWorld.h:511

References CLASS_CONTEXT_TALENT_POINT_CALC, CLASS_DEATH_KNIGHT, Unit::GetLevel(), WorldLocation::GetMapId(), IsClass(), m_extraBonusTalentCount, m_questRewardTalentCount, RATE_TALENT, sScriptMgr, and sWorld.

Referenced by InitTalentForLevel(), and resetTalents().

◆ CanAddQuest()

bool Player::CanAddQuest ( Quest const *  quest,
bool  msg 
)
265{
266 if (!SatisfyQuestLog(msg))
267 return false;
268
269 uint32 srcitem = quest->GetSrcItemId();
270 if (srcitem > 0)
271 {
272 uint32 count = quest->GetSrcItemCount();
273 ItemPosCountVec dest;
274 InventoryResult msg2 = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count);
275
276 // player already have max number (in most case 1) source item, no additional item needed and quest can be added.
278 return true;
279 else if (msg2 != EQUIP_ERR_OK)
280 {
281 SendEquipError(msg2, nullptr, nullptr, srcitem);
282 return false;
283 }
284 }
285 return true;
286}
@ EQUIP_ERR_CANT_CARRY_MORE_OF_THIS
Definition: Item.h:64
bool SatisfyQuestLog(bool msg)
Definition: PlayerQuest.cpp:978

References CanStoreNewItem(), EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), NULL_BAG, NULL_SLOT, SatisfyQuestLog(), and SendEquipError().

Referenced by Spell::EffectQuestStart(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), and SendPreparedQuest().

◆ CanAlwaysSee()

bool Player::CanAlwaysSee ( WorldObject const *  obj) const
overrideprotectedvirtual

Reimplemented from WorldObject.

11406{
11407 // Always can see self
11408 if (m_mover == obj)
11409 return true;
11410
11412 if (obj->GetGUID() == guid)
11413 return true;
11414
11415 return false;
11416}
@ PLAYER_FARSIGHT
Definition: UpdateFields.h:334

References Object::GetGUID(), Object::GetGuidValue(), m_mover, and PLAYER_FARSIGHT.

◆ CanBankItem()

InventoryResult Player::CanBankItem ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
Item pItem,
bool  swap,
bool  not_loading = true 
) const
2048{
2049 if (!pItem)
2051
2052 uint32 count = pItem->GetCount();
2053
2054 LOG_DEBUG("entities.player.items", "STORAGE: CanBankItem bag = {}, slot = {}, item = {}, count = {}", bag, slot, pItem->GetEntry(), pItem->GetCount());
2055 ItemTemplate const* pProto = pItem->GetTemplate();
2056 if (!pProto)
2058
2059 // Xinef: Removed next loot generated check
2060 if (pItem->GetGUID() == GetLootGUID())
2062
2063 if (pItem->IsBindedNotWith(this))
2065
2066 // Currency tokens are not supposed to be swapped out of their hidden bag
2067 uint8 pItemslot = pItem->GetSlot();
2068 if (pItemslot >= CURRENCYTOKEN_SLOT_START && pItemslot < CURRENCYTOKEN_SLOT_END)
2069 {
2070 LOG_ERROR("entities.player", "Possible hacking attempt: Player {} [{}] tried to move token [{}, entry: {}] out of the currency bag!",
2071 GetName(), GetGUID().ToString(), pItem->GetGUID().ToString(), pProto->ItemId);
2073 }
2074
2075 // check count of items (skip for auto move for same player from bank)
2077 if (res != EQUIP_ERR_OK)
2078 return res;
2079
2080 // in specific slot
2081 if (bag != NULL_BAG && slot != NULL_SLOT)
2082 {
2083 if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
2084 {
2085 if (!pItem->IsBag())
2087
2090
2091 res = CanUseItem(pItem, not_loading);
2092 if (res != EQUIP_ERR_OK)
2093 return res;
2094 }
2095
2096 res = CanStoreItem_InSpecificSlot(bag, slot, dest, pProto, count, swap, pItem);
2097 if (res != EQUIP_ERR_OK)
2098 return res;
2099
2100 if (count == 0)
2101 return EQUIP_ERR_OK;
2102 }
2103
2104 // not specific slot or have space for partly store only in specific slot
2105
2106 // in specific bag
2107 if (bag != NULL_BAG)
2108 {
2109 if (pItem->IsNotEmptyBag())
2111
2112 // search stack in bag for merge to
2113 if (pProto->Stackable != 1)
2114 {
2115 if (bag == INVENTORY_SLOT_BAG_0)
2116 {
2117 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
2118 if (res != EQUIP_ERR_OK)
2119 return res;
2120
2121 if (count == 0)
2122 return EQUIP_ERR_OK;
2123 }
2124 else
2125 {
2126 res = CanStoreItem_InBag(bag, dest, pProto, count, true, false, pItem, NULL_BAG, slot);
2127 if (res != EQUIP_ERR_OK)
2128 res = CanStoreItem_InBag(bag, dest, pProto, count, true, true, pItem, NULL_BAG, slot);
2129
2130 if (res != EQUIP_ERR_OK)
2131 return res;
2132
2133 if (count == 0)
2134 return EQUIP_ERR_OK;
2135 }
2136 }
2137
2138 // search free slot in bag
2139 if (bag == INVENTORY_SLOT_BAG_0)
2140 {
2141 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
2142 if (res != EQUIP_ERR_OK)
2143 return res;
2144
2145 if (count == 0)
2146 return EQUIP_ERR_OK;
2147 }
2148 else
2149 {
2150 res = CanStoreItem_InBag(bag, dest, pProto, count, false, false, pItem, NULL_BAG, slot);
2151 if (res != EQUIP_ERR_OK)
2152 res = CanStoreItem_InBag(bag, dest, pProto, count, false, true, pItem, NULL_BAG, slot);
2153
2154 if (res != EQUIP_ERR_OK)
2155 return res;
2156
2157 if (count == 0)
2158 return EQUIP_ERR_OK;
2159 }
2160 }
2161
2162 // not specific bag or have space for partly store only in specific bag
2163
2164 // search stack for merge to
2165 if (pProto->Stackable != 1)
2166 {
2167 // in slots
2168 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
2169 if (res != EQUIP_ERR_OK)
2170 return res;
2171
2172 if (count == 0)
2173 return EQUIP_ERR_OK;
2174
2175 // in special bags
2176 if (pProto->BagFamily)
2177 {
2178 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2179 {
2180 res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot);
2181 if (res != EQUIP_ERR_OK)
2182 continue;
2183
2184 if (count == 0)
2185 return EQUIP_ERR_OK;
2186 }
2187 }
2188
2189 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2190 {
2191 res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
2192 if (res != EQUIP_ERR_OK)
2193 continue;
2194
2195 if (count == 0)
2196 return EQUIP_ERR_OK;
2197 }
2198 }
2199
2200 // search free place in special bag
2201 if (pProto->BagFamily)
2202 {
2203 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2204 {
2205 res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot);
2206 if (res != EQUIP_ERR_OK)
2207 continue;
2208
2209 if (count == 0)
2210 return EQUIP_ERR_OK;
2211 }
2212 }
2213
2214 // search free space
2215 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
2216 if (res != EQUIP_ERR_OK)
2217 return res;
2218
2219 if (count == 0)
2220 return EQUIP_ERR_OK;
2221
2222 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2223 {
2224 res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
2225 if (res != EQUIP_ERR_OK)
2226 continue;
2227
2228 if (count == 0)
2229 return EQUIP_ERR_OK;
2230 }
2231 return EQUIP_ERR_BANK_FULL;
2232}
@ EQUIP_ERR_ALREADY_LOOTED
Definition: Item.h:96
@ EQUIP_ERR_DONT_OWN_THAT_ITEM
Definition: Item.h:79
@ EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT
Definition: Item.h:81
@ EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG
Definition: Item.h:52
@ EQUIP_ERR_BANK_FULL
Definition: Item.h:98
@ EQUIP_ERR_ITEM_NOT_FOUND
Definition: Item.h:70
@ EQUIP_ERR_ITEMS_CANT_BE_SWAPPED
Definition: Item.h:68
@ BANK_SLOT_BAG_START
Definition: Player.h:717
@ BANK_SLOT_ITEM_START
Definition: Player.h:711
@ BANK_SLOT_ITEM_END
Definition: Player.h:712
bool IsBindedNotWith(Player const *player) const
Definition: Item.cpp:1133
bool IsBag() const
Definition: Item.h:254
bool IsNotEmptyBag() const
Definition: Item.cpp:312
uint32 BagFamily
Definition: ItemTemplate.h:679
int32 Stackable
Definition: ItemTemplate.h:645
uint8 GetBankBagSlotCount() const
Definition: Player.h:1263
ObjectGuid GetLootGUID() const
Definition: Player.h:1970
InventoryResult CanTakeMoreSimilarItems(Item *pItem) const
Definition: Player.h:1270
InventoryResult CanStoreItem_InInventorySlots(uint8 slot_begin, uint8 slot_end, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
Definition: PlayerStorage.cpp:1073
InventoryResult CanStoreItem_InBag(uint8 bag, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, bool non_specialized, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
Definition: PlayerStorage.cpp:1003
InventoryResult CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool swap, Item *pSrcItem) const
Definition: PlayerStorage.cpp:932
InventoryResult CanUseItem(Item *pItem, bool not_loading=true) const
Definition: PlayerStorage.cpp:2234

References ItemTemplate::BagFamily, BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanTakeMoreSimilarItems(), CanUseItem(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_BANK_FULL, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, GetBankBagSlotCount(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetLootGUID(), WorldObject::GetName(), Item::GetSlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, Item::IsBag(), Item::IsBindedNotWith(), Item::IsNotEmptyBag(), ItemTemplate::ItemId, LOG_DEBUG, LOG_ERROR, NULL_BAG, NULL_SLOT, ItemTemplate::Stackable, ObjectGuid::ToString(), and Position::ToString().

Referenced by _LoadInventory(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), SplitItem(), and SwapItem().

◆ CanBlock()

bool Player::CanBlock ( ) const
inline
2162{ return m_canBlock; }

References m_canBlock.

Referenced by UpdateBlockPercentage().

◆ CanCaptureTowerPoint()

bool Player::CanCaptureTowerPoint ( ) const
13190{
13191 return (!HasStealthAura() && // not stealthed
13192 !HasInvisibilityAura() && // not invisible
13193 IsAlive() // live player
13194 );
13195}
bool HasStealthAura() const
Definition: Unit.h:1050
bool HasInvisibilityAura() const
Definition: Unit.h:1051

References Unit::HasInvisibilityAura(), Unit::HasStealthAura(), and Unit::IsAlive().

◆ CanCompleteQuest()

bool Player::CanCompleteQuest ( uint32  quest_id,
const QuestStatusData q_savedStatus = nullptr 
)
289{
290 if (quest_id)
291 {
292 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
293 if (!qInfo)
294 return false;
295
296 // Xinef: take seasonals into account
297 if(!qInfo->IsRepeatable() && !qInfo->IsSeasonal() && IsQuestRewarded(quest_id))
298 return false; // not allow re-complete quest
299
300 // auto complete quest
301 if ((qInfo->IsAutoComplete() || !qInfo->GetQuestMethod()) && CanTakeQuest(qInfo, false))
302 return true;
303
304 QuestStatusData q_status;
305 if (q_savedStatus)
306 q_status = *q_savedStatus;
307 else
308 {
309 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
310 if (itr == m_QuestStatus.end())
311 return false;
312
313 q_status = itr->second;
314 }
315
316 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
317 {
319 {
320 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
321 {
322 if (qInfo->RequiredItemCount[i] != 0 && q_status.ItemCount[i] < qInfo->RequiredItemCount[i])
323 return false;
324 }
325 }
326
328 {
329 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
330 {
331 if (qInfo->RequiredNpcOrGo[i] == 0)
332 continue;
333
334 if (qInfo->RequiredNpcOrGoCount[i] != 0 && q_status.CreatureOrGOCount[i] < qInfo->RequiredNpcOrGoCount[i])
335 return false;
336 }
337 }
338
340 if (qInfo->GetPlayersSlain() != 0 && q_status.PlayerCount < qInfo->GetPlayersSlain())
341 return false;
342
344 return false;
345
346 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && q_status.Timer == 0)
347 return false;
348
349 if (qInfo->GetRewOrReqMoney() < 0)
350 {
351 if (!HasEnoughMoney(-qInfo->GetRewOrReqMoney()))
352 return false;
353 }
354
355 uint32 repFacId = qInfo->GetRepObjectiveFaction();
356 if (repFacId && GetReputationMgr().GetReputation(repFacId) < qInfo->GetRepObjectiveValue())
357 return false;
358
359 return true;
360 }
361 }
362 return false;
363}
@ QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT
Definition: QuestDef.h:161
bool CanTakeQuest(Quest const *quest, bool msg)
Definition: PlayerQuest.cpp:251
uint32 GetReputation(uint32 factionentry) const
Definition: Player.cpp:15289
bool IsQuestRewarded(uint32 quest_id) const
Definition: Player.h:1615
bool HasSpecialFlag(uint32 flag) const
Definition: QuestDef.h:223
int32 GetRepObjectiveValue() const
Definition: QuestDef.h:239
int32 RequiredNpcOrGo[QUEST_OBJECTIVES_COUNT]
Definition: QuestDef.h:303
uint32 GetRepObjectiveFaction() const
Definition: QuestDef.h:238
uint32 RequiredNpcOrGoCount[QUEST_OBJECTIVES_COUNT]
Definition: QuestDef.h:304
bool IsRepeatable() const
Definition: QuestDef.h:282
bool IsAutoComplete() const
Definition: QuestDef.cpp:274
uint32 GetPlayersSlain() const
Definition: QuestDef.h:253
uint32 RequiredItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition: QuestDef.h:300
int32 GetRewOrReqMoney(uint8 playerLevel=0) const
Definition: QuestDef.cpp:238
bool IsSeasonal() const
Definition: QuestDef.h:289
uint32 GetQuestMethod() const
Definition: QuestDef.h:228

References CanTakeQuest(), QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, Quest::GetPlayersSlain(), Quest::GetQuestMethod(), Quest::GetRepObjectiveFaction(), Quest::GetRepObjectiveValue(), GetReputation(), GetReputationMgr(), Quest::GetRewOrReqMoney(), HasEnoughMoney(), Quest::HasSpecialFlag(), Quest::IsAutoComplete(), IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), QuestStatusData::ItemCount, m_QuestStatus, QuestStatusData::PlayerCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, sObjectMgr, QuestStatusData::Status, and QuestStatusData::Timer.

Referenced by AddQuestAndCheckCompletion(), AreaExploredOrEventHappens(), WorldSession::HandleQuestgiverQueryQuestOpcode(), WorldSession::HandleQuestgiverRequestRewardOpcode(), ItemAddedQuestCheck(), KillCreditGO(), KilledMonsterCredit(), KilledPlayerCreditForQuest(), MoneyChanged(), ReputationChanged(), ReputationChanged2(), PlayerMenu::SendQuestGiverRequestItems(), and TalkedToCreature().

◆ CanCompleteRepeatableQuest()

bool Player::CanCompleteRepeatableQuest ( Quest const *  quest)
366{
367 // Solve problem that player don't have the quest and try complete it.
368 // if repeatable she must be able to complete event if player don't have it.
369 // Seem that all repeatable quest are DELIVER Flag so, no need to add more.
370 if (!CanTakeQuest(quest, false))
371 return false;
372
373 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
374 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
375 if (quest->RequiredItemId[i] && quest->RequiredItemCount[i] && !HasItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i]))
376 return false;
377
378 if (!CanRewardQuest(quest, false))
379 return false;
380
381 return true;
382}
bool CanRewardQuest(Quest const *quest, bool msg)
Definition: PlayerQuest.cpp:384

References CanRewardQuest(), CanTakeQuest(), HasItemCount(), Quest::HasSpecialFlag(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, and Quest::RequiredItemId.

Referenced by WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverCompleteQuest(), and SendPreparedQuest().

◆ CanEnterWater()

bool Player::CanEnterWater ( ) const
inlineoverridevirtual

Implements Unit.

2547{ return true; }

◆ CanEquipItem()

InventoryResult Player::CanEquipItem ( uint8  slot,
uint16 dest,
Item pItem,
bool  swap,
bool  not_loading = true 
) const
1829{
1830 dest = 0;
1831 if (pItem)
1832 {
1833 LOG_DEBUG("entities.player.items", "STORAGE: CanEquipItem slot = {}, item = {}, count = {}", slot, pItem->GetEntry(), pItem->GetCount());
1834 ItemTemplate const* pProto = pItem->GetTemplate();
1835 if (pProto)
1836 {
1837 if (!sScriptMgr->CanEquipItem(const_cast<Player*>(this), slot, dest, pItem, swap, not_loading))
1839
1840 // item used
1841 if (pItem->m_lootGenerated)
1843
1844 if (pItem->IsBindedNotWith(this))
1846
1847 // check count of items (skip for auto move for same player from bank)
1849 if (res != EQUIP_ERR_OK)
1850 return res;
1851
1852 // check this only in game
1853 if (not_loading)
1854 {
1855 // May be here should be more stronger checks; STUNNED checked
1856 // ROOT, CONFUSED, DISTRACTED, FLEEING this needs to be checked.
1859
1860 // do not allow equipping gear except weapons, offhands, projectiles, relics in
1861 // - combat
1862 // - in-progress arenas
1863 if (!pProto->CanChangeEquipStateInCombat())
1864 {
1865 if (IsInCombat())
1867
1868 if (Battleground* bg = GetBattleground())
1869 if (bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS)
1871 }
1872
1873 if (IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer != 0)
1874 return EQUIP_ERR_CANT_DO_RIGHT_NOW; // maybe exist better err
1875
1876 if (IsNonMeleeSpellCast(false))
1878 }
1879
1881 // check allowed level (extend range to upper values if MaxLevel more or equal max player level, this let GM set high level with 1...max range items)
1882 if (ssd && ssd->MaxLevel < DEFAULT_MAX_LEVEL && ssd->MaxLevel < GetLevel())
1884
1885 uint8 eslot = FindEquipSlot(pProto, slot, swap);
1886 if (eslot == NULL_SLOT)
1888
1889 // Xinef: dont allow to equip items on disarmed slot
1890 if (!CanUseAttackType(GetAttackBySlot(eslot)))
1892
1893 res = CanUseItem(pItem, not_loading);
1894 if (res != EQUIP_ERR_OK)
1895 return res;
1896
1897 if (!swap && GetItemByPos(INVENTORY_SLOT_BAG_0, eslot))
1899
1900 // if we are swapping 2 equipped items, CanEquipUniqueItem check
1901 // should ignore the item we are trying to swap, and not the
1902 // destination item. CanEquipUniqueItem should ignore destination
1903 // item only when we are swapping weapon from bag
1904 uint8 ignore = uint8(NULL_SLOT);
1905 switch (eslot)
1906 {
1908 ignore = EQUIPMENT_SLOT_OFFHAND;
1909 break;
1911 ignore = EQUIPMENT_SLOT_MAINHAND;
1912 break;
1914 ignore = EQUIPMENT_SLOT_FINGER2;
1915 break;
1917 ignore = EQUIPMENT_SLOT_FINGER1;
1918 break;
1920 ignore = EQUIPMENT_SLOT_TRINKET2;
1921 break;
1923 ignore = EQUIPMENT_SLOT_TRINKET1;
1924 break;
1925 }
1926
1927 if (ignore == uint8(NULL_SLOT) || pItem != GetItemByPos(INVENTORY_SLOT_BAG_0, ignore))
1928 ignore = eslot;
1929
1930 InventoryResult res2 = CanEquipUniqueItem(pItem, swap ? ignore : uint8(NULL_SLOT));
1931 if (res2 != EQUIP_ERR_OK)
1932 return res2;
1933
1934 // check unique-equipped special item classes
1935 if (pProto->Class == ITEM_CLASS_QUIVER)
1937 if (Item* pBag = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
1938 if (pBag != pItem)
1939 if (ItemTemplate const* pBagProto = pBag->GetTemplate())
1940 if (pBagProto->Class == pProto->Class && (!swap || pBag->GetSlot() != eslot))
1941 return (pBagProto->SubClass == ITEM_SUBCLASS_AMMO_POUCH)
1944
1945 uint32 type = pProto->InventoryType;
1946
1947 if (eslot == EQUIPMENT_SLOT_OFFHAND)
1948 {
1949 // Do not allow polearm to be equipped in the offhand (rare case for the only 1h polearm 41750)
1950 // xinef: same for fishing poles
1953
1954 else if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND)
1955 {
1956 if (!CanDualWield())
1958 }
1959 else if (type == INVTYPE_2HWEAPON)
1960 {
1961 if (!CanDualWield() || !CanTitanGrip())
1963 }
1964
1965 if (IsTwoHandUsed())
1967 }
1968
1969 // equip two-hand weapon case (with possible unequip 2 items)
1970 if (type == INVTYPE_2HWEAPON)
1971 {
1972 if (eslot == EQUIPMENT_SLOT_OFFHAND)
1973 {
1974 if (!CanTitanGrip())
1976 }
1977 else if (eslot != EQUIPMENT_SLOT_MAINHAND)
1979
1980 if (!CanTitanGrip())
1981 {
1982 // offhand item must can be stored in inventory for offhand item and it also must be unequipped
1984 ItemPosCountVec off_dest;
1985 if (offItem && (!not_loading ||
1987 CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false) != EQUIP_ERR_OK))
1989 }
1990 }
1991 dest = ((INVENTORY_SLOT_BAG_0 << 8) | eslot);
1992 return EQUIP_ERR_OK;
1993 }
1994 }
1995
1997}
@ STATUS_IN_PROGRESS
Definition: Battleground.h:197
@ EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH
Definition: Item.h:89
@ EQUIP_ERR_CANT_DUAL_WIELD
Definition: Item.h:61
@ EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE
Definition: Item.h:56
@ EQUIP_ERR_NOT_DURING_ARENA_MATCH
Definition: Item.h:124
@ EQUIP_ERR_NOT_IN_COMBAT
Definition: Item.h:107
@ EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED
Definition: Item.h:60
@ EQUIP_ERR_NOT_WHILE_DISARMED
Definition: Item.h:108
@ EQUIP_ERR_CANT_DO_RIGHT_NOW
Definition: Item.h:86
@ EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER
Definition: Item.h:80
@ EQUIP_ERR_YOU_ARE_STUNNED
Definition: Item.h:84
@ EQUIP_ERR_INVENTORY_FULL
Definition: Item.h:97
@ ITEM_SUBCLASS_WEAPON_FISHING_POLE
Definition: ItemTemplate.h:364
@ ITEM_SUBCLASS_WEAPON_POLEARM
Definition: ItemTemplate.h:350
@ INVTYPE_RELIC
Definition: ItemTemplate.h:284
@ ITEM_SUBCLASS_AMMO_POUCH
Definition: ItemTemplate.h:481
@ ITEM_CLASS_QUIVER
Definition: ItemTemplate.h:302
@ ITEM_CLASS_WEAPON
Definition: ItemTemplate.h:293
@ EQUIPMENT_SLOT_FINGER1
Definition: Player.h:685
@ EQUIPMENT_SLOT_FINGER2
Definition: Player.h:686
@ EQUIPMENT_SLOT_TRINKET1
Definition: Player.h:687
@ EQUIPMENT_SLOT_TRINKET2
Definition: Player.h:688
#define DEFAULT_MAX_LEVEL
Definition: DBCEnums.h:35
Definition: Battleground.h:298
bool m_lootGenerated
Definition: Item.h:321
bool CanChangeEquipStateInCombat() const
Definition: ItemTemplate.h:707
uint32 ScalingStatDistribution
Definition: ItemTemplate.h:649
uint32 SubClass
Definition: ItemTemplate.h:622
Definition: Player.h:1064
InventoryResult CanUnequipItem(uint16 src, bool swap) const
Definition: PlayerStorage.cpp:1999
InventoryResult CanEquipUniqueItem(Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
Definition: Player.cpp:13733
Battleground * GetBattleground(bool create=false) const
Definition: Player.cpp:12149
uint8 FindEquipSlot(ItemTemplate const *proto, uint32 slot, bool swap) const
Definition: PlayerStorage.cpp:131

References ItemTemplate::CanChangeEquipStateInCombat(), Unit::CanDualWield(), CanEquipUniqueItem(), CanStoreItem(), CanTakeMoreSimilarItems(), CanTitanGrip(), CanUnequipItem(), Unit::CanUseAttackType(), CanUseItem(), ItemTemplate::Class, DEFAULT_MAX_LEVEL, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH, EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_DUAL_WIELD, EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE, EQUIP_ERR_NOT_DURING_ARENA_MATCH, EQUIP_ERR_NOT_IN_COMBAT, EQUIP_ERR_NOT_WHILE_DISARMED, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_STUNNED, EQUIPMENT_SLOT_FINGER1, EQUIPMENT_SLOT_FINGER2, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_TRINKET1, EQUIPMENT_SLOT_TRINKET2, FindEquipSlot(), GetAttackBySlot(), GetBattleground(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), Unit::GetLevel(), Item::GetTemplate(), Unit::HasUnitState(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_RELIC, INVTYPE_WEAPON, INVTYPE_WEAPONOFFHAND, Item::IsBindedNotWith(), Unit::IsInCombat(), Unit::IsNonMeleeSpellCast(), IsTwoHandUsed(), ITEM_CLASS_QUIVER, ITEM_CLASS_WEAPON, ITEM_SUBCLASS_AMMO_POUCH, ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, LOG_DEBUG, Item::m_lootGenerated, m_weaponChangeTimer, ScalingStatDistributionEntry::MaxLevel, NULL_BAG, NULL_SLOT, ItemTemplate::ScalingStatDistribution, sScalingStatDistributionStore, sScriptMgr, STATUS_IN_PROGRESS, ItemTemplate::SubClass, and UNIT_STATE_STUNNED.

Referenced by _LoadInventory(), CanEquipNewItem(), Create(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleEquipmentSetUse(), SplitItem(), and SwapItem().

◆ CanEquipNewItem()

InventoryResult Player::CanEquipNewItem ( uint8  slot,
uint16 dest,
uint32  item,
bool  swap 
) const
1815{
1816 dest = 0;
1817 Item* pItem = Item::CreateItem(item, 1, this);
1818 if (pItem)
1819 {
1820 InventoryResult result = CanEquipItem(slot, dest, pItem, swap);
1821 delete pItem;
1822 return result;
1823 }
1824
1826}
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition: Item.cpp:1088

References CanEquipItem(), Item::CreateItem(), and EQUIP_ERR_ITEM_NOT_FOUND.

Referenced by _StoreOrEquipNewItem(), and StoreNewItemInBestSlots().

◆ CanEquipUniqueItem() [1/2]

InventoryResult Player::CanEquipUniqueItem ( Item pItem,
uint8  except_slot = NULL_SLOT,
uint32  limit_count = 1 
) const
13734{
13735 ItemTemplate const* pProto = pItem->GetTemplate();
13736
13737 // proto based limitations
13738 if (InventoryResult res = CanEquipUniqueItem(pProto, eslot, limit_count))
13739 return res;
13740
13741 // check unique-equipped on gems
13742 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
13743 {
13744 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
13745 if (!enchant_id)
13746 continue;
13747 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
13748 if (!enchantEntry)
13749 continue;
13750
13751 ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(enchantEntry->GemID);
13752 if (!pGem)
13753 continue;
13754
13755 // include for check equip another gems with same limit category for not equipped item (and then not counted)
13756 uint32 gem_limit_count = !pItem->IsEquipped() && pGem->ItemLimitCategory
13758
13759 if (InventoryResult res = CanEquipUniqueItem(pGem, eslot, gem_limit_count))
13760 return res;
13761 }
13762
13763 return EQUIP_ERR_OK;
13764}
uint8 GetGemCountWithLimitCategory(uint32 limitCategory) const
Definition: Item.cpp:1034
uint32 ItemLimitCategory
Definition: ItemTemplate.h:687
uint32 GemID
Definition: DBCStructure.h:1852

References CanEquipUniqueItem(), EQUIP_ERR_OK, SpellItemEnchantmentEntry::GemID, Item::GetEnchantmentId(), Item::GetGemCountWithLimitCategory(), Item::GetTemplate(), Item::IsEquipped(), ItemTemplate::ItemLimitCategory, sObjectMgr, SOCK_ENCHANTMENT_SLOT, and sSpellItemEnchantmentStore.

Referenced by CanEquipItem(), CanEquipUniqueItem(), CanRollOnItem(), and WorldSession::HandleSocketOpcode().

◆ CanEquipUniqueItem() [2/2]

InventoryResult Player::CanEquipUniqueItem ( ItemTemplate const *  itemProto,
uint8  except_slot = NULL_SLOT,
uint32  limit_count = 1 
) const
13767{
13768 // check unique-equipped on item
13769 if (itemProto->HasFlag(ITEM_FLAG_UNIQUE_EQUIPPABLE))
13770 {
13771 // there is an equip limit on this item
13772 if (HasItemOrGemWithIdEquipped(itemProto->ItemId, 1, except_slot))
13774 }
13775
13776 // check unique-equipped limit
13777 if (itemProto->ItemLimitCategory)
13778 {
13779 ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(itemProto->ItemLimitCategory);
13780 if (!limitEntry)
13782
13783 // NOTE: limitEntry->mode not checked because if item have have-limit then it applied and to equip case
13784
13785 if (limit_count > limitEntry->maxCount)
13787
13788 // there is an equip limit on this item
13789 if (HasItemOrGemWithLimitCategoryEquipped(itemProto->ItemLimitCategory, limitEntry->maxCount - limit_count + 1, except_slot))
13791 }
13792
13793 return EQUIP_ERR_OK;
13794}
DBCStorage< ItemLimitCategoryEntry > sItemLimitCategoryStore(ItemLimitCategoryEntryfmt)
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED
Definition: Item.h:135
@ EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE
Definition: Item.h:114
@ EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED
Definition: Item.h:121
@ ITEM_FLAG_UNIQUE_EQUIPPABLE
Definition: ItemTemplate.h:166
bool HasItemOrGemWithIdEquipped(uint32 item, uint32 count, uint8 except_slot=NULL_SLOT) const
Definition: PlayerStorage.cpp:751
bool HasItemOrGemWithLimitCategoryEquipped(uint32 limitCategory, uint32 count, uint8 except_slot=NULL_SLOT) const
Definition: PlayerStorage.cpp:789
Definition: DBCStructure.h:1196
uint32 maxCount
Definition: DBCStructure.h:1200

References EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED, EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE, EQUIP_ERR_OK, ItemTemplate::HasFlag(), HasItemOrGemWithIdEquipped(), HasItemOrGemWithLimitCategoryEquipped(), ITEM_FLAG_UNIQUE_EQUIPPABLE, ItemTemplate::ItemId, ItemTemplate::ItemLimitCategory, ItemLimitCategoryEntry::maxCount, and sItemLimitCategoryStore.

◆ CanFly()

bool Player::CanFly ( ) const
inlineoverridevirtual

Implements Unit.

@ MOVEMENTFLAG_CAN_FLY
Definition: UnitDefines.h:368
bool HasMovementFlag(uint32 flag) const
Definition: Object.h:334
MovementInfo m_movementInfo
Definition: Object.h:609

References MovementInfo::HasMovementFlag(), WorldObject::m_movementInfo, and MOVEMENTFLAG_CAN_FLY.

◆ canFlyInZone()

bool Player::canFlyInZone ( uint32  mapid,
uint32  zone,
SpellInfo const *  bySpell 
)
13593{
13594 if (!sScriptMgr->OnCanPlayerFlyInZone(this, mapid,zone,bySpell))
13595 {
13596 return false;
13597 }
13598
13599 // continent checked in SpellInfo::CheckLocation at cast and area update
13600 uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone);
13601 if (v_map == 571 && !bySpell->HasAttribute(SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT))
13602 {
13603 if (!HasSpell(54197)) // 54197 = Cold Weather Flying
13604 {
13605 return false;
13606 }
13607 }
13608
13609 return true;
13610}
uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId)
Definition: DBCStores.cpp:703
@ SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT
Definition: SharedDefines.h:663

References GetVirtualMapForMapAndZone(), SpellInfo::HasAttribute(), HasSpell(), SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT, and sScriptMgr.

Referenced by SpellInfo::CheckLocation().

◆ CanInteractWithQuestGiver()

bool Player::CanInteractWithQuestGiver ( Object questGiver)
2058{
2059 switch (questGiver->GetTypeId())
2060 {
2061 case TYPEID_UNIT:
2062 return GetNPCIfCanInteractWith(questGiver->GetGUID(), UNIT_NPC_FLAG_QUESTGIVER) != nullptr;
2063 case TYPEID_GAMEOBJECT:
2064 return GetGameObjectIfCanInteractWith(questGiver->GetGUID(), GAMEOBJECT_TYPE_QUESTGIVER) != nullptr;
2065 case TYPEID_PLAYER:
2066 return IsAlive() && questGiver->ToPlayer()->IsAlive();
2067 case TYPEID_ITEM:
2068 return IsAlive();
2069 default:
2070 break;
2071 }
2072 return false;
2073}
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:295
@ GAMEOBJECT_TYPE_QUESTGIVER
Definition: SharedDefines.h:1562
GameObject * GetGameObjectIfCanInteractWith(ObjectGuid guid, GameobjectTypes type) const
Definition: Player.cpp:2132

References GAMEOBJECT_TYPE_QUESTGIVER, GetGameObjectIfCanInteractWith(), Object::GetGUID(), GetNPCIfCanInteractWith(), Object::GetTypeId(), Unit::IsAlive(), Object::ToPlayer(), TYPEID_GAMEOBJECT, TYPEID_ITEM, TYPEID_PLAYER, TYPEID_UNIT, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), and WorldSession::HandleQuestgiverRequestRewardOpcode().

◆ CanJoinConstantChannelInZone()

bool Player::CanJoinConstantChannelInZone ( ChatChannelsEntry const *  channel,
AreaTableEntry const *  zone 
)
4919{
4920 // Player can join LFG anywhere
4921 if (channel->flags & CHANNEL_DBC_FLAG_LFG && sWorld->getBoolConfig(CONFIG_LFG_LOCATION_ALL))
4922 return true;
4923
4924 if (channel->flags & CHANNEL_DBC_FLAG_ZONE_DEP && zone->flags & AREA_FLAG_ARENA_INSTANCE)
4925 return false;
4926
4927 if ((channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY) && (!(zone->flags & AREA_FLAG_SLAVE_CAPITAL)))
4928 return false;
4929
4930 if ((channel->flags & CHANNEL_DBC_FLAG_GUILD_REQ) && GetGuildId())
4931 return false;
4932
4933 return true;
4934}
@ CHANNEL_DBC_FLAG_CITY_ONLY
Definition: Channel.h:101
@ CHANNEL_DBC_FLAG_GUILD_REQ
Definition: Channel.h:104
@ CHANNEL_DBC_FLAG_ZONE_DEP
Definition: Channel.h:98
@ CHANNEL_DBC_FLAG_LFG
Definition: Channel.h:105
@ CONFIG_LFG_LOCATION_ALL
Definition: IWorld.h:162
@ AREA_FLAG_ARENA_INSTANCE
Definition: DBCEnums.h:250
@ AREA_FLAG_SLAVE_CAPITAL
Definition: DBCEnums.h:237
uint32 GetGuildId() const
Definition: Player.h:1878

References AREA_FLAG_ARENA_INSTANCE, AREA_FLAG_SLAVE_CAPITAL, CHANNEL_DBC_FLAG_CITY_ONLY, CHANNEL_DBC_FLAG_GUILD_REQ, CHANNEL_DBC_FLAG_LFG, CHANNEL_DBC_FLAG_ZONE_DEP, CONFIG_LFG_LOCATION_ALL, AreaTableEntry::flags, ChatChannelsEntry::flags, GetGuildId(), and sWorld.

Referenced by UpdateLocalChannels().

◆ CanJoinToBattleground()

bool Player::CanJoinToBattleground ( ) const
11313{
11314 // check Deserter debuff
11315 if (HasAura(26013))
11316 return false;
11317
11318 return true;
11319}
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5652

References Unit::HasAura().

Referenced by Group::CanJoinBattlegroundQueue(), WorldSession::HandleBattleFieldPortOpcode(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ CanKnockback()

bool Player::CanKnockback ( )
inline
2476{ return m_canKnockback; }

References m_canKnockback.

◆ CanNoReagentCast()

bool Player::CanNoReagentCast ( SpellInfo const *  spellInfo) const
12509{
12510 // don't take reagents for spells with SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA
12512 return true;
12513
12514 // Check no reagent use mask
12515 flag96 noReagentMask;
12516 noReagentMask[0] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1);
12517 noReagentMask[1] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1 + 1);
12518 noReagentMask[2] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1 + 2);
12519 if (spellInfo->SpellFamilyFlags & noReagentMask)
12520 return true;
12521
12522 return false;
12523}
@ PLAYER_NO_REAGENT_COST_1
Definition: UpdateFields.h:387
@ UNIT_FLAG_PREPARATION
Definition: UnitDefines.h:234
@ SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA
Definition: SharedDefines.h:568

References Object::GetUInt32Value(), SpellInfo::HasAttribute(), Unit::HasUnitFlag(), PLAYER_NO_REAGENT_COST_1, SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA, SpellInfo::SpellFamilyFlags, and UNIT_FLAG_PREPARATION.

Referenced by Spell::CheckItems(), spell_dk_raise_dead::CheckReagents(), and Spell::TakeReagents().

◆ CanParry()

bool Player::CanParry ( ) const
inline

◆ CanPetResurrect()

bool Player::CanPetResurrect ( )
9120{
9121 PetStable* const petStable = GetPetStable();
9122 if (!petStable)
9123 {
9124 // No pets
9125 return false;
9126 }
9127
9128 auto const& currectPet = petStable->CurrentPet;
9129 auto const& unslottedHunterPet = petStable->GetUnslottedHunterPet();
9130
9131 if (!currectPet && !unslottedHunterPet)
9132 {
9133 // No pets
9134 return false;
9135 }
9136
9137 // Check current pet
9138 if (currectPet && !currectPet->Health)
9139 {
9140 return true;
9141 }
9142
9143 // Check dismiss/unslotted hunter pet
9144 if (unslottedHunterPet && !unslottedHunterPet->Health)
9145 {
9146 return true;
9147 }
9148
9149 return false;
9150}
Definition: PetDefines.h:202
PetInfo const * GetUnslottedHunterPet() const
Definition: PetDefines.h:230
Optional< PetInfo > CurrentPet
Definition: PetDefines.h:225
PetStable * GetPetStable()
Definition: Player.h:1202

References PetStable::CurrentPet, GetPetStable(), and PetStable::GetUnslottedHunterPet().

◆ CanReportAfkDueToLimit()

bool Player::CanReportAfkDueToLimit ( )
11322{
11323 // a player can complain about 15 people per 5 minutes
11324 if (m_bgData.bgAfkReportedCount++ >= 15)
11325 return false;
11326
11327 return true;
11328}
uint8 bgAfkReportedCount
Definition: Player.h:1043
BGData m_bgData
Definition: Player.h:2643

References BGData::bgAfkReportedCount, and m_bgData.

Referenced by ReportedAfkBy().

◆ CanResummonPet()

bool Player::CanResummonPet ( uint32  spellid)
14204{
14206 {
14207 if (CanSeeDKPet())
14208 return true;
14209 else if (spellid == 52150) // Raise Dead
14210 return false;
14211 }
14212
14214 {
14215 if (HasSpell(31687) && HasAura(70937)) //Has [Summon Water Elemental] spell and [Glyph of Eternal Water].
14216 return true;
14217 }
14218
14220 {
14221 return true;
14222 }
14223
14224 return HasSpell(spellid);
14225}
@ CLASS_CONTEXT_PET
Definition: UnitDefines.h:215
bool CanSeeDKPet() const
Definition: Player.h:2573

References CanSeeDKPet(), CLASS_CONTEXT_PET, CLASS_DEATH_KNIGHT, CLASS_HUNTER, CLASS_MAGE, Unit::HasAura(), HasSpell(), and IsClass().

Referenced by spell_gen_pet_summoned::HandleScript(), and ResummonPetTemporaryUnSummonedIfAny().

◆ CanRewardQuest() [1/2]

bool Player::CanRewardQuest ( Quest const *  quest,
bool  msg 
)
385{
386 // not auto complete quest and not completed quest (only cheating case, then ignore without message)
387 if (!quest->IsDFQuest() && !quest->IsAutoComplete() && quest->GetQuestMethod() && GetQuestStatus(quest->GetQuestId()) != QUEST_STATUS_COMPLETE)
388 return false;
389
390 // daily quest can't be rewarded (25 daily quest already completed)
391 if (!SatisfyQuestDay(quest, true) || !SatisfyQuestWeek(quest, true) || !SatisfyQuestMonth(quest, true) || !SatisfyQuestSeasonal(quest, true))
392 return false;
393
394 // rewarded and not repeatable quest (only cheating case, then ignore without message)
395 if (GetQuestRewardStatus(quest->GetQuestId()))
396 return false;
397
398 // prevent receive reward with quest items in bank
399 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
400 {
401 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
402 {
403 if (quest->RequiredItemCount[i] != 0 &&
404 GetItemCount(quest->RequiredItemId[i]) < quest->RequiredItemCount[i])
405 {
406 if (msg)
407 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr, quest->RequiredItemId[i]);
408 return false;
409 }
410 }
411 }
412
413 // prevent receive reward with low money and GetRewOrReqMoney() < 0
414 if (quest->GetRewOrReqMoney() < 0 && !HasEnoughMoney(-quest->GetRewOrReqMoney()))
415 return false;
416
417 return true;
418}
bool SatisfyQuestDay(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1262
bool SatisfyQuestMonth(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1320
bool SatisfyQuestSeasonal(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1305
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition: PlayerQuest.cpp:1424
bool SatisfyQuestWeek(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1296

References EQUIP_ERR_ITEM_NOT_FOUND, GetItemCount(), Quest::GetQuestId(), Quest::GetQuestMethod(), GetQuestRewardStatus(), GetQuestStatus(), Quest::GetRewOrReqMoney(), HasEnoughMoney(), Quest::HasSpecialFlag(), Quest::IsAutoComplete(), Quest::IsDFQuest(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_STATUS_COMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, SatisfyQuestDay(), SatisfyQuestMonth(), SatisfyQuestSeasonal(), SatisfyQuestWeek(), and SendEquipError().

Referenced by CanCompleteRepeatableQuest(), CanRewardQuest(), lfg::LFGMgr::FinishDungeon(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), npc_elder_clearwater::OnGossipHello(), and SendPreparedQuest().

◆ CanRewardQuest() [2/2]

bool Player::CanRewardQuest ( Quest const *  quest,
uint32  reward,
bool  msg 
)
468{
469 // prevent receive reward with quest items in bank or for not completed quest
470 if (!CanRewardQuest(quest, msg))
471 return false;
472
473 ItemPosCountVec dest;
474 if (quest->GetRewChoiceItemsCount() > 0)
475 {
476 if (quest->RewardChoiceItemId[reward])
477 {
478 InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardChoiceItemId[reward], quest->RewardChoiceItemCount[reward]);
479 if (res != EQUIP_ERR_OK)
480 {
481 SendEquipError(res, nullptr, nullptr, quest->RewardChoiceItemId[reward]);
482 return false;
483 }
484 }
485 }
486
487 if (quest->GetRewItemsCount() > 0)
488 {
489 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
490 {
491 if (quest->RewardItemId[i])
492 {
493 InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardItemId[i], quest->RewardItemIdCount[i]);
494 if (res != EQUIP_ERR_OK)
495 {
496 SendEquipError(res, nullptr, nullptr, quest->RewardItemId[i]);
497 return false;
498 }
499 }
500 }
501 }
502
503 return true;
504}

References CanRewardQuest(), CanStoreNewItem(), EQUIP_ERR_OK, Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), NULL_BAG, NULL_SLOT, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, Quest::RewardItemId, Quest::RewardItemIdCount, and SendEquipError().

◆ CanRollForItemInLFG()

InventoryResult Player::CanRollForItemInLFG ( ItemTemplate const *  item,
WorldObject const *  lootedObject 
) const
2353{
2354 if (!GetGroup() || !GetGroup()->isLFGGroup(true))
2355 return EQUIP_ERR_OK; // not in LFG group
2356
2357 // check if looted object is inside the lfg dungeon
2358 Map const* map = lootedObject->GetMap();
2359 if (!sLFGMgr->inLfgDungeonMap(GetGroup()->GetGUID(), map->GetId(), map->GetDifficulty()))
2360 return EQUIP_ERR_OK;
2361
2362 if (!proto)
2364 // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
2365
2366 const static uint32 item_weapon_skills[MAX_ITEM_SUBCLASS_WEAPON] =
2367 {
2373 }; //Copy from function Item::GetSkill()
2374
2375 if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
2377
2378 if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
2380
2381 if (proto->RequiredSkill != 0)
2382 {
2383 if (!GetSkillValue(proto->RequiredSkill))
2385 else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
2387 }
2388
2389 if (proto->Class == ITEM_CLASS_WEAPON && GetSkillValue(item_weapon_skills[proto->SubClass]) == 0)
2391
2392 if (proto->Class == ITEM_CLASS_ARMOR)
2393 {
2394 // Check for shields
2395 if (proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD && !(
2399 {
2401 }
2402
2403 // Check for librams.
2405 {
2407 }
2408
2409 // CHeck for idols.
2411 {
2413 }
2414
2415 // Check for totems.
2417 {
2419 }
2420
2421 // Check for sigils.
2423 {
2425 }
2426 }
2427
2428 if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass > ITEM_SUBCLASS_ARMOR_MISC && proto->SubClass < ITEM_SUBCLASS_ARMOR_BUCKLER &&
2429 proto->InventoryType != INVTYPE_CLOAK)
2430 {
2431 uint32 subclassToCompare = ITEM_SUBCLASS_ARMOR_CLOTH;
2433 {
2434 subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
2435 }
2437 {
2438 if ((proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat()))
2439 {
2441 }
2442 subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
2443 }
2445 {
2446 subclassToCompare = ITEM_SUBCLASS_ARMOR_MAIL;
2447 }
2449 {
2450 subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
2451 }
2453 {
2454 if (proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat())
2455 {
2457 }
2458 subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
2459 }
2460
2461 if (proto->SubClass > subclassToCompare)
2462 {
2464 }
2465 else if (sWorld->getIntConfig(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION) && proto->ItemLevel > sWorld->getIntConfig(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION))
2466 {
2467 if (proto->SubClass < subclassToCompare)
2468 {
2470 }
2471 }
2472 }
2473
2474 return EQUIP_ERR_OK;
2475}
@ EQUIP_ERR_CANT_EQUIP_SKILL
Definition: Item.h:49
@ EQUIP_ERR_NO_REQUIRED_PROFICIENCY
Definition: Item.h:55
@ EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM
Definition: Item.h:57
@ INVTYPE_CLOAK
Definition: ItemTemplate.h:272
@ ITEM_SUBCLASS_ARMOR_BUCKLER
Definition: ItemTemplate.h:395
@ ITEM_SUBCLASS_ARMOR_LIBRAM
Definition: ItemTemplate.h:397
@ ITEM_SUBCLASS_ARMOR_MISC
Definition: ItemTemplate.h:390
@ ITEM_SUBCLASS_ARMOR_SIGIL
Definition: ItemTemplate.h:400
@ ITEM_SUBCLASS_ARMOR_TOTEM
Definition: ItemTemplate.h:399
@ ITEM_SUBCLASS_ARMOR_IDOL
Definition: ItemTemplate.h:398
#define MAX_ITEM_SUBCLASS_WEAPON
Definition: ItemTemplate.h:371
@ CLASS_CONTEXT_EQUIP_SHIELDS
Definition: UnitDefines.h:218
@ CLASS_CONTEXT_EQUIP_RELIC
Definition: UnitDefines.h:217
@ CLASS_CONTEXT_EQUIP_ARMOR_CLASS
Definition: UnitDefines.h:219
#define sLFGMgr
Definition: LFGMgr.h:641
@ CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION
Definition: IWorld.h:418
@ CLASS_WARRIOR
Definition: SharedDefines.h:141
@ CLASS_ROGUE
Definition: SharedDefines.h:144
@ SKILL_BOWS
Definition: SharedDefines.h:2873
@ SKILL_MACES
Definition: SharedDefines.h:2877
@ SKILL_WANDS
Definition: SharedDefines.h:2941
@ SKILL_GUNS
Definition: SharedDefines.h:2874
@ SKILL_CROSSBOWS
Definition: SharedDefines.h:2940
@ SKILL_THROWN
Definition: SharedDefines.h:2914
@ SKILL_FISHING
Definition: SharedDefines.h:2957
@ SKILL_SWORDS
Definition: SharedDefines.h:2871
@ SKILL_DAGGERS
Definition: SharedDefines.h:2913
@ SKILL_2H_AXES
Definition: SharedDefines.h:2912
@ SKILL_POLEARMS
Definition: SharedDefines.h:2942
@ SKILL_2H_SWORDS
Definition: SharedDefines.h:2878
@ SKILL_FIST_WEAPONS
Definition: SharedDefines.h:2966
@ SKILL_2H_MACES
Definition: SharedDefines.h:2906
@ SKILL_AXES
Definition: SharedDefines.h:2872
@ SKILL_STAVES
Definition: SharedDefines.h:2894
@ SKILL_ASSASSINATION
Definition: SharedDefines.h:2946
uint32 getRaceMask() const
Definition: Unit.h:764
uint32 GetId() const
Definition: Map.h:379
Difficulty GetDifficulty() const
Definition: Map.h:443

References ItemTemplate::AllowableClass, ItemTemplate::AllowableRace, ItemTemplate::Class, CLASS_CONTEXT_EQUIP_ARMOR_CLASS, CLASS_CONTEXT_EQUIP_RELIC, CLASS_CONTEXT_EQUIP_SHIELDS, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_PALADIN, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARRIOR, CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_EQUIP_SKILL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM, Unit::getClassMask(), Map::GetDifficulty(), GetGroup(), Object::GetGUID(), Map::GetId(), WorldObject::GetMap(), Unit::getRaceMask(), GetSkillValue(), HasSpell(), ItemTemplate::HasSpellPowerStat(), ItemTemplate::HasStat(), ItemTemplate::InventoryType, INVTYPE_CLOAK, IsClass(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, ITEM_MOD_SPELL_POWER, ITEM_SUBCLASS_ARMOR_BUCKLER, ITEM_SUBCLASS_ARMOR_CLOTH, ITEM_SUBCLASS_ARMOR_IDOL, ITEM_SUBCLASS_ARMOR_LEATHER, ITEM_SUBCLASS_ARMOR_LIBRAM, ITEM_SUBCLASS_ARMOR_MAIL, ITEM_SUBCLASS_ARMOR_MISC, ITEM_SUBCLASS_ARMOR_PLATE, ITEM_SUBCLASS_ARMOR_SHIELD, ITEM_SUBCLASS_ARMOR_SIGIL, ITEM_SUBCLASS_ARMOR_TOTEM, ItemTemplate::ItemLevel, MAX_ITEM_SUBCLASS_WEAPON, ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, ItemTemplate::RequiredSpell, SKILL_2H_AXES, SKILL_2H_MACES, SKILL_2H_SWORDS, SKILL_ASSASSINATION, SKILL_AXES, SKILL_BOWS, SKILL_CROSSBOWS, SKILL_DAGGERS, SKILL_FISHING, SKILL_FIST_WEAPONS, SKILL_GUNS, SKILL_MACES, SKILL_POLEARMS, SKILL_STAVES, SKILL_SWORDS, SKILL_THROWN, SKILL_WANDS, sLFGMgr, ItemTemplate::SubClass, and sWorld.

Referenced by Group::NeedBeforeGreed().

◆ CanSeeDKPet()

bool Player::CanSeeDKPet ( ) const
inline

◆ CanSeeSpellClickOn()

bool Player::CanSeeSpellClickOn ( Creature const *  creature) const
14228{
14229 if (!c->HasNpcFlag(UNIT_NPC_FLAG_SPELLCLICK))
14230 return false;
14231
14232 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(c->GetEntry());
14233 if (clickPair.first == clickPair.second)
14234 return true;
14235
14236 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
14237 {
14238 if (!itr->second.IsFitToRequirements(this, c))
14239 return false;
14240
14241 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(c->GetEntry(), itr->second.spellId);
14242 ConditionSourceInfo info = ConditionSourceInfo(const_cast<Player*>(this), const_cast<Creature*>(c));
14243 if (sConditionMgr->IsObjectMeetToConditions(info, conds))
14244 return true;
14245 }
14246
14247 return false;
14248}
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition: ObjectMgr.h:409
@ UNIT_NPC_FLAG_SPELLCLICK
Definition: UnitDefines.h:318
Definition: ConditionMgr.h:181

References Object::GetEntry(), Unit::HasNpcFlag(), sConditionMgr, sObjectMgr, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Unit::PatchValuesUpdate().

◆ CanSeeStartQuest()

bool Player::CanSeeStartQuest ( Quest const *  quest)
238{
239 if (!DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this) && SatisfyQuestClass(quest, false) && SatisfyQuestRace(quest, false) &&
240 SatisfyQuestSkill(quest, false) && SatisfyQuestExclusiveGroup(quest, false) && SatisfyQuestReputation(quest, false) &&
241 SatisfyQuestPreviousQuest(quest, false) && SatisfyQuestNextChain(quest, false) &&
242 SatisfyQuestPrevChain(quest, false) && SatisfyQuestDay(quest, false) && SatisfyQuestWeek(quest, false) &&
243 SatisfyQuestMonth(quest, false) && SatisfyQuestSeasonal(quest, false))
244 {
245 return GetLevel() + sWorld->getIntConfig(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF) >= quest->GetMinLevel();
246 }
247
248 return false;
249}
@ DISABLE_TYPE_QUEST
Definition: DisableMgr.h:30
@ CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF
Definition: IWorld.h:292
bool IsDisabledFor(DisableType type, uint32 entry, Unit const *unit, uint8 flags)
Definition: DisableMgr.cpp:306
bool SatisfyQuestNextChain(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1214
bool SatisfyQuestExclusiveGroup(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1177
bool SatisfyQuestRace(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1097
bool SatisfyQuestClass(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1079
bool SatisfyQuestReputation(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1111
bool SatisfyQuestPreviousQuest(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:993
bool SatisfyQuestSkill(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:941
bool SatisfyQuestPrevChain(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1234

References CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF, DISABLE_TYPE_QUEST, Unit::GetLevel(), Quest::GetMinLevel(), Quest::GetQuestId(), DisableMgr::IsDisabledFor(), SatisfyQuestClass(), SatisfyQuestDay(), SatisfyQuestExclusiveGroup(), SatisfyQuestMonth(), SatisfyQuestNextChain(), SatisfyQuestPrevChain(), SatisfyQuestPreviousQuest(), SatisfyQuestRace(), SatisfyQuestReputation(), SatisfyQuestSeasonal(), SatisfyQuestSkill(), SatisfyQuestWeek(), and sWorld.

Referenced by npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), WorldSession::HandleQuestgiverChooseRewardOpcode(), and WorldSession::HandleQuestgiverCompleteQuest().

◆ CanSeeVendor()

bool Player::CanSeeVendor ( Creature const *  creature) const
14251{
14252 if (!creature->HasNpcFlag(UNIT_NPC_FLAG_VENDOR))
14253 return true;
14254
14255 ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), 0);
14256 if (!sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(this), const_cast<Creature*>(creature), conditions))
14257 {
14258 return false;
14259 }
14260
14261 return true;
14262}

References Object::GetEntry(), Unit::HasNpcFlag(), sConditionMgr, and UNIT_NPC_FLAG_VENDOR.

Referenced by Unit::PatchValuesUpdate().

◆ CanShareQuest()

bool Player::CanShareQuest ( uint32  quest_id) const
1453{
1454 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
1455 if (qInfo && qInfo->HasFlag(QUEST_FLAGS_SHARABLE))
1456 {
1457 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
1458 if (itr != m_QuestStatus.end())
1459 {
1460 // in pool and not currently available (wintergrasp weekly, dalaran weekly) - can't share
1461 if (sPoolMgr->IsPartOfAPool<Quest>(quest_id) && !sPoolMgr->IsSpawnedObject<Quest>(quest_id))
1462 {
1464 return false;
1465 }
1466
1467 return true;
1468 }
1469 }
1470 return false;
1471}
@ QUEST_FLAGS_SHARABLE
Definition: QuestDef.h:135
@ QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY
Definition: QuestDef.h:74
#define sPoolMgr
Definition: PoolMgr.h:163
void SendPushToPartyResponse(Player const *player, uint8 msg) const
Definition: PlayerQuest.cpp:2429
bool HasFlag(uint32 flag) const
Definition: QuestDef.h:220

References Quest::HasFlag(), m_QuestStatus, QUEST_FLAGS_SHARABLE, QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY, SendPushToPartyResponse(), sObjectMgr, and sPoolMgr.

Referenced by WorldSession::HandlePushQuestToParty(), and WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ CanSpeak()

bool Player::CanSpeak ( ) const
70{
71 return GetSession()->m_muteTime <= time (nullptr);
72}
time_t m_muteTime
Definition: WorldSession.h:494

References GetSession(), and WorldSession::m_muteTime.

Referenced by WorldSession::HandleMessagechatOpcode(), and misc_commandscript::HandleUnmuteCommand().

◆ CanStoreItem() [1/2]

◆ CanStoreItem() [2/2]

InventoryResult Player::CanStoreItem ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
uint32  entry,
uint32  count,
Item pItem = nullptr,
bool  swap = false,
uint32 no_space_count = nullptr 
) const
1125{
1126 LOG_DEBUG("entities.player.items", "STORAGE: CanStoreItem bag = {}, slot = {}, item = {}, count = {}", bag, slot, entry, count);
1127
1128 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(entry);
1129 if (!pProto)
1130 {
1131 if (no_space_count)
1132 *no_space_count = count;
1134 }
1135
1136 if (pItem)
1137 {
1138 // you bad chet0rz, wpe pro
1139 if( bag == NULL_BAG && slot == NULL_SLOT )
1140 if( pItem->IsBag() && pItem->IsNotEmptyBag() )
1142
1143 // Xinef: Removed next loot generated check
1144 if (pItem->GetGUID() == GetLootGUID())
1145 {
1146 if (no_space_count)
1147 *no_space_count = count;
1149 }
1150
1151 if (pItem->IsBindedNotWith(this))
1152 {
1153 if (no_space_count)
1154 *no_space_count = count;
1156 }
1157 }
1158
1159 // check count of items (skip for auto move for same player from bank)
1160 uint32 no_similar_count = 0; // can't store this amount similar items
1161 InventoryResult res = CanTakeMoreSimilarItems(entry, count, pItem, &no_similar_count);
1162 if (res != EQUIP_ERR_OK)
1163 {
1164 if (count == no_similar_count)
1165 {
1166 if (no_space_count)
1167 *no_space_count = no_similar_count;
1168 return res;
1169 }
1170 count -= no_similar_count;
1171 }
1172
1173 // in specific slot
1174 if (bag != NULL_BAG && slot != NULL_SLOT)
1175 {
1176 res = CanStoreItem_InSpecificSlot(bag, slot, dest, pProto, count, swap, pItem);
1177 if (res != EQUIP_ERR_OK)
1178 {
1179 if (no_space_count)
1180 *no_space_count = count + no_similar_count;
1181 return res;
1182 }
1183
1184 if (count == 0)
1185 {
1186 if (no_similar_count == 0)
1187 return EQUIP_ERR_OK;
1188
1189 if (no_space_count)
1190 *no_space_count = count + no_similar_count;
1192 }
1193 }
1194
1195 // not specific slot or have space for partly store only in specific slot
1196
1197 // in specific bag
1198 if (bag != NULL_BAG)
1199 {
1200 // search stack in bag for merge to
1201 if (pProto->Stackable != 1)
1202 {
1203 if (bag == INVENTORY_SLOT_BAG_0) // inventory
1204 {
1205 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, true, pItem, bag, slot);
1206 if (res != EQUIP_ERR_OK)
1207 {
1208 if (no_space_count)
1209 *no_space_count = count + no_similar_count;
1210 return res;
1211 }
1212
1213 if (count == 0)
1214 {
1215 if (no_similar_count == 0)
1216 return EQUIP_ERR_OK;
1217
1218 if (no_space_count)
1219 *no_space_count = count + no_similar_count;
1221 }
1222
1223 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
1224 if (res != EQUIP_ERR_OK)
1225 {
1226 if (no_space_count)
1227 *no_space_count = count + no_similar_count;
1228 return res;
1229 }
1230
1231 if (count == 0)
1232 {
1233 if (no_similar_count == 0)
1234 return EQUIP_ERR_OK;
1235
1236 if (no_space_count)
1237 *no_space_count = count + no_similar_count;
1239 }
1240 }
1241 else // equipped bag
1242 {
1243 // we need check 2 time (specialized/non_specialized), use NULL_BAG to prevent skipping bag
1244 res = CanStoreItem_InBag(bag, dest, pProto, count, true, false, pItem, NULL_BAG, slot);
1245 if (res != EQUIP_ERR_OK)
1246 res = CanStoreItem_InBag(bag, dest, pProto, count, true, true, pItem, NULL_BAG, slot);
1247
1248 if (res != EQUIP_ERR_OK)
1249 {
1250 if (no_space_count)
1251 *no_space_count = count + no_similar_count;
1252 return res;
1253 }
1254
1255 if (count == 0)
1256 {
1257 if (no_similar_count == 0)
1258 return EQUIP_ERR_OK;
1259
1260 if (no_space_count)
1261 *no_space_count = count + no_similar_count;
1263 }
1264 }
1265 }
1266
1267 // search free slot in bag for place to
1268 if (bag == INVENTORY_SLOT_BAG_0) // inventory
1269 {
1270 // search free slot - keyring case
1271 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1272 {
1273 uint32 keyringSize = GetMaxKeyringSize();
1274 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, KEYRING_SLOT_START + keyringSize, dest, pProto, count, false, pItem, bag, slot);
1275 if (res != EQUIP_ERR_OK)
1276 {
1277 if (no_space_count)
1278 *no_space_count = count + no_similar_count;
1279 return res;
1280 }
1281
1282 if (count == 0)
1283 {
1284 if (no_similar_count == 0)
1285 return EQUIP_ERR_OK;
1286
1287 if (no_space_count)
1288 *no_space_count = count + no_similar_count;
1290 }
1291
1292 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1293 if (res != EQUIP_ERR_OK)
1294 {
1295 if (no_space_count)
1296 *no_space_count = count + no_similar_count;
1297 return res;
1298 }
1299
1300 if (count == 0)
1301 {
1302 if (no_similar_count == 0)
1303 return EQUIP_ERR_OK;
1304
1305 if (no_space_count)
1306 *no_space_count = count + no_similar_count;
1308 }
1309 }
1310 else if (pProto->IsCurrencyToken())
1311 {
1312 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1313 if (res != EQUIP_ERR_OK)
1314 {
1315 if (no_space_count)
1316 *no_space_count = count + no_similar_count;
1317 return res;
1318 }
1319
1320 if (count == 0)
1321 {
1322 if (no_similar_count == 0)
1323 return EQUIP_ERR_OK;
1324
1325 if (no_space_count)
1326 *no_space_count = count + no_similar_count;
1328 }
1329 }
1330
1331 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
1332 if (res != EQUIP_ERR_OK)
1333 {
1334 if (no_space_count)
1335 *no_space_count = count + no_similar_count;
1336 return res;
1337 }
1338
1339 if (count == 0)
1340 {
1341 if (no_similar_count == 0)
1342 return EQUIP_ERR_OK;
1343
1344 if (no_space_count)
1345 *no_space_count = count + no_similar_count;
1347 }
1348 }
1349 else // equipped bag
1350 {
1351 res = CanStoreItem_InBag(bag, dest, pProto, count, false, false, pItem, NULL_BAG, slot);
1352 if (res != EQUIP_ERR_OK)
1353 res = CanStoreItem_InBag(bag, dest, pProto, count, false, true, pItem, NULL_BAG, slot);
1354
1355 if (res != EQUIP_ERR_OK)
1356 {
1357 if (no_space_count)
1358 *no_space_count = count + no_similar_count;
1359 return res;
1360 }
1361
1362 if (count == 0)
1363 {
1364 if (no_similar_count == 0)
1365 return EQUIP_ERR_OK;
1366
1367 if (no_space_count)
1368 *no_space_count = count + no_similar_count;
1370 }
1371 }
1372 }
1373
1374 // not specific bag or have space for partly store only in specific bag
1375
1376 // search stack for merge to
1377 if (pProto->Stackable != 1)
1378 {
1379 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, true, pItem, bag, slot);
1380 if (res != EQUIP_ERR_OK)
1381 {
1382 if (no_space_count)
1383 *no_space_count = count + no_similar_count;
1384 return res;
1385 }
1386
1387 if (count == 0)
1388 {
1389 if (no_similar_count == 0)
1390 return EQUIP_ERR_OK;
1391
1392 if (no_space_count)
1393 *no_space_count = count + no_similar_count;
1395 }
1396
1397 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
1398 if (res != EQUIP_ERR_OK)
1399 {
1400 if (no_space_count)
1401 *no_space_count = count + no_similar_count;
1402 return res;
1403 }
1404
1405 if (count == 0)
1406 {
1407 if (no_similar_count == 0)
1408 return EQUIP_ERR_OK;
1409
1410 if (no_space_count)
1411 *no_space_count = count + no_similar_count;
1413 }
1414
1415 if (pProto->BagFamily)
1416 {
1418 {
1419 res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot);
1420 if (res != EQUIP_ERR_OK)
1421 continue;
1422
1423 if (count == 0)
1424 {
1425 if (no_similar_count == 0)
1426 return EQUIP_ERR_OK;
1427
1428 if (no_space_count)
1429 *no_space_count = count + no_similar_count;
1431 }
1432 }
1433 }
1434
1436 {
1437 res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
1438 if (res != EQUIP_ERR_OK)
1439 continue;
1440
1441 if (count == 0)
1442 {
1443 if (no_similar_count == 0)
1444 return EQUIP_ERR_OK;
1445
1446 if (no_space_count)
1447 *no_space_count = count + no_similar_count;
1449 }
1450 }
1451 }
1452
1453 // search free slot - special bag case
1454 if (pProto->BagFamily)
1455 {
1456 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1457 {
1458 uint32 keyringSize = GetMaxKeyringSize();
1459 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, KEYRING_SLOT_START + keyringSize, dest, pProto, count, false, pItem, bag, slot);
1460 if (res != EQUIP_ERR_OK)
1461 {
1462 if (no_space_count)
1463 *no_space_count = count + no_similar_count;
1464 return res;
1465 }
1466
1467 if (count == 0)
1468 {
1469 if (no_similar_count == 0)
1470 return EQUIP_ERR_OK;
1471
1472 if (no_space_count)
1473 *no_space_count = count + no_similar_count;
1475 }
1476 }
1477 else if (pProto->IsCurrencyToken())
1478 {
1479 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1480 if (res != EQUIP_ERR_OK)
1481 {
1482 if (no_space_count)
1483 *no_space_count = count + no_similar_count;
1484 return res;
1485 }
1486
1487 if (count == 0)
1488 {
1489 if (no_similar_count == 0)
1490 return EQUIP_ERR_OK;
1491
1492 if (no_space_count)
1493 *no_space_count = count + no_similar_count;
1495 }
1496 }
1497
1499 {
1500 res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot);
1501 if (res != EQUIP_ERR_OK)
1502 continue;
1503
1504 if (count == 0)
1505 {
1506 if (no_similar_count == 0)
1507 return EQUIP_ERR_OK;
1508
1509 if (no_space_count)
1510 *no_space_count = count + no_similar_count;
1512 }
1513 }
1514 }
1515
1516 if (pItem && pItem->IsNotEmptyBag())
1518
1519 // search free slot
1520 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
1521 if (res != EQUIP_ERR_OK)
1522 {
1523 if (no_space_count)
1524 *no_space_count = count + no_similar_count;
1525 return res;
1526 }
1527
1528 if (count == 0)
1529 {
1530 if (no_similar_count == 0)
1531 return EQUIP_ERR_OK;
1532
1533 if (no_space_count)
1534 *no_space_count = count + no_similar_count;
1536 }
1537
1539 {
1540 res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
1541 if (res != EQUIP_ERR_OK)
1542 continue;
1543
1544 if (count == 0)
1545 {
1546 if (no_similar_count == 0)
1547 return EQUIP_ERR_OK;
1548
1549 if (no_space_count)
1550 *no_space_count = count + no_similar_count;
1552 }
1553 }
1554
1555 if (no_space_count)
1556 *no_space_count = count + no_similar_count;
1557
1559}
@ EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS
Definition: Item.h:78
@ BAG_FAMILY_MASK_KEYS
Definition: ItemTemplate.h:235
@ INVENTORY_SLOT_ITEM_START
Definition: Player.h:705
@ INVENTORY_SLOT_ITEM_END
Definition: Player.h:706
bool IsCurrencyToken() const
Definition: ItemTemplate.h:727
uint32 GetMaxKeyringSize() const
Definition: Player.h:1346

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanTakeMoreSimilarItems(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, Object::GetGUID(), GetLootGUID(), GetMaxKeyringSize(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Item::IsBag(), Item::IsBindedNotWith(), ItemTemplate::IsCurrencyToken(), Item::IsNotEmptyBag(), KEYRING_SLOT_START, LOG_DEBUG, NULL_BAG, NULL_SLOT, sObjectMgr, and ItemTemplate::Stackable.

◆ CanStoreItem_InBag()

InventoryResult Player::CanStoreItem_InBag ( uint8  bag,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  merge,
bool  non_specialized,
Item pSrcItem,
uint8  skip_bag,
uint8  skip_slot 
) const
private
1004{
1005 // skip specific bag already processed in first called CanStoreItem_InBag
1006 if (bag == skip_bag)
1008
1009 // skip not existed bag or self targeted bag
1010 Bag* pBag = GetBagByPos(bag);
1011 if (!pBag || pBag == pSrcItem || (pSrcItem && (pSrcItem->GetGUID() == pBag->GetGUID())) )
1013
1014 if (pSrcItem && pSrcItem->IsNotEmptyBag())
1016
1017 ItemTemplate const* pBagProto = pBag->GetTemplate();
1018 if (!pBagProto)
1020
1021 // specialized bag mode or non-specilized
1022 if (non_specialized != (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER))
1024
1025 if (!ItemCanGoIntoBag(pProto, pBagProto))
1027
1028 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
1029 {
1030 // skip specific slot already processed in first called CanStoreItem_InSpecificSlot
1031 if (j == skip_slot)
1032 continue;
1033
1034 Item* pItem2 = GetItemByPos(bag, j);
1035
1036 // ignore move item (this slot will be empty at move)
1037 if (pItem2 == pSrcItem)
1038 pItem2 = nullptr;
1039
1040 // if merge skip empty, if !merge skip non-empty
1041 if ((pItem2 != nullptr) != merge)
1042 continue;
1043
1044 uint32 need_space = pProto->GetMaxStackSize();
1045
1046 if (pItem2)
1047 {
1048 // can be merged at least partly
1049 uint8 res = pItem2->CanBeMergedPartlyWith(pProto);
1050 if (res != EQUIP_ERR_OK)
1051 continue;
1052
1053 // descrease at current stacksize
1054 need_space -= pItem2->GetCount();
1055 }
1056
1057 if (need_space > count)
1058 need_space = count;
1059
1060 ItemPosCount newPosition = ItemPosCount((bag << 8) | j, need_space);
1061 if (!newPosition.isContainedIn(dest))
1062 {
1063 dest.push_back(newPosition);
1064 count -= need_space;
1065
1066 if (count == 0)
1067 return EQUIP_ERR_OK;
1068 }
1069 }
1070 return EQUIP_ERR_OK;
1071}
bool ItemCanGoIntoBag(ItemTemplate const *pProto, ItemTemplate const *pBagProto)
Definition: Item.cpp:177
@ EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG
Definition: Item.h:62
@ ITEM_SUBCLASS_CONTAINER
Definition: ItemTemplate.h:329
@ ITEM_CLASS_CONTAINER
Definition: ItemTemplate.h:292
uint32 GetBagSize() const
Definition: Bag.h:48
InventoryResult CanBeMergedPartlyWith(ItemTemplate const *proto) const
Definition: Item.cpp:868
Definition: Player.h:765
bool isContainedIn(std::vector< ItemPosCount > const &vec) const
Definition: Player.cpp:13096

References Item::CanBeMergedPartlyWith(), ItemTemplate::Class, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG, EQUIP_ERR_OK, GetBagByPos(), Bag::GetBagSize(), Item::GetCount(), Object::GetGUID(), GetItemByPos(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), ItemPosCount::isContainedIn(), Item::IsNotEmptyBag(), ITEM_CLASS_CONTAINER, ITEM_SUBCLASS_CONTAINER, ItemCanGoIntoBag(), and ItemTemplate::SubClass.

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItem_InInventorySlots()

InventoryResult Player::CanStoreItem_InInventorySlots ( uint8  slot_begin,
uint8  slot_end,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  merge,
Item pSrcItem,
uint8  skip_bag,
uint8  skip_slot 
) const
private
1074{
1075 //this is never called for non-bag slots so we can do this
1076 if (pSrcItem && pSrcItem->IsNotEmptyBag())
1078
1079 for (uint32 j = slot_begin; j < slot_end; j++)
1080 {
1081 // skip specific slot already processed in first called CanStoreItem_InSpecificSlot
1082 if (INVENTORY_SLOT_BAG_0 == skip_bag && j == skip_slot)
1083 continue;
1084
1086
1087 // ignore move item (this slot will be empty at move)
1088 if (pItem2 == pSrcItem)
1089 pItem2 = nullptr;
1090
1091 // if merge skip empty, if !merge skip non-empty
1092 if ((pItem2 != nullptr) != merge)
1093 continue;
1094
1095 uint32 need_space = pProto->GetMaxStackSize();
1096
1097 if (pItem2)
1098 {
1099 // can be merged at least partly
1100 uint8 res = pItem2->CanBeMergedPartlyWith(pProto);
1101 if (res != EQUIP_ERR_OK)
1102 continue;
1103
1104 // descrease at current stacksize
1105 need_space -= pItem2->GetCount();
1106 }
1107
1108 if (need_space > count)
1109 need_space = count;
1110
1111 ItemPosCount newPosition = ItemPosCount((INVENTORY_SLOT_BAG_0 << 8) | j, need_space);
1112 if (!newPosition.isContainedIn(dest))
1113 {
1114 dest.push_back(newPosition);
1115 count -= need_space;
1116
1117 if (count == 0)
1118 return EQUIP_ERR_OK;
1119 }
1120 }
1121 return EQUIP_ERR_OK;
1122}

References Item::CanBeMergedPartlyWith(), EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_OK, Item::GetCount(), GetItemByPos(), ItemTemplate::GetMaxStackSize(), INVENTORY_SLOT_BAG_0, ItemPosCount::isContainedIn(), and Item::IsNotEmptyBag().

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItem_InSpecificSlot()

InventoryResult Player::CanStoreItem_InSpecificSlot ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  swap,
Item pSrcItem 
) const
private
933{
934 Item* pItem2 = GetItemByPos(bag, slot);
935
936 // ignore move item (this slot will be empty at move)
937 if (pItem2 == pSrcItem)
938 pItem2 = nullptr;
939
940 uint32 need_space;
941
942 // empty specific slot - check item fit to slot
943 if (!pItem2 || swap)
944 {
945 if (bag == INVENTORY_SLOT_BAG_0)
946 {
947 // keyring case
948 if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START + GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS))
950
951 // currencytoken case
952 if (slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(pProto->IsCurrencyToken()))
954
955 // prevent cheating
956 if ((slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) || slot >= PLAYER_SLOT_END)
958 }
959 else
960 {
961 Bag* pBag = GetBagByPos(bag);
962 if (!pBag)
964
965 ItemTemplate const* pBagProto = pBag->GetTemplate();
966 if (!pBagProto)
968
969 if (slot >= pBagProto->ContainerSlots)
971
972 if (!ItemCanGoIntoBag(pProto, pBagProto))
974 }
975
976 // non empty stack with space
977 need_space = pProto->GetMaxStackSize();
978 }
979 // non empty slot, check item type
980 else
981 {
982 // can be merged at least partly
983 InventoryResult res = pItem2->CanBeMergedPartlyWith(pProto);
984 if (res != EQUIP_ERR_OK)
985 return res;
986
987 // free stack space or infinity
988 need_space = pProto->GetMaxStackSize() - pItem2->GetCount();
989 }
990
991 if (need_space > count)
992 need_space = count;
993
994 ItemPosCount newPosition = ItemPosCount((bag << 8) | slot, need_space);
995 if (!newPosition.isContainedIn(dest))
996 {
997 dest.push_back(newPosition);
998 count -= need_space;
999 }
1000 return EQUIP_ERR_OK;
1001}
uint32 ContainerSlots
Definition: ItemTemplate.h:646

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, BUYBACK_SLOT_END, BUYBACK_SLOT_START, Item::CanBeMergedPartlyWith(), ItemTemplate::ContainerSlots, CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG, EQUIP_ERR_OK, GetBagByPos(), Item::GetCount(), GetItemByPos(), GetMaxKeyringSize(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemPosCount::isContainedIn(), ItemTemplate::IsCurrencyToken(), ItemCanGoIntoBag(), KEYRING_SLOT_START, and PLAYER_SLOT_END.

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItems()

InventoryResult Player::CanStoreItems ( Item **  pItem,
int32  count 
) const
1563{
1564 Item* pItem2;
1565
1566 // fill space table
1569 int inv_keys[KEYRING_SLOT_END - KEYRING_SLOT_START];
1571
1572 memset(inv_slot_items, 0, sizeof(int) * (INVENTORY_SLOT_ITEM_END - INVENTORY_SLOT_ITEM_START));
1573 memset(inv_bags, 0, sizeof(int) * (INVENTORY_SLOT_BAG_END - INVENTORY_SLOT_BAG_START) * MAX_BAG_SIZE);
1574 memset(inv_keys, 0, sizeof(int) * (KEYRING_SLOT_END - KEYRING_SLOT_START));
1575 memset(inv_tokens, 0, sizeof(int) * (CURRENCYTOKEN_SLOT_END - CURRENCYTOKEN_SLOT_START));
1576
1578 {
1580 if (pItem2 && !pItem2->IsInTrade())
1581 inv_slot_items[i - INVENTORY_SLOT_ITEM_START] = pItem2->GetCount();
1582 }
1583
1584 for (uint8 i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
1585 {
1587 if (pItem2 && !pItem2->IsInTrade())
1588 inv_keys[i - KEYRING_SLOT_START] = pItem2->GetCount();
1589 }
1590
1592 {
1594 if (pItem2 && !pItem2->IsInTrade())
1595 inv_tokens[i - CURRENCYTOKEN_SLOT_START] = pItem2->GetCount();
1596 }
1597
1599 if (Bag* pBag = GetBagByPos(i))
1600 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
1601 {
1602 pItem2 = GetItemByPos(i, j);
1603 if (pItem2 && !pItem2->IsInTrade())
1604 inv_bags[i - INVENTORY_SLOT_BAG_START][j] = pItem2->GetCount();
1605 }
1606
1607 // check free space for all items
1608 for (int k = 0; k < count; ++k)
1609 {
1610 Item* pItem = pItems[k];
1611
1612 // no item
1613 if (!pItem)
1614 continue;
1615
1616 LOG_DEBUG("entities.player.items", "STORAGE: CanStoreItems {}. item = {}, count = {}", k + 1, pItem->GetEntry(), pItem->GetCount());
1617 ItemTemplate const* pProto = pItem->GetTemplate();
1618
1619 // strange item
1620 if (!pProto)
1622
1623 // Xinef: Removed next loot generated check
1624 if (pItem->GetGUID() == GetLootGUID())
1626
1627 // item it 'bind'
1628 if (pItem->IsBindedNotWith(this))
1630
1631 ItemTemplate const* pBagProto;
1632
1633 // item is 'one item only'
1635 if (res != EQUIP_ERR_OK)
1636 return res;
1637
1638 // search stack for merge to
1639 if (pProto->Stackable != 1)
1640 {
1641 bool b_found = false;
1642
1643 for (uint8 t = KEYRING_SLOT_START; t < KEYRING_SLOT_END; ++t)
1644 {
1646 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_keys[t - KEYRING_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1647 {
1648 inv_keys[t - KEYRING_SLOT_START] += pItem->GetCount();
1649 b_found = true;
1650 break;
1651 }
1652 }
1653 if (b_found)
1654 continue;
1655
1656 for (int t = CURRENCYTOKEN_SLOT_START; t < CURRENCYTOKEN_SLOT_END; ++t)
1657 {
1659 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_tokens[t - CURRENCYTOKEN_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1660 {
1661 inv_tokens[t - CURRENCYTOKEN_SLOT_START] += pItem->GetCount();
1662 b_found = true;
1663 break;
1664 }
1665 }
1666 if (b_found)
1667 continue;
1668
1670 {
1672 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_slot_items[t - INVENTORY_SLOT_ITEM_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1673 {
1674 inv_slot_items[t - INVENTORY_SLOT_ITEM_START] += pItem->GetCount();
1675 b_found = true;
1676 break;
1677 }
1678 }
1679 if (b_found)
1680 continue;
1681
1682 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1683 {
1684 if (Bag* bag = GetBagByPos(t))
1685 {
1686 if (ItemCanGoIntoBag(pItem->GetTemplate(), bag->GetTemplate()))
1687 {
1688 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1689 {
1690 pItem2 = GetItemByPos(t, j);
1691 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_bags[t - INVENTORY_SLOT_BAG_START][j] + pItem->GetCount() <= pProto->GetMaxStackSize())
1692 {
1693 inv_bags[t - INVENTORY_SLOT_BAG_START][j] += pItem->GetCount();
1694 b_found = true;
1695 break;
1696 }
1697 }
1698 }
1699 }
1700 }
1701 if (b_found)
1702 continue;
1703 }
1704
1705 // special bag case
1706 if (pProto->BagFamily)
1707 {
1708 bool b_found = false;
1709 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1710 {
1711 uint32 keyringSize = GetMaxKeyringSize();
1712 for (uint32 t = KEYRING_SLOT_START; t < KEYRING_SLOT_START + keyringSize; ++t)
1713 {
1714 if (inv_keys[t - KEYRING_SLOT_START] == 0)
1715 {
1716 inv_keys[t - KEYRING_SLOT_START] = 1;
1717 b_found = true;
1718 break;
1719 }
1720 }
1721 }
1722
1723 if (b_found)
1724 continue;
1725
1726 if (pProto->IsCurrencyToken())
1727 {
1729 {
1730 if (inv_tokens[t - CURRENCYTOKEN_SLOT_START] == 0)
1731 {
1732 inv_tokens[t - CURRENCYTOKEN_SLOT_START] = 1;
1733 b_found = true;
1734 break;
1735 }
1736 }
1737 }
1738
1739 if (b_found)
1740 continue;
1741
1742 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1743 {
1744 if (Bag* bag = GetBagByPos(t))
1745 {
1746 pBagProto = bag->GetTemplate();
1747
1748 // not plain container check
1749 if (pBagProto && (pBagProto->Class != ITEM_CLASS_CONTAINER || pBagProto->SubClass != ITEM_SUBCLASS_CONTAINER) &&
1750 ItemCanGoIntoBag(pProto, pBagProto))
1751 {
1752 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1753 {
1754 if (inv_bags[t - INVENTORY_SLOT_BAG_START][j] == 0)
1755 {
1756 inv_bags[t - INVENTORY_SLOT_BAG_START][j] = 1;
1757 b_found = true;
1758 break;
1759 }
1760 }
1761 }
1762 }
1763 }
1764 if (b_found)
1765 continue;
1766 }
1767
1768 // search free slot
1769 bool b_found = false;
1771 {
1772 if (inv_slot_items[t - INVENTORY_SLOT_ITEM_START] == 0)
1773 {
1774 inv_slot_items[t - INVENTORY_SLOT_ITEM_START] = 1;
1775 b_found = true;
1776 break;
1777 }
1778 }
1779 if (b_found)
1780 continue;
1781
1782 // search free slot in bags
1783 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1784 {
1785 if (Bag* bag = GetBagByPos(t))
1786 {
1787 pBagProto = bag->GetTemplate();
1788
1789 // special bag already checked
1790 if (pBagProto && (pBagProto->Class != ITEM_CLASS_CONTAINER || pBagProto->SubClass != ITEM_SUBCLASS_CONTAINER))
1791 continue;
1792
1793 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1794 {
1795 if (inv_bags[t - INVENTORY_SLOT_BAG_START][j] == 0)
1796 {
1797 inv_bags[t - INVENTORY_SLOT_BAG_START][j] = 1;
1798 b_found = true;
1799 break;
1800 }
1801 }
1802 }
1803 }
1804
1805 // no free slot found?
1806 if (!b_found)
1808 }
1809
1810 return EQUIP_ERR_OK;
1811}
@ KEYRING_SLOT_END
Definition: Player.h:731
bool IsInTrade() const
Definition: Item.h:260

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, Item::CanBeMergedPartlyWith(), CanTakeMoreSimilarItems(), ItemTemplate::Class, CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, GetBagByPos(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), GetLootGUID(), GetMaxKeyringSize(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Item::IsBindedNotWith(), ItemTemplate::IsCurrencyToken(), Item::IsInTrade(), ITEM_CLASS_CONTAINER, ITEM_SUBCLASS_CONTAINER, ItemCanGoIntoBag(), KEYRING_SLOT_END, KEYRING_SLOT_START, LOG_DEBUG, MAX_BAG_SIZE, ItemTemplate::Stackable, and ItemTemplate::SubClass.

Referenced by WorldSession::HandleAcceptTradeOpcode().

◆ CanStoreNewItem()

◆ CanTakeMoreSimilarItems() [1/3]

InventoryResult Player::CanTakeMoreSimilarItems ( Item pItem) const
inline

◆ CanTakeMoreSimilarItems() [2/3]

InventoryResult Player::CanTakeMoreSimilarItems ( uint32  entry,
uint32  count 
) const
inline
1271{ return CanTakeMoreSimilarItems(entry, count, nullptr); }

References CanTakeMoreSimilarItems().

Referenced by CanTakeMoreSimilarItems().

◆ CanTakeMoreSimilarItems() [3/3]

InventoryResult Player::CanTakeMoreSimilarItems ( uint32  entry,
uint32  count,
Item pItem,
uint32 no_space_count = nullptr 
) const
824{
825 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(entry);
826 if (!pProto)
827 {
828 if (no_space_count)
829 *no_space_count = count;
831 }
832
833 // no maximum
834 if ((pProto->MaxCount <= 0 && pProto->ItemLimitCategory == 0) || pProto->MaxCount == 2147483647)
835 return EQUIP_ERR_OK;
836
837 if (pProto->MaxCount > 0)
838 {
839 uint32 curcount = GetItemCount(pProto->ItemId, true, pItem);
840 if (curcount + count > uint32(pProto->MaxCount))
841 {
842 if (no_space_count)
843 *no_space_count = count + curcount - pProto->MaxCount;
845 }
846 }
847
848 // check unique-equipped limit
849 if (pProto->ItemLimitCategory)
850 {
851 ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(pProto->ItemLimitCategory);
852 if (!limitEntry)
853 {
854 if (no_space_count)
855 *no_space_count = count;
857 }
858
859 if (limitEntry->mode == ITEM_LIMIT_CATEGORY_MODE_HAVE)
860 {
861 uint32 curcount = GetItemCountWithLimitCategory(pProto->ItemLimitCategory, pItem);
862 if (curcount + count > uint32(limitEntry->maxCount))
863 {
864 if (no_space_count)
865 *no_space_count = count + curcount - limitEntry->maxCount;
867 }
868 }
869 }
870
871 return EQUIP_ERR_OK;
872}
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED
Definition: Item.h:130
@ ITEM_LIMIT_CATEGORY_MODE_HAVE
Definition: DBCEnums.h:379
uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item *skipItem=nullptr) const
Definition: PlayerStorage.cpp:395
uint32 mode
Definition: DBCStructure.h:1201

References EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED, EQUIP_ERR_OK, GetItemCount(), GetItemCountWithLimitCategory(), ITEM_LIMIT_CATEGORY_MODE_HAVE, ItemTemplate::ItemId, ItemTemplate::ItemLimitCategory, ItemTemplate::MaxCount, ItemLimitCategoryEntry::maxCount, ItemLimitCategoryEntry::mode, sItemLimitCategoryStore, and sObjectMgr.

◆ CanTakeQuest()

bool Player::CanTakeQuest ( Quest const *  quest,
bool  msg 
)
252{
253 return !DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this)
254 && SatisfyQuestStatus(quest, msg) && SatisfyQuestExclusiveGroup(quest, msg)
255 && SatisfyQuestClass(quest, msg) && SatisfyQuestRace(quest, msg) && SatisfyQuestLevel(quest, msg)
256 && SatisfyQuestSkill(quest, msg) && SatisfyQuestReputation(quest, msg)
257 && SatisfyQuestPreviousQuest(quest, msg) && SatisfyQuestTimed(quest, msg)
258 && SatisfyQuestNextChain(quest, msg) && SatisfyQuestPrevChain(quest, msg)
259 && SatisfyQuestDay(quest, msg) && SatisfyQuestWeek(quest, msg)
260 && SatisfyQuestMonth(quest, msg) && SatisfyQuestSeasonal(quest, msg)
261 && SatisfyQuestConditions(quest, msg);
262}
bool SatisfyQuestConditions(Quest const *qInfo, bool msg)
Definition: PlayerQuest.cpp:1153
bool SatisfyQuestTimed(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1166
bool SatisfyQuestLevel(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:961
bool SatisfyQuestStatus(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1142

References DISABLE_TYPE_QUEST, Quest::GetQuestId(), DisableMgr::IsDisabledFor(), SatisfyQuestClass(), SatisfyQuestConditions(), SatisfyQuestDay(), SatisfyQuestExclusiveGroup(), SatisfyQuestLevel(), SatisfyQuestMonth(), SatisfyQuestNextChain(), SatisfyQuestPrevChain(), SatisfyQuestPreviousQuest(), SatisfyQuestRace(), SatisfyQuestReputation(), SatisfyQuestSeasonal(), SatisfyQuestSkill(), SatisfyQuestStatus(), SatisfyQuestTimed(), and SatisfyQuestWeek().

Referenced by CanCompleteQuest(), CanCompleteRepeatableQuest(), Spell::EffectQuestComplete(), Spell::EffectQuestStart(), npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), npc_wg_quest_giver::OnGossipHello(), PrepareQuestMenu(), SendPreparedQuest(), and npc_costumed_orphan_matron::sGossipHello().

◆ CanTameExoticPets()

bool Player::CanTameExoticPets ( ) const
inline

◆ CanTeleport()

bool Player::CanTeleport ( )
inline
2474{ return m_canTeleport; }

References m_canTeleport.

◆ CanTitanGrip()

bool Player::CanTitanGrip ( ) const
inline

◆ CanUnequipItem()

InventoryResult Player::CanUnequipItem ( uint16  src,
bool  swap 
) const
2000{
2001 if (!sScriptMgr->CanUnequipItem(const_cast<Player*>(this), pos, swap))
2003
2004 // Applied only to equipped items and bank bags
2005 if (!IsEquipmentPos(pos) && !IsBagPos(pos))
2006 return EQUIP_ERR_OK;
2007
2008 Item* pItem = GetItemByPos(pos);
2009
2010 // Applied only to existed equipped item
2011 if (!pItem)
2012 return EQUIP_ERR_OK;
2013
2014 LOG_DEBUG("entities.player.items", "STORAGE: CanUnequipItem slot = {}, item = {}, count = {}", pos, pItem->GetEntry(), pItem->GetCount());
2015
2016 ItemTemplate const* pProto = pItem->GetTemplate();
2017 if (!pProto)
2019
2020 // item used
2021 if (pItem->m_lootGenerated)
2023
2024 // do not allow unequipping gear except weapons, offhands, projectiles, relics in
2025 // - combat
2026 // - in-progress arenas
2027 if (!pProto->CanChangeEquipStateInCombat())
2028 {
2029 if (IsInCombat())
2031
2032 if (Battleground* bg = GetBattleground())
2033 if (bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS)
2035 }
2036
2037 // Xinef: dont allow to unequip items on disarmed slot
2040
2041 if (!swap && pItem->IsNotEmptyBag())
2043
2044 return EQUIP_ERR_OK;
2045}

References ItemTemplate::CanChangeEquipStateInCombat(), Unit::CanUseAttackType(), EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NOT_DURING_ARENA_MATCH, EQUIP_ERR_NOT_IN_COMBAT, EQUIP_ERR_NOT_WHILE_DISARMED, EQUIP_ERR_OK, GetAttackBySlot(), GetBattleground(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), Item::GetSlot(), Item::GetTemplate(), IsBagPos(), IsEquipmentPos(), Unit::IsInCombat(), Item::IsNotEmptyBag(), LOG_DEBUG, Item::m_lootGenerated, sScriptMgr, and STATUS_IN_PROGRESS.

Referenced by CanEquipItem(), CanUnequipItems(), DestroyItemCount(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetUse(), and SwapItem().

◆ CanUnequipItems()

InventoryResult Player::CanUnequipItems ( uint32  item,
uint32  count 
) const
297{
298 uint32 tempcount = 0;
299
301
303 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
304 if (pItem->GetEntry() == item)
305 {
307 if (ires == EQUIP_ERR_OK)
308 {
309 tempcount += pItem->GetCount();
310 if (tempcount >= count)
311 return EQUIP_ERR_OK;
312 }
313 else
314 res = ires;
315 }
316
318 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
319 if (pItem->GetEntry() == item)
320 {
321 tempcount += pItem->GetCount();
322 if (tempcount >= count)
323 return EQUIP_ERR_OK;
324 }
325
327 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
328 if (pItem->GetEntry() == item)
329 {
330 tempcount += pItem->GetCount();
331 if (tempcount >= count)
332 return EQUIP_ERR_OK;
333 }
334
336 if (Bag* pBag = GetBagByPos(i))
337 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
338 if (Item* pItem = GetItemByPos(i, j))
339 if (pItem->GetEntry() == item)
340 {
341 tempcount += pItem->GetCount();
342 if (tempcount >= count)
343 return EQUIP_ERR_OK;
344 }
345
346 // not found req. item count and have unequippable items
347 return res;
348}
@ EQUIPMENT_SLOT_START
Definition: Player.h:674

References CanUnequipItem(), CURRENCYTOKEN_SLOT_END, EQUIP_ERR_OK, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and KEYRING_SLOT_START.

Referenced by TakeQuestSourceItem().

◆ CanUninviteFromGroup()

PartyResult Player::CanUninviteFromGroup ( ObjectGuid  targetPlayerGUID = ObjectGuid::Empty) const
Todo:
: Should also be sent when anyone has recently left combat, with an aprox ~5 seconds timer.
12959{
12960 Group const* grp = GetGroup();
12961 if (!grp)
12962 return ERR_NOT_IN_GROUP;
12963
12964 if (grp->isLFGGroup(true))
12965 {
12966 ObjectGuid gguid = grp->GetGUID();
12967 if (!sLFGMgr->GetKicksLeft(gguid))
12969
12970 lfg::LfgState state = sLFGMgr->GetState(gguid);
12971 if (state == lfg::LFG_STATE_BOOT)
12973
12976
12979
12980 if (grp->isRollLootActive())
12982
12984 for (GroupReference const* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
12985 if (itr->GetSource() && itr->GetSource()->IsInMap(this) && itr->GetSource()->IsInCombat())
12987
12988 if (Player* target = ObjectAccessor::FindConnectedPlayer(targetPlayerGUID))
12989 {
12990 if (Aura* dungeonCooldownAura = target->GetAura(lfg::LFG_SPELL_DUNGEON_COOLDOWN))
12991 {
12992 int32 elapsedTime = dungeonCooldownAura->GetMaxDuration() - dungeonCooldownAura->GetDuration();
12993 if (static_cast<int32>(sWorld->getIntConfig(CONFIG_LFG_KICK_PREVENTION_TIMER)) > elapsedTime)
12994 {
12996 }
12997 }
12998 }
12999
13000 /* Missing support for these types
13001 return ERR_PARTY_LFG_BOOT_COOLDOWN_S;
13002 */
13003 }
13004 else
13005 {
13006 if (!grp->IsLeader(GetGUID()) && !grp->IsAssistant(GetGUID()))
13007 return ERR_NOT_LEADER;
13008
13009 if (InBattleground())
13010 return ERR_INVITE_RESTRICTED;
13011 }
13012
13013 return ERR_PARTY_RESULT_OK;
13014}
@ CONFIG_LFG_KICK_PREVENTION_TIMER
Definition: IWorld.h:420
@ ERR_PARTY_LFG_BOOT_LOOT_ROLLS
Definition: SharedDefines.h:3732
@ ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S
Definition: SharedDefines.h:3727
@ ERR_PARTY_LFG_BOOT_LIMIT
Definition: SharedDefines.h:3723
@ ERR_NOT_LEADER
Definition: SharedDefines.h:3712
@ ERR_NOT_IN_GROUP
Definition: SharedDefines.h:3711
@ ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE
Definition: SharedDefines.h:3731
@ ERR_PARTY_LFG_BOOT_IN_COMBAT
Definition: SharedDefines.h:3729
@ ERR_PARTY_LFG_BOOT_IN_PROGRESS
Definition: SharedDefines.h:3725
@ ERR_INVITE_RESTRICTED
Definition: SharedDefines.h:3716
@ ERR_PARTY_RESULT_OK
Definition: SharedDefines.h:3705
@ ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS
Definition: SharedDefines.h:3726
LfgState
Definition: LFG.h:70
@ LFG_STATE_FINISHED_DUNGEON
Definition: LFG.h:77
@ LFG_STATE_BOOT
Definition: LFG.h:75
@ LFG_SPELL_DUNGEON_COOLDOWN
Definition: LFGMgr.h:52
@ LFG_GROUP_KICK_VOTES_NEEDED
Definition: LFGMgr.h:55
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:260
bool InBattleground() const
Definition: Player.h:2229
bool isLFGGroup(bool restricted=false) const
Definition: Group.cpp:2265
bool IsAssistant(ObjectGuid guid) const
Definition: Group.cpp:2355
bool isRollLootActive() const
Definition: Group.cpp:2458
bool IsLeader(ObjectGuid guid) const
Definition: Group.cpp:2341
ObjectGuid GetGUID() const
Definition: Group.cpp:2306
uint32 GetMembersCount() const
Definition: Group.h:245
GroupReference * GetFirstMember()
Definition: Group.h:243
Definition: GroupReference.h:27
GroupReference * next()
Definition: GroupReference.h:36

References CONFIG_LFG_KICK_PREVENTION_TIMER, ERR_INVITE_RESTRICTED, ERR_NOT_IN_GROUP, ERR_NOT_LEADER, ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE, ERR_PARTY_LFG_BOOT_IN_COMBAT, ERR_PARTY_LFG_BOOT_IN_PROGRESS, ERR_PARTY_LFG_BOOT_LIMIT, ERR_PARTY_LFG_BOOT_LOOT_ROLLS, ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S, ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS, ERR_PARTY_RESULT_OK, ObjectAccessor::FindConnectedPlayer(), Group::GetFirstMember(), GetGroup(), Object::GetGUID(), Group::GetGUID(), Group::GetMembersCount(), InBattleground(), Group::IsAssistant(), Group::IsLeader(), Group::isLFGGroup(), Group::isRollLootActive(), lfg::LFG_GROUP_KICK_VOTES_NEEDED, lfg::LFG_SPELL_DUNGEON_COOLDOWN, lfg::LFG_STATE_BOOT, lfg::LFG_STATE_FINISHED_DUNGEON, GroupReference::next(), sLFGMgr, and sWorld.

Referenced by WorldSession::HandleGroupUninviteGuidOpcode(), and WorldSession::HandleGroupUninviteOpcode().

◆ CanUseAmmo()

InventoryResult Player::CanUseAmmo ( uint32  item) const
2478{
2479 LOG_DEBUG("entities.player.items", "STORAGE: CanUseAmmo item = {}", item);
2480 if (!IsAlive())
2482 //if (isStunned())
2483 // return EQUIP_ERR_YOU_ARE_STUNNED;
2484 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
2485 if (pProto)
2486 {
2487 if (pProto->InventoryType != INVTYPE_AMMO)
2489
2490 InventoryResult res = CanUseItem(pProto);
2491 if (res != EQUIP_ERR_OK)
2492 return res;
2493
2494 /*if (GetReputationMgr().GetReputation() < pProto->RequiredReputation)
2495 return EQUIP_ERR_CANT_EQUIP_REPUTATION;
2496 */
2497
2498 // Requires No Ammo
2499 if (HasAura(46699))
2500 return EQUIP_ERR_BAG_FULL6;
2501
2502 return EQUIP_ERR_OK;
2503 }
2505}
@ EQUIP_ERR_YOU_ARE_DEAD
Definition: Item.h:85
@ EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE
Definition: Item.h:54
@ EQUIP_ERR_BAG_FULL6
Definition: Item.h:109
@ INVTYPE_AMMO
Definition: ItemTemplate.h:280

References CanUseItem(), EQUIP_ERR_BAG_FULL6, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE, EQUIP_ERR_YOU_ARE_DEAD, Unit::HasAura(), ItemTemplate::InventoryType, INVTYPE_AMMO, Unit::IsAlive(), LOG_DEBUG, and sObjectMgr.

Referenced by Create(), and SetAmmo().

◆ CanUseBattlegroundObject()

bool Player::CanUseBattlegroundObject ( GameObject gameobject) const
Bug:
sometimes when player clicks on flag in AB - client won't send gameobject_use, only gameobject_report_use packet Note: Mount, stealth and invisibility will be removed when used
13168{
13169 // It is possible to call this method will a nullptr pointer, only skipping faction check.
13170 if (gameobject)
13171 {
13172 FactionTemplateEntry const* playerFaction = GetFactionTemplateEntry();
13173 FactionTemplateEntry const* faction = sFactionTemplateStore.LookupEntry(gameobject->GetUInt32Value(GAMEOBJECT_FACTION));
13174
13175 if (playerFaction && faction && !playerFaction->IsFriendlyTo(*faction))
13176 return false;
13177 }
13178
13184 return (!isTotalImmune() && // Damage immune
13185 !HasAura(SPELL_RECENTLY_DROPPED_FLAG) && // Still has recently held flag debuff
13186 IsAlive()); // Alive
13187}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
@ SPELL_RECENTLY_DROPPED_FLAG
Definition: Battleground.h:139
@ GAMEOBJECT_FACTION
Definition: UpdateFields.h:402
bool isTotalImmune() const
Definition: Player.cpp:13259
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition: Unit.cpp:9979
Definition: DBCStructure.h:939
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition: DBCStructure.h:951

References GAMEOBJECT_FACTION, Unit::GetFactionTemplateEntry(), Object::GetUInt32Value(), Unit::HasAura(), Unit::IsAlive(), FactionTemplateEntry::IsFriendlyTo(), isTotalImmune(), sFactionTemplateStore, and SPELL_RECENTLY_DROPPED_FLAG.

Referenced by Spell::CheckCast(), and GameObject::Use().

◆ CanUseItem() [1/2]

InventoryResult Player::CanUseItem ( Item pItem,
bool  not_loading = true 
) const
Todo:
: when you right-click already equipped item it throws EQUIP_ERR_NO_REQUIRED_PROFICIENCY.
2235{
2236 if (pItem)
2237 {
2238 LOG_DEBUG("entities.player.items", "STORAGE: CanUseItem item = {}", pItem->GetEntry());
2239
2240 if (!IsAlive() && not_loading)
2242
2243 //if (isStunned())
2244 // return EQUIP_ERR_YOU_ARE_STUNNED;
2245
2246 ItemTemplate const* pProto = pItem->GetTemplate();
2247 if (pProto)
2248 {
2249 if (pItem->IsBindedNotWith(this))
2251
2252 InventoryResult res = CanUseItem(pProto);
2253 if (res != EQUIP_ERR_OK)
2254 return res;
2255
2256 if (pItem->GetSkill() != 0)
2257 {
2258 bool allowEquip = false;
2259 uint32 itemSkill = pItem->GetSkill();
2260 // Armor that is binded to account can "morph" from plate to mail, etc. if skill is not learned yet.
2261 if (pProto->Quality == ITEM_QUALITY_HEIRLOOM && pProto->Class == ITEM_CLASS_ARMOR && !HasSkill(itemSkill))
2262 {
2264
2265 // In fact it's a visual bug, everything works properly... I need sniffs of operations with
2266 // binded to account items from off server.
2267
2269 {
2270 allowEquip = (itemSkill == SKILL_PLATE_MAIL);
2271 }
2273 {
2274 allowEquip = (itemSkill == SKILL_MAIL);
2275 }
2276 }
2277 if (!allowEquip && GetSkillValue(itemSkill) == 0)
2279 }
2280
2283
2284 return EQUIP_ERR_OK;
2285 }
2286 }
2288}
@ EQUIP_ERR_CANT_EQUIP_REPUTATION
Definition: Item.h:111
@ ITEM_QUALITY_HEIRLOOM
Definition: SharedDefines.h:336
@ SKILL_PLATE_MAIL
Definition: SharedDefines.h:2951
@ SKILL_MAIL
Definition: SharedDefines.h:2962
uint32 GetSkill()
Definition: Item.cpp:556
uint32 Quality
Definition: ItemTemplate.h:626

References CanUseItem(), ItemTemplate::Class, CLASS_CONTEXT_EQUIP_ARMOR_CLASS, CLASS_HUNTER, CLASS_PALADIN, CLASS_SHAMAN, CLASS_WARRIOR, EQUIP_ERR_CANT_EQUIP_REPUTATION, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_DEAD, Object::GetEntry(), GetReputationRank(), Item::GetSkill(), GetSkillValue(), Item::GetTemplate(), HasSkill(), Unit::IsAlive(), Item::IsBindedNotWith(), IsClass(), ITEM_CLASS_ARMOR, ITEM_QUALITY_HEIRLOOM, LOG_DEBUG, ItemTemplate::Quality, ItemTemplate::RequiredReputationFaction, ItemTemplate::RequiredReputationRank, SKILL_MAIL, and SKILL_PLATE_MAIL.

Referenced by AuctionHouseObject::BuildListAuctionItems(), CanBankItem(), CanEquipItem(), CanUseAmmo(), CanUseItem(), WorldSession::HandleReadItem(), and WorldSession::HandleUseItemOpcode().

◆ CanUseItem() [2/2]

InventoryResult Player::CanUseItem ( ItemTemplate const *  pItem) const
2291{
2292 // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
2293
2294 if (!proto)
2295 {
2297 }
2298
2299 if (proto->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && GetTeamId(true) != TEAM_HORDE)
2300 {
2302 }
2303
2304 if (proto->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && GetTeamId(true) != TEAM_ALLIANCE)
2305 {
2307 }
2308
2309 if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
2310 {
2312 }
2313
2314 if (proto->RequiredSkill != 0)
2315 {
2316 if (GetSkillValue(proto->RequiredSkill) == 0)
2317 {
2319 }
2320 else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
2321 {
2323 }
2324 }
2325
2326 if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
2327 {
2329 }
2330
2331 if (GetLevel() < proto->RequiredLevel)
2332 {
2334 }
2335
2336 // If World Event is not active, prevent using event dependant items
2337 if (proto->HolidayId && !IsHolidayActive((HolidayIds)proto->HolidayId))
2338 {
2340 }
2341
2343
2344 if (!sScriptMgr->CanUseItem(const_cast<Player*>(this), proto, result))
2345 {
2346 return result;
2347 }
2348
2349 return EQUIP_ERR_OK;
2350}
@ EQUIP_ERR_CANT_EQUIP_LEVEL_I
Definition: Item.h:48
bool IsHolidayActive(HolidayIds id)
Definition: GameEventMgr.cpp:1910
HolidayIds
Definition: SharedDefines.h:2741

References ItemTemplate::AllowableClass, ItemTemplate::AllowableRace, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_EQUIP_LEVEL_I, EQUIP_ERR_CANT_EQUIP_SKILL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM, Unit::getClassMask(), Unit::GetLevel(), Unit::getRaceMask(), GetSkillValue(), GetTeamId(), ItemTemplate::HasFlag2(), HasSpell(), ItemTemplate::HolidayId, IsHolidayActive(), ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ItemTemplate::RequiredLevel, ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, ItemTemplate::RequiredSpell, sScriptMgr, TEAM_ALLIANCE, and TEAM_HORDE.

◆ CastItemCombatSpell() [1/2]

void Player::CastItemCombatSpell ( Unit target,
WeaponAttackType  attType,
uint32  procVictim,
uint32  procEx 
)
7157{
7158 if (!target || !target->IsAlive() || target == this)
7159 return;
7160
7161 // Xinef: do not use disarmed weapons, special exception - shaman ghost wolf form
7162 // Xinef: normal forms proc on hit enchants / built in item bonuses
7164 return;
7165
7167 {
7168 // If usable, try to cast item spell
7169 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
7170 if (!item->IsBroken())
7171 if (ItemTemplate const* proto = item->GetTemplate())
7172 {
7173 // Additional check for weapons
7174 if (proto->Class == ITEM_CLASS_WEAPON)
7175 {
7176 // offhand item cannot proc from main hand hit etc
7177 EquipmentSlots slot;
7178 switch (attType)
7179 {
7180 case BASE_ATTACK:
7182 break;
7183 case OFF_ATTACK:
7185 break;
7186 case RANGED_ATTACK:
7187 slot = EQUIPMENT_SLOT_RANGED;
7188 break;
7189 default:
7190 slot = EQUIPMENT_SLOT_END;
7191 break;
7192 }
7193 if (slot != i)
7194 continue;
7195 }
7196
7197 CastItemCombatSpell(target, attType, procVictim, procEx, item, proto);
7198 }
7199 }
7200}
EquipmentSlots
Definition: Player.h:673
@ FORM_GHOSTWOLF
Definition: UnitDefines.h:85
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition: Player.cpp:7156

References BASE_ATTACK, Unit::CanUseAttackType(), CastItemCombatSpell(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, FORM_GHOSTWOLF, GetItemByPos(), Unit::GetShapeshiftForm(), INVENTORY_SLOT_BAG_0, Unit::IsAlive(), ITEM_CLASS_WEAPON, OFF_ATTACK, and RANGED_ATTACK.

Referenced by CastItemCombatSpell(), Unit::DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ CastItemCombatSpell() [2/2]

void Player::CastItemCombatSpell ( Unit target,
WeaponAttackType  attType,
uint32  procVictim,
uint32  procEx,
Item item,
ItemTemplate const *  proto 
)
7203{
7204 if (!sScriptMgr->CanCastItemCombatSpell(this, target, attType, procVictim, procEx, item, proto))
7205 return;
7206
7207 // Can do effect if any damage done to target
7208 if (procVictim & PROC_FLAG_TAKEN_DAMAGE)
7209 //if (damageInfo->procVictim & PROC_FLAG_TAKEN_ANY_DAMAGE)
7210 {
7211 for (uint8 i = 0; i < MAX_ITEM_SPELLS; ++i)
7212 {
7213 _Spell const& spellData = proto->Spells[i];
7214
7215 // no spell
7216 if (!spellData.SpellId)
7217 continue;
7218
7219 // wrong triggering type
7221 continue;
7222
7223 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
7224 if (!spellInfo)
7225 {
7226 LOG_ERROR("entities.player", "WORLD: unknown Item spellid {}", spellData.SpellId);
7227 continue;
7228 }
7229
7230 float chance = (float)spellInfo->ProcChance;
7231
7232 if (spellData.SpellPPMRate)
7233 {
7234 uint32 WeaponSpeed = GetAttackTime(attType);
7235 chance = GetPPMProcChance(WeaponSpeed, spellData.SpellPPMRate, spellInfo);
7236 }
7237 else if (chance > 100.0f)
7238 {
7239 chance = GetWeaponProcChance();
7240 }
7241
7242 if (roll_chance_f(chance) && sScriptMgr->OnCastItemCombatSpell(this, target, spellInfo, item))
7244 }
7245 }
7246
7247 // item combat enchantments
7248 for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
7249 {
7250 uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
7251 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
7252 if (!pEnchant)
7253 continue;
7254
7255 for (uint8 s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
7256 {
7257 if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)
7258 continue;
7259
7260 SpellEnchantProcEntry const* entry = sSpellMgr->GetSpellEnchantProcEvent(enchant_id);
7261
7262 if (entry && entry->procEx)
7263 {
7264 // Check hit/crit/dodge/parry requirement
7265 if ((entry->procEx & procEx) == 0)
7266 continue;
7267 }
7268 else
7269 {
7270 // Can do effect if any damage done to target
7271 if (!(procVictim & PROC_FLAG_TAKEN_DAMAGE))
7272 //if (!(damageInfo->procVictim & PROC_FLAG_TAKEN_ANY_DAMAGE))
7273 continue;
7274 }
7275
7276 if (entry && (entry->attributeMask & ENCHANT_PROC_ATTR_WHITE_HIT) && (procVictim & SPELL_PROC_FLAG_MASK))
7277 continue;
7278
7279 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);
7280 if (!spellInfo)
7281 {
7282 LOG_ERROR("entities.player", "Player::CastItemCombatSpell({}, name: {}, enchant: {}): unknown spell {} is casted, ignoring...",
7283 GetGUID().ToString(), GetName(), pEnchant->ID, pEnchant->spellid[s]);
7284 continue;
7285 }
7286
7287 if (entry && (entry->attributeMask & ENCHANT_PROC_ATTR_EXCLUSIVE) != 0)
7288 {
7289 Unit* checkTarget = spellInfo->IsPositive() ? this : target;
7290 if (checkTarget->HasAura(spellInfo->Id, GetGUID()))
7291 {
7292 continue;
7293 }
7294 }
7295
7296 float chance = pEnchant->amount[s] != 0 ? float(pEnchant->amount[s]) : GetWeaponProcChance();
7297
7298 if (entry)
7299 {
7300 if (entry->PPMChance)
7301 chance = GetPPMProcChance(proto->Delay, entry->PPMChance, spellInfo);
7302 else if (entry->customChance)
7303 chance = (float)entry->customChance;
7304 }
7305
7306 // Apply spell mods
7307 ApplySpellMod(pEnchant->spellid[s], SPELLMOD_CHANCE_OF_SUCCESS, chance);
7308
7309 // Shiv has 100% chance to apply the poison
7310 if (FindCurrentSpellBySpellId(5938) && e_slot == TEMP_ENCHANTMENT_SLOT)
7311 chance = 100.0f;
7312
7313 if (roll_chance_f(chance))
7314 {
7315 // Xinef: implement enchant charges
7316 if (uint32 charges = item->GetEnchantmentCharges(EnchantmentSlot(e_slot)))
7317 {
7318 if (!--charges)
7319 {
7320 ApplyEnchantment(item, EnchantmentSlot(e_slot), false);
7321 item->ClearEnchantment(EnchantmentSlot(e_slot));
7322 }
7323 else
7324 item->SetEnchantmentCharges(EnchantmentSlot(e_slot), charges);
7325 }
7326
7327 Unit* unitTarget = spellInfo->IsPositive() ? this : target;
7329 }
7330 }
7331 }
7332}
@ PROC_FLAG_TAKEN_DAMAGE
Definition: SpellMgr.h:137
@ SPELL_PROC_FLAG_MASK
Definition: SpellMgr.h:156
@ ENCHANT_PROC_ATTR_WHITE_HIT
Definition: SpellMgr.h:310
@ ENCHANT_PROC_ATTR_EXCLUSIVE
Definition: SpellMgr.h:309
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition: SpellDefines.h:95
@ TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD
Will ignore GCD.
Definition: SpellDefines.h:133
@ ITEM_SPELLTRIGGER_CHANCE_ON_HIT
Definition: ItemTemplate.h:79
bool roll_chance_f(float chance)
Definition: Random.h:53
void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
Definition: Item.cpp:952
void ClearEnchantment(EnchantmentSlot slot)
Definition: Item.cpp:961
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const
Definition: Item.h:306
float SpellPPMRate
Definition: ItemTemplate.h:594
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition: Unit.cpp:13391
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition: Unit.cpp:4109
float GetWeaponProcChance() const
Definition: Unit.cpp:13380
bool IsPositive() const
Definition: SpellInfo.cpp:1236
uint32 ProcChance
Definition: SpellInfo.h:356
Definition: SpellMgr.h:314
uint32 procEx
Definition: SpellMgr.h:317
uint32 attributeMask
Definition: SpellMgr.h:318
uint32 customChance
Definition: SpellMgr.h:315
float PPMChance
Definition: SpellMgr.h:316
uint32 ID
Definition: DBCStructure.h:1842

References SpellItemEnchantmentEntry::amount, ApplyEnchantment(), ApplySpellMod(), SpellEnchantProcEntry::attributeMask, Unit::CastSpell(), Item::ClearEnchantment(), SpellEnchantProcEntry::customChance, ItemTemplate::Delay, ENCHANT_PROC_ATTR_EXCLUSIVE, ENCHANT_PROC_ATTR_WHITE_HIT, Unit::FindCurrentSpellBySpellId(), Unit::GetAttackTime(), Item::GetEnchantmentCharges(), Item::GetEnchantmentId(), Object::GetGUID(), WorldObject::GetName(), Unit::GetPPMProcChance(), Unit::GetWeaponProcChance(), Unit::HasAura(), SpellInfo::Id, SpellItemEnchantmentEntry::ID, SpellInfo::IsPositive(), ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL, ITEM_SPELLTRIGGER_CHANCE_ON_HIT, LOG_ERROR, MAX_ENCHANTMENT_SLOT, MAX_ITEM_SPELLS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, SpellEnchantProcEntry::PPMChance, PROC_FLAG_TAKEN_DAMAGE, SpellInfo::ProcChance, SpellEnchantProcEntry::procEx, roll_chance_f(), Item::SetEnchantmentCharges(), SPELL_PROC_FLAG_MASK, _Spell::SpellId, SpellItemEnchantmentEntry::spellid, SPELLMOD_CHANCE_OF_SUCCESS, _Spell::SpellPPMRate, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, sSpellItemEnchantmentStore, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Position::ToString(), TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD, and SpellItemEnchantmentEntry::type.

◆ CastItemUseSpell()

void Player::CastItemUseSpell ( Item item,
SpellCastTargets const &  targets,
uint8  cast_count,
uint32  glyphIndex 
)
7335{
7336 if (!sScriptMgr->CanCastItemUseSpell(this, item, targets, cast_count, glyphIndex))
7337 return;
7338
7339 ItemTemplate const* proto = item->GetTemplate();
7340 // special learning case
7341 if (proto->Spells[0].SpellId == 483 || proto->Spells[0].SpellId == 55884)
7342 {
7343 uint32 learn_spell_id = proto->Spells[0].SpellId;
7344 uint32 learning_spell_id = proto->Spells[1].SpellId;
7345
7346 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learn_spell_id);
7347 if (!spellInfo)
7348 {
7349 LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: {}) in have wrong spell id {}, ignoring ", proto->ItemId, learn_spell_id);
7350 SendEquipError(EQUIP_ERR_NONE, item, nullptr);
7351 return;
7352 }
7353
7354 Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE);
7355 spell->m_CastItem = item;
7356 spell->m_cast_count = cast_count; //set count of casts
7357 spell->SetSpellValue(SPELLVALUE_BASE_POINT0, learning_spell_id);
7358 spell->prepare(&targets);
7359 return;
7360 }
7361
7362 // use triggered flag only for items with many spell casts and for not first cast
7363 uint8 count = 0;
7364
7365 std::list<Spell*> pushSpells;
7366 // item spells casted at use
7367 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
7368 {
7369 _Spell const& spellData = proto->Spells[i];
7370
7371 // no spell
7372 if (!spellData.SpellId)
7373 continue;
7374
7375 // wrong triggering type
7376 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
7377 continue;
7378
7379 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
7380 if (!spellInfo)
7381 {
7382 LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: {}) in have wrong spell id {}, ignoring", proto->ItemId, spellData.SpellId);
7383 continue;
7384 }
7385
7386 if (HasSpellCooldown(spellInfo->Id))
7387 {
7388 continue;
7389 }
7390
7391 if (!spellInfo->CheckElixirStacking(this))
7392 {
7393 Spell::SendCastResult(this, spellInfo, cast_count, SPELL_FAILED_AURA_BOUNCED);
7394 continue;
7395 }
7396
7397 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
7398 spell->m_CastItem = item;
7399 spell->m_cast_count = cast_count; // set count of casts
7400 spell->m_glyphIndex = glyphIndex; // glyph index
7401 spell->InitExplicitTargets(targets);
7402
7403 // Xinef: dont allow to cast such spells, it may happen that spell possess 2 spells, one for players and one for items / gameobjects
7404 // Xinef: if first one is cast on player, it may be deleted thus resulting in crash because second spell has saved pointer to the item
7405 // Xinef: there is one problem with scripts which wont be loaded at the moment of call
7406 SpellCastResult result = spell->CheckCast(true);
7407 if (result != SPELL_CAST_OK)
7408 {
7409 spell->SendCastResult(result);
7410 delete spell;
7411 continue;
7412 }
7413
7414 pushSpells.push_back(spell);
7415 //spell->prepare(&targets);
7416
7417 ++count;
7418 }
7419
7420 // Item enchantments spells casted at use
7421 for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
7422 {
7423 uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
7424 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
7425 if (!pEnchant)
7426 continue;
7427 for (uint8 s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
7428 {
7429 if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_USE_SPELL)
7430 continue;
7431
7432 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);
7433 if (!spellInfo)
7434 {
7435 LOG_ERROR("entities.player", "Player::CastItemUseSpell Enchant {}, cast unknown spell {}", pEnchant->ID, pEnchant->spellid[s]);
7436 continue;
7437 }
7438
7439 if (HasSpellCooldown(spellInfo->Id))
7440 continue;
7441
7442 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
7443 spell->m_CastItem = item;
7444 spell->m_cast_count = cast_count; // set count of casts
7445 spell->m_glyphIndex = glyphIndex; // glyph index
7446 spell->InitExplicitTargets(targets);
7447
7448 // Xinef: dont allow to cast such spells, it may happen that spell possess 2 spells, one for players and one for items / gameobjects
7449 // Xinef: if first one is cast on player, it may be deleted thus resulting in crash because second spell has saved pointer to the item
7450 // Xinef: there is one problem with scripts which wont be loaded at the moment of call
7451 SpellCastResult result = spell->CheckCast(true);
7452 if (result != SPELL_CAST_OK)
7453 {
7454 spell->SendCastResult(result);
7455 delete spell;
7456 continue;
7457 }
7458
7459 pushSpells.push_back(spell);
7460 //spell->prepare(&targets);
7461
7462 ++count;
7463 }
7464 }
7465
7466 // xinef: send all spells in one go, prevents crash because container is not set
7467 for (std::list<Spell*>::const_iterator itr = pushSpells.begin(); itr != pushSpells.end(); ++itr)
7468 (*itr)->prepare(&targets);
7469}
@ SPELLVALUE_BASE_POINT0
Definition: SpellDefines.h:114
@ TRIGGERED_NONE
Definition: SpellDefines.h:131
@ EQUIP_ERR_NONE
Definition: Item.h:106
SpellCastResult
Definition: SharedDefines.h:948
@ SPELL_FAILED_AURA_BOUNCED
Definition: SharedDefines.h:958
bool HasSpellCooldown(uint32 spell_id) const override
Definition: Player.cpp:16283
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition: Spell.cpp:3468
void SetSpellValue(SpellValueMod mod, int32 value)
Definition: Spell.cpp:8423
uint8 m_cast_count
Definition: Spell.h:524
uint32 m_glyphIndex
Definition: Spell.h:525
SpellCastResult CheckCast(bool strict)
Definition: Spell.cpp:5644
void InitExplicitTargets(SpellCastTargets const &targets)
Definition: Spell.cpp:714
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition: Spell.cpp:4660
Item * m_CastItem
Definition: Spell.h:521
bool CheckElixirStacking(Unit const *caster) const
Definition: SpellInfo.cpp:2889

References Spell::CheckCast(), SpellInfo::CheckElixirStacking(), EQUIP_ERR_NONE, Item::GetEnchantmentId(), Item::GetTemplate(), HasSpellCooldown(), SpellInfo::Id, SpellItemEnchantmentEntry::ID, Spell::InitExplicitTargets(), ITEM_ENCHANTMENT_TYPE_USE_SPELL, ITEM_SPELLTRIGGER_ON_USE, ItemTemplate::ItemId, LOG_ERROR, Spell::m_cast_count, Spell::m_CastItem, Spell::m_glyphIndex, MAX_ENCHANTMENT_SLOT, MAX_ITEM_PROTO_SPELLS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, Spell::prepare(), Spell::SendCastResult(), SendEquipError(), Spell::SetSpellValue(), SPELL_CAST_OK, SPELL_FAILED_AURA_BOUNCED, _Spell::SpellId, SpellItemEnchantmentEntry::spellid, ItemTemplate::Spells, _Spell::SpellTrigger, SPELLVALUE_BASE_POINT0, sScriptMgr, sSpellItemEnchantmentStore, sSpellMgr, TRIGGERED_FULL_MASK, TRIGGERED_NONE, and SpellItemEnchantmentEntry::type.

Referenced by WorldSession::HandleUseItemOpcode().

◆ CharmSpellInitialize()

void Player::CharmSpellInitialize ( )
9601{
9602 Unit* charm = GetFirstControlled();
9603 if (!charm)
9604 return;
9605
9606 CharmInfo* charmInfo = charm->GetCharmInfo();
9607 if (!charmInfo)
9608 {
9609 LOG_ERROR("entities.player", "Player::CharmSpellInitialize(): the player's charm ({}) has no charminfo!", charm->GetGUID().ToString());
9610 return;
9611 }
9612
9613 uint8 addlist = 0;
9614 if (!charm->IsPlayer())
9615 {
9616 //CreatureInfo const* cinfo = charm->ToCreature()->GetCreatureTemplate();
9617 //if (cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK)
9618 {
9619 for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i)
9620 if (charmInfo->GetCharmSpell(i)->GetAction())
9621 ++addlist;
9622 }
9623 }
9624
9625 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 4 * addlist + 1);
9626 data << charm->GetGUID();
9627 data << uint16(0);
9628 data << uint32(0);
9629
9630 if (!charm->IsPlayer())
9631 data << uint8(charm->ToCreature()->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
9632 else
9633 data << uint32(0);
9634
9635 charmInfo->BuildActionBar(&data);
9636
9637 data << uint8(addlist);
9638
9639 if (addlist)
9640 {
9641 for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i)
9642 {
9643 CharmSpellInfo* cspell = charmInfo->GetCharmSpell(i);
9644 if (cspell->GetAction())
9645 data << uint32(cspell->packedData);
9646 }
9647 }
9648
9649 data << uint8(0); // cooldowns count
9650
9651 GetSession()->SendPacket(&data);
9652}
#define MAX_SPELL_CHARM
Definition: CharmInfo.h:23
#define MAX_UNIT_ACTION_BAR_INDEX
Definition: CharmInfo.h:28
@ SMSG_PET_SPELLS
Definition: Opcodes.h:407
ReactStates GetReactState() const
Definition: Creature.h:98
Definition: CharmInfo.h:93
uint32 packedData
Definition: CharmInfo.h:96
uint32 GetAction() const
Definition: CharmInfo.h:100
Definition: CharmInfo.h:125
CharmSpellInfo * GetCharmSpell(uint8 index)
Definition: CharmInfo.h:156
CommandStates GetCommandState() const
Definition: CharmInfo.h:134
void BuildActionBar(WorldPacket *data)
Definition: CharmInfo.cpp:292
CharmInfo * GetCharmInfo()
Definition: Unit.h:1226
Unit * GetFirstControlled() const
Definition: Unit.cpp:11015

References CharmInfo::BuildActionBar(), UnitActionBarEntry::GetAction(), Unit::GetCharmInfo(), CharmInfo::GetCharmSpell(), CharmInfo::GetCommandState(), Unit::GetFirstControlled(), Object::GetGUID(), Creature::GetReactState(), GetSession(), Object::IsPlayer(), LOG_ERROR, MAX_SPELL_CHARM, MAX_UNIT_ACTION_BAR_INDEX, UnitActionBarEntry::packedData, WorldSession::SendPacket(), SMSG_PET_SPELLS, Object::ToCreature(), and ObjectGuid::ToString().

Referenced by spell_mage_summon_water_elemental::HandleDummy(), WorldSession::HandleRequestPetInfo(), Unit::SetCharmedBy(), and Unit::SetMinion().

◆ CheckAllAchievementCriteria()

void Player::CheckAllAchievementCriteria ( )
13850{
13852}
void CheckAllAchievementCriteria()
Definition: AchievementMgr.cpp:800

References AchievementMgr::CheckAllAchievementCriteria(), and m_achievementMgr.

Referenced by Create(), and WorldSession::HandlePlayerLoginFromDB().

◆ CheckAmmoCompatibility()

bool Player::CheckAmmoCompatibility ( ItemTemplate const *  ammo_proto) const
7613{
7614 if (!ammo_proto)
7615 return false;
7616
7617 // check ranged weapon
7619 if (!weapon || weapon->IsBroken())
7620 return false;
7621
7622 ItemTemplate const* weapon_proto = weapon->GetTemplate();
7623 if (!weapon_proto || weapon_proto->Class != ITEM_CLASS_WEAPON)
7624 return false;
7625
7626 // check ammo ws. weapon compatibility
7627 switch (weapon_proto->SubClass)
7628 {
7631 if (ammo_proto->SubClass != ITEM_SUBCLASS_ARROW)
7632 return false;
7633 break;
7635 if (ammo_proto->SubClass != ITEM_SUBCLASS_BULLET)
7636 return false;
7637 break;
7638 default:
7639 return false;
7640 }
7641
7642 return true;
7643}
@ ITEM_SUBCLASS_WEAPON_CROSSBOW
Definition: ItemTemplate.h:362
@ ITEM_SUBCLASS_WEAPON_GUN
Definition: ItemTemplate.h:347
@ ITEM_SUBCLASS_WEAPON_BOW
Definition: ItemTemplate.h:346
@ ITEM_SUBCLASS_ARROW
Definition: ItemTemplate.h:416
@ ITEM_SUBCLASS_BULLET
Definition: ItemTemplate.h:417
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition: PlayerStorage.cpp:511

References ItemTemplate::Class, Item::GetTemplate(), GetWeaponForAttack(), Item::IsBroken(), ITEM_CLASS_WEAPON, ITEM_SUBCLASS_ARROW, ITEM_SUBCLASS_BULLET, ITEM_SUBCLASS_WEAPON_BOW, ITEM_SUBCLASS_WEAPON_CROSSBOW, ITEM_SUBCLASS_WEAPON_GUN, RANGED_ATTACK, and ItemTemplate::SubClass.

Referenced by _ApplyAmmoBonuses().

◆ CheckAreaExploreAndOutdoor()

void Player::CheckAreaExploreAndOutdoor ( )
5673{
5674 if (!IsAlive())
5675 return;
5676
5677 if (IsInFlight())
5678 return;
5679
5680 bool isOutdoor = IsOutdoors();
5681 uint32 areaId = GetAreaId();
5682 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
5683
5684 if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && _wasOutdoor != isOutdoor)
5685 {
5686 _wasOutdoor = isOutdoor;
5687
5689 SpellAttr0 attrToRecalculate = isOutdoor ? SPELL_ATTR0_ONLY_OUTDOORS : SPELL_ATTR0_ONLY_INDOORS;
5690 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5691 {
5692 Aura* aura = iter->second->GetBase();
5693 SpellInfo const* spell = aura->GetSpellInfo();
5694 if (spell->Attributes & attrToRemove)
5695 {
5696 // if passive - do not remove and just turn off all effects
5697 if (aura->IsPassive())
5698 {
5699 aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, false);
5700 ++iter;
5701 continue;
5702 }
5703
5704 RemoveAura(iter);
5705 }
5706 else if ((spell->Attributes & attrToRecalculate) && aura->IsPassive())
5707 {
5708 // if passive - turn on all effects
5709 aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, true);
5710 ++iter;
5711 }
5712 else
5713 {
5714 ++iter;
5715 }
5716 }
5717 }
5718
5719 if (!sScriptMgr->CanAreaExploreAndOutdoor(this))
5720 return;
5721
5722 if (!areaId)
5723 return;
5724
5725 if (!areaEntry)
5726 {
5727 LOG_ERROR("entities.player", "Player '{}' ({}) discovered unknown area (x: {} y: {} z: {} map: {})",
5729 return;
5730 }
5731
5732 uint32 offset = areaEntry->exploreFlag / 32;
5733
5734 if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
5735 {
5736 LOG_ERROR("entities.player", "Wrong area flag {} in map data for (X: {} Y: {}) point to field PLAYER_EXPLORED_ZONES_1 + {} ( {} must be < {} ).", areaEntry->flags, GetPositionX(), GetPositionY(), offset, offset, PLAYER_EXPLORED_ZONES_SIZE);
5737 return;
5738 }
5739
5740 uint32 val = (uint32)(1 << (areaEntry->exploreFlag % 32));
5741 uint32 currFields = GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset);
5742
5743 if (!(currFields & val))
5744 {
5745 SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields | val));
5746
5748
5749 if (areaEntry->area_level > 0)
5750 {
5751 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
5752 {
5753 SendExplorationExperience(areaId, 0);
5754 }
5755 else
5756 {
5757 int32 diff = int32(GetLevel()) - areaEntry->area_level;
5758 uint32 XP = 0;
5759 if (diff < -5)
5760 {
5761 XP = uint32(sObjectMgr->GetBaseXP(GetLevel() + 5) * sWorld->getRate(RATE_XP_EXPLORE));
5762 }
5763 else if (diff > 5)
5764 {
5765 int32 exploration_percent = (100 - ((diff - 5) * 5));
5766 if (exploration_percent > 100)
5767 exploration_percent = 100;
5768 else if (exploration_percent < 0)
5769 exploration_percent = 0;
5770
5771 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * exploration_percent / 100 * sWorld->getRate(RATE_XP_EXPLORE));
5772 }
5773 else
5774 {
5775 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * sWorld->getRate(RATE_XP_EXPLORE));
5776 }
5777
5778 sScriptMgr->OnGivePlayerXP(this, XP, nullptr, PlayerXPSource::XPSOURCE_EXPLORE);
5779 GiveXP(XP, nullptr);
5780 SendExplorationExperience(areaId, XP);
5781 }
5782 LOG_DEBUG("entities.player", "Player {} discovered a new area: {}", GetGUID().ToString(), areaId);
5783 }
5784 }
5785}
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
@ CONFIG_MAX_PLAYER_LEVEL
Definition: IWorld.h:240
@ CONFIG_VMAP_INDOOR_CHECK
Definition: IWorld.h:128
@ RATE_XP_EXPLORE
Definition: IWorld.h:478
@ ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA
Definition: DBCEnums.h:157
@ SPELL_ATTR0_ONLY_INDOORS
Definition: SharedDefines.h:396
@ SPELL_ATTR0_ONLY_OUTDOORS
Definition: SharedDefines.h:397
bool IsOutdoors() const
Definition: Object.cpp:3166
void SendExplorationExperience(uint32 Area, uint32 Experience)
Definition: PlayerMisc.cpp:159
void GiveXP(uint32 xp, Unit *victim, float group_rate=1.0f, bool isLFGReward=false)
Definition: Player.cpp:2371
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4741
bool IsInFlight() const
Definition: Unit.h:1020
AuraApplicationMap m_appliedAuras
Definition: Unit.h:1847
void HandleAllEffects(AuraApplication *aurApp, uint8 mode, bool apply)
Definition: SpellAuras.cpp:1241
bool IsPassive() const
Definition: SpellAuras.cpp:1082
uint32 Attributes
Definition: SpellInfo.h:324
Definition: DBCStructure.h:519
int32 area_level
Definition: DBCStructure.h:526
uint32 flags
Definition: DBCStructure.h:524
uint32 exploreFlag
Definition: DBCStructure.h:523

References _wasOutdoor, ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA, AreaTableEntry::area_level, SpellInfo::Attributes, AURA_EFFECT_HANDLE_REAL, CONFIG_MAX_PLAYER_LEVEL, CONFIG_VMAP_INDOOR_CHECK, AreaTableEntry::exploreFlag, AreaTableEntry::flags, WorldObject::GetAreaId(), Object::GetGUID(), Unit::GetLevel(), WorldLocation::GetMapId(), WorldObject::GetName(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Aura::GetSpellInfo(), Object::GetUInt32Value(), GiveXP(), Aura::HandleAllEffects(), Unit::IsAlive(), Unit::IsInFlight(), WorldObject::IsOutdoors(), Aura::IsPassive(), LOG_DEBUG, LOG_ERROR, Unit::m_appliedAuras, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, RATE_XP_EXPLORE, Unit::RemoveAura(), sAreaTableStore, SendExplorationExperience(), Unit::SetUInt32Value(), sObjectMgr, SPELL_ATTR0_ONLY_INDOORS, SPELL_ATTR0_ONLY_OUTDOORS, sScriptMgr, sWorld, Position::ToString(), and UpdateAchievementCriteria().

Referenced by UpdatePosition().

◆ CheckDuelDistance()

void Player::CheckDuelDistance ( time_t  currTime)
6327{
6328 if (!duel)
6329 {
6330 return;
6331 }
6332
6334 GameObject* obj = GetMap()->GetGameObject(duelFlagGUID);
6335 if (!obj)
6336 return;
6337
6338 if (!duel->OutOfBoundsTime)
6339 {
6340 if (!IsWithinDistInMap(obj, 50))
6341 {
6342 duel->OutOfBoundsTime = currTime + 10;
6343
6345 GetSession()->SendPacket(&data);
6346 }
6347 }
6348 else
6349 {
6350 if (IsWithinDistInMap(obj, 40))
6351 {
6352 duel->OutOfBoundsTime = 0;
6353
6355 GetSession()->SendPacket(&data);
6356 }
6357 else if (currTime >= duel->OutOfBoundsTime)
6359 }
6360}
@ PLAYER_DUEL_ARBITER
Definition: UpdateFields.h:177
@ DUEL_FLED
Definition: SharedDefines.h:3614
@ SMSG_DUEL_INBOUNDS
Definition: Opcodes.h:391
@ SMSG_DUEL_OUTOFBOUNDS
Definition: Opcodes.h:390
Definition: GameObject.h:121
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1321
void DuelComplete(DuelCompleteType type)
Definition: Player.cpp:6367
std::unique_ptr< DuelInfo > duel
Definition: Player.h:1855
GameObject * GetGameObject(ObjectGuid const guid)
Definition: Map.cpp:3319

References duel, DUEL_FLED, DuelComplete(), Map::GetGameObject(), Object::GetGuidValue(), WorldObject::GetMap(), GetSession(), WorldObject::IsWithinDistInMap(), PLAYER_DUEL_ARBITER, WorldSession::SendPacket(), SMSG_DUEL_INBOUNDS, and SMSG_DUEL_OUTOFBOUNDS.

Referenced by Update().

◆ CheckInstanceCount()

bool Player::CheckInstanceCount ( uint32  instanceId) const
6996{
6997 if (_instanceResetTimes.size() < sWorld->getIntConfig(CONFIG_MAX_INSTANCES_PER_HOUR))
6998 return true;
6999 return _instanceResetTimes.find(instanceId) != _instanceResetTimes.end();
7000}
@ CONFIG_MAX_INSTANCES_PER_HOUR
Definition: IWorld.h:367

References _instanceResetTimes, CONFIG_MAX_INSTANCES_PER_HOUR, and sWorld.

Referenced by MapMgr::PlayerCannotEnter().

◆ CheckInstanceLoginValid()

bool Player::CheckInstanceLoginValid ( )
6967{
6968 if (!GetMap())
6969 return false;
6970
6971 if (!GetMap()->IsDungeon() || IsGameMaster())
6972 return true;
6973
6974 if (GetMap()->IsRaid())
6975 {
6976 // cannot be in raid instance without a group
6977 if (!GetGroup() && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID))
6978 return false;
6979 }
6980 else
6981 {
6982 // cannot be in normal instance without a group and more players than 1 in instance
6983 if (!GetGroup() && GetMap()->GetPlayersCountExceptGMs() > 1)
6984 return false;
6985 }
6986
6987 // pussywizard: check CanEnter for GetMap(), because in PlayerCannotEnter it is called for a map decided before loading screen (can change)
6988 if (GetMap()->CannotEnter(this, true))
6989 return false;
6990
6991 // do checks for satisfy accessreqs, instance full, encounter in progress (raid), perm bind group != perm bind player
6992 return sMapMgr->PlayerCannotEnter(GetMap()->GetId(), this, true) == Map::CAN_ENTER;
6993}
#define sMapMgr
Definition: MapMgr.h:221
@ CONFIG_INSTANCE_IGNORE_RAID
Definition: IWorld.h:90
uint32 GetId(std::string const &username)
Definition: AccountMgr.cpp:229
@ CAN_ENTER
Definition: Map.h:424

References Map::CAN_ENTER, CONFIG_INSTANCE_IGNORE_RAID, GetGroup(), WorldObject::GetMap(), IsGameMaster(), sMapMgr, and sWorld.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ CleanupAfterTaxiFlight()

void Player::CleanupAfterTaxiFlight ( )
10385{
10386 // For spells that trigger flying paths remove them at arrival
10388 {
10391 }
10392 m_taxi.ClearTaxiDestinations(); // not destinations, clear source node
10393 Dismount();
10396}
@ UNIT_FLAG_TAXI_FLIGHT
Definition: UnitDefines.h:249
void setOnlineOfflineState(bool isOnline)
Definition: HostileRefMgr.cpp:98
void Dismount()
Definition: Unit.cpp:13464
HostileRefMgr & getHostileRefMgr()
Definition: Unit.h:1492

References PlayerTaxi::ClearTaxiDestinations(), Unit::Dismount(), Unit::getHostileRefMgr(), m_flightSpellActivated, m_taxi, Unit::RemoveAurasDueToSpell(), Unit::RemoveUnitFlag(), HostileRefMgr::setOnlineOfflineState(), UNIT_FLAG_DISABLE_MOVE, and UNIT_FLAG_TAXI_FLIGHT.

Referenced by go_commandscript::DoTeleport(), misc_commandscript::HandleAppearCommand(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveWorldportAck(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), and TeleportTo().

◆ CleanupChannels()

void Player::CleanupChannels ( )
4947{
4948 while (!m_channels.empty())
4949 {
4950 Channel* ch = *m_channels.begin();
4951 m_channels.erase(m_channels.begin()); // remove from player's channel list
4952 ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list
4953 }
4954}
Definition: Channel.h:148
void LeaveChannel(Player *player, bool send=true)
Definition: Channel.cpp:252
JoinedChannelsList m_channels
Definition: Player.h:2812

References Channel::LeaveChannel(), and m_channels.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld(), and WorldSession::LogoutPlayer().

◆ CleanupsBeforeDelete()

void Player::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

461{
462 TradeCancel(false);
464
465 Unit::CleanupsBeforeDelete(finalCleanup);
466}
@ DUEL_INTERRUPTED
Definition: SharedDefines.h:3612
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition: Unit.cpp:15710

References Unit::CleanupsBeforeDelete(), DUEL_INTERRUPTED, DuelComplete(), and TradeCancel().

Referenced by WorldSession::LogoutPlayer().

◆ ClearAfkReports()

void Player::ClearAfkReports ( )
inline
2261{ m_bgData.bgAfkReporter.clear(); }
GuidSet bgAfkReporter
Definition: Player.h:1042

References BGData::bgAfkReporter, and m_bgData.

Referenced by Battleground::RemovePlayerAtLeave().

◆ ClearChannelWatch()

void Player::ClearChannelWatch ( )
4957{
4958 for (JoinedChannelsList::iterator itr = m_channels.begin(); itr != m_channels.end(); ++itr)
4959 (*itr)->RemoveWatching(this);
4960}

References m_channels.

Referenced by WorldSession::HandleSetChannelWatch().

◆ ClearReceivedSpectatorResetFor()

void Player::ClearReceivedSpectatorResetFor ( )
inline

◆ clearResurrectRequestData()

void Player::clearResurrectRequestData ( )
inline
1803{ setResurrectRequestData(ObjectGuid::Empty, 0, 0.0f, 0.0f, 0.0f, 0, 0); }
void setResurrectRequestData(ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
Definition: Player.h:1793

References ObjectGuid::Empty, and setResurrectRequestData().

Referenced by WorldSession::HandleResurrectResponseOpcode(), Player(), and setDeathState().

◆ ClearWhisperWhiteList()

void Player::ClearWhisperWhiteList ( )
inline
2535{ WhisperList.clear(); }

References WhisperList.

Referenced by message_commandscript::HandleWhispersCommand().

◆ CompletedAchievement()

void Player::CompletedAchievement ( AchievementEntry const *  entry)
13885{
13887}
void CompletedAchievement(AchievementEntry const *entry)
Definition: AchievementMgr.cpp:2270

References AchievementMgr::CompletedAchievement(), and m_achievementMgr.

Referenced by achievement_commandscript::HandleAchievementAddCommand().

◆ CompleteQuest()

void Player::CompleteQuest ( uint32  quest_id)
598{
599 if (!quest_id)
600 {
601 return;
602 }
603
604 if (!sScriptMgr->OnBeforePlayerQuestComplete(this, quest_id))
605 {
606 return;
607 }
608
610
611 auto log_slot = FindQuestSlot(quest_id);
612 if (log_slot < MAX_QUEST_LOG_SIZE)
613 {
615 }
616
617 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
618 if (qInfo && qInfo->HasFlag(QUEST_FLAGS_TRACKING))
619 {
620 RewardQuest(qInfo, 0, this, false);
621 }
622
623 // Xinef: area auras may change on quest completion!
627
628 // check if Quest Tracker is enabled
629 if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
630 {
631 // prepare Quest Tracker datas
632 auto stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_QUEST_TRACK_COMPLETE_TIME);
633 stmt->SetData(0, quest_id);
634 stmt->SetData(1, GetGUID().GetCounter());
635
636 // add to Quest Tracker
637 CharacterDatabase.Execute(stmt);
638 }
639}
@ QUEST_FLAGS_TRACKING
Definition: QuestDef.h:142
@ ADDITIONAL_SAVING_INVENTORY_AND_GOLD
Definition: Player.h:992
@ CHAR_UPD_QUEST_TRACK_COMPLETE_TIME
Definition: CharacterDatabase.h:503
void RewardQuest(Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
Definition: PlayerQuest.cpp:658
void SetQuestStatus(uint32 questId, QuestStatus status, bool update=true)
Definition: PlayerQuest.cpp:1473

References ADDITIONAL_SAVING_INVENTORY_AND_GOLD, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CHAR_UPD_QUEST_TRACK_COMPLETE_TIME, CharacterDatabase, CONFIG_QUEST_ENABLE_QUEST_TRACKER, FindQuestSlot(), WorldObject::GetAreaId(), Object::GetGUID(), WorldObject::GetZoneId(), Quest::HasFlag(), MAX_QUEST_LOG_SIZE, QUEST_FLAGS_TRACKING, QUEST_STATE_COMPLETE, QUEST_STATUS_COMPLETE, RewardQuest(), SetQuestSlotState(), SetQuestStatus(), sObjectMgr, sScriptMgr, sWorld, UpdateAreaDependentAuras(), and UpdateZoneDependentAuras().

Referenced by AddQuestAndCheckCompletion(), AreaExploredOrEventHappens(), Spell::EffectQuestComplete(), WorldSession::HandleQuestgiverRequestRewardOpcode(), ItemAddedQuestCheck(), KillCreditGO(), KilledMonsterCredit(), KilledPlayerCreditForQuest(), MoneyChanged(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_plucky::OnGossipSelect(), ReputationChanged(), ReputationChanged2(), PlayerMenu::SendQuestGiverRequestItems(), TalkedToCreature(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), and npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached().

◆ ContinueTaxiFlight()

void Player::ContinueTaxiFlight ( )
10399{
10400 uint32 sourceNode = m_taxi.GetTaxiSource();
10401 if (!sourceNode)
10402 return;
10403
10404 LOG_DEBUG("entities.unit", "WORLD: Restart character {} taxi flight", GetGUID().ToString());
10405
10406 uint32 mountDisplayId = sObjectMgr->GetTaxiMountDisplayId(sourceNode, GetTeamId(true), true);
10407 if (!mountDisplayId)
10408 return;
10409
10411
10412 // search appropriate start path node
10413 uint32 startNode = 0;
10414
10415 TaxiPathNodeList const& nodeList = sTaxiPathNodesByPath[path];
10416
10417 float bestDist = SIZE_OF_GRIDS * SIZE_OF_GRIDS; // xinef: large value
10418 float currDist = 0.0f;
10419
10420 // xinef: changed to -1, we dont want to catch last node
10421 for (uint32 i = 0; i < nodeList.size() - 1; ++i)
10422 {
10423 TaxiPathNodeEntry const* node = nodeList[i];
10424 TaxiPathNodeEntry const* nextNode = nodeList[i + 1];
10425
10426 // xinef: skip nodes at another map, get last valid node on current map
10427 if (nextNode->mapid != GetMapId() || node->mapid != GetMapId())
10428 continue;
10429
10430 currDist = (node->x - GetPositionX()) * (node->x - GetPositionX()) + (node->y - GetPositionY()) * (node->y - GetPositionY()) + (node->z - GetPositionZ()) * (node->z - GetPositionZ());
10431 if (currDist < bestDist)
10432 {
10433 startNode = i;
10434 bestDist = currDist;
10435 }
10436 }
10437
10438 // xinef: no proper node was found
10439 if (startNode == 0)
10440 {
10442 return;
10443 }
10444
10446 {
10448 }
10449
10450 if (IsMounted())
10451 {
10453 }
10454
10455 SetCanTeleport(true);
10456
10457 GetSession()->SendDoFlight(mountDisplayId, path, startNode);
10458}
TaxiPathNodesByPath sTaxiPathNodesByPath
Definition: DBCStores.cpp:187
std::vector< TaxiPathNodeEntry const * > TaxiPathNodeList
Definition: DBCStructure.h:2245
#define SIZE_OF_GRIDS
Definition: MapDefines.h:25
void SetCanTeleport(bool value)
Definition: Player.h:2475
uint32 GetTaxiSource() const
Definition: PlayerTaxi.h:63
uint32 GetCurrentTaxiPath() const
Definition: PlayerTaxi.cpp:213
Definition: DBCStructure.h:1973
float y
Definition: DBCStructure.h:1979
float x
Definition: DBCStructure.h:1978
uint32 mapid
Definition: DBCStructure.h:1977
float z
Definition: DBCStructure.h:1980

References PlayerTaxi::ClearTaxiDestinations(), PlayerTaxi::GetCurrentTaxiPath(), Object::GetGUID(), WorldLocation::GetMapId(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), PlayerTaxi::GetTaxiSource(), GetTeamId(), Unit::IsInDisallowedMountForm(), Unit::IsMounted(), LOG_DEBUG, m_taxi, TaxiPathNodeEntry::mapid, Unit::RemoveAurasByType(), WorldSession::SendDoFlight(), SetCanTeleport(), SIZE_OF_GRIDS, sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sTaxiPathNodesByPath, Position::ToString(), TaxiPathNodeEntry::x, TaxiPathNodeEntry::y, and TaxiPathNodeEntry::z.

Referenced by WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), and ProcessDelayedOperations().

◆ ConvertRune()

void Player::ConvertRune ( uint8  index,
RuneType  newType 
)
13366{
13367 SetCurrentRune(index, newType);
13368
13370 data << uint8(index);
13371 data << uint8(newType);
13372 GetSession()->SendPacket(&data);
13373}
@ SMSG_CONVERT_RUNE
Definition: Opcodes.h:1188
void SetCurrentRune(uint8 index, RuneType currentRune)
Definition: Player.h:2492

References GetSession(), WorldSession::SendPacket(), SetCurrentRune(), and SMSG_CONVERT_RUNE.

Referenced by AddRuneByAuraEffect(), RemoveRunesByAuraEffect(), and RestoreBaseRune().

◆ CorrectMetaGemEnchants()

void Player::CorrectMetaGemEnchants ( uint8  slot,
bool  apply 
)
11164{
11165 //cycle all equipped items
11166 for (uint32 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
11167 {
11168 //enchants for the slot being socketed are handled by Player::ApplyItemMods
11169 if (slot == exceptslot)
11170 continue;
11171
11172 Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
11173
11174 if (!pItem || !pItem->HasSocket())
11175 continue;
11176
11177 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
11178 {
11179 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11180 if (!enchant_id)
11181 continue;
11182
11183 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11184 if (!enchantEntry)
11185 continue;
11186
11187 uint32 condition = enchantEntry->EnchantmentCondition;
11188 if (condition)
11189 {
11190 //was enchant active with/without item?
11191 bool wasactive = EnchantmentFitsRequirements(condition, apply ? exceptslot : -1);
11192 //should it now be?
11193 if (wasactive ^ EnchantmentFitsRequirements(condition, apply ? -1 : exceptslot))
11194 {
11195 // ignore item gem conditions
11196 //if state changed, (dis)apply enchant
11197 ApplyEnchantment(pItem, EnchantmentSlot(enchant_slot), !wasactive, true, true);
11198 }
11199 }
11200 }
11201 }
11202}

References ApplyEnchantment(), SpellItemEnchantmentEntry::EnchantmentCondition, EnchantmentFitsRequirements(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetEnchantmentId(), GetItemByPos(), Item::HasSocket(), INVENTORY_SLOT_BAG_0, SOCK_ENCHANTMENT_SLOT, and sSpellItemEnchantmentStore.

Referenced by _ApplyItemMods().

◆ Create()

bool Player::Create ( ObjectGuid::LowType  guidlow,
CharacterCreateInfo createInfo 
)
Todo:
: need more checks against packet modifications
469{
470 // FIXME: outfitId not used in player creating
472 // should check that skin, face, hair* are valid via DBC per race/class
473 // also do it in Player::BuildEnumData, Player::LoadFromDB
474
475 Object::_Create(guidlow, 0, HighGuid::Player);
476
477 m_name = createInfo->Name;
478
479 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(createInfo->Race, createInfo->Class);
480 if (!info)
481 {
482 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid race/class pair ({}/{}) - refusing to do so.",
483 GetSession()->GetAccountId(), m_name, createInfo->Race, createInfo->Class);
484 return false;
485 }
486
487 for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; i++)
488 m_items[i] = nullptr;
489
490 Relocate(info->positionX, info->positionY, info->positionZ, info->orientation);
491
492 ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(createInfo->Class);
493 if (!cEntry)
494 {
495 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid character class ({}) - refusing to do so (wrong DBC-files?)",
496 GetSession()->GetAccountId(), m_name, createInfo->Class);
497 return false;
498 }
499
500 SetMap(sMapMgr->CreateMap(info->mapId, this));
501
502 uint8 powertype = cEntry->powerType;
503
504 SetObjectScale(1.0f);
505
506 m_realRace = createInfo->Race; // set real race flag
507 m_race = createInfo->Race; // set real race flag
508
509 SetFactionForRace(createInfo->Race);
510
511 if (!IsValidGender(createInfo->Gender))
512 {
513 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid gender ({}) - refusing to do so",
514 GetSession()->GetAccountId(), m_name, createInfo->Gender);
515 return false;
516 }
517
518 uint32 RaceClassGender = (createInfo->Race) | (createInfo->Class << 8) | (createInfo->Gender << 16);
519
520 SetUInt32Value(UNIT_FIELD_BYTES_0, (RaceClassGender | (powertype << 24)));
522 if (sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP)
523 {
526 }
528 SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); // fix cast time showed in spell tooltip on client
529 SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); // default for players in 3.0.3
530
531 // -1 is default value
533
534 SetUInt32Value(PLAYER_BYTES, (createInfo->Skin | (createInfo->Face << 8) | (createInfo->HairStyle << 16) | (createInfo->HairColor << 24)));
536 (0x00 << 8) |
537 (0x00 << 16) |
538 (((GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED) << 24)));
539 SetByteValue(PLAYER_BYTES_3, 0, createInfo->Gender);
540 SetByteValue(PLAYER_BYTES_3, 3, 0); // BattlefieldArenaFaction (0 or 1)
541
545
546 for (int i = 0; i < KNOWN_TITLES_SIZE; ++i)
547 SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES + i, 0); // 0=disabled
549
554
555 // set starting level
557 ? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL)
559
561 {
562 uint32 gm_level = sWorld->getIntConfig(CONFIG_START_GM_LEVEL);
563 if (gm_level > start_level)
564 start_level = gm_level;
565 }
566
567 SetUInt32Value(UNIT_FIELD_LEVEL, start_level);
568
569 InitRunes();
570
572 ? sWorld->getIntConfig(CONFIG_START_PLAYER_MONEY)
576
577 // Played time
581
582 // base stats and related field values
587 InitPrimaryProfessions(); // to max set before any spell added
588
589 // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
591 {
592 UpdateMaxPower(POWER_MANA); // Update max Mana (for add bonus from intellect)
594 }
595
597 {
602 }
603
604 // original spells
607
608 // original action bar
609 for (PlayerCreateInfoActions::const_iterator action_itr = info->action.begin(); action_itr != info->action.end(); ++action_itr)
610 addActionButton(action_itr->button, action_itr->action, action_itr->type);
611
612 // original items
613 if (CharStartOutfitEntry const* oEntry = GetCharStartOutfitEntry(createInfo->Race, createInfo->Class, createInfo->Gender))
614 {
615 for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j)
616 {
617 if (oEntry->ItemId[j] <= 0)
618 continue;
619
620 uint32 itemId = oEntry->ItemId[j];
621
622 // just skip, reported in ObjectMgr::LoadItemTemplates
623 ItemTemplate const* iProto = sObjectMgr->GetItemTemplate(itemId);
624 if (!iProto)
625 continue;
626
627 // BuyCount by default
628 uint32 count = iProto->BuyCount;
629
630 // special amount for food/drink
631 if (iProto->Class == ITEM_CLASS_CONSUMABLE && iProto->SubClass == ITEM_SUBCLASS_FOOD)
632 {
633 switch (iProto->Spells[0].SpellCategory)
634 {
635 case SPELL_CATEGORY_FOOD: // food
637 break;
638 case SPELL_CATEGORY_DRINK: // drink
639 count = 2;
640 break;
641 }
642 if (iProto->GetMaxStackSize() < count)
643 count = iProto->GetMaxStackSize();
644 }
645 StoreNewItemInBestSlots(itemId, count);
646 }
647 }
648
649 for (PlayerCreateInfoItems::const_iterator item_id_itr = info->item.begin(); item_id_itr != info->item.end(); ++item_id_itr)
650 StoreNewItemInBestSlots(item_id_itr->item_id, item_id_itr->item_amount);
651
652 // bags and main-hand weapon must equipped at this moment
653 // now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon)
654 // or ammo not equipped in special bag
656 {
657 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
658 {
659 uint16 eDest;
660 // equip offhand weapon/shield if it attempt equipped before main-hand weapon
661 InventoryResult msg = CanEquipItem(NULL_SLOT, eDest, pItem, false);
662 if (msg == EQUIP_ERR_OK)
663 {
665 EquipItem(eDest, pItem, true);
666 }
667 // move other items to more appropriate slots (ammo not equipped in special bag)
668 else
669 {
670 ItemPosCountVec sDest;
671 msg = CanStoreItem(NULL_BAG, NULL_SLOT, sDest, pItem, false);
672 if (msg == EQUIP_ERR_OK)
673 {
675 pItem = StoreItem(sDest, pItem, true);
676 }
677
678 // if this is ammo then use it
679 msg = CanUseAmmo(pItem->GetEntry());
680 if (msg == EQUIP_ERR_OK)
681 SetAmmo(pItem->GetEntry());
682 }
683 }
684 }
685 // all item positions resolved
686
687 // ensure player starts with full health
690
692
693 return true;
694}
CharStartOutfitEntry const * GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender)
Definition: DBCStores.cpp:842
DBCStorage< ChrClassesEntry > sChrClassesStore(ChrClassesEntryfmt)
@ PLAYER_GUILD_TIMESTAMP
Definition: UpdateFields.h:185
@ PLAYER_GUILDID
Definition: UpdateFields.h:179
@ PLAYER_FIELD_COINAGE
Definition: UpdateFields.h:359
@ UNIT_FIELD_BYTES_0
Definition: UpdateFields.h:95
@ UNIT_FIELD_LEVEL
Definition: UpdateFields.h:114
@ UNIT_MOD_CAST_SPEED
Definition: UpdateFields.h:137
@ PLAYER_GUILDRANK
Definition: UpdateFields.h:180
@ UNIT_FIELD_HOVERHEIGHT
Definition: UpdateFields.h:173
@ UNIT_FIELD_BYTES_2
Definition: UpdateFields.h:161
@ ITEM_CLASS_CONSUMABLE
Definition: ItemTemplate.h:291
@ ITEM_SUBCLASS_FOOD
Definition: ItemTemplate.h:319
@ REST_STATE_RAF_LINKED
Definition: Player.h:986
@ REST_STATE_NOT_RAF_LINKED
Definition: Player.h:985
@ CLASS_CONTEXT_INIT
Definition: UnitDefines.h:206
@ UNIT_FLAG2_REGENERATE_POWER
Definition: UnitDefines.h:278
@ UNIT_BYTE2_FLAG_PVP
Definition: UnitDefines.h:115
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition: UnitDefines.h:232
@ CONFIG_START_HEROIC_PLAYER_MONEY
Definition: IWorld.h:245
@ CONFIG_GAME_TYPE
Definition: IWorld.h:222
@ CONFIG_START_GM_LEVEL
Definition: IWorld.h:265
@ CONFIG_START_HEROIC_PLAYER_LEVEL
Definition: IWorld.h:243
@ CONFIG_START_ARENA_POINTS
Definition: IWorld.h:250
@ CONFIG_START_PLAYER_MONEY
Definition: IWorld.h:244
@ CONFIG_START_PLAYER_LEVEL
Definition: IWorld.h:242
@ CONFIG_START_HONOR_POINTS
Definition: IWorld.h:248
@ REALM_TYPE_RPPVP
Definition: Realm.h:58
@ REALM_TYPE_PVP
Definition: Realm.h:55
#define MAX_OUTFIT_ITEMS
Definition: DBCStructure.h:617
@ POWER_RUNIC_POWER
Definition: SharedDefines.h:275
@ POWER_RUNE
Definition: SharedDefines.h:274
@ SPELL_CATEGORY_DRINK
Definition: SharedDefines.h:344
@ SPELL_CATEGORY_FOOD
Definition: SharedDefines.h:343
uint32 SpellCategory
Definition: ItemTemplate.h:596
void _Create(ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
Definition: Object.cpp:134
void SetInt32Value(uint16 index, int32 value)
Definition: Object.cpp:637
void SetFloatValue(uint16 index, float value)
Definition: Object.cpp:737
void SetUInt64Value(uint16 index, uint64 value)
Definition: Object.cpp:671
void SetByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition: Object.cpp:911
void Relocate(float x, float y)
Definition: Position.h:73
float orientation
Definition: Player.h:344
PlayerCreateInfoActions action
Definition: Player.h:350
PlayerCreateInfoItems item
Definition: Player.h:347
bool StoreNewItemInBestSlots(uint32 item_id, uint32 item_count)
Definition: Player.cpp:696
void InitPrimaryProfessions()
Definition: Player.cpp:11463
void InitGlyphsForLevel()
Definition: Player.cpp:13234
void UpdateMaxPower(Powers power) override
Definition: StatSystem.cpp:309
void LearnCustomSpells()
Definition: Player.cpp:11790
void SetArenaPoints(uint32 value)
Definition: Player.cpp:6219
void SetObjectScale(float scale) override
Definition: Player.h:1078
void InitDisplayIds()
Definition: Player.cpp:10573
InventoryResult CanUseAmmo(uint32 item) const
Definition: PlayerStorage.cpp:2477
void SetAmmo(uint32 item)
Definition: PlayerStorage.cpp:2507
void SetHonorPoints(uint32 value)
Definition: Player.cpp:6198
void InitTaxiNodesForLevel()
Definition: Player.h:1144
void InitStatsForLevel(bool reapplyMods=false)
Definition: Player.cpp:2568
Item * EquipItem(uint16 pos, Item *pItem, bool update)
Definition: PlayerStorage.cpp:2742
void InitRunes()
Definition: Player.cpp:13404
void SetMap(Map *map) override
Definition: Player.cpp:14623
void SetFactionForRace(uint8 race)
Definition: Player.cpp:5806
void CheckAllAchievementCriteria()
Definition: Player.cpp:13849
bool HasActivePowerType(Powers power) override
Definition: Player.cpp:2736
void LearnDefaultSkills()
Definition: Player.cpp:11816
void SetFullHealth()
Definition: Unit.h:797
uint8 m_realRace
Definition: Unit.h:1821
uint8 m_race
Definition: Unit.h:1822
void SetUnitFlag2(UnitFlags2 flags)
Definition: Unit.h:832
void SetMaxPower(Powers power, uint32 val)
Definition: Unit.cpp:15569
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition: Unit.h:826
uint8 HairColor
Definition: WorldSession.h:281
uint8 Skin
Definition: WorldSession.h:278
uint8 Class
Definition: WorldSession.h:276
std::string Name
User specified variables.
Definition: WorldSession.h:274
uint8 FacialHair
Definition: WorldSession.h:282
uint8 HairStyle
Definition: WorldSession.h:280
uint8 Face
Definition: WorldSession.h:279
uint8 Gender
Definition: WorldSession.h:277
uint8 Race
Definition: WorldSession.h:275
Definition: DBCStructure.h:620
Definition: DBCStructure.h:653
uint32 powerType
Definition: DBCStructure.h:656

References Object::_Create(), PlayerInfo::action, addActionButton(), ItemTemplate::BuyCount, CanEquipItem(), CanStoreItem(), CanUseAmmo(), CheckAllAchievementCriteria(), ItemTemplate::Class, CharacterCreateInfo::Class, CLASS_CONTEXT_INIT, CLASS_DEATH_KNIGHT, CONFIG_GAME_TYPE, CONFIG_START_ARENA_POINTS, CONFIG_START_GM_LEVEL, CONFIG_START_HEROIC_PLAYER_LEVEL, CONFIG_START_HEROIC_PLAYER_MONEY, CONFIG_START_HONOR_POINTS, CONFIG_START_PLAYER_LEVEL, CONFIG_START_PLAYER_MONEY, EQUIP_ERR_OK, EquipItem(), CharacterCreateInfo::Face, CharacterCreateInfo::FacialHair, CharacterCreateInfo::Gender, GetCharStartOutfitEntry(), GameTime::GetGameTime(), GetItemByPos(), Unit::GetMaxPower(), ItemTemplate::GetMaxStackSize(), GetSession(), CharacterCreateInfo::HairColor, CharacterCreateInfo::HairStyle, HasActivePowerType(), InitDisplayIds(), InitGlyphsForLevel(), InitPrimaryProfessions(), InitRunes(), InitStatsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, IsClass(), AccountMgr::IsPlayerAccount(), IsValidGender(), PlayerInfo::item, ITEM_CLASS_CONSUMABLE, ITEM_SUBCLASS_FOOD, KNOWN_TITLES_SIZE, LearnCustomSpells(), LearnDefaultSkills(), LOG_ERROR, m_items, m_Last_tick, WorldObject::m_name, m_Played_time, Unit::m_race, Unit::m_realRace, PlayerInfo::mapId, MAX_OUTFIT_ITEMS, CharacterCreateInfo::Name, NULL_BAG, NULL_SLOT, PlayerInfo::orientation, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER__FIELD_KNOWN_TITLES, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_FIELD_COINAGE, PLAYER_FIELD_KILLS, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_GUILD_TIMESTAMP, PLAYER_GUILDID, PLAYER_GUILDRANK, PLAYER_SLOTS_COUNT, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, POWER_MANA, POWER_RUNE, POWER_RUNIC_POWER, ChrClassesEntry::powerType, CharacterCreateInfo::Race, REALM_TYPE_PVP, REALM_TYPE_RPPVP, Position::Relocate(), RemoveItem(), REST_STATE_NOT_RAF_LINKED, REST_STATE_RAF_LINKED, sChrClassesStore, SetAmmo(), SetArenaPoints(), Object::SetByteFlag(), Object::SetByteValue(), SetFactionForRace(), Object::SetFloatValue(), Unit::SetFullHealth(), SetHonorPoints(), Object::SetInt32Value(), SetMap(), Unit::SetMaxPower(), SetObjectScale(), Unit::SetPower(), Unit::SetUInt32Value(), Object::SetUInt64Value(), Unit::SetUnitFlag(), Unit::SetUnitFlag2(), CharacterCreateInfo::Skin, sMapMgr, sObjectMgr, SPELL_CATEGORY_DRINK, SPELL_CATEGORY_FOOD, _Spell::SpellCategory, ItemTemplate::Spells, StoreItem(), StoreNewItemInBestSlots(), ItemTemplate::SubClass, sWorld, UNIT_BYTE2_FLAG_PVP, UNIT_FIELD_BYTES_0, UNIT_FIELD_BYTES_2, UNIT_FIELD_HOVERHEIGHT, UNIT_FIELD_LEVEL, UNIT_FLAG2_REGENERATE_POWER, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MOD_CAST_SPEED, UpdateAllStats(), and UpdateMaxPower().

◆ CreateCorpse()

Corpse * Player::CreateCorpse ( )
4535{
4536 // prevent existence 2 corpse for player
4538
4539 uint32 _uf, _pb, _pb2, _cfb1, _cfb2;
4540
4542 SetPvPDeath(false);
4543
4544 if (!corpse->Create(GetMap()->GenerateLowGuid<HighGuid::Corpse>(), this))
4545 {
4546 delete corpse;
4547 return nullptr;
4548 }
4549
4551
4552 _uf = getRace();
4555
4556 uint8 race = (uint8)(_uf);
4557 uint8 skin = (uint8)(_pb);
4558 uint8 face = (uint8)(_pb >> 8);
4559 uint8 hairstyle = (uint8)(_pb >> 16);
4560 uint8 haircolor = (uint8)(_pb >> 24);
4561 uint8 facialhair = (uint8)(_pb2);
4562
4563 _cfb1 = ((0x00) | (race << 8) | (GetByteValue(PLAYER_BYTES_3, 0) << 16) | (skin << 24));
4564 _cfb2 = ((face) | (hairstyle << 8) | (haircolor << 16) | (facialhair << 24));
4565
4566 corpse->SetUInt32Value(CORPSE_FIELD_BYTES_1, _cfb1);
4567 corpse->SetUInt32Value(CORPSE_FIELD_BYTES_2, _cfb2);
4568
4569 uint32 flags = CORPSE_FLAG_UNK2;
4571 flags |= CORPSE_FLAG_HIDE_HELM;
4573 flags |= CORPSE_FLAG_HIDE_CLOAK;
4574
4575 // Xinef: Player can loop corpses while in BG or in WG
4576 if (InBattleground() && !InArena())
4577 flags |= CORPSE_FLAG_LOOTABLE;
4578 Battlefield* Bf = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
4579 if (Bf && Bf->IsWarTime())
4580 flags |= CORPSE_FLAG_LOOTABLE;
4581
4582 corpse->SetUInt32Value(CORPSE_FIELD_FLAGS, flags);
4583
4585
4587
4588 uint32 iDisplayID;
4589 uint32 iIventoryType;
4590 uint32 _cfi;
4591 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; i++)
4592 {
4593 if (m_items[i])
4594 {
4595 iDisplayID = m_items[i]->GetTemplate()->DisplayInfoID;
4596 iIventoryType = m_items[i]->GetTemplate()->InventoryType;
4597
4598 _cfi = iDisplayID | (iIventoryType << 24);
4599 corpse->SetUInt32Value(CORPSE_FIELD_ITEM + i, _cfi);
4600 }
4601 }
4602
4603 // register for player, but not show
4604 GetMap()->AddCorpse(corpse);
4605
4607
4608 // we do not need to save corpses for BG/arenas
4609 if (!GetMap()->IsBattlegroundOrArena())
4610 corpse->SaveToDB();
4611
4612 return corpse;
4613}
#define sBattlefieldMgr
Definition: BattlefieldMgr.h:77
@ BATTLEFIELD_BATTLEID_WG
Definition: Battlefield.h:37
@ CORPSE_FIELD_BYTES_2
Definition: UpdateFields.h:425
@ CORPSE_FIELD_FLAGS
Definition: UpdateFields.h:427
@ CORPSE_FIELD_BYTES_1
Definition: UpdateFields.h:424
@ CORPSE_FIELD_DISPLAY_ID
Definition: UpdateFields.h:422
@ CORPSE_FIELD_ITEM
Definition: UpdateFields.h:423
@ CORPSE_FIELD_GUILD
Definition: UpdateFields.h:426
@ CORPSE_RESURRECTABLE_PVE
Definition: Corpse.h:29
@ CORPSE_FLAG_HIDE_CLOAK
Definition: Corpse.h:44
@ CORPSE_FLAG_UNK2
Definition: Corpse.h:42
@ CORPSE_FLAG_HIDE_HELM
Definition: Corpse.h:43
@ CORPSE_FLAG_LOOTABLE
Definition: Corpse.h:45
Definition: Battlefield.h:206
bool IsWarTime()
Return true if battle is start, false if battle is not started.
Definition: Battlefield.h:249
void SaveToDB()
Definition: Corpse.cpp:90
bool Create(ObjectGuid::LowType guidlow)
Definition: Corpse.cpp:61
void SetUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:650
void UpdatePositionData()
Definition: Object.cpp:1154
void WorldRelocate(const WorldLocation &loc)
Definition: Position.h:259
WorldLocation _corpseLocation
Definition: Player.h:2964
void SpawnCorpseBones(bool triggerSave=true)
Definition: Player.cpp:4629
void SetPvPDeath(bool on)
Definition: Player.h:1168
bool InArena() const
Definition: Player.cpp:12250
uint32 GetNativeDisplayId() const
Definition: Unit.h:1513
void AddCorpse(Corpse *corpse)
Definition: Map.cpp:3597

References _corpseLocation, Map::AddCorpse(), BATTLEFIELD_BATTLEID_WG, CORPSE_FIELD_BYTES_1, CORPSE_FIELD_BYTES_2, CORPSE_FIELD_DISPLAY_ID, CORPSE_FIELD_FLAGS, CORPSE_FIELD_GUILD, CORPSE_FIELD_ITEM, CORPSE_FLAG_HIDE_CLOAK, CORPSE_FLAG_HIDE_HELM, CORPSE_FLAG_LOOTABLE, CORPSE_FLAG_UNK2, CORPSE_RESURRECTABLE_PVE, CORPSE_RESURRECTABLE_PVP, Corpse::Create(), ItemTemplate::DisplayInfoID, EQUIPMENT_SLOT_END, Object::GetByteValue(), GetGuildId(), WorldObject::GetMap(), Unit::GetNativeDisplayId(), Unit::getRace(), Item::GetTemplate(), Object::GetUInt32Value(), HasPlayerFlag(), InArena(), InBattleground(), ItemTemplate::InventoryType, Battlefield::IsWarTime(), m_ExtraFlags, m_items, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_EXTRA_PVP_DEATH, PLAYER_FLAGS_HIDE_CLOAK, PLAYER_FLAGS_HIDE_HELM, Corpse::SaveToDB(), sBattlefieldMgr, SetPvPDeath(), Object::SetUInt32Value(), SpawnCorpseBones(), WorldObject::UpdatePositionData(), and WorldLocation::WorldRelocate().

Referenced by BuildPlayerRepop().

◆ CreatePet() [1/2]

Pet * Player::CreatePet ( Creature creatureTarget,
uint32  spellID = 0 
)
9159{
9160 if (IsExistPet())
9161 {
9162 return nullptr;
9163 }
9164
9165 if (!creatureTarget || creatureTarget->IsPet() || creatureTarget->IsPlayer())
9166 {
9167 return nullptr;
9168 }
9169
9170 CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry());
9171 if (!creatrueTemplate->family)
9172 {
9173 // Creatures with family 0 crashes the server
9174 return nullptr;
9175 }
9176
9177 // Everything looks OK, create new pet
9178 Pet* pet = CreateTamedPetFrom(creatureTarget, spellID);
9179 if (!pet)
9180 {
9181 return nullptr;
9182 }
9183
9184 // "kill" original creature
9185 creatureTarget->DespawnOrUnsummon();
9186
9187 // calculate proper level
9188 uint8 level = (creatureTarget->GetLevel() < (GetLevel() - 5)) ? (GetLevel() - 5) : GetLevel();
9189
9190 // prepare visual effect for levelup
9191 pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
9192
9193 // add to world
9194 pet->GetMap()->AddToMap(pet->ToCreature());
9195
9196 // visual effect for levelup
9197 pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
9198
9199 // caster have pet now
9200 SetMinion(pet, true);
9201
9202 pet->InitTalentForLevel();
9203
9206
9207 return pet;
9208}
void DespawnOrUnsummon(Milliseconds msTimeToDespawn, Seconds forcedRespawnTimer)
Definition: Creature.cpp:2173
uint32 family
Definition: CreatureData.h:220
void InitTalentForLevel()
Definition: Pet.cpp:2225
void SavePetToDB(PetSaveMode mode)
Definition: Pet.cpp:507
bool IsExistPet()
Definition: Player.cpp:9152
void PetSpellInitialize()
Definition: Player.cpp:9425
void SetMinion(Minion *minion, bool apply)
Definition: Unit.cpp:10625
Pet * CreateTamedPetFrom(Creature *creatureTarget, uint32 spell_id=0)
Definition: Unit.cpp:17279
bool IsPet() const
Definition: Unit.h:754

References Map::AddToMap(), Unit::CreateTamedPetFrom(), Creature::DespawnOrUnsummon(), CreatureTemplate::family, Object::GetEntry(), Unit::GetLevel(), WorldObject::GetMap(), Pet::InitTalentForLevel(), IsExistPet(), Unit::IsPet(), Object::IsPlayer(), PET_SAVE_AS_CURRENT, PetSpellInitialize(), Pet::SavePetToDB(), Unit::SetMinion(), Unit::SetUInt32Value(), sObjectMgr, Object::ToCreature(), and UNIT_FIELD_LEVEL.

Referenced by npc_commandscript::HandleNpcTameCommand(), and pet_commandscript::HandlePetCreateCommand().

◆ CreatePet() [2/2]

Pet * Player::CreatePet ( uint32  creatureEntry,
uint32  spellID = 0 
)
9211{
9212 if (IsExistPet())
9213 {
9214 return nullptr;
9215 }
9216
9217 CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureEntry);
9218 if (!creatrueTemplate->family)
9219 {
9220 // Creatures with family 0 crashes the server
9221 return nullptr;
9222 }
9223
9224 // Everything looks OK, create new pet
9225 Pet* pet = CreateTamedPetFrom(creatureEntry, spellID);
9226 if (!pet)
9227 {
9228 return nullptr;
9229 }
9230
9231 // prepare visual effect for levelup
9233
9234 // add to world
9235 pet->GetMap()->AddToMap(pet->ToCreature());
9236
9237 // visual effect for levelup
9239
9240 // caster have pet now
9241 SetMinion(pet, true);
9242
9243 pet->InitTalentForLevel();
9244
9247
9248 return pet;
9249}

References Map::AddToMap(), Unit::CreateTamedPetFrom(), CreatureTemplate::family, Unit::GetLevel(), WorldObject::GetMap(), Pet::InitTalentForLevel(), IsExistPet(), PET_SAVE_AS_CURRENT, PetSpellInitialize(), Pet::SavePetToDB(), Unit::SetMinion(), Unit::SetUInt32Value(), sObjectMgr, Object::ToCreature(), and UNIT_FIELD_LEVEL.

◆ Customize()

void Player::Customize ( CharacterCustomizeInfo const *  customizeInfo,
CharacterDatabaseTransaction  trans 
)
static
115{
117 stmt->SetData(0, customizeInfo->Gender);
118 stmt->SetData(1, customizeInfo->Skin);
119 stmt->SetData(2, customizeInfo->Face);
120 stmt->SetData(3, customizeInfo->HairStyle);
121 stmt->SetData(4, customizeInfo->HairColor);
122 stmt->SetData(5, customizeInfo->FacialHair);
123 stmt->SetData(6, customizeInfo->Guid.GetCounter());
124
125 CharacterDatabase.ExecuteOrAppend(trans, stmt);
126}
@ CHAR_UPD_GENDER_AND_APPEARANCE
Definition: CharacterDatabase.h:315

References CHAR_UPD_GENDER_AND_APPEARANCE, CharacterDatabase, CharacterCustomizeInfo::Face, CharacterCustomizeInfo::FacialHair, CharacterCustomizeInfo::Gender, ObjectGuid::GetCounter(), CharacterRenameInfo::Guid, CharacterCustomizeInfo::HairColor, CharacterCustomizeInfo::HairStyle, PreparedStatementBase::SetData(), and CharacterCustomizeInfo::Skin.

Referenced by WorldSession::HandleCharCustomizeCallback(), and WorldSession::HandleCharFactionOrRaceChangeCallback().

◆ DeleteEquipmentSet()

void Player::DeleteEquipmentSet ( uint64  setGuid)
14571{
14572 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14573 {
14574 if (itr->second.Guid == setGuid)
14575 {
14576 if (itr->second.state == EQUIPMENT_SET_NEW)
14577 m_EquipmentSets.erase(itr);
14578 else
14579 itr->second.state = EQUIPMENT_SET_DELETED;
14580 break;
14581 }
14582 }
14583}

References EQUIPMENT_SET_DELETED, EQUIPMENT_SET_NEW, and m_EquipmentSets.

Referenced by WorldSession::HandleEquipmentSetDelete().

◆ DeleteFromDB()

void Player::DeleteFromDB ( ObjectGuid::LowType  lowGuid,
uint32  accountId,
bool  updateRealmChars,
bool  deleteFinally 
)
static

Deletes a character from the database

The way, how the characters will be deleted is decided based on the config option.

Parameters
playerguidthe low-GUID from the player which should be deleted
accountIdthe account id from the player
updateRealmCharswhen this flag is set, the amount of characters on that realm will be updated in the realmlist
deleteFinallyif this flag is set, the config option will be ignored and the character will be permanently removed from the database
3956{
3957 // for not existed account avoid update realm
3958 if (!accountId)
3959 updateRealmChars = false;
3960
3961 ObjectGuid playerGuid = ObjectGuid::Create<HighGuid::Player>(lowGuid);
3962
3963 uint32 charDelete_method = sWorld->getIntConfig(CONFIG_CHARDELETE_METHOD);
3964 uint32 charDelete_minLvl = sWorld->getIntConfig(CONFIG_CHARDELETE_MIN_LEVEL);
3965
3966 // if we want to finally delete the character or the character does not meet the level requirement,
3967 // we set it to mode CHAR_DELETE_REMOVE
3968 if (deleteFinally || sCharacterCache->GetCharacterLevelByGuid(playerGuid) < charDelete_minLvl)
3969 charDelete_method = CHAR_DELETE_REMOVE;
3970
3971 if (uint32 guildId = sCharacterCache->GetCharacterGuildIdByGuid(playerGuid))
3972 if (Guild* guild = sGuildMgr->GetGuildById(guildId))
3973 guild->DeleteMember(playerGuid, false, false, true);
3974
3975 // remove from arena teams
3976 LeaveAllArenaTeams(playerGuid);
3977
3978 // close player ticket if any
3979 GmTicket* ticket = sTicketMgr->GetTicketByPlayer(playerGuid);
3980 if (ticket)
3981 sTicketMgr->CloseTicket(ticket->GetId(), playerGuid);
3982
3983 // remove from group
3984 if (ObjectGuid groupId = sCharacterCache->GetCharacterGroupGuidByGuid(playerGuid))
3985 if (Group* group = sGroupMgr->GetGroupByGUID(groupId.GetCounter()))
3986 RemoveFromGroup(group, playerGuid);
3987
3988 // Remove signs from petitions (also remove petitions if owner);
3989 RemovePetitionsAndSigns(playerGuid, 10);
3990
3991 CharacterDatabasePreparedStatement* stmt = nullptr;
3992
3993 switch (charDelete_method)
3994 {
3995 // Completely remove from the database
3996 case CHAR_DELETE_REMOVE:
3997 {
3998 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
3999
4000 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL);
4001 stmt->SetData(0, lowGuid);
4002 PreparedQueryResult resultMail = CharacterDatabase.Query(stmt);
4003
4004 if (resultMail)
4005 {
4006 std::unordered_map<uint32, std::vector<Item*>> itemsByMail;
4007
4008 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS);
4009 stmt->SetData(0, lowGuid);
4010 PreparedQueryResult resultItems = CharacterDatabase.Query(stmt);
4011
4012 if (resultItems)
4013 {
4014 do
4015 {
4016 Field* fields = resultItems->Fetch();
4017 uint32 mailId = fields[14].Get<uint32>();
4018 if (Item* mailItem = _LoadMailedItem(playerGuid, nullptr, mailId, nullptr, fields))
4019 {
4020 itemsByMail[mailId].push_back(mailItem);
4021 }
4022 } while (resultItems->NextRow());
4023 }
4024
4025 do
4026 {
4027 Field* mailFields = resultMail->Fetch();
4028
4029 uint32 mail_id = mailFields[0].Get<uint32>();
4030 uint8 mailType = mailFields[1].Get<uint8>();
4031 uint16 mailTemplateId = mailFields[2].Get<uint16>();
4032 uint32 sender = mailFields[3].Get<uint32>();
4033 std::string subject = mailFields[4].Get<std::string>();
4034 std::string body = mailFields[5].Get<std::string>();
4035 uint32 money = mailFields[6].Get<uint32>();
4036 bool has_items = mailFields[7].Get<bool>();
4037
4038 // We can return mail now
4039 // So firstly delete the old one
4040 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
4041 stmt->SetData(0, mail_id);
4042 trans->Append(stmt);
4043
4044 // Mail is not from player
4045 if (mailType != MAIL_NORMAL)
4046 {
4047 if (has_items)
4048 {
4049 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
4050 stmt->SetData(0, mail_id);
4051 trans->Append(stmt);
4052 }
4053 continue;
4054 }
4055
4056 MailDraft draft(subject, body);
4057 if (mailTemplateId)
4058 draft = MailDraft(mailTemplateId, false); // items are already included
4059
4060 auto itemsItr = itemsByMail.find(mail_id);
4061 if (itemsItr != itemsByMail.end())
4062 {
4063 for (Item* item : itemsItr->second)
4064 {
4065 draft.AddItem(item);
4066 }
4067
4068 // MailDraft will take care of freeing memory.
4069 itemsByMail.erase(itemsItr);
4070 }
4071
4072 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
4073 stmt->SetData(0, mail_id);
4074 trans->Append(stmt);
4075
4076 uint32 pl_account = sCharacterCache->GetCharacterAccountIdByGuid(ObjectGuid(HighGuid::Player, lowGuid));
4077
4078 draft.AddMoney(money).SendReturnToSender(pl_account, lowGuid, sender, trans);
4079 } while (resultMail->NextRow());
4080 }
4081
4082 // Unsummon and delete for pets in world is not required: player deleted from CLI or character list with not loaded pet.
4083 // NOW we can finally clear other DB data related to character
4084 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PET_IDS);
4085 stmt->SetData(0, lowGuid);
4086 PreparedQueryResult resultPets = CharacterDatabase.Query(stmt);
4087
4088 if (resultPets)
4089 {
4090 do
4091 {
4092 ObjectGuid::LowType petguidlow = (*resultPets)[0].Get<uint32>();
4093 Pet::DeleteFromDB(petguidlow);
4094 } while (resultPets->NextRow());
4095 }
4096
4097 // Delete char from social list of online chars
4098 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_SOCIAL);
4099 stmt->SetData(0, lowGuid);
4100 PreparedQueryResult resultFriends = CharacterDatabase.Query(stmt);
4101
4102 if (resultFriends)
4103 {
4104 do
4105 {
4106 if (Player* pFriend = ObjectAccessor::FindPlayerByLowGUID((*resultFriends)[0].Get<uint32>()))
4107 {
4108 pFriend->GetSocial()->RemoveFromSocialList(playerGuid, SOCIAL_FLAG_ALL);
4109 sSocialMgr->SendFriendStatus(pFriend, FRIEND_REMOVED, playerGuid, false);
4110 }
4111 } while (resultFriends->NextRow());
4112 }
4113
4114 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER);
4115 stmt->SetData(0, lowGuid);
4116 trans->Append(stmt);
4117
4118 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ACCOUNT_DATA);
4119 stmt->SetData(0, lowGuid);
4120 trans->Append(stmt);
4121
4122 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_DECLINED_NAME);
4123 stmt->SetData(0, lowGuid);
4124 trans->Append(stmt);
4125
4126 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION);
4127 stmt->SetData(0, lowGuid);
4128 trans->Append(stmt);
4129
4130 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA);
4131 stmt->SetData(0, lowGuid);
4132 trans->Append(stmt);
4133
4134 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GIFT);
4135 stmt->SetData(0, lowGuid);
4136 trans->Append(stmt);
4137
4138 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_HOMEBIND);
4139 stmt->SetData(0, lowGuid);
4140 trans->Append(stmt);
4141
4142 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE);
4143 stmt->SetData(0, lowGuid);
4144 trans->Append(stmt);
4145
4146 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY);
4147 stmt->SetData(0, lowGuid);
4148 trans->Append(stmt);
4149
4150 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS);
4151 stmt->SetData(0, lowGuid);
4152 trans->Append(stmt);
4153
4154 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED);
4155 stmt->SetData(0, lowGuid);
4156 trans->Append(stmt);
4157
4158 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REPUTATION);
4159 stmt->SetData(0, lowGuid);
4160 trans->Append(stmt);
4161
4162 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL);
4163 stmt->SetData(0, lowGuid);
4164 trans->Append(stmt);
4165
4166 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_COOLDOWN);
4167 stmt->SetData(0, lowGuid);
4168 trans->Append(stmt);
4169
4170 if (sWorld->getBoolConfig(CONFIG_DELETE_CHARACTER_TICKET_TRACE))
4171 {
4173 stmt->SetData(0, lowGuid);
4174 trans->Append(stmt);
4175 }
4176 else
4177 {
4178 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_GM_TICKETS);
4179 stmt->SetData(0, lowGuid);
4180 trans->Append(stmt);
4181 }
4182
4183 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER);
4184 stmt->SetData(0, lowGuid);
4185 trans->Append(stmt);
4186
4187 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND);
4188 stmt->SetData(0, lowGuid);
4189 trans->Append(stmt);
4190
4191 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID);
4192 stmt->SetData(0, lowGuid);
4193 trans->Append(stmt);
4194
4195 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL);
4196 stmt->SetData(0, lowGuid);
4197 trans->Append(stmt);
4198
4199 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEMS);
4200 stmt->SetData(0, lowGuid);
4201 trans->Append(stmt);
4202
4203 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_BY_OWNER);
4204 stmt->SetData(0, lowGuid);
4205 trans->Append(stmt);
4206
4208 stmt->SetData(0, lowGuid);
4209 trans->Append(stmt);
4210
4211 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENTS);
4212 stmt->SetData(0, lowGuid);
4213 trans->Append(stmt);
4214
4215 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS);
4216 stmt->SetData(0, lowGuid);
4217 trans->Append(stmt);
4218
4219 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_EQUIPMENTSETS);
4220 stmt->SetData(0, lowGuid);
4221 trans->Append(stmt);
4222
4223 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER);
4224 stmt->SetData(0, lowGuid);
4225 stmt->SetData(1, lowGuid);
4226 trans->Append(stmt);
4227
4228 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER);
4229 stmt->SetData(0, lowGuid);
4230 trans->Append(stmt);
4231
4232 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ENTRY_POINT);
4233 stmt->SetData(0, lowGuid);
4234 trans->Append(stmt);
4235
4236 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS);
4237 stmt->SetData(0, lowGuid);
4238 trans->Append(stmt);
4239
4240 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_DAILY_CHAR);
4241 stmt->SetData(0, lowGuid);
4242 trans->Append(stmt);
4243
4244 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR);
4245 stmt->SetData(0, lowGuid);
4246 trans->Append(stmt);
4247
4248 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR);
4249 stmt->SetData(0, lowGuid);
4250 trans->Append(stmt);
4251
4252 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR);
4253 stmt->SetData(0, lowGuid);
4254 trans->Append(stmt);
4255
4256 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT);
4257 stmt->SetData(0, lowGuid);
4258 trans->Append(stmt);
4259
4260 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILLS);
4261 stmt->SetData(0, lowGuid);
4262 trans->Append(stmt);
4263
4264 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SETTINGS);
4265 stmt->SetData(0, lowGuid);
4266 trans->Append(stmt);
4267
4268 Corpse::DeleteFromDB(playerGuid, trans);
4269
4270 sScriptMgr->OnDeleteFromDB(trans, lowGuid);
4271
4272 CharacterDatabase.CommitTransaction(trans);
4273 break;
4274 }
4275 // The character gets unlinked from the account, the name gets freed up and appears as deleted ingame
4276 case CHAR_DELETE_UNLINK:
4277 {
4278 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_DELETE_INFO);
4279
4280 stmt->SetData(0, lowGuid);
4281
4282 CharacterDatabase.Execute(stmt);
4283 break;
4284 }
4285 default:
4286 LOG_ERROR("entities.player", "Player::DeleteFromDB: Unsupported delete method: {}.", charDelete_method);
4287 return;
4288 }
4289
4290 if (CharacterCacheEntry const* cache = sCharacterCache->GetCharacterCacheByGuid(playerGuid))
4291 {
4292 std::string name = cache->Name;
4293 sCharacterCache->DeleteCharacterCacheEntry(playerGuid, name);
4294 }
4295
4296 if (updateRealmChars)
4297 {
4298 sWorld->UpdateRealmCharCount(accountId);
4299 }
4300}
@ MAIL_NORMAL
Definition: Mail.h:38
#define sTicketMgr
Definition: TicketMgr.h:260
#define sGuildMgr
Definition: GuildMgr.h:51
@ FRIEND_REMOVED
Definition: SocialMgr.h:71
#define sSocialMgr
Definition: SocialMgr.h:147
@ SOCIAL_FLAG_ALL
Definition: SocialMgr.h:44
@ CHAR_DELETE_REMOVE
Definition: Player.h:953
@ CHAR_DELETE_UNLINK
Definition: Player.h:954
@ CONFIG_CHARDELETE_METHOD
Definition: IWorld.h:357
@ CONFIG_CHARDELETE_MIN_LEVEL
Definition: IWorld.h:358
@ CONFIG_DELETE_CHARACTER_TICKET_TRACE
Definition: IWorld.h:141
@ CHAR_DEL_CHAR_SOCIAL_BY_FRIEND
Definition: CharacterDatabase.h:393
@ CHAR_DEL_CHAR_GIFT
Definition: CharacterDatabase.h:408
@ CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER
Definition: CharacterDatabase.h:476
@ CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER
Definition: CharacterDatabase.h:419
@ CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER
Definition: CharacterDatabase.h:418
@ CHAR_DEL_CHAR_SKILLS
Definition: CharacterDatabase.h:422
@ CHAR_DEL_CHAR_PET_BY_OWNER
Definition: CharacterDatabase.h:475
@ CHAR_DEL_ITEM_INSTANCE_BY_OWNER
Definition: CharacterDatabase.h:128
@ CHAR_DEL_CHAR_DECLINED_NAME
Definition: CharacterDatabase.h:384
@ CHAR_SEL_MAILITEMS
Definition: CharacterDatabase.h:101
@ CHAR_UPD_DELETE_INFO
Definition: CharacterDatabase.h:292
@ CHAR_DEL_CHAR_EQUIPMENTSETS
Definition: CharacterDatabase.h:417
@ CHAR_DEL_PLAYER_ACCOUNT_DATA
Definition: CharacterDatabase.h:203
@ CHAR_DEL_MAIL
Definition: CharacterDatabase.h:414
@ CHAR_DEL_CHAR_TALENT
Definition: CharacterDatabase.h:421
@ CHAR_SEL_CHAR_SOCIAL
Definition: CharacterDatabase.h:348
@ CHAR_DEL_CHAR_INVENTORY
Definition: CharacterDatabase.h:410
@ CHAR_DEL_CHAR_QUESTSTATUS
Definition: CharacterDatabase.h:391
@ CHAR_DEL_CHAR_ACTION
Definition: CharacterDatabase.h:406
@ CHAR_SEL_CHAR_PET_IDS
Definition: CharacterDatabase.h:478
@ CHAR_DEL_CHAR_ACHIEVEMENTS
Definition: CharacterDatabase.h:416
@ CHAR_SEL_CHAR_COD_ITEM_MAIL
Definition: CharacterDatabase.h:347
@ CHAR_UPD_PLAYER_GM_TICKETS_ON_CHAR_DELETION
Definition: CharacterDatabase.h:265
@ CHAR_DEL_CHAR_REPUTATION
Definition: CharacterDatabase.h:412
@ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS
Definition: CharacterDatabase.h:364
@ CHAR_DEL_CHARACTER
Definition: CharacterDatabase.h:405
@ CHAR_DEL_CHAR_SOCIAL_BY_GUID
Definition: CharacterDatabase.h:392
@ CHAR_DEL_CHAR_SETTINGS
Definition: CharacterDatabase.h:520
@ CHAR_DEL_CHAR_SPELL
Definition: CharacterDatabase.h:413
@ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED
Definition: CharacterDatabase.h:411
@ CHAR_DEL_PLAYER_GM_TICKETS
Definition: CharacterDatabase.h:264
@ CHAR_DEL_MAIL_ITEMS
Definition: CharacterDatabase.h:415
@ CHAR_DEL_CHAR_INSTANCE
Definition: CharacterDatabase.h:409
Player * FindPlayerByLowGUID(ObjectGuid::LowType lowguid)
Definition: ObjectAccessor.cpp:254
Definition: CharacterCache.h:28
void DeleteFromDB(CharacterDatabaseTransaction trans)
Definition: Corpse.cpp:119
void DeleteFromDB() override
Definition: Pet.h:171
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition: Player.cpp:2343
static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
Definition: Player.cpp:10065
static void LeaveAllArenaTeams(ObjectGuid guid)
Definition: Player.cpp:10133
Definition: Guild.h:295
Definition: TicketMgr.h:88
uint32 GetId() const
Definition: TicketMgr.h:101

References _LoadMailedItem(), MailDraft::AddItem(), MailDraft::AddMoney(), CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, CHAR_DEL_CHAR_ACHIEVEMENTS, CHAR_DEL_CHAR_ACTION, CHAR_DEL_CHAR_AURA, CHAR_DEL_CHAR_DECLINED_NAME, CHAR_DEL_CHAR_EQUIPMENTSETS, CHAR_DEL_CHAR_GIFT, CHAR_DEL_CHAR_GLYPHS, CHAR_DEL_CHAR_INSTANCE, CHAR_DEL_CHAR_INVENTORY, CHAR_DEL_CHAR_PET_BY_OWNER, CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER, CHAR_DEL_CHAR_QUESTSTATUS, CHAR_DEL_CHAR_QUESTSTATUS_REWARDED, CHAR_DEL_CHAR_REPUTATION, CHAR_DEL_CHAR_SETTINGS, CHAR_DEL_CHAR_SKILLS, CHAR_DEL_CHAR_SOCIAL_BY_FRIEND, CHAR_DEL_CHAR_SOCIAL_BY_GUID, CHAR_DEL_CHAR_SPELL, CHAR_DEL_CHAR_SPELL_COOLDOWN, CHAR_DEL_CHAR_TALENT, CHAR_DEL_CHARACTER, CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, CHAR_DEL_ITEM_INSTANCE_BY_OWNER, CHAR_DEL_MAIL, CHAR_DEL_MAIL_BY_ID, CHAR_DEL_MAIL_ITEM_BY_ID, CHAR_DEL_MAIL_ITEMS, CHAR_DEL_PLAYER_ACCOUNT_DATA, CHAR_DEL_PLAYER_ENTRY_POINT, CHAR_DEL_PLAYER_GM_TICKETS, CHAR_DEL_PLAYER_HOMEBIND, CHAR_DEL_QUEST_STATUS_DAILY_CHAR, CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, CHAR_DELETE_REMOVE, CHAR_DELETE_UNLINK, CHAR_SEL_CHAR_COD_ITEM_MAIL, CHAR_SEL_CHAR_PET_IDS, CHAR_SEL_CHAR_SOCIAL, CHAR_SEL_MAILITEMS, CHAR_UPD_DELETE_INFO, CHAR_UPD_PLAYER_GM_TICKETS_ON_CHAR_DELETION, CharacterDatabase, CONFIG_CHARDELETE_METHOD, CONFIG_CHARDELETE_MIN_LEVEL, CONFIG_DELETE_CHARACTER_TICKET_TRACE, Pet::DeleteFromDB(), Corpse::DeleteFromDB(), ObjectAccessor::FindPlayerByLowGUID(), FRIEND_REMOVED, Field::Get(), GmTicket::GetId(), LeaveAllArenaTeams(), LOG_ERROR, MAIL_NORMAL, RemoveFromGroup(), RemovePetitionsAndSigns(), sCharacterCache, MailDraft::SendReturnToSender(), PreparedStatementBase::SetData(), sGroupMgr, sGuildMgr, SOCIAL_FLAG_ALL, sScriptMgr, sSocialMgr, sTicketMgr, and sWorld.

Referenced by AccountMgr::DeleteAccount(), DeleteOldCharacters(), character_commandscript::HandleCharacterDeletedDeleteCommand(), character_commandscript::HandleCharacterEraseCommand(), and WorldSession::HandleCharDeleteOpcode().

◆ DeleteOldCharacters() [1/2]

void Player::DeleteOldCharacters ( )
static

Characters which were kept back in the database after being deleted and are now too old (see config option "CharDelete.KeepDays"), will be completely deleted.

4306{
4307 uint32 keepDays = sWorld->getIntConfig(CONFIG_CHARDELETE_KEEP_DAYS);
4308 if (!keepDays)
4309 return;
4310
4312}
@ CONFIG_CHARDELETE_KEEP_DAYS
Definition: IWorld.h:356
static void DeleteOldCharacters()
Definition: Player.cpp:4305

References CONFIG_CHARDELETE_KEEP_DAYS, DeleteOldCharacters(), and sWorld.

Referenced by DeleteOldCharacters(), character_commandscript::HandleCharacterDeletedPurgeCommand(), and World::SetInitialWorldSettings().

◆ DeleteOldCharacters() [2/2]

void Player::DeleteOldCharacters ( uint32  keepDays)
static

Characters which were kept back in the database after being deleted and are older than the specified amount of days, will be completely deleted.

4318{
4319 LOG_INFO("server.loading", "Player::DeleteOldChars: Deleting all characters which have been deleted {} days before...", keepDays);
4320 LOG_INFO("server.loading", " ");
4321
4323 stmt->SetData(0, uint32(GameTime::GetGameTime().count() - time_t(keepDays * DAY)));
4324 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4325
4326 if (result)
4327 {
4328 LOG_INFO("server.loading", "Player::DeleteOldChars: Found {} character(s) to delete", result->GetRowCount());
4329 do
4330 {
4331 Field* fields = result->Fetch();
4332 Player::DeleteFromDB(fields[0].Get<uint32>(), fields[1].Get<uint32>(), true, true);
4333 } while (result->NextRow());
4334 }
4335}
@ CHAR_SEL_CHAR_OLD_CHARS
Definition: CharacterDatabase.h:349
constexpr auto DAY
Definition: Common.h:49
static void DeleteFromDB(ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally)
Definition: Player.cpp:3955

References CHAR_SEL_CHAR_OLD_CHARS, CharacterDatabase, DAY, DeleteFromDB(), GameTime::GetGameTime(), LOG_INFO, and PreparedStatementBase::SetData().

◆ DeleteRefundReference()

void Player::DeleteRefundReference ( ObjectGuid  itemGUID)
15464{
15465 RefundableItemsSet::iterator itr = m_refundableItems.find(itemGUID);
15466 if (itr != m_refundableItems.end())
15467 m_refundableItems.erase(itr);
15468}

References m_refundableItems.

Referenced by _SaveInventory(), Item::SetNotRefundable(), and Item::SetState().

◆ DestroyConjuredItems()

void Player::DestroyConjuredItems ( bool  update)
3358{
3359 // used when entering arena
3360 // destroys all conjured items
3361 LOG_DEBUG("entities.player.items", "STORAGE: DestroyConjuredItems");
3362
3363 // in inventory
3365 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3366 if (pItem->IsConjuredConsumable())
3368
3369 // in inventory bags
3371 if (Bag* pBag = GetBagByPos(i))
3372 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
3373 if (Item* pItem = pBag->GetItemByPos(j))
3374 if (pItem->IsConjuredConsumable())
3375 DestroyItem(i, j, update);
3376
3377 // in equipment and bag list
3379 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3380 if (pItem->IsConjuredConsumable())
3382}

References DestroyItem(), EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and LOG_DEBUG.

Referenced by Battleground::AddPlayer().

◆ DestroyForPlayer()

void Player::DestroyForPlayer ( Player target,
bool  onDeath = false 
) const
overridevirtual

Reimplemented from Object.

3829{
3830 Unit::DestroyForPlayer(target, onDeath);
3831
3832 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) // xinef: previously INVENTORY_SLOT_BAG_END
3833 {
3834 if (!m_items[i])
3835 continue;
3836
3837 m_items[i]->DestroyForPlayer(target);
3838 }
3839
3840 if (target == this)
3841 {
3843 {
3844 if (!m_items[i])
3845 continue;
3846
3847 m_items[i]->DestroyForPlayer(target);
3848 }
3850 {
3851 if (!m_items[i])
3852 continue;
3853
3854 m_items[i]->DestroyForPlayer(target);
3855 }
3856 }
3857}

References BANK_SLOT_BAG_END, CURRENCYTOKEN_SLOT_END, Object::DestroyForPlayer(), EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_START, KEYRING_SLOT_START, and m_items.

◆ DestroyItem()

void Player::DestroyItem ( uint8  bag,
uint8  slot,
bool  update 
)
3039{
3040 Item* pItem = GetItemByPos(bag, slot);
3041 if (pItem)
3042 {
3043 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItem bag = {}, slot = {}, item = {}", bag, slot, pItem->GetEntry());
3044 // Also remove all contained items if the item is a bag.
3045 // This if () prevents item saving crashes if the condition for a bag to be empty before being destroyed was bypassed somehow.
3046 if (pItem->IsNotEmptyBag())
3047 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
3048 DestroyItem(slot, i, update);
3049
3050 if (pItem->IsWrapped())
3051 {
3053 stmt->SetData(0, pItem->GetGUID().GetCounter());
3054 CharacterDatabase.Execute(stmt);
3055 }
3056
3058 RemoveItemDurations(pItem);
3059
3060 pItem->SetNotRefundable(this);
3061 pItem->ClearSoulboundTradeable(this);
3062 RemoveTradeableItem(pItem);
3063
3064 ItemTemplate const* proto = pItem->GetTemplate();
3065 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
3066 if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
3068
3069 ItemRemovedQuestCheck(pItem->GetEntry(), pItem->GetCount());
3070
3071 sScriptMgr->OnItemRemove(this, pItem);
3072
3073 if (bag == INVENTORY_SLOT_BAG_0)
3074 {
3076
3077 // equipment and equipped bags can have applied bonuses
3078 if (slot < INVENTORY_SLOT_BAG_END)
3079 {
3080 ItemTemplate const* pProto = pItem->GetTemplate();
3081
3082 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
3083 if (pProto && pProto->ItemSet)
3084 RemoveItemsSetItem(this, pProto);
3085
3086 _ApplyItemMods(pItem, slot, false);
3087 }
3088
3089 if (slot < EQUIPMENT_SLOT_END)
3090 {
3091 // remove item dependent auras and casts (only weapon and armor slots)
3093
3094 // update expertise and armor penetration - passive auras may need it
3095 switch (slot)
3096 {
3101 default:
3102 break;
3103 }
3104
3105 if (slot == EQUIPMENT_SLOT_MAINHAND)
3107 else if (slot == EQUIPMENT_SLOT_OFFHAND)
3109
3110 // equipment visual show
3111 SetVisibleItemSlot(slot, nullptr);
3112 }
3113
3114 m_items[slot] = nullptr;
3115 }
3116 else if (Bag* pBag = GetBagByPos(bag))
3117 pBag->RemoveItem(slot, update);
3118
3119 // Xinef: item is removed, remove loot from storage if any
3120 if (proto->HasFlag(ITEM_FLAG_HAS_LOOT))
3121 sLootItemStorage->RemoveStoredLoot(pItem->GetGUID());
3122
3123 if (IsInWorld() && update)
3124 {
3125 pItem->RemoveFromWorld();
3126 pItem->DestroyForPlayer(this);
3127 }
3128
3129 //pItem->SetOwnerGUID(0);
3131 pItem->SetSlot(NULL_SLOT);
3132 pItem->SetState(ITEM_REMOVED, this);
3133 }
3134}
@ ITEM_SPELLTRIGGER_ON_NO_DELAY_USE
Definition: ItemTemplate.h:87
@ CHAR_DEL_GIFT
Definition: CharacterDatabase.h:130
bool IsWrapped() const
Definition: Item.h:263
void ItemRemovedQuestCheck(uint32 entry, uint32 count)
Definition: PlayerQuest.cpp:1868
void RemoveItemDependentAurasAndCasts(Item *pItem)
Definition: Player.cpp:12525
void RecalculateRating(CombatRating cr)
Definition: Player.h:1939
void UpdateExpertise(WeaponAttackType attType)
Definition: StatSystem.cpp:877
void SetVisibleItemSlot(uint8 slot, Item *pItem)
Definition: PlayerStorage.cpp:2873

References _ApplyItemMods(), BASE_ATTACK, CHAR_DEL_GIFT, CharacterDatabase, Item::ClearSoulboundTradeable(), CR_ARMOR_PENETRATION, Object::DestroyForPlayer(), DestroyItem(), ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetBagByPos(), Item::GetCount(), ObjectGuid::GetCounter(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Item::GetTemplate(), ItemTemplate::HasFlag(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, Object::IsInWorld(), Item::IsNotEmptyBag(), Item::IsWrapped(), ITEM_FIELD_CONTAINED, ITEM_FLAG_HAS_LOOT, ITEM_REMOVED, ITEM_SPELLTRIGGER_ON_NO_DELAY_USE, ItemRemovedQuestCheck(), ItemTemplate::ItemSet, LOG_DEBUG, m_items, MAX_BAG_SIZE, MAX_ITEM_PROTO_SPELLS, NULL_SLOT, OFF_ATTACK, PLAYER_FIELD_INV_SLOT_HEAD, RecalculateRating(), Unit::RemoveAurasDueToSpell(), RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDependentAurasAndCasts(), RemoveItemDurations(), RemoveItemsSetItem(), RemoveTradeableItem(), PreparedStatementBase::SetData(), Object::SetGuidValue(), Item::SetNotRefundable(), Item::SetSlot(), Item::SetState(), SetVisibleItemSlot(), sLootItemStorage, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, and UpdateExpertise().

Referenced by AddQuestAndCheckCompletion(), DestroyConjuredItems(), DestroyItem(), DestroyItemCount(), DestroyZoneLimitedItem(), WorldSession::DoLootRelease(), Spell::EffectSummonChangeItem(), bg_commandscript::HandleBagsClearCommand(), debug_commandscript::HandleDebugItemExpireCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleSocketOpcode(), WorldSession::HandleTurnInPetitionOpcode(), RefundItem(), reset_commandscript::ResetItemsDeleteBankBags(), reset_commandscript::ResetItemsDeleteStandardBags(), reset_commandscript::ResetItemsEquipped(), reset_commandscript::ResetItemsInBags(), reset_commandscript::ResetItemsInBank(), reset_commandscript::ResetItemsInCurrenciesList(), reset_commandscript::ResetItemsInKeyring(), and Item::UpdateDuration().

◆ DestroyItemCount() [1/2]

void Player::DestroyItemCount ( Item item,
uint32 count,
bool  update 
)
3413{
3414 if (!pItem)
3415 return;
3416
3417 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item ({}, Entry: {}) count = {}", pItem->GetGUID().ToString(), pItem->GetEntry(), count);
3418
3419 if (pItem->GetCount() <= count)
3420 {
3421 count -= pItem->GetCount();
3422
3423 DestroyItem(pItem->GetBagSlot(), pItem->GetSlot(), update);
3424 }
3425 else
3426 {
3427 ItemRemovedQuestCheck(pItem->GetEntry(), count);
3428 pItem->SetCount(pItem->GetCount() - count);
3429 count = 0;
3430 if (IsInWorld() && update)
3431 pItem->SendUpdateToPlayer(this);
3432 pItem->SetState(ITEM_CHANGED, this);
3433 }
3434}

References DestroyItem(), Item::GetBagSlot(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Item::GetSlot(), Object::IsInWorld(), ITEM_CHANGED, ItemRemovedQuestCheck(), LOG_DEBUG, Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), and ObjectGuid::ToString().

◆ DestroyItemCount() [2/2]

void Player::DestroyItemCount ( uint32  item,
uint32  count,
bool  update,
bool  unequip_check = false 
)
3137{
3138 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item = {}, count = {}", itemEntry, count);
3139 uint32 remcount = 0;
3140
3141 // in inventory
3143 {
3144 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3145 {
3146 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3147 {
3148 if (item->GetCount() + remcount <= count)
3149 {
3150 // all items in inventory can unequipped
3151 remcount += item->GetCount();
3153
3154 if (remcount >= count)
3155 return;
3156 }
3157 else
3158 {
3159 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3160 item->SetCount(item->GetCount() - count + remcount);
3161 if (IsInWorld() && update)
3162 item->SendUpdateToPlayer(this);
3163 item->SetState(ITEM_CHANGED, this);
3164 return;
3165 }
3166 }
3167 }
3168 }
3169
3171 {
3172 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3173 {
3174 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3175 {
3176 if (item->GetCount() + remcount <= count)
3177 {
3178 // all keys can be unequipped
3179 remcount += item->GetCount();
3181
3182 if (remcount >= count)
3183 return;
3184 }
3185 else
3186 {
3187 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3188 item->SetCount(item->GetCount() - count + remcount);
3189 if (IsInWorld() && update)
3190 item->SendUpdateToPlayer(this);
3191 item->SetState(ITEM_CHANGED, this);
3192 return;
3193 }
3194 }
3195 }
3196 }
3197
3198 // in inventory bags
3200 {
3201 if (Bag* bag = GetBagByPos(i))
3202 {
3203 for (uint32 j = 0; j < bag->GetBagSize(); j++)
3204 {
3205 if (Item* item = bag->GetItemByPos(j))
3206 {
3207 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3208 {
3209 // all items in bags can be unequipped
3210 if (item->GetCount() + remcount <= count)
3211 {
3212 remcount += item->GetCount();
3213 DestroyItem(i, j, update);
3214
3215 if (remcount >= count)
3216 return;
3217 }
3218 else
3219 {
3220 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3221 item->SetCount(item->GetCount() - count + remcount);
3222 if (IsInWorld() && update)
3223 item->SendUpdateToPlayer(this);
3224 item->SetState(ITEM_CHANGED, this);
3225 return;
3226 }
3227 }
3228 }
3229 }
3230 }
3231 }
3232
3233 // in equipment and bag list
3235 {
3236 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3237 {
3238 if (item && item->GetEntry() == itemEntry && !item->IsInTrade())
3239 {
3240 if (item->GetCount() + remcount <= count)
3241 {
3242 if (!unequip_check || CanUnequipItem(INVENTORY_SLOT_BAG_0 << 8 | i, false) == EQUIP_ERR_OK)
3243 {
3244 remcount += item->GetCount();
3246
3247 if (remcount >= count)
3248 return;
3249 }
3250 }
3251 else
3252 {
3253 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3254 item->SetCount(item->GetCount() - count + remcount);
3255 if (IsInWorld() && update)
3256 item->SendUpdateToPlayer(this);
3257 item->SetState(ITEM_CHANGED, this);
3258 return;
3259 }
3260 }
3261 }
3262 }
3263
3264 // in bank
3266 {
3267 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3268 {
3269 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3270 {
3271 if (item->GetCount() + remcount <= count)
3272 {
3273 remcount += item->GetCount();
3275 if (remcount >= count)
3276 return;
3277 }
3278 else
3279 {
3280 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3281 item->SetCount(item->GetCount() - count + remcount);
3282 if (IsInWorld() && update)
3283 item->SendUpdateToPlayer(this);
3284 item->SetState(ITEM_CHANGED, this);
3285 return;
3286 }
3287 }
3288 }
3289 }
3290
3291 // in bank bags
3292 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
3293 {
3294 if (Bag* bag = GetBagByPos(i))
3295 {
3296 for (uint32 j = 0; j < bag->GetBagSize(); j++)
3297 {
3298 if (Item* item = bag->GetItemByPos(j))
3299 {
3300 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3301 {
3302 // all items in bags can be unequipped
3303 if (item->GetCount() + remcount <= count)
3304 {
3305 remcount += item->GetCount();
3306 DestroyItem(i, j, update);
3307
3308 if (remcount >= count)
3309 return;
3310 }
3311 else
3312 {
3313 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3314 item->SetCount(item->GetCount() - count + remcount);
3315 if (IsInWorld() && update)
3316 item->SendUpdateToPlayer(this);
3317 item->SetState(ITEM_CHANGED, this);
3318 return;
3319 }
3320 }
3321 }
3322 }
3323 }
3324 }
3325}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CanUnequipItem(), CURRENCYTOKEN_SLOT_END, DestroyItem(), EQUIP_ERR_OK, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Object::IsInWorld(), ITEM_CHANGED, ItemRemovedQuestCheck(), KEYRING_SLOT_START, and LOG_DEBUG.

Referenced by _StoreOrEquipNewItem(), AbandonQuest(), WorldSession::DoLootRelease(), Spell::EffectCreateItem2(), Spell::EffectEnchantItemPerm(), Spell::EffectFeedPet(), Spell::EffectScriptEffect(), FailQuest(), go_ahune_ice_stone::GossipSelect(), misc_commandscript::HandleAddItemCommand(), spell_brewfest_fill_keg::HandleAfterHit(), spell_brewfest_unfill_keg::HandleAfterHit(), WorldSession::HandleDestroyItemOpcode(), spell_item_massive_seaforium_charge::HandleItemRemove(), WorldSession::HandleWrapItemOpcode(), npc_brewfest_keg_reciver::MoveInLineOfSight(), at_hor_battered_hilt_throw::OnTrigger(), npc_oculus_drakegiver::RemoveEssence(), RewardQuest(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), Spell::TakeAmmo(), Spell::TakeCastItem(), TakeQuestSourceItem(), and Spell::TakeReagents().

◆ DestroyZoneLimitedItem()

void Player::DestroyZoneLimitedItem ( bool  update,
uint32  new_zone 
)
3328{
3329 LOG_DEBUG("entities.player.items", "STORAGE: DestroyZoneLimitedItem in map {} and area {}", GetMapId(), new_zone);
3330
3331 // in inventory
3333 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3334 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3336
3338 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3339 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3341
3342 // in inventory bags
3344 if (Bag* pBag = GetBagByPos(i))
3345 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
3346 if (Item* pItem = pBag->GetItemByPos(j))
3347 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3348 DestroyItem(i, j, update);
3349
3350 // in equipment and bag list
3352 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3353 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3355}

References CURRENCYTOKEN_SLOT_END, DestroyItem(), EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), WorldLocation::GetMapId(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_START, and LOG_DEBUG.

Referenced by UpdateZone().

◆ DoRandomRoll()

uint32 Player::DoRandomRoll ( uint32  minimum,
uint32  maximum 
)
16128{
16129 ASSERT(minimum <= maximum);
16130
16131 uint32 roll = urand(minimum, maximum);
16132
16134 randomRoll.Min = minimum;
16135 randomRoll.Max = maximum;
16136 randomRoll.Result = roll;
16137 randomRoll.Roller = GetGUID();
16138 if (Group* group = GetGroup())
16139 group->BroadcastPacket(randomRoll.Write(), false);
16140 else
16141 SendDirectMessage(randomRoll.Write());
16142
16143 return roll;
16144}
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:44
Definition: MiscPackets.h:108
uint32 Max
Definition: MiscPackets.h:115
uint32 Result
Definition: MiscPackets.h:116
WorldPacket const * Write() override
Definition: MiscPackets.cpp:76
uint32 Min
Definition: MiscPackets.h:114
ObjectGuid Roller
Definition: MiscPackets.h:117

References ASSERT, GetGroup(), Object::GetGUID(), WorldPackets::Misc::RandomRoll::Max, WorldPackets::Misc::RandomRoll::Min, WorldPackets::Misc::RandomRoll::Result, WorldPackets::Misc::RandomRoll::Roller, SendDirectMessage(), urand(), and WorldPackets::Misc::RandomRoll::Write().

Referenced by WorldSession::HandleRandomRollOpcode(), and spell_item_worn_troll_dice::HandleScript().

◆ DropModCharge()

void Player::DropModCharge ( SpellModifier mod,
Spell spell 
)
10024{
10025 if (spell && mod->ownerAura && mod->charges > 0)
10026 {
10027 if (--mod->charges == 0)
10028 mod->charges = -1;
10029
10030 spell->m_appliedMods.insert(mod->ownerAura);
10031 }
10032}
int16 charges
Definition: Player.h:185
UsedSpellMods m_appliedMods
Definition: Spell.h:545

References SpellModifier::charges, Spell::m_appliedMods, and SpellModifier::ownerAura.

Referenced by ApplySpellMod().

◆ DuelComplete()

void Player::DuelComplete ( DuelCompleteType  type)
6368{
6369 // duel not requested
6370 if (!duel)
6371 return;
6372
6373 // Check if DuelComplete() has been called already up in the stack and in that case don't do anything else here
6374 if (duel->State == DUEL_STATE_COMPLETED)
6375 return;
6376
6377 Player* opponent = duel->Opponent;
6378 duel->State = DUEL_STATE_COMPLETED;
6379 opponent->duel->State = DUEL_STATE_COMPLETED;
6380
6381 LOG_DEBUG("entities.unit", "Player::DuelComplete: Player '{}' ({}), Opponent: '{}' ({})", GetName(), GetGUID().ToString(), opponent->GetName(), opponent->GetGUID().ToString());
6382
6384 data << uint8((type != DUEL_INTERRUPTED) ? 1 : 0);
6385 SendDirectMessage(&data);
6386 if (opponent->GetSession())
6387 {
6388 opponent->SendDirectMessage(&data);
6389 }
6390
6391 if (type != DUEL_INTERRUPTED)
6392 {
6393 data.Initialize(SMSG_DUEL_WINNER, (1 + 20)); // we guess size
6394 data << uint8(type == DUEL_WON ? 0 : 1); // 0 = just won; 1 = fled
6395 data << opponent->GetName();
6396 data << GetName();
6397 SendMessageToSet(&data, true);
6398 }
6399
6400 sScriptMgr->OnPlayerDuelEnd(opponent, this, type);
6401
6402 switch (type)
6403 {
6404 case DUEL_FLED:
6405 // if initiator and opponent are on the same team
6406 // or initiator and opponent are not PvP enabled, forcibly stop attacking
6407 if (GetTeamId() == opponent->GetTeamId())
6408 {
6409 AttackStop();
6410 opponent->AttackStop();
6411 }
6412 else
6413 {
6414 if (!IsPvP())
6415 {
6416 AttackStop();
6417 }
6418 if (!opponent->IsPvP())
6419 {
6420 opponent->AttackStop();
6421 }
6422 }
6423 break;
6424 case DUEL_WON:
6427
6428 // Credit for quest Death's Challenge
6430 {
6431 opponent->CastSpell(opponent, 52994, true);
6432 }
6433
6434 // Honor points after duel (the winner) - ImpConfig
6435 if (uint32 amount = sWorld->getIntConfig(CONFIG_HONOR_AFTER_DUEL))
6436 {
6437 opponent->RewardHonor(nullptr, 1, amount);
6438 }
6439
6440 break;
6441 default:
6442 break;
6443 }
6444
6445 // Victory emote spell
6446 if (type != DUEL_INTERRUPTED)
6447 {
6448 opponent->CastSpell(opponent, 52852, true);
6449 }
6450
6451 // Remove Duel Flag object
6453 if (obj)
6454 {
6455 duel->Initiator->RemoveGameObject(obj, true);
6456 }
6457
6458 /* remove auras */
6459 AuraApplicationMap& itsAuras = opponent->GetAppliedAuras();
6460 for (AuraApplicationMap::iterator i = itsAuras.begin(); i != itsAuras.end();)
6461 {
6462 Aura const* aura = i->second->GetBase();
6463 if (!i->second->IsPositive() && aura->GetCasterGUID() == GetGUID() && aura->GetApplyTime() >= duel->StartTime)
6464 {
6465 opponent->RemoveAura(i);
6466 }
6467 else
6468 {
6469 ++i;
6470 }
6471 }
6472
6474 for (AuraApplicationMap::iterator i = myAuras.begin(); i != myAuras.end();)
6475 {
6476 Aura const* aura = i->second->GetBase();
6477 if (!i->second->IsPositive() && aura->GetCasterGUID() == opponent->GetGUID() && aura->GetApplyTime() >= duel->StartTime)
6478 RemoveAura(i);
6479 else
6480 ++i;
6481 }
6482
6483 // cleanup combo points
6484 if (GetComboTarget() == duel->Opponent)
6485 {
6487 }
6488 else if (GetComboTargetGUID() == duel->Opponent->GetPetGUID())
6489 {
6491 }
6492
6493 if (duel->Opponent->GetComboTarget() == this)
6494 {
6495 duel->Opponent->ClearComboPoints();
6496 }
6497 else if (duel->Opponent->GetComboTargetGUID() == GetPetGUID())
6498 {
6499 duel->Opponent->ClearComboPoints();
6500 }
6501
6502 //cleanups
6506 opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 0);
6507
6508 opponent->duel.reset(nullptr);
6509 duel.reset(nullptr);
6510}
@ PLAYER_DUEL_TEAM
Definition: UpdateFields.h:184
@ DUEL_STATE_COMPLETED
Definition: Player.h:373
@ CLASS_CONTEXT_QUEST
Definition: UnitDefines.h:208
@ CONFIG_HONOR_AFTER_DUEL
Definition: IWorld.h:337
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL
Definition: DBCEnums.h:186
@ ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL
Definition: DBCEnums.h:187
@ DUEL_WON
Definition: SharedDefines.h:3613
@ SMSG_DUEL_WINNER
Definition: Opcodes.h:393
@ SMSG_DUEL_COMPLETE
Definition: Opcodes.h:392
bool RewardHonor(Unit *victim, uint32 groupsize, int32 honor=-1, bool awardXP=true)
Definition: Player.cpp:6021
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition: Player.cpp:5613
bool IsPvP()
Definition: Player.cpp:16179
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition: Unit.h:639
void ClearComboPoints()
Definition: Unit.cpp:16803
Unit * GetComboTarget() const
Definition: Unit.h:1635
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition: Unit.cpp:10348
ObjectGuid const GetComboTargetGUID() const
Definition: Unit.h:1636
ObjectGuid GetPetGUID() const
Definition: Unit.h:1167
ObjectGuid GetCasterGUID() const
Definition: SpellAuras.h:105
time_t GetApplyTime() const
Definition: SpellAuras.h:128

References ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL, ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL, Unit::AttackStop(), Unit::CastSpell(), CLASS_CONTEXT_QUEST, CLASS_DEATH_KNIGHT, Unit::ClearComboPoints(), CONFIG_HONOR_AFTER_DUEL, duel, DUEL_FLED, DUEL_INTERRUPTED, DUEL_STATE_COMPLETED, DUEL_WON, ObjectGuid::Empty, Unit::GetAppliedAuras(), Aura::GetApplyTime(), Aura::GetCasterGUID(), Unit::GetComboTarget(), Unit::GetComboTargetGUID(), Map::GetGameObject(), Object::GetGUID(), Object::GetGuidValue(), WorldObject::GetMap(), WorldObject::GetName(), Unit::GetPetGUID(), GetQuestStatus(), GetSession(), GetTeamId(), WorldPacket::Initialize(), IsClass(), IsPvP(), LOG_DEBUG, PLAYER_DUEL_ARBITER, PLAYER_DUEL_TEAM, QUEST_STATUS_INCOMPLETE, Unit::RemoveAura(), RewardHonor(), SendDirectMessage(), SendMessageToSet(), Object::SetGuidValue(), Unit::SetUInt32Value(), SMSG_DUEL_COMPLETE, SMSG_DUEL_WINNER, sScriptMgr, sWorld, ObjectGuid::ToString(), Position::ToString(), and UpdateAchievementCriteria().

Referenced by Unit::_ExitVehicle(), CheckDuelDistance(), CleanupsBeforeDelete(), Unit::DealDamage(), WorldSession::HandleDuelCancelledOpcode(), and TeleportTo().

◆ DurabilityLoss()

void Player::DurabilityLoss ( Item item,
double  percent 
)
4686{
4687 if(!item || percent == 0.0)
4688 return;
4689
4690 uint32 pMaxDurability = item ->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4691
4692 if (!pMaxDurability)
4693 return;
4694
4695 uint32 pDurabilityLoss = uint32(pMaxDurability * percent);
4696
4697 if (pDurabilityLoss < 1)
4698 pDurabilityLoss = 1;
4699
4700 DurabilityPointsLoss(item, pDurabilityLoss);
4701}
@ ITEM_FIELD_MAXDURABILITY
Definition: UpdateFields.h:70
void DurabilityPointsLoss(Item *item, int32 points)
Definition: Player.cpp:4729

References DurabilityPointsLoss(), Object::GetUInt32Value(), and ITEM_FIELD_MAXDURABILITY.

Referenced by DurabilityLossAll(), Spell::EffectDurabilityDamagePCT(), and Spell::EffectSummonChangeItem().

◆ DurabilityLossAll()

void Player::DurabilityLossAll ( double  percent,
bool  inventory 
)
4660{
4662 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4663 DurabilityLoss(pItem, percent);
4664
4665 if (inventory)
4666 {
4667 // bags not have durability
4668 // for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
4669
4671 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4672 DurabilityLoss(pItem, percent);
4673
4674 // keys not have durability
4675 //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
4676
4678 if (Bag* pBag = GetBagByPos(i))
4679 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4680 if (Item* pItem = GetItemByPos(i, j))
4681 DurabilityLoss(pItem, percent);
4682 }
4683}
void DurabilityLoss(Item *item, double percent)
Definition: Player.cpp:4685

References DurabilityLoss(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::EffectDurabilityDamagePCT(), EnvironmentalDamage(), and WorldSession::SendSpiritResurrect().

◆ DurabilityPointLossForEquipSlot()

void Player::DurabilityPointLossForEquipSlot ( EquipmentSlots  slot)
4762{
4763 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
4764 DurabilityPointsLoss(pItem, 1);
4765}

References DurabilityPointsLoss(), GetItemByPos(), and INVENTORY_SLOT_BAG_0.

Referenced by Unit::DealDamage(), and Spell::TakeAmmo().

◆ DurabilityPointsLoss()

void Player::DurabilityPointsLoss ( Item item,
int32  points 
)
4730{
4732 {
4733 return;
4734 }
4735
4736 int32 pMaxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4737 int32 pOldDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
4738 int32 pNewDurability = pOldDurability - points;
4739
4740 if (pNewDurability < 0)
4741 pNewDurability = 0;
4742 else if (pNewDurability > pMaxDurability)
4743 pNewDurability = pMaxDurability;
4744
4745 if (pOldDurability != pNewDurability)
4746 {
4747 // modify item stats _before_ Durability set to 0 to pass _ApplyItemMods internal check
4748 if (pNewDurability == 0 && pOldDurability > 0 && item->IsEquipped())
4749 _ApplyItemMods(item, item->GetSlot(), false);
4750
4751 item->SetUInt32Value(ITEM_FIELD_DURABILITY, pNewDurability);
4752
4753 // modify item stats _after_ restore durability to pass _ApplyItemMods internal check
4754 if (pNewDurability > 0 && pOldDurability == 0 && item->IsEquipped())
4755 _ApplyItemMods(item, item->GetSlot(), true);
4756
4757 item->SetState(ITEM_CHANGED, this);
4758 }
4759}
@ SPELL_AURA_PREVENT_DURABILITY_LOSS
Definition: SpellAuraDefines.h:352
@ ITEM_FIELD_DURABILITY
Definition: UpdateFields.h:69

References _ApplyItemMods(), Item::GetSlot(), Object::GetUInt32Value(), Unit::HasAuraType(), Item::IsEquipped(), ITEM_CHANGED, ITEM_FIELD_DURABILITY, ITEM_FIELD_MAXDURABILITY, Item::SetState(), Object::SetUInt32Value(), and SPELL_AURA_PREVENT_DURABILITY_LOSS.

Referenced by DurabilityLoss(), DurabilityPointLossForEquipSlot(), DurabilityPointsLossAll(), and Spell::EffectDurabilityDamage().

◆ DurabilityPointsLossAll()

void Player::DurabilityPointsLossAll ( int32  points,
bool  inventory 
)
4704{
4706 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4707 DurabilityPointsLoss(pItem, points);
4708
4709 if (inventory)
4710 {
4711 // bags not have durability
4712 // for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
4713
4715 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4716 DurabilityPointsLoss(pItem, points);
4717
4718 // keys not have durability
4719 //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
4720
4722 if (Bag* pBag = (Bag*)GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4723 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4724 if (Item* pItem = GetItemByPos(i, j))
4725 DurabilityPointsLoss(pItem, points);
4726 }
4727}

References DurabilityPointsLoss(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::EffectDurabilityDamage().

◆ DurabilityRepair()

uint32 Player::DurabilityRepair ( uint16  pos,
bool  cost,
float  discountMod,
bool  guildBank 
)
4784{
4785 Item* item = GetItemByPos(pos);
4786
4787 uint32 TotalCost = 0;
4788 if (!item)
4789 return TotalCost;
4790
4791 uint32 maxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4792 if (!maxDurability)
4793 return TotalCost;
4794
4795 uint32 curDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
4796
4797 if (cost)
4798 {
4799 uint32 LostDurability = maxDurability - curDurability;
4800 if (LostDurability > 0)
4801 {
4802 ItemTemplate const* ditemProto = item->GetTemplate();
4803
4804 DurabilityCostsEntry const* dcost = sDurabilityCostsStore.LookupEntry(ditemProto->ItemLevel);
4805 if (!dcost)
4806 {
4807 LOG_ERROR("entities.player", "RepairDurability: Wrong item lvl {}", ditemProto->ItemLevel);
4808 return TotalCost;
4809 }
4810
4811 uint32 dQualitymodEntryId = (ditemProto->Quality + 1) * 2;
4812 DurabilityQualityEntry const* dQualitymodEntry = sDurabilityQualityStore.LookupEntry(dQualitymodEntryId);
4813 if (!dQualitymodEntry)
4814 {
4815 LOG_ERROR("entities.player", "RepairDurability: Wrong dQualityModEntry {}", dQualitymodEntryId);
4816 return TotalCost;
4817 }
4818
4819 uint32 dmultiplier = dcost->multiplier[ItemSubClassToDurabilityMultiplierId(ditemProto->Class, ditemProto->SubClass)];
4820 uint32 costs = uint32(LostDurability * dmultiplier * double(dQualitymodEntry->quality_mod));
4821
4822 costs = uint32(costs * discountMod * sWorld->getRate(RATE_REPAIRCOST));
4823
4824 if (costs == 0) //fix for ITEM_QUALITY_ARTIFACT
4825 costs = 1;
4826
4827 if (guildBank)
4828 {
4829 if (GetGuildId() == 0)
4830 {
4831 // LOG_DEBUG("entities.player", "You are not member of a guild");
4832 return TotalCost;
4833 }
4834
4835 Guild* guild = sGuildMgr->GetGuildById(GetGuildId());
4836 if (!guild)
4837 return TotalCost;
4838
4839 if (!guild->HandleMemberWithdrawMoney(GetSession(), costs, true))
4840 return TotalCost;
4841
4842 TotalCost = costs;
4843 }
4844 else if (!HasEnoughMoney(costs))
4845 {
4846 // LOG_DEBUG("entities.player", "You do not have enough money");
4847 return TotalCost;
4848 }
4849 else
4850 ModifyMoney(-int32(costs));
4851 }
4852 }
4853
4854 item->SetUInt32Value(ITEM_FIELD_DURABILITY, maxDurability);
4855 item->SetState(ITEM_CHANGED, this);
4856
4857 // reapply mods for total broken and repaired item if equipped
4858 if (IsEquipmentPos(pos) && !curDurability)
4859 _ApplyItemMods(item, pos & 255, true);
4860 return TotalCost;
4861}
DBCStorage< DurabilityQualityEntry > sDurabilityQualityStore(DurabilityQualityfmt)
DBCStorage< DurabilityCostsEntry > sDurabilityCostsStore(DurabilityCostsfmt)
uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass)
Definition: ItemTemplate.h:557
@ RATE_REPAIRCOST
Definition: IWorld.h:481
uint32 ItemLevel
Definition: ItemTemplate.h:635
bool HandleMemberWithdrawMoney(WorldSession *session, uint32 amount, bool repair=false)
Definition: Guild.cpp:1691
Definition: DBCStructure.h:878
uint32 multiplier[29]
Definition: DBCStructure.h:880
Definition: DBCStructure.h:884
float quality_mod
Definition: DBCStructure.h:886

References _ApplyItemMods(), ItemTemplate::Class, GetGuildId(), GetItemByPos(), GetSession(), Item::GetTemplate(), Object::GetUInt32Value(), Guild::HandleMemberWithdrawMoney(), HasEnoughMoney(), IsEquipmentPos(), ITEM_CHANGED, ITEM_FIELD_DURABILITY, ITEM_FIELD_MAXDURABILITY, ItemTemplate::ItemLevel, ItemSubClassToDurabilityMultiplierId(), LOG_ERROR, ModifyMoney(), DurabilityCostsEntry::multiplier, ItemTemplate::Quality, DurabilityQualityEntry::quality_mod, RATE_REPAIRCOST, sDurabilityCostsStore, sDurabilityQualityStore, Item::SetState(), Object::SetUInt32Value(), sGuildMgr, ItemTemplate::SubClass, and sWorld.

Referenced by DurabilityRepairAll(), and WorldSession::HandleRepairItemOpcode().

◆ DurabilityRepairAll()

uint32 Player::DurabilityRepairAll ( bool  cost,
float  discountMod,
bool  guildBank 
)
4768{
4769 uint32 TotalCost = 0;
4770 // equipped, backpack, bags itself
4772 TotalCost += DurabilityRepair(((INVENTORY_SLOT_BAG_0 << 8) | i), cost, discountMod, guildBank);
4773
4774 // bank, buyback and keys not repaired
4775
4776 // items in inventory bags
4778 for (uint8 i = 0; i < MAX_BAG_SIZE; i++)
4779 TotalCost += DurabilityRepair(((j << 8) | i), cost, discountMod, guildBank);
4780 return TotalCost;
4781}
uint32 DurabilityRepair(uint16 pos, bool cost, float discountMod, bool guildBank)
Definition: Player.cpp:4783

References DurabilityRepair(), EQUIPMENT_SLOT_START, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and MAX_BAG_SIZE.

Referenced by WorldSession::HandleRepairItemOpcode().

◆ EnchantmentFitsRequirements()

bool Player::EnchantmentFitsRequirements ( uint32  enchantmentcondition,
int8  slot 
)
11077{
11078 if (!enchantmentcondition)
11079 return true;
11080
11081 SpellItemEnchantmentConditionEntry const* Condition = sSpellItemEnchantmentConditionStore.LookupEntry(enchantmentcondition);
11082
11083 if (!Condition)
11084 return true;
11085
11086 uint8 curcount[4] = {0, 0, 0, 0};
11087
11088 //counting current equipped gem colors
11090 {
11091 if (i == slot)
11092 continue;
11094 if (pItem2 && !pItem2->IsBroken() && pItem2->HasSocket())
11095 {
11096 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot <= PRISMATIC_ENCHANTMENT_SLOT; ++enchant_slot)
11097 {
11098 if (enchant_slot == BONUS_ENCHANTMENT_SLOT)
11099 continue;
11100
11101 uint32 enchant_id = pItem2->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11102 if (!enchant_id)
11103 continue;
11104
11105 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11106 if (!enchantEntry)
11107 continue;
11108
11109 uint32 gemid = enchantEntry->GemID;
11110 if (!gemid)
11111 continue;
11112
11113 ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemid);
11114 if (!gemProto)
11115 continue;
11116
11117 GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GemProperties);
11118 if (!gemProperty)
11119 continue;
11120
11121 uint8 GemColor = gemProperty->color;
11122
11123 for (uint8 b = 0, tmpcolormask = 1; b < 4; b++, tmpcolormask <<= 1)
11124 {
11125 if (tmpcolormask & GemColor)
11126 ++curcount[b];
11127 }
11128 }
11129 }
11130 }
11131
11132 bool activate = true;
11133
11134 for (uint8 i = 0; i < 5; i++)
11135 {
11136 if (!Condition->Color[i])
11137 continue;
11138
11139 uint32 _cur_gem = curcount[Condition->Color[i] - 1];
11140
11141 // if have <CompareColor> use them as count, else use <value> from Condition
11142 uint32 _cmp_gem = Condition->CompareColor[i] ? curcount[Condition->CompareColor[i] - 1] : Condition->Value[i];
11143
11144 switch (Condition->Comparator[i])
11145 {
11146 case 2: // requires less <color> than (<value> || <comparecolor>) gems
11147 activate &= (_cur_gem < _cmp_gem);
11148 break;
11149 case 3: // requires more <color> than (<value> || <comparecolor>) gems
11150 activate &= (_cur_gem > _cmp_gem);
11151 break;
11152 case 5: // requires at least <color> than (<value> || <comparecolor>) gems
11153 activate &= (_cur_gem >= _cmp_gem);
11154 break;
11155 }
11156 }
11157
11158 LOG_DEBUG("entities.player.items", "Checking Condition {}, there are {} Meta Gems, {} Red Gems, {} Yellow Gems and {} Blue Gems, Activate:{}", enchantmentcondition, curcount[0], curcount[1], curcount[2], curcount[3], activate ? "yes" : "no");
11159
11160 return activate;
11161}
DBCStorage< SpellItemEnchantmentConditionEntry > sSpellItemEnchantmentConditionStore(SpellItemEnchantmentConditionfmt)
DBCStorage< GemPropertiesEntry > sGemPropertiesStore(GemPropertiesEntryfmt)
@ BONUS_ENCHANTMENT_SLOT
Definition: Item.h:174
Definition: ConditionMgr.h:194
uint32 GemProperties
Definition: ItemTemplate.h:683
Definition: DBCStructure.h:1014
uint32 color
Definition: DBCStructure.h:1017
Definition: DBCStructure.h:1860

References BONUS_ENCHANTMENT_SLOT, GemPropertiesEntry::color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, SpellItemEnchantmentEntry::GemID, ItemTemplate::GemProperties, Item::GetEnchantmentId(), GetItemByPos(), Item::HasSocket(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), LOG_DEBUG, PRISMATIC_ENCHANTMENT_SLOT, sGemPropertiesStore, sObjectMgr, SOCK_ENCHANTMENT_SLOT, sSpellItemEnchantmentConditionStore, and sSpellItemEnchantmentStore.

Referenced by ApplyEnchantment(), and CorrectMetaGemEnchants().

◆ EnvironmentalDamage()

uint32 Player::EnvironmentalDamage ( EnviromentalDamage  type,
uint32  damage 
)
755{
757 return 0;
758
759 // Absorb, resist some environmental damage type
760 uint32 absorb = 0;
761 uint32 resist = 0;
762
763 switch (type)
764 {
765 case DAMAGE_LAVA:
766 case DAMAGE_SLIME:
767 {
768 DamageInfo dmgInfo(this, this, damage, nullptr, type == DAMAGE_LAVA ? SPELL_SCHOOL_MASK_FIRE : SPELL_SCHOOL_MASK_NATURE, DIRECT_DAMAGE);
769 Unit::CalcAbsorbResist(dmgInfo);
770 absorb = dmgInfo.GetAbsorb();
771 resist = dmgInfo.GetResist();
772 damage = dmgInfo.GetDamage();
773 }
774 default:
775 break;
776 }
777
778 Unit::DealDamageMods(this, damage, &absorb);
779
781 packet.Victim = GetGUID();
782 packet.Type = type != DAMAGE_FALL_TO_VOID ? type : DAMAGE_FALL;
783 packet.Amount = damage;
784 packet.Absorbed = absorb;
785 packet.Resisted = resist;
786 SendMessageToSet(packet.Write(), true);
787
788 uint32 final_damage = Unit::DealDamage(this, this, damage, nullptr, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
789
790 if (!IsAlive())
791 {
792 if (type == DAMAGE_FALL) // DealDamage not apply item durability loss at self damage
793 {
794 LOG_DEBUG("entities.player", "Player::EnvironmentalDamage: Player '{}' ({}) fall to death, losing {} durability",
797 // durability lost message
799 }
800
802 }
803
804 return final_damage;
805}
@ DAMAGE_SLIME
Definition: Player.h:838
@ DAMAGE_FALL
Definition: Player.h:836
@ DAMAGE_LAVA
Definition: Player.h:837
@ DAMAGE_FALL_TO_VOID
Definition: Player.h:840
@ SELF_DAMAGE
Definition: Unit.h:253
@ DIRECT_DAMAGE
Definition: Unit.h:248
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition: IWorld.h:515
@ ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM
Definition: DBCEnums.h:140
@ SPELL_SCHOOL_MASK_NATURE
Definition: SharedDefines.h:300
@ SPELL_SCHOOL_MASK_FIRE
Definition: SharedDefines.h:299
void DurabilityLossAll(double percent, bool inventory)
Definition: Player.cpp:4659
void SendDurabilityLoss()
Definition: Player.cpp:4654
bool IsImmuneToEnvironmentalDamage()
Definition: Player.cpp:748
Definition: Unit.h:330
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition: Unit.cpp:2114
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition: Unit.cpp:787
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition: Unit.cpp:797
Definition: CombatLogPackets.h:29
ObjectGuid Victim
Definition: CombatLogPackets.h:35
uint32 Amount
Definition: CombatLogPackets.h:37
uint32 Absorbed
Definition: CombatLogPackets.h:39
EnviromentalDamage Type
Definition: CombatLogPackets.h:36
uint32 Resisted
Definition: CombatLogPackets.h:38
WorldPacket const * Write() override
Definition: CombatLogPackets.cpp:20

References WorldPackets::CombatLog::EnvironmentalDamageLog::Absorbed, ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, WorldPackets::CombatLog::EnvironmentalDamageLog::Amount, Unit::CalcAbsorbResist(), DAMAGE_FALL, DAMAGE_FALL_TO_VOID, DAMAGE_LAVA, DAMAGE_SLIME, Unit::DealDamage(), Unit::DealDamageMods(), DIRECT_DAMAGE, DurabilityLossAll(), DamageInfo::GetAbsorb(), DamageInfo::GetDamage(), Object::GetGUID(), WorldObject::GetName(), DamageInfo::GetResist(), Unit::IsAlive(), IsImmuneToEnvironmentalDamage(), LOG_DEBUG, RATE_DURABILITY_LOSS_ON_DEATH, WorldPackets::CombatLog::EnvironmentalDamageLog::Resisted, SELF_DAMAGE, SendDurabilityLoss(), SendMessageToSet(), SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_NATURE, SPELL_SCHOOL_MASK_NORMAL, sWorld, Position::ToString(), WorldPackets::CombatLog::EnvironmentalDamageLog::Type, UpdateAchievementCriteria(), WorldPackets::CombatLog::EnvironmentalDamageLog::Victim, and WorldPackets::CombatLog::EnvironmentalDamageLog::Write().

Referenced by Spell::EffectEnvironmentalDMG(), HandleDrowning(), HandleFall(), and WorldSession::HandleMovementOpcodes().

◆ EquipItem()

Item * Player::EquipItem ( uint16  pos,
Item pItem,
bool  update 
)
2743{
2745 AddItemDurations(pItem);
2746
2747 uint8 bag = pos >> 8;
2748 uint8 slot = pos & 255;
2749
2750 Item* pItem2 = GetItemByPos(bag, slot);
2751
2752 if (!pItem2)
2753 {
2754 VisualizeItem(slot, pItem);
2755
2756 if (IsAlive())
2757 {
2758 ItemTemplate const* pProto = pItem->GetTemplate();
2759
2760 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
2761 if (pProto && pProto->ItemSet)
2762 AddItemsSetItem(this, pItem);
2763
2764 _ApplyItemMods(pItem, slot, true);
2765
2766 if (pProto && IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer == 0)
2767 {
2768 uint32 cooldownSpell = IsClass(CLASS_ROGUE, CLASS_CONTEXT_WEAPON_SWAP) ? 6123 : 6119;
2769 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(cooldownSpell);
2770
2771 if (!spellProto)
2772 LOG_ERROR("entities.player", "Weapon switch cooldown spell {} couldn't be found in Spell.dbc", cooldownSpell);
2773 else
2774 {
2776
2778
2779 WorldPacket data;
2781 GetSession()->SendPacket(&data);
2782 }
2783 }
2784 }
2785
2786 if (IsInWorld() && update)
2787 {
2788 pItem->AddToWorld();
2789 pItem->SendUpdateToPlayer(this);
2790 }
2791
2792 ApplyEquipCooldown(pItem);
2793
2794 // update expertise and armor penetration - passive auras may need it
2795
2796 if (slot == EQUIPMENT_SLOT_MAINHAND)
2798
2799 else if (slot == EQUIPMENT_SLOT_OFFHAND)
2801
2802 switch (slot)
2803 {
2808 default:
2809 break;
2810 }
2811 }
2812 else
2813 {
2814 pItem2->SetCount(pItem2->GetCount() + pItem->GetCount());
2815 if (IsInWorld() && update)
2816 pItem2->SendUpdateToPlayer(this);
2817
2818 // delete item (it not in any slot currently)
2819 //pItem->DeleteFromDB();
2820 if (IsInWorld() && update)
2821 {
2822 pItem->RemoveFromWorld();
2823 pItem->DestroyForPlayer(this);
2824 }
2825
2827 RemoveItemDurations(pItem);
2828
2829 pItem->SetOwnerGUID(GetGUID()); // prevent error at next SetState in case trade/mail/buy from vendor
2830 pItem->SetNotRefundable(this);
2831 pItem->ClearSoulboundTradeable(this);
2832 RemoveTradeableItem(pItem);
2833 pItem->SetState(ITEM_REMOVED, this);
2834 pItem2->SetState(ITEM_CHANGED, this);
2835
2836 ApplyEquipCooldown(pItem2);
2837 sScriptMgr->OnEquip(this, pItem2, bag, slot, update);
2838 return pItem2;
2839 }
2840
2841 // only for full equip instead adding to stack
2844
2845 sScriptMgr->OnEquip(this, pItem, bag, slot, update);
2847 return pItem;
2848}
@ SPELL_COOLDOWN_FLAG_INCLUDE_GCD
Starts GCD in addition to normal cooldown specified in the packet.
Definition: Unit.h:617
@ CLASS_CONTEXT_WEAPON_SWAP
Definition: UnitDefines.h:220
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM
Definition: DBCEnums.h:171
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM
Definition: DBCEnums.h:163
void UpdateForQuestWorldObjects()
Definition: PlayerUpdates.cpp:1742
GlobalCooldownMgr & GetGlobalCooldownMgr()
Definition: Player.h:1782
void ApplyEquipCooldown(Item *pItem)
Definition: Player.cpp:11724
void VisualizeItem(uint8 slot, Item *pItem)
Definition: PlayerStorage.cpp:2890
void AddGlobalCooldown(SpellInfo const *spellInfo, uint32 gcd)
Definition: CharmInfo.cpp:410
uint32 StartRecoveryTime
Definition: SpellInfo.h:351

References _ApplyItemMods(), ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, AddEnchantmentDurations(), GlobalCooldownMgr::AddGlobalCooldown(), AddItemDurations(), AddItemsSetItem(), Object::AddToWorld(), ApplyEquipCooldown(), BASE_ATTACK, Unit::BuildCooldownPacket(), ItemTemplate::Class, CLASS_CONTEXT_WEAPON_SWAP, CLASS_ROGUE, Item::ClearSoulboundTradeable(), CR_ARMOR_PENETRATION, Object::DestroyForPlayer(), EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, Item::GetCount(), Object::GetEntry(), GetGlobalCooldownMgr(), Object::GetGUID(), GetItemByPos(), GetSession(), Item::GetTemplate(), ItemTemplate::InventoryType, INVTYPE_RELIC, Unit::IsAlive(), IsClass(), Unit::IsInCombat(), Object::IsInWorld(), ITEM_CHANGED, ITEM_CLASS_WEAPON, ITEM_REMOVED, ItemTemplate::ItemSet, LOG_ERROR, m_weaponChangeTimer, OFF_ATTACK, RecalculateRating(), RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDurations(), RemoveTradeableItem(), WorldSession::SendPacket(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetNotRefundable(), Item::SetOwnerGUID(), Item::SetState(), SPELL_COOLDOWN_FLAG_INCLUDE_GCD, sScriptMgr, sSpellMgr, SpellInfo::StartRecoveryTime, UpdateAchievementCriteria(), UpdateExpertise(), UpdateForQuestWorldObjects(), and VisualizeItem().

Referenced by Create(), Spell::EffectSummonChangeItem(), EquipNewItem(), WorldSession::HandleAutoEquipItemOpcode(), SplitItem(), and SwapItem().

◆ EquipNewItem()

Item * Player::EquipNewItem ( uint16  pos,
uint32  item,
bool  update 
)
2723{
2724 Item* _item = Item::CreateItem(item, 1, this);
2725 if (!_item)
2726 return nullptr;
2727
2728 if (!IsEquipmentPos(pos) || sScriptMgr->CanSaveEquipNewItem(this, _item, pos, update))
2729 {
2730 // pussywizard: obtaining blue or better items saves to db
2731 if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item))
2732 if (pProto->Quality >= ITEM_QUALITY_RARE)
2734
2735 ItemAddedQuestCheck(item, 1);
2737 }
2738
2739 return EquipItem(pos, _item, update);
2740}
@ ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM
Definition: DBCEnums.h:199
@ ITEM_QUALITY_RARE
Definition: SharedDefines.h:332
void ItemAddedQuestCheck(uint32 entry, uint32 count)
Definition: PlayerQuest.cpp:1829

References ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, ADDITIONAL_SAVING_INVENTORY_AND_GOLD, AdditionalSavingAddMask(), Item::CreateItem(), EquipItem(), IsEquipmentPos(), ITEM_QUALITY_RARE, ItemAddedQuestCheck(), sObjectMgr, sScriptMgr, and UpdateAchievementCriteria().

Referenced by _StoreOrEquipNewItem(), and StoreNewItemInBestSlots().

◆ FailQuest()

void Player::FailQuest ( uint32  quest_id)
881{
882 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
883 {
884 QuestStatus qStatus = GetQuestStatus(questId);
885 // xinef: if quest is marked as failed, dont do it again
886 if ((qStatus != QUEST_STATUS_INCOMPLETE) && (!quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE)))
887 return;
888
890
891 uint16 log_slot = FindQuestSlot(questId);
892
893 if (log_slot < MAX_QUEST_LOG_SIZE)
894 {
895 SetQuestSlotTimer(log_slot, 1);
897 }
898
899 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
900 {
901 QuestStatusData& q_status = m_QuestStatus[questId];
902
903 RemoveTimedQuest(questId);
904 q_status.Timer = 0;
905
906 SendQuestTimerFailed(questId);
907 }
908 else
909 SendQuestFailed(questId);
910
911 // Destroy quest items on quest failure.
912 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
913 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
914 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
915 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
916
917 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
918 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
919 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
920 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
921 }
922}
@ QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE
Definition: QuestDef.h:167
void SendQuestTimerFailed(uint32 quest_id)
Definition: PlayerQuest.cpp:2388
void SendQuestFailed(uint32 questId, InventoryResult reason=EQUIP_ERR_OK)
Definition: PlayerQuest.cpp:2376
void SetQuestSlotTimer(uint16 slot, uint32 timer)
Definition: Player.h:1495
void RemoveTimedQuest(uint32 quest_id)
Definition: Player.h:1546

References BIND_QUEST_ITEM, DestroyItemCount(), FindQuestSlot(), GetQuestStatus(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATE_FAIL, QUEST_STATUS_FAILED, QUEST_STATUS_INCOMPLETE, RemoveTimedQuest(), SendQuestFailed(), SendQuestTimerFailed(), SetQuestSlotState(), SetQuestSlotTimer(), SetQuestStatus(), sObjectMgr, and QuestStatusData::Timer.

Referenced by npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), SmartAI::EndPath(), npc_clintar_spirit::npc_clintar_spiritAI::JustDied(), npc_captain_saeed::npc_captain_saeedAI::JustDied(), npc_doctor::npc_doctorAI::PatientDied(), Map::ScriptsProcess(), Update(), and npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI().

◆ FindEquipSlot()

uint8 Player::FindEquipSlot ( ItemTemplate const *  proto,
uint32  slot,
bool  swap 
) const
132{
133 uint8 slots[4];
134 slots[0] = NULL_SLOT;
135 slots[1] = NULL_SLOT;
136 slots[2] = NULL_SLOT;
137 slots[3] = NULL_SLOT;
138 switch (proto->InventoryType)
139 {
140 case INVTYPE_HEAD:
141 slots[0] = EQUIPMENT_SLOT_HEAD;
142 break;
143 case INVTYPE_NECK:
144 slots[0] = EQUIPMENT_SLOT_NECK;
145 break;
147 slots[0] = EQUIPMENT_SLOT_SHOULDERS;
148 break;
149 case INVTYPE_BODY:
150 slots[0] = EQUIPMENT_SLOT_BODY;
151 break;
152 case INVTYPE_CHEST:
153 case INVTYPE_ROBE:
154 slots[0] = EQUIPMENT_SLOT_CHEST;
155 break;
156 case INVTYPE_WAIST:
157 slots[0] = EQUIPMENT_SLOT_WAIST;
158 break;
159 case INVTYPE_LEGS:
160 slots[0] = EQUIPMENT_SLOT_LEGS;
161 break;
162 case INVTYPE_FEET:
163 slots[0] = EQUIPMENT_SLOT_FEET;
164 break;
165 case INVTYPE_WRISTS:
166 slots[0] = EQUIPMENT_SLOT_WRISTS;
167 break;
168 case INVTYPE_HANDS:
169 slots[0] = EQUIPMENT_SLOT_HANDS;
170 break;
171 case INVTYPE_FINGER:
172 slots[0] = EQUIPMENT_SLOT_FINGER1;
173 slots[1] = EQUIPMENT_SLOT_FINGER2;
174 break;
175 case INVTYPE_TRINKET:
176 slots[0] = EQUIPMENT_SLOT_TRINKET1;
177 slots[1] = EQUIPMENT_SLOT_TRINKET2;
178 break;
179 case INVTYPE_CLOAK:
180 slots[0] = EQUIPMENT_SLOT_BACK;
181 break;
182 case INVTYPE_WEAPON:
183 {
184 slots[0] = EQUIPMENT_SLOT_MAINHAND;
185
186 // suggest offhand slot only if know dual wielding
187 // (this will be replace mainhand weapon at auto equip instead unwonted "you don't known dual wielding" ...
188 if (CanDualWield())
189 slots[1] = EQUIPMENT_SLOT_OFFHAND;
190 break;
191 }
192 case INVTYPE_SHIELD:
194 case INVTYPE_HOLDABLE:
195 slots[0] = EQUIPMENT_SLOT_OFFHAND;
196 break;
197 case INVTYPE_RANGED:
199 case INVTYPE_THROWN:
200 slots[0] = EQUIPMENT_SLOT_RANGED;
201 break;
202 case INVTYPE_2HWEAPON:
203 slots[0] = EQUIPMENT_SLOT_MAINHAND;
205 {
206 if (ItemTemplate const* mhWeaponProto = mhWeapon->GetTemplate())
207 {
208 if (mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM || mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF)
209 {
210 const_cast<Player*>(this)->AutoUnequipOffhandIfNeed(true);
211 break;
212 }
213 }
214 }
215
217 {
218 if (proto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM || proto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF)
219 {
220 const_cast<Player*>(this)->AutoUnequipOffhandIfNeed(true);
221 break;
222 }
223 }
224 if (CanDualWield() && CanTitanGrip() && proto->SubClass != ITEM_SUBCLASS_WEAPON_POLEARM && proto->SubClass != ITEM_SUBCLASS_WEAPON_STAFF && proto->SubClass != ITEM_SUBCLASS_WEAPON_FISHING_POLE)
225 slots[1] = EQUIPMENT_SLOT_OFFHAND;
226 break;
227 case INVTYPE_TABARD:
228 slots[0] = EQUIPMENT_SLOT_TABARD;
229 break;
231 slots[0] = EQUIPMENT_SLOT_MAINHAND;
232 break;
233 case INVTYPE_BAG:
234 slots[0] = INVENTORY_SLOT_BAG_START + 0;
235 slots[1] = INVENTORY_SLOT_BAG_START + 1;
236 slots[2] = INVENTORY_SLOT_BAG_START + 2;
237 slots[3] = INVENTORY_SLOT_BAG_START + 3;
238 break;
239 case INVTYPE_RELIC:
240 {
241 switch (proto->SubClass)
242 {
245 slots[0] = EQUIPMENT_SLOT_RANGED;
246 break;
249 slots[0] = EQUIPMENT_SLOT_RANGED;
250 break;
253 slots[0] = EQUIPMENT_SLOT_RANGED;
254 break;
257 slots[0] = EQUIPMENT_SLOT_RANGED;
258 break;
261 slots[0] = EQUIPMENT_SLOT_RANGED;
262 break;
263 }
264 break;
265 }
266 default:
267 return NULL_SLOT;
268 }
269
270 if (slot != NULL_SLOT)
271 {
272 if (swap || !GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
273 for (uint8 i = 0; i < 4; ++i)
274 if (slots[i] == slot)
275 return slot;
276 }
277 else
278 {
279 // search free slot at first
280 for (uint8 i = 0; i < 4; ++i)
281 if (slots[i] != NULL_SLOT && !GetItemByPos(INVENTORY_SLOT_BAG_0, slots[i]))
282 // in case 2hand equipped weapon (without titan grip) offhand slot empty but not free
283 if (slots[i] != EQUIPMENT_SLOT_OFFHAND || !IsTwoHandUsed())
284 return slots[i];
285
286 // if not found free and can swap return first appropriate from used
287 for (uint8 i = 0; i < 4; ++i)
288 if (slots[i] != NULL_SLOT && swap)
289 return slots[i];
290 }
291
292 // no free position
293 return NULL_SLOT;
294}
@ ITEM_SUBCLASS_WEAPON_STAFF
Definition: ItemTemplate.h:354
@ INVTYPE_BODY
Definition: ItemTemplate.h:260
@ INVTYPE_FINGER
Definition: ItemTemplate.h:267
@ INVTYPE_HEAD
Definition: ItemTemplate.h:257
@ INVTYPE_ROBE
Definition: ItemTemplate.h:276
@ INVTYPE_HOLDABLE
Definition: ItemTemplate.h:279
@ INVTYPE_TRINKET
Definition: ItemTemplate.h:268
@ INVTYPE_RANGED
Definition: ItemTemplate.h:271
@ INVTYPE_THROWN
Definition: ItemTemplate.h:281
@ INVTYPE_WAIST
Definition: ItemTemplate.h:262
@ INVTYPE_RANGEDRIGHT
Definition: ItemTemplate.h:282
@ INVTYPE_WRISTS
Definition: ItemTemplate.h:265
@ INVTYPE_WEAPONMAINHAND
Definition: ItemTemplate.h:277
@ INVTYPE_BAG
Definition: ItemTemplate.h:274
@ INVTYPE_NECK
Definition: ItemTemplate.h:258
@ INVTYPE_SHOULDERS
Definition: ItemTemplate.h:259
@ INVTYPE_FEET
Definition: ItemTemplate.h:264
@ INVTYPE_SHIELD
Definition: ItemTemplate.h:270
@ INVTYPE_TABARD
Definition: ItemTemplate.h:275
@ INVTYPE_LEGS
Definition: ItemTemplate.h:263
@ INVTYPE_CHEST
Definition: ItemTemplate.h:261
@ INVTYPE_HANDS
Definition: ItemTemplate.h:266
@ EQUIPMENT_SLOT_SHOULDERS
Definition: Player.h:677
@ EQUIPMENT_SLOT_BODY
Definition: Player.h:678
@ EQUIPMENT_SLOT_HANDS
Definition: Player.h:684
@ EQUIPMENT_SLOT_NECK
Definition: Player.h:676
@ EQUIPMENT_SLOT_TABARD
Definition: Player.h:693
@ EQUIPMENT_SLOT_HEAD
Definition: Player.h:675
@ EQUIPMENT_SLOT_LEGS
Definition: Player.h:681
@ EQUIPMENT_SLOT_BACK
Definition: Player.h:689
@ EQUIPMENT_SLOT_WAIST
Definition: Player.h:680
@ EQUIPMENT_SLOT_FEET
Definition: Player.h:682
@ EQUIPMENT_SLOT_CHEST
Definition: Player.h:679
@ EQUIPMENT_SLOT_WRISTS
Definition: Player.h:683

References AutoUnequipOffhandIfNeed(), Unit::CanDualWield(), CanTitanGrip(), CLASS_CONTEXT_EQUIP_RELIC, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_PALADIN, CLASS_SHAMAN, CLASS_WARLOCK, EQUIPMENT_SLOT_BACK, EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_CHEST, EQUIPMENT_SLOT_FEET, EQUIPMENT_SLOT_FINGER1, EQUIPMENT_SLOT_FINGER2, EQUIPMENT_SLOT_HANDS, EQUIPMENT_SLOT_HEAD, EQUIPMENT_SLOT_LEGS, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_NECK, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_SHOULDERS, EQUIPMENT_SLOT_TABARD, EQUIPMENT_SLOT_TRINKET1, EQUIPMENT_SLOT_TRINKET2, EQUIPMENT_SLOT_WAIST, EQUIPMENT_SLOT_WRISTS, GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_START, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_BAG, INVTYPE_BODY, INVTYPE_CHEST, INVTYPE_CLOAK, INVTYPE_FEET, INVTYPE_FINGER, INVTYPE_HANDS, INVTYPE_HEAD, INVTYPE_HOLDABLE, INVTYPE_LEGS, INVTYPE_NECK, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_RELIC, INVTYPE_ROBE, INVTYPE_SHIELD, INVTYPE_SHOULDERS, INVTYPE_TABARD, INVTYPE_THROWN, INVTYPE_TRINKET, INVTYPE_WAIST, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, INVTYPE_WRISTS, IsClass(), IsTwoHandUsed(), ITEM_SUBCLASS_ARMOR_IDOL, ITEM_SUBCLASS_ARMOR_LIBRAM, ITEM_SUBCLASS_ARMOR_MISC, ITEM_SUBCLASS_ARMOR_SIGIL, ITEM_SUBCLASS_ARMOR_TOTEM, ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, ITEM_SUBCLASS_WEAPON_STAFF, NULL_SLOT, and ItemTemplate::SubClass.

Referenced by CanEquipItem(), and WorldSession::HandleAutoEquipItemOpcode().

◆ FindQuestSlot()

uint16 Player::FindQuestSlot ( uint32  quest_id) const

◆ GetAchievementMgr()

AchievementMgr * Player::GetAchievementMgr ( ) const
inline
2513{ return m_achievementMgr; }

References m_achievementMgr.

◆ GetActionButton()

ActionButton const * Player::GetActionButton ( uint8  button)
5596{
5597 ActionButtonList::iterator buttonItr = m_actionButtons.find(button);
5598 if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED)
5599 return nullptr;
5600
5601 return &buttonItr->second;
5602}

References ACTIONBUTTON_DELETED, and m_actionButtons.

Referenced by Spell::EffectCastButtons().

◆ GetActiveSpec()

◆ GetActiveSpecMask()

uint8 Player::GetActiveSpecMask ( ) const
inline

◆ GetAmmoDPS()

float Player::GetAmmoDPS ( ) const
inline
1320{ return m_ammoDPS; }

References m_ammoDPS.

Referenced by _ApplyAmmoBonuses(), and CalculateMinMaxDamage().

◆ GetArenaPersonalRating()

uint32 Player::GetArenaPersonalRating ( uint8  slot) const
16153{
16155
16156 sScriptMgr->OnGetArenaPersonalRating(const_cast<Player*>(this), slot, result);
16157
16158 return result;
16159}

References ARENA_TEAM_END, ARENA_TEAM_PERSONAL_RATING, Object::GetUInt32Value(), PLAYER_FIELD_ARENA_TEAM_INFO_1_1, and sScriptMgr.

Referenced by GetMaxPersonalArenaRatingRequirement().

◆ GetArenaPoints()

uint32 Player::GetArenaPoints ( ) const
inline

◆ GetArenaTeamId()

◆ GetArenaTeamIdFromDB()

uint32 Player::GetArenaTeamIdFromDB ( ObjectGuid  guid,
uint8  slot 
)
static
6261{
6263 stmt->SetData(0, guid.GetCounter());
6264 stmt->SetData(1, type);
6265 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6266
6267 if (!result)
6268 return 0;
6269
6270 uint32 id = (*result)[0].Get<uint32>();
6271 return id;
6272}
@ CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID
Definition: CharacterDatabase.h:350

References CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, CharacterDatabase, ObjectGuid::GetCounter(), and PreparedStatementBase::SetData().

Referenced by arena_commandscript::HandleArenaCreateCommand().

◆ GetArenaTeamIdInvited()

◆ GetArmorProficiency()

uint32 Player::GetArmorProficiency ( ) const
inline
1353{ return m_ArmorProficiency; }

References m_ArmorProficiency.

Referenced by Spell::EffectProficiency().

◆ GetAttackBySlot()

◆ GetAurasForTarget()

void Player::GetAurasForTarget ( Unit target,
bool  force = false 
)

Blizz sends certain movement packets sometimes even before CreateObject These movement packets are usually found in SMSG_COMPRESSED_MOVES

12014{
12015 if (!target || (!force && target->GetVisibleAuras()->empty())) // speedup things
12016 return;
12017
12022 target->SendMovementFeatherFall(this);
12023
12025 target->SendMovementWaterWalking(this);
12026
12027 if (target->HasAuraType(SPELL_AURA_HOVER))
12028 target->SendMovementHover(this);
12029
12031 data<< target->GetPackGUID();
12032
12033 Unit::VisibleAuraMap const* visibleAuras = target->GetVisibleAuras();
12034 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
12035 {
12036 AuraApplication* auraApp = itr->second;
12037 auraApp->BuildUpdatePacket(data, false);
12038 }
12039
12040 GetSession()->SendPacket(&data);
12041}
@ SPELL_AURA_FEATHER_FALL
Definition: SpellAuraDefines.h:168
@ SPELL_AURA_WATER_WALK
Definition: SpellAuraDefines.h:167
@ SPELL_AURA_HOVER
Definition: SpellAuraDefines.h:169
@ SMSG_AURA_UPDATE_ALL
Definition: Opcodes.h:1203
void SendMovementHover(Player *sendTo)
Definition: Unit.cpp:20615
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition: Unit.h:652
void SendMovementWaterWalking(Player *sendTo)
Definition: Unit.cpp:20556
VisibleAuraMap const * GetVisibleAuras()
Definition: Unit.h:1494
void SendMovementFeatherFall(Player *sendTo)
Definition: Unit.cpp:20578
Definition: SpellAuras.h:37
void BuildUpdatePacket(ByteBuffer &data, bool remove) const
Definition: SpellAuras.cpp:248

References AuraApplication::BuildUpdatePacket(), Object::GetPackGUID(), GetSession(), Unit::GetVisibleAuras(), Unit::HasAuraType(), Unit::SendMovementFeatherFall(), Unit::SendMovementHover(), Unit::SendMovementWaterWalking(), WorldSession::SendPacket(), SMSG_AURA_UPDATE_ALL, SPELL_AURA_FEATHER_FALL, SPELL_AURA_HOVER, and SPELL_AURA_WATER_WALK.

Referenced by GetInitialVisiblePackets(), and Map::SendInitSelf().

◆ GetAuraUpdateMaskForRaid()

uint64 Player::GetAuraUpdateMaskForRaid ( ) const
inline

◆ GetAverageItemLevel()

float Player::GetAverageItemLevel ( )
15674{
15675 float sum = 0;
15676 uint32 count = 0;
15677 uint8 level = GetLevel();
15678
15680 {
15681 // don't check tabard, ranged, offhand or shirt
15683 continue;
15684
15685 if (m_items[i] && m_items[i]->GetTemplate())
15687
15688 ++count;
15689 }
15690
15691 return std::max<float>(0.0f, sum / (float)count);
15692}
float GetItemLevelIncludingQuality(uint8 pLevel) const
Definition: ItemTemplate.h:759

References EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, ItemTemplate::GetItemLevelIncludingQuality(), Unit::GetLevel(), Item::GetTemplate(), and m_items.

Referenced by spell_gen_vehicle_scaling_aura::CalculateAmount(), gear_commandscript::HandleGearStatsCommand(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetAverageItemLevelForDF()

float Player::GetAverageItemLevelForDF ( )
15695{
15696 float sum = 0;
15697 uint32 count = 0;
15698 uint8 level = GetLevel();
15699
15700 for (int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
15701 {
15702 // don't check tabard, ranged, offhand or shirt
15704 continue;
15705
15706 if (m_items[i] && m_items[i]->GetTemplate())
15707 {
15708 if (m_items[i]->GetTemplate()->Quality == ITEM_QUALITY_HEIRLOOM)
15709 sum += level * 2.33f;
15710 else
15711 sum += m_items[i]->GetTemplate()->ItemLevel;
15712 }
15713
15714 ++count;
15715 }
15716
15717 return std::max(0.0f, sum / (float)count);
15718}

References EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, Unit::GetLevel(), Item::GetTemplate(), ITEM_QUALITY_HEIRLOOM, ItemTemplate::ItemLevel, and m_items.

Referenced by lfg::LFGMgr::InitializeLockedDungeons(), and Satisfy().

◆ GetBagByPos()

◆ GetBankBagSlotCount()

uint8 Player::GetBankBagSlotCount ( ) const
inline

◆ GetBarberShopCost()

uint32 Player::GetBarberShopCost ( uint8  newhairstyle,
uint8  newhaircolor,
uint8  newfacialhair,
BarberShopStyleEntry const *  newSkin = nullptr 
)
13198{
13199 uint8 level = GetLevel();
13200
13201 if (level > GT_MAX_LEVEL)
13202 level = GT_MAX_LEVEL; // max level in this dbc
13203
13204 uint8 hairstyle = GetByteValue(PLAYER_BYTES, 2);
13205 uint8 haircolor = GetByteValue(PLAYER_BYTES, 3);
13206 uint8 facialhair = GetByteValue(PLAYER_BYTES_2, 0);
13207 uint8 skincolor = GetByteValue(PLAYER_BYTES, 0);
13208
13209 if ((hairstyle == newhairstyle) && (haircolor == newhaircolor) && (facialhair == newfacialhair) && (!newSkin || (newSkin->hair_id == skincolor)))
13210 return 0;
13211
13212 GtBarberShopCostBaseEntry const* bsc = sGtBarberShopCostBaseStore.LookupEntry(level - 1);
13213
13214 if (!bsc) // shouldn't happen
13215 return 0xFFFFFFFF;
13216
13217 float cost = 0;
13218
13219 if (hairstyle != newhairstyle)
13220 cost += bsc->cost; // full price
13221
13222 if ((haircolor != newhaircolor) && (hairstyle == newhairstyle))
13223 cost += bsc->cost * 0.5f; // +1/2 of price
13224
13225 if (facialhair != newfacialhair)
13226 cost += bsc->cost * 0.75f; // +3/4 of price
13227
13228 if (newSkin && skincolor != newSkin->hair_id)
13229 cost += bsc->cost * 0.75f; // +5/6 of price
13230
13231 return uint32(cost);
13232}
DBCStorage< GtBarberShopCostBaseEntry > sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt)
#define GT_MAX_LEVEL
Definition: DBCStructure.h:1036
Definition: DBCStructure.h:1042
float cost
Definition: DBCStructure.h:1043

References GtBarberShopCostBaseEntry::cost, Object::GetByteValue(), Unit::GetLevel(), GT_MAX_LEVEL, BarberShopStyleEntry::hair_id, PLAYER_BYTES, PLAYER_BYTES_2, and sGtBarberShopCostBaseStore.

Referenced by WorldSession::HandleAlterAppearance().

◆ GetBaseDefenseSkillValue()

uint32 Player::GetBaseDefenseSkillValue ( ) const
inline
@ SKILL_DEFENSE
Definition: SharedDefines.h:2881
uint16 GetBaseSkillValue(uint32 skill) const
Definition: Player.cpp:5445

References GetBaseSkillValue(), and SKILL_DEFENSE.

Referenced by UpdateCombatSkills().

◆ GetBaseModValue()

float Player::GetBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType 
) const
5003{
5004 if (modGroup >= BASEMOD_END)
5005 {
5006 LOG_ERROR("entities.player", "trial to access non existed BaseModGroup!");
5007 return 0.0f;
5008 }
5009
5010 if (modType == PCT_MOD && m_auraBaseMod[modGroup][PCT_MOD] <= 0.0f)
5011 return 0.0f;
5012
5013 return m_auraBaseMod[modGroup][modType];
5014}

References BASEMOD_END, LOG_ERROR, m_auraBaseMod, and PCT_MOD.

◆ GetBaseRune()

RuneType Player::GetBaseRune ( uint8  index) const
inline
2483{ return RuneType(m_runes->runes[index].BaseRune); }
RuneType
Definition: Player.h:408
uint8 BaseRune
Definition: Player.h:418
RuneInfo runes[MAX_RUNES]
Definition: Player.h:427

References RuneInfo::BaseRune, m_runes, and Runes::runes.

Referenced by Spell::EffectActivateRune(), GetRuneBaseCooldown(), IsBaseRuneSlotsOnCooldown(), RemoveRunesByAuraEffect(), RestoreBaseRune(), Spell::TakeRunePower(), and UpdateRuneRegen().

◆ GetBaseSkillValue()

uint16 Player::GetBaseSkillValue ( uint32  skill) const
5446{
5447 if (!skill)
5448 return 0;
5449
5450 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5451 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5452 return 0;
5453
5454 int32 result = int32(SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5455 result += SKILL_PERM_BONUS(GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos)));
5456 return result < 0 ? 0 : result;
5457}
#define SKILL_PERM_BONUS(x)
Definition: Player.h:87

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_PERM_BONUS, and SKILL_VALUE.

Referenced by npc_engineering_tele_trinket::CanLearn(), GetBaseDefenseSkillValue(), GetBaseWeaponSkillValue(), GetTrainerSpellState(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), and SatisfyQuestSkill().

◆ GetBaseSpellPowerBonus()

uint32 Player::GetBaseSpellPowerBonus ( )
inline

◆ GetBaseWeaponSkillValue()

uint32 Player::GetBaseWeaponSkillValue ( WeaponAttackType  attType) const
12761{
12762 Item* item = GetWeaponForAttack(attType, true);
12763
12764 // unarmed only with base attack
12765 if (attType != BASE_ATTACK && !item)
12766 return 0;
12767
12768 // weapon skill or (unarmed for base attack)
12769 uint32 skill = item ? item->GetSkill() : uint32(SKILL_UNARMED);
12770 return GetBaseSkillValue(skill);
12771}
@ SKILL_UNARMED
Definition: SharedDefines.h:2907

References BASE_ATTACK, GetBaseSkillValue(), Item::GetSkill(), GetWeaponForAttack(), and SKILL_UNARMED.

Referenced by UpdateCombatSkills().

◆ GetBattleground()

Battleground * Player::GetBattleground ( bool  create = false) const
12150{
12151 if (GetBattlegroundId() == 0)
12152 return nullptr;
12153
12155 return (create || (bg && bg->FindBgMap()) ? bg : nullptr);
12156}
#define sBattlegroundMgr
Definition: BattlegroundMgr.h:188
BattlegroundMap * FindBgMap() const
Definition: Battleground.h:433
BattlegroundTypeId GetBattlegroundTypeId() const
Definition: Player.h:2232
uint32 GetBattlegroundId() const
Definition: Player.h:2231

References Battleground::FindBgMap(), GetBattlegroundId(), GetBattlegroundTypeId(), and sBattlegroundMgr.

Referenced by GameObject::ActivateToQuest(), CanEquipItem(), Group::CanJoinBattlegroundQueue(), CanUnequipItem(), Spell::CheckCast(), MapInstanced::CreateInstanceForPlayer(), Object::DestroyForPlayer(), Spell::EffectOpenLock(), WorldSession::HandleAreaSpiritHealerQueryOpcode(), WorldSession::HandleAreaSpiritHealerQueueOpcode(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModEffectImmunity(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlegroundPlayerPositionsOpcode(), spell_item_rocket_boots::HandleDummy(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePVPLogDataOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), spell_ioc_gunship_portal::HandleScript2(), InArena(), SpellArea::IsFitToRequirements(), Unit::Kill(), LeaveBattleground(), AchievementCriteriaData::Meets(), Unit::Mount(), achievement_resilient_victory::OnCheck(), achievement_bg_control_all_nodes::OnCheck(), achievement_bg_ic_resource_glut::OnCheck(), achievement_arena_by_type::OnCheck(), achievement_everything_counts::OnCheck(), achievement_bg_av_perfection::OnCheck(), achievement_sa_defense_of_the_ancients::OnCheck(), achievement_not_even_a_scratch::OnCheck(), achievement_save_the_day::OnCheck(), go_arena_ready_marker::OnGossipHello(), RepopAtGraveyard(), ReportedAfkBy(), ResurrectPlayer(), RewardHonor(), SendInitWorldStates(), SendLoot(), SummonIfPossible(), AchievementMgr::UpdateAchievementCriteria(), and GameObject::Use().

◆ GetBattlegroundId()

◆ GetBattlegroundQueueIndex()

◆ GetBattlegroundQueueTypeId()

BattlegroundQueueTypeId Player::GetBattlegroundQueueTypeId ( uint32  index) const

◆ GetBattlegroundTypeId()

BattlegroundTypeId Player::GetBattlegroundTypeId ( ) const
inline
2232{ return m_bgData.bgTypeID; }
BattlegroundTypeId bgTypeID
Definition: Player.h:1036

References BGData::bgTypeID, and m_bgData.

Referenced by GetBattleground(), and ArenaSpectator::HandleSpectatorSpectateCommand().

◆ GetBGAccessByLevel()

bool Player::GetBGAccessByLevel ( BattlegroundTypeId  bgTypeId) const
12272{
12273 // get a template bg instead of running one
12274 Battleground* bgt = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);
12275 if (!bgt)
12276 return false;
12277
12278 // limit check leel to dbc compatible level range
12279 uint32 level = GetLevel();
12280 if (level > DEFAULT_MAX_LEVEL)
12281 level = DEFAULT_MAX_LEVEL;
12282
12283 if (level < bgt->GetMinLevel() || level > bgt->GetMaxLevel())
12284 return false;
12285
12286 return true;
12287}
uint32 GetMaxLevel() const
Definition: Battleground.h:334

References DEFAULT_MAX_LEVEL, Unit::GetLevel(), Battleground::GetMaxLevel(), and sBattlegroundMgr.

Referenced by Group::CanJoinBattlegroundQueue(), WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleBattlemasterJoinOpcode(), and Creature::isCanInteractWithBattleMaster().

◆ GetBGData()

BGData & Player::GetBGData ( )
inline
2236{ return m_bgData; }

References m_bgData.

◆ GetBgTeamId()

◆ GetChampioningFaction()

uint32 Player::GetChampioningFaction ( ) const
inline
2527{ return m_ChampioningFaction; }

References m_ChampioningFaction.

Referenced by RewardReputation().

◆ GetChatTag()

uint8 Player::GetChatTag ( ) const
1304{
1305 uint8 tag = CHAT_TAG_NONE;
1306
1307 if (isGMChat())
1308 tag |= CHAT_TAG_GM;
1309 if (isDND())
1310 tag |= CHAT_TAG_DND;
1311 if (isAFK())
1312 tag |= CHAT_TAG_AFK;
1313 if (IsCommentator())
1314 tag |= CHAT_TAG_COM;
1315 if (IsDeveloper())
1316 tag |= CHAT_TAG_DEV;
1317
1318 return tag;
1319}
@ CHAT_TAG_COM
Definition: Player.h:849
@ CHAT_TAG_DND
Definition: Player.h:847
@ CHAT_TAG_DEV
Definition: Player.h:850
@ CHAT_TAG_AFK
Definition: Player.h:846
@ CHAT_TAG_GM
Definition: Player.h:848
@ CHAT_TAG_NONE
Definition: Player.h:845
bool IsCommentator() const
Definition: Player.h:1152
bool isGMChat() const
Definition: Player.h:1160
bool isDND() const
Definition: Player.h:1135
bool IsDeveloper() const
Definition: Player.h:1154
bool isAFK() const
Definition: Player.h:1134

References CHAT_TAG_AFK, CHAT_TAG_COM, CHAT_TAG_DEV, CHAT_TAG_DND, CHAT_TAG_GM, CHAT_TAG_NONE, isAFK(), IsCommentator(), IsDeveloper(), isDND(), and isGMChat().

◆ getCinematic()

uint8 Player::getCinematic ( ) const
inline
1809 {
1810 return m_cinematic;
1811 }

References m_cinematic.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ GetCinematicMgr()

CinematicMgr * Player::GetCinematicMgr ( ) const
inline

◆ GetCommandStatus()

◆ GetCorpse()

◆ GetCorpseLocation()

◆ GetCorpseReclaimDelay()

uint32 Player::GetCorpseReclaimDelay ( bool  pvp) const
12868{
12869 if (pvp)
12870 {
12871 if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP))
12872 return copseReclaimDelay[0];
12873 }
12874 else if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE))
12875 return 0;
12876
12877 time_t now = GameTime::GetGameTime().count();
12878 // 0..2 full period
12879 // should be std::ceil(x)-1 but not floor(x)
12880 uint64 count = (now < m_deathExpireTime - 1) ? (m_deathExpireTime - 1 - now) / DEATH_EXPIRE_STEP : 0;
12881 return copseReclaimDelay[count];
12882}

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, copseReclaimDelay, DEATH_EXPIRE_STEP, GameTime::GetGameTime(), m_deathExpireTime, and sWorld.

Referenced by CalculateCorpseReclaimDelay(), and WorldSession::HandleReclaimCorpseOpcode().

◆ GetCreationTime()

Seconds Player::GetCreationTime ( ) const
inline
2516{ return m_creationTime; }

References m_creationTime.

◆ GetCurrentBattlegroundQueueSlot()

uint32 Player::GetCurrentBattlegroundQueueSlot ( ) const
inline

◆ GetCurrentRune()

RuneType Player::GetCurrentRune ( uint8  index) const
inline

◆ GetDeathTimer()

uint32 Player::GetDeathTimer ( ) const
inline
2153{ return m_deathTimer; }

References m_deathTimer.

Referenced by WorldSession::LogoutPlayer().

◆ GetDebugInfo()

std::string Player::GetDebugInfo ( ) const
overridevirtual

Reimplemented from WorldObject.

16302{
16303 std::stringstream sstr;
16304 sstr << Unit::GetDebugInfo();
16305 return sstr.str();
16306}
std::string GetDebugInfo() const override
Definition: Unit.cpp:21228

References Unit::GetDebugInfo().

◆ GetDeclinedNames()

DeclinedName const * Player::GetDeclinedNames ( ) const
inline
2481{ return m_declinedname; }

References m_declinedname.

◆ GetDefaultGossipMenuForSource()

uint32 Player::GetDefaultGossipMenuForSource ( WorldObject source)
static
423{
424 switch (source->GetTypeId())
425 {
426 case TYPEID_UNIT:
427 return source->ToCreature()->GetCreatureTemplate()->GossipMenuId;
429 return source->ToGameObject()->GetGOInfo()->GetGossipMenuId();
430 default:
431 break;
432 }
433
434 return 0;
435}
uint32 GossipMenuId
Definition: CreatureData.h:197
GameObjectTemplate const * GetGOInfo() const
Definition: GameObject.h:137
uint32 GetGossipMenuId() const
Definition: GameObjectData.h:553

References Creature::GetCreatureTemplate(), GameObject::GetGOInfo(), GameObjectTemplate::GetGossipMenuId(), Object::GetTypeId(), CreatureTemplate::GossipMenuId, Object::ToCreature(), Object::ToGameObject(), TYPEID_GAMEOBJECT, and TYPEID_UNIT.

Referenced by GetGossipTextId(), and PrepareGossipMenu().

◆ GetDelayedOperations()

uint32 Player::GetDelayedOperations ( ) const
inline

◆ GetDifficulty()

◆ GetDivider()

◆ GetDodgeFromAgility()

void Player::GetDodgeFromAgility ( float &  diminishing,
float &  nondiminishing 
)
Todo:
: research if talents/effects that increase total agility by x% should increase non-diminishing part
5057{
5058 // Table for base dodge values
5059 const float dodge_base[MAX_CLASSES] =
5060 {
5061 0.036640f, // Warrior
5062 0.034943f, // Paladi
5063 -0.040873f, // Hunter
5064 0.020957f, // Rogue
5065 0.034178f, // Priest
5066 0.036640f, // DK
5067 0.021080f, // Shaman
5068 0.036587f, // Mage
5069 0.024211f, // Warlock
5070 0.0f, // ??
5071 0.056097f // Druid
5072 };
5073 // Crit/agility to dodge/agility coefficient multipliers; 3.2.0 increased required agility by 15%
5074 const float crit_to_dodge[MAX_CLASSES] =
5075 {
5076 0.85f / 1.15f, // Warrior
5077 1.00f / 1.15f, // Paladin
5078 1.11f / 1.15f, // Hunter
5079 2.00f / 1.15f, // Rogue
5080 1.00f / 1.15f, // Priest
5081 0.85f / 1.15f, // DK
5082 1.60f / 1.15f, // Shaman
5083 1.00f / 1.15f, // Mage
5084 0.97f / 1.15f, // Warlock (?)
5085 0.0f, // ??
5086 2.00f / 1.15f // Druid
5087 };
5088
5089 uint8 level = GetLevel();
5090 uint32 pclass = getClass();
5091
5092 if (level > GT_MAX_LEVEL)
5093 level = GT_MAX_LEVEL;
5094
5095 // Dodge per agility is proportional to crit per agility, which is available from DBC files
5096 GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5097 if (!dodgeRatio || pclass > MAX_CLASSES)
5098 return;
5099
5102 float bonus_agility = GetStat(STAT_AGILITY) - base_agility;
5103
5104 // calculate diminishing (green in char screen) and non-diminishing (white) contribution
5105 diminishing = 100.0f * bonus_agility * dodgeRatio->ratio * crit_to_dodge[pclass - 1];
5106 nondiminishing = 100.0f * (dodge_base[pclass - 1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass - 1]);
5107}
DBCStorage< GtChanceToMeleeCritEntry > sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt)
@ UNIT_MOD_STAT_START
Definition: Unit.h:170
#define MAX_CLASSES
Definition: SharedDefines.h:155
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition: Unit.h:1858
float GetCreateStat(Stats stat) const
Definition: Unit.h:1388
Definition: DBCStructure.h:1057
float ratio
Definition: DBCStructure.h:1058

References BASE_PCT, Unit::getClass(), Unit::GetCreateStat(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, Unit::m_auraModifiersGroup, MAX_CLASSES, GtChanceToMeleeCritEntry::ratio, sGtChanceToMeleeCritStore, STAT_AGILITY, and UNIT_MOD_STAT_START.

Referenced by UpdateDodgePercentage().

◆ GetDrunkenstateByValue()

DrunkenState Player::GetDrunkenstateByValue ( uint8  value)
static
961{
962 if (value >= 90)
963 return DRUNKEN_SMASHED;
964 if (value >= 50)
965 return DRUNKEN_DRUNK;
966 if (value)
967 return DRUNKEN_TIPSY;
968 return DRUNKEN_SOBER;
969}
@ DRUNKEN_TIPSY
Definition: Player.h:465
@ DRUNKEN_DRUNK
Definition: Player.h:466
@ DRUNKEN_SOBER
Definition: Player.h:464
@ DRUNKEN_SMASHED
Definition: Player.h:467

References DRUNKEN_DRUNK, DRUNKEN_SMASHED, DRUNKEN_SOBER, and DRUNKEN_TIPSY.

Referenced by Condition::Meets(), AchievementCriteriaData::Meets(), and SetDrunkValue().

◆ GetDrunkValue()

◆ GetDungeonDifficulty()

◆ GetEntryPoint()

WorldLocation const & Player::GetEntryPoint ( ) const
inline

◆ GetExpertiseDodgeOrParryReduction()

float Player::GetExpertiseDodgeOrParryReduction ( WeaponAttackType  attType) const
5148{
5149 switch (attType)
5150 {
5151 case BASE_ATTACK:
5152 return GetUInt32Value(PLAYER_EXPERTISE) / 4.0f;
5153 case OFF_ATTACK:
5155 default:
5156 break;
5157 }
5158 return 0.0f;
5159}
@ PLAYER_EXPERTISE
Definition: UpdateFields.h:349
@ PLAYER_OFFHAND_EXPERTISE
Definition: UpdateFields.h:350

References BASE_ATTACK, Object::GetUInt32Value(), OFF_ATTACK, PLAYER_EXPERTISE, and PLAYER_OFFHAND_EXPERTISE.

◆ GetFakeDrunkValue()

int32 Player::GetFakeDrunkValue ( ) const
inline
@ PLAYER_FAKE_INEBRIATION
Definition: UpdateFields.h:325
int32 GetInt32Value(uint16 index) const
Definition: Object.cpp:299

References Object::GetInt32Value(), and PLAYER_FAKE_INEBRIATION.

Referenced by UpdateInvisibilityDrunkDetect().

◆ GetFarSightDistance()

Optional< float > Player::GetFarSightDistance ( ) const
16231{
16232 return _farSightDistance;
16233}
Optional< float > _farSightDistance
Definition: Player.h:2966

References _farSightDistance.

◆ GetFreeInventorySpace()

uint32 Player::GetFreeInventorySpace ( ) const
490{
491 uint32 freeSpace = 0;
492
493 // Check backpack
494 for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; ++slot)
495 {
497 if (!item)
498 freeSpace += 1;
499 }
500
501 // Check bags
503 {
504 if (Bag* bag = GetBagByPos(i))
505 freeSpace += bag->GetFreeSlots();
506 }
507
508 return freeSpace;
509}

References GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::CheckItems().

◆ GetFreePrimaryProfessionPoints()

uint32 Player::GetFreePrimaryProfessionPoints ( ) const
inline

◆ GetFreeTalentPoints()

uint32 Player::GetFreeTalentPoints ( ) const
inline
@ PLAYER_CHARACTER_POINTS1
Definition: UpdateFields.h:342

References Object::GetUInt32Value(), and PLAYER_CHARACTER_POINTS1.

Referenced by BuildPlayerTalentsInfoData(), and LearnTalent().

◆ GetGameObjectIfCanInteractWith()

GameObject * Player::GetGameObjectIfCanInteractWith ( ObjectGuid  guid,
GameobjectTypes  type 
) const
2133{
2134 if (GameObject* go = GetMap()->GetGameObject(guid))
2135 {
2136 if (go->GetGoType() == type)
2137 {
2138 // Players cannot interact with gameobjects that use the "Point" icon
2139 if (go->GetGOInfo()->IconName == "Point")
2140 {
2141 return nullptr;
2142 }
2143
2144 if (go->IsWithinDistInMap(this))
2145 {
2146 return go;
2147 }
2148
2149 LOG_DEBUG("maps", "IsGameObjectOfTypeInRange: GameObject '{}' [{}] is too far away from player {} [{}] to be used by him (distance={}, maximal 10 is allowed)",
2150 go->GetGOInfo()->name, go->GetGUID().ToString(), GetName(), GetGUID().ToString(), go->GetDistance(this));
2151 }
2152 }
2153 return nullptr;
2154}
GameObject * GetGameObject(uint32 spellId) const
Definition: Unit.cpp:6123

References Unit::GetGameObject(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetName(), LOG_DEBUG, and Position::ToString().

Referenced by CanInteractWithQuestGiver(), WorldSession::CanOpenMailBox(), and WorldSession::HandleGuildBankerActivate().

◆ GetGlobalCooldownMgr()

GlobalCooldownMgr & Player::GetGlobalCooldownMgr ( )
inline
1782{ return m_GlobalCooldownMgr; }
GlobalCooldownMgr m_GlobalCooldownMgr
Definition: Player.h:2778

References m_GlobalCooldownMgr.

Referenced by Spell::CancelGlobalCooldown(), EquipItem(), Spell::HasGlobalCooldown(), and Spell::TriggerGlobalCooldown().

◆ GetGlyph()

◆ GetGlyphSlot()

uint32 Player::GetGlyphSlot ( uint8  slot) const
inline
@ PLAYER_FIELD_GLYPH_SLOTS_1
Definition: UpdateFields.h:388

References Object::GetUInt32Value(), and PLAYER_FIELD_GLYPH_SLOTS_1.

Referenced by _LoadGlyphAuras(), and Spell::EffectApplyGlyph().

◆ GetGossipTextId() [1/2]

uint32 Player::GetGossipTextId ( uint32  menuId,
WorldObject source 
)
405{
407
408 if (!menuId)
409 return textId;
410
411 GossipMenusMapBounds menuBounds = sObjectMgr->GetGossipMenusMapBounds(menuId);
412
413 for (GossipMenusContainer::const_iterator itr = menuBounds.first; itr != menuBounds.second; ++itr)
414 {
415 if (sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
416 textId = itr->second.TextID;
417 }
418
419 return textId;
420}
std::pair< GossipMenusContainer::const_iterator, GossipMenusContainer::const_iterator > GossipMenusMapBounds
Definition: ObjectMgr.h:631
#define DEFAULT_GOSSIP_MESSAGE
Definition: GossipDef.h:30

References DEFAULT_GOSSIP_MESSAGE, sConditionMgr, and sObjectMgr.

Referenced by GetGossipTextId(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), boss_gloomrel::OnGossipHello(), npc_death_knight_initiate::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_zulaman_hostage::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_high_overlord_saurfang_icc::OnGossipHello(), npc_muradin_bronzebeard_icc::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_adventurous_dwarf::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_drake_dealer_hurlunk::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_zephyr::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_engineering_tele_trinket::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), npc_sayge::OnGossipHello(), npc_wormhole::OnGossipHello(), npc_locksmith::OnGossipHello(), npc_experience::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), icecrown_citadel_teleport::OnGossipHello(), npc_prof_blacksmith::SendActionMenu(), npc_prof_alchemy::SendConfirmLearn(), npc_prof_blacksmith::SendConfirmLearn(), npc_prof_tailor::SendConfirmLearn(), go_evil_book_for_dummies::SendConfirmLearn(), npc_prof_alchemy::SendConfirmUnlearn(), npc_prof_blacksmith::SendConfirmUnlearn(), npc_prof_tailor::SendConfirmUnlearn(), go_evil_book_for_dummies::SendConfirmUnlearn(), SendPreparedGossip(), SendPreparedQuest(), npc_echo_of_medivh::sGossipHello(), and npc_chesspiece::sGossipHello().

◆ GetGossipTextId() [2/2]

uint32 Player::GetGossipTextId ( WorldObject source)
397{
398 if (!source)
400
401 return GetGossipTextId(GetDefaultGossipMenuForSource(source), source);
402}
static uint32 GetDefaultGossipMenuForSource(WorldObject *source)
Definition: PlayerGossip.cpp:422
uint32 GetGossipTextId(uint32 menuId, WorldObject *source)
Definition: PlayerGossip.cpp:404

References DEFAULT_GOSSIP_MESSAGE, GetDefaultGossipMenuForSource(), and GetGossipTextId().

◆ GetGracePeriod()

uint32 Player::GetGracePeriod ( uint8  index) const
inline
2486{ return m_runes->runes[index].GracePeriod; }
uint32 GracePeriod
Definition: Player.h:421

References RuneInfo::GracePeriod, m_runes, and Runes::runes.

Referenced by GetRuneBaseCooldown(), and RegenerateAll().

◆ GetGrantableLevels()

uint8 Player::GetGrantableLevels ( )
inline

◆ GetGroup() [1/2]

Group * Player::GetGroup ( )
inline
2445{ return m_group.getTarget(); }
TO * getTarget() const
Definition: Reference.h:95
GroupReference m_group
Definition: Player.h:2858

References Reference< TO, FROM >::getTarget(), and m_group.

Referenced by _LoadGroup(), Group::AddInvite(), Loot::AddItem(), Group::AddMember(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), Battleground::AddOrSetPlayerToCorrectBgGroup(), Arena::AddPlayer(), InstanceMap::AddPlayerToMap(), LootItem::AllowedForPlayer(), Group::BroadcastPacket(), npc_coren_direbrew::CanBeSeen(), go_loosely_turned_soil::go_loosely_turned_soilAI::CanBeSeen(), InstanceMap::CannotEnter(), CanRollForItemInLFG(), CanUninviteFromGroup(), Spell::CheckCast(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), CheckInstanceLoginValid(), MapInstanced::CreateInstanceForPlayer(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), ArenaTeam::DelMember(), Group::Disband(), WorldSession::DoLootRelease(), DoRandomRoll(), SmartAI::EndPath(), Loot::FillLoot(), GetNextRandomRaidMember(), Unit::GetNextRandomRaidMemberOrPet(), Unit::GetPartyMembers(), ChatHandler::GetPlayerGroupAndGUIDByName(), GetsRecruitAFriendBonus(), GroupEventHappens(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), Unit::HandleAuraRaidProcFromChargeWithValue(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), Unit::HandleDummyAuraProc(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupAssistantLeaderOpcode(), WorldSession::HandleGroupChangeSubGroupOpcode(), WorldSession::HandleGroupDisbandOpcode(), WorldSession::HandleGroupInviteOpcode(), group_commandscript::HandleGroupJoinCommand(), WorldSession::HandleGroupRaidConvertOpcode(), WorldSession::HandleGroupSetLeaderOpcode(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleGroupSwapSubGroupOpcode(), WorldSession::HandleGroupUninviteGuidOpcode(), WorldSession::HandleGroupUninviteOpcode(), WorldSession::HandleInstanceLockResponse(), OutdoorPvP::HandleKill(), OutdoorPvPNA::HandleKill(), WorldSession::HandleLfgLeaveOpcode(), WorldSession::HandleLfgPartyLockInfoRequestOpcode(), WorldSession::HandleLfgSetRolesOpcode(), WorldSession::HandleLootMasterGiveOpcode(), WorldSession::HandleLootMethodOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleLootRoll(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMinimapPingOpcode(), WorldSession::HandlePartyAssignmentOpcode(), WorldSession::HandlePetRename(), Battlefield::HandlePlayerLeaveZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleRaidReadyCheckFinishedOpcode(), WorldSession::HandleRaidReadyCheckOpcode(), WorldSession::HandleRaidTargetUpdateOpcode(), WorldSession::HandleResetInstancesOpcode(), WorldSession::HandleSetDungeonDifficultyOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), misc_commandscript::HandleSummonCommand(), tele_commandscript::HandleTeleGroupCommand(), HasQuestForGO(), HasQuestForItem(), isAllowedToLoot(), SmartAI::IsEscortInvokerInRange(), Unit::IsInPartyWith(), IsInSameGroupWith(), IsInSameRaidWith(), GameObject::IsLootAllowedFor(), Creature::isTappedBy(), Channel::JoinChannel(), lfg::LFGMgr::JoinLfg(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), npc_coren_direbrew::JustDied(), boss_headless_horseman::JustDied(), boss_ahune::JustDied(), Unit::Kill(), KilledMonsterCredit(), KilledPlayerCredit(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), lfg::LFGMgr::MakeNewGroup(), lfg::LFGPlayerScript::OnBindToInstance(), npc_icc_buff_switcher::OnGossipSelect(), lfg::LFGPlayerScript::OnLevelChanged(), lfg::LFGPlayerScript::OnLogin(), lfg::LFGPlayerScript::OnLogout(), lfg::LFGPlayerScript::OnMapChanged(), Acore::MostHPMissingGroupInRange::operator()(), InstanceMap::PermBindAllPlayers(), MapMgr::PlayerCannotEnter(), InstanceSaveMgr::PlayerGetDestinationInstanceId(), ProcessDelayedOperations(), RemoveFromGroup(), RemovePet(), RewardPlayerAndGroupAtEvent(), Group::SameSubGroup(), Satisfy(), SendInitialPacketsAfterAddToMap(), SendLoot(), SendNewItem(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), SendUpdateToOutOfRangeGroupMembers(), Group::SendUpdateToPlayer(), SetBattlegroundOrBattlefieldRaid(), Unit::SetHealth(), Creature::SetLootRecipient(), Unit::SetMaxHealth(), Unit::SetMaxPower(), Unit::SetPower(), Unit::setPowerType(), StoreLootItem(), lfg::LFGMgr::TeleportPlayer(), PetAI::UpdateAllies(), Unit::UpdateAuraForGroup(), UpdatePosition(), lfg::LFGMgr::UpdateRaidBrowser(), UpdateZone(), and GameObject::Use().

◆ GetGroup() [2/2]

const Group * Player::GetGroup ( ) const
inline
2446{ return (const Group*)m_group.getTarget(); }

References Reference< TO, FROM >::getTarget(), and m_group.

◆ GetGroupInvite()

◆ GetGroupRef()

GroupReference & Player::GetGroupRef ( )
inline
2447{ return m_group; }

References m_group.

◆ GetGroupUpdateFlag()

uint32 Player::GetGroupUpdateFlag ( ) const
inline

◆ GetGuild()

Guild * Player::GetGuild ( ) const
15956{
15957 uint32 guildId = GetGuildId();
15958 return guildId ? sGuildMgr->GetGuildById(guildId) : nullptr;
15959}

References GetGuildId(), and sGuildMgr.

Referenced by GiveLevel(), WorldSession::HandleGuildBankerActivate(), WorldSession::HandleGuildBankSwapItems(), WorldSession::HandleGuildRankOpcode(), Guild::HandleInviteMember(), and UpdateZone().

◆ GetGuildId()

◆ GetGuildIdInvited()

◆ GetGuildName()

std::string const & Player::GetGuildName ( )
15295{
15296 return sGuildMgr->GetGuildById(GetGuildId())->GetName();
15297}

References GetGuildId(), and sGuildMgr.

◆ GetHealthBonusFromStamina()

float Player::GetHealthBonusFromStamina ( )
277{
278 float stamina = GetStat(STAT_STAMINA);
279
280 float baseStam = stamina < 20 ? stamina : 20;
281 float moreStam = stamina - baseStam;
282
283 return baseStam + (moreStam * 10.0f);
284}

References Unit::GetStat(), and STAT_STAMINA.

Referenced by UpdateMaxHealth().

◆ GetHonorPoints()

◆ GetInGameTime()

uint32 Player::GetInGameTime ( )
inline
1541{ return m_ingametime; }

References m_ingametime.

◆ GetInitialVisiblePackets()

void Player::GetInitialVisiblePackets ( Unit target)
1657{
1658 GetAurasForTarget(target);
1659 if (target->IsAlive())
1660 {
1662 target->GetVictim())
1663 target->SendMeleeAttackStart(target->GetVictim(), this);
1664 }
1665}
@ UNIT_STATE_MELEE_ATTACKING
Definition: UnitDefines.h:150
void GetAurasForTarget(Unit *target, bool force=false)
Definition: Player.cpp:12013
Unit * GetVictim() const
Definition: Unit.h:727
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition: Unit.cpp:3028

References GetAurasForTarget(), Unit::GetVictim(), Unit::HasUnitState(), Unit::IsAlive(), Unit::SendMeleeAttackStart(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by Acore::VisibleNotifier::SendToSelf(), and UpdateVisibilityOf().

◆ GetInnTriggerId()

uint32 Player::GetInnTriggerId ( ) const
inline
1200{ return _innTriggerId; }

References _innTriggerId.

Referenced by Update().

◆ GetItemByEntry()

Item * Player::GetItemByEntry ( uint32  entry) const
3385{
3386 // in inventory
3388 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3389 if (pItem->GetEntry() == entry)
3390 return pItem;
3391
3393 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3394 if (pItem->GetEntry() == entry)
3395 return pItem;
3396
3397 for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i)
3398 if (Bag* pBag = GetBagByPos(i))
3399 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
3400 if (Item* pItem = pBag->GetItemByPos(j))
3401 if (pItem->GetEntry() == entry)
3402 return pItem;
3403
3404 for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; ++i)
3405 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3406 if (pItem->GetEntry() == entry)
3407 return pItem;
3408
3409 return nullptr;
3410}

References CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and KEYRING_SLOT_START.

Referenced by Spell::CheckItems(), Spell::EffectRechargeManaGem(), and Spell::EffectStuck().

◆ GetItemByGuid()

Item * Player::GetItemByGuid ( ObjectGuid  guid) const
431{
433 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
434 if (pItem->GetGUID() == guid)
435 return pItem;
436
438 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
439 if (pItem->GetGUID() == guid)
440 return pItem;
441
442 for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
443 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
444 if (pItem->GetGUID() == guid)
445 return pItem;
446
448 if (Bag* pBag = GetBagByPos(i))
449 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
450 if (Item* pItem = pBag->GetItemByPos(j))
451 if (pItem->GetGUID() == guid)
452 return pItem;
453
455 if (Bag* pBag = GetBagByPos(i))
456 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
457 if (Item* pItem = pBag->GetItemByPos(j))
458 if (pItem->GetGUID() == guid)
459 return pItem;
460
461 return nullptr;
462}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and KEYRING_SLOT_START.

Referenced by _SaveInventory(), Spell::CheckCast(), WorldSession::DoLootRelease(), TradeData::GetItem(), TradeData::GetSpellCastItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleAutoEquipItemSlotOpcode(), WorldSession::HandleAutostoreLootItemOpcode(), debug_commandscript::HandleDebugGetItemValueCommand(), debug_commandscript::HandleDebugItemExpireCommand(), debug_commandscript::HandleDebugSetItemValueCommand(), Unit::HandleDummyAuraProc(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleItemRefund(), WorldSession::HandleItemRefundInfoRequest(), WorldSession::HandleItemTextQuery(), WorldSession::HandleLootMoneyOpcode(), Unit::HandleOverrideClassScriptAuraProc(), WorldSession::HandlePetitionRenameOpcode(), Unit::HandleProcTriggerSpell(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), WorldSession::HandleSocketOpcode(), WorldSession::HandleTurnInPetitionOpcode(), SendLoot(), SpellCastTargets::Update(), and Spell::UpdatePointers().

◆ GetItemByPos() [1/2]

Item * Player::GetItemByPos ( uint16  pos) const
465{
466 uint8 bag = pos >> 8;
467 uint8 slot = pos & 255;
468 return GetItemByPos(bag, slot);
469}

References GetItemByPos().

Referenced by _SaveCharacter(), _SaveInventory(), _StoreItem(), AutoUnequipOffhandIfNeed(), BuildEnchantmentsInfoData(), CanEquipItem(), CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanStoreItems(), CanUnequipItem(), CanUnequipItems(), CastItemCombatSpell(), CorrectMetaGemEnchants(), Create(), DestroyConjuredItems(), DestroyItem(), DestroyItemCount(), DestroyZoneLimitedItem(), DurabilityLossAll(), DurabilityPointLossForEquipSlot(), DurabilityPointsLossAll(), DurabilityRepair(), Spell::EffectDurabilityDamage(), Spell::EffectDurabilityDamagePCT(), Spell::EffectEnchantHeldItem(), EnchantmentFitsRequirements(), EquipItem(), EquippedOk(), FindEquipSlot(), GetBagByPos(), GetFreeInventorySpace(), GetItemByEntry(), GetItemByGuid(), GetItemByPos(), GetItemCount(), GetItemCountWithLimitCategory(), GetShield(), GetUseableItemByPos(), GetWeaponForAttack(), misc_commandscript::HandleAddItemCommand(), spell_rog_deadly_poison::HandleAfterHit(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModShapeshift(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), bg_commandscript::HandleBagsClearCommand(), WorldSession::HandleCancelTempEnchantmentOpcode(), character_commandscript::HandleCharacterCheckBagCommand(), debug_commandscript::HandleDebugGetItemStateCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetSave(), WorldSession::HandleEquipmentSetUse(), inventory_commandscript::HandleInventoryCountCommand(), WorldSession::HandleMirrorImageDataRequest(), WorldSession::HandleOpenItemOpcode(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleReadItem(), WorldSession::HandleSetTradeItemOpcode(), WorldSession::HandleWrapItemOpcode(), HasItemCount(), HasItemOrGemWithIdEquipped(), HasItemOrGemWithLimitCategoryEquipped(), HasItemTotemCategory(), IsTwoHandUsed(), MoveItemFromInventory(), RemoveArenaEnchantments(), RemoveItem(), reset_commandscript::ResetItemsDeleteBankBags(), reset_commandscript::ResetItemsDeleteStandardBags(), reset_commandscript::ResetItemsEquipped(), reset_commandscript::ResetItemsInBags(), reset_commandscript::ResetItemsInBank(), reset_commandscript::ResetItemsInCurrenciesList(), reset_commandscript::ResetItemsInKeyring(), SplitItem(), SwapItem(), and ToggleMetaGemsActive().

◆ GetItemByPos() [2/2]

Item * Player::GetItemByPos ( uint8  bag,
uint8  slot 
) const
472{
473 if (bag == INVENTORY_SLOT_BAG_0 && (slot < BANK_SLOT_BAG_END || (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END)))
474 return m_items[slot];
475 else if (Bag* pBag = GetBagByPos(bag))
476 return pBag->GetItemByPos(slot);
477 return nullptr;
478}

References BANK_SLOT_BAG_END, CURRENCYTOKEN_SLOT_END, GetBagByPos(), INVENTORY_SLOT_BAG_0, KEYRING_SLOT_START, and m_items.

◆ GetItemCount()

uint32 Player::GetItemCount ( uint32  item,
bool  inBankAlso = false,
Item skipItem = nullptr 
) const
351{
352 uint32 count = 0;
354 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
355 if (pItem != skipItem && pItem->GetEntry() == item)
356 count += pItem->GetCount();
357
359 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
360 if (pItem != skipItem && pItem->GetEntry() == item)
361 count += pItem->GetCount();
362
364 if (Bag* pBag = GetBagByPos(i))
365 count += pBag->GetItemCount(item, skipItem);
366
367 if (skipItem && skipItem->GetTemplate()->GemProperties)
369 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
370 if (pItem != skipItem && pItem->GetTemplate()->Socket[0].Color)
371 count += pItem->GetGemCountWithID(item);
372
373 if (inBankAlso)
374 {
375 // checking every item from 39 to 74 (including bank bags)
377 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
378 if (pItem != skipItem && pItem->GetEntry() == item)
379 count += pItem->GetCount();
380
382 if (Bag* pBag = GetBagByPos(i))
383 count += pBag->GetItemCount(item, skipItem);
384
385 if (skipItem && skipItem->GetTemplate()->GemProperties)
387 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
388 if (pItem != skipItem && pItem->GetTemplate()->Socket[0].Color)
389 count += pItem->GetGemCountWithID(item);
390 }
391
392 return count;
393}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, _Socket::Color, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, ItemTemplate::GemProperties, GetBagByPos(), Object::GetEntry(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, KEYRING_SLOT_START, and ItemTemplate::Socket.

Referenced by AdjustQuestReqItemCount(), CanRewardQuest(), CanRollOnItem(), CanTakeMoreSimilarItems(), WorldSession::HandleSetAmmoOpcode(), HasQuestForItem(), npc_venomhide_hatchling::npc_venomhide_hatchlingAI::IsSummonedBy(), ItemRemovedQuestCheck(), npc_adventurous_dwarf::OnGossipHello(), SendNewItem(), and PlayerMenu::SendQuestGiverRequestItems().

◆ GetItemCountWithLimitCategory()

uint32 Player::GetItemCountWithLimitCategory ( uint32  limitCategory,
Item skipItem = nullptr 
) const
396{
397 uint32 count = 0;
398 for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i)
399 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
400 if (pItem != skipItem)
401 if (ItemTemplate const* pProto = pItem->GetTemplate())
402 if (pProto->ItemLimitCategory == limitCategory)
403 count += pItem->GetCount();
404
405 for (int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
406 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
407 if (pItem != skipItem)
408 if (ItemTemplate const* pProto = pItem->GetTemplate())
409 if (pProto->ItemLimitCategory == limitCategory)
410 count += pItem->GetCount();
411
413 if (Bag* pBag = GetBagByPos(i))
414 count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
415
416 for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
417 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
418 if (pItem != skipItem)
419 if (ItemTemplate const* pProto = pItem->GetTemplate())
420 if (pProto->ItemLimitCategory == limitCategory)
421 count += pItem->GetCount();
422
423 for (int i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i)
424 if (Bag* pBag = GetBagByPos(i))
425 count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
426
427 return count;
428}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and KEYRING_SLOT_START.

Referenced by CanTakeMoreSimilarItems().

◆ GetItemFromBuyBackSlot()

Item * Player::GetItemFromBuyBackSlot ( uint32  slot)
4003{
4004 LOG_DEBUG("entities.player.items", "STORAGE: GetItemFromBuyBackSlot slot = {}", slot);
4005 if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END)
4006 return m_items[slot];
4007 return nullptr;
4008}

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, LOG_DEBUG, and m_items.

Referenced by WorldSession::HandleBuybackItem(), and reset_commandscript::ResetItemsInVendorBuyBackTab().

◆ GetItemUpdateQueue()

std::vector< Item * > & Player::GetItemUpdateQueue ( )
inline

◆ GetLastPetNumber()

uint32 Player::GetLastPetNumber ( ) const
inline
2434{ return m_lastpetnumber; }

References m_lastpetnumber.

Referenced by spell_gen_pet_summoned::HandleScript().

◆ GetLastPetSpell()

uint32 Player::GetLastPetSpell ( ) const
inline

◆ GetLastPotionId()

uint32 Player::GetLastPotionId ( )
inline
1789{ return m_lastPotionId; }

References m_lastPotionId.

Referenced by Spell::CheckCast(), and UpdatePotionCooldown().

◆ GetLastUsedRune()

RuneType Player::GetLastUsedRune ( )
inline
2489{ return m_runes->lastUsedRune; }
RuneType lastUsedRune
Definition: Player.h:429

References Runes::lastUsedRune, and m_runes.

◆ GetLevelPlayedTime()

uint32 Player::GetLevelPlayedTime ( )
inline

◆ GetLootGUID()

◆ GetMail()

Mail * Player::GetMail ( uint32  id)
3786{
3787 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
3788 {
3789 if ((*itr)->messageID == id)
3790 {
3791 return (*itr);
3792 }
3793 }
3794 return nullptr;
3795}

References m_mail.

Referenced by WorldSession::HandleMailCreateTextItem(), WorldSession::HandleMailDelete(), WorldSession::HandleMailMarkAsRead(), WorldSession::HandleMailReturnToSender(), WorldSession::HandleMailTakeItem(), and WorldSession::HandleMailTakeMoney().

◆ GetMails()

PlayerMails const & Player::GetMails ( ) const
inline

◆ GetMailSize()

uint32 Player::GetMailSize ( )
inline
1634{ return m_mail.size();}

References m_mail.

Referenced by _SaveMail(), and WorldSession::HandleSendMail().

◆ GetManaBonusFromIntellect()

float Player::GetManaBonusFromIntellect ( )
287{
288 float intellect = GetStat(STAT_INTELLECT);
289
290 float baseInt = intellect < 20 ? intellect : 20;
291 float moreInt = intellect - baseInt;
292
293 return baseInt + (moreInt * 15.0f);
294}

References Unit::GetStat(), and STAT_INTELLECT.

Referenced by UpdateMaxPower().

◆ GetMapRef()

MapReference & Player::GetMapRef ( )
inline
2468{ return m_mapRef; }
MapReference m_mapRef
Definition: Player.h:2913

References m_mapRef.

Referenced by InstanceMap::CannotEnter(), BattlegroundMap::CannotEnter(), ResetMap(), and Map::UpdateIteratorBack().

◆ GetMaxKeyringSize()

uint32 Player::GetMaxKeyringSize ( ) const
inline

◆ GetMaxPersonalArenaRatingRequirement()

uint32 Player::GetMaxPersonalArenaRatingRequirement ( uint32  minarenaslot) const

If trans is specified, arena point save query will be added to trans.

10842{
10843 // returns the maximal personal arena rating that can be used to purchase items requiring this condition
10844 // the personal rating of the arena team must match the required limit as well
10845 // so return max[in arenateams](min(personalrating[teamtype], teamrating[teamtype]))
10846 uint32 max_personal_rating = 0;
10847 for (uint8 i = minarenaslot; i < MAX_ARENA_SLOT; ++i)
10848 {
10849 if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamId(i)))
10850 {
10851 uint32 p_rating = GetArenaPersonalRating(i);
10852 uint32 t_rating = at->GetRating();
10853 p_rating = p_rating < t_rating ? p_rating : t_rating;
10854 if (max_personal_rating < p_rating)
10855 max_personal_rating = p_rating;
10856 }
10857 }
10858
10859 sScriptMgr->OnGetMaxPersonalArenaRatingRequirement(this, minarenaslot, max_personal_rating);
10860
10861 return max_personal_rating;
10862}
uint32 GetArenaPersonalRating(uint8 slot) const
Definition: Player.cpp:16152
uint32 GetArenaTeamId(uint8 slot) const
Definition: Player.cpp:16161

References GetArenaPersonalRating(), GetArenaTeamId(), MAX_ARENA_SLOT, sArenaTeamMgr, and sScriptMgr.

Referenced by BuyItemFromVendorSlot().

◆ GetMaxSkillValue()

uint16 Player::GetMaxSkillValue ( uint32  skill) const
5412{
5413 if (!skill)
5414 return 0;
5415
5416 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5417 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5418 return 0;
5419
5420 uint32 bonus = GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos));
5421
5422 int32 result = int32(SKILL_MAX(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5423 sScriptMgr->OnGetMaxSkillValue(const_cast<Player*>(this), skill, result, false);
5424 result += SKILL_TEMP_BONUS(bonus);
5425 result += SKILL_PERM_BONUS(bonus);
5426 return result < 0 ? 0 : result;
5427}
#define SKILL_TEMP_BONUS(x)
Definition: Player.h:86

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_MAX, SKILL_PERM_BONUS, SKILL_TEMP_BONUS, and sScriptMgr.

Referenced by Unit::GetDefenseSkillValue(), and UpdateFishingSkill().

◆ GetMaxSkillValueForLevel()

uint16 Player::GetMaxSkillValueForLevel ( ) const
16189{
16191
16192 sScriptMgr->OnGetMaxSkillValueForLevel(const_cast<Player*>(this), result);
16193
16194 return result;
16195}
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition: Unit.h:892

References Unit::GetMaxSkillValueForLevel(), and sScriptMgr.

Referenced by _addSpell(), _LoadSkills(), GetMissPercentageFromDefence(), LearnDefaultSkill(), removeSpell(), UpdateBlockPercentage(), UpdateCritPercentage(), UpdateDodgePercentage(), UpdateParryPercentage(), and UpdateSkillsForLevel().

◆ getMaxTimer()

int32 Player::getMaxTimer ( MirrorTimerType  timer)
protected
808{
809 switch (timer)
810 {
811 case FATIGUE_TIMER:
812 return MINUTE * IN_MILLISECONDS;
813 case BREATH_TIMER:
814 {
817 int32 UnderWaterTime = sWorld->getIntConfig(CONFIG_WATER_BREATH_TIMER);
819 for (AuraEffectList::const_iterator i = mModWaterBreathing.begin(); i != mModWaterBreathing.end(); ++i)
820 AddPct(UnderWaterTime, (*i)->GetAmount());
821 return UnderWaterTime;
822 }
823 case FIRE_TIMER:
824 {
825 if (!IsAlive())
827 return 2020;
828 }
829 default:
830 return 0;
831 }
832}
@ SPELL_AURA_MOD_WATER_BREATHING
Definition: SpellAuraDefines.h:218
@ SPELL_AURA_WATER_BREATHING
Definition: SpellAuraDefines.h:145
@ FIRE_TIMER
Definition: Player.h:576
@ FATIGUE_TIMER
Definition: Player.h:574
@ BREATH_TIMER
Definition: Player.h:575
@ CONFIG_WATER_BREATH_TIMER
Definition: IWorld.h:422
@ CONFIG_DISABLE_BREATHING
Definition: IWorld.h:311
AccountTypes
Definition: Common.h:56

References AddPct(), BREATH_TIMER, CONFIG_DISABLE_BREATHING, CONFIG_WATER_BREATH_TIMER, DISABLED_MIRROR_TIMER, FATIGUE_TIMER, FIRE_TIMER, Unit::GetAuraEffectsByType(), GetSession(), Unit::HasAuraType(), IN_MILLISECONDS, Unit::IsAlive(), MINUTE, SPELL_AURA_MOD_WATER_BREATHING, SPELL_AURA_WATER_BREATHING, and sWorld.

Referenced by HandleDrowning(), and IsMirrorTimerActive().

◆ GetMeleeCritFromAgility()

float Player::GetMeleeCritFromAgility ( )
5040{
5041 uint8 level = GetLevel();
5042 uint32 pclass = getClass();
5043
5044 if (level > GT_MAX_LEVEL)
5045 level = GT_MAX_LEVEL;
5046
5047 GtChanceToMeleeCritBaseEntry const* critBase = sGtChanceToMeleeCritBaseStore.LookupEntry(pclass - 1);
5048 GtChanceToMeleeCritEntry const* critRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5049 if (!critBase || !critRatio)
5050 return 0.0f;
5051
5052 float crit = critBase->base + GetStat(STAT_AGILITY) * critRatio->ratio;
5053 return crit * 100.0f;
5054}
DBCStorage< GtChanceToMeleeCritBaseEntry > sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt)
Definition: DBCStructure.h:1052
float base
Definition: DBCStructure.h:1053

References GtChanceToMeleeCritBaseEntry::base, Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtChanceToMeleeCritEntry::ratio, sGtChanceToMeleeCritBaseStore, sGtChanceToMeleeCritStore, and STAT_AGILITY.

Referenced by UpdateAllCritPercentages().

◆ GetMeleeDamageSchoolMask()

SpellSchoolMask Player::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
overridevirtual

Implements Unit.

6940{
6941 if (Item const* weapon = GetWeaponForAttack(attackType, true))
6942 {
6943 return SpellSchoolMask(1 << weapon->GetTemplate()->Damage[damageIndex].DamageType);
6944 }
6945
6947}
SpellSchoolMask
Definition: SharedDefines.h:295

References GetWeaponForAttack(), and SPELL_SCHOOL_MASK_NORMAL.

◆ GetMissPercentageFromDefence()

float Player::GetMissPercentageFromDefence ( ) const
709{
710 float const miss_cap[MAX_CLASSES] =
711 {
712 16.00f, // Warrior //correct
713 16.00f, // Paladin //correct
714 16.00f, // Hunter //?
715 16.00f, // Rogue //?
716 16.00f, // Priest //?
717 16.00f, // DK //correct
718 16.00f, // Shaman //?
719 16.00f, // Mage //?
720 16.00f, // Warlock //?
721 0.0f, // ??
722 16.00f // Druid //?
723 };
724
725 float diminishing = 0.0f, nondiminishing = 0.0f;
726 // Modify value from defense skill (only bonus from defense rating diminishes)
727 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
728 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
729
730 // apply diminishing formula to diminishing miss chance
731 uint32 pclass = getClass() - 1;
732 return nondiminishing + (diminishing * miss_cap[pclass] / (diminishing + miss_cap[pclass] * m_diminishing_k[pclass]));
733}
const float m_diminishing_k[MAX_CLASSES]
Definition: StatSystem.cpp:693
float GetRatingBonusValue(CombatRating cr) const
Definition: Player.cpp:5142

References CR_DEFENSE_SKILL, Unit::getClass(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), m_diminishing_k, MAX_CLASSES, and SKILL_DEFENSE.

◆ GetMItem()

Item * Player::GetMItem ( ObjectGuid::LowType  itemLowGuid)
inline
1653 {
1654 ItemMap::const_iterator itr = mMitems.find(itemLowGuid);
1655 return itr != mMitems.end() ? itr->second : nullptr;
1656 }

References mMitems.

Referenced by WorldSession::HandleGetMailList(), WorldSession::HandleMailReturnToSender(), and WorldSession::HandleMailTakeItem().

◆ GetMoney()

◆ GetMostPointsTalentTree()

uint8 Player::GetMostPointsTalentTree ( ) const
15254{
15255 uint32 specPoints[3] = {0, 0, 0};
15256 const PlayerTalentMap& talentMap = GetTalentMap();
15257 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
15258 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec()))
15259 if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID))
15260 if (TalentTabEntry const* tab = sTalentTabStore.LookupEntry(talentInfo->TalentTab))
15261 if (tab->tabpage < 3)
15262 {
15263 // find current talent rank
15264 uint8 currentTalentRank = 0;
15265 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
15266 if (talentInfo->RankID[rank] && itr->first == talentInfo->RankID[rank])
15267 {
15268 currentTalentRank = rank + 1;
15269 break;
15270 }
15271 specPoints[tab->tabpage] += currentTalentRank;
15272 }
15273 uint8 maxIndex = 0;
15274 uint8 maxCount = specPoints[0];
15275 for (uint8 i = 1; i < 3; ++i)
15276 if (specPoints[i] > maxCount)
15277 {
15278 maxIndex = i;
15279 maxCount = specPoints[i];
15280 }
15281 return maxIndex;
15282}

References GetActiveSpec(), GetTalentMap(), MAX_TALENT_RANK, PLAYERSPELL_REMOVED, sTalentStore, and sTalentTabStore.

◆ GetMountBlockId()

uint32 Player::GetMountBlockId ( )
inline

◆ GetNextQuest()

Quest const * Player::GetNextQuest ( ObjectGuid  guid,
Quest const *  quest 
)
208{
209 QuestRelationBounds objectQR;
210
212 if (creature)
213 objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
214 else
215 {
216 //we should obtain map pointer from GetMap() in 99% of cases. Special case
217 //only for quests which cast teleport spells on player
219 ASSERT(_map);
220 GameObject* pGameObject = _map->GetGameObject(guid);
221 if (pGameObject)
222 objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry());
223 else
224 return nullptr;
225 }
226
227 uint32 nextQuestID = quest->GetNextQuestInChain();
228 for (QuestRelations::const_iterator itr = objectQR.first; itr != objectQR.second; ++itr)
229 {
230 if (itr->second == nextQuestID)
231 return sObjectMgr->GetQuestTemplate(nextQuestID);
232 }
233
234 return nullptr;
235}
std::pair< QuestRelations::const_iterator, QuestRelations::const_iterator > QuestRelationBounds
Definition: ObjectMgr.h:525
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const)
Definition: ObjectAccessor.cpp:237

References ASSERT, ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), Map::GetGameObject(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), Quest::GetNextQuestInChain(), Object::IsInWorld(), sMapMgr, and sObjectMgr.

Referenced by WorldSession::HandleQuestgiverChooseRewardOpcode().

◆ GetNextRandomRaidMember()

Player * Player::GetNextRandomRaidMember ( float  radius)
12933{
12934 Group* group = GetGroup();
12935 if (!group)
12936 return nullptr;
12937
12938 std::vector<Player*> nearMembers;
12939 nearMembers.reserve(group->GetMembersCount());
12940
12941 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12942 {
12943 Player* Target = itr->GetSource();
12944
12945 // IsHostileTo check duel and controlled by enemy
12946 if (Target && Target != this && IsWithinDistInMap(Target, radius) &&
12947 !Target->HasInvisibilityAura() && !IsHostileTo(Target))
12948 nearMembers.push_back(Target);
12949 }
12950
12951 if (nearMembers.empty())
12952 return nullptr;
12953
12954 uint32 randTarget = urand(0, nearMembers.size() - 1);
12955 return nearMembers[randTarget];
12956}
bool IsHostileTo(Unit const *unit) const
Definition: Unit.cpp:10181

References Group::GetFirstMember(), GetGroup(), Group::GetMembersCount(), Unit::HasInvisibilityAura(), Unit::IsHostileTo(), WorldObject::IsWithinDistInMap(), GroupReference::next(), and urand().

◆ GetNextSave()

uint32 Player::GetNextSave ( ) const
inline
2588{ return m_nextSave; }

References m_nextSave.

◆ GetNPCIfCanInteractWith()

Creature * Player::GetNPCIfCanInteractWith ( ObjectGuid  guid,
uint32  npcflagmask 
)
2076{
2077 // unit checks
2078 if (!guid)
2079 return nullptr;
2080
2081 if (!IsInWorld())
2082 return nullptr;
2083
2084 if (IsInFlight())
2085 return nullptr;
2086
2087 // exist (we need look pets also for some interaction (quest/etc)
2088 Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid);
2089 if (!creature)
2090 return nullptr;
2091
2092 // Deathstate checks
2094 return nullptr;
2095
2096 // alive or spirit healer
2098 return nullptr;
2099
2100 // appropriate npc type
2101 if (npcflagmask && !creature->HasNpcFlag(NPCFlags(npcflagmask)))
2102 return nullptr;
2103
2104 // not allow interaction under control, but allow with own pets
2105 if (creature->GetCharmerGUID())
2106 return nullptr;
2107
2108 // xinef: perform better check
2109 if (creature->GetReactionTo(this) <= REP_UNFRIENDLY)
2110 return nullptr;
2111
2112 // xinef: not needed, CORRECTLY checked above including forced reputations etc
2113 // not unfriendly
2114 //if (FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(creature->GetFaction()))
2115 // if (factionTemplate->faction)
2116 // if (FactionEntry const* faction = sFactionStore.LookupEntry(factionTemplate->faction))
2117 // if (faction->reputationListID >= 0 && GetReputationMgr().GetRank(faction) <= REP_UNFRIENDLY)
2118 // return nullptr;
2119
2120 // not too far
2121 if (!creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
2122 return nullptr;
2123
2124 // pussywizard: many npcs have missing conditions for class training and rogue trainer can for eg. train dual wield to a shaman :/ too many to change in sql and watch in the future
2125 // pussywizard: this function is not used when talking, but when already taking action (buy spell, reset talents, show spell list)
2127 return nullptr;
2128
2129 return creature;
2130}
#define INTERACTION_DISTANCE
Definition: ObjectDefines.h:24
@ CLASS_CONTEXT_CLASS_TRAINER
Definition: UnitDefines.h:222
NPCFlags
Non Player Character flags.
Definition: UnitDefines.h:292
@ UNIT_NPC_FLAG_TRAINER_CLASS
Definition: UnitDefines.h:299
@ UNIT_NPC_FLAG_TRAINER
Definition: UnitDefines.h:298
Classes
Definition: SharedDefines.h:139
@ REP_UNFRIENDLY
Definition: SharedDefines.h:182
@ TRAINER_TYPE_CLASS
Definition: SharedDefines.h:2617
@ CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS
Definition: SharedDefines.h:2696
@ CREATURE_TYPE_FLAG_INTERACT_WHILE_DEAD
Definition: SharedDefines.h:2702
uint32 trainer_class
Definition: CreatureData.h:223
uint32 type_flags
Definition: CreatureData.h:226
uint32 trainer_type
Definition: CreatureData.h:221
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition: Unit.cpp:10009
bool HasNpcFlag(NPCFlags flags) const
Definition: Unit.h:991
ObjectGuid GetCharmerGUID() const
Definition: Unit.h:1163

References CLASS_CONTEXT_CLASS_TRAINER, CREATURE_TYPE_FLAG_INTERACT_WHILE_DEAD, CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS, Unit::GetCharmerGUID(), ObjectAccessor::GetCreatureOrPetOrVehicle(), Creature::GetCreatureTemplate(), Unit::GetReactionTo(), Unit::HasNpcFlag(), INTERACTION_DISTANCE, Unit::IsAlive(), IsClass(), Unit::IsInFlight(), Object::IsInWorld(), WorldObject::IsWithinDistInMap(), REP_UNFRIENDLY, CreatureTemplate::trainer_class, CreatureTemplate::trainer_type, TRAINER_TYPE_CLASS, CreatureTemplate::type_flags, UNIT_NPC_FLAG_TRAINER, and UNIT_NPC_FLAG_TRAINER_CLASS.

Referenced by BuyItemFromVendorSlot(), CanInteractWithQuestGiver(), WorldSession::CanOpenMailBox(), WorldSession::CanUseBank(), AuctionListItemsDelayEvent::Execute(), WorldSession::HandleActivateTaxiExpressOpcode(), WorldSession::HandleActivateTaxiOpcode(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListOwnerItemsEvent(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::SendListInventory(), WorldSession::SendPetitionShowList(), and WorldSession::SendTrainerList().

◆ GetOriginalGroup()

◆ GetOriginalGroupRef()

GroupReference & Player::GetOriginalGroupRef ( )
inline
2461{ return m_originalGroup; }

References m_originalGroup.

◆ GetOriginalSubGroup()

uint8 Player::GetOriginalSubGroup ( ) const
inline
2462{ return m_originalGroup.getSubGroup(); }
uint8 getSubGroup() const
Definition: GroupReference.h:38

References GroupReference::getSubGroup(), and m_originalGroup.

Referenced by RemoveFromBattlegroundOrBattlefieldRaid().

◆ GetOrInitPetStable()

PetStable & Player::GetOrInitPetStable ( )
15534{
15535 if (!m_petStable)
15536 m_petStable = std::make_unique<PetStable>();
15537
15538 return *m_petStable;
15539}

References m_petStable.

Referenced by WorldSession::HandleBuyStableSlot(), Unit::InitTamedPet(), and SummonPet().

◆ GetOutdoorPvP()

OutdoorPvP * Player::GetOutdoorPvP ( ) const
12459{
12460 return sOutdoorPvPMgr->GetOutdoorPvPToZoneId(GetZoneId());
12461}
#define sOutdoorPvPMgr
Definition: OutdoorPvPMgr.h:103

References WorldObject::GetZoneId(), and sOutdoorPvPMgr.

Referenced by WorldSession::HandleAreaTriggerOpcode(), and Unit::Kill().

◆ GetPassOnGroupLoot()

bool Player::GetPassOnGroupLoot ( ) const
inline
2466{ return m_bPassOnGroupLoot; }

References m_bPassOnGroupLoot.

Referenced by Group::GroupLoot(), and Group::NeedBeforeGreed().

◆ GetPendingBind()

uint32 Player::GetPendingBind ( ) const
inline
2417{ return _pendingBindId; }

References _pendingBindId.

Referenced by WorldSession::HandleInstanceLockResponse().

◆ GetPendingSpectatorInviteInstanceId()

uint32 Player::GetPendingSpectatorInviteInstanceId ( ) const
inline

◆ GetPet()

Pet * Player::GetPet ( ) const
8864{
8865 if (ObjectGuid pet_guid = GetPetGUID())
8866 {
8867 if (!pet_guid.IsPet())
8868 return nullptr;
8869
8870 Pet* pet = ObjectAccessor::GetPet(*this, pet_guid);
8871
8872 if (!pet)
8873 return nullptr;
8874
8875 if (IsInWorld())
8876 return pet;
8877
8878 //there may be a guardian in slot
8879 //LOG_ERROR("entities.player", "Player::GetPet: Pet {} not exist.", pet_guid.ToString());
8880 //const_cast<Player*>(this)->SetPetGUID(0);
8881 }
8882
8883 return nullptr;
8884}
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:218

References ObjectAccessor::GetPet(), Unit::GetPetGUID(), and Object::IsInWorld().

Referenced by Spell::_cast(), KillRewarder::_RewardXP(), ActivateSpec(), Battleground::AddPlayer(), AuraEffect::ApplySpellMod(), WorldSession::BuildPartyMemberStatsChangedPacket(), BuildPetTalentsInfoData(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), Unit::DealDamage(), spell_hun_masters_call::DoCheckCast(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::EffectFeedPet(), Spell::EffectResurrectPet(), Spell::EffectSummonPet(), GiveLevel(), AuraEffect::HandleAuraModPetTalentsPoints(), spell_hun_masters_call::HandleDummy(), learn_commandscript::HandleLearnAllMyPetTalentsCommand(), AuraEffect::HandleModPossessPet(), WorldSession::HandleMoveTeleportAck(), pet_commandscript::HandlePetLearnCommand(), pet_commandscript::HandlePetUnlearnCommand(), Unit::HandleProcTriggerSpell(), WorldSession::HandleRequestPartyMemberStatsOpcode(), WorldSession::HandleRequestPetInfo(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetTalentsCommand(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleUnstablePet(), InitStatsForLevel(), Unit::Kill(), LearnPetTalent(), Pet::LoadPetFromDB(), go_orb_of_domination::OnGossipHello(), PetSpellInitialize(), PrepareGossipMenu(), RemoveArenaSpellCooldowns(), RemovePet(), ResetPetTalents(), SaveToDB(), SendUpdateToOutOfRangeGroupMembers(), SetGameMaster(), Unit::SetSpeed(), TeleportTo(), UnsummonPetTemporaryIfAny(), and Update().

◆ GetPetStable() [1/2]

◆ GetPetStable() [2/2]

PetStable const * Player::GetPetStable ( ) const
inline
1204{ return m_petStable.get(); }

References m_petStable.

◆ GetPhaseMaskForSpawn()

uint32 Player::GetPhaseMaskForSpawn ( ) const
13719{
13721
13722 if (!phase)
13724
13725 // some aura phases include 1 normal map in addition to phase itself
13726 uint32 n_phase = phase & ~PHASEMASK_NORMAL;
13727 if (n_phase > 0)
13728 return n_phase;
13729
13730 return phase;
13731}
@ PHASEMASK_NORMAL
Definition: Object.h:59
phase
Definition: boss_skadi.cpp:103
uint32 GetPhaseMask() const
Definition: Object.h:446
uint32 GetPhaseByAuras() const
Definition: Unit.cpp:18966

References Unit::GetPhaseByAuras(), WorldObject::GetPhaseMask(), IsGameMaster(), and PHASEMASK_NORMAL.

Referenced by gobject_commandscript::HandleGameObjectAddCommand(), npc_commandscript::HandleNpcAddCommand(), wp_commandscript::HandleWpModifyCommand(), and wp_commandscript::HandleWpShowCommand().

◆ GetPlayerFlags()

PlayerFlags Player::GetPlayerFlags ( ) const
inline
@ PLAYER_FLAGS
Definition: UpdateFields.h:178
PlayerFlags
Definition: Player.h:473

References Object::GetUInt32Value(), and PLAYER_FLAGS.

Referenced by _SaveCharacter().

◆ GetPlayerName()

std::string Player::GetPlayerName ( )
16247{
16248 std::string name = GetName();
16249 std::string color = "";
16250
16251 switch (getClass())
16252 {
16253 case CLASS_DEATH_KNIGHT: color = "|cffC41F3B"; break;
16254 case CLASS_DRUID: color = "|cffFF7D0A"; break;
16255 case CLASS_HUNTER: color = "|cffABD473"; break;
16256 case CLASS_MAGE: color = "|cff69CCF0"; break;
16257 case CLASS_PALADIN: color = "|cffF58CBA"; break;
16258 case CLASS_PRIEST: color = "|cffFFFFFF"; break;
16259 case CLASS_ROGUE: color = "|cffFFF569"; break;
16260 case CLASS_SHAMAN: color = "|cff0070DE"; break;
16261 case CLASS_WARLOCK: color = "|cff9482C9"; break;
16262 case CLASS_WARRIOR: color = "|cffC79C6E"; break;
16263 }
16264
16265 return "|Hplayer:" + name + "|h" + color + name + "|h|r";
16266}
@ CLASS_PRIEST
Definition: SharedDefines.h:145

References CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, Unit::getClass(), and WorldObject::GetName().

Referenced by gear_commandscript::HandleGearStatsCommand().

◆ GetPlayerSetting()

PlayerSetting Player::GetPlayerSetting ( std::string  source,
uint8  index 
)
71{
72 auto itr = m_charSettingsMap.find(source);
73
74 if (itr == m_charSettingsMap.end())
75 {
76 // Settings not found, this will initialize a new entry.
77 UpdatePlayerSetting(source, index, 0);
78 return GetPlayerSetting(source, index);
79 }
80
81 PlayerSettingVector settingVector = itr->second;
82 if (settingVector.size() < (uint8)(index + 1))
83 {
84 UpdatePlayerSetting(source, index, 0);
85 return GetPlayerSetting(source, index);
86 }
87
88 return itr->second[index];
89}
void UpdatePlayerSetting(std::string source, uint8 index, uint32 value)
Definition: PlayerSettings.cpp:115
PlayerSetting GetPlayerSetting(std::string source, uint8 index)
Definition: PlayerSettings.cpp:70

References GetPlayerSetting(), m_charSettingsMap, and UpdatePlayerSetting().

Referenced by GetPlayerSetting(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), and ChatHandler::SendWorldTextOptional().

◆ GetPureMaxSkillValue()

uint16 Player::GetPureMaxSkillValue ( uint32  skill) const
5430{
5431 if (!skill)
5432 return 0;
5433
5434 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5435 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5436 return 0;
5437
5438 int32 result = int32(SKILL_MAX(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5439
5440 sScriptMgr->OnGetMaxSkillValue(const_cast<Player*>(this), skill, result, true);
5441
5442 return result < 0 ? 0 : result;
5443}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_MAX, and sScriptMgr.

Referenced by _addSpell(), learn_commandscript::HandleLearnAllRecipesCommand(), lookup_commandscript::HandleLookupSkillCommand(), misc_commandscript::HandleSetSkillCommand(), and removeSpell().

◆ GetPureSkillValue()

uint16 Player::GetPureSkillValue ( uint32  skill) const

◆ GetQuestDialogStatus()

QuestGiverStatus Player::GetQuestDialogStatus ( Object questGiver)
1590{
1593
1594 sScriptMgr->GetDialogStatus(this, questgiver);
1595
1596 switch (questgiver->GetTypeId())
1597 {
1598 case TYPEID_GAMEOBJECT:
1599 {
1600 QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToGameObject()));
1601 if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
1602 return questStatus;
1603 qr = sObjectMgr->GetGOQuestRelationBounds(questgiver->GetEntry());
1604 qir = sObjectMgr->GetGOQuestInvolvedRelationBounds(questgiver->GetEntry());
1605 break;
1606 }
1607 case TYPEID_UNIT:
1608 {
1609 QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToCreature()));
1610 if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
1611 return questStatus;
1612 qr = sObjectMgr->GetCreatureQuestRelationBounds(questgiver->GetEntry());
1613 qir = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(questgiver->GetEntry());
1614 break;
1615 }
1616 default:
1617 // it's impossible, but check
1618 //LOG_ERROR("entities.player.quest", "GetQuestDialogStatus called for unexpected type {}", questgiver->GetTypeId());
1619 return DIALOG_STATUS_NONE;
1620 }
1621
1623
1624 for (QuestRelations::const_iterator i = qir.first; i != qir.second; ++i)
1625 {
1627 uint32 questId = i->second;
1628 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1629 if (!quest)
1630 continue;
1631
1632 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId());
1633 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1634 continue;
1635
1636 QuestStatus status = GetQuestStatus(questId);
1637 if (status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus(questId))
1638 {
1639 result2 = DIALOG_STATUS_REWARD;
1640 }
1641 else if (status == QUEST_STATUS_INCOMPLETE)
1642 {
1643 result2 = DIALOG_STATUS_INCOMPLETE;
1644 }
1645
1646 if (quest->IsAutoComplete() && CanTakeQuest(quest, false) && quest->IsRepeatable() && !quest->IsDailyOrWeekly())
1647 {
1648 result2 = DIALOG_STATUS_REWARD_REP;
1649 }
1650
1651 if (result2 > result)
1652 {
1653 result = result2;
1654 }
1655 }
1656
1657 for (QuestRelations::const_iterator i = qr.first; i != qr.second; ++i)
1658 {
1660 uint32 questId = i->second;
1661 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1662 if (!quest)
1663 continue;
1664
1665 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId());
1666 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1667 continue;
1668
1669 QuestStatus status = GetQuestStatus(questId);
1670 if (status == QUEST_STATUS_NONE)
1671 {
1672 if (CanSeeStartQuest(quest))
1673 {
1674 if (SatisfyQuestLevel(quest, false))
1675 {
1676 bool isNotLowLevelQuest = GetLevel() <= (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF));
1677
1678 if (quest->IsRepeatable())
1679 {
1680 if (quest->IsDaily())
1681 {
1682 if (isNotLowLevelQuest)
1683 {
1685 }
1686 else
1687 {
1689 }
1690 }
1691 else if (quest->IsWeekly() || quest->IsMonthly())
1692 {
1693 if (isNotLowLevelQuest)
1694 {
1695 result2 = DIALOG_STATUS_AVAILABLE;
1696 }
1697 else
1698 {
1700 }
1701 }
1702 else if (quest->IsAutoComplete())
1703 {
1704 if (isNotLowLevelQuest)
1705 {
1706 result2 = DIALOG_STATUS_REWARD_REP;
1707 }
1708 else
1709 {
1711 }
1712 }
1713 else
1714 {
1715 if (isNotLowLevelQuest)
1716 {
1717 result2 = DIALOG_STATUS_REWARD_REP;
1718 }
1719 else
1720 {
1722 }
1723 }
1724 }
1725 else
1726 {
1727 result2 = isNotLowLevelQuest ? DIALOG_STATUS_AVAILABLE : DIALOG_STATUS_LOW_LEVEL_AVAILABLE;
1728 }
1729 }
1730 else
1731 {
1732 result2 = DIALOG_STATUS_UNAVAILABLE;
1733 }
1734 }
1735 }
1736
1737 if (result2 > result)
1738 result = result2;
1739 }
1740
1741 return result;
1742}
QuestGiverStatus
Definition: QuestDef.h:111
@ DIALOG_STATUS_UNAVAILABLE
Definition: QuestDef.h:113
@ DIALOG_STATUS_NONE
Definition: QuestDef.h:112
@ DIALOG_STATUS_AVAILABLE
Definition: QuestDef.h:120
@ DIALOG_STATUS_SCRIPTED_NO_STATUS
Definition: QuestDef.h:125
@ DIALOG_STATUS_LOW_LEVEL_REWARD_REP
Definition: QuestDef.h:115
@ DIALOG_STATUS_REWARD
Definition: QuestDef.h:122
@ DIALOG_STATUS_LOW_LEVEL_AVAILABLE
Definition: QuestDef.h:114
@ DIALOG_STATUS_REWARD_REP
Definition: QuestDef.h:118
@ DIALOG_STATUS_INCOMPLETE
Definition: QuestDef.h:117
@ DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP
Definition: QuestDef.h:116
@ DIALOG_STATUS_AVAILABLE_REP
Definition: QuestDef.h:119
@ CONDITION_SOURCE_TYPE_QUEST_AVAILABLE
Definition: ConditionMgr.h:141
@ CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF
Definition: IWorld.h:291
int32 GetQuestLevel(Quest const *quest) const
Definition: Player.h:1415
bool CanSeeStartQuest(Quest const *quest)
Definition: PlayerQuest.cpp:237
uint32 GetQuestId() const
Definition: QuestDef.h:227
bool IsDaily() const
Definition: QuestDef.h:286
bool IsWeekly() const
Definition: QuestDef.h:287
bool IsDailyOrWeekly() const
Definition: QuestDef.h:290
bool IsMonthly() const
Definition: QuestDef.h:288

References CanSeeStartQuest(), CanTakeQuest(), CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF, DIALOG_STATUS_AVAILABLE, DIALOG_STATUS_AVAILABLE_REP, DIALOG_STATUS_INCOMPLETE, DIALOG_STATUS_LOW_LEVEL_AVAILABLE, DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP, DIALOG_STATUS_LOW_LEVEL_REWARD_REP, DIALOG_STATUS_NONE, DIALOG_STATUS_REWARD, DIALOG_STATUS_REWARD_REP, DIALOG_STATUS_SCRIPTED_NO_STATUS, DIALOG_STATUS_UNAVAILABLE, Object::GetEntry(), Unit::GetLevel(), Quest::GetQuestId(), GetQuestLevel(), GetQuestRewardStatus(), GetQuestStatus(), Object::GetTypeId(), Quest::IsAutoComplete(), Quest::IsDaily(), Quest::IsDailyOrWeekly(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, SatisfyQuestLevel(), sConditionMgr, sObjectMgr, sScriptMgr, sWorld, Object::ToCreature(), Object::ToGameObject(), TYPEID_GAMEOBJECT, and TYPEID_UNIT.

Referenced by GameObject::ActivateToQuest(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverStatusQueryOpcode(), and SendQuestGiverStatusMultiple().

◆ GetQuestLevel()

int32 Player::GetQuestLevel ( Quest const *  quest) const
inline

◆ GetQuestRate()

float Player::GetQuestRate ( bool  isDFQuest = false)
16198{
16199 float result = isDFQuest ? sWorld->getRate(RATE_XP_QUEST_DF) : sWorld->getRate(RATE_XP_QUEST);
16200
16201 sScriptMgr->OnGetQuestRate(this, result);
16202
16203 return result;
16204}
@ RATE_XP_QUEST_DF
Definition: IWorld.h:477
@ RATE_XP_QUEST
Definition: IWorld.h:476

References RATE_XP_QUEST, RATE_XP_QUEST_DF, sScriptMgr, and sWorld.

Referenced by CalculateQuestRewardXP().

◆ GetQuestRewardStatus()

◆ GetQuestSlotCounter()

uint16 Player::GetQuestSlotCounter ( uint16  slot,
uint8  counter 
) const
inline
1476{ return (uint16)(GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET) >> (counter * 16)); }
@ PLAYER_QUEST_LOG_1_1
Definition: UpdateFields.h:186
@ QUEST_COUNTS_OFFSET
Definition: Player.h:624
#define MAX_QUEST_OFFSET
Definition: Player.h:628

References Object::GetUInt64Value(), MAX_QUEST_OFFSET, PLAYER_QUEST_LOG_1_1, and QUEST_COUNTS_OFFSET.

Referenced by SendQuestUpdateAddCreatureOrGo(), and SendQuestUpdateAddPlayer().

◆ GetQuestSlotQuestId()

◆ GetQuestSlotState()

uint32 Player::GetQuestSlotState ( uint16  slot) const
inline

◆ GetQuestSlotTime()

uint32 Player::GetQuestSlotTime ( uint16  slot) const
inline

◆ GetQuestStatus()

QuestStatus Player::GetQuestStatus ( uint32  quest_id) const
1425{
1426 if (quest_id)
1427 {
1428 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
1429
1430 if (itr != m_QuestStatus.end())
1431 {
1432 return itr->second.Status;
1433 }
1434
1435 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id))
1436 {
1437 if (qInfo->IsSeasonal())
1438 {
1440 }
1441
1442 if (!qInfo->IsRepeatable() && IsQuestRewarded(quest_id))
1443 {
1444 return QUEST_STATUS_REWARDED;
1445 }
1446 }
1447 }
1448
1449 return QUEST_STATUS_NONE;
1450}
@ QUEST_STATUS_REWARDED
Definition: QuestDef.h:106

References IsQuestRewarded(), m_QuestStatus, QUEST_STATUS_NONE, QUEST_STATUS_REWARDED, SatisfyQuestSeasonal(), and sObjectMgr.

Referenced by GameObject::ActivateToQuest(), LootItem::AllowedForPlayer(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::AttackStart(), CanRewardQuest(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), spell_item_demon_broiled_surprise::CheckRequirement(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::CreditPlayer(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), DuelComplete(), Spell::EffectQuestClear(), Spell::EffectScriptEffect(), SmartAI::EndPath(), FailQuest(), npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), go_gilded_brazier::go_gilded_brazierAI::GossipHello(), go_tadpole_cage::go_tadpole_cageAI::GossipHello(), WorldSession::HandleAreaTriggerOpcode(), spell_midsummer_torch_catch::HandleDummy(), spell_q12014_steady_as_a_rock::HandleFinish(), spell_sindragosa_frost_breath::HandleInfusion(), lookup_commandscript::HandleLookupQuestCommand(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), WorldSession::HandleQuestgiverRequestRewardOpcode(), spell_q11322_q11317_the_cleansing::if(), SpellArea::IsFitToRequirements(), npc_kservant::npc_kservantAI::IsSummonedBy(), npc_clintar_spirit::npc_clintar_spiritAI::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_alar::JustDied(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustEngagedWith(), npc_a_special_surprise::npc_a_special_surpriseAI::MeetQuestCondition(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::MoveInLineOfSight(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), npc_black_knight_graveyard::npc_black_knight_graveyardAI::MoveInLineOfSight(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), npc_death_knight_initiate::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_rizzle_sprysprocket::OnGossipHello(), npc_bunthen_plainswind::OnGossipHello(), npc_great_bear_spirit::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_plucky::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_iruk::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_adventurous_dwarf::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), go_inconspicuous_mine_car::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_tele_to_violet_stand::OnGossipHello(), go_ravager_cage::OnGossipHello(), go_bristlelimb_cage::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_warmaul_prison::OnGossipHello(), go_skull_pile::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_table_theka::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), go_amberpine_outhouse::OnGossipHello(), go_veil_skith_cage::OnGossipHello(), npc_great_bear_spirit::OnGossipSelect(), at_ancient_leaf::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), AreaTrigger_at_last_rites::OnTrigger(), at_malfurion_stormrage::OnTrigger(), at_commander_dawnforge::OnTrigger(), item_captured_frog::OnUse(), npc_doctor::npc_doctorAI::PatientDied(), npc_doctor::npc_doctorAI::PatientSaved(), PrepareQuestMenu(), NPCStaveQuestAI::QuestIncomplete(), npc_shenthul::npc_shenthulAI::ReceiveEmote(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), SatisfyQuestExclusiveGroup(), SatisfyQuestNextChain(), SatisfyQuestPreviousQuest(), SatisfyQuestStatus(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::SetBossState(), npc_costumed_orphan_matron::sGossipHello(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_drakuru_shackles::npc_drakuru_shacklesAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), Battleground::SpiritOfCompetitionEvent(), npc_clintar_spirit::npc_clintar_spiritAI::StartEvent(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), and GameObject::Use().

◆ getQuestStatusMap()

◆ GetQuestStatusSaveMap()

QuestStatusSaveMap & Player::GetQuestStatusSaveMap ( )
inline
1612{ return m_QuestStatusSave; }

References m_QuestStatusSave.

◆ GetRaidDifficulty()

◆ GetRandomWinner()

bool Player::GetRandomWinner ( )
inline

◆ GetRank()

uint8 Player::GetRank ( ) const
inline

◆ GetRatingBonusValue()

◆ GetRatingMultiplier()

float Player::GetRatingMultiplier ( CombatRating  cr) const
5127{
5128 uint8 level = GetLevel();
5129
5130 if (level > GT_MAX_LEVEL)
5131 level = GT_MAX_LEVEL;
5132
5133 GtCombatRatingsEntry const* Rating = sGtCombatRatingsStore.LookupEntry(cr * GT_MAX_LEVEL + level - 1);
5134 // gtOCTClassCombatRatingScalarStore.dbc starts with 1, CombatRating with zero, so cr+1
5135 GtOCTClassCombatRatingScalarEntry const* classRating = sGtOCTClassCombatRatingScalarStore.LookupEntry((getClass() - 1) * GT_MAX_RATING + cr + 1);
5136 if (!Rating || !classRating)
5137 return 1.0f; // By default use minimum coefficient (not must be called)
5138
5139 return classRating->ratio / Rating->ratio;
5140}
DBCStorage< GtCombatRatingsEntry > sGtCombatRatingsStore(GtCombatRatingsfmt)
DBCStorage< GtOCTClassCombatRatingScalarEntry > sGtOCTClassCombatRatingScalarStore(GtOCTClassCombatRatingScalarfmt)
#define GT_MAX_RATING
Definition: DBCStructure.h:1039
Definition: DBCStructure.h:1047
float ratio
Definition: DBCStructure.h:1048
Definition: DBCStructure.h:1077
float ratio
Definition: DBCStructure.h:1078

References Unit::getClass(), Unit::GetLevel(), GT_MAX_LEVEL, GT_MAX_RATING, GtCombatRatingsEntry::ratio, GtOCTClassCombatRatingScalarEntry::ratio, sGtCombatRatingsStore, and sGtOCTClassCombatRatingScalarStore.

Referenced by ApplyRatingMod(), and GetRatingBonusValue().

◆ GetRealDodge()

float Player::GetRealDodge ( ) const
inline
2585{ return m_realDodge; }

References m_realDodge.

Referenced by Unit::GetUnitDodgeChance().

◆ GetRealParry()

float Player::GetRealParry ( ) const
inline
2584{ return m_realParry; }

References m_realParry.

◆ GetReputation()

uint32 Player::GetReputation ( uint32  factionentry) const
15290{
15291 return GetReputationMgr().GetReputation(sFactionStore.LookupEntry(factionentry));
15292}
int32 GetReputation(uint32 faction_id) const
Definition: ReputationMgr.cpp:78

References ReputationMgr::GetReputation(), GetReputationMgr(), and sFactionStore.

Referenced by CanCompleteQuest(), ReputationChanged(), ReputationChanged2(), and SatisfyQuestReputation().

◆ GetReputationMgr() [1/2]

◆ GetReputationMgr() [2/2]

ReputationMgr const & Player::GetReputationMgr ( ) const
inline
2103{ return *m_reputationMgr; }

References m_reputationMgr.

◆ GetReputationPriceDiscount() [1/2]

◆ GetReputationPriceDiscount() [2/2]

float Player::GetReputationPriceDiscount ( FactionTemplateEntry const *  factionTemplate) const
12295{
12296 if (!factionTemplate || !factionTemplate->faction)
12297 {
12298 return 1.0f;
12299 }
12300
12301 ReputationRank rank = GetReputationRank(factionTemplate->faction);
12302 if (rank <= REP_NEUTRAL)
12303 {
12304 return 1.0f;
12305 }
12306
12307 return 1.0f - 0.05f * (rank - REP_NEUTRAL);
12308}
ReputationRank
Definition: SharedDefines.h:179
@ REP_NEUTRAL
Definition: SharedDefines.h:183

References FactionTemplateEntry::faction, GetReputationRank(), and REP_NEUTRAL.

◆ GetReputationRank()

◆ GetReqKillOrCastCurrentCount()

uint16 Player::GetReqKillOrCastCurrentCount ( uint32  quest_id,
int32  entry 
)
1746{
1747 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
1748 if (!qInfo)
1749 return 0;
1750
1751 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
1752 if (qInfo->RequiredNpcOrGo[j] == entry)
1753 return m_QuestStatus[quest_id].CreatureOrGOCount[j];
1754
1755 return 0;
1756}

References m_QuestStatus, QUEST_OBJECTIVES_COUNT, Quest::RequiredNpcOrGo, and sObjectMgr.

Referenced by npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), and npc_razael_and_lyana::OnGossipHello().

◆ GetRestBonus()

float Player::GetRestBonus ( ) const
inline
1194{ return _restBonus; }

References _restBonus.

Referenced by GetXPRestBonus(), LoadFromDB(), and Update().

◆ GetResurrectionSpellId()

uint32 Player::GetResurrectionSpellId ( )
12558{
12559 // search priceless resurrection possibilities
12560 uint32 prio = 0;
12561 uint32 spell_id = 0;
12563 for (AuraEffectList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
12564 {
12565 // Soulstone Resurrection // prio: 3 (max, non death persistent)
12566 if (prio < 2 && (*itr)->GetSpellInfo()->SpellVisual[0] == 99 && (*itr)->GetSpellInfo()->SpellIconID == 92)
12567 {
12568 switch ((*itr)->GetId())
12569 {
12570 case 20707:
12571 spell_id = 3026;
12572 break; // rank 1
12573 case 20762:
12574 spell_id = 20758;
12575 break; // rank 2
12576 case 20763:
12577 spell_id = 20759;
12578 break; // rank 3
12579 case 20764:
12580 spell_id = 20760;
12581 break; // rank 4
12582 case 20765:
12583 spell_id = 20761;
12584 break; // rank 5
12585 case 27239:
12586 spell_id = 27240;
12587 break; // rank 6
12588 case 47883:
12589 spell_id = 47882;
12590 break; // rank 7
12591 default:
12592 LOG_ERROR("entities.player", "Unhandled spell {}: S.Resurrection", (*itr)->GetId());
12593 continue;
12594 }
12595
12596 prio = 3;
12597 }
12598 // Twisting Nether // prio: 2 (max)
12599 else if ((*itr)->GetId() == 23701 && roll_chance_i(10))
12600 {
12601 prio = 2;
12602 spell_id = 23700;
12603 }
12604 }
12605
12606 // Reincarnation (passive spell) // prio: 1 // Glyph of Renewed Life
12607 if (prio < 1 && HasSpell(20608) && !HasSpellCooldown(21169) && (HasAura(58059) || HasItemCount(17030)))
12608 spell_id = 21169;
12609
12610 return spell_id;
12611}
@ SPELL_AURA_DUMMY
Definition: SpellAuraDefines.h:67
bool roll_chance_i(int chance)
Definition: Random.h:59

References Unit::GetAuraEffectsByType(), Unit::HasAura(), HasItemCount(), HasSpell(), HasSpellCooldown(), LOG_ERROR, roll_chance_i(), and SPELL_AURA_DUMMY.

Referenced by Unit::Kill(), and setDeathState().

◆ GetRewardedQuestCount()

std::size_t Player::GetRewardedQuestCount ( ) const
inline
1614{ return m_RewardedQuests.size(); }

References m_RewardedQuests.

Referenced by WorldSession::HandleQueryQuestsCompleted().

◆ getRewardedQuests()

RewardedQuestSet const & Player::getRewardedQuests ( ) const
inline

◆ GetRuneBaseCooldown()

uint32 Player::GetRuneBaseCooldown ( uint8  index,
bool  skipGrace 
)
13318{
13319 uint8 rune = GetBaseRune(index);
13320 uint32 cooldown = RUNE_BASE_COOLDOWN;
13321 if (!skipGrace)
13322 cooldown -= GetGracePeriod(index) < 250 ? 0 : GetGracePeriod(index) - 250; // xinef: reduce by grace period, treat first 250ms as instant use of rune
13323
13325 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
13326 {
13327 if ((*i)->GetMiscValue() == POWER_RUNE && (*i)->GetMiscValueB() == rune)
13328 cooldown = cooldown * (100 - (*i)->GetAmount()) / 100;
13329 }
13330
13331 return cooldown;
13332}
@ SPELL_AURA_MOD_POWER_REGEN_PERCENT
Definition: SpellAuraDefines.h:173
@ RUNE_BASE_COOLDOWN
Definition: Player.h:402
uint32 GetGracePeriod(uint8 index) const
Definition: Player.h:2486
RuneType GetBaseRune(uint8 index) const
Definition: Player.h:2483

References Unit::GetAuraEffectsByType(), GetBaseRune(), GetGracePeriod(), POWER_RUNE, RUNE_BASE_COOLDOWN, and SPELL_AURA_MOD_POWER_REGEN_PERCENT.

Referenced by Spell::TakeRunePower(), and UpdateRuneRegen().

◆ GetRuneCooldown()

uint32 Player::GetRuneCooldown ( uint8  index) const
inline

◆ GetRunesState()

uint8 Player::GetRunesState ( ) const
inline
2482{ return m_runes->runeState; }
uint8 runeState
Definition: Player.h:428

References m_runes, and Runes::runeState.

Referenced by Spell::EffectActivateRune(), and Spell::TakeRunePower().

◆ getRuneWeaponGUID()

ObjectGuid Player::getRuneWeaponGUID ( )
inline
2570{ return m_drwGUID; };
ObjectGuid m_drwGUID
Definition: Player.h:2571

References m_drwGUID.

◆ GetSaveTimer()

uint32 Player::GetSaveTimer ( ) const
inline
2332{ return m_nextSave; }

References m_nextSave.

Referenced by misc_commandscript::HandleSaveCommand().

◆ GetSelectedPlayer()

Player * Player::GetSelectedPlayer ( ) const
11501{
11502 if (ObjectGuid selectionGUID = GetGuidValue(UNIT_FIELD_TARGET))
11503 return ObjectAccessor::GetPlayer(*this, selectionGUID);
11504
11505 return nullptr;
11506}
@ UNIT_FIELD_TARGET
Definition: UpdateFields.h:92
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:223

References Object::GetGuidValue(), ObjectAccessor::GetPlayer(), and UNIT_FIELD_TARGET.

Referenced by Acore::ChatCommands::PlayerIdentifier::FromTarget().

◆ GetSelectedUnit()

◆ GetSemaphoreTeleportFar()

time_t Player::GetSemaphoreTeleportFar ( ) const
inline
2073{ return mSemaphoreTeleport_Far; }

References mSemaphoreTeleport_Far.

◆ GetSemaphoreTeleportNear()

time_t Player::GetSemaphoreTeleportNear ( ) const
inline
2072{ return mSemaphoreTeleport_Near; }

References mSemaphoreTeleport_Near.

◆ GetSession()

WorldSession * Player::GetSession ( ) const
inline
1975{ return m_session; }

References m_session.

Referenced by _addSpell(), _LoadHomeBind(), _LoadInventory(), Pet::_LoadSpellCooldowns(), Battleground::_ProcessProgress(), _SaveCharacter(), _SaveInstanceTimeRestrictions(), _StoreOrEquipNewItem(), ActivateSpec(), ActivateTaxiPathTo(), AddEnchantmentDuration(), AddItem(), Guild::AddMember(), InstanceMap::AddPlayerToMap(), AddRunePower(), addSpell(), Channel::Announce(), ApplyEquipCooldown(), TotemAI::AttackStart(), AutoUnequipOffhandIfNeed(), BanMgr::BanCharacter(), BindToInstance(), Group::BroadcastPacket(), Group::BroadcastReadyCheck(), SocialMgr::BroadcastToFriendListers(), AuctionHouseObject::BuildListAuctionItems(), BuildPlayerRepop(), GameObject::BuildValuesUpdate(), BuyItemFromVendorSlot(), WorldSession::CanOpenMailBox(), CanSpeak(), BattlegroundSA::CaptureGraveyard(), CharacterActionIpLogger::CharacterIPLogAction(), CharmSpellInitialize(), Spell::CheckCast(), CheckDuelDistance(), Spell::CheckEffectTarget(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::CheckRequiredBosses(), AchievementMgr::CompletedAchievement(), ContinueTaxiFlight(), ConvertRune(), Create(), Guild::Create(), ArenaTeam::DelMember(), Object::DestroyForPlayer(), Group::Disband(), InstanceScript::DoSendNotifyToInstance(), DuelComplete(), DurabilityRepair(), Spell::EffectApplyGlyph(), Spell::EffectDiscoverTaxi(), Spell::EffectDuel(), Spell::EffectPlaySound(), Spell::EffectSummonPlayer(), Spell::EffectSummonRaFFriend(), EquipItem(), BattlegroundSA::EventPlayerDamagedGO(), AuctionListItemsDelayEvent::Execute(), BGQueueInviteEvent::Execute(), SendEncounterUnit::Execute(), lfg::LFGMgr::FinishDungeon(), Channel::FlagsNotify(), GetAurasForTarget(), ChannelMgr::GetChannel(), SocialMgr::GetFriendInfo(), getMaxTimer(), GetsRecruitAFriendBonus(), GiveLevel(), Group::GroupLoot(), WorldSession::HandleAcceptGrantLevel(), WorldSession::HandleAcceptTradeOpcode(), account_commandscript::HandleAccountSetAddonCommand(), account_commandscript::HandleAccountSetGmLevelCommand(), WorldSession::HandleAddFriendOpcode(), misc_commandscript::HandleAddItemCommand(), BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), AuraEffect::HandleAuraOpenStable(), AuraEffect::HandleAuraSetVehicle(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleBeginTradeOpcode(), character_commandscript::HandleCharacterLevel(), WorldSession::HandleChatIgnoredOpcode(), debug_commandscript::HandleDebugSendOpcodeCommand(), spell_gen_spirit_healer_res::HandleDummy(), cheat_commandscript::HandleExploreCheatCommand(), ticket_commandscript::HandleGMTicketUnAssignCommand(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupDeclineOpcode(), WorldSession::HandleGroupInviteOpcode(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleInitiateTradeOpcode(), Guild::HandleInviteMember(), lookup_commandscript::HandleLookupPlayerIpCommand(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMessagechatOpcode(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyGenderCommand(), modify_commandscript::HandleModifyHPCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyMoneyCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), modify_commandscript::HandleModifySpellCommand(), WorldSession::HandleMovementOpcodes(), misc_commandscript::HandleMuteCommand(), WorldSession::HandleOfferPetitionOpcode(), misc_commandscript::HandlePInfoCommand(), Battlefield::HandlePlayerLeaveZone(), OutdoorPvP::HandlePlayerLeaveZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginOpcode(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleRaidReadyCheckOpcode(), reset_commandscript::HandleResetSpellsCommand(), reset_commandscript::HandleResetTalentsCommand(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), spell_the_flag_of_ownership::HandleScript(), WorldSession::HandleSendMail(), send_commandscript::HandleSendMessageCommand(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), cheat_commandscript::HandleTaxiCheatCommand(), tele_commandscript::HandleTeleGroupCommand(), misc_commandscript::HandleUnmuteCommand(), WorldSession::HandleWhoisOpcode(), WorldSession::HandleWhoOpcode(), ChatHandler::HasLowerSecurity(), hasSpanishClient(), lfg::LFGMgr::InitializeLockedDungeons(), InitTalentForLevel(), BattlegroundQueue::InviteGroupToBG(), Battlefield::InvitePlayerToQueue(), Battlefield::InvitePlayerToWar(), isBeingLoaded(), IsNeverVisible(), IsPetNeedBeTemporaryUnsummoned(), ObjectMgr::IsVendorItemValid(), IsVisibleGloballyFor(), Channel::JoinChannel(), lfg::LFGMgr::JoinLfg(), Channel::JoinNotify(), Unit::JumpTo(), Channel::KickOrBan(), Unit::KnockbackFrom(), Channel::LeaveNotify(), Channel::List(), LoadFromDB(), Pet::LoadPetFromDB(), GameObject::ModifyHealth(), ModifySpellCooldown(), Group::NeedBeforeGreed(), go_tele_to_dalaran_crystal::OnGossipHello(), go_ulduar_pure_saronite_deposit::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), npc_augustus_the_touched::OnGossipSelect(), npc_rivern_frostwind::OnGossipSelect(), npc_roxi_ramrocket::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_wg_quest_giver::OnGossipSelect(), npc_drake_dealer_hurlunk::OnGossipSelect(), npc_shattrathflaskvendors::OnGossipSelect(), npc_slim::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_prof_leather::OnGossipSelect(), npc_icc_buff_switcher::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), OnGossipSelect(), ServerMailReward::OnLogin(), lfg::LFGPlayerScript::OnLogout(), lfg::LFGPlayerScript::OnMapChanged(), BattlefieldWG::OnPlayerLeaveWar(), Acore::LocalizedPacketDo< Builder >::operator()(), Acore::LocalizedPacketListDo< Builder >::operator()(), CreatureTextLocalizer< Builder >::operator()(), Channel::Password(), Unit::PatchValuesUpdate(), InstanceMap::PermBindAllPlayers(), PetSpellInitialize(), Player(), Battlefield::PlayerAcceptInviteToQueue(), Battlefield::PlayerAcceptInviteToWar(), Battleground::PlayerAddedToBGCheckIfBGIsRunning(), InstanceSaveMgr::PlayerBindToInstance(), MapMgr::PlayerCannotEnter(), InstanceSaveMgr::PlayerUnbindInstance(), InstanceSaveMgr::PlayerUnbindInstanceNotExtended(), PossessSpellInitialize(), BattlegroundSA::PostUpdateImpl(), PrepareGossipMenu(), PrettyPrintRequirementsAchievementsList(), PrettyPrintRequirementsItemsList(), PrettyPrintRequirementsQuestList(), ProhibitSpellSchool(), Battleground::ReadyMarkerClicked(), RefundItem(), Group::RemoveMember(), RemovePet(), RemovePetitionsAndSigns(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), Group::ResetMaxEnchantingLevel(), ResurrectPlayer(), ResyncRunes(), RewardHonor(), Satisfy(), SatisfyQuestLog(), SaveToDB(), SendActionButtons(), npc_prof_alchemy::SendActionMenu(), npc_prof_blacksmith::SendActionMenu(), npc_prof_tailor::SendActionMenu(), AchievementMgr::SendAllAchievementData(), BattlegroundMgr::SendAreaSpiritHealerQueryOpcode(), Battlefield::SendAreaSpiritHealerQueryOpcode(), SendAttackSwingBadFacingAttack(), SendAttackSwingCancelAttack(), SendAttackSwingCantAttack(), SendAttackSwingDeadTarget(), SendAttackSwingNotInRange(), AuctionHouseMgr::SendAuctionExpiredMail(), AuctionHouseMgr::SendAuctionOutbiddedMail(), AuctionHouseMgr::SendAuctionSuccessfulMail(), AuctionHouseMgr::SendAuctionWonMail(), SendBuyError(), SendCanTakeQuestResponse(), Spell::SendCastResult(), SendCorpseReclaimDelay(), SendDuelCountdown(), SendDungeonDifficulty(), SendEnchantmentDurations(), SendEquipError(), SendEquipmentSetList(), SendExplorationExperience(), SocialMgr::SendFriendStatus(), ChatHandler::SendGMText(), SendInitialPacketsAfterAddToMap(), SendInitialPacketsBeforeAddToMap(), SendInitialSpells(), Map::SendInitTransports(), SendInitWorldStates(), BattlefieldWG::SendInitWorldStatesTo(), SendInstanceResetWarning(), BattlegroundQueue::SendJoinMessageArenaQueue(), SendLearnPacket(), SendLogXPGain(), Group::SendLootAllPassed(), Group::SendLootRoll(), Group::SendLootRollWon(), Group::SendLootStartRoll(), Group::SendLootStartRollToPlayer(), SendMailResult(), MailDraft::SendMailTo(), BattlegroundQueue::SendMessageBGQueue(), SendNewItem(), SendNewMail(), CreatureTextMgr::SendNonChatPacket(), SendNotifyLootItemRemoved(), SendNotifyLootMoneyRemoved(), Acore::MessageDistDeliverer::SendPacket(), Acore::MessageDistDelivererToHostile::SendPacket(), Unit::SendPetActionFeedback(), Unit::SendPetAIReaction(), Spell::SendPetCastResult(), Unit::SendPetTalk(), WorldObject::SendPlayMusic(), SendPreparedQuest(), SendProficiency(), SendPushToPartyResponse(), SendQuestComplete(), SendQuestConfirmAccept(), SendQuestFailed(), SendQuestGiverStatusMultiple(), SendQuestReward(), SendQuestTimerFailed(), SendQuestUpdateAddCreatureOrGo(), SendQuestUpdateAddItem(), SendQuestUpdateAddPlayer(), lfg::LFGMgr::SendRaidBrowserCachedList(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), SendRaidDifficulty(), SendRaidInfo(), SendRefundInfo(), SendRemoveControlBar(), Map::SendRemoveTransports(), SendResetFailedNotify(), SendResetInstanceFailed(), SendResetInstanceSuccess(), AchievementMgr::SendRespondInspectAchievements(), Spell::SendResurrectRequest(), SendSavedInstances(), SendSellError(), PlayerSocial::SendSocialList(), SendSystemMessage(), SendTalentsInfoData(), SendTalentWipeConfirm(), SendTeleportAckPacket(), Item::SendTimeUpdate(), Acore::VisibleNotifier::SendToSelf(), SendTransferAborted(), BattlegroundSA::SendTransportInit(), BattlegroundSA::SendTransportsRemove(), Item::SendUpdateSockets(), Group::SendUpdateToPlayer(), Object::SendUpdateToPlayer(), ReputationMgr::SendVisible(), ChatHandler::SendWorldText(), ChatHandler::SendWorldTextOptional(), TradeData::SetAccepted(), SetBindPoint(), SetClientControl(), Item::SetEnchantment(), SetEquipmentSet(), SetGameMaster(), SetGMVisible(), Channel::SetMode(), TradeData::SetMoney(), SetMovement(), Channel::SetOwner(), SetRestBonus(), Unit::SetStandState(), Guild::Member::SetStats(), SetTitle(), Channel::ShouldAnnouncePlayer(), SortAuction(), SpawnCorpseBones(), SummonPet(), lfg::LFGMgr::TeleportPlayer(), TeleportTo(), Channel::ToggleModeration(), TradeCancel(), Channel::UnBan(), TradeData::Update(), Map::Update(), Pet::Update(), GameObject::Update(), Update(), PetAI::UpdateAI(), UpdateForQuestWorldObjects(), UpdateHomebindTime(), UpdateLocalChannels(), Group::UpdatePlayerOutOfRange(), UpdatePosition(), UpdateSpeakTime(), UpdateTriggerVisibility(), GameObject::Use(), VehicleSpellInitialize(), Whisper(), and Unit::Whisper().

◆ GetShield()

Item * Player::GetShield ( bool  useable = false) const
547{
548 Item* item = nullptr;
549 if (useable)
551 else
553 if (!item || item->GetTemplate()->Class != ITEM_CLASS_ARMOR)
554 return nullptr;
555
556 if (!useable)
557 return item;
558
559 if (item->IsBroken())
560 return nullptr;
561
562 return item;
563}
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition: Player.h:1244

References ItemTemplate::Class, EQUIPMENT_SLOT_OFFHAND, GetItemByPos(), Item::GetTemplate(), GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), and ITEM_CLASS_ARMOR.

Referenced by AuraEffect::CalculateAmount().

◆ GetShieldBlockValue()

uint32 Player::GetShieldBlockValue ( ) const
overridevirtual

Implements Unit.

5031{
5033
5034 value = (value < 0) ? 0 : value;
5035
5036 return uint32(value);
5037}

References FLAT_MOD, Unit::GetStat(), m_auraBaseMod, PCT_MOD, SHIELD_BLOCK_VALUE, and STAT_STRENGTH.

Referenced by UpdateShieldBlockValue().

◆ GetSightRange()

float Player::GetSightRange ( WorldObject const *  target = nullptr) const
overridevirtual

Reimplemented from WorldObject.

16236{
16237 float sightRange = WorldObject::GetSightRange(target);
16239 {
16240 sightRange += *_farSightDistance;
16241 }
16242
16243 return sightRange;
16244}
virtual float GetSightRange(WorldObject const *target=nullptr) const
Definition: Object.cpp:1672

References _farSightDistance, and WorldObject::GetSightRange().

Referenced by Group::UpdatePlayerOutOfRange(), and UpdateVisibilityForPlayer().

◆ GetSkillPermBonusValue()

int16 Player::GetSkillPermBonusValue ( uint32  skill) const
5472{
5473 if (!skill)
5474 return 0;
5475
5476 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5477 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5478 return 0;
5479
5481}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, SKILL_DELETED, and SKILL_PERM_BONUS.

Referenced by lookup_commandscript::HandleLookupSkillCommand().

◆ GetSkillStep()

uint16 Player::GetSkillStep ( uint16  skill) const
5383{
5384 if (!skill)
5385 return 0;
5386
5387 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5388 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5389 return 0;
5390
5391 return PAIR32_HIPART(GetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos)));
5392}
uint16 PAIR32_HIPART(uint32 x)
Definition: ObjectDefines.h:92

References Object::GetUInt32Value(), mSkillStatus, PAIR32_HIPART(), PLAYER_SKILL_INDEX, and SKILL_DELETED.

Referenced by learn_commandscript::HandleLearnAllRecipesCommand(), and misc_commandscript::HandleSetSkillCommand().

◆ GetSkillTempBonusValue()

int16 Player::GetSkillTempBonusValue ( uint32  skill) const
5484{
5485 if (!skill)
5486 return 0;
5487
5488 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5489 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5490 return 0;
5491
5493}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, SKILL_DELETED, and SKILL_TEMP_BONUS.

Referenced by lookup_commandscript::HandleLookupSkillCommand().

◆ GetSkillValue()

◆ GetSocial()

◆ GetSpec()

uint32 Player::GetSpec ( int8  spec = -1)
15962{
15963 uint32 mostTalentTabId = 0;
15964 uint32 mostTalentCount = 0;
15965 uint32 specIdx = 0;
15966
15967 if (m_specsCount) // not all instances of Player have a spec for some reason
15968 {
15969 if (spec < 0)
15970 specIdx = m_activeSpec;
15971 else
15972 specIdx = spec;
15973 // find class talent tabs (all players have 3 talent tabs)
15974 uint32 const* talentTabIds = GetTalentTabPages(getClass());
15975
15976 for (uint8 i = 0; i < MAX_TALENT_TABS; ++i)
15977 {
15978 uint32 talentCount = 0;
15979 uint32 talentTabId = talentTabIds[i];
15980 for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
15981 {
15982 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
15983 if (!talentInfo)
15984 continue;
15985
15986 // skip another tab talents
15987 if (talentInfo->TalentTab != talentTabId)
15988 continue;
15989
15990 // find max talent rank (0~4)
15991 int8 curtalent_maxrank = -1;
15992 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
15993 {
15994 if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], specIdx))
15995 {
15996 curtalent_maxrank = rank;
15997 break;
15998 }
15999 }
16000
16001 // not learned talent
16002 if (curtalent_maxrank < 0)
16003 continue;
16004
16005 talentCount += curtalent_maxrank + 1;
16006 }
16007
16008 if (mostTalentCount < talentCount)
16009 {
16010 mostTalentCount = talentCount;
16011 mostTalentTabId = talentTabId;
16012 }
16013 }
16014 }
16015 return mostTalentTabId;
16016}
uint32 const * GetTalentTabPages(uint8 cls)
Definition: DBCStores.cpp:824
#define MAX_TALENT_TABS
Definition: DBCStructure.h:1920

References Unit::getClass(), GetTalentTabPages(), HasTalent(), m_activeSpec, m_specsCount, MAX_TALENT_RANK, MAX_TALENT_TABS, TalentEntry::RankID, sTalentStore, and TalentEntry::TalentTab.

Referenced by HasCasterSpec(), HasHealSpec(), HasMeleeSpec(), and HasTankSpec().

◆ GetSpecsCount()

uint8 Player::GetSpecsCount ( ) const
inline

◆ GetSpellByProto()

uint32 Player::GetSpellByProto ( ItemTemplate proto)

◆ GetSpellCooldownDelay()

uint32 Player::GetSpellCooldownDelay ( uint32  spell_id) const
16296{
16297 SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
16298 return uint32(itr != m_spellCooldowns.end() && itr->second.end > getMSTime() ? itr->second.end - getMSTime() : 0);
16299}
uint32 getMSTime()
Definition: Timer.h:103

References getMSTime(), and m_spellCooldowns.

Referenced by Aura::HandleAuraSpecificMods(), npc_brewfest_keg_reciver::MoveInLineOfSight(), and ProhibitSpellSchool().

◆ GetSpellCooldownMap() [1/2]

SpellCooldowns & Player::GetSpellCooldownMap ( )
inline
1757{ return m_spellCooldowns; }

References m_spellCooldowns.

◆ GetSpellCooldownMap() [2/2]

◆ GetSpellCooldowns()

SpellCooldowns Player::GetSpellCooldowns ( ) const
inline
2145{ return m_spellCooldowns; }

References m_spellCooldowns.

Referenced by Unit::HandleDummyAuraProc().

◆ GetSpellCritFromIntellect()

float Player::GetSpellCritFromIntellect ( )
5110{
5111 uint8 level = GetLevel();
5112 uint32 pclass = getClass();
5113
5114 if (level > GT_MAX_LEVEL)
5115 level = GT_MAX_LEVEL;
5116
5117 GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.LookupEntry(pclass - 1);
5118 GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5119 if (!critBase || !critRatio)
5120 return 0.0f;
5121
5122 float crit = critBase->base + GetStat(STAT_INTELLECT) * critRatio->ratio;
5123 return crit * 100.0f;
5124}
DBCStorage< GtChanceToSpellCritBaseEntry > sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt)
DBCStorage< GtChanceToSpellCritEntry > sGtChanceToSpellCritStore(GtChanceToSpellCritfmt)
Definition: DBCStructure.h:1062
float base
Definition: DBCStructure.h:1063
Definition: DBCStructure.h:1072
float ratio
Definition: DBCStructure.h:1073

References GtChanceToSpellCritBaseEntry::base, Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtChanceToSpellCritEntry::ratio, sGtChanceToSpellCritBaseStore, sGtChanceToSpellCritStore, and STAT_INTELLECT.

Referenced by UpdateSpellCritChance().

◆ GetSpellMap() [1/2]

PlayerSpellMap & Player::GetSpellMap ( )
inline
1754{ return m_spells; }

References m_spells.

◆ GetSpellMap() [2/2]

◆ GetSpellModList()

SpellModList const & Player::GetSpellModList ( uint32  type) const
inline
2589{ return m_spellMods[type]; }

References m_spellMods.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld().

◆ GetSpellPenetrationItemMod()

int32 Player::GetSpellPenetrationItemMod ( ) const
inline

◆ GetsRecruitAFriendBonus()

bool Player::GetsRecruitAFriendBonus ( bool  forXP)
12637{
12638 bool recruitAFriend = false;
12639 if (GetLevel() <= sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL) || !forXP)
12640 {
12641 if (Group* group = this->GetGroup())
12642 {
12643 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12644 {
12645 Player* player = itr->GetSource();
12646 if (!player || !player->IsInMap(this))
12647 continue;
12648
12649 if (!player->IsAtRecruitAFriendDistance(this))
12650 continue; // member (alive or dead) or his corpse at req. distance
12651
12652 if (forXP)
12653 {
12654 // level must be allowed to get RaF bonus
12655 if (player->GetLevel() > sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
12656 continue;
12657
12658 // level difference must be small enough to get RaF bonus, UNLESS we are lower level
12659 if (player->GetLevel() < GetLevel())
12661 continue;
12662 }
12663
12664 bool ARecruitedB = (player->GetSession()->GetRecruiterId() == GetSession()->GetAccountId());
12665 bool BRecruitedA = (GetSession()->GetRecruiterId() == player->GetSession()->GetAccountId());
12666 if (ARecruitedB || BRecruitedA)
12667 {
12668 recruitAFriend = true;
12669 break;
12670 }
12671 }
12672 }
12673 }
12674 return recruitAFriend;
12675}
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL
Definition: IWorld.h:251
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE
Definition: IWorld.h:252
bool IsInMap(WorldObject const *obj) const
Definition: Object.cpp:1285
bool IsAtRecruitAFriendDistance(WorldObject const *pOther) const
Definition: Player.cpp:12746
uint32 GetRecruiterId() const
Definition: WorldSession.h:526
uint32 GetAccountId() const
Definition: WorldSession.h:361

References CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL, CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE, WorldSession::GetAccountId(), GetGroup(), Unit::GetLevel(), WorldSession::GetRecruiterId(), GetSession(), IsAtRecruitAFriendDistance(), WorldObject::IsInMap(), GroupReference::next(), and sWorld.

Referenced by CalculateReputationGain(), GiveXP(), and SetRestBonus().

◆ GetStartPosition()

WorldLocation Player::GetStartPosition ( ) const
11357{
11358 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
11359 uint32 mapId = info->mapId;
11361 return WorldLocation(0, 2352.0f, -5709.0f, 154.5f, 0.0f);
11362 return WorldLocation(mapId, info->positionX, info->positionY, info->positionZ, 0);
11363}

References CLASS_CONTEXT_INIT, CLASS_DEATH_KNIGHT, Unit::getClass(), Unit::getRace(), HasSpell(), IsClass(), PlayerInfo::mapId, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, and sObjectMgr.

Referenced by misc_commandscript::HandleUnstuckCommand().

◆ GetStoredRaidDifficulty()

Difficulty Player::GetStoredRaidDifficulty ( ) const
inline
1900{ return m_raidMapDifficulty; } // only for use in difficulty packet after exiting to raid map

References m_raidMapDifficulty.

Referenced by SendInitialPacketsAfterAddToMap().

◆ GetSubGroup()

uint8 Player::GetSubGroup ( ) const
inline

◆ GetSummonExpireTimer()

time_t Player::GetSummonExpireTimer ( ) const
inline
1101{ return m_summon_expire; }

References m_summon_expire.

Referenced by Spell::CheckCast().

◆ GetTalentMap()

◆ GetTalentTreePoints()

void Player::GetTalentTreePoints ( uint8(&)  specPoints[3]) const
15233{
15234 const PlayerTalentMap& talentMap = GetTalentMap();
15235 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
15236 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec()))
15237 if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID))
15238 if (TalentTabEntry const* tab = sTalentTabStore.LookupEntry(talentInfo->TalentTab))
15239 if (tab->tabpage < 3)
15240 {
15241 // find current talent rank
15242 uint8 currentTalentRank = 0;
15243 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
15244 if (talentInfo->RankID[rank] && itr->first == talentInfo->RankID[rank])
15245 {
15246 currentTalentRank = rank + 1;
15247 break;
15248 }
15249 specPoints[tab->tabpage] += currentTalentRank;
15250 }
15251}

References GetActiveSpec(), GetTalentMap(), MAX_TALENT_RANK, PLAYERSPELL_REMOVED, sTalentStore, and sTalentTabStore.

Referenced by lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTeamId()

TeamId Player::GetTeamId ( bool  original = false) const
inline
2085{ return original ? TeamIdForRace(getRace(true)) : m_team; };
static TeamId TeamIdForRace(uint8 race)
Definition: Player.cpp:5787

References Unit::getRace(), m_team, and TeamIdForRace().

Referenced by ActivateTaxiPathTo(), GameObject::ActivateToQuest(), BattlegroundQueue::AddGroup(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), npc_love_in_air_snivel::AllowAction(), BattlegroundSA::AllowDefenseOfTheAncients(), LootItem::AllowedForPlayer(), Battlefield::AskToLeaveQueue(), SocialMgr::BroadcastToFriendListers(), Corpse::BuildValuesUpdate(), BuyItemFromVendorSlot(), npc_steam_powered_auctioneer::npc_steam_powered_auctioneerAI::CanBeSeen(), npc_mei_francis_mount::npc_mei_francis_mountAI::CanBeSeen(), Group::CanJoinBattlegroundQueue(), OPvPCapturePointZM_GraveYard::CanTalkTo(), CanUseItem(), BattlegroundSA::CaptureGraveyard(), ContinueTaxiFlight(), BattlegroundSA::DefendersPortalTeleport(), BattlegroundIC::DoAction(), DuelComplete(), Spell::EffectTeleportUnits(), BattlegroundAV::EventPlayerAssaultsPoint(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundIC::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), BattlegroundAV::EventPlayerDefendsPoint(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundSA::EventPlayerUsedGO(), GetBgTeamId(), Battlefield::GetClosestGraveyard(), BattlegroundAB::GetClosestGraveyard(), BattlegroundAV::GetClosestGraveyard(), BattlegroundEY::GetClosestGraveyard(), BattlegroundIC::GetClosestGraveyard(), BattlegroundSA::GetClosestGraveyard(), BattlegroundWS::GetClosestGraveyard(), SocialMgr::GetFriendInfo(), Battleground::GetRealRepFactionForPlayer(), Guild::HandleAcceptMember(), BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), BattlegroundEY::HandleAreaTrigger(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleArenaTeamAcceptOpcode(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleCalendarEventInvite(), OutdoorPvPSI::HandleDropFlag(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), Guild::HandleInviteMember(), BattlefieldWG::HandleKill(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundAV::HandleKillPlayer(), BattlegroundIC::HandleKillPlayer(), BattlegroundAV::HandleKillUnit(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleOfferPetitionOpcode(), BfCapturePoint::HandlePlayerEnter(), OPvPCapturePoint::HandlePlayerEnter(), Battlefield::HandlePlayerEnterZone(), OutdoorPvP::HandlePlayerEnterZone(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), BfCapturePoint::HandlePlayerLeave(), OPvPCapturePoint::HandlePlayerLeave(), Battlefield::HandlePlayerLeaveZone(), OutdoorPvP::HandlePlayerLeaveZone(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), BattlegroundIC::HandlePlayerResurrect(), BattlegroundAV::HandleQuestComplete(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), WorldSession::HandleSendMail(), WorldSession::HandleWhoOpcode(), Battlefield::HasPlayer(), OutdoorPvP::HasPlayer(), lfg::LFGMgr::InitializeLockedDungeons(), Channel::Invite(), Battlefield::InvitePlayerToQueue(), Battlefield::InvitePlayerToWar(), SpellArea::IsFitToRequirements(), IsGroupVisibleFor(), BfCapturePoint::IsInsideObjective(), OPvPCapturePoint::IsInsideObjective(), lfg::LFGMgr::JoinRaidBrowser(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustEngagedWith(), Unit::Kill(), lfg::LFGMgr::LfrSearchAdd(), lfg::LFGMgr::LfrSearchRemove(), lfg::LFGMgr::LfrSetComment(), LoadFromDB(), AchievementCriteriaData::Meets(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), achievement_resilient_victory::OnCheck(), achievement_bg_control_all_nodes::OnCheck(), achievement_bg_ic_resource_glut::OnCheck(), achievement_everything_counts::OnCheck(), achievement_bg_av_perfection::OnCheck(), achievement_not_even_a_scratch::OnCheck(), BattlefieldWG::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_bunthen_plainswind::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_spirit_guide::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), lfg::LFGPlayerScript::OnLogin(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::OnPlayerEnter(), instance_utgarde_keep::instance_utgarde_keep_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), BattlefieldWG::OnPlayerJoinWar(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), AreaTrigger_at_legion_teleporter::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), MidsummerPlayerScript::OnUpdateZone(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::PassengerBoarded(), Battlefield::PlayerAcceptInviteToQueue(), Battlefield::PlayerAcceptInviteToWar(), RepopAtGraveyard(), ReportedAfkBy(), RewardHonor(), RewardReputation(), Satisfy(), AchievementMgr::SendAchievementEarned(), WorldSession::SendListInventory(), SendLoot(), Acore::MessageDistDeliverer::SendPacket(), lfg::LFGMgr::SendRaidBrowserCachedList(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), ObjectMgr::SendServerMail(), WorldSession::SendSpiritResurrect(), SendTaxiNodeStatusMultiple(), WorldSession::SendTaxiStatus(), Creature::SendZoneUnderAttackMessage(), spell_item_recall::SetDest(), SetEntryPoint(), SetFactionForRace(), Channel::SetMode(), Channel::SetOwner(), npc_midsummer_torch_target::SpellHit(), BattlegroundSA::TeleportToEntrancePosition(), OPvPCapturePoint::Update(), UpdateArea(), npc_midsummer_bonfire::UpdateBonfireBlessingBuffs(), UpdateLocalChannels(), UpdateZone(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ GetTeleportDest()

WorldLocation & Player::GetTeleportDest ( )
inline

◆ GetTemporaryUnsummonedPetNumber()

uint32 Player::GetTemporaryUnsummonedPetNumber ( ) const
inline

◆ GetTotalBaseModValue()

float Player::GetTotalBaseModValue ( BaseModGroup  modGroup) const
5017{
5018 if (modGroup >= BASEMOD_END)
5019 {
5020 LOG_ERROR("entities.player", "wrong BaseModGroup in GetTotalBaseModValue()!");
5021 return 0.0f;
5022 }
5023
5024 if (m_auraBaseMod[modGroup][PCT_MOD] <= 0.0f)
5025 return 0.0f;
5026
5027 return m_auraBaseMod[modGroup][FLAT_MOD] * m_auraBaseMod[modGroup][PCT_MOD];
5028}

References BASEMOD_END, FLAT_MOD, LOG_ERROR, m_auraBaseMod, and PCT_MOD.

◆ GetTotalPercentageModValue()

float Player::GetTotalPercentageModValue ( BaseModGroup  modGroup) const
inline
2173{ return m_auraBaseMod[modGroup][FLAT_MOD] + m_auraBaseMod[modGroup][PCT_MOD]; }

References FLAT_MOD, m_auraBaseMod, and PCT_MOD.

Referenced by UpdateCritPercentage().

◆ GetTotalPlayedTime()

◆ GetTradeData()

◆ GetTrader()

Player * Player::GetTrader ( ) const
inline
1367{ return m_trade ? m_trade->GetTrader() : nullptr; }
Player * GetTrader() const
Definition: TradeData.h:41

References TradeData::GetTrader(), and m_trade.

Referenced by WorldSession::moveItems(), and UpdatePosition().

◆ GetTrainerSpellState()

TrainerSpellState Player::GetTrainerSpellState ( TrainerSpell const *  trainer_spell) const
3878{
3879 if (!trainer_spell)
3880 return TRAINER_SPELL_RED;
3881
3882 bool hasSpell = true;
3883 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3884 {
3885 if (!trainer_spell->learnedSpell[i])
3886 continue;
3887
3888 if (!HasSpell(trainer_spell->learnedSpell[i]))
3889 {
3890 hasSpell = false;
3891 break;
3892 }
3893 }
3894 // known spell
3895 if (hasSpell)
3896 return TRAINER_SPELL_GRAY;
3897
3898 // check skill requirement
3899 if (trainer_spell->reqSkill && GetBaseSkillValue(trainer_spell->reqSkill) < trainer_spell->reqSkillValue)
3900 return TRAINER_SPELL_RED;
3901
3902 // check level requirement
3903 if (GetLevel() < trainer_spell->reqLevel)
3904 return TRAINER_SPELL_RED;
3905
3906 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3907 {
3908 if (!trainer_spell->learnedSpell[i])
3909 continue;
3910
3911 // check race/class requirement
3912 if (!IsSpellFitByClassAndRace(trainer_spell->learnedSpell[i]))
3913 return TRAINER_SPELL_RED;
3914
3915 if (uint32 prevSpell = sSpellMgr->GetPrevSpellInChain(trainer_spell->learnedSpell[i]))
3916 {
3917 // check prev.rank requirement
3918 if (prevSpell && !HasSpell(prevSpell))
3919 return TRAINER_SPELL_RED;
3920 }
3921
3922 SpellsRequiringSpellMapBounds spellsRequired = sSpellMgr->GetSpellsRequiredForSpellBounds(trainer_spell->learnedSpell[i]);
3923 for (SpellsRequiringSpellMap::const_iterator itr = spellsRequired.first; itr != spellsRequired.second; ++itr)
3924 {
3925 // check additional spell requirement
3926 if (!HasSpell(itr->second))
3927 return TRAINER_SPELL_RED;
3928 }
3929 }
3930
3931 // check primary prof. limit
3932 // first rank of primary profession spell when there are no proffesions avalible is disabled
3933 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3934 {
3935 if (!trainer_spell->learnedSpell[i])
3936 continue;
3937 SpellInfo const* learnedSpellInfo = sSpellMgr->GetSpellInfo(trainer_spell->learnedSpell[i]);
3938 if (learnedSpellInfo && learnedSpellInfo->IsPrimaryProfessionFirstRank() && (GetFreePrimaryProfessionPoints() == 0))
3940 }
3941
3942 return TRAINER_SPELL_GREEN;
3943}
std::pair< SpellsRequiringSpellMap::const_iterator, SpellsRequiringSpellMap::const_iterator > SpellsRequiringSpellMapBounds
Definition: SpellMgr.h:570
@ TRAINER_SPELL_GREEN
Definition: Player.h:213
@ TRAINER_SPELL_GRAY
Definition: Player.h:215
@ TRAINER_SPELL_GREEN_DISABLED
Definition: Player.h:216
@ TRAINER_SPELL_RED
Definition: Player.h:214
bool IsSpellFitByClassAndRace(uint32 spell_id) const
Definition: Player.cpp:12310

References GetBaseSkillValue(), GetFreePrimaryProfessionPoints(), Unit::GetLevel(), HasSpell(), SpellInfo::IsPrimaryProfessionFirstRank(), IsSpellFitByClassAndRace(), TrainerSpell::learnedSpell, MAX_SPELL_EFFECTS, TrainerSpell::reqLevel, TrainerSpell::reqSkill, TrainerSpell::reqSkillValue, sSpellMgr, TRAINER_SPELL_GRAY, TRAINER_SPELL_GREEN, TRAINER_SPELL_GREEN_DISABLED, and TRAINER_SPELL_RED.

Referenced by WorldSession::HandleTrainerBuySpellOpcode(), and WorldSession::SendTrainerList().

◆ GetUseableItemByPos()

Item * Player::GetUseableItemByPos ( uint8  bag,
uint8  slot 
) const
inline

◆ GetViewpoint()

WorldObject * Player::GetViewpoint ( ) const
13161{
13163 return static_cast<WorldObject*>(ObjectAccessor::GetObjectByTypeMask(*this, guid, TYPEMASK_SEER));
13164 return nullptr;
13165}
@ TYPEMASK_SEER
Definition: ObjectGuid.h:54
Object * GetObjectByTypeMask(WorldObject const &, ObjectGuid const guid, uint32 typemask)
Definition: ObjectAccessor.cpp:144
Definition: Object.h:405

References Object::GetGuidValue(), ObjectAccessor::GetObjectByTypeMask(), PLAYER_FARSIGHT, and TYPEMASK_SEER.

Referenced by CinematicMgr::EndCinematic(), WorldSession::HandleFarSightOpcode(), ArenaSpectator::HandleSpectatorWatchCommand(), RemoveFromWorld(), StopCastingBindSight(), and Map::Update().

◆ GetWeaponForAttack()

Item * Player::GetWeaponForAttack ( WeaponAttackType  attackType,
bool  useable = false 
) const

◆ GetWeaponProficiency()

uint32 Player::GetWeaponProficiency ( ) const
inline
1352{ return m_WeaponProficiency; }

References m_WeaponProficiency.

Referenced by Spell::EffectProficiency().

◆ GetXPRestBonus()

uint32 Player::GetXPRestBonus ( uint32  xp)
8816{
8817 uint32 rested_bonus = (uint32)GetRestBonus(); // xp for each rested bonus
8818
8819 if (rested_bonus > xp) // max rested_bonus == xp or (r+x) = 200% xp
8820 rested_bonus = xp;
8821
8822 SetRestBonus(GetRestBonus() - rested_bonus);
8823
8824 LOG_DEBUG("entities.player", "Player gain {} xp (+ {} Rested Bonus). Rested points={}", xp + rested_bonus, rested_bonus, GetRestBonus());
8825 return rested_bonus;
8826}
void SetRestBonus(float rest_bonus_new)
Definition: Player.cpp:10156
float GetRestBonus() const
Definition: Player.h:1194

References GetRestBonus(), LOG_DEBUG, and SetRestBonus().

Referenced by GiveXP().

◆ GetZoneIdFromDB()

uint32 Player::GetZoneIdFromDB ( ObjectGuid  guid)
static
6275{
6276 ObjectGuid::LowType guidLow = guid.GetCounter();
6277
6279 stmt->SetData(0, guidLow);
6280 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6281
6282 if (!result)
6283 return 0;
6284
6285 Field* fields = result->Fetch();
6286 uint32 zone = fields[0].Get<uint16>();
6287
6288 if (!zone)
6289 {
6290 // stored zone is zero, use generic and slow zone detection
6291 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_POSITION_XYZ);
6292 stmt->SetData(0, guidLow);
6293 PreparedQueryResult posResult = CharacterDatabase.Query(stmt);
6294
6295 if (!posResult)
6296 {
6297 return 0;
6298 }
6299
6300 fields = posResult->Fetch();
6301 uint32 map = fields[0].Get<uint16>();
6302 float posx = fields[1].Get<float>();
6303 float posy = fields[2].Get<float>();
6304 float posz = fields[3].Get<float>();
6305
6306 if (!sMapStore.LookupEntry(map))
6307 return 0;
6308
6309 zone = sMapMgr->GetZoneId(PHASEMASK_NORMAL, map, posx, posy, posz);
6310
6311 if (zone > 0)
6312 {
6313 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ZONE);
6314
6315 stmt->SetData(0, uint16(zone));
6316 stmt->SetData(1, guidLow);
6317
6318 CharacterDatabase.Execute(stmt);
6319 }
6320 }
6321
6322 return zone;
6323}
@ CHAR_SEL_CHAR_POSITION_XYZ
Definition: CharacterDatabase.h:53
@ CHAR_UPD_ZONE
Definition: CharacterDatabase.h:294
@ CHAR_SEL_CHAR_ZONE
Definition: CharacterDatabase.h:51

References CHAR_SEL_CHAR_POSITION_XYZ, CHAR_SEL_CHAR_ZONE, CHAR_UPD_ZONE, CharacterDatabase, Field::Get(), ObjectGuid::GetCounter(), PHASEMASK_NORMAL, PreparedStatementBase::SetData(), sMapMgr, and sMapStore.

Referenced by Guild::Member::LoadFromDB().

◆ GiveLevel()

void Player::GiveLevel ( uint8  level)
Todo:
find some better solution
2447{
2448 uint8 oldLevel = GetLevel();
2449 if (level == oldLevel)
2450 return;
2451
2452 if (Guild* guild = GetGuild())
2453 guild->UpdateMemberData(this, GUILD_MEMBER_DATA_LEVEL, level);
2454
2455 PlayerLevelInfo info;
2456 sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), level, &info);
2457
2458 PlayerClassLevelInfo classInfo;
2459 sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, &classInfo);
2460
2462 packet.Level = level;
2463 packet.HealthDelta = int32(classInfo.basehealth) - int32(GetCreateHealth());
2464
2466 // for (int i = 0; i < MAX_POWERS; ++i)
2467 packet.PowerDelta[0] = int32(classInfo.basemana) - int32(GetCreateMana());
2468 packet.PowerDelta[1] = 0;
2469 packet.PowerDelta[2] = 0;
2470 packet.PowerDelta[3] = 0;
2471 packet.PowerDelta[4] = 0;
2472 packet.PowerDelta[5] = 0;
2473
2474 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2475 packet.StatDelta[i] = int32(info.stats[i]) - GetCreateStat(Stats(i));
2476
2477 SendDirectMessage(packet.Write());
2478
2479 SetUInt32Value(PLAYER_NEXT_LEVEL_XP, sObjectMgr->GetXPForLevel(level));
2480
2481 //update level, max level of skills
2482 m_Played_time[PLAYED_TIME_LEVEL] = 0; // Level Played Time reset
2483
2485
2486 SetLevel(level);
2487
2489
2490 // save base values (bonuses already included in stored stats
2491 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2492 SetCreateStat(Stats(i), info.stats[i]);
2493
2494 SetCreateHealth(classInfo.basehealth);
2495 SetCreateMana(classInfo.basemana);
2496
2500
2502
2503 if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL)) // Max weapon skill when leveling up
2505
2507
2508 // set current level health and mana/energy to maximum after applying all mods.
2509 SetFullHealth();
2516
2517 // update level to hunter/summon pet
2518 if (Pet* pet = GetPet())
2519 pet->SynchronizeLevelWithOwner();
2520
2521 MailLevelReward const* mailReward = sObjectMgr->GetMailLevelReward(level, getRaceMask());
2522 if (mailReward && sScriptMgr->CanGiveMailRewardAtGiveLevel(this, level))
2523 {
2524 //- TODO: Poor design of mail system
2525 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2526 MailDraft(mailReward->mailTemplateId).SendMailTo(trans, this, MailSender(MAIL_CREATURE, mailReward->senderEntry));
2527 CharacterDatabase.CommitTransaction(trans);
2528 }
2529
2531
2532 // Refer-A-Friend
2533 if (GetSession()->GetRecruiterId())
2534 if (level < sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
2535 if (level % 2 == 0)
2536 {
2538
2539 if (!HasByteFlag(PLAYER_FIELD_BYTES, 1, 0x01))
2541 }
2542
2544
2545 sScriptMgr->OnPlayerLevelChanged(this, oldLevel);
2546}
@ GUILD_MEMBER_DATA_LEVEL
Definition: Guild.h:62
@ PLAYER_NEXT_LEVEL_XP
Definition: UpdateFields.h:340
@ CONFIG_ALWAYS_MAXSKILL
Definition: IWorld.h:133
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL
Definition: DBCEnums.h:124
@ POWER_RAGE
Definition: SharedDefines.h:270
@ POWER_HAPPINESS
Definition: SharedDefines.h:273
@ POWER_ENERGY
Definition: SharedDefines.h:272
@ POWER_FOCUS
Definition: SharedDefines.h:271
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition: Object.cpp:949
Definition: Player.h:289
uint32 basehealth
Definition: Player.h:291
uint32 basemana
Definition: Player.h:292
Definition: Player.h:303
std::array< uint32, MAX_STATS > stats
Definition: Player.h:309
void _ApplyAllLevelScaleItemMods(bool apply)
Definition: Player.cpp:7568
void UpdateSkillsToMaxSkillsForLevel()
Definition: PlayerUpdates.cpp:1085
Guild * GetGuild() const
Definition: Player.cpp:15955
void UpdateSkillsForLevel()
Definition: PlayerUpdates.cpp:1034
void SendQuestGiverStatusMultiple()
Definition: Player.cpp:7645
void SetCreateStat(Stats stat, float val)
Definition: Unit.h:1380
void SetCreateHealth(uint32 val)
Definition: Unit.h:1381
void SetCreateMana(uint32 val)
Definition: Unit.h:1383
void SetLevel(uint8 lvl, bool showLevelChange=true)
Definition: Unit.cpp:15398
uint32 GetCreateHealth() const
Definition: Unit.h:1382
uint32 GetCreateMana() const
Definition: Unit.h:1384
Definition: ObjectMgr.h:543
uint32 senderEntry
Definition: ObjectMgr.h:549
uint32 mailTemplateId
Definition: ObjectMgr.h:548
Definition: MiscPackets.h:45
uint32 Level
Definition: MiscPackets.h:51
std::array< uint32, MAX_STATS > StatDelta
Definition: MiscPackets.h:54
std::array< uint32, MAX_POWERS > PowerDelta
Definition: MiscPackets.h:53
uint32 HealthDelta
Definition: MiscPackets.h:52
WorldPacket const * Write() override
Definition: MiscPackets.cpp:34

References _ApplyAllLevelScaleItemMods(), ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL, PlayerClassLevelInfo::basehealth, PlayerClassLevelInfo::basemana, CharacterDatabase, CONFIG_ALWAYS_MAXSKILL, CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL, Unit::getClass(), Unit::GetCreateHealth(), Unit::GetCreateMana(), Unit::GetCreateStat(), GetGuild(), Unit::GetLevel(), Unit::GetMaxPower(), GetPet(), Unit::GetPower(), Unit::getRace(), Unit::getRaceMask(), GetSession(), GUILD_MEMBER_DATA_LEVEL, Object::HasByteFlag(), WorldPackets::Misc::LevelUpInfo::HealthDelta, InitGlyphsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), WorldPackets::Misc::LevelUpInfo::Level, m_grantableLevels, m_Played_time, MAIL_CREATURE, MailLevelReward::mailTemplateId, MAX_STATS, PLAYED_TIME_LEVEL, PLAYER_FIELD_BYTES, PLAYER_NEXT_LEVEL_XP, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, WorldPackets::Misc::LevelUpInfo::PowerDelta, SendDirectMessage(), MailLevelReward::senderEntry, MailDraft::SendMailTo(), SendQuestGiverStatusMultiple(), Object::SetByteFlag(), Unit::SetCreateHealth(), Unit::SetCreateMana(), Unit::SetCreateStat(), Unit::SetFullHealth(), Unit::SetLevel(), Unit::SetPower(), Unit::SetUInt32Value(), sObjectMgr, sScriptMgr, STAT_STRENGTH, WorldPackets::Misc::LevelUpInfo::StatDelta, PlayerLevelInfo::stats, sWorld, UpdateAchievementCriteria(), UpdateAllStats(), UpdateSkillsForLevel(), UpdateSkillsToMaxSkillsForLevel(), and WorldPackets::Misc::LevelUpInfo::Write().

Referenced by GiveXP(), WorldSession::HandleAcceptGrantLevel(), and character_commandscript::HandleCharacterLevel().

◆ GiveQuestSourceItem()

bool Player::GiveQuestSourceItem ( Quest const *  quest)
1330{
1331 uint32 srcitem = quest->GetSrcItemId();
1332 if (srcitem > 0)
1333 {
1334 uint32 count = quest->GetSrcItemCount();
1335 if (count <= 0)
1336 count = 1;
1337
1338 ItemPosCountVec dest;
1339 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count);
1340 if (msg == EQUIP_ERR_OK)
1341 {
1342 Item* item = StoreNewItem(dest, srcitem, true);
1343 SendNewItem(item, count, true, false);
1344 return true;
1345 }
1346 // player already have max amount required item, just report success
1347 else if (msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS)
1348 return true;
1349 else
1350 SendEquipError(msg, nullptr, nullptr, srcitem);
1351 return false;
1352 }
1353
1354 return true;
1355}

References CanStoreNewItem(), EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), NULL_BAG, NULL_SLOT, SendEquipError(), SendNewItem(), and StoreNewItem().

Referenced by AddQuest().

◆ GiveXP()

void Player::GiveXP ( uint32  xp,
Unit victim,
float  group_rate = 1.0f,
bool  isLFGReward = false 
)
2372{
2373 if (xp < 1)
2374 {
2375 return;
2376 }
2377
2378 if (!IsAlive() && !GetBattlegroundId() && !isLFGReward)
2379 {
2380 return;
2381 }
2382
2384 {
2385 return;
2386 }
2387
2388 if (victim && victim->IsCreature() && !victim->ToCreature()->hasLootRecipient())
2389 {
2390 return;
2391 }
2392
2393 uint8 level = GetLevel();
2394
2395 // Favored experience increase START
2396 uint32 zone = GetZoneId();
2397 float favored_exp_mult = 0;
2398 if ((zone == 3483 || zone == 3562 || zone == 3836 || zone == 3713 || zone == 3714) && (HasAura(32096) || HasAura(32098)))
2399 favored_exp_mult = 0.05f; // Thrallmar's Favor and Honor Hold's Favor
2400
2401 xp = uint32(xp * (1 + favored_exp_mult));
2402 // Favored experience increase END
2403
2404 // XP to money conversion processed in Player::RewardQuest
2405 if (level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2406 return;
2407
2408 uint32 bonus_xp = 0;
2409 bool recruitAFriend = GetsRecruitAFriendBonus(true);
2410
2411 // RaF does NOT stack with rested experience
2412 if (recruitAFriend)
2413 bonus_xp = 2 * xp; // xp + bonus_xp must add up to 3 * xp for RaF; calculation for quests done client-side
2414 else
2415 bonus_xp = victim ? GetXPRestBonus(xp) : 0; // XP resting bonus
2416
2417 // hooks and multipliers can modify the xp with a zero or negative value
2418 // check again before sending invalid xp to the client
2419 if (xp < 1)
2420 {
2421 return;
2422 }
2423
2424 SendLogXPGain(xp, victim, bonus_xp, recruitAFriend, group_rate);
2425
2428 uint32 newXP = curXP + xp + bonus_xp;
2429
2430 while (newXP >= nextLvlXP && level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2431 {
2432 newXP -= nextLvlXP;
2433
2434 if (level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2435 GiveLevel(level + 1);
2436
2437 level = GetLevel();
2439 }
2440
2441 SetUInt32Value(PLAYER_XP, newXP);
2442}
@ PLAYER_FLAGS_NO_XP_GAIN
Definition: Player.h:499
bool hasLootRecipient() const
Definition: Creature.h:232
bool IsCreature() const
Definition: Object.h:201
void GiveLevel(uint8 level)
Definition: Player.cpp:2446
uint32 GetXPRestBonus(uint32 xp)
Definition: Player.cpp:8815
void SendLogXPGain(uint32 GivenXP, Unit *victim, uint32 BonusXP, bool recruitAFriend=false, float group_rate=1.0f)
Definition: Player.cpp:2352

References CONFIG_MAX_PLAYER_LEVEL, GetBattlegroundId(), Unit::GetLevel(), GetsRecruitAFriendBonus(), Object::GetUInt32Value(), GetXPRestBonus(), WorldObject::GetZoneId(), GiveLevel(), Unit::HasAura(), Creature::hasLootRecipient(), HasPlayerFlag(), Unit::IsAlive(), Object::IsCreature(), PLAYER_FLAGS_NO_XP_GAIN, PLAYER_NEXT_LEVEL_XP, PLAYER_XP, SendLogXPGain(), Unit::SetUInt32Value(), sWorld, and Object::ToCreature().

Referenced by KillRewarder::_RewardXP(), CheckAreaExploreAndOutdoor(), RewardHonor(), and RewardQuest().

◆ GroupEventHappens()

void Player::GroupEventHappens ( uint32  questId,
WorldObject const *  pEventObject 
)
1813{
1814 if (Group* group = GetGroup())
1815 {
1816 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
1817 {
1818 Player* player = itr->GetSource();
1819
1820 // for any leave or dead (with not released body) group member at appropriate distance
1821 if (player && player->IsAtGroupRewardDistance(pEventObject) && !player->GetCorpse())
1822 player->AreaExploredOrEventHappens(questId);
1823 }
1824 }
1825 else
1827}
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition: Player.cpp:12710
void AreaExploredOrEventHappens(uint32 questId)
Definition: PlayerQuest.cpp:1785

References AreaExploredOrEventHappens(), GetCorpse(), GetGroup(), IsAtGroupRewardDistance(), and GroupReference::next().

Referenced by SmartAI::EndPath(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), Map::ScriptsProcess(), SmartAI::StopFollow(), npc_crusade_persuaded::npc_crusade_persuadedAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_rinji::npc_rinjiAI::WaypointReached(), npc_corporal_keeshan::npc_corporal_keeshanAI::WaypointReached(), npc_deathstalker_erland::npc_deathstalker_erlandAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached(), npc_gilthares::npc_giltharesAI::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_bonker_togglevolt::npc_bonker_togglevoltAI::WaypointReached(), npc_emily::npc_emilyAI::WaypointReached(), npc_apothecary_hanes::npc_Apothecary_HanesAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::WaypointReached(), npc_bessy::npc_bessyAI::WaypointReached(), npc_kservant::npc_kservantAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleBaseModValue()

void Player::HandleBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType,
float  amount,
bool  apply 
)
4963{
4964 if (modGroup >= BASEMOD_END)
4965 {
4966 LOG_ERROR("entities.player", "ERROR in HandleBaseModValue(): non existed BaseModGroup!");
4967 return;
4968 }
4969
4970 switch (modType)
4971 {
4972 case FLAT_MOD:
4973 m_auraBaseMod[modGroup][modType] += apply ? amount : -amount;
4974 break;
4975 case PCT_MOD:
4976 ApplyPercentModFloatVar(m_auraBaseMod[modGroup][modType], amount, apply);
4977 break;
4978 }
4979
4980 if (!CanModifyStats())
4981 return;
4982
4983 switch (modGroup)
4984 {
4985 case CRIT_PERCENTAGE:
4987 break;
4990 break;
4993 break;
4994 case SHIELD_BLOCK_VALUE:
4996 break;
4997 default:
4998 break;
4999 }
5000}
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition: Util.h:50
void UpdateShieldBlockValue()
Definition: StatSystem.cpp:522
void UpdateCritPercentage(WeaponAttackType attType)
Definition: StatSystem.cpp:641

References ApplyPercentModFloatVar(), BASE_ATTACK, BASEMOD_END, Unit::CanModifyStats(), CRIT_PERCENTAGE, FLAT_MOD, LOG_ERROR, m_auraBaseMod, OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, PCT_MOD, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, SHIELD_BLOCK_VALUE, UpdateCritPercentage(), and UpdateShieldBlockValue().

Referenced by _ApplyItemBonuses(), _ApplyWeaponDependentAuraCritMod(), ApplyEnchantment(), AuraEffect::HandleAuraModCritPct(), AuraEffect::HandleAuraModWeaponCritPercent(), and AuraEffect::HandleShieldBlockValue().

◆ HandleDrowning()

void Player::HandleDrowning ( uint32  time_diff)
protected
Todo:
: Check this formula
Todo:
: Check this formula
835{
837 return;
838
839 // In water
841 {
842 // Breath timer not activated - activate it
844 {
847 }
848 else // If activated - do tick
849 {
850 m_MirrorTimer[BREATH_TIMER] -= time_diff;
851 // Timer limit - need deal damage
853 {
855 // Calculate and deal damage
857 uint32 damage = GetMaxHealth() / 5 + urand(0, GetLevel() - 1);
859 }
860 else if (!(m_MirrorTimerFlagsLast & UNDERWATER_INWATER)) // Update time in client if need
862 }
863 }
864 else if (m_MirrorTimer[BREATH_TIMER] != DISABLED_MIRROR_TIMER) // Regen timer
865 {
866 int32 UnderWaterTime = getMaxTimer(BREATH_TIMER);
867 // Need breath regen
868 m_MirrorTimer[BREATH_TIMER] += 10 * time_diff;
869 if (m_MirrorTimer[BREATH_TIMER] >= UnderWaterTime || !IsAlive())
873 }
874
875 // In dark water
877 {
878 // Fatigue timer not activated - activate it
880 {
883 }
884 else
885 {
886 m_MirrorTimer[FATIGUE_TIMER] -= time_diff;
887 // Timer limit - need deal damage or teleport ghost to graveyard
889 {
891 if (IsAlive()) // Calculate and deal damage
892 {
893 uint32 damage = GetMaxHealth() / 5 + urand(0, GetLevel() - 1);
895 }
896 else if (HasPlayerFlag(PLAYER_FLAGS_GHOST)) // Teleport ghost to graveyard
898 }
901 }
902 }
903 else if (m_MirrorTimer[FATIGUE_TIMER] != DISABLED_MIRROR_TIMER) // Regen timer
904 {
905 int32 DarkWaterTime = getMaxTimer(FATIGUE_TIMER);
906 m_MirrorTimer[FATIGUE_TIMER] += 10 * time_diff;
907 if (m_MirrorTimer[FATIGUE_TIMER] >= DarkWaterTime || !IsAlive())
911 }
912
913 if (m_MirrorTimerFlags & (UNDERWATER_INLAVA /*| UNDERWATER_INSLIME*/) && !(_lastLiquid && _lastLiquid->SpellId))
914 {
915 // Breath timer not activated - activate it
918 else
919 {
920 m_MirrorTimer[FIRE_TIMER] -= time_diff;
921 if (m_MirrorTimer[FIRE_TIMER] < 0)
922 {
923 m_MirrorTimer[FIRE_TIMER] += 2020;
924 // Calculate and deal damage
926 uint32 damage = urand(600, 700);
929 // need to skip Slime damage in Undercity,
930 // maybe someone can find better way to handle environmental damage
931 //else if (m_zoneUpdateId != 1497)
932 // EnvironmentalDamage(DAMAGE_SLIME, damage);
933 }
934 }
935 }
936 else
938
939 // Recheck timers flag
940 m_MirrorTimerFlags &= ~UNDERWATER_EXIST_TIMERS;
941 for (uint8 i = 0; i < MAX_TIMERS; ++i)
943 {
945 break;
946 }
948}
@ DAMAGE_DROWNING
Definition: Player.h:835
@ DAMAGE_EXHAUSTED
Definition: Player.h:834
@ UNDERWATER_INDARKWATER
Definition: Player.h:104
@ UNDERWATER_EXIST_TIMERS
Definition: Player.h:106
@ UNDERWATER_INWATER
Definition: Player.h:101
@ UNDERWATER_INLAVA
Definition: Player.h:102
void SendMirrorTimer(MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen)
Definition: Player.cpp:731
uint32 EnvironmentalDamage(EnviromentalDamage type, uint32 damage)
Definition: Player.cpp:754
void RepopAtGraveyard()
Definition: Player.cpp:4863
int32 getMaxTimer(MirrorTimerType timer)
Definition: Player.cpp:807
void StopMirrorTimer(MirrorTimerType Type)
Definition: Player.cpp:742
LiquidTypeEntry const * _lastLiquid
Definition: Unit.h:1881
uint32 SpellId
Definition: DBCStructure.h:1289

References Unit::_lastLiquid, BREATH_TIMER, DAMAGE_DROWNING, DAMAGE_EXHAUSTED, DAMAGE_LAVA, DISABLED_MIRROR_TIMER, EnvironmentalDamage(), FATIGUE_TIMER, FIRE_TIMER, Unit::GetLevel(), Unit::GetMaxHealth(), getMaxTimer(), HasPlayerFlag(), IN_MILLISECONDS, Unit::IsAlive(), m_MirrorTimer, m_MirrorTimerFlags, m_MirrorTimerFlagsLast, MAX_TIMERS, PLAYER_FLAGS_GHOST, RepopAtGraveyard(), SendMirrorTimer(), LiquidTypeEntry::SpellId, StopMirrorTimer(), UNDERWATER_EXIST_TIMERS, UNDERWATER_INDARKWATER, UNDERWATER_INLAVA, UNDERWATER_INWATER, and urand().

Referenced by Update().

◆ HandleFall()

void Player::HandleFall ( MovementInfo const &  movementInfo)
13797{
13798 // calculate total z distance of the fall
13799 float z_diff = m_lastFallZ - movementInfo.pos.GetPositionZ();
13800
13801 //Players with low fall distance, Feather Fall or physical immunity (charges used) are ignored
13802 // 14.57 can be calculated by resolving damageperc formula below to 0
13803 if (z_diff >= 14.57f && !isDead() && !IsGameMaster() && !GetCommandStatus(CHEAT_GOD) &&
13806 {
13807 //Safe fall, fall height reduction
13809
13810 float damageperc = 0.018f * (z_diff - safe_fall) - 0.2426f;
13811 uint32 original_health = GetHealth(), final_damage = 0;
13812
13814 {
13815 uint32 damage = (uint32)(damageperc * GetMaxHealth() * sWorld->getRate(RATE_DAMAGE_FALL));
13816
13817 //float height = movementInfo.pos.m_positionZ;
13818 //UpdateGroundPositionZ(movementInfo.pos.m_positionX, movementInfo.pos.m_positionY, height);
13819
13820 if (damage > 0)
13821 {
13822 //Prevent fall damage from being more than the player maximum health
13823 if (damage > GetMaxHealth())
13824 damage = GetMaxHealth();
13825
13826 // Gust of Wind
13827 if (HasAura(43621))
13828 damage = GetMaxHealth() / 2;
13829
13830 // Divine Protection
13831 if (HasAura(498))
13832 {
13833 damage /= 2;
13834 }
13835
13836 final_damage = EnvironmentalDamage(DAMAGE_FALL, damage);
13837 }
13838
13839 //Z given by moveinfo, LastZ, FallTime, WaterZ, MapZ, Damage, Safefall reduction
13840 LOG_DEBUG("entities.player", "FALLDAMAGE mZ={} z={} fallTime={} damage={} SF={}", movementInfo.pos.GetPositionZ(), GetPositionZ(), movementInfo.fallTime, damage, safe_fall);
13841 }
13842
13843 // recheck alive, might have died of EnvironmentalDamage, avoid cases when player die in fact like Spirit of Redemption case
13844 if (IsAlive() && final_damage < original_health)
13846 }
13847}
@ SPELL_AURA_FLY
Definition: SpellAuraDefines.h:264
@ SPELL_AURA_SAFE_FALL
Definition: SpellAuraDefines.h:207
@ CHEAT_GOD
Definition: Player.h:999
@ RATE_DAMAGE_FALL
Definition: IWorld.h:505
@ ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING
Definition: DBCEnums.h:139
bool GetCommandStatus(uint32 command) const
Definition: Player.h:1178
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12841
bool isDead() const
Definition: Unit.h:1153

References ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, CHEAT_GOD, DAMAGE_FALL, EnvironmentalDamage(), MovementInfo::fallTime, GetCommandStatus(), Unit::GetHealth(), Unit::GetMaxHealth(), Position::GetPositionZ(), Unit::GetTotalAuraModifier(), Unit::HasAura(), Unit::HasAuraType(), Unit::IsAlive(), Unit::isDead(), IsGameMaster(), Unit::IsImmunedToDamageOrSchool(), LOG_DEBUG, m_lastFallZ, MovementInfo::pos, RATE_DAMAGE_FALL, SPELL_AURA_FEATHER_FALL, SPELL_AURA_FLY, SPELL_AURA_HOVER, SPELL_AURA_SAFE_FALL, SPELL_SCHOOL_MASK_NORMAL, sWorld, and UpdateAchievementCriteria().

Referenced by WorldSession::HandleMovementOpcodes().

◆ HandleSobering()

void Player::HandleSobering ( )
protected

The player sobers by 1% every 9 seconds.

952{
953 m_drunkTimer = 0;
954
955 uint8 currentDrunkValue = GetDrunkValue();
956 uint8 drunk = currentDrunkValue ? --currentDrunkValue : 0;
957 SetDrunkValue(drunk);
958}
void SetDrunkValue(uint8 newDrunkValue, uint32 itemId=0)
Definition: Player.cpp:971

References GetDrunkValue(), m_drunkTimer, and SetDrunkValue().

Referenced by Update().

◆ Has310Flyer()

bool Player::Has310Flyer ( bool  checkAllSpells,
uint32  excludeSpellId = 0 
)
3466{
3467 if (!checkAllSpells)
3469 else
3470 {
3471 SetHas310Flyer(false);
3472 SpellInfo const* spellInfo;
3473 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
3474 {
3475 // pussywizard:
3476 if (itr->second->State == PLAYERSPELL_REMOVED)
3477 continue;
3478
3479 if (itr->first == excludeSpellId)
3480 continue;
3481
3482 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(itr->first);
3483 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
3484 {
3485 if (_spell_idx->second->SkillLine != SKILL_MOUNTS)
3486 break; // We can break because mount spells belong only to one skillline (at least 310 flyers do)
3487
3488 spellInfo = sSpellMgr->AssertSpellInfo(itr->first);
3489 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3490 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&
3491 spellInfo->Effects[i].CalcValue() == 310)
3492 {
3493 SetHas310Flyer(true);
3494 return true;
3495 }
3496 }
3497 }
3498 }
3499
3500 return false;
3501}
@ PLAYER_EXTRA_HAS_310_FLYER
Definition: Player.h:590

References SpellInfo::Effects, m_ExtraFlags, m_spells, MAX_SPELL_EFFECTS, PLAYER_EXTRA_HAS_310_FLYER, PLAYERSPELL_REMOVED, SetHas310Flyer(), SKILL_MOUNTS, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, and sSpellMgr.

Referenced by _addSpell(), and removeSpell().

◆ HasAchieved()

bool Player::HasAchieved ( uint32  achievementId) const
13865{
13866 return m_achievementMgr->HasAchieved(achievementId);
13867}
bool HasAchieved(uint32 achievementId) const
Definition: AchievementMgr.cpp:2434

References AchievementMgr::HasAchieved(), and m_achievementMgr.

Referenced by _LoadBrewOfTheMonth(), spell_gen_on_tournament_mount::GetPennatSpellId(), BattlegroundIC::HandleAreaTrigger(), lfg::LFGMgr::InitializeLockedDungeons(), and Satisfy().

◆ HasActivePowerType()

bool Player::HasActivePowerType ( Powers  power)
overridevirtual

Reimplemented from Unit.

2737{
2738 if (sScriptMgr->OnPlayerHasActivePowerType(this, power))
2739 return true;
2740 else
2741 return (getPowerType() == power);
2742}

References Unit::getPowerType(), and sScriptMgr.

Referenced by Create(), and ResetAllPowers().

◆ HasActiveSpell()

bool Player::HasActiveSpell ( uint32  spell) const
3872{
3873 PlayerSpellMap::const_iterator itr = m_spells.find(spell);
3874 return (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->Active && itr->second->IsInSpec(m_activeSpec));
3875}

References m_activeSpec, m_spells, and PLAYERSPELL_REMOVED.

Referenced by _AddSpellCooldown(), ActivateSpec(), spell_dk_dancing_rune_weapon::CheckProc(), WorldSession::HandleCastSpellOpcode(), and learnSpell().

◆ HasAtLoginFlag()

◆ HasCasterSpec()

bool Player::HasCasterSpec ( )
16060{
16061 switch (GetSpec(GetActiveSpec()))
16062 {
16075 return true;
16076 default:
16077 break;
16078 }
16079 return false;
16080}
@ TALENT_TREE_HUNTER_SURVIVAL
Definition: Player.h:153
@ TALENT_TREE_MAGE_FIRE
Definition: Player.h:167
@ TALENT_TREE_PRIEST_SHADOW
Definition: Player.h:159
@ TALENT_TREE_SHAMAN_ELEMENTAL
Definition: Player.h:163
@ TALENT_TREE_HUNTER_BEAST_MASTERY
Definition: Player.h:151
@ TALENT_TREE_WARLOCK_DEMONOLOGY
Definition: Player.h:170
@ TALENT_TREE_WARLOCK_DESTRUCTION
Definition: Player.h:171
@ TALENT_TREE_WARLOCK_AFFLICTION
Definition: Player.h:169
@ TALENT_TREE_MAGE_ARCANE
Definition: Player.h:166
@ TALENT_TREE_MAGE_FROST
Definition: Player.h:168
@ TALENT_TREE_DRUID_BALANCE
Definition: Player.h:172
@ TALENT_TREE_HUNTER_MARKSMANSHIP
Definition: Player.h:152
uint32 GetSpec(int8 spec=-1)
Definition: Player.cpp:15961

References GetActiveSpec(), GetSpec(), TALENT_TREE_DRUID_BALANCE, TALENT_TREE_HUNTER_BEAST_MASTERY, TALENT_TREE_HUNTER_MARKSMANSHIP, TALENT_TREE_HUNTER_SURVIVAL, TALENT_TREE_MAGE_ARCANE, TALENT_TREE_MAGE_FIRE, TALENT_TREE_MAGE_FROST, TALENT_TREE_PRIEST_SHADOW, TALENT_TREE_SHAMAN_ELEMENTAL, TALENT_TREE_WARLOCK_AFFLICTION, TALENT_TREE_WARLOCK_DEMONOLOGY, and TALENT_TREE_WARLOCK_DESTRUCTION.

◆ HasCorpse()

◆ HasDelayedTeleport()

bool Player::HasDelayedTeleport ( ) const
inlineprivate
2910{ return m_bHasDelayedTeleport; }

References m_bHasDelayedTeleport.

Referenced by Update().

◆ HasEnoughMoney() [1/2]

bool Player::HasEnoughMoney ( int32  amount) const
inline
1597 {
1598 if (amount > 0)
1599 return (GetMoney() >= (uint32) amount);
1600 return true;
1601 }

References GetMoney().

◆ HasEnoughMoney() [2/2]

◆ HasFreeBattlegroundQueueId()

bool Player::HasFreeBattlegroundQueueId ( ) const

◆ HasHealSpec()

bool Player::HasHealSpec ( )
16083{
16084 switch (GetSpec(GetActiveSpec()))
16085 {
16091 return true;
16092 default:
16093 break;
16094 }
16095 return false;
16096}
@ TALENT_TREE_DRUID_RESTORATION
Definition: Player.h:174
@ TALENT_TREE_SHAMAN_RESTORATION
Definition: Player.h:165
@ TALENT_TREE_PRIEST_HOLY
Definition: Player.h:158
@ TALENT_TREE_PALADIN_HOLY
Definition: Player.h:148
@ TALENT_TREE_PRIEST_DISCIPLINE
Definition: Player.h:157

References GetActiveSpec(), GetSpec(), TALENT_TREE_DRUID_RESTORATION, TALENT_TREE_PALADIN_HOLY, TALENT_TREE_PRIEST_DISCIPLINE, TALENT_TREE_PRIEST_HOLY, and TALENT_TREE_SHAMAN_RESTORATION.

◆ HasItemCount()

bool Player::HasItemCount ( uint32  item,
uint32  count = 1,
bool  inBankAlso = false 
) const
679{
680 uint32 tempcount = 0;
682 {
684 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
685 {
686 tempcount += pItem->GetCount();
687 if (tempcount >= count)
688 return true;
689 }
690 }
692 {
694 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
695 {
696 tempcount += pItem->GetCount();
697 if (tempcount >= count)
698 return true;
699 }
700 }
702 {
703 if (Bag* pBag = GetBagByPos(i))
704 {
705 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
706 {
707 Item* pItem = GetItemByPos(i, j);
708 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
709 {
710 tempcount += pItem->GetCount();
711 if (tempcount >= count)
712 return true;
713 }
714 }
715 }
716 }
717
718 if (inBankAlso)
719 {
721 {
723 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
724 {
725 tempcount += pItem->GetCount();
726 if (tempcount >= count)
727 return true;
728 }
729 }
731 {
732 if (Bag* pBag = GetBagByPos(i))
733 {
734 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
735 {
736 Item* pItem = GetItemByPos(i, j);
737 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
738 {
739 tempcount += pItem->GetCount();
740 if (tempcount >= count)
741 return true;
742 }
743 }
744 }
745 }
746 }
747
748 return false;
749}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, Item::IsInTrade(), and KEYRING_SLOT_START.

Referenced by LootItem::AllowedForPlayer(), BuyItemFromVendorSlot(), CanCompleteRepeatableQuest(), Spell::CheckItems(), spell_dk_raise_dead::CheckReagents(), Spell::EffectCreateItem2(), GetResurrectionSpellId(), go_soulwell::go_soulwellAI::GossipHello(), go_celestial_planetarium_access::go_celestial_planetarium_accessAI::GossipHello(), misc_commandscript::HandleAddItemCommand(), lfg::LFGMgr::InitializeLockedDungeons(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), npc_locksmith::OnGossipHello(), npc_oculus_drakegiver::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), AreaTrigger_at_voltarus_middle::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_twilight_grove::OnTrigger(), NPCStaveQuestAI::QuestIncomplete(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), Satisfy(), npc_aquementas::npc_aquementasAI::SendItem(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and Spell::WriteCastResultInfo().

◆ HasItemFitToSpellRequirements()

bool Player::HasItemFitToSpellRequirements ( SpellInfo const *  spellInfo,
Item const *  ignoreItem = nullptr 
) const
12464{
12465 if (spellInfo->EquippedItemClass < 0)
12466 return true;
12467
12468 // scan other equipped items for same requirements (mostly 2 daggers/etc)
12469 // for optimize check 2 used cases only
12470 switch (spellInfo->EquippedItemClass)
12471 {
12472 case ITEM_CLASS_WEAPON:
12473 {
12476 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12477 return true;
12478 break;
12479 }
12480 case ITEM_CLASS_ARMOR:
12481 {
12482 // tabard not have dependent spells
12485 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12486 return true;
12487
12488 // shields can be equipped to offhand slot
12490 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12491 return true;
12492
12493 // ranged slot can have some armor subclasses
12495 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12496 return true;
12497
12498 break;
12499 }
12500 default:
12501 LOG_ERROR("entities.player", "HasItemFitToSpellRequirements: Not handled spell requirement for item class {}", spellInfo->EquippedItemClass);
12502 break;
12503 }
12504
12505 return false;
12506}

References EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, SpellInfo::EquippedItemClass, GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsFitToSpellRequirements(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, and LOG_ERROR.

Referenced by Unit::CalcArmorReducedDamage(), Spell::CheckItems(), and RemoveItemDependentAurasAndCasts().

◆ HasItemOrGemWithIdEquipped()

bool Player::HasItemOrGemWithIdEquipped ( uint32  item,
uint32  count,
uint8  except_slot = NULL_SLOT 
) const
752{
753 uint32 tempcount = 0;
755 {
756 if (i == except_slot)
757 continue;
758
760 if (pItem && pItem->GetEntry() == item)
761 {
762 tempcount += pItem->GetCount();
763 if (tempcount >= count)
764 return true;
765 }
766 }
767
768 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
769 if (pProto && pProto->GemProperties)
770 {
772 {
773 if (i == except_slot)
774 continue;
775
777 if (pItem && pItem->GetTemplate()->Socket[0].Color)
778 {
779 tempcount += pItem->GetGemCountWithID(item);
780 if (tempcount >= count)
781 return true;
782 }
783 }
784 }
785
786 return false;
787}
uint8 GetGemCountWithID(uint32 GemID) const
Definition: Item.cpp:1015

References _Socket::Color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, ItemTemplate::GemProperties, Item::GetCount(), Object::GetEntry(), Item::GetGemCountWithID(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, sObjectMgr, and ItemTemplate::Socket.

Referenced by npc_eris_hevenfire::npc_eris_hevenfireAI::CanBeSeen(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::CanBeSeen(), CanEquipUniqueItem(), achievement_pb_pilgrims_peril::OnCheck(), and achievement_pb_terokkar_turkey_time::OnCheck().

◆ HasItemOrGemWithLimitCategoryEquipped()

bool Player::HasItemOrGemWithLimitCategoryEquipped ( uint32  limitCategory,
uint32  count,
uint8  except_slot = NULL_SLOT 
) const
790{
791 uint32 tempcount = 0;
793 {
794 if (i == except_slot)
795 continue;
796
798 if (!pItem)
799 continue;
800
801 ItemTemplate const* pProto = pItem->GetTemplate();
802 if (!pProto)
803 continue;
804
805 if (pProto->ItemLimitCategory == limitCategory)
806 {
807 tempcount += pItem->GetCount();
808 if (tempcount >= count)
809 return true;
810 }
811
813 {
814 tempcount += pItem->GetGemCountWithLimitCategory(limitCategory);
815 if (tempcount >= count)
816 return true;
817 }
818 }
819
820 return false;
821}

References _Socket::Color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetCount(), Item::GetEnchantmentId(), Item::GetGemCountWithLimitCategory(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemTemplate::ItemLimitCategory, PRISMATIC_ENCHANTMENT_SLOT, and ItemTemplate::Socket.

Referenced by CanEquipUniqueItem().

◆ HasItemTotemCategory()

bool Player::HasItemTotemCategory ( uint32  TotemCategory) const
875{
876 Item* pItem;
878 {
881 return true;
882 }
884 {
887 return true;
888 }
890 {
891 if (Bag* pBag = GetBagByPos(i))
892 {
893 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
894 {
895 pItem = GetItemByPos(i, j);
897 return true;
898 }
899 }
900 }
901 return false;
902}
TotemCategory
Definition: SharedDefines.h:3083
bool IsTotemCategoryCompatiableWith(ItemTemplate const *pProto, uint32 requiredTotemCategoryId) const
Definition: PlayerStorage.cpp:904

References CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, IsTotemCategoryCompatiableWith(), and KEYRING_SLOT_START.

Referenced by Spell::CheckItems().

◆ HasMeleeSpec()

bool Player::HasMeleeSpec ( )
16037{
16038 switch (GetSpec(GetActiveSpec()))
16039 {
16049 return true;
16051 if (GetShapeshiftForm() == FORM_CAT)
16052 return true;
16053 default:
16054 break;
16055 }
16056 return false;
16057}
@ TALENT_TREE_DEATH_KNIGHT_FROST
Definition: Player.h:161
@ TALENT_TREE_DRUID_FERAL_COMBAT
Definition: Player.h:173
@ TALENT_TREE_WARRIOR_FURY
Definition: Player.h:146
@ TALENT_TREE_ROGUE_ASSASSINATION
Definition: Player.h:154
@ TALENT_TREE_DEATH_KNIGHT_UNHOLY
Definition: Player.h:162
@ TALENT_TREE_SHAMAN_ENHANCEMENT
Definition: Player.h:164
@ TALENT_TREE_WARRIOR_ARMS
Definition: Player.h:145
@ TALENT_TREE_ROGUE_COMBAT
Definition: Player.h:155
@ TALENT_TREE_PALADIN_RETRIBUTION
Definition: Player.h:150
@ TALENT_TREE_ROGUE_SUBTLETY
Definition: Player.h:156
@ FORM_CAT
Definition: UnitDefines.h:70

References FORM_CAT, GetActiveSpec(), Unit::GetShapeshiftForm(), GetSpec(), TALENT_TREE_DEATH_KNIGHT_FROST, TALENT_TREE_DEATH_KNIGHT_UNHOLY, TALENT_TREE_DRUID_FERAL_COMBAT, TALENT_TREE_PALADIN_RETRIBUTION, TALENT_TREE_ROGUE_ASSASSINATION, TALENT_TREE_ROGUE_COMBAT, TALENT_TREE_ROGUE_SUBTLETY, TALENT_TREE_SHAMAN_ENHANCEMENT, TALENT_TREE_WARRIOR_ARMS, and TALENT_TREE_WARRIOR_FURY.

◆ HasPendingBind()

◆ HasPendingSpectatorForBG()

bool Player::HasPendingSpectatorForBG ( uint32  bgInstanceId) const
inline
2557{ return m_pendingSpectatorForBG == bgInstanceId; }

References m_pendingSpectatorForBG.

Referenced by WorldSession::HandleMoveWorldportAck(), and TeleportTo().

◆ HasPlayerFlag()

◆ HasPvPForcingQuest()

bool Player::HasPvPForcingQuest ( ) const
2490{
2491 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2492 {
2493 uint32 questId = GetQuestSlotQuestId(i);
2494 if (questId == 0)
2495 continue;
2496
2497 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
2498 if (!quest)
2499 continue;
2500
2501 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
2502 return true;
2503 }
2504
2505 return false;
2506}

References GetQuestSlotQuestId(), Quest::HasFlag(), MAX_QUEST_LOG_SIZE, QUEST_FLAGS_FLAGS_PVP, and sObjectMgr.

Referenced by Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), RewardQuest(), and UpdateZone().

◆ HasQuest()

bool Player::HasQuest ( uint32  questId) const
102{
103 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
104 {
105 uint32 questid = GetQuestSlotQuestId(i);
106 if (questid == questId)
107 {
108 return true;
109 }
110 }
111
112 return false;
113}

References GetQuestSlotQuestId(), and MAX_QUEST_LOG_SIZE.

◆ HasQuestForGO()

bool Player::HasQuestForGO ( int32  GOId) const
12336{
12337 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
12338 {
12339 uint32 questid = GetQuestSlotQuestId(i);
12340 if (questid == 0)
12341 continue;
12342
12343 QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questid);
12344 if (qs_itr == m_QuestStatus.end())
12345 continue;
12346
12347 QuestStatusData const& qs = qs_itr->second;
12348
12350 {
12351 Quest const* qinfo = sObjectMgr->GetQuestTemplate(questid);
12352 if (!qinfo)
12353 continue;
12354
12355 if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
12356 continue;
12357
12358 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
12359 {
12360 if (qinfo->RequiredNpcOrGo[j] >= 0) //skip non GO case
12361 continue;
12362
12363 if ((-1)*GOId == qinfo->RequiredNpcOrGo[j] && qs.CreatureOrGOCount[j] < qinfo->RequiredNpcOrGoCount[j])
12364 return true;
12365 }
12366 }
12367 }
12368 return false;
12369}
Difficulty GetDifficulty(bool isRaid) const
Definition: Player.h:1897
bool IsAllowedInRaid(Difficulty difficulty) const
Definition: QuestDef.cpp:296

References QuestStatusData::CreatureOrGOCount, GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), Quest::IsAllowedInRaid(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, sObjectMgr, and QuestStatusData::Status.

Referenced by GameObject::ActivateToQuest().

◆ HasQuestForItem()

bool Player::HasQuestForItem ( uint32  itemId,
uint32  excludeQuestId = 0,
bool  turnIn = false,
bool *  showInLoot = nullptr 
) const
2259{
2260 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2261 {
2262 uint32 questid = GetQuestSlotQuestId(i);
2263 if (questid == 0 || questid == excludeQuestId)
2264 continue;
2265
2266 QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questid);
2267 if (qs_itr == m_QuestStatus.end())
2268 continue;
2269
2270 QuestStatusData const& q_status = qs_itr->second;
2271
2272 if ((q_status.Status == QUEST_STATUS_INCOMPLETE) || (turnIn && q_status.Status == QUEST_STATUS_COMPLETE))
2273 {
2274 Quest const* qinfo = sObjectMgr->GetQuestTemplate(questid);
2275 if (!qinfo)
2276 continue;
2277
2278 // hide quest if player is in raid-group and quest is no raid quest
2279 if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
2280 {
2281 if (!InBattleground() && !GetGroup()->isBFGroup()) //there are two ways.. we can make every bg-quest a raidquest, or add this code here.. i don't know if this can be exploited by other quests, but i think all other quests depend on a specific area.. but keep this in mind, if something strange happens later
2282 {
2283 continue;
2284 }
2285 }
2286
2287 // There should be no mixed ReqItem/ReqSource drop
2288 // This part for ReqItem drop
2289 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
2290 {
2291 if (itemid == qinfo->RequiredItemId[j] && q_status.ItemCount[j] < qinfo->RequiredItemCount[j])
2292 {
2293 if (showInLoot)
2294 {
2295 if (GetItemCount(itemid, true) < qinfo->RequiredItemCount[j])
2296 {
2297 return true;
2298 }
2299
2300 *showInLoot = false;
2301 }
2302 else
2303 {
2304 return true;
2305 }
2306 }
2307
2308 if (turnIn && q_status.ItemCount[j] >= qinfo->RequiredItemCount[j])
2309 {
2310 return true;
2311 }
2312 }
2313 // This part - for ReqSource
2314 for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
2315 {
2316 // examined item is a source item
2317 if (qinfo->ItemDrop[j] == itemid)
2318 {
2319 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemid);
2320 uint32 ownedCount = GetItemCount(itemid, true);
2321 // 'unique' item
2322 if ((pProto->MaxCount && int32(ownedCount) < pProto->MaxCount) || (turnIn && int32(ownedCount) >= pProto->MaxCount))
2323 return true;
2324
2325 // allows custom amount drop when not 0
2326 if (qinfo->ItemDropQuantity[j])
2327 {
2328 if ((ownedCount < qinfo->ItemDropQuantity[j]) || (turnIn && ownedCount >= qinfo->ItemDropQuantity[j]))
2329 return true;
2330 }
2331 else if (ownedCount < pProto->GetMaxStackSize())
2332 return true;
2333 }
2334 }
2335 }
2336 }
2337 return false;
2338}
uint32 ItemDropQuantity[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition: QuestDef.h:302
uint32 ItemDrop[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition: QuestDef.h:301
uint32 RequiredItemId[QUEST_ITEM_OBJECTIVES_COUNT]
Definition: QuestDef.h:299

References GetDifficulty(), GetGroup(), GetItemCount(), WorldObject::GetMap(), GetQuestSlotQuestId(), InBattleground(), Quest::IsAllowedInRaid(), QuestStatusData::ItemCount, Quest::ItemDrop, Quest::ItemDropQuantity, m_QuestStatus, MAX_QUEST_LOG_SIZE, ItemTemplate::MaxCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, and QuestStatusData::Status.

Referenced by LootItem::AllowedForPlayer(), LootTemplate::HasQuestDropForPlayer(), LootTemplate::LootGroup::HasQuestDropForPlayer(), at_twilight_grove::OnTrigger(), and RewardQuest().

◆ HasReceivedSpectatorResetFor()

bool Player::HasReceivedSpectatorResetFor ( ObjectGuid  guid)
inline

◆ HasRestFlag()

bool Player::HasRestFlag ( RestFlag  restFlag) const
inline
1197{ return (_restFlagMask & restFlag) != 0; }

References _restFlagMask.

Referenced by Update().

◆ HasSkill()

◆ hasSpanishClient()

bool Player::hasSpanishClient ( )
inline
1086 {
1088 }
@ LOCALE_esES
Definition: Common.h:72
@ LOCALE_esMX
Definition: Common.h:73
LocaleConstant GetSessionDbLocaleIndex() const
Definition: WorldSession.h:498

References GetSession(), WorldSession::GetSessionDbLocaleIndex(), LOCALE_esES, and LOCALE_esMX.

◆ HasSpell()

bool Player::HasSpell ( uint32  spell) const
overridevirtual

Reimplemented from Unit.

3860{
3861 PlayerSpellMap::const_iterator itr = m_spells.find(spell);
3862 return (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec));
3863}

References m_activeSpec, m_spells, and PLAYERSPELL_REMOVED.

Referenced by ActivateSpec(), AddSpellAndCategoryCooldowns(), LootItem::AllowedForPlayer(), AuctionHouseObject::BuildListAuctionItems(), canCreateExtraItems(), CanCreatePerfectItem(), canFlyInZone(), Group::CanJoinBattlegroundQueue(), npc_engineering_tele_trinket::CanLearn(), CanResummonPet(), CanRollForItemInLFG(), CanUseItem(), Spell::EffectCastButtons(), GetExplicitDiscoverySpell(), GetResurrectionSpellId(), GetSkillDiscoverySpell(), GetStartPosition(), GetTrainerSpellState(), WorldSession::HandleBattlemasterJoinOpcode(), Acore::PlayerCommand::HandleLearnSpellCommand(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleTrainerBuySpellOpcode(), Acore::PlayerCommand::HandleUnlearnSpellCommand(), npc_prof_alchemy::HasAlchemySpell(), HasDiscoveredAllSpells(), npc_prof_leather::HasLeatherSpecialty(), go_evil_book_for_dummies::HasLeatherSpecialty(), npc_prof_tailor::HasTailorSpell(), npc_prof_blacksmith::HasWeaponSub(), IsActionButtonDataValid(), Creature::IsValidTrainerForPlayer(), learnQuestRewardedSpells(), boss_gloomrel::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), ProcessCastaction(), resetTalents(), WorldSession::SendTrainerList(), and TeleportTo().

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

bool Player::HasSpellItemCooldown ( uint32  spell_id,
uint32  itemid 
) const
overridevirtual

Reimplemented from Unit.

16290{
16291 SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
16292 return itr != m_spellCooldowns.end() && itr->second.end > getMSTime() && itr->second.itemid == itemid;
16293}

References getMSTime(), and m_spellCooldowns.

◆ HasSpellMod()

bool Player::HasSpellMod ( SpellModifier mod,
Spell spell 
)
9662{
9663 if (!mod || !spell)
9664 return false;
9665
9666 return spell->m_appliedMods.find(mod->ownerAura) != spell->m_appliedMods.end();
9667}

References Spell::m_appliedMods, and SpellModifier::ownerAura.

Referenced by ApplySpellMod().

◆ HasTalent()

bool Player::HasTalent ( uint32  spell_id,
uint8  spec 
) const
3866{
3867 PlayerTalentMap::const_iterator itr = m_talents.find(spell);
3868 return (itr != m_talents.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec));
3869}

References m_activeSpec, m_talents, and PLAYERSPELL_REMOVED.

Referenced by ActivateSpec(), GetSpec(), AuraEffect::HandleShapeshiftBoosts(), and LearnTalent().

◆ HasTankSpec()

bool Player::HasTankSpec ( )
16019{
16020 switch (GetSpec())
16021 {
16025 return true;
16028 return true;
16029 break;
16030 default:
16031 break;
16032 }
16033 return false;
16034}
@ TALENT_TREE_DEATH_KNIGHT_BLOOD
Definition: Player.h:160
@ TALENT_TREE_PALADIN_PROTECTION
Definition: Player.h:149
@ TALENT_TREE_WARRIOR_PROTECTION
Definition: Player.h:147
@ FORM_DIREBEAR
Definition: UnitDefines.h:77
@ FORM_BEAR
Definition: UnitDefines.h:74

References FORM_BEAR, FORM_DIREBEAR, Unit::GetShapeshiftForm(), GetSpec(), TALENT_TREE_DEATH_KNIGHT_BLOOD, TALENT_TREE_DRUID_FERAL_COMBAT, TALENT_TREE_PALADIN_PROTECTION, and TALENT_TREE_WARRIOR_PROTECTION.

◆ HasTitle() [1/2]

bool Player::HasTitle ( CharTitlesEntry const *  title) const
inline
2519{ return HasTitle(title->bit_index); }
bool HasTitle(uint32 bitIndex) const
Definition: Player.cpp:13273

References CharTitlesEntry::bit_index, and HasTitle().

Referenced by HasTitle().

◆ HasTitle() [2/2]

bool Player::HasTitle ( uint32  bitIndex) const
13274{
13275 if (bitIndex > MAX_TITLE_INDEX)
13276 return false;
13277
13278 uint32 fieldIndexOffset = bitIndex / 32;
13279 uint32 flag = 1 << (bitIndex % 32);
13280 return HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13281}
#define MAX_TITLE_INDEX
Definition: Player.h:554

References Object::HasFlag(), MAX_TITLE_INDEX, and PLAYER__FIELD_KNOWN_TITLES.

Referenced by character_commandscript::HandleCharacterTitlesCommand(), lookup_commandscript::HandleLookupTitleCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), LoadFromDB(), and AchievementCriteriaData::Meets().

◆ HaveAtClient() [1/2]

bool Player::HaveAtClient ( ObjectGuid  guid) const
11385{
11386 if (guid == GetGUID())
11387 {
11388 return true;
11389 }
11390
11391 return m_clientGUIDs.find(guid) != m_clientGUIDs.end();
11392}
GuidUnorderedSet m_clientGUIDs
Definition: Player.h:2358

References Object::GetGUID(), and m_clientGUIDs.

◆ HaveAtClient() [2/2]

bool Player::HaveAtClient ( WorldObject const *  u) const
11366{
11367 if (u == this)
11368 {
11369 return true;
11370 }
11371
11372 // Motion Transports are always present in player's client
11373 if (GameObject const* gameobject = u->ToGameObject())
11374 {
11375 if (gameobject->IsMotionTransport())
11376 {
11377 return true;
11378 }
11379 }
11380
11381 return m_clientGUIDs.find(u->GetGUID()) != m_clientGUIDs.end();
11382}

References Object::GetGUID(), m_clientGUIDs, and Object::ToGameObject().

Referenced by Group::AddMember(), WorldObjectChangeAccumulator::BuildPacket(), WorldObject::DestroyForNearbyPlayers(), ArenaSpectator::HandleSpectatorWatchCommand(), Map::SendInitSelf(), Acore::MessageDistDeliverer::SendPacket(), Acore::MessageDistDelivererToHostile::SendPacket(), Unit::SetOwnerGUID(), and UpdateVisibilityOf().

◆ InArena()

bool Player::InArena ( ) const
12251{
12253 if (!bg || !bg->isArena())
12254 return false;
12255
12256 return true;
12257}
bool isArena() const
Definition: Battleground.h:396

References GetBattleground(), and Battleground::isArena().

Referenced by CreateCorpse(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleUseItemOpcode(), achievement_arena_by_type::OnCheck(), RewardHonor(), and AuraEffect::UpdatePeriodic().

◆ InBattleground()

◆ InBattlegroundQueue()

bool Player::InBattlegroundQueue ( bool  ignoreArena = false) const

◆ InBattlegroundQueueForBattlegroundQueueType()

bool Player::InBattlegroundQueueForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId) const
12193{
12195}
uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const
Definition: Player.cpp:12174

References GetBattlegroundQueueIndex(), and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by Group::CanJoinBattlegroundQueue(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ IncompleteQuest()

◆ InitDataForForm()

void Player::InitDataForForm ( bool  reapplyMods = false)
10527{
10529
10530 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
10531 if (ssEntry && ssEntry->attackSpeed)
10532 {
10536 }
10537 else
10539
10540 switch (form)
10541 {
10542 case FORM_GHOUL:
10543 case FORM_CAT:
10544 {
10545 if (getPowerType() != POWER_ENERGY)
10547 break;
10548 }
10549 case FORM_BEAR:
10550 case FORM_DIREBEAR:
10551 {
10552 if (getPowerType() != POWER_RAGE)
10554 break;
10555 }
10556 default: // 0, for example
10557 {
10558 ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(getClass());
10559 if (cEntry && cEntry->powerType < MAX_POWERS && uint32(getPowerType()) != cEntry->powerType)
10560 setPowerType(Powers(cEntry->powerType));
10561 break;
10562 }
10563 }
10564
10565 // update auras at form change, ignore this at mods reapply (.reset stats/etc) when form not change.
10566 if (!reapplyMods)
10568
10571}
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
ShapeshiftForm
Definition: UnitDefines.h:68
@ FORM_GHOUL
Definition: UnitDefines.h:76
void SetRegularAttackTime()
Definition: Player.cpp:5237
void UpdateEquipSpellsAtFormChange()
Definition: PlayerUpdates.cpp:1309
void setPowerType(Powers power)
Definition: Unit.cpp:9924
Definition: DBCStructure.h:1817
uint32 attackSpeed
Definition: DBCStructure.h:1825

References SpellShapeshiftFormEntry::attackSpeed, BASE_ATTACK, BASE_ATTACK_TIME, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_GHOUL, Unit::getClass(), Unit::getPowerType(), Unit::GetShapeshiftForm(), MAX_POWERS, OFF_ATTACK, POWER_ENERGY, POWER_RAGE, ChrClassesEntry::powerType, RANGED_ATTACK, sChrClassesStore, Unit::SetAttackTime(), Unit::setPowerType(), SetRegularAttackTime(), sSpellShapeshiftFormStore, UpdateAttackPowerAndDamage(), and UpdateEquipSpellsAtFormChange().

Referenced by AuraEffect::HandleAuraModShapeshift(), and InitStatsForLevel().

◆ InitDisplayIds()

void Player::InitDisplayIds ( )
10574{
10575 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
10576 if (!info)
10577 {
10578 LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Can't init display ids.", GetGUID().ToString());
10579 return;
10580 }
10581
10582 uint8 gender = getGender();
10583 switch (gender)
10584 {
10585 case GENDER_FEMALE:
10588 break;
10589 case GENDER_MALE:
10592 break;
10593 default:
10594 LOG_ERROR("entities.player", "Invalid gender {} for player", gender);
10595 return;
10596 }
10597}
@ GENDER_MALE
Definition: SharedDefines.h:61
@ GENDER_FEMALE
Definition: SharedDefines.h:62
uint16 displayId_m
Definition: Player.h:345
uint16 displayId_f
Definition: Player.h:346
uint8 getGender() const
Definition: Unit.h:768
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition: Unit.cpp:16701
void SetNativeDisplayId(uint32 displayId)
Definition: Unit.h:1515

References PlayerInfo::displayId_f, PlayerInfo::displayId_m, GENDER_FEMALE, GENDER_MALE, Unit::getClass(), Unit::getGender(), Object::GetGUID(), Unit::getRace(), LOG_ERROR, Unit::SetDisplayId(), Unit::SetNativeDisplayId(), sObjectMgr, and Position::ToString().

Referenced by Create(), modify_commandscript::HandleModifyGenderCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), and LoadFromDB().

◆ InitGlyphsForLevel()

void Player::InitGlyphsForLevel ( )
13235{
13236 for (uint32 i = 0; i < sGlyphSlotStore.GetNumRows(); ++i)
13237 if (GlyphSlotEntry const* gs = sGlyphSlotStore.LookupEntry(i))
13238 if (gs->Order)
13239 SetGlyphSlot(gs->Order - 1, gs->Id);
13240
13241 uint8 level = GetLevel();
13242 uint32 value = 0;
13243
13244 // 0x3F = 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 for 80 level
13245 if (level >= 15)
13246 value |= (0x01 | 0x02);
13247 if (level >= 30)
13248 value |= 0x08;
13249 if (level >= 50)
13250 value |= 0x04;
13251 if (level >= 70)
13252 value |= 0x10;
13253 if (level >= 80)
13254 value |= 0x20;
13255
13257}
@ PLAYER_GLYPHS_ENABLED
Definition: UpdateFields.h:390
void SetGlyphSlot(uint8 slot, uint32 slottype)
Definition: Player.h:1737

References Unit::GetLevel(), PLAYER_GLYPHS_ENABLED, SetGlyphSlot(), Unit::SetUInt32Value(), and sGlyphSlotStore.

Referenced by Create(), GiveLevel(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ Initialize()

void Player::Initialize ( ObjectGuid::LowType  guid)
4796{
4797 Object::_Create(guid, 0, HighGuid::Player);
4798}

References Object::_Create().

◆ InitPrimaryProfessions()

void Player::InitPrimaryProfessions ( )
11464{
11466}
@ CONFIG_MAX_PRIMARY_TRADE_SKILL
Definition: IWorld.h:256

References CONFIG_MAX_PRIMARY_TRADE_SKILL, SetFreePrimaryProfessions(), and sWorld.

Referenced by Create(), and LoadFromDB().

◆ InitRunes()

void Player::InitRunes ( )
13405{
13407 return;
13408
13409 m_runes = new Runes;
13410
13411 m_runes->runeState = 0;
13413
13414 for (uint8 i = 0; i < MAX_RUNES; ++i)
13415 {
13416 SetBaseRune(i, runeSlotTypes[i]); // init base types
13417 SetCurrentRune(i, runeSlotTypes[i]); // init current types
13418 SetRuneCooldown(i, 0); // reset cooldowns
13419 SetGracePeriod(i, 0); // xinef: reset grace period
13420 SetRuneConvertAura(i, nullptr);
13422 }
13423
13424 for (uint8 i = 0; i < NUM_RUNE_TYPES; ++i)
13426}
@ PLAYER_RUNE_REGEN_1
Definition: UpdateFields.h:386
static RuneType runeSlotTypes[MAX_RUNES]
Definition: Player.cpp:13394
@ NUM_RUNE_TYPES
Definition: Player.h:413
@ RUNE_BLOOD
Definition: Player.h:409
#define MAX_RUNES
Definition: Player.h:398
Definition: Player.h:426
void SetRuneState(uint8 index, bool set=true)
Definition: Player.h:431
void SetRuneCooldown(uint8 index, uint32 cooldown)
Definition: Player.h:2493
void SetBaseRune(uint8 index, RuneType baseRune)
Definition: Player.h:2491
void SetGracePeriod(uint8 index, uint32 period)
Definition: Player.h:2494

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, IsClass(), Runes::lastUsedRune, m_runes, MAX_RUNES, NUM_RUNE_TYPES, PLAYER_RUNE_REGEN_1, RUNE_BLOOD, runeSlotTypes, Runes::runeState, SetBaseRune(), SetCurrentRune(), Object::SetFloatValue(), SetGracePeriod(), SetRuneConvertAura(), SetRuneCooldown(), and Runes::SetRuneState().

Referenced by Create(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ InitStatsForLevel()

void Player::InitStatsForLevel ( bool  reapplyMods = false)
2569{
2570 if (reapplyMods) //reapply stats values only on .reset stats (level) command
2572
2573 PlayerClassLevelInfo classInfo;
2574 sObjectMgr->GetPlayerClassLevelInfo(getClass(), GetLevel(), &classInfo);
2575
2576 PlayerLevelInfo info;
2577 sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), GetLevel(), &info);
2578
2579 uint32 maxPlayerLevel = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
2580 sScriptMgr->OnSetMaxLevel(this, maxPlayerLevel);
2581 SetUInt32Value(PLAYER_FIELD_MAX_LEVEL, maxPlayerLevel);
2583
2584 // reset before any aura state sources (health set/aura apply)
2586
2588
2589 // set default cast time multiplier
2591
2592 // reset size before reapply auras
2593 SetObjectScale(1.0f);
2594
2595 // save base values (bonuses already included in stored stats
2596 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2597 SetCreateStat(Stats(i), info.stats[i]);
2598
2599 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2600 SetStat(Stats(i), info.stats[i]);
2601
2602 SetCreateHealth(classInfo.basehealth);
2603
2604 //set create powers
2605 SetCreateMana(classInfo.basemana);
2606
2608
2610
2611 //reset rating fields values
2613 SetUInt32Value(index, 0);
2614
2616 for (uint8 i = 0; i < 7; ++i)
2617 {
2621 }
2622
2623 //reset attack power, damage and attack speed fields
2625 SetFloatValue(UNIT_FIELD_BASEATTACKTIME + 1, 2000.0f); // offhand attack time
2627
2634
2641
2642 // Base crit values (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
2646
2647 // Init spell schools (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
2648 for (uint8 i = 0; i < 7; ++i)
2650
2654
2655 // Dodge percentage
2657
2658 // set armor (resistance 0) to original value (create_agility*2)
2660 SetResistanceBuffMods(SpellSchools(0), true, 0.0f);
2661 SetResistanceBuffMods(SpellSchools(0), false, 0.0f);
2662 // set other resistance to original value (0)
2663 for (uint8 i = 1; i < MAX_SPELL_SCHOOL; ++i)
2664 {
2666 SetResistanceBuffMods(SpellSchools(i), true, 0.0f);
2667 SetResistanceBuffMods(SpellSchools(i), false, 0.0f);
2668 }
2669
2672 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
2673 {
2676 }
2677 // Reset no reagent cost field
2678 for (uint8 i = 0; i < 3; ++i)
2680 // Init data for form but skip reapply item mods for form
2681 InitDataForForm(reapplyMods);
2682
2683 // save new stats
2684 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
2686
2687 SetMaxHealth(classInfo.basehealth); // stamina bonus will applied later
2688
2689 // cleanup mounted state (it will set correctly at aura loading if player saved at mount.
2691
2692 // cleanup unit flags (will be re-applied if need at aura load).
2700 SetImmuneToAll(false);
2702
2704
2705 // cleanup player flags (will be re-applied if need at aura load), to avoid have ghost flag without ghost aura, for example.
2707
2708 RemoveStandFlags(UNIT_STAND_FLAGS_ALL); // one form stealth modified bytes
2710 {
2712 sScriptMgr->OnFfaPvpStateUpdate(this, false);
2713
2714 }
2715 // restore if need some important flags
2716 SetUInt32Value(PLAYER_FIELD_BYTES2, 0); // flags empty by default
2717
2718 if (reapplyMods) // reapply stats values only on .reset stats (level) command
2720
2721 // set current level health and mana/energy to maximum after applying all mods.
2722 SetFullHealth();
2730
2731 // update level to hunter/summon pet
2732 if (Pet* pet = GetPet())
2733 pet->SynchronizeLevelWithOwner();
2734}
@ UNIT_FIELD_MINDAMAGE
Definition: UpdateFields.h:127
@ UNIT_FIELD_POWER_COST_MODIFIER
Definition: UpdateFields.h:170
@ UNIT_FIELD_RANGEDATTACKTIME
Definition: UpdateFields.h:121
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition: UpdateFields.h:163
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition: UpdateFields.h:353
@ PLAYER_SHIELD_BLOCK
Definition: UpdateFields.h:355
@ UNIT_FIELD_MAXDAMAGE
Definition: UpdateFields.h:128
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:167
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition: UpdateFields.h:130
@ PLAYER_FIELD_BYTES2
Definition: UpdateFields.h:378
@ UNIT_FIELD_AURASTATE
Definition: UpdateFields.h:119
@ UNIT_FIELD_MOUNTDISPLAYID
Definition: UpdateFields.h:126
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition: UpdateFields.h:169
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:164
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition: UpdateFields.h:168
@ UNIT_FIELD_FLAGS
Definition: UpdateFields.h:117
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition: UpdateFields.h:166
@ PLAYER_FIELD_MOD_DAMAGE_DONE_PCT
Definition: UpdateFields.h:362
@ UNIT_FIELD_POWER_COST_MULTIPLIER
Definition: UpdateFields.h:171
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition: UpdateFields.h:129
@ PLAYER_FIELD_MAX_LEVEL
Definition: UpdateFields.h:384
@ UNIT_FIELD_BASEATTACKTIME
Definition: UpdateFields.h:120
@ PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE
Definition: UpdateFields.h:367
@ PLAYER_ALLOW_ONLY_ABILITY
Definition: Player.h:497
@ PLAYER_FLAGS_DND
Definition: Player.h:476
@ PLAYER_FLAGS_AFK
Definition: Player.h:475
@ PLAYER_FLAGS_GM
Definition: Player.h:477
@ UNIT_STAND_FLAGS_ALL
Definition: UnitDefines.h:52
@ UNIT_BYTE2_FLAG_FFA_PVP
Definition: UnitDefines.h:117
@ UNIT_BYTE2_FLAG_SANCTUARY
Definition: UnitDefines.h:118
@ UNIT_FLAG_STUNNED
Definition: UnitDefines.h:247
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:230
@ UNIT_FLAG_IN_COMBAT
Definition: UnitDefines.h:248
@ UNIT_FLAG_DISARMED
Definition: UnitDefines.h:250
@ UNIT_FLAG_PACIFIED
Definition: UnitDefines.h:246
@ UNIT_FLAG_CONFUSED
Definition: UnitDefines.h:251
@ UNIT_FLAG_FLEEING
Definition: UnitDefines.h:252
@ UNIT_FLAG_NOT_SELECTABLE
Definition: UnitDefines.h:254
@ UNIT_FLAG_LOOTING
Definition: UnitDefines.h:239
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition: UnitDefines.h:236
@ UNIT_FLAG_SILENCED
Definition: UnitDefines.h:242
@ UNIT_FLAG_MOUNT
Definition: UnitDefines.h:256
@ UNIT_FLAG_PET_IN_COMBAT
Definition: UnitDefines.h:240
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition: Object.cpp:930
void _ApplyAllStatBonuses()
Definition: StatSystem.cpp:979
void InitDataForForm(bool reapplyMods=false)
Definition: Player.cpp:10526
void _RemoveAllStatBonuses()
Definition: StatSystem.cpp:991
uint32 GetCreatePowers(Powers power) const
Definition: Unit.cpp:15598
void SetStat(Stats stat, int32 val)
Definition: Unit.h:773
void SetResistanceBuffMods(SpellSchools school, bool positive, float val)
Definition: Unit.h:1369
float m_createStats[MAX_STATS]
Definition: Unit.h:1828
void SetResistance(SpellSchools school, int32 val)
Definition: Unit.h:779
void RemoveStandFlags(uint8 flags)
Definition: Unit.h:885
void SetArmor(int32 val)
Definition: Unit.h:775
void SetMaxHealth(uint32 val)
Definition: Unit.cpp:15466
void InitStatBuffMods()
Definition: Unit.h:1372
void SetImmuneToAll(bool apply, bool keepCombat=false)
Definition: Unit.h:1022

References _ApplyAllStatBonuses(), _RemoveAllStatBonuses(), PlayerClassLevelInfo::basehealth, PlayerClassLevelInfo::basemana, CONFIG_MAX_PLAYER_LEVEL, Unit::getClass(), Unit::GetCreatePowers(), Unit::GetLevel(), Unit::GetMaxPower(), GetPet(), Unit::GetPower(), Unit::getRace(), Object::HasByteFlag(), InitDataForForm(), Unit::InitStatBuffMods(), Unit::m_createStats, MAX_COMBAT_RATING, MAX_POWERS, MAX_SPELL_SCHOOL, MAX_STATS, PLAYER_ALLOW_ONLY_ABILITY, PLAYER_BLOCK_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_DODGE_PERCENTAGE, PLAYER_FIELD_BYTES2, PLAYER_FIELD_COMBAT_RATING_1, PLAYER_FIELD_MAX_LEVEL, PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE, PLAYER_FIELD_MOD_TARGET_RESISTANCE, PLAYER_FLAGS_AFK, PLAYER_FLAGS_DND, PLAYER_FLAGS_GHOST, PLAYER_FLAGS_GM, PLAYER_NEXT_LEVEL_XP, PLAYER_NO_REAGENT_COST_1, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_PARRY_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SHIELD_BLOCK, PLAYER_SPELL_CRIT_PERCENTAGE1, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, Object::RemoveByteFlag(), Object::RemoveFlag(), RemovePlayerFlag(), Unit::RemoveStandFlags(), Unit::SetArmor(), Unit::SetCreateHealth(), Unit::SetCreateMana(), Unit::SetCreateStat(), Object::SetFloatValue(), Unit::SetFullHealth(), Unit::SetImmuneToAll(), Object::SetInt32Value(), Unit::SetMaxHealth(), Unit::SetMaxPower(), SetObjectScale(), Unit::SetPower(), Unit::SetResistance(), Unit::SetResistanceBuffMods(), Unit::SetStat(), Unit::SetUInt32Value(), Unit::SetUnitFlag(), Unit::SetUnitFlag2(), sObjectMgr, sScriptMgr, STAT_AGILITY, STAT_STRENGTH, PlayerLevelInfo::stats, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_FLAGS, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, UNIT_FIELD_MOUNTDISPLAYID, UNIT_FIELD_POWER_COST_MODIFIER, UNIT_FIELD_POWER_COST_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FLAG2_REGENERATE_POWER, UNIT_FLAG_CONFUSED, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_DISARMED, UNIT_FLAG_FLEEING, UNIT_FLAG_IN_COMBAT, UNIT_FLAG_LOOTING, UNIT_FLAG_MOUNT, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PACIFIED, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_SILENCED, UNIT_FLAG_SKINNABLE, UNIT_FLAG_STUNNED, UNIT_FLAG_TAXI_FLIGHT, UNIT_MOD_CAST_SPEED, UNIT_STAND_FLAGS_ALL, and UpdateSkillsForLevel().

Referenced by Create(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ InitTalentForLevel()

void Player::InitTalentForLevel ( )
2554{
2555 uint32 talentPointsForLevel = CalculateTalentsPoints();
2556
2557 // xinef: more talent points that we have are used, reset
2558 if (m_usedTalentCount > talentPointsForLevel)
2559 resetTalents(true);
2560 // xinef: else, recalculate free talent points count
2561 else
2562 SetFreeTalentPoints(talentPointsForLevel - m_usedTalentCount);
2563
2564 if (!GetSession()->PlayerLoading())
2565 SendTalentsInfoData(false); // update at client
2566}
void SendTalentsInfoData(bool pet)
Definition: Player.cpp:14370
bool resetTalents(bool noResetCost=false)
Definition: Player.cpp:3684
void SetFreeTalentPoints(uint32 points)
Definition: Player.cpp:3779
uint32 CalculateTalentsPoints() const
Definition: Player.cpp:13567

References CalculateTalentsPoints(), GetSession(), m_usedTalentCount, resetTalents(), SendTalentsInfoData(), and SetFreeTalentPoints().

Referenced by ActivateSpec(), Create(), GiveLevel(), character_commandscript::HandleCharacterLevel(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), LoadFromDB(), and RewardQuest().

◆ InitTaxiNodesForLevel()

void Player::InitTaxiNodesForLevel ( )
inline

◆ inRandomLfgDungeon()

bool Player::inRandomLfgDungeon ( )
13022{
13023 if (sLFGMgr->selectedRandomLfgDungeon(GetGUID()))
13024 {
13025 Map const* map = GetMap();
13026 return sLFGMgr->inLfgDungeonMap(GetGUID(), map->GetId(), map->GetDifficulty());
13027 }
13028
13029 return false;
13030}

References Map::GetDifficulty(), Object::GetGUID(), Map::GetId(), WorldObject::GetMap(), and sLFGMgr.

◆ isAcceptWhispers()

bool Player::isAcceptWhispers ( ) const
inline

◆ IsActionButtonDataValid()

bool Player::IsActionButtonDataValid ( uint8  button,
uint32  action,
uint8  type 
)
5524{
5525 if (button >= MAX_ACTION_BUTTONS)
5526 {
5527 LOG_ERROR("entities.player", "Action {} not added into button {} for player {}: button must be < {}", action, button, GetName(), MAX_ACTION_BUTTONS);
5528 return false;
5529 }
5530
5531 if (action >= MAX_ACTION_BUTTON_ACTION_VALUE)
5532 {
5533 LOG_ERROR("entities.player", "Action {} not added into button {} for player {}: action must be < {}", action, button, GetName(), MAX_ACTION_BUTTON_ACTION_VALUE);
5534 return false;
5535 }
5536
5537 switch (type)
5538 {
5540 if (!sSpellMgr->GetSpellInfo(action))
5541 {
5542 LOG_ERROR("entities.player", "Spell action {} not added into button {} for player {}: spell not exist", action, button, GetName());
5543 return false;
5544 }
5545
5546 if (!HasSpell(action))
5547 {
5548 LOG_DEBUG("entities.player.loading", "Player::IsActionButtonDataValid Spell action {} not added into button {} for player {}: player don't known this spell", action, button, GetName());
5549 return false;
5550 }
5551 break;
5552 case ACTION_BUTTON_ITEM:
5553 if (!sObjectMgr->GetItemTemplate(action))
5554 {
5555 LOG_ERROR("entities.player", "Item action {} not added into button {} for player {}: item not exist", action, button, GetName());
5556 return false;
5557 }
5558 break;
5559 default:
5560 break; // other cases not checked at this moment
5561 }
5562
5563 return true;
5564}
@ ACTION_BUTTON_ITEM
Definition: Player.h:234
@ ACTION_BUTTON_SPELL
Definition: Player.h:229
#define MAX_ACTION_BUTTONS
Definition: Player.h:274
#define MAX_ACTION_BUTTON_ACTION_VALUE
Definition: Player.h:250

References ACTION_BUTTON_ITEM, ACTION_BUTTON_SPELL, WorldObject::GetName(), HasSpell(), LOG_DEBUG, LOG_ERROR, MAX_ACTION_BUTTON_ACTION_VALUE, MAX_ACTION_BUTTONS, sObjectMgr, and sSpellMgr.

Referenced by addActionButton().

◆ IsActiveQuest()

bool Player::IsActiveQuest ( uint32  quest_id) const
203{
204 return m_QuestStatus.find(quest_id) != m_QuestStatus.end();
205}

References m_QuestStatus.

◆ IsAffectedBySpellmod()

bool Player::IsAffectedBySpellmod ( SpellInfo const *  spellInfo,
SpellModifier mod,
Spell spell = nullptr 
)
9670{
9671 if (!mod || !spellInfo)
9672 return false;
9673
9674 // Mod out of charges
9675 if (spell && mod->charges == -1 && spell->m_appliedMods.find(mod->ownerAura) == spell->m_appliedMods.end())
9676 return false;
9677
9678 // +duration to infinite duration spells making them limited
9679 if (mod->op == SPELLMOD_DURATION && spellInfo->GetDuration() == -1)
9680 return false;
9681
9682 return spellInfo->IsAffectedBySpellMod(mod);
9683}

References SpellModifier::charges, SpellInfo::GetDuration(), SpellInfo::IsAffectedBySpellMod(), Spell::m_appliedMods, SpellModifier::op, SpellModifier::ownerAura, and SPELLMOD_DURATION.

Referenced by ApplySpellMod().

◆ isAFK()

◆ isAllowedToLoot()

bool Player::isAllowedToLoot ( Creature const *  creature)
5636{
5637 if (!creature->isDead() || !creature->IsDamageEnoughForLootingAndReward())
5638 return false;
5639
5640 if (HasPendingBind())
5641 return false;
5642
5643 const Loot* loot = &creature->loot;
5644 if (loot->isLooted()) // nothing to loot or everything looted.
5645 return false;
5646
5647 if (!loot->hasItemForAll() && !loot->hasItemFor(this)) // no loot in creature for this player
5648 return false;
5649
5650 if (loot->loot_type == LOOT_SKINNING)
5651 return creature->GetLootRecipientGUID() == GetGUID();
5652
5653 Group* thisGroup = GetGroup();
5654 if (!thisGroup)
5655 return this == creature->GetLootRecipient();
5656 else if (thisGroup != creature->GetLootRecipientGroup())
5657 return false;
5658
5659 switch (thisGroup->GetLootMethod())
5660 {
5661 case MASTER_LOOT:
5662 case FREE_FOR_ALL:
5663 return true;
5664 case ROUND_ROBIN:
5665 // may only loot if the player is the loot roundrobin player
5666 // or if there are free/quest/conditional item for the player
5667 if (!loot->roundRobinPlayer || loot->roundRobinPlayer == GetGUID())
5668 return true;
5669
5670 return loot->hasItemFor(this);
5671 case GROUP_LOOT:
5672 case NEED_BEFORE_GREED:
5673 // may only loot if the player is the loot roundrobin player
5674 // or item over threshold (so roll(s) can be launched)
5675 // or if there are free/quest/conditional item for the player
5676 if (!loot->roundRobinPlayer || loot->roundRobinPlayer == GetGUID())
5677 return true;
5678
5679 if (loot->hasOverThresholdItem())
5680 return true;
5681
5682 return loot->hasItemFor(this);
5683 }
5684
5685 return false;
5686}
@ NEED_BEFORE_GREED
Definition: LootMgr.h:63
@ GROUP_LOOT
Definition: LootMgr.h:62
@ MASTER_LOOT
Definition: LootMgr.h:61
@ ROUND_ROBIN
Definition: LootMgr.h:60
@ FREE_FOR_ALL
Definition: LootMgr.h:59
@ LOOT_SKINNING
Definition: LootMgr.h:86
bool HasPendingBind() const
Definition: Player.h:2416
LootMethod GetLootMethod() const
Definition: Group.cpp:2316
bool hasItemFor(Player *player) const
Definition: LootMgr.cpp:928
bool isLooted() const
Definition: LootMgr.h:368
bool hasOverThresholdItem() const
Definition: LootMgr.cpp:973
ObjectGuid roundRobinPlayer
Definition: LootMgr.h:324
bool hasItemForAll() const
Definition: LootMgr.cpp:913
LootType loot_type
Definition: LootMgr.h:326

References FREE_FOR_ALL, GetGroup(), Object::GetGUID(), Group::GetLootMethod(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), Creature::GetLootRecipientGUID(), GROUP_LOOT, Loot::hasItemFor(), Loot::hasItemForAll(), Loot::hasOverThresholdItem(), HasPendingBind(), Creature::IsDamageEnoughForLootingAndReward(), Unit::isDead(), Loot::isLooted(), Creature::loot, LOOT_SKINNING, Loot::loot_type, MASTER_LOOT, NEED_BEFORE_GREED, ROUND_ROBIN, and Loot::roundRobinPlayer.

Referenced by Unit::PatchValuesUpdate().

◆ IsAlwaysDetectableFor()

bool Player::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

11419{
11421 return true;
11422
11423 if (duel && duel->State != DUEL_STATE_CHALLENGED && duel->Opponent == seer)
11424 {
11425 return false;
11426 }
11427
11428 if (Player const* seerPlayer = seer->ToPlayer())
11429 {
11430 if (IsGroupVisibleFor(seerPlayer))
11431 {
11432 return true;
11433 }
11434 }
11435
11436 return false;
11437}
@ DUEL_STATE_CHALLENGED
Definition: Player.h:370
bool IsGroupVisibleFor(Player const *p) const
Definition: Player.cpp:2295
bool IsAlwaysDetectableFor(WorldObject const *seer) const override
Definition: Unit.cpp:14154

References duel, DUEL_STATE_CHALLENGED, Unit::IsAlwaysDetectableFor(), IsGroupVisibleFor(), and Object::ToPlayer().

◆ IsAtGroupRewardDistance()

bool Player::IsAtGroupRewardDistance ( WorldObject const *  pRewardSource) const
12711{
12712 WorldObject const* player = GetCorpse();
12713 if (!player || IsAlive())
12714 {
12715 player = this;
12716 }
12717
12718 if (!pRewardSource || !player->IsInMap(pRewardSource))
12719 {
12720 return false;
12721 }
12722
12723 if (pRewardSource->GetMap()->IsDungeon())
12724 {
12725 return true;
12726 }
12727
12728 return pRewardSource->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE);
12729}
@ CONFIG_GROUP_XP_DISTANCE
Definition: IWorld.h:196
float GetDistance(WorldObject const *obj) const
Definition: Object.cpp:1245

References CONFIG_GROUP_XP_DISTANCE, GetCorpse(), WorldObject::GetDistance(), WorldObject::GetMap(), Unit::IsAlive(), Map::IsDungeon(), WorldObject::IsInMap(), and sWorld.

Referenced by KillRewarder::_InitGroupData(), KillRewarder::_RewardGroup(), SmartAI::EndPath(), GroupEventHappens(), OutdoorPvP::HandleKill(), OutdoorPvPNA::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), IsAtLootRewardDistance(), Group::NeedBeforeGreed(), and RewardPlayerAndGroupAtEvent().

◆ IsAtLootRewardDistance()

bool Player::IsAtLootRewardDistance ( WorldObject const *  pRewardSource) const
12732{
12733 if (!IsAtGroupRewardDistance(pRewardSource))
12734 {
12735 return false;
12736 }
12737
12738 if (HasPendingBind())
12739 {
12740 return false;
12741 }
12742
12743 return pRewardSource->HasAllowedLooter(GetGUID());
12744}

References Object::GetGUID(), WorldObject::HasAllowedLooter(), HasPendingBind(), and IsAtGroupRewardDistance().

Referenced by Loot::FillLoot(), Group::GroupLoot(), WorldSession::HandleLootMoneyOpcode(), Group::MasterLoot(), and Group::UpdateLooterGuid().

◆ IsAtRecruitAFriendDistance()

bool Player::IsAtRecruitAFriendDistance ( WorldObject const *  pOther) const
12747{
12748 if (!pOther)
12749 return false;
12750 WorldObject const* player = GetCorpse();
12751 if (!player || IsAlive())
12752 player = this;
12753
12754 if (player->GetMapId() != pOther->GetMapId() || player->GetInstanceId() != pOther->GetInstanceId())
12755 return false;
12756
12757 return pOther->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE);
12758}
@ CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE
Definition: IWorld.h:197

References CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE, GetCorpse(), WorldObject::GetDistance(), WorldObject::GetInstanceId(), WorldLocation::GetMapId(), Unit::IsAlive(), and sWorld.

Referenced by GetsRecruitAFriendBonus().

◆ IsBagPos()

bool Player::IsBagPos ( uint16  pos)
static

◆ IsBankPos() [1/2]

◆ IsBankPos() [2/2]

bool Player::IsBankPos ( uint8  bag,
uint8  slot 
)
static
603{
604 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END))
605 return true;
606 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END))
607 return true;
608 if (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END)
609 return true;
610 return false;
611}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, and INVENTORY_SLOT_BAG_0.

◆ IsBaseRuneSlotsOnCooldown()

bool Player::IsBaseRuneSlotsOnCooldown ( RuneType  runeType) const
13429{
13430 for (uint8 i = 0; i < MAX_RUNES; ++i)
13431 if (GetBaseRune(i) == runeType && GetRuneCooldown(i) == 0)
13432 return false;
13433
13434 return true;
13435}
uint32 GetRuneCooldown(uint8 index) const
Definition: Player.h:2485

References GetBaseRune(), GetRuneCooldown(), and MAX_RUNES.

Referenced by Unit::HandleProcTriggerSpell().

◆ isBeingLoaded()

bool Player::isBeingLoaded ( ) const
overridevirtual

Reimplemented from Unit.

4929{
4930 return GetSession()->PlayerLoading();
4931}
bool PlayerLoading() const
Definition: WorldSession.h:337

References GetSession(), and WorldSession::PlayerLoading().

Referenced by _addSpell(), addTalent(), MapInstanced::CreateInstanceForPlayer(), SendInitialPacketsAfterAddToMap(), SetHonorPoints(), SetMover(), and UpdateObjectVisibility().

◆ IsBeingTeleported()

◆ IsBeingTeleportedFar()

bool Player::IsBeingTeleportedFar ( ) const
inline

◆ IsBeingTeleportedNear()

bool Player::IsBeingTeleportedNear ( ) const
inline

◆ IsClass()

bool Player::IsClass ( Classes  playerClass,
ClassContext  context = CLASS_CONTEXT_NONE 
) const
overridevirtual

Reimplemented from Unit.

1281{
1282 Optional<bool> scriptResult = sScriptMgr->OnPlayerIsClass(this, unitClass, context);
1283 if (scriptResult != std::nullopt)
1284 return *scriptResult;
1285 else
1286 return (getClass() == unitClass);
1287}

References Unit::getClass(), and sScriptMgr.

Referenced by _ApplyItemBonuses(), ActivateSpec(), ActivateTaxiPathTo(), AddSpellMod(), ApplyEnchantment(), CalculateTalentsPoints(), Group::CanJoinBattlegroundQueue(), CanResummonPet(), CanRollForItemInLFG(), CanUseItem(), Spell::CheckRuneCost(), Create(), WorldSession::DoLootRelease(), DuelComplete(), Spell::EffectActivateRune(), Spell::EffectSummonPet(), EquipItem(), spell_class_call_handler::FilterTargets(), FindEquipSlot(), Graveyard::GetClosestGraveyard(), GetNPCIfCanInteractWith(), spell_gen_on_tournament_mount::GetPennatSpellId(), GetStartPosition(), AuraEffect::HandleAuraConvertRune(), Aura::HandleAuraSpecificMods(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattlemasterJoinOpcode(), spell_item_refocus::HandleDummy(), WorldSession::HandleLootMoneyOpcode(), AuraEffect::HandlePeriodicDummyAuraTick(), Unit::HandleProcTriggerSpell(), reset_commandscript::HandleResetLevelCommand(), spell_gen_pet_summoned::HandleScript(), ArenaSpectator::HandleSpectatorSpectateCommand(), InitRunes(), Creature::isCanTrainingAndResetTalentsOf(), Pet::IsPermanentPetFor(), Creature::IsValidTrainerForPlayer(), LearnDefaultSkill(), Pet::LoadPetFromDB(), npc_bunthen_plainswind::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), PrepareGossipMenu(), RegenerateAll(), TeleportTo(), UpdateAttackPowerAndDamage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ IsCommentator()

bool Player::IsCommentator ( ) const
inline
@ PLAYER_FLAGS_COMMENTATOR2
Definition: Player.h:496

References HasPlayerFlag(), and PLAYER_FLAGS_COMMENTATOR2.

Referenced by GetChatTag(), and misc_commandscript::HandleCommentatorCommand().

◆ IsCurrentBattlegroundRandom()

bool Player::IsCurrentBattlegroundRandom ( ) const
inline
2235{ return m_bgData.bgIsRandom; }
bool bgIsRandom
Definition: Player.h:1040

References BGData::bgIsRandom, and m_bgData.

◆ IsDailyQuestDone()

bool Player::IsDailyQuestDone ( uint32  quest_id)
12070{
12071 if (sObjectMgr->GetQuestTemplate(quest_id))
12072 {
12073 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12074 {
12075 if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx) == quest_id)
12076 {
12077 return true;
12078 }
12079 }
12080 }
12081
12082 return false;
12083}

References Object::GetUInt32Value(), PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and sObjectMgr.

◆ IsDeserter()

bool Player::IsDeserter ( ) const
inline
2241{ return HasAura(26013); }

References Unit::HasAura().

◆ IsDeveloper()

bool Player::IsDeveloper ( ) const
inline
@ PLAYER_FLAGS_DEVELOPER
Definition: Player.h:489

References HasPlayerFlag(), and PLAYER_FLAGS_DEVELOPER.

Referenced by GetChatTag(), and misc_commandscript::HandleDevCommand().

◆ isDND()

◆ IsEquipmentPos() [1/2]

◆ IsEquipmentPos() [2/2]

bool Player::IsEquipmentPos ( uint8  bag,
uint8  slot 
)
static
594{
595 if (bag == INVENTORY_SLOT_BAG_0 && (slot < EQUIPMENT_SLOT_END))
596 return true;
598 return true;
599 return false;
600}

References EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, and INVENTORY_SLOT_BAG_START.

◆ IsExistPet()

bool Player::IsExistPet ( )
9153{
9154 PetStable* const petStable = GetPetStable();
9155 return petStable && (petStable->CurrentPet || petStable->GetUnslottedHunterPet());
9156}

References PetStable::CurrentPet, GetPetStable(), and PetStable::GetUnslottedHunterPet().

Referenced by CreatePet(), npc_commandscript::HandleNpcTameCommand(), and pet_commandscript::HandlePetCreateCommand().

◆ IsFalling()

bool Player::IsFalling ( ) const
2157{
2158 // Xinef: Added !IsInFlight check
2159 return GetPositionZ() < m_lastFallZ && !IsInFlight();
2160}

References Position::GetPositionZ(), Unit::IsInFlight(), and m_lastFallZ.

Referenced by lfg::LFGMgr::TeleportPlayer().

◆ IsFFAPvP()

bool Player::IsFFAPvP ( )
16171{
16172 bool result = Unit::IsFFAPvP();
16173
16174 sScriptMgr->OnIsFFAPvP(this, result);
16175
16176 return result;
16177}
bool IsFFAPvP() const
Definition: Unit.h:863

References Unit::IsFFAPvP(), and sScriptMgr.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), WorldSession::HandleRequestPartyMemberStatsOpcode(), RewardHonor(), UpdateFFAPvPFlag(), and UpdateFFAPvPState().

◆ IsGameMaster()

bool Player::IsGameMaster ( ) const
inline
1158{ return m_ExtraFlags & PLAYER_EXTRA_GM_ON; }
@ PLAYER_EXTRA_GM_ON
Definition: Player.h:585

References m_ExtraFlags, and PLAYER_EXTRA_GM_ON.

Referenced by ThreatMgr::_addThreat(), Group::_homebindIfInstance(), Unit::_IsValidAssistTarget(), Unit::_IsValidAttackTarget(), Unit::Attack(), GameObject::BuildValuesUpdate(), BuyItemFromVendorSlot(), npc_coren_direbrew::CanBeSeen(), go_loosely_turned_soil::go_loosely_turned_soilAI::CanBeSeen(), Group::CanJoinBattlegroundQueue(), InstanceMap::CannotEnter(), CanTameExoticPets(), Spell::CheckCast(), CheckInstanceLoginValid(), SpellInfo::CheckTarget(), AchievementMgr::CompletedAchievement(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), spell_class_call_polymorph::FilterTargets(), GetPhaseMaskForSpawn(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleBattlemasterJoinOpcode(), HandleFall(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInspectOpcode(), WorldSession::HandleMessagechatOpcode(), mmaps_commandscript::HandleMmapPathCommand(), misc_commandscript::HandlePInfoCommand(), Battlefield::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), tele_commandscript::HandleTeleCommand(), IsValidCombatTarget(), ThreatCalcHelper::isValidProcess(), WorldSession::LogoutPlayer(), MailSender::MailSender(), npc_ouro_spawner::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_barnes::OnGossipHello(), go_ulduar_pure_saronite_deposit::OnGossipHello(), at_trigger_the_beast_movement::OnTrigger(), at_the_beast_room::OnTrigger(), at_ancient_leaf::OnTrigger(), at_lady_deathwhisper_entrance::OnTrigger(), at_icc_gauntlet_event::OnTrigger(), at_icc_putricide_trap::OnTrigger(), at_hor_shadow_throne::OnTrigger(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Unit::PatchValuesUpdate(), MapMgr::PlayerCannotEnter(), Unit::ProcessTerrainStatusUpdate(), Battleground::RemovePlayerAtLeave(), boss_kologarn_pit_kill_bunny::Reset(), AchievementMgr::ResetAchievementCriteria(), Satisfy(), npc_minigob_manabonk::SelectTargetInDalaran(), WorldSession::SendListInventory(), Spell::SendLoot(), SetIsSpectator(), Unit::TauntApply(), Unit::TauntFadeOut(), TeleportTo(), ToggleAFK(), AchievementMgr::UpdateAchievementCriteria(), boss_nefarian::UpdateAI(), UpdateFFAPvPState(), UpdateHomebindTime(), and Whisper().

◆ isGMChat()

bool Player::isGMChat ( ) const
inline
@ PLAYER_EXTRA_GM_CHAT
Definition: Player.h:589

References m_ExtraFlags, and PLAYER_EXTRA_GM_CHAT.

Referenced by GetChatTag().

◆ isGMVisible()

bool Player::isGMVisible ( ) const
inline
@ PLAYER_EXTRA_GM_INVISIBLE
Definition: Player.h:588

References m_ExtraFlags, and PLAYER_EXTRA_GM_INVISIBLE.

Referenced by gm_commandscript::HandleGMVisibleCommand(), and Channel::Invite().

◆ IsGroupVisibleFor()

bool Player::IsGroupVisibleFor ( Player const *  p) const
2296{
2297 switch (sWorld->getIntConfig(CONFIG_GROUP_VISIBILITY))
2298 {
2299 default:
2300 return IsInSameGroupWith(p);
2301 case 1:
2302 return IsInSameRaidWith(p);
2303 case 2:
2304 return GetTeamId() == p->GetTeamId();
2305 }
2306}
@ CONFIG_GROUP_VISIBILITY
Definition: IWorld.h:266
bool IsInSameRaidWith(Player const *p) const
Definition: Player.h:1863
bool IsInSameGroupWith(Player const *p) const
Definition: Player.cpp:2308

References CONFIG_GROUP_VISIBILITY, GetTeamId(), IsInSameGroupWith(), IsInSameRaidWith(), and sWorld.

Referenced by IsAlwaysDetectableFor().

◆ isHonorOrXPTarget()

bool Player::isHonorOrXPTarget ( Unit victim) const
12615{
12616 uint8 v_level = victim->GetLevel();
12618
12619 // Victim level less gray level
12620 if (v_level <= k_grey)
12621 {
12622 return false;
12623 }
12624
12625 if (victim->IsCreature())
12626 {
12627 if (victim->IsTotem() || victim->IsCritter() || victim->IsPet() || (victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP))
12628 {
12629 return false;
12630 }
12631 }
12632
12633 return true;
12634}
@ CREATURE_FLAG_EXTRA_NO_XP
Definition: CreatureData.h:52
uint32 flags_extra
Definition: CreatureData.h:249
bool IsCritter() const
Definition: Unit.h:1018
bool IsTotem() const
Definition: Unit.h:756

References CREATURE_FLAG_EXTRA_NO_XP, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), Object::IsCreature(), Unit::IsCritter(), Unit::IsPet(), Unit::IsTotem(), and Object::ToCreature().

Referenced by spell_warl_drain_soul::HandleTick(), Unit::IsTriggeredAtSpellProcEvent(), achievement_killed_exp_or_honor_target::OnCheck(), RaiseDeadCheck::operator()(), spell_warl_drain_soul::RemoveEffect(), and spell_warl_shadowburn::RemoveEffect().

◆ IsImmuneToEnvironmentalDamage()

bool Player::IsImmuneToEnvironmentalDamage ( )
749{
750 // check for GM and death state included in isAttackableByAOE
751 return (!isTargetableForAttack(false, nullptr)) || isTotalImmune();
752}
bool isTargetableForAttack(bool checkFakeDeath=true, Unit const *byWho=nullptr) const
Definition: Unit.cpp:13794

References Unit::isTargetableForAttack(), and isTotalImmune().

Referenced by EnvironmentalDamage().

◆ IsInAreaTriggerRadius()

bool Player::IsInAreaTriggerRadius ( AreaTrigger const *  trigger,
float  delta = 0.f 
) const
2184{
2185 if (!trigger || GetMapId() != trigger->map)
2186 return false;
2187
2188 if (trigger->radius > 0)
2189 {
2190 // if we have radius check it
2191 float dist = GetDistance(trigger->x, trigger->y, trigger->z);
2192 if (dist > trigger->radius + delta)
2193 return false;
2194 }
2195 else
2196 {
2197 Position center(trigger->x, trigger->y, trigger->z, trigger->orientation);
2198 if (!IsWithinBox(center, trigger->length / 2 + delta, trigger->width / 2 + delta, trigger->height / 2 + delta))
2199 return false;
2200 }
2201
2202 return true;
2203}
Definition: Position.h:28
bool IsWithinBox(const Position &center, float xradius, float yradius, float zradius) const
Definition: Position.cpp:110

References WorldObject::GetDistance(), WorldLocation::GetMapId(), AreaTrigger::height, Position::IsWithinBox(), AreaTrigger::length, AreaTrigger::map, AreaTrigger::orientation, AreaTrigger::radius, AreaTrigger::width, AreaTrigger::x, AreaTrigger::y, and AreaTrigger::z.

Referenced by WorldSession::HandleAreaTriggerOpcode(), and Update().

◆ IsInSameGroupWith()

bool Player::IsInSameGroupWith ( Player const *  p) const
2309{
2310 return p == this || (GetGroup() &&
2311 GetGroup() == p->GetGroup() &&
2312 GetGroup()->SameSubGroup(this, p));
2313}
bool SameSubGroup(ObjectGuid guid1, ObjectGuid guid2) const
Definition: Group.cpp:2363

References GetGroup(), and Group::SameSubGroup().

Referenced by IsGroupVisibleFor(), and Unit::IsInPartyWith().

◆ IsInSameRaidWith()

◆ IsInventoryPos() [1/2]

◆ IsInventoryPos() [2/2]

bool Player::IsInventoryPos ( uint8  bag,
uint8  slot 
)
static
581{
582 if (bag == INVENTORY_SLOT_BAG_0 && slot == NULL_SLOT)
583 return true;
585 return true;
587 return true;
588 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END))
589 return true;
590 return false;
591}

References CURRENCYTOKEN_SLOT_END, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_START, and NULL_SLOT.

◆ IsInvitedForBattlegroundInstance() [1/2]

bool Player::IsInvitedForBattlegroundInstance ( ) const
inline
2234{ return m_bgData.isInvited; }
bool isInvited
Definition: Player.h:1039

References BGData::isInvited, and m_bgData.

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::LogoutPlayer().

◆ IsInvitedForBattlegroundInstance() [2/2]

bool Player::IsInvitedForBattlegroundInstance ( uint32  instanceId) const
12242{
12243 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12244 if (_BgBattlegroundQueueID[i].invitedToInstance == instanceId)
12245 return true;
12246
12247 return false;
12248}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

◆ IsInvitedForBattlegroundQueueType()

bool Player::IsInvitedForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId) const
12184{
12185 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12186 if (_BgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
12187 return _BgBattlegroundQueueID[i].invitedToInstance != 0;
12188
12189 return false;
12190}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by WorldSession::HandleBattleFieldPortOpcode().

◆ IsInWater()

bool Player::IsInWater ( ) const
inlineoverridevirtual

Reimplemented from Unit.

1119{ return m_isInWater; }

References m_isInWater.

Referenced by WorldSession::HandleMovementOpcodes().

◆ IsInWhisperWhiteList()

bool Player::IsInWhisperWhiteList ( ObjectGuid  guid)
15841{
15842 for (auto const& itr : WhisperList)
15843 {
15844 if (itr == guid)
15845 {
15846 return true;
15847 }
15848 }
15849
15850 return false;
15851}

References WhisperList.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ IsMaxLevel()

bool Player::IsMaxLevel ( ) const

◆ IsMirrorTimerActive()

bool Player::IsMirrorTimerActive ( MirrorTimerType  type)
inline
2038{ return m_MirrorTimer[type] == getMaxTimer(type); }

References getMaxTimer(), and m_MirrorTimer.

Referenced by lfg::LFGMgr::TeleportPlayer().

◆ IsNeedCastPassiveSpellAtLearn()

bool Player::IsNeedCastPassiveSpellAtLearn ( SpellInfo const *  spellInfo) const
3263{
3264 // note: form passives activated with shapeshift spells be implemented by HandleShapeshiftBoosts instead of spell_learn_spell
3265 // talent dependent passives activated at form apply have proper stance data
3267 return (!spellInfo->Stances || (form && (spellInfo->Stances & (1 << (form - 1)))) ||
3268 (!form && spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED)));
3269}
@ SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED
Definition: SharedDefines.h:475

References Unit::GetShapeshiftForm(), SpellInfo::HasAttribute(), SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED, and SpellInfo::Stances.

Referenced by _addSpell(), and _addTalentAurasAndSpells().

◆ IsNeverVisible()

bool Player::IsNeverVisible ( ) const
overridevirtual

Reimplemented from WorldObject.

11395{
11397 return true;
11398
11399 if (GetSession()->PlayerLogout() || GetSession()->PlayerLoading())
11400 return true;
11401
11402 return false;
11403}
virtual bool IsNeverVisible() const
Definition: Object.h:662

References GetSession(), and WorldObject::IsNeverVisible().

◆ IsOutdoorPvPActive()

bool Player::IsOutdoorPvPActive ( )

◆ IsPetNeedBeTemporaryUnsummoned()

bool Player::IsPetNeedBeTemporaryUnsummoned ( ) const
inline

◆ IsPvP()

bool Player::IsPvP ( )
16180{
16181 bool result = Unit::IsPvP();
16182
16183 sScriptMgr->OnIsPvP(this, result);
16184
16185 return result;
16186}
bool IsPvP() const
Definition: Unit.h:862

References Unit::IsPvP(), and sScriptMgr.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), DuelComplete(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleRequestPartyMemberStatsOpcode(), IsOutdoorPvPActive(), UpdatePvPFlag(), and UpdatePvPState().

◆ IsQuestRewarded()

bool Player::IsQuestRewarded ( uint32  quest_id) const
inline

◆ isResurrectRequested()

bool Player::isResurrectRequested ( ) const
inline

◆ isResurrectRequestedBy()

bool Player::isResurrectRequestedBy ( ObjectGuid  guid) const
inline
1804{ return m_resurrectGUID && m_resurrectGUID == guid; }

References m_resurrectGUID.

◆ IsSpectator()

◆ IsSpellFitByClassAndRace()

bool Player::IsSpellFitByClassAndRace ( uint32  spell_id) const
12311{
12312 uint32 racemask = getRaceMask();
12313 uint32 classmask = getClassMask();
12314
12315 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id);
12316 if (bounds.first == bounds.second)
12317 return true;
12318
12319 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
12320 {
12321 // skip wrong race skills
12322 if (_spell_idx->second->RaceMask && (_spell_idx->second->RaceMask & racemask) == 0)
12323 continue;
12324
12325 // skip wrong class skills
12326 if (_spell_idx->second->ClassMask && (_spell_idx->second->ClassMask & classmask) == 0)
12327 continue;
12328
12329 return true;
12330 }
12331
12332 return false;
12333}

References Unit::getClassMask(), Unit::getRaceMask(), and sSpellMgr.

Referenced by GetTrainerSpellState(), learn_commandscript::HandleLearnAllMySpellsCommand(), and WorldSession::SendTrainerList().

◆ IsSummonAsSpectator()

bool Player::IsSummonAsSpectator ( ) const

◆ isTaxiCheater()

bool Player::isTaxiCheater ( ) const
inline

◆ isTotalImmune()

bool Player::isTotalImmune ( ) const
13260{
13262
13263 uint32 immuneMask = 0;
13264 for (AuraEffectList::const_iterator itr = immune.begin(); itr != immune.end(); ++itr)
13265 {
13266 immuneMask |= (*itr)->GetMiscValue();
13267 if (immuneMask & SPELL_SCHOOL_MASK_ALL) // total immunity
13268 return true;
13269 }
13270 return false;
13271}
@ SPELL_AURA_SCHOOL_IMMUNITY
Definition: SpellAuraDefines.h:102
@ SPELL_SCHOOL_MASK_ALL
Definition: SharedDefines.h:315

References Unit::GetAuraEffectsByType(), SPELL_AURA_SCHOOL_IMMUNITY, and SPELL_SCHOOL_MASK_ALL.

Referenced by CanUseBattlegroundObject(), and IsImmuneToEnvironmentalDamage().

◆ IsTotemCategoryCompatiableWith()

bool Player::IsTotemCategoryCompatiableWith ( ItemTemplate const *  pProto,
uint32  requiredTotemCategoryId 
) const
905{
906 if (requiredTotemCategoryId == 0)
907 return true;
908 if (pProto->TotemCategory == 0)
909 return false;
910
911 TotemCategoryEntry const* itemEntry = sTotemCategoryStore.LookupEntry(pProto->TotemCategory);
912 if (!itemEntry)
913 return false;
914 TotemCategoryEntry const* reqEntry = sTotemCategoryStore.LookupEntry(requiredTotemCategoryId);
915 if (!reqEntry)
916 return false;
917
918 if (itemEntry->categoryType != reqEntry->categoryType)
919 return false;
920
921 if ((itemEntry->categoryMask & reqEntry->categoryMask) != reqEntry->categoryMask)
922 return false;
923
924 // xinef: check skill requirements, needed for enchants!
925 if (pProto->RequiredSkill)
926 if (this->GetSkillValue(pProto->RequiredSkill) < pProto->RequiredSkillRank)
927 return false;
928
929 return true;
930}
DBCStorage< TotemCategoryEntry > sTotemCategoryStore(TotemCategoryEntryfmt)
Definition: DBCStructure.h:1994
uint32 categoryType
Definition: DBCStructure.h:1998
uint32 categoryMask
Definition: DBCStructure.h:1999

References TotemCategoryEntry::categoryMask, TotemCategoryEntry::categoryType, GetSkillValue(), ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, sTotemCategoryStore, and ItemTemplate::TotemCategory.

Referenced by HasItemTotemCategory().

◆ IsTwoHandUsed()

◆ isUsingLfg()

bool Player::isUsingLfg ( )
13017{
13018 return sLFGMgr->GetState(GetGUID()) != lfg::LFG_STATE_NONE;
13019}
@ LFG_STATE_NONE
Definition: LFG.h:71

References Object::GetGUID(), lfg::LFG_STATE_NONE, and sLFGMgr.

Referenced by misc_commandscript::HandleSkirmishCommand(), and ArenaSpectator::HandleSpectatorSpectateCommand().

◆ IsValidGender()

static bool Player::IsValidGender ( uint8  Gender)
inlinestatic
1561{ return Gender <= GENDER_FEMALE; }
Gender
Definition: SharedDefines.h:60

References GENDER_FEMALE.

Referenced by BuildEnumData(), Create(), ConditionMgr::isConditionTypeValid(), and LoadFromDB().

◆ IsValidPos() [1/2]

bool Player::IsValidPos ( uint16  pos,
bool  explicit_pos 
)
inline
1261{ return IsValidPos(pos >> 8, pos & 255, explicit_pos); }
bool IsValidPos(uint16 pos, bool explicit_pos)
Definition: Player.h:1261

References IsValidPos().

Referenced by WorldSession::HandleAutoStoreBagItemOpcode(), item_commandscript::HandleItemMoveCommand(), WorldSession::HandleSplitItemOpcode(), WorldSession::HandleSwapInvItemOpcode(), WorldSession::HandleSwapItem(), and IsValidPos().

◆ IsValidPos() [2/2]

bool Player::IsValidPos ( uint8  bag,
uint8  slot,
bool  explicit_pos 
)
625{
626 // post selected
627 if (bag == NULL_BAG && !explicit_pos)
628 return true;
629
630 if (bag == INVENTORY_SLOT_BAG_0)
631 {
632 // any post selected
633 if (slot == NULL_SLOT && !explicit_pos)
634 return true;
635
636 // equipment
637 if (slot < EQUIPMENT_SLOT_END)
638 return true;
639
640 // bag equip slots
642 return true;
643
644 // backpack slots
646 return true;
647
648 // keyring slots
649 if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_END)
650 return true;
651
652 // bank main slots
653 if (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END)
654 return true;
655
656 // bank bag slots
657 if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
658 return true;
659
660 return false;
661 }
662
663 // bag content slots
664 // bank bag content slots
665 if (Bag* pBag = GetBagByPos(bag))
666 {
667 // any post selected
668 if (slot == NULL_SLOT && !explicit_pos)
669 return true;
670
671 return slot < pBag->GetBagSize();
672 }
673
674 // where this?
675 return false;
676}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, EQUIPMENT_SLOT_END, GetBagByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_END, KEYRING_SLOT_START, NULL_BAG, and NULL_SLOT.

◆ IsVisibleGloballyFor()

bool Player::IsVisibleGloballyFor ( Player const *  player) const
11440{
11441 if (!u)
11442 return false;
11443
11444 // Always can see self
11445 if (u == this)
11446 return true;
11447
11448 // Visible units, always are visible for all players
11449 if (IsVisible())
11450 return true;
11451
11452 // GMs are visible for higher gms (or players are visible for gms)
11453 if (!AccountMgr::IsPlayerAccount(u->GetSession()->GetSecurity()))
11454 return GetSession()->GetSecurity() <= u->GetSession()->GetSecurity();
11455
11456 if (!sScriptMgr->NotVisibleGloballyFor(const_cast<Player*>(this), u))
11457 return true;
11458
11459 // non faction visibility non-breakable for non-GMs
11460 return false;
11461}
bool IsVisible() const
Definition: Unit.h:1470
AccountTypes GetSecurity() const
Definition: WorldSession.h:359

References WorldSession::GetSecurity(), GetSession(), AccountMgr::IsPlayerAccount(), Unit::IsVisible(), and sScriptMgr.

Referenced by SocialMgr::BroadcastToFriendListers(), SocialMgr::GetFriendInfo(), WorldSession::HandleAddFriendOpcode(), and ChatHandler::needReportToTarget().

◆ ItemAddedQuestCheck()

void Player::ItemAddedQuestCheck ( uint32  entry,
uint32  count 
)
1830{
1831 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1832 {
1833 uint32 questid = GetQuestSlotQuestId(i);
1834 if (questid == 0)
1835 continue;
1836
1837 QuestStatusData& q_status = m_QuestStatus[questid];
1838
1839 if (q_status.Status != QUEST_STATUS_INCOMPLETE)
1840 continue;
1841
1842 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1843 if (!qInfo || !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
1844 continue;
1845
1846 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
1847 {
1848 uint32 reqitem = qInfo->RequiredItemId[j];
1849 if (reqitem == entry)
1850 {
1851 uint32 reqitemcount = qInfo->RequiredItemCount[j];
1852 uint16 curitemcount = q_status.ItemCount[j];
1853 if (curitemcount < reqitemcount)
1854 {
1855 q_status.ItemCount[j] = std::min<uint16>(q_status.ItemCount[j] + count, reqitemcount);
1856 m_QuestStatusSave[questid] = true;
1857 }
1858 if (CanCompleteQuest(questid))
1859 CompleteQuest(questid);
1860 else
1862 }
1863 }
1864 }
1866}

References ADDITIONAL_SAVING_INVENTORY_AND_GOLD, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, QuestStatusData::Status, and UpdateForQuestWorldObjects().

Referenced by Spell::EffectSummonChangeItem(), EquipNewItem(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), MoveItemToInventory(), StoreNewItem(), and SwapItem().

◆ ItemRemovedQuestCheck()

void Player::ItemRemovedQuestCheck ( uint32  entry,
uint32  count 
)
1869{
1870 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1871 {
1872 uint32 questid = GetQuestSlotQuestId(i);
1873 if (!questid)
1874 continue;
1875
1876 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1877 if (!qInfo)
1878 continue;
1879
1881 continue;
1882
1883 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
1884 {
1885 uint32 reqitem = qInfo->RequiredItemId[j];
1886 if (reqitem == entry)
1887 {
1888 QuestStatusData& q_status = m_QuestStatus[questid];
1889 uint32 reqitemcount = qInfo->RequiredItemCount[j];
1890 uint16 curitemcount = q_status.ItemCount[j];
1891
1892 if (q_status.ItemCount[j] >= reqitemcount) // we may have more than what the status shows
1893 curitemcount = GetItemCount(entry, false);
1894
1895 uint16 newItemCount = (count > curitemcount) ? 0 : curitemcount - count;
1896 newItemCount = std::min<uint16>(newItemCount, reqitemcount);
1897 if (newItemCount != q_status.ItemCount[j])
1898 {
1899 q_status.ItemCount[j] = newItemCount;
1900 m_QuestStatusSave[questid] = true;
1901 IncompleteQuest(questid);
1902 }
1903 }
1904 }
1905 }
1907}
void IncompleteQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:641

References GetItemCount(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), IncompleteQuest(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, and UpdateForQuestWorldObjects().

Referenced by DestroyItem(), DestroyItemCount(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleSellItemOpcode(), MoveItemFromInventory(), and SwapItem().

◆ JoinedChannel()

void Player::JoinedChannel ( Channel c)
4937{
4938 m_channels.push_back(c);
4939}

References m_channels.

Referenced by Channel::JoinChannel().

◆ KillCreditGO()

void Player::KillCreditGO ( uint32  entry,
ObjectGuid  guid = ObjectGuid::Empty 
)
2051{
2052 uint16 addCastCount = 1;
2053 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2054 {
2055 uint32 questid = GetQuestSlotQuestId(i);
2056 if (!questid)
2057 continue;
2058
2059 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2060 if (!qInfo)
2061 continue;
2062
2063 QuestStatusData& q_status = m_QuestStatus[questid];
2064
2065 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2066 {
2067 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL)*/)
2068 {
2069 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
2070 {
2071 uint32 reqTarget = 0;
2072
2073 // GO activate objective
2074 if (qInfo->RequiredNpcOrGo[j] < 0)
2075 // checked at quest_template loading
2076 reqTarget = - qInfo->RequiredNpcOrGo[j];
2077
2078 // other not this creature/GO related objectives
2079 if (reqTarget != entry)
2080 continue;
2081
2082 uint32 reqCastCount = qInfo->RequiredNpcOrGoCount[j];
2083 uint16 curCastCount = q_status.CreatureOrGOCount[j];
2084 if (curCastCount < reqCastCount)
2085 {
2086 q_status.CreatureOrGOCount[j] = curCastCount + addCastCount;
2087
2088 m_QuestStatusSave[questid] = true;
2089
2090 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curCastCount, addCastCount);
2091 }
2092
2093 if (CanCompleteQuest(questid))
2094 CompleteQuest(questid);
2095 else
2097
2098 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
2099 break;
2100 }
2101 }
2102 }
2103 }
2104}
void SendQuestUpdateAddCreatureOrGo(Quest const *quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count)
Definition: PlayerQuest.cpp:2450

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, GetQuestSlotQuestId(), Quest::HasSpecialFlag(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, and QuestStatusData::Status.

Referenced by GameObject::Use().

◆ KilledMonster()

void Player::KilledMonster ( CreatureTemplate const *  cInfo,
ObjectGuid  guid 
)
1910{
1911 ASSERT(cInfo);
1912
1913 if (cInfo->Entry)
1914 KilledMonsterCredit(cInfo->Entry, guid);
1915
1916 for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i)
1917 if (cInfo->KillCredit[i])
1918 KilledMonsterCredit(cInfo->KillCredit[i]);
1919}
#define MAX_KILL_CREDIT
Definition: CreatureData.h:31
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition: PlayerQuest.cpp:1921

References ASSERT, CreatureTemplate::Entry, CreatureTemplate::KillCredit, KilledMonsterCredit(), and MAX_KILL_CREDIT.

Referenced by KillRewarder::_RewardKillCredit(), and npc_drakuru_shackles::npc_drakuru_shacklesAI::SpellHit().

◆ KilledMonsterCredit()

void Player::KilledMonsterCredit ( uint32  entry,
ObjectGuid  guid = ObjectGuid::Empty 
)
1922{
1923 uint16 addkillcount = 1;
1924 uint32 real_entry = entry;
1925 if (guid)
1926 {
1927 Creature* killed = GetMap()->GetCreature(guid);
1928 if (killed && killed->GetEntry())
1929 real_entry = killed->GetEntry();
1930 }
1931
1932 StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_CREATURE, real_entry); // MUST BE CALLED FIRST
1933 UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, real_entry, addkillcount, guid ? GetMap()->GetCreature(guid) : nullptr);
1934
1935 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1936 {
1937 uint32 questid = GetQuestSlotQuestId(i);
1938 if (!questid)
1939 continue;
1940
1941 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1942 if (!qInfo)
1943 continue;
1944 // just if !ingroup || !noraidgroup || raidgroup
1945 // xinef: or is pvp quest, and player in BG/BF group
1946 QuestStatusData& q_status = m_QuestStatus[questid];
1947 if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty()) ||
1948 (qInfo->IsPVPQuest() && (GetGroup()->isBFGroup() || GetGroup()->isBGGroup()))))
1949 {
1950 if (!sScriptMgr->PassedQuestKilledMonsterCredit(this, qInfo, entry, real_entry, guid))
1951 continue;
1952
1953 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST)*/)
1954 {
1955 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
1956 {
1957 // skip GO activate objective or none
1958 if (qInfo->RequiredNpcOrGo[j] <= 0)
1959 continue;
1960
1961 uint32 reqkill = qInfo->RequiredNpcOrGo[j];
1962
1963 if (reqkill == real_entry)
1964 {
1965 uint32 reqkillcount = qInfo->RequiredNpcOrGoCount[j];
1966 uint16 curkillcount = q_status.CreatureOrGOCount[j];
1967 if (curkillcount < reqkillcount)
1968 {
1969 q_status.CreatureOrGOCount[j] = curkillcount + addkillcount;
1970
1971 m_QuestStatusSave[questid] = true;
1972
1973 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curkillcount, addkillcount);
1974 }
1975 if (CanCompleteQuest(questid))
1976 CompleteQuest(questid);
1977 else
1979
1980 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
1981 break;
1982 }
1983 }
1984 }
1985 }
1986 }
1987}
@ ACHIEVEMENT_TIMED_TYPE_CREATURE
Definition: DBCEnums.h:114
@ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE
Definition: DBCEnums.h:122
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:213
Creature * GetCreature(ObjectGuid const guid)
Definition: Map.cpp:3314
bool IsPVPQuest() const
Definition: QuestDef.h:294

References ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEVEMENT_TIMED_TYPE_CREATURE, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, Map::GetCreature(), GetDifficulty(), Object::GetEntry(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), Quest::IsAllowedInRaid(), Quest::IsPVPQuest(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_KILL, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, sScriptMgr, StartTimedAchievement(), QuestStatusData::Status, and UpdateAchievementCriteria().

Referenced by npc_dragonmaw_peon::npc_dragonmaw_peonAI::CreditPlayer(), BattlegroundAV::EventPlayerAssaultsPoint(), BattlegroundAB::EventPlayerClickedOnFlag(), go_tadpole_cage::go_tadpole_cageAI::GossipHello(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), spell_q10714_on_spirits_wings::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), spell_q12937_relief_for_the_fallen::HandleDummy(), spell_q12659_ahunaes_knife::HandleDummy(), spell_q9874_liquid_fire::HandleDummy(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), OutdoorPvPNA::HandleKillImpl(), BattlegroundAV::HandleKillUnit(), spell_q12805_lifeblood_dummy::HandleScript(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q11065_wrangle_some_aether_rays_aura::if(), spell_gen_have_item_auras::if(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), KilledMonster(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), go_scourge_enclosure::OnGossipHello(), go_warmaul_prison::OnGossipHello(), go_scourge_cage::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), go_veil_skith_cage::OnGossipHello(), npc_captain_saeed::OnGossipSelect(), RewardPlayerAndGroupAtEvent(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), npc_hallows_end_train_fire::SpellHit(), npc_jungle_punch_target::npc_jungle_punch_targetAI::SpellHit(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ KilledPlayerCredit()

void Player::KilledPlayerCredit ( uint16  count = 1)
1990{
1991 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1992 {
1993 uint32 questid = GetQuestSlotQuestId(i);
1994 if (!questid)
1995 {
1996 continue;
1997 }
1998
1999 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2000 if (!qInfo)
2001 {
2002 continue;
2003 }
2004
2005 // just if !ingroup || !noraidgroup || raidgroup
2006 QuestStatusData& q_status = m_QuestStatus[questid];
2007 if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty())))
2008 {
2009 // Xinef: PvP Killing quest require player to be in same zone as quest zone (only 2 quests so no doubt, can be extended to conditions in cata ;s)
2010 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL) && (qInfo->GetZoneOrSort() >= 0 && GetZoneId() == uint32(qInfo->GetZoneOrSort())))
2011 {
2012 KilledPlayerCreditForQuest(count, qInfo);
2013 break; // there is only one quest per zone
2014 }
2015 }
2016 }
2017}
void KilledPlayerCreditForQuest(uint16 count, Quest const *quest)
Definition: PlayerQuest.cpp:2019
int32 GetZoneOrSort() const
Definition: QuestDef.h:229

References GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), WorldObject::GetZoneId(), Quest::GetZoneOrSort(), Quest::HasSpecialFlag(), Quest::IsAllowedInRaid(), KilledPlayerCreditForQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by KillRewarder::_RewardPlayer().

◆ KilledPlayerCreditForQuest()

void Player::KilledPlayerCreditForQuest ( uint16  count,
Quest const *  quest 
)
2020{
2021 uint32 const questId = quest->GetQuestId();
2022
2023 auto it = m_QuestStatus.find(questId);
2024 if (it == m_QuestStatus.end())
2025 {
2026 return;
2027 }
2028
2029 QuestStatusData& questStatus = it->second;
2030
2031 uint16 curKill = questStatus.PlayerCount;
2032 uint32 reqKill = quest->GetPlayersSlain();
2033
2034 if (curKill < reqKill)
2035 {
2036 count = std::min<uint16>(reqKill - curKill, count);
2037 questStatus.PlayerCount = curKill + count;
2038
2039 m_QuestStatusSave[quest->GetQuestId()] = true;
2040
2041 SendQuestUpdateAddPlayer(quest, curKill, count);
2042 }
2043
2044 if (CanCompleteQuest(questId))
2045 {
2046 CompleteQuest(questId);
2047 }
2048}
void SendQuestUpdateAddPlayer(Quest const *quest, uint16 old_count, uint16 add_count)
Definition: PlayerQuest.cpp:2473

References CanCompleteQuest(), CompleteQuest(), Quest::GetPlayersSlain(), Quest::GetQuestId(), m_QuestStatus, m_QuestStatusSave, QuestStatusData::PlayerCount, and SendQuestUpdateAddPlayer().

Referenced by KilledPlayerCredit().

◆ KillPlayer()

void Player::KillPlayer ( )
4494{
4495 if (IsFlying() && !GetTransport())
4497
4499
4500 StopMirrorTimers(); //disable timers(bars)
4501
4502 setDeathState(DeathState::Corpse);
4503 //SetUnitFlag(UNIT_FLAG_NOT_IN_PVP);
4504
4507
4508 // 6 minutes until repop at graveyard
4510
4511 UpdateCorpseReclaimDelay(); // dependent at use SetDeathPvP() call before kill
4512
4513 int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
4514
4515 if (corpseReclaimDelay >= 0)
4516 SendCorpseReclaimDelay(corpseReclaimDelay);
4517
4518 sScriptMgr->OnPlayerJustDied(this);
4519 // don't create corpse at this moment, player might be falling
4520
4521 // update visibility
4522 //UpdateObjectVisibility(); // pussywizard: not needed
4523}
@ SPELL_AURA_PREVENT_RESURRECTION
Definition: SpellAuraDefines.h:377
@ PLAYER_FIELD_BYTE_RELEASE_TIMER
Definition: Player.h:560
@ MOVE_ROOT
Definition: Player.h:456
@ UNIT_DYNFLAG_NONE
Definition: SharedDefines.h:3120
void ApplyModFlag(uint16 index, uint32 flag, bool apply)
Definition: Object.cpp:899
void UpdateCorpseReclaimDelay()
Definition: PlayerUpdates.cpp:1879
void setDeathState(DeathState s, bool despawn=false) override
Definition: Player.cpp:1014
void ReplaceAllDynamicFlags(uint32 flag) override
Definition: Unit.h:666
MotionMaster * GetMotionMaster()
Definition: Unit.h:1605
bool IsFlying() const
Definition: Unit.h:1728
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:624

References Object::ApplyModFlag(), CalculateCorpseReclaimDelay(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), WorldObject::GetTransport(), Unit::HasAuraType(), IN_MILLISECONDS, Unit::IsFlying(), m_deathTimer, MINUTE, MOVE_ROOT, MotionMaster::MoveFall(), PLAYER_FIELD_BYTE_RELEASE_TIMER, PLAYER_FIELD_BYTES, Unit::ReplaceAllDynamicFlags(), SendCorpseReclaimDelay(), setDeathState(), SetMovement(), sMapStore, SPELL_AURA_PREVENT_RESURRECTION, sScriptMgr, StopMirrorTimers(), UNIT_DYNFLAG_NONE, and UpdateCorpseReclaimDelay().

Referenced by WorldSession::HandleMovementOpcodes(), WorldSession::HandleRepopRequestOpcode(), WorldSession::LogoutPlayer(), and Update().

◆ LearnCustomSpells()

void Player::LearnCustomSpells ( )
11791{
11792 if (!sWorld->getBoolConfig(CONFIG_START_CUSTOM_SPELLS))
11793 {
11794 return;
11795 }
11796
11797 // learn default race/class spells
11798 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
11799 ASSERT(info);
11800 for (PlayerCreateInfoSpells::const_iterator itr = info->customSpells.begin(); itr != info->customSpells.end(); ++itr)
11801 {
11802 uint32 tspell = *itr;
11803 LOG_DEBUG("entities.player.loading", "Player::LearnCustomSpells: Player '{}' ({}, Class: {} Race: {}): Adding initial spell (SpellID: {})",
11804 GetName(), GetGUID().ToString(), uint32(getClass()), uint32(getRace()), tspell);
11805 if (!IsInWorld()) // will send in INITIAL_SPELLS in list anyway at map add
11806 {
11807 addSpell(tspell, SPEC_MASK_ALL, true);
11808 }
11809 else // but send in normal spell in game learn case
11810 {
11811 learnSpell(tspell);
11812 }
11813 }
11814}
@ CONFIG_START_CUSTOM_SPELLS
Definition: IWorld.h:130
PlayerCreateInfoSpells customSpells
Definition: Player.h:348

References addSpell(), ASSERT, CONFIG_START_CUSTOM_SPELLS, PlayerInfo::customSpells, Unit::getClass(), Object::GetGUID(), WorldObject::GetName(), Unit::getRace(), Object::IsInWorld(), learnSpell(), LOG_DEBUG, sObjectMgr, SPEC_MASK_ALL, sWorld, and Position::ToString().

Referenced by Create(), learn_commandscript::HandleLearnAllDefaultCommand(), LoadFromDB(), and resetSpells().

◆ LearnDefaultSkill()

void Player::LearnDefaultSkill ( uint32  skillId,
uint16  rank 
)
11831{
11832 SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(skillId, getRace(), getClass());
11833 if (!rcInfo)
11834 return;
11835
11836 LOG_DEBUG("entities.player.loading", "PLAYER (Class: {} Race: {}): Adding initial skill, id = {}", uint32(getClass()), uint32(getRace()), skillId);
11837 switch (GetSkillRangeType(rcInfo))
11838 {
11840 SetSkill(skillId, 0, 300, 300);
11841 break;
11842 case SKILL_RANGE_LEVEL:
11843 {
11844 uint16 skillValue = 1;
11845 uint16 maxValue = GetMaxSkillValueForLevel();
11846 if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL) && !IsProfessionOrRidingSkill(skillId))
11847 {
11848 skillValue = maxValue;
11849 }
11850 else if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
11851 {
11852 skillValue = maxValue;
11853 }
11855 {
11856 skillValue = std::min(std::max<uint16>({ 1, uint16((GetLevel() - 1) * 5) }), maxValue);
11857 }
11858 else if (skillId == SKILL_FIST_WEAPONS)
11859 {
11860 skillValue = std::max<uint16>(1, GetSkillValue(SKILL_UNARMED));
11861 }
11862 else if (skillId == SKILL_LOCKPICKING)
11863 {
11864 skillValue = std::max<uint16>(1, GetSkillValue(SKILL_LOCKPICKING));
11865 }
11866
11867 SetSkill(skillId, 0, skillValue, maxValue);
11868 break;
11869 }
11870 case SKILL_RANGE_MONO:
11871 SetSkill(skillId, 0, 1, 1);
11872 break;
11873 case SKILL_RANGE_RANK:
11874 {
11875 if (!rank)
11876 {
11877 break;
11878 }
11879
11880 SkillTiersEntry const* tier = sSkillTiersStore.LookupEntry(rcInfo->SkillTierID);
11881 uint16 maxValue = tier->Value[std::max<int32>(rank - 1, 0)];
11882 uint16 skillValue = 1;
11883 if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
11884 {
11885 skillValue = maxValue;
11886 }
11888 {
11889 skillValue = std::min(std::max<uint16>({ uint16(1), uint16((GetLevel() - 1) * 5) }), maxValue);
11890 }
11891
11892 SetSkill(skillId, rank, skillValue, maxValue);
11893 break;
11894 }
11895 default:
11896 break;
11897 }
11898}
bool IsProfessionOrRidingSkill(uint32 skill)
Definition: SpellMgr.h:623
@ SKILL_RANGE_RANK
Definition: ObjectMgr.h:677
@ CLASS_CONTEXT_SKILL
Definition: UnitDefines.h:211
@ SKILL_FLAG_ALWAYS_MAX_VALUE
Definition: DBCEnums.h:386
uint32 SkillTierID
Definition: DBCStructure.h:1576
uint32 Flags
Definition: DBCStructure.h:1574
uint32 Value[MAX_SKILL_STEP]
Definition: DBCStructure.h:1618

References CLASS_CONTEXT_SKILL, CLASS_DEATH_KNIGHT, CONFIG_ALWAYS_MAXSKILL, SkillRaceClassInfoEntry::Flags, Unit::getClass(), Unit::GetLevel(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), GetSkillValue(), IsClass(), IsProfessionOrRidingSkill(), LOG_DEBUG, SetSkill(), SKILL_FIST_WEAPONS, SKILL_FLAG_ALWAYS_MAX_VALUE, SKILL_LOCKPICKING, SKILL_RANGE_LANGUAGE, SKILL_RANGE_LEVEL, SKILL_RANGE_MONO, SKILL_RANGE_RANK, SKILL_UNARMED, SkillRaceClassInfoEntry::SkillTierID, sSkillTiersStore, sWorld, and SkillTiersEntry::Value.

Referenced by _addSpell(), and LearnDefaultSkills().

◆ LearnDefaultSkills()

void Player::LearnDefaultSkills ( )
11817{
11818 // learn default race/class skills
11819 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
11820 for (PlayerCreateInfoSkills::const_iterator itr = info->skills.begin(); itr != info->skills.end(); ++itr)
11821 {
11822 uint32 skillId = itr->SkillId;
11823 if (HasSkill(skillId))
11824 continue;
11825
11826 LearnDefaultSkill(skillId, itr->Rank);
11827 }
11828}
PlayerCreateInfoSkills skills
Definition: Player.h:351

References Unit::getClass(), Unit::getRace(), HasSkill(), LearnDefaultSkill(), PlayerInfo::skills, and sObjectMgr.

Referenced by Create(), learn_commandscript::HandleLearnAllDefaultCommand(), LoadFromDB(), and resetSpells().

◆ LearnPetTalent()

void Player::LearnPetTalent ( ObjectGuid  petGuid,
uint32  talentId,
uint32  talentRank 
)
14026{
14027 Pet* pet = GetPet();
14028
14029 if (!pet)
14030 return;
14031
14032 if (petGuid != pet->GetGUID())
14033 return;
14034
14035 uint32 CurTalentPoints = pet->GetFreeTalentPoints();
14036
14037 if (CurTalentPoints == 0)
14038 return;
14039
14040 if (talentRank >= MAX_PET_TALENT_RANK)
14041 return;
14042
14043 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14044
14045 if (!talentInfo)
14046 return;
14047
14048 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
14049
14050 if (!talentTabInfo)
14051 return;
14052
14053 CreatureTemplate const* ci = pet->GetCreatureTemplate();
14054
14055 if (!ci)
14056 return;
14057
14058 CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
14059
14060 if (!pet_family)
14061 return;
14062
14063 if (pet_family->petTalentType < 0) // not hunter pet
14064 return;
14065
14066 // prevent learn talent for different family (cheating)
14067 if (!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
14068 return;
14069
14070 // find current max talent rank (0~5)
14071 uint8 curtalent_maxrank = 0; // 0 = not learned any rank
14072 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
14073 {
14074 if (talentInfo->RankID[rank] && pet->HasSpell(talentInfo->RankID[rank]))
14075 {
14076 curtalent_maxrank = (rank + 1);
14077 break;
14078 }
14079 }
14080
14081 // we already have same or higher talent rank learned
14082 if (curtalent_maxrank >= (talentRank + 1))
14083 return;
14084
14085 // check if we have enough talent points
14086 if (CurTalentPoints < (talentRank - curtalent_maxrank + 1))
14087 return;
14088
14089 // Check if it requires another talent
14090 if (talentInfo->DependsOn > 0)
14091 {
14092 if (TalentEntry const* depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
14093 {
14094 bool hasEnoughRank = false;
14095 for (uint8 rank = talentInfo->DependsOnRank; rank < MAX_TALENT_RANK; rank++)
14096 {
14097 if (depTalentInfo->RankID[rank] != 0)
14098 if (pet->HasSpell(depTalentInfo->RankID[rank]))
14099 hasEnoughRank = true;
14100 }
14101 if (!hasEnoughRank)
14102 return;
14103 }
14104 }
14105
14106 // Find out how many points we have in this field
14107 uint32 spentPoints = 0;
14108
14109 uint32 tTab = talentInfo->TalentTab;
14110 if (talentInfo->Row > 0)
14111 {
14112 uint32 numRows = sTalentStore.GetNumRows();
14113 for (uint32 i = 0; i < numRows; ++i) // Loop through all talents.
14114 {
14115 // Someday, someone needs to revamp
14116 const TalentEntry* tmpTalent = sTalentStore.LookupEntry(i);
14117 if (tmpTalent) // the way talents are tracked
14118 {
14119 if (tmpTalent->TalentTab == tTab)
14120 {
14121 for (uint8 rank = 0; rank < MAX_TALENT_RANK; rank++)
14122 {
14123 if (tmpTalent->RankID[rank] != 0)
14124 {
14125 if (pet->HasSpell(tmpTalent->RankID[rank]))
14126 {
14127 spentPoints += (rank + 1);
14128 }
14129 }
14130 }
14131 }
14132 }
14133 }
14134 }
14135
14136 // not have required min points spent in talent tree
14137 if (spentPoints < (talentInfo->Row * MAX_PET_TALENT_RANK))
14138 return;
14139
14140 // spell not set in talent.dbc
14141 uint32 spellid = talentInfo->RankID[talentRank];
14142 if (spellid == 0)
14143 {
14144 LOG_ERROR("entities.player", "Talent.dbc have for talent: {} Rank: {} spell id = 0", talentId, talentRank);
14145 return;
14146 }
14147
14148 // already known
14149 if (pet->HasSpell(spellid))
14150 return;
14151
14152 // learn! (other talent ranks will unlearned at learning)
14153 pet->learnSpell(spellid);
14154 LOG_DEBUG("entities.player", "PetTalentID: {} Rank: {} Spell: {}\n", talentId, talentRank, spellid);
14155
14156 // update free talent points
14157 pet->SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1));
14158}
#define MAX_PET_TALENT_RANK
Definition: DBCStructure.h:1919
void SetFreeTalentPoints(uint8 points)
Definition: Pet.h:132
bool learnSpell(uint32 spell_id)
Definition: Pet.cpp:1912
uint32 Row
Definition: DBCStructure.h:1926
uint32 DependsOnRank
Definition: DBCStructure.h:1932
uint32 DependsOn
Definition: DBCStructure.h:1930

References TalentEntry::DependsOn, TalentEntry::DependsOnRank, CreatureTemplate::family, Creature::GetCreatureTemplate(), Pet::GetFreeTalentPoints(), Object::GetGUID(), GetPet(), Pet::HasSpell(), Pet::learnSpell(), LOG_DEBUG, LOG_ERROR, MAX_PET_TALENT_RANK, MAX_TALENT_RANK, TalentTabEntry::petTalentMask, CreatureFamilyEntry::petTalentType, TalentEntry::RankID, TalentEntry::Row, sCreatureFamilyStore, Pet::SetFreeTalentPoints(), sTalentStore, sTalentTabStore, and TalentEntry::TalentTab.

Referenced by WorldSession::HandleLearnPreviewTalentsPet(), and WorldSession::HandlePetLearnTalent().

◆ learnQuestRewardedSpells() [1/2]

void Player::learnQuestRewardedSpells ( )
11933{
11934 // learn spells received from quest completing
11935 for (RewardedQuestSet::const_iterator itr = m_RewardedQuests.begin(); itr != m_RewardedQuests.end(); ++itr)
11936 {
11937 Quest const* quest = sObjectMgr->GetQuestTemplate(*itr);
11938 if (!quest)
11939 continue;
11940
11942 }
11943}

References learnQuestRewardedSpells(), m_RewardedQuests, and sObjectMgr.

Referenced by _LoadQuestStatusRewarded(), learn_commandscript::HandleLearnAllDefaultCommand(), learnQuestRewardedSpells(), and resetSpells().

◆ learnQuestRewardedSpells() [2/2]

void Player::learnQuestRewardedSpells ( Quest const *  quest)
11901{
11902 // xinef: quest does not learn anything
11903 int32 spellId = quest->GetRewSpellCast();
11904 if (!spellId)
11905 return;
11906
11907 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
11908 if (!spellInfo)
11909 return;
11910
11911 // xinef: find effect with learn spell and check if we have this spell
11912 bool found = false;
11913 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
11914 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && spellInfo->Effects[i].TriggerSpell && !HasSpell(spellInfo->Effects[i].TriggerSpell))
11915 {
11916 // pusywizard: don't re-add profession specialties!
11917 if (SpellInfo const* triggeredInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
11918 if (triggeredInfo->Effects[0].Effect == SPELL_EFFECT_TRADE_SKILL)
11919 break; // pussywizard: break and not cast the spell (found is false)
11920
11921 found = true;
11922 break;
11923 }
11924
11925 // xinef: we know the spell, return
11926 if (!found)
11927 return;
11928
11929 CastSpell(this, spellId, true);
11930}
@ SPELL_EFFECT_TRADE_SKILL
Definition: SharedDefines.h:825

References Unit::CastSpell(), SpellInfo::Effects, Quest::GetRewSpellCast(), HasSpell(), MAX_SPELL_EFFECTS, SPELL_EFFECT_LEARN_SPELL, SPELL_EFFECT_TRADE_SKILL, and sSpellMgr.

◆ learnSkillRewardedSpells()

void Player::learnSkillRewardedSpells ( uint32  id,
uint32  value 
)
11946{
11947 uint32 raceMask = getRaceMask();
11948 uint32 classMask = getClassMask();
11949 for (SkillLineAbilityEntry const* pAbility : GetSkillLineAbilitiesBySkillLine(skill_id))
11950 {
11951 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pAbility->Spell);
11952 if (!spellInfo)
11953 {
11954 continue;
11955 }
11956
11957 if (pAbility->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE && pAbility->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN)
11958 {
11959 continue;
11960 }
11961
11962 // Check race if set
11963 if (pAbility->RaceMask && !(pAbility->RaceMask & raceMask))
11964 {
11965 continue;
11966 }
11967
11968 // Check class if set
11969 if (pAbility->ClassMask && !(pAbility->ClassMask & classMask))
11970 {
11971 continue;
11972 }
11973
11974 // need unlearn spell
11975 if (skill_value < pAbility->MinSkillLineRank && pAbility->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE)
11976 {
11977 removeSpell(pAbility->Spell, GetActiveSpec(), true);
11978 }
11979 // need learn
11980 else
11981 {
11982 //used to avoid double Seal of Righteousness on paladins, it's the only player spell which has both spell and forward spell in auto learn
11983 if (pAbility->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && pAbility->SupercededBySpell)
11984 {
11985 bool skipCurrent = false;
11986 auto bounds = sSpellMgr->GetSkillLineAbilityMapBounds(pAbility->SupercededBySpell);
11987 for (auto itr = bounds.first; itr != bounds.second; ++itr)
11988 {
11989 if (itr->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && skill_value >= itr->second->MinSkillLineRank)
11990 {
11991 skipCurrent = true;
11992 break;
11993 }
11994 }
11995 if (skipCurrent)
11996 {
11997 continue;
11998 }
11999 }
12000
12001 if (!IsInWorld())
12002 {
12003 addSpell(pAbility->Spell, SPEC_MASK_ALL, true, true);
12004 }
12005 else
12006 {
12007 learnSpell(pAbility->Spell, true, true);
12008 }
12009 }
12010 }
12011}
const std::vector< SkillLineAbilityEntry const * > & GetSkillLineAbilitiesBySkillLine(uint32 skillLine)
Definition: DBCStores.cpp:916
@ SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE
Definition: DBCEnums.h:360
Definition: DBCStructure.h:1598

References addSpell(), GetActiveSpec(), Unit::getClassMask(), Unit::getRaceMask(), GetSkillLineAbilitiesBySkillLine(), Object::IsInWorld(), learnSpell(), removeSpell(), SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN, SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE, SPEC_MASK_ALL, and sSpellMgr.

Referenced by _LoadSkills(), SetSkill(), and UpdateSkillPro().

◆ learnSpell()

void Player::learnSpell ( uint32  spellId,
bool  temporary = false,
bool  learnFromSkill = false 
)
3272{
3273 // Xinef: don't allow to learn active spell once more
3274 if (HasActiveSpell(spellId))
3275 {
3276 LOG_DEBUG("entities.player", "Player ({}) tries to learn already active spell: {}", GetGUID().ToString(), spellId);
3277 return;
3278 }
3279
3280 uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spellId);
3281 bool thisSpec = GetTalentSpellCost(firstRankSpellId) > 0 || sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId);
3282 bool added = addSpell(spellId, thisSpec ? GetActiveSpecMask() : SPEC_MASK_ALL, true, temporary, learnFromSkill);
3283 if (added)
3284 {
3285 sScriptMgr->OnPlayerLearnSpell(this, spellId);
3286
3287 // pussywizard: a system message "you have learnt spell X (rank Y)"
3288 if (IsInWorld())
3289 SendLearnPacket(spellId, true);
3290 }
3291
3292 // pussywizard: rank stuff at the end!
3293 if (uint32 nextSpell = sSpellMgr->GetNextSpellInChain(spellId))
3294 {
3295 // pussywizard: lookup next rank in m_spells (the only talents on m_spella are for example pyroblast, that have all ranks restored upon learning rank 1)
3296 // pussywizard: next ranks must not be in current spec (otherwise no need to learn already learnt)
3297 PlayerSpellMap::iterator itr = m_spells.find(nextSpell);
3298 if (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && !itr->second->IsInSpec(m_activeSpec))
3299 learnSpell(nextSpell, temporary);
3300 }
3301
3302 // xinef: if we learn new spell, check all spells requiring this spell, if we have such a spell, and it is not in current spec - learn it
3303 SpellsRequiringSpellMapBounds spellsRequiringSpell = sSpellMgr->GetSpellsRequiringSpellBounds(spellId);
3304 for (SpellsRequiringSpellMap::const_iterator itr = spellsRequiringSpell.first; itr != spellsRequiringSpell.second; ++itr)
3305 {
3306 PlayerSpellMap::iterator itr2 = m_spells.find(itr->second);
3307 if (itr2 != m_spells.end() && itr2->second->State != PLAYERSPELL_REMOVED && !itr2->second->IsInSpec(m_activeSpec))
3308 learnSpell(itr2->first, temporary);
3309 }
3310}
uint32 GetTalentSpellCost(uint32 spellId)
Definition: DBCStores.cpp:686

References addSpell(), GetActiveSpecMask(), Object::GetGUID(), GetTalentSpellCost(), HasActiveSpell(), Object::IsInWorld(), learnSpell(), LOG_DEBUG, m_activeSpec, m_spells, PLAYERSPELL_REMOVED, SendLearnPacket(), SPEC_MASK_ALL, sScriptMgr, sSpellMgr, and Position::ToString().

Referenced by _addSpell(), Spell::EffectLearnSpell(), learn_commandscript::HandleLearnAllGMCommand(), learn_commandscript::HandleLearnAllLangCommand(), learn_commandscript::HandleLearnAllMySpellsCommand(), learn_commandscript::HandleLearnSkillRecipesHelper(), Acore::PlayerCommand::HandleLearnSpellCommand(), spell_gen_profession_research::HandleScript(), spell_item_book_of_glyph_mastery::HandleScript(), WorldSession::HandleTrainerBuySpellOpcode(), LearnCustomSpells(), learnSkillRewardedSpells(), learnSpell(), learnSpellHighRank(), LearnTalent(), and UpdateCraftSkill().

◆ learnSpellHighRank()

void Player::learnSpellHighRank ( uint32  spellid)
13613{
13614 learnSpell(spellid);
13615
13616 if (uint32 next = sSpellMgr->GetNextSpellInChain(spellid))
13617 learnSpellHighRank(next);
13618}
void learnSpellHighRank(uint32 spellid)
Definition: Player.cpp:13612

References learnSpell(), learnSpellHighRank(), and sSpellMgr.

Referenced by learnSpellHighRank().

◆ LearnTalent()

void Player::LearnTalent ( uint32  talentId,
uint32  talentRank,
bool  command = false 
)
13890{
13891 uint32 CurTalentPoints = GetFreeTalentPoints();
13892
13893 if (!command)
13894 {
13895 // xinef: check basic data
13896 if (!CurTalentPoints)
13897 {
13898 return;
13899 }
13900
13901 if (talentRank >= MAX_TALENT_RANK)
13902 {
13903 return;
13904 }
13905 }
13906
13907 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
13908 if (!talentInfo)
13909 return;
13910
13911 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
13912 if (!talentTabInfo)
13913 return;
13914
13915 // xinef: prevent learn talent for different class (cheating)
13916 if ((getClassMask() & talentTabInfo->ClassMask) == 0)
13917 return;
13918
13919 // xinef: find current talent rank
13920 uint32 currentTalentRank = 0;
13921 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
13922 {
13923 if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], GetActiveSpec()))
13924 {
13925 currentTalentRank = rank + 1;
13926 break;
13927 }
13928 }
13929
13930 // xinef: we already have same or higher rank talent learned
13931 if (currentTalentRank >= talentRank + 1)
13932 return;
13933
13934 uint32 talentPointsChange = (talentRank - currentTalentRank + 1);
13935 if (!command)
13936 {
13937 // xinef: check if we have enough free talent points
13938 if (CurTalentPoints < talentPointsChange)
13939 {
13940 return;
13941 }
13942 }
13943
13944 // xinef: check if talent deponds on another talent
13945 if (talentInfo->DependsOn > 0)
13946 if (TalentEntry const* depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
13947 {
13948 bool hasEnoughRank = false;
13949 for (uint8 rank = talentInfo->DependsOnRank; rank < MAX_TALENT_RANK; rank++)
13950 {
13951 if (depTalentInfo->RankID[rank] != 0)
13952 if (HasTalent(depTalentInfo->RankID[rank], GetActiveSpec()))
13953 {
13954 hasEnoughRank = true;
13955 break;
13956 }
13957 }
13958
13959 // xinef: does not have enough talent points spend in required talent
13960 if (!hasEnoughRank)
13961 return;
13962 }
13963
13964 if (!command)
13965 {
13966 // xinef: check amount of points spent in current talent tree
13967 // xinef: be smart and quick
13968 uint32 spentPoints = 0;
13969 if (talentInfo->Row > 0)
13970 {
13971 const PlayerTalentMap& talentMap = GetTalentMap();
13972 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
13973 if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first))
13974 if (TalentEntry const* itrTalentInfo = sTalentStore.LookupEntry(talentPos->talent_id))
13975 if (itrTalentInfo->TalentTab == talentInfo->TalentTab)
13976 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec())) // pussywizard
13977 spentPoints += talentPos->rank + 1;
13978 }
13979
13980 // xinef: we do not have enough talent points to add talent of this tier
13981 if (spentPoints < (talentInfo->Row * MAX_TALENT_RANK))
13982 return;
13983 }
13984
13985 // xinef: hacking attempt, tries to learn unknown rank
13986 uint32 spellId = talentInfo->RankID[talentRank];
13987 if (spellId == 0)
13988 return;
13989
13990 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
13991 if (!spellInfo)
13992 return;
13993
13994 bool learned = false;
13995
13996 // xinef: if talent info has special marker in dbc - add to spell book
13997 if (talentInfo->addToSpellBook)
13998 if (!spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
13999 {
14000 learnSpell(spellId);
14001 learned = true;
14002 }
14003
14004 if (!learned)
14005 SendLearnPacket(spellId, true);
14006
14007 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
14008 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
14009 if (sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
14010 learnSpell(spellInfo->Effects[i].TriggerSpell);
14011
14012 addTalent(spellId, GetActiveSpecMask(), currentTalentRank);
14013
14014 // xinef: update free talent points count
14015 m_usedTalentCount += talentPointsChange;
14016
14017 if (!command)
14018 {
14019 SetFreeTalentPoints(CurTalentPoints - talentPointsChange);
14020 }
14021
14022 sScriptMgr->OnPlayerLearnTalents(this, talentId, talentRank, spellId);
14023}
uint32 ClassMask
Definition: DBCStructure.h:1946

References addTalent(), TalentEntry::addToSpellBook, TalentTabEntry::ClassMask, TalentEntry::DependsOn, TalentEntry::DependsOnRank, SpellInfo::Effects, GetActiveSpec(), GetActiveSpecMask(), Unit::getClassMask(), GetFreeTalentPoints(), GetTalentMap(), GetTalentSpellPos(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), HasTalent(), learnSpell(), m_usedTalentCount, MAX_SPELL_EFFECTS, MAX_TALENT_RANK, PLAYERSPELL_REMOVED, TalentEntry::RankID, TalentEntry::Row, SendLearnPacket(), SetFreeTalentPoints(), SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, sTalentStore, sTalentTabStore, and TalentEntry::TalentTab.

Referenced by learn_commandscript::HandleLearnAllMyTalentsCommand(), WorldSession::HandleLearnPreviewTalents(), and WorldSession::HandleLearnTalentOpcode().

◆ LeaveAllArenaTeams()

void Player::LeaveAllArenaTeams ( ObjectGuid  guid)
static
10134{
10135 // xinef: sync query
10137 stmt->SetData(0, guid.GetCounter());
10138 PreparedQueryResult result = CharacterDatabase.Query(stmt);
10139
10140 if (!result)
10141 return;
10142
10143 do
10144 {
10145 Field* fields = result->Fetch();
10146 uint32 arenaTeamId = fields[0].Get<uint32>();
10147 if (arenaTeamId != 0)
10148 {
10149 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
10150 if (arenaTeam)
10151 arenaTeam->DelMember(guid, true);
10152 }
10153 } while (result->NextRow());
10154}
@ CHAR_SEL_PLAYER_ARENA_TEAMS
Definition: CharacterDatabase.h:231
void DelMember(ObjectGuid guid, bool cleanDb)
Definition: ArenaTeam.cpp:324

References CHAR_SEL_PLAYER_ARENA_TEAMS, CharacterDatabase, ArenaTeam::DelMember(), Field::Get(), ObjectGuid::GetCounter(), sArenaTeamMgr, and PreparedStatementBase::SetData().

Referenced by DeleteFromDB(), and WorldSession::HandleCharFactionOrRaceChangeCallback().

◆ LeaveBattleground()

void Player::LeaveBattleground ( Battleground bg = nullptr)
11276{
11277 if (!bg)
11278 bg = GetBattleground();
11279
11280 if (!bg)
11281 return;
11282
11283 // Deserter tracker - leave BG
11284 if (bg->isBattleground() && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN))
11285 {
11286 if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS))
11287 {
11289 stmt->SetData(0, GetGUID().GetCounter());
11291 CharacterDatabase.Execute(stmt);
11292 }
11293 sScriptMgr->OnBattlegroundDesertion(this, BG_DESERTION_TYPE_LEAVE_BG);
11294 }
11295
11296 bg->RemovePlayerAtLeave(this);
11297
11298 // xinef: reset corpse reclaim time
11300
11301 // Remove all dots
11305
11306 // pussywizard: clear movement, because after porting player will move to arena cords
11308 StopMoving();
11310}
@ SPELL_AURA_PERIODIC_DAMAGE
Definition: SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition: SpellAuraDefines.h:152
@ SPELL_AURA_PERIODIC_LEECH
Definition: SpellAuraDefines.h:116
@ BG_DESERTION_TYPE_LEAVE_BG
Definition: Battleground.h:50
@ STATUS_WAIT_JOIN
Definition: Battleground.h:196
@ CONFIG_BATTLEGROUND_TRACK_DESERTERS
Definition: IWorld.h:121
@ CHAR_INS_DESERTER_TRACK
Definition: CharacterDatabase.h:499
virtual void RemovePlayerAtLeave(Player *player)
Definition: Battleground.cpp:968
bool isBattleground() const
Definition: Battleground.h:397
BattlegroundStatus GetStatus() const
Definition: Battleground.h:327
bool TeleportToEntryPoint()
Definition: Player.cpp:1597
void StopMoving()
Definition: Unit.cpp:16589
void MovementExpired(bool reset=true)
Definition: MotionMaster.h:178

References BG_DESERTION_TYPE_LEAVE_BG, CHAR_INS_DESERTER_TRACK, CharacterDatabase, CONFIG_BATTLEGROUND_TRACK_DESERTERS, GetBattleground(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetMotionMaster(), Battleground::GetStatus(), Battleground::isBattleground(), m_deathExpireTime, MotionMaster::MovementExpired(), Unit::RemoveAurasByType(), Battleground::RemovePlayerAtLeave(), PreparedStatementBase::SetData(), SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_LEECH, sScriptMgr, STATUS_IN_PROGRESS, STATUS_WAIT_JOIN, Unit::StopMoving(), sWorld, and TeleportToEntryPoint().

Referenced by BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::LogoutPlayer(), and ToggleAFK().

◆ LeftChannel()

void Player::LeftChannel ( Channel c)
4942{
4943 m_channels.remove(c);
4944}

References m_channels.

Referenced by Channel::KickOrBan(), Channel::LeaveChannel(), and UpdateLocalChannels().

◆ LoadActions()

void Player::LoadActions ( PreparedQueryResult  result)
15225{
15226 if (result)
15227 _LoadActions(result);
15228
15230}
void _LoadActions(PreparedQueryResult result)
Definition: PlayerStorage.cpp:5688

References _LoadActions(), and SendActionButtons().

◆ LoadCorpse()

void Player::LoadCorpse ( PreparedQueryResult  result)
5830{
5832 SpawnCorpseBones(false);
5833
5834 if (!IsAlive())
5835 {
5836 if (result && !HasAtLoginFlag(AT_LOGIN_RESURRECT))
5837 {
5838 Field* fields = result->Fetch();
5839 _corpseLocation.WorldRelocate(fields[0].Get<uint16>(), fields[1].Get<float>(), fields[2].Get<float>(), fields[3].Get<float>(), fields[4].Get<float>());
5841 }
5842 else
5843 ResurrectPlayer(0.5f);
5844 }
5845
5847}
void RemoveAtLoginFlag(AtLoginFlags flags, bool persist=false)
Definition: Player.cpp:14585
bool HasAtLoginFlag(AtLoginFlags f) const
Definition: Player.h:2379
void ResurrectPlayer(float restore_percent, bool applySickness=false)
Definition: Player.cpp:4416

References _corpseLocation, Object::ApplyModFlag(), AT_LOGIN_RESURRECT, WorldLocation::GetMapId(), HasAtLoginFlag(), Unit::IsAlive(), PLAYER_FIELD_BYTE_RELEASE_TIMER, PLAYER_FIELD_BYTES, RemoveAtLoginFlag(), ResurrectPlayer(), sMapStore, SpawnCorpseBones(), and WorldLocation::WorldRelocate().

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadFromDB()

bool Player::LoadFromDB ( ObjectGuid  guid,
CharacterDatabaseQueryHolder const &  holder 
)
4934{
4936 //QueryResult* result = CharacterDatabase.Query("SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags, "
4937 // 17 18 19 20 21 22 23 24 25 26 27 28 29
4938 //"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, "
4939 // 30 31 32 33 34 35 36 37 38 39 40 41 42 43
4940 //"resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, "
4941 // 44 45 46 47 48 49 50 51 52 53 54
4942 //"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, "
4943 // 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
4944 //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles,
4945 // 70 71 72 73 74
4946 //"actionBars, grantableLevels, innTriggerId, extraBonusTalentCount, UNIX_TIMESTAMP(creation_date) FROM characters WHERE guid = '{}'", guid);
4947 PreparedQueryResult result = holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM);
4948
4949 if (!result)
4950 {
4951 LOG_ERROR("entities.player", "Player ({}) not found in table `characters`, can't load. ", playerGuid.ToString());
4952 return false;
4953 }
4954
4955 Field* fields = result->Fetch();
4956
4957 uint32 dbAccountId = fields[1].Get<uint32>();
4958
4959 // check if the character's account in the db and the logged in account match.
4960 // player should be able to load/delete character only with correct account!
4961 if (dbAccountId != GetSession()->GetAccountId())
4962 {
4963 LOG_ERROR("entities.player", "Player ({}) loading from wrong account (is: {}, should be: {})", playerGuid.ToString(), GetSession()->GetAccountId(), dbAccountId);
4964 return false;
4965 }
4966
4967 if (holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BANNED))
4968 {
4969 LOG_ERROR("entities.player", "Player ({}) is banned, can't load.", playerGuid.ToString());
4970 return false;
4971 }
4972
4973 ObjectGuid::LowType guid = playerGuid.GetCounter();
4974
4975 Object::_Create(guid, 0, HighGuid::Player);
4976
4977 m_name = fields[2].Get<std::string>();
4978
4979 // check name limitations
4981 {
4983 stmt->SetData(0, uint16(AT_LOGIN_RENAME));
4984 stmt->SetData(1, guid);
4985 CharacterDatabase.Execute(stmt);
4986 return false;
4987 }
4988
4989 uint8 Gender = fields[5].Get<uint8>();
4990 if (!IsValidGender(Gender))
4991 {
4992 LOG_ERROR("entities.player", "Player (GUID: {}) has wrong gender ({}), can't be loaded.", guid, Gender);
4993 return false;
4994 }
4995
4996 // overwrite some data fields
4997 uint32 bytes0 = 0;
4998 bytes0 |= fields[3].Get<uint8>(); // race
4999 bytes0 |= fields[4].Get<uint8>() << 8; // class
5000 bytes0 |= Gender << 16; // gender
5002
5003 m_realRace = fields[3].Get<uint8>(); // set real race
5004 m_race = fields[3].Get<uint8>(); // set real race
5005
5006 SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].Get<uint8>());
5007 SetUInt32Value(PLAYER_XP, fields[7].Get<uint32>());
5008
5009 if (!_LoadIntoDataField(fields[66].Get<std::string>(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE))
5010 {
5011 LOG_WARN("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid exploredzones data ({}). Forcing partial load.", guid, fields[66].Get<std::string_view>());
5012 }
5013
5014 if (!_LoadIntoDataField(fields[69].Get<std::string>(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE * 2))
5015 {
5016 LOG_WARN("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid knowntitles mask ({}). Forcing partial load.", guid, fields[69].Get<std::string_view>());
5017 }
5018
5019 SetObjectScale(1.0f);
5021
5022 // load character creation date, relevant for achievements of type average
5023 SetCreationTime(fields[74].Get<Seconds>());
5024
5025 // load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateAchievementCriteria)
5027
5028 uint32 money = fields[8].Get<uint32>();
5029 if (money > MAX_MONEY_AMOUNT)
5030 money = MAX_MONEY_AMOUNT;
5031 SetMoney(money);
5032
5033 SetByteValue(PLAYER_BYTES, 0, fields[9].Get<uint8>());
5034 SetByteValue(PLAYER_BYTES, 1, fields[10].Get<uint8>());
5035 SetByteValue(PLAYER_BYTES, 2, fields[11].Get<uint8>());
5036 SetByteValue(PLAYER_BYTES, 3, fields[12].Get<uint8>());
5037 SetByteValue(PLAYER_BYTES_2, 0, fields[13].Get<uint8>());
5038 SetByteValue(PLAYER_BYTES_2, 2, fields[14].Get<uint8>());
5039 SetByteValue(PLAYER_BYTES_2, 3, fields[15].Get<uint8>());
5040 SetByteValue(PLAYER_BYTES_3, 0, fields[5].Get<uint8>());
5041 SetByteValue(PLAYER_BYTES_3, 1, fields[54].Get<uint8>());
5042 ReplaceAllPlayerFlags((PlayerFlags)fields[16].Get<uint32>());
5043 SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, fields[53].Get<uint32>());
5044
5045 SetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES, fields[52].Get<uint64>());
5046
5047 SetUInt32Value(PLAYER_AMMO_ID, fields[68].Get<uint32>());
5048
5049 // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise)
5050 SetByteValue(PLAYER_FIELD_BYTES, 2, fields[70].Get<uint8>());
5051
5053
5054 // cleanup inventory related item value fields (its will be filled correctly in _LoadInventory)
5055 for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
5056 {
5058 SetVisibleItemSlot(slot, nullptr);
5059
5060 delete m_items[slot];
5061 m_items[slot] = nullptr;
5062 }
5063
5064 LOG_DEBUG("entities.player.loading", "Load Basic value of player {} is: ", m_name);
5066
5067 //Need to call it to initialize m_team (m_team can be calculated from race)
5068 //Other way is to saves m_team into characters table.
5070
5071 // pussywizard: create empty instance bind containers if necessary
5072 sInstanceSaveMgr->PlayerCreateBoundInstancesMaps(playerGuid);
5073
5074 // load home bind and check in same time class/race pair, it used later for restore broken positions
5075 if (!_LoadHomeBind(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_HOME_BIND)))
5076 return false;
5077
5078 InitPrimaryProfessions(); // to max set before any spell loaded
5079
5080 // init saved position, and fix it later if problematic
5081 int32 transLowGUID = fields[35].Get<int32>();
5082 Relocate(fields[17].Get<float>(), fields[18].Get<float>(), fields[19].Get<float>(), fields[21].Get<float>());
5083 uint32 mapId = fields[20].Get<uint16>();
5084 uint32 instanceId = fields[63].Get<uint32>();
5085
5086 uint32 dungeonDiff = fields[43].Get<uint8>() & 0x0F;
5087 if (dungeonDiff >= MAX_DUNGEON_DIFFICULTY)
5088 dungeonDiff = DUNGEON_DIFFICULTY_NORMAL;
5089 uint32 raidDiff = (fields[43].Get<uint8>() >> 4) & 0x0F;
5090 if (raidDiff >= MAX_RAID_DIFFICULTY)
5092 SetDungeonDifficulty(Difficulty(dungeonDiff)); // may be changed in _LoadGroup
5093 SetRaidDifficulty(Difficulty(raidDiff)); // may be changed in _LoadGroup
5094
5095 std::string taxi_nodes = fields[42].Get<std::string>();
5096
5097 auto RelocateToHomebind = [this, &mapId, &instanceId]() { mapId = m_homebindMapId; instanceId = 0; Relocate(m_homebindX, m_homebindY, m_homebindZ); };
5098
5099 _LoadGroup();
5100
5102
5103 SetArenaPoints(fields[44].Get<uint32>());
5104
5105 SetHonorPoints(fields[45].Get<uint32>());
5106 SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, fields[46].Get<uint32>());
5107 SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, fields[47].Get<uint32>());
5108 SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[48].Get<uint32>());
5109 SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[49].Get<uint16>());
5110 SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[50].Get<uint16>());
5111
5114
5115 GetSession()->SetPlayer(this);
5116 MapEntry const* mapEntry = sMapStore.LookupEntry(mapId);
5117
5118 Map* map = nullptr;
5119
5120 // pussywizard: group changed difficulty when player was offline, teleport to the enterance of new difficulty
5121 if (mapEntry && ((mapEntry->IsNonRaidDungeon() && dungeonDiff != GetDungeonDifficulty()) || (mapEntry->IsRaid() && raidDiff != GetRaidDifficulty())))
5122 {
5123 bool fixed = false;
5124 if (uint32 destInstId = sInstanceSaveMgr->PlayerGetDestinationInstanceId(this, mapId, GetDifficulty(mapEntry->IsRaid())))
5125 {
5126 instanceId = destInstId;
5127 if (AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId))
5128 {
5129 Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
5130 fixed = true;
5131 }
5132 }
5133 if (!fixed)
5134 {
5135 RelocateToHomebind();
5136 mapEntry = sMapStore.LookupEntry(mapId);
5137 }
5138 }
5139
5140 if (!mapEntry || !IsPositionValid())
5141 {
5142 LOG_ERROR("entities.player", "Player (guidlow {}) have invalid coordinates (MapId: {} X: {} Y: {} Z: {} O: {}). Teleport to default race/class locations.", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5143 RelocateToHomebind();
5144 }
5145 // Player was saved in Arena or Bg
5146 else if (mapEntry->IsBattlegroundOrArena())
5147 {
5148 // xinef: resurrect player, cant log in dead without corpse
5149 {
5152 if (!IsAlive())
5153 ResurrectPlayer(1.0f);
5154 }
5155
5156 const WorldLocation& _loc = GetEntryPoint();
5157 mapId = _loc.GetMapId();
5158 instanceId = 0;
5159
5160 if (mapId == MAPID_INVALID)
5161 {
5162 RelocateToHomebind();
5163 }
5164 else
5165 {
5166 Relocate(&_loc);
5167
5168 // xinef: restore taxi flight from entry point data
5170 {
5174 }
5175 }
5176 }
5177 // currently we do not support transport in bg
5178 else if (transLowGUID != 0)
5179 {
5180 // transLowGUID > 0 ---> motion transport guid
5181 // transLowGUID < 0 ---> static transport spawn id
5182 Transport* transGO = nullptr;
5183 if (transLowGUID > 0)
5184 {
5185 ObjectGuid transGUID = ObjectGuid::Create<HighGuid::Mo_Transport>(transLowGUID);
5186 transGO = HashMapHolder<MotionTransport>::Find(transGUID);
5187 }
5188 else
5189 {
5190 map = sMapMgr->CreateMap(mapId, this);
5191 if (map)
5192 {
5193 auto bounds = map->GetGameObjectBySpawnIdStore().equal_range(std::abs(transLowGUID));
5194 if (bounds.first != bounds.second)
5195 transGO = bounds.first->second->ToTransport();
5196 }
5197 }
5198
5199 // pussywizard: must be on map, for one world tick transport is not in map and has old GetMapId(), player would be added to old map and to the transport, multithreading crashfix
5200 if (transGO && transGO->IsInWorld() && transGO->FindMap())
5201 m_transport = transGO;
5202
5203 if (m_transport)
5204 {
5205 float x = fields[31].Get<float>(), y = fields[32].Get<float>(), z = fields[33].Get<float>(), o = fields[34].Get<float>();
5209
5210 if (!Acore::IsValidMapCoord(x, y, z, o) || std::fabs(m_movementInfo.transport.pos.GetPositionX()) > 75.0f || std::fabs(m_movementInfo.transport.pos.GetPositionY()) > 75.0f || std::fabs(m_movementInfo.transport.pos.GetPositionZ()) > 75.0f)
5211 {
5212 m_transport = nullptr;
5215 RelocateToHomebind();
5216 }
5217 else
5218 {
5219 Relocate(x, y, z, o);
5220 mapId = m_transport->GetMapId();
5223 }
5224 }
5225 else
5226 {
5227 bool fixed = false;
5228 if (mapEntry->Instanceable())
5229 if (AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId))
5230 {
5231 fixed = true;
5232 Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
5233 }
5234 if (!fixed)
5235 RelocateToHomebind();
5236 }
5237 }
5238 // currently we do not support taxi in instance
5239 else if (!taxi_nodes.empty())
5240 {
5241 instanceId = 0;
5242 if (!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes, GetTeamId(true)))
5243 {
5244 // xinef: could no load valid data for taxi, relocate to homebind and clear
5246 RelocateToHomebind();
5247 }
5248 }
5249
5250 // Map could be changed before
5251 mapEntry = sMapStore.LookupEntry(mapId);
5252 // client without expansion support
5253 if (mapEntry)
5254 {
5255 if (GetSession()->Expansion() < mapEntry->Expansion())
5256 {
5257 LOG_DEBUG("entities.player.loading", "Player {} using client without required expansion tried login at non accessible map {}", GetName(), mapId);
5258 RelocateToHomebind();
5259 }
5260
5261 // check whether player was unbound or is bound to another instance
5262 if (instanceId)
5263 {
5264 InstanceSave* save = sInstanceSaveMgr->PlayerGetInstanceSave(GetGUID(), mapId, GetDifficulty(mapEntry->IsRaid()));
5265 if (!save || save->GetInstanceId() != instanceId)
5266 instanceId = 0;
5267 }
5268 }
5269
5270 // if the player is in an instance and it has been reset in the meantime teleport him to the entrance
5271 if ((instanceId && !sInstanceSaveMgr->GetInstanceSave(instanceId) && !mapEntry->IsBattlegroundOrArena()) || (!instanceId && mapEntry->IsDungeon()))
5272 {
5273 AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId);
5274 if (at)
5276 else
5277 RelocateToHomebind();
5278 }
5279
5280 // NOW player must have valid map
5281 // load the player's map here if it's not already loaded
5282 if (!map)
5283 map = sMapMgr->CreateMap(mapId, this);
5284
5285 if (!map)
5286 {
5287 instanceId = 0;
5288 AreaTriggerTeleport const* at = sObjectMgr->GetGoBackTrigger(mapId);
5289 if (at)
5290 {
5291 LOG_ERROR("entities.player", "Player (guidlow {}) is teleported to gobacktrigger (Map: {} X: {} Y: {} Z: {} O: {}).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5293 mapId = at->target_mapId;
5294 }
5295 else
5296 {
5297 LOG_ERROR("entities.player", "Player (guidlow {}) is teleported to home (Map: {} X: {} Y: {} Z: {} O: {}).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5298 RelocateToHomebind();
5299 }
5300
5301 map = sMapMgr->CreateMap(mapId, this);
5302 if (!map)
5303 {
5304 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
5305 mapId = info->mapId;
5306 Relocate(info->positionX, info->positionY, info->positionZ, 0.0f);
5307 LOG_ERROR("entities.player", "Player (guidlow {}) have invalid coordinates (X: {} Y: {} Z: {} O: {}). Teleport to default race/class locations.", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5308 map = sMapMgr->CreateMap(mapId, this);
5309 if (!map)
5310 {
5311 LOG_ERROR("entities.player", "Player (guidlow {}) has invalid default map coordinates (X: {} Y: {} Z: {} O: {}). or instance couldn't be created", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5312 return false;
5313 }
5314 }
5315 }
5316
5317 SetMap(map);
5319
5321
5323
5324 time_t now = GameTime::GetGameTime().count();
5325 time_t logoutTime = time_t(fields[27].Get<uint32>());
5326
5327 // since last logout (in seconds)
5328 uint32 time_diff = uint32(now - logoutTime); //uint64 is excessive for a time_diff in seconds.. uint32 allows for 136~ year difference.
5329
5330 // randomize first save time in range [CONFIG_INTERVAL_SAVE] around [CONFIG_INTERVAL_SAVE]
5331 // this must help in case next save after mass player load after server startup
5332 m_nextSave = urand(m_nextSave / 2, m_nextSave * 3 / 2);
5333
5334 // set value, including drunk invisibility detection
5335 // calculate sobering. after 15 minutes logged out, the player will be sober again
5336 uint8 newDrunkValue = 0;
5337 if (time_diff < uint32(GetDrunkValue()) * 9)
5338 newDrunkValue = GetDrunkValue() - time_diff / 9;
5339
5340 SetDrunkValue(newDrunkValue);
5341
5342 m_cinematic = fields[23].Get<uint8>();
5343 m_Played_time[PLAYED_TIME_TOTAL] = fields[24].Get<uint32>();
5344 m_Played_time[PLAYED_TIME_LEVEL] = fields[25].Get<uint32>();
5345
5346 m_resetTalentsCost = fields[29].Get<uint32>();
5347 m_resetTalentsTime = time_t(fields[30].Get<uint32>());
5348
5349 m_taxi.LoadTaxiMask(fields[22].Get<std::string_view>()); // must be before InitTaxiNodesForLevel
5350
5351 uint32 extraflags = fields[36].Get<uint16>();
5352
5353 _LoadPetStable(fields[37].Get<uint8>(), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS));
5354
5355 m_atLoginFlags = fields[38].Get<uint16>();
5356
5358 {
5359 LOG_ERROR("entities.player", "Player {} tried to login while forced to rename, can't load.'", GetGUID().ToString());
5360 return false;
5361 }
5362
5363 // Honor system
5364 // Update Honor kills data
5365 m_lastHonorUpdateTime = logoutTime;
5367
5368 m_deathExpireTime = time_t(fields[41].Get<uint32>());
5369
5372
5373 // clear channel spell data (if saved at channel spell casting)
5376
5377 // clear charm/summon related fields
5384
5386
5387 // reset some aura modifiers before aura apply
5390
5391 // make sure the unit is considered not in duel for proper loading
5394
5395 // reset stats before loading any modifiers
5399 InitRunes();
5400
5401 sScriptMgr->OnPlayerLoadFromDB(this);
5402
5403 // make sure the unit is considered out of combat for proper loading
5404 ClearInCombat();
5405
5406 // rest bonus can only be calculated after InitStatsForLevel()
5407 _restBonus = fields[26].Get<float>();
5408
5409 if (time_diff > 0)
5410 {
5411 //speed collect rest bonus in offline, in logout, far from tavern, city (section/in hour)
5412 float bubble0 = 0.031f;
5413 //speed collect rest bonus in offline, in logout, in tavern, city (section/in hour)
5414 float bubble1 = 0.125f;
5415 float bubble = fields[28].Get<uint8>() > 0
5416 ? bubble1 * sWorld->getRate(RATE_REST_OFFLINE_IN_TAVERN_OR_CITY)
5417 : bubble0 * sWorld->getRate(RATE_REST_OFFLINE_IN_WILDERNESS);
5418
5419 // Client automatically doubles the value sent so we have to divide it by 2
5420 SetRestBonus(GetRestBonus() + time_diff * ((float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 144000)*bubble);
5421 }
5422
5423 uint32 innTriggerId = fields[72].Get<uint32>();
5424 if (innTriggerId)
5425 {
5426 SetRestFlag(REST_FLAG_IN_TAVERN, innTriggerId);
5427 }
5428
5429 // load skills after InitStatsForLevel because it triggering aura apply also
5430 _LoadSkills(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SKILLS));
5431 UpdateSkillsForLevel(); //update skills after load, to make sure they are correctly update at player load
5432
5433 // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
5434
5435 m_specsCount = fields[64].Get<uint8>();
5436 m_activeSpec = fields[65].Get<uint8>();
5437
5440
5441 _LoadSpells(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS));
5442 _LoadTalents(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS));
5443
5444 _LoadGlyphs(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GLYPHS));
5446 _LoadAuras(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURAS), time_diff);
5447 // add ghost flag (must be after aura load: PLAYER_FLAGS_GHOST set in aura)
5449 {
5450 m_deathState = DeathState::Dead;
5452 }
5453
5454 // pussywizard: remove auras that are removed at map change (after _LoadAuras)
5456
5457 // after spell load, learn rewarded spell if need also
5458 _LoadQuestStatus(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS));
5464 _LoadRandomBGStatus(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG));
5465
5466 // Extra Bonus Talent Points
5467 m_extraBonusTalentCount = fields[73].Get<uint8>();
5468
5469 // after spell, bonus talents, and quest load
5471
5472 // must be before inventory (some items required reputation check)
5474
5475 // xinef: load mails before inventory, so problematic items can be added to already loaded mails
5476 _LoadMail(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAILS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS));
5477
5478 _LoadInventory(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INVENTORY), time_diff);
5479
5480 // update items with duration and realtime
5481 UpdateItemDuration(time_diff, true);
5482
5483 _LoadActions(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACTIONS));
5484
5485 m_social = sSocialMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST), GetGUID());
5486
5487 // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES
5488 // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded
5489 uint32 curTitle = fields[51].Get<uint32>();
5490 if (curTitle && !HasTitle(curTitle))
5491 curTitle = 0;
5492
5494
5495 // has to be called after last Relocate() in Player::LoadFromDB
5497
5499
5500 // Spell code allow apply any auras to dead character in load time in aura/spell/item loading
5501 // Do now before stats re-calculation cleanup for ghost state unexpected auras
5502 if (!IsAlive())
5504 else
5506
5507 //apply all stat bonuses from items and auras
5508 SetCanModifyStats(true);
5510
5511 // restore remembered power/health values (but not more max values)
5512 uint32 savedHealth = fields[55].Get<uint32>();
5513 SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth);
5514 for (uint8 i = 0; i < MAX_POWERS; ++i)
5515 {
5516 uint32 savedPower = fields[56 + i].Get<uint32>();
5517 SetPower(Powers(i), savedPower > GetMaxPower(Powers(i)) ? GetMaxPower(Powers(i)) : savedPower);
5518 }
5519
5520 LOG_DEBUG("entities.player.loading", "The value of player {} after load item and aura is: ", m_name);
5522
5523 // GM state
5525 {
5526 switch (sWorld->getIntConfig(CONFIG_GM_LOGIN_STATE))
5527 {
5528 default:
5529 case 0:
5530 break; // disable
5531 case 1:
5532 SetGameMaster(true);
5533 break; // enable
5534 case 2: // save state
5535 if (extraflags & PLAYER_EXTRA_GM_ON)
5536 SetGameMaster(true);
5537 break;
5538 }
5539
5540 switch (sWorld->getIntConfig(CONFIG_GM_VISIBLE_STATE))
5541 {
5542 default:
5543 case 0:
5544 SetGMVisible(false);
5545 break; // invisible
5546 case 1:
5547 break; // visible
5548 case 2: // save state
5549 if (extraflags & PLAYER_EXTRA_GM_INVISIBLE)
5550 SetGMVisible(false);
5551 break;
5552 }
5553
5554 switch (sWorld->getIntConfig(CONFIG_GM_CHAT))
5555 {
5556 default:
5557 case 0:
5558 break; // disable
5559 case 1:
5560 SetGMChat(true);
5561 break; // enable
5562 case 2: // save state
5563 if (extraflags & PLAYER_EXTRA_GM_CHAT)
5564 SetGMChat(true);
5565 break;
5566 }
5567
5568 switch (sWorld->getIntConfig(CONFIG_GM_WHISPERING_TO))
5569 {
5570 default:
5571 case 0:
5572 break; // disable
5573 case 1:
5574 SetAcceptWhispers(true);
5575 break; // enable
5576 case 2: // save state
5577 if (extraflags & PLAYER_EXTRA_ACCEPT_WHISPERS)
5578 SetAcceptWhispers(true);
5579 break;
5580 }
5581 }
5582
5583 // RaF stuff.
5584 m_grantableLevels = fields[71].Get<uint8>();
5585 if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0))
5587
5588 if (m_grantableLevels > 0)
5590
5592
5593 //m_achievementMgr->CheckAllAchievementCriteria(); // pussywizard: disabled this
5594
5596
5598
5600
5601 // Players are immune to taunt
5604
5605 // Init charm info
5607
5608 // Fix aurastate auras, depending on health!
5609 // Set aurastate manualy, prevents aura switching
5610 if (HealthBelowPct(20))
5612 if (HealthBelowPct(35))
5614 if (HealthAbovePct(75))
5616
5617 // unapply aura stats if dont meet requirements
5618 AuraApplicationMap const& Auras = GetAppliedAuras();
5619 for (AuraApplicationMap::const_iterator itr = Auras.begin(); itr != Auras.end(); ++itr)
5620 {
5621 // we assume that all auras are applied now, aurastate was modfied MANUALY preventing any apply/unapply state switching
5622 Aura* aura = itr->second->GetBase();
5623 SpellInfo const* m_spellInfo = aura->GetSpellInfo();
5627 continue;
5628
5629 if (!HasAuraState((AuraStateType)m_spellInfo->CasterAuraState))
5630 aura->HandleAllEffects(itr->second, AURA_EFFECT_HANDLE_REAL, false);
5631 }
5632 return true;
5633}
@ AURA_INTERRUPT_FLAG_CHANGE_MAP
Definition: SpellDefines.h:63
@ SPELL_AURA_SPIRIT_OF_REDEMPTION
Definition: SpellAuraDefines.h:239
@ SPELL_AURA_MOD_TAUNT
Definition: SpellAuraDefines.h:74
@ UNIT_FIELD_CHANNEL_OBJECT
Definition: UpdateFields.h:93
@ UNIT_FIELD_SUMMON
Definition: UpdateFields.h:87
@ UNIT_FIELD_CHARMEDBY
Definition: UpdateFields.h:89
@ UNIT_FIELD_CHARM
Definition: UpdateFields.h:86
@ PLAYER_TRACK_CREATURES
Definition: UpdateFields.h:344
@ PLAYER_TRACK_RESOURCES
Definition: UpdateFields.h:345
@ UNIT_CHANNEL_SPELL
Definition: UpdateFields.h:94
@ REST_FLAG_IN_TAVERN
Definition: Player.h:814
@ PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS
Definition: Player.h:876
@ PLAYER_LOGIN_QUERY_LOAD_GLYPHS
Definition: Player.h:882
@ PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES
Definition: Player.h:877
@ PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW
Definition: Player.h:889
@ PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS
Definition: Player.h:868
@ PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS
Definition: Player.h:895
@ PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES
Definition: Player.h:890
@ PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS
Definition: Player.h:891
@ PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST
Definition: Player.h:874
@ PLAYER_LOGIN_QUERY_LOAD_ACTIONS
Definition: Player.h:871
@ PLAYER_LOGIN_QUERY_LOAD_SKILLS
Definition: Player.h:885
@ PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS
Definition: Player.h:873
@ PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS
Definition: Player.h:896
@ PLAYER_LOGIN_QUERY_LOAD_INVENTORY
Definition: Player.h:870
@ PLAYER_LOGIN_QUERY_LOAD_REPUTATION
Definition: Player.h:869
@ PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH
Definition: Player.h:893
@ PLAYER_LOGIN_QUERY_LOAD_FROM
Definition: Player.h:864
@ PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS
Definition: Player.h:867
@ PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT
Definition: Player.h:881
@ PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES
Definition: Player.h:897
@ PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS
Definition: Player.h:886
@ PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS
Definition: Player.h:892
@ PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS
Definition: Player.h:880
@ PLAYER_LOGIN_QUERY_LOAD_MAILS
Definition: Player.h:872
@ PLAYER_LOGIN_QUERY_LOAD_AURAS
Definition: Player.h:865
@ PLAYER_LOGIN_QUERY_LOAD_TALENTS
Definition: Player.h:883
@ PLAYER_LOGIN_QUERY_LOAD_BANNED
Definition: Player.h:888
@ PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS
Definition: Player.h:879
@ PLAYER_LOGIN_QUERY_LOAD_HOME_BIND
Definition: Player.h:875
@ PLAYER_LOGIN_QUERY_LOAD_SPELLS
Definition: Player.h:866
@ PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG
Definition: Player.h:887
@ PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS
Definition: Player.h:878
@ MOVEMENTFLAG_ONTRANSPORT
Definition: UnitDefines.h:353
@ UNIT_FLAG2_FORCE_MOVEMENT
Definition: UnitDefines.h:274
@ UNIT_STATE_ISOLATED
Definition: UnitDefines.h:162
@ CONFIG_GM_CHAT
Definition: IWorld.h:261
@ CONFIG_GM_WHISPERING_TO
Definition: IWorld.h:262
@ CONFIG_GM_LOGIN_STATE
Definition: IWorld.h:258
@ CONFIG_GM_VISIBLE_STATE
Definition: IWorld.h:259
@ RATE_REST_OFFLINE_IN_WILDERNESS
Definition: IWorld.h:504
@ RATE_REST_OFFLINE_IN_TAVERN_OR_CITY
Definition: IWorld.h:503
@ CHAR_UPD_ADD_AT_LOGIN_FLAG
Definition: CharacterDatabase.h:274
#define MAX_RAID_DIFFICULTY
Definition: DBCEnums.h:282
#define MAX_DUNGEON_DIFFICULTY
Definition: DBCEnums.h:281
@ SPELL_EFFECT_ATTACK_ME
Definition: SharedDefines.h:892
@ CHAR_NAME_SUCCESS
Definition: SharedDefines.h:3419
@ UNIT_DYNFLAG_REFER_A_FRIEND
Definition: SharedDefines.h:3127
@ IMMUNITY_STATE
Definition: SharedDefines.h:1395
@ IMMUNITY_EFFECT
Definition: SharedDefines.h:1394
bool IsValidMapCoord(float c)
Definition: GridDefines.h:216
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult, PreparedQueryResult offlineUpdatesResult)
Definition: AchievementMgr.cpp:617
Transport * ToTransport()
Definition: GameObject.h:322
virtual void SetDynamicFlag(uint32 flag)
Definition: Object.h:120
bool _LoadIntoDataField(std::string const &data, uint32 startOffset, uint32 count)
Definition: Object.cpp:612
void RemoveMovementFlag(uint32 flag)
Definition: Object.h:333
struct MovementInfo::TransportInfo transport
void Reset()
Definition: Object.h:287
ObjectGuid guid
Definition: Object.h:296
Position pos
Definition: Object.h:297
Transport * m_transport
Definition: Object.h:654
bool IsPositionValid() const
Definition: Position.cpp:175
void ClearTaxiPath()
Definition: Player.h:1059
bool HasTaxiPath() const
Definition: Player.h:1060
void _LoadDeclinedNames(PreparedQueryResult result)
Definition: PlayerStorage.cpp:4800
void _LoadGlyphs(PreparedQueryResult result)
Definition: Player.cpp:14905
void SetRestFlag(RestFlag restFlag, uint32 triggerId=0)
Definition: Player.cpp:16100
void SetCreationTime(Seconds creationTime)
Definition: Player.h:2515
void SetGameMaster(bool on)
Definition: Player.cpp:2205
void _LoadQuestStatusRewarded(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6329
void _LoadAuras(PreparedQueryResult result, uint32 timediff)
Definition: PlayerStorage.cpp:5714
void _LoadSeasonalQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6437
void _LoadGroup()
Definition: PlayerStorage.cpp:6495
void _LoadCharacterSettings(PreparedQueryResult result)
Definition: PlayerSettings.cpp:26
void _LoadTalents(PreparedQueryResult result)
Definition: Player.cpp:14954
void SetFallInformation(uint32 time, float z)
Definition: Player.h:2313
void _LoadPetStable(uint8 petStableSlots, PreparedQueryResult result)
Definition: Player.cpp:15769
void _LoadBrewOfTheMonth(PreparedQueryResult result)
Definition: Player.cpp:15732
WorldLocation const & GetEntryPoint() const
Definition: Player.h:2354
void outDebugValues() const
Definition: PlayerStorage.cpp:7796
void _LoadRandomBGStatus(PreparedQueryResult result)
Definition: Player.cpp:15667
void SaveRecallPosition()
Definition: Player.cpp:5604
void _LoadQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6242
void _LoadMonthlyQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6460
void SetGMChat(bool on)
Definition: Player.h:1161
void _LoadArenaTeamInfo()
Definition: PlayerStorage.cpp:4811
bool _LoadHomeBind(PreparedQueryResult result)
Definition: PlayerStorage.cpp:7002
void UpdateItemDuration(uint32 time, bool realtimeonly=false)
Definition: PlayerStorage.cpp:4160
void _LoadSpells(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6482
void _LoadSkills(PreparedQueryResult result)
Definition: Player.cpp:13620
void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult)
Definition: PlayerStorage.cpp:6169
void _LoadWeeklyQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6415
void SetGMVisible(bool on)
Definition: Player.cpp:2274
void PrepareCharmAISpells()
Definition: Player.cpp:15363
void _LoadGlyphAuras()
Definition: PlayerStorage.cpp:5797
void ReplaceAllPlayerFlags(PlayerFlags flags)
Definition: Player.h:1111
void _LoadEquipmentSets(PreparedQueryResult result)
Definition: PlayerStorage.cpp:4842
void _LoadEntryPointData(PreparedQueryResult result)
Definition: PlayerStorage.cpp:4873
void _LoadInstanceTimeRestrictions(PreparedQueryResult result)
Definition: Player.cpp:15720
void StoreRaidMapDifficulty()
Definition: Player.h:1903
void _LoadInventory(PreparedQueryResult result, uint32 timeDiff)
Definition: PlayerStorage.cpp:5849
void UpdateHonorFields()
Definition: PlayerUpdates.cpp:1137
void _LoadSpellCooldowns(PreparedQueryResult result)
Definition: Player.cpp:3567
void SetMoney(uint32 value)
Definition: Player.h:1603
void _LoadDailyQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6364
bool LoadTaxiMask(std::string_view data)
Definition: PlayerTaxi.cpp:89
bool LoadTaxiDestinationsFromString(std::string const &values, TeamId teamId)
Definition: PlayerTaxi.cpp:130
virtual void AddPassenger(WorldObject *passenger, bool withAll=false)=0
void CalculatePassengerPosition(float &x, float &y, float &z, float *o=nullptr) const override
This method transforms supplied transport offsets into global coordinates.
Definition: Transport.h:32
bool HealthAbovePct(int32 pct) const
Definition: Unit.h:788
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition: Unit.cpp:13329
void RemoveAllAurasRequiringDeadTarget()
Definition: Unit.cpp:5326
DeathState m_deathState
Definition: Unit.h:1833
void RemoveAllAurasOnDeath()
Definition: Unit.cpp:5303
void AddUnitState(uint32 f)
Definition: Unit.h:738
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:786
void AddUnitMovementFlag(uint32 f)
Definition: Unit.h:1615
void RemoveUnitFlag2(UnitFlags2 flags)
Definition: Unit.h:833
void SetOwnerGUID(ObjectGuid owner)
Definition: Unit.cpp:10518
void ClearInCombat()
Definition: Unit.cpp:13749
void SetCreatorGUID(ObjectGuid creator)
Definition: Unit.h:1160
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition: Unit.cpp:5135
static T * Find(ObjectGuid guid)
Definition: ObjectAccessor.cpp:56
Definition: ObjectMgr.h:412
float target_Z
Definition: ObjectMgr.h:416
float target_X
Definition: ObjectMgr.h:414
float target_Orientation
Definition: ObjectMgr.h:417
float target_Y
Definition: ObjectMgr.h:415
uint32 target_mapId
Definition: ObjectMgr.h:413
static uint8 CheckPlayerName(std::string_view name, bool create=false)
Definition: ObjectMgr.cpp:8375
uint32 GetInstanceId() const
Definition: InstanceSaveMgr.h:61
GameObjectBySpawnIdContainer & GetGameObjectBySpawnIdStore()
Definition: Map.h:523
void LoadFromDB(PreparedQueryResult result)
Definition: ReputationMgr.cpp:561
void SetPlayer(Player *player)
Definition: WorldSession.cpp:1258
bool IsARecruiter() const
Definition: WorldSession.h:527
uint32 CasterAuraState
Definition: SpellInfo.h:339
bool IsNonRaidDungeon() const
Definition: DBCStructure.h:1352
uint32 Expansion() const
Definition: DBCStructure.h:1349
bool IsBattlegroundOrArena() const
Definition: DBCStructure.h:1357
bool IsDungeon() const
Definition: DBCStructure.h:1351
bool IsRaid() const
Definition: DBCStructure.h:1354
bool Instanceable() const
Definition: DBCStructure.h:1353

References Object::_Create(), _LoadActions(), _LoadArenaTeamInfo(), _LoadAuras(), _LoadBrewOfTheMonth(), _LoadCharacterSettings(), _LoadDailyQuestStatus(), _LoadDeclinedNames(), _LoadEntryPointData(), _LoadEquipmentSets(), _LoadGlyphAuras(), _LoadGlyphs(), _LoadGroup(), _LoadHomeBind(), _LoadInstanceTimeRestrictions(), Object::_LoadIntoDataField(), _LoadInventory(), _LoadMail(), _LoadMonthlyQuestStatus(), _LoadPetStable(), _LoadQuestStatus(), _LoadQuestStatusRewarded(), _LoadRandomBGStatus(), _LoadSeasonalQuestStatus(), _LoadSkills(), _LoadSpellCooldowns(), _LoadSpells(), _LoadTalents(), _LoadWeeklyQuestStatus(), _restBonus, Transport::AddPassenger(), PlayerTaxi::AddTaxiDestination(), Unit::AddUnitMovementFlag(), Unit::AddUnitState(), Unit::ApplySpellImmune(), AT_LOGIN_RENAME, AURA_EFFECT_HANDLE_REAL, AURA_INTERRUPT_FLAG_CHANGE_MAP, AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, Transport::CalculatePassengerPosition(), SpellInfo::CasterAuraState, CHAR_NAME_SUCCESS, CHAR_UPD_ADD_AT_LOGIN_FLAG, CharacterDatabase, ObjectMgr::CheckPlayerName(), Unit::ClearInCombat(), PlayerTaxi::ClearTaxiDestinations(), EntryPointData::ClearTaxiPath(), CONFIG_GM_CHAT, CONFIG_GM_LOGIN_STATE, CONFIG_GM_VISIBLE_STATE, CONFIG_GM_WHISPERING_TO, DEATH_EXPIRE_STEP, DUNGEON_DIFFICULTY_NORMAL, ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, MapEntry::Expansion(), HashMapHolder< T >::Find(), WorldObject::FindMap(), Field::Get(), WorldSession::GetAccountId(), Unit::GetAppliedAuras(), Unit::getClass(), ObjectGuid::GetCounter(), GetDifficulty(), GetDrunkValue(), GetDungeonDifficulty(), GetEntryPoint(), Map::GetGameObjectBySpawnIdStore(), GameTime::GetGameTime(), Object::GetGUID(), InstanceSave::GetInstanceId(), WorldLocation::GetMapId(), Unit::GetMaxHealth(), Unit::GetMaxPower(), WorldObject::GetName(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), SQLQueryHolderBase::GetPreparedResult(), Unit::getRace(), GetRaidDifficulty(), WorldSession::GetRecruiterId(), GetRestBonus(), GetSession(), Aura::GetSpellInfo(), GetTeamId(), Object::GetUInt32Value(), MovementInfo::TransportInfo::guid, Aura::HandleAllEffects(), HasAtLoginFlag(), Unit::HasAuraState(), Unit::HasAuraType(), HasPlayerFlag(), EntryPointData::HasTaxiPath(), HasTitle(), Unit::HealthAbovePct(), Unit::HealthBelowPct(), IMMUNITY_EFFECT, IMMUNITY_STATE, InitDisplayIds(), InitGlyphsForLevel(), InitPrimaryProfessions(), InitRunes(), InitStatsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), MapEntry::Instanceable(), Unit::IsAlive(), WorldSession::IsARecruiter(), MapEntry::IsBattlegroundOrArena(), MapEntry::IsDungeon(), Object::IsInWorld(), MapEntry::IsNonRaidDungeon(), AccountMgr::IsPlayerAccount(), Position::IsPositionValid(), MapEntry::IsRaid(), IsValidGender(), Acore::IsValidMapCoord(), KNOWN_TITLES_SIZE, LearnCustomSpells(), LearnDefaultSkills(), AchievementMgr::LoadFromDB(), ReputationMgr::LoadFromDB(), PlayerTaxi::LoadTaxiDestinationsFromString(), PlayerTaxi::LoadTaxiMask(), LOG_DEBUG, LOG_ERROR, LOG_WARN, m_achievementMgr, m_activeSpec, m_atLoginFlags, m_cinematic, m_deathExpireTime, Unit::m_deathState, m_entryPointData, m_extraBonusTalentCount, m_grantableLevels, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_items, m_lastHonorUpdateTime, WorldObject::m_movementInfo, WorldObject::m_name, m_nextSave, m_Played_time, Unit::m_race, Unit::m_realRace, m_reputationMgr, m_resetTalentsCost, m_resetTalentsTime, m_social, m_specsCount, m_taxi, WorldObject::m_transport, PlayerInfo::mapId, MAPID_INVALID, MAX_DEATH_COUNT, MAX_DUNGEON_DIFFICULTY, MAX_MONEY_AMOUNT, MAX_POWERS, MAX_RAID_DIFFICULTY, MOVEMENTFLAG_ONTRANSPORT, outDebugValues(), PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER__FIELD_KNOWN_TITLES, PLAYER_AMMO_ID, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_DUEL_ARBITER, PLAYER_DUEL_TEAM, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, PLAYER_EXTRA_ACCEPT_WHISPERS, PLAYER_EXTRA_GM_CHAT, PLAYER_EXTRA_GM_INVISIBLE, PLAYER_EXTRA_GM_ON, PLAYER_FARSIGHT, PLAYER_FIELD_BYTES, PLAYER_FIELD_INV_SLOT_HEAD, PLAYER_FIELD_KILLS, PLAYER_FIELD_KNOWN_CURRENCIES, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_FLAGS_GHOST, PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS, PLAYER_LOGIN_QUERY_LOAD_ACTIONS, PLAYER_LOGIN_QUERY_LOAD_AURAS, PLAYER_LOGIN_QUERY_LOAD_BANNED, PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH, PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS, PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS, PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES, PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT, PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS, PLAYER_LOGIN_QUERY_LOAD_FROM, PLAYER_LOGIN_QUERY_LOAD_GLYPHS, PLAYER_LOGIN_QUERY_LOAD_HOME_BIND, PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES, PLAYER_LOGIN_QUERY_LOAD_INVENTORY, PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS, PLAYER_LOGIN_QUERY_LOAD_MAILS, PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES, PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS, PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW, PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG, PLAYER_LOGIN_QUERY_LOAD_REPUTATION, PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_SKILLS, PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST, PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS, PLAYER_LOGIN_QUERY_LOAD_SPELLS, PLAYER_LOGIN_QUERY_LOAD_TALENTS, PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS, PLAYER_NEXT_LEVEL_XP, PLAYER_TRACK_CREATURES, PLAYER_TRACK_RESOURCES, PLAYER_XP, MovementInfo::TransportInfo::pos, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, PrepareCharmAISpells(), RAID_DIFFICULTY_10MAN_NORMAL, RATE_REST_OFFLINE_IN_TAVERN_OR_CITY, RATE_REST_OFFLINE_IN_WILDERNESS, Position::Relocate(), Unit::RemoveAllAurasOnDeath(), Unit::RemoveAllAurasRequiringDeadTarget(), Unit::RemoveAurasByType(), Unit::RemoveAurasWithInterruptFlags(), MovementInfo::RemoveMovementFlag(), Unit::RemoveUnitFlag2(), ReplaceAllPlayerFlags(), MovementInfo::TransportInfo::Reset(), REST_FLAG_IN_TAVERN, ResurrectPlayer(), SaveRecallPosition(), SetAcceptWhispers(), SetArenaPoints(), Object::SetByteValue(), Unit::SetCanModifyStats(), SetCreationTime(), Unit::SetCreatorGUID(), PreparedStatementBase::SetData(), SetDrunkValue(), SetDungeonDifficulty(), Object::SetDynamicFlag(), SetFactionForRace(), SetFallInformation(), Object::SetFlag(), Object::SetFloatValue(), SetGameMaster(), SetGMChat(), SetGMVisible(), Object::SetGuidValue(), Unit::SetHealth(), SetHonorPoints(), Object::SetInt32Value(), SetMap(), SetMoney(), SetObjectScale(), Unit::SetOwnerGUID(), WorldSession::SetPlayer(), Unit::SetPower(), SetRaidDifficulty(), SetRestBonus(), SetRestFlag(), Object::SetUInt16Value(), Unit::SetUInt32Value(), Object::SetUInt64Value(), SetVisibleItemSlot(), sInstanceSaveMgr, sMapMgr, sMapStore, sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOD_TAUNT, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_EFFECT_ATTACK_ME, sScriptMgr, sSocialMgr, StoreRaidMapDifficulty(), sWorld, AreaTriggerTeleport::target_mapId, AreaTriggerTeleport::target_Orientation, AreaTriggerTeleport::target_X, AreaTriggerTeleport::target_Y, AreaTriggerTeleport::target_Z, EntryPointData::taxiPath, ObjectGuid::ToString(), Position::ToString(), GameObject::ToTransport(), MovementInfo::transport, UNIT_CHANNEL_SPELL, UNIT_DYNFLAG_REFER_A_FRIEND, UNIT_FIELD_AURASTATE, UNIT_FIELD_BYTES_0, UNIT_FIELD_CHANNEL_OBJECT, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FIELD_HOVERHEIGHT, UNIT_FIELD_LEVEL, UNIT_FIELD_SUMMON, UNIT_FLAG2_FORCE_MOVEMENT, UNIT_STATE_ISOLATED, UpdateAllStats(), UpdateHonorFields(), UpdateItemDuration(), WorldObject::UpdatePositionData(), UpdateSkillsForLevel(), and urand().

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadPet()

void Player::LoadPet ( )
6231{
6232 //fixme: the pet should still be loaded if the player is not in world
6233 // just not added to the map
6234 if (m_petStable && IsInWorld())
6235 {
6236 Pet* pet = new Pet(this);
6237 if (!pet->LoadPetFromDB(this, 0, 0, true))
6238 delete pet;
6239 }
6240}
bool LoadPetFromDB(Player *owner, uint32 petEntry, uint32 petnumber, bool current, uint32 healthPct=0, bool fullMana=false)
Definition: Pet.cpp:215

References Object::IsInWorld(), Pet::LoadPetFromDB(), and m_petStable.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadPositionFromDB()

bool Player::LoadPositionFromDB ( uint32 mapid,
float &  x,
float &  y,
float &  z,
float &  o,
bool &  in_flight,
ObjectGuid::LowType  guid 
)
static
4891{
4893 stmt->SetData(0, guid);
4894 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4895
4896 if (!result)
4897 return false;
4898
4899 Field* fields = result->Fetch();
4900
4901 x = fields[0].Get<float>();
4902 y = fields[1].Get<float>();
4903 z = fields[2].Get<float>();
4904 o = fields[3].Get<float>();
4905 mapid = fields[4].Get<uint16>();
4906 in_flight = !fields[5].Get<std::string>().empty();
4907
4908 return true;
4909}
@ CHAR_SEL_CHAR_POSITION
Definition: CharacterDatabase.h:54

References CHAR_SEL_CHAR_POSITION, CharacterDatabase, Field::Get(), and PreparedStatementBase::SetData().

Referenced by misc_commandscript::HandleAppearCommand().

◆ ModifyArenaPoints()

void Player::ModifyArenaPoints ( int32  value,
CharacterDatabaseTransaction  trans = CharacterDatabaseTransaction(nullptr) 
)

If trans is specified, honor save query will be added to trans.

6245{
6246 int32 newValue = int32(GetArenaPoints()) + value;
6247 if (newValue < 0)
6248 newValue = 0;
6249 SetArenaPoints(uint32(newValue));
6250
6251 if (trans)
6252 {
6254 stmt->SetData(0, newValue);
6255 stmt->SetData(1, GetGUID().GetCounter());
6256 trans->Append(stmt);
6257 }
6258}
@ CHAR_UDP_CHAR_ARENA_POINTS
Definition: CharacterDatabase.h:425

References CHAR_UDP_CHAR_ARENA_POINTS, CharacterDatabase, GetArenaPoints(), Object::GetGUID(), SetArenaPoints(), and PreparedStatementBase::SetData().

Referenced by _StoreOrEquipNewItem(), modify_commandscript::HandleModifyArenaCommand(), RefundItem(), and RewardQuest().

◆ ModifyHonorPoints()

void Player::ModifyHonorPoints ( int32  value,
CharacterDatabaseTransaction  trans = CharacterDatabaseTransaction(nullptr) 
)
6229{
6230 int32 newValue = int32(GetHonorPoints()) + value;
6231 if (newValue < 0)
6232 newValue = 0;
6233 SetHonorPoints(uint32(newValue));
6234
6235 if (trans)
6236 {
6238 stmt->SetData(0, newValue);
6239 stmt->SetData(1, GetGUID().GetCounter());
6240 trans->Append(stmt);
6241 }
6242}
@ CHAR_UDP_CHAR_HONOR_POINTS
Definition: CharacterDatabase.h:423

References CHAR_UDP_CHAR_HONOR_POINTS, CharacterDatabase, Object::GetGUID(), GetHonorPoints(), PreparedStatementBase::SetData(), and SetHonorPoints().

Referenced by _StoreOrEquipNewItem(), modify_commandscript::HandleModifyHonorCommand(), RefundItem(), and RewardHonor().

◆ ModifyMoney()

bool Player::ModifyMoney ( int32  amount,
bool  sendError = true 
)
11469{
11470 if (!amount)
11471 return true;
11472
11473 sScriptMgr->OnPlayerMoneyChanged(this, amount);
11474
11475 if (amount < 0)
11476 SetMoney (GetMoney() > uint32(-amount) ? GetMoney() + amount : 0);
11477 else
11478 {
11479 if (GetMoney() < uint32(MAX_MONEY_AMOUNT - amount))
11480 SetMoney(GetMoney() + amount);
11481 else
11482 {
11483 if (sendError)
11484 SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, nullptr, nullptr);
11485 return false;
11486 }
11487 }
11488
11489 return true;
11490}
@ EQUIP_ERR_TOO_MUCH_GOLD
Definition: Item.h:123

References EQUIP_ERR_TOO_MUCH_GOLD, GetMoney(), MAX_MONEY_AMOUNT, SendEquipError(), SetMoney(), and sScriptMgr.

Referenced by _StoreOrEquipNewItem(), ActivateTaxiPathTo(), FlightPathMovementGenerator::DoUpdate(), DurabilityRepair(), WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAlterAppearance(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyBankSlotOpcode(), Guild::HandleBuyBankTab(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), modify_commandscript::HandleModifyMoneyCommand(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), Guild::HandleSetEmblem(), WorldSession::HandleTrainerBuySpellOpcode(), npc_experience::OnGossipSelect(), OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), ProcessCastaction(), ProcessUnlearnAction(), RefundItem(), resetTalents(), RewardQuest(), and SetHonorPoints().

◆ ModifySkillBonus()

void Player::ModifySkillBonus ( uint32  skillid,
int32  val,
bool  talent 
)
5254{
5255 SkillStatusMap::const_iterator itr = mSkillStatus.find(skillid);
5256 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5257 return;
5258
5259 uint32 bonusIndex = PLAYER_SKILL_BONUS_INDEX(itr->second.pos);
5260
5261 uint32 bonus_val = GetUInt32Value(bonusIndex);
5262 int16 temp_bonus = SKILL_TEMP_BONUS(bonus_val);
5263 int16 perm_bonus = SKILL_PERM_BONUS(bonus_val);
5264
5265 if (talent) // permanent bonus stored in high part
5266 SetUInt32Value(bonusIndex, MAKE_SKILL_BONUS(temp_bonus, perm_bonus + val));
5267 else // temporary/item bonus stored in low part
5268 SetUInt32Value(bonusIndex, MAKE_SKILL_BONUS(temp_bonus + val, perm_bonus));
5269}
#define MAKE_SKILL_BONUS(t, p)
Definition: Player.h:88

References Object::GetUInt32Value(), MAKE_SKILL_BONUS, mSkillStatus, PLAYER_SKILL_BONUS_INDEX, Unit::SetUInt32Value(), SKILL_DELETED, SKILL_PERM_BONUS, and SKILL_TEMP_BONUS.

Referenced by AuraEffect::HandleAuraModSkill().

◆ ModifySpellCooldown()

void Player::ModifySpellCooldown ( uint32  spellId,
int32  cooldown 
)
11048{
11049 SpellCooldowns::iterator itr = m_spellCooldowns.find(spellId);
11050 if (itr == m_spellCooldowns.end())
11051 return;
11052
11053 itr->second.end += cooldown;
11054
11055 WorldPacket data(SMSG_MODIFY_COOLDOWN, 4 + 8 + 4);
11056 data << uint32(spellId); // Spell ID
11057 data << GetGUID(); // Player GUID
11058 data << int32(cooldown); // Cooldown mod in milliseconds
11059 GetSession()->SendPacket(&data);
11060}
@ SMSG_MODIFY_COOLDOWN
Definition: Opcodes.h:1199

References Object::GetGUID(), GetSession(), m_spellCooldowns, WorldSession::SendPacket(), and SMSG_MODIFY_COOLDOWN.

◆ MoneyChanged()

void Player::MoneyChanged ( uint32  value)
2166{
2167 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2168 {
2169 uint32 questid = GetQuestSlotQuestId(i);
2170 if (!questid)
2171 continue;
2172
2173 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2174 {
2175 int32 rewOrReqMoney = qInfo->GetRewOrReqMoney();
2176 if (rewOrReqMoney < 0)
2177 {
2178 QuestStatusData& q_status = m_QuestStatus[questid];
2179
2180 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2181 {
2182 if (int32(count) >= -rewOrReqMoney)
2183 {
2184 if (CanCompleteQuest(questid))
2185 {
2186 CompleteQuest(questid);
2187 }
2188 }
2189 }
2190 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2191 {
2192 if (int32(count) < -rewOrReqMoney)
2193 {
2194 IncompleteQuest(questid);
2195 }
2196 }
2197 }
2198 }
2199 }
2200}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by SetMoney().

◆ MoveItemFromInventory()

void Player::MoveItemFromInventory ( uint8  bag,
uint8  slot,
bool  update 
)
2994{
2995 if (Item* it = GetItemByPos(bag, slot))
2996 {
2997 ItemRemovedQuestCheck(it->GetEntry(), it->GetCount());
2998 RemoveItem(bag, slot, update);
3000 it->SetNotRefundable(this, false);
3001 it->RemoveFromUpdateQueueOf(this);
3002 if (it->IsInWorld())
3003 {
3004 it->RemoveFromWorld();
3005 it->DestroyForPlayer(this);
3006 }
3007
3008 sScriptMgr->OnAfterPlayerMoveItemFromInventory(this, it, bag, slot, update);
3009 }
3010}

References GetItemByPos(), ItemRemovedQuestCheck(), RemoveItem(), sScriptMgr, and UpdateTitansGrip().

Referenced by AutoUnequipOffhandIfNeed(), WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAuctionSellItem(), and WorldSession::HandleSendMail().

◆ MoveItemToInventory()

void Player::MoveItemToInventory ( ItemPosCountVec const &  dest,
Item pItem,
bool  update,
bool  in_characterInventoryDB = false 
)
3014{
3015 // update quest counters
3016 ItemAddedQuestCheck(pItem->GetEntry(), pItem->GetCount());
3018
3019 // store item
3020 Item* pLastItem = StoreItem(dest, pItem, update);
3021
3022 // only set if not merged to existed stack (pItem can be deleted already but we can compare pointers any way)
3023 if (pLastItem == pItem)
3024 {
3025 // update owner for last item (this can be original item with wrong owner
3026 if (pLastItem->GetOwnerGUID() != GetGUID())
3027 pLastItem->SetOwnerGUID(GetGUID());
3028
3029 // if this original item then it need create record in inventory
3030 // in case trade we already have item in other player inventory
3031 pLastItem->SetState(in_characterInventoryDB ? ITEM_CHANGED : ITEM_NEW, this);
3032
3033 if (pLastItem->IsBOPTradable())
3034 AddTradeableItem(pLastItem);
3035 }
3036}
ObjectGuid GetOwnerGUID() const
Definition: Item.h:231

References ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, AddTradeableItem(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Item::GetOwnerGUID(), Item::IsBOPTradable(), ITEM_CHANGED, ITEM_NEW, ItemAddedQuestCheck(), Item::SetOwnerGUID(), Item::SetState(), StoreItem(), and UpdateAchievementCriteria().

Referenced by WorldSession::HandleMailTakeItem(), and WorldSession::moveItems().

◆ MustDelayTeleport()

bool Player::MustDelayTeleport ( ) const
inlineprivate
2908{ return m_bMustDelayTeleport; } // pussywizard: must delay teleports during player update to the very end

References m_bMustDelayTeleport.

Referenced by TeleportTo().

◆ NeedSendSpectatorData()

bool Player::NeedSendSpectatorData ( ) const
15352{
15353 if (FindMap() && FindMap()->IsBattleArena() && !IsSpectator())
15354 {
15355 Battleground* bg = ((BattlegroundMap*)FindMap())->GetBG();
15356 if (bg && bg->HaveSpectators() && bg->GetStatus() == STATUS_IN_PROGRESS && !bg->GetPlayers().empty())
15357 if (bg->GetPlayers().find(GetGUID()) != bg->GetPlayers().end())
15358 return true;
15359 }
15360 return false;
15361}
bool HaveSpectators()
Definition: Battleground.h:390
BattlegroundPlayerMap const & GetPlayers() const
Definition: Battleground.h:401
bool IsSpectator() const
Definition: Player.h:2553
Definition: Map.h:853

References WorldObject::FindMap(), Object::GetGUID(), Battleground::GetPlayers(), Battleground::GetStatus(), Battleground::HaveSpectators(), IsSpectator(), and STATUS_IN_PROGRESS.

Referenced by _AddSpellCooldown(), Spell::cancel(), RemovePet(), Spell::SendChannelStart(), SendClearCooldown(), Spell::SendSpellStart(), setDeathState(), Unit::SetHealth(), Unit::SetMaxHealth(), Unit::SetMaxPower(), Unit::SetPower(), SetSelection(), and SummonPet().

◆ NeedToSaveGlyphs()

bool Player::NeedToSaveGlyphs ( )
inline
2578{ return m_NeedToSaveGlyphs; }

References m_NeedToSaveGlyphs.

Referenced by _SaveGlyphs().

◆ OCTRegenHPPerSpirit()

float Player::OCTRegenHPPerSpirit ( )
5162{
5163 uint8 level = GetLevel();
5164 uint32 pclass = getClass();
5165
5166 if (level > GT_MAX_LEVEL)
5167 level = GT_MAX_LEVEL;
5168
5169 GtOCTRegenHPEntry const* baseRatio = sGtOCTRegenHPStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5170 GtRegenHPPerSptEntry const* moreRatio = sGtRegenHPPerSptStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5171 if (!baseRatio || !moreRatio)
5172 return 0.0f;
5173
5174 // Formula from PaperDollFrame script
5175 float spirit = GetStat(STAT_SPIRIT);
5176 float baseSpirit = spirit;
5177 if (baseSpirit > 50)
5178 baseSpirit = 50;
5179 float moreSpirit = spirit - baseSpirit;
5180 float regen = (baseSpirit * baseRatio->ratio + moreSpirit * moreRatio->ratio) * 2;
5181 return regen;
5182}
DBCStorage< GtRegenHPPerSptEntry > sGtRegenHPPerSptStore(GtRegenHPPerSptfmt)
DBCStorage< GtOCTRegenHPEntry > sGtOCTRegenHPStore(GtOCTRegenHPfmt)
Definition: DBCStructure.h:1082
float ratio
Definition: DBCStructure.h:1083
Definition: DBCStructure.h:1092
float ratio
Definition: DBCStructure.h:1093

References Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtOCTRegenHPEntry::ratio, GtRegenHPPerSptEntry::ratio, sGtOCTRegenHPStore, sGtRegenHPPerSptStore, and STAT_SPIRIT.

Referenced by RegenerateHealth().

◆ OCTRegenMPPerSpirit()

float Player::OCTRegenMPPerSpirit ( )
5185{
5186 uint8 level = GetLevel();
5187 uint32 pclass = getClass();
5188
5189 if (level > GT_MAX_LEVEL)
5190 level = GT_MAX_LEVEL;
5191
5192 // GtOCTRegenMPEntry const* baseRatio = sGtOCTRegenMPStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1);
5193 GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5194 if (!moreRatio)
5195 return 0.0f;
5196
5197 // Formula get from PaperDollFrame script
5198 float spirit = GetStat(STAT_SPIRIT);
5199 float regen = spirit * moreRatio->ratio;
5200 return regen;
5201}
DBCStorage< GtRegenMPPerSptEntry > sGtRegenMPPerSptStore(GtRegenMPPerSptfmt)
Definition: DBCStructure.h:1097
float ratio
Definition: DBCStructure.h:1098

References Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtRegenMPPerSptEntry::ratio, sGtRegenMPPerSptStore, and STAT_SPIRIT.

Referenced by UpdateManaRegen().

◆ OfflineResurrect()

◆ OnGossipSelect()

void Player::OnGossipSelect ( WorldObject source,
uint32  gossipListId,
uint32  menuId 
)
245{
247
248 // if not same, then something funky is going on
249 if (menuId != gossipMenu.GetMenuId())
250 return;
251
252 GossipMenuItem const* item = gossipMenu.GetItem(gossipListId);
253 if (!item)
254 return;
255
256 uint32 gossipOptionId = item->OptionType;
257 ObjectGuid guid = source->GetGUID();
258
259 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && source->IsCreature())
260 {
262 {
264
267 else
269
271 return;
272 }
273 }
274
275 if (source->IsGameObject())
276 {
277 if (gossipOptionId > GOSSIP_OPTION_QUESTGIVER)
278 {
279 LOG_ERROR("entities.player", "Player guid {} request invalid gossip option for GameObject entry {}", GetGUID().ToString(), source->GetEntry());
280 return;
281 }
282 }
283
284 GossipMenuItemData const* menuItemData = gossipMenu.GetItemData(gossipListId);
285 if (!menuItemData)
286 return;
287
288 int32 cost = int32(item->BoxMoney);
289 if (!HasEnoughMoney(cost))
290 {
293 return;
294 }
295
296 switch (gossipOptionId)
297 {
300 {
301 if (menuItemData->GossipActionPoi)
303
304 if (menuItemData->GossipActionMenuId)
305 {
306 PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
307 SendPreparedGossip(source);
308 }
309
310 break;
311 }
313 sOutdoorPvPMgr->HandleGossipOption(this, source->ToCreature(), gossipListId);
314 break;
316 if (isDead())
317 source->ToCreature()->CastSpell(source->ToCreature(), 17251, true, nullptr, nullptr, GetGUID());
318 break;
320 PrepareQuestMenu(guid);
321 SendPreparedQuest(guid);
322 break;
325 GetSession()->SendListInventory(guid, menuItemData->GossipActionMenuId);
326 break;
328 GetSession()->SendStablePet(guid);
329 break;
332 break;
334 if (GetSpecsCount() == 1 && GetLevel() >= sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))
335 {
336 // Cast spells that teach dual spec
337 // Both are also ImplicitTarget self and must be cast by player
338 CastSpell(this, 63680, true, nullptr, nullptr, GetGUID());
339 CastSpell(this, 63624, true, nullptr, nullptr, GetGUID());
340
341 PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
342 SendPreparedGossip(source);
343 }
344 break;
348 break;
352 break;
354 GetSession()->SendTaxiMenu(source->ToCreature());
355 break;
358 SetBindPoint(guid);
359 break;
361 GetSession()->SendShowBank(guid);
362 break;
366 break;
370 break;
372 GetSession()->SendAuctionHello(guid, source->ToCreature());
373 break;
375 PrepareGossipMenu(source);
376 SendPreparedGossip(source);
377 break;
379 {
380 BattlegroundTypeId bgTypeId = sBattlegroundMgr->GetBattleMasterBG(source->GetEntry());
381
382 if (bgTypeId == BATTLEGROUND_TYPE_NONE)
383 {
384 LOG_ERROR("entities.player", "A user ({}) requested battlegroundlist from a npc who is no battlemaster", GetGUID().ToString());
385 return;
386 }
387
388 GetSession()->SendBattleGroundList(guid, bgTypeId);
389 break;
390 }
391 }
392
393 ModifyMoney(-cost);
394}
@ GOSSIP_OPTION_AUCTIONEER
Definition: GossipDef.h:47
@ GOSSIP_OPTION_UNLEARNTALENTS
Definition: GossipDef.h:50
@ GOSSIP_OPTION_TRAINER
Definition: GossipDef.h:39
@ GOSSIP_OPTION_ARMORER
Definition: GossipDef.h:49
@ GOSSIP_OPTION_UNLEARNPETTALENTS
Definition: GossipDef.h:51
@ GOSSIP_OPTION_VENDOR
Definition: GossipDef.h:37
@ GOSSIP_OPTION_OUTDOORPVP
Definition: GossipDef.h:53
@ GOSSIP_OPTION_BATTLEFIELD
Definition: GossipDef.h:46
@ GOSSIP_OPTION_TABARDDESIGNER
Definition: GossipDef.h:45
@ GOSSIP_OPTION_TAXIVENDOR
Definition: GossipDef.h:38
@ GOSSIP_OPTION_QUESTGIVER
Definition: GossipDef.h:36
@ GOSSIP_OPTION_LEARNDUALSPEC
Definition: GossipDef.h:52
@ GOSSIP_OPTION_INNKEEPER
Definition: GossipDef.h:42
@ GOSSIP_OPTION_SPIRITGUIDE
Definition: GossipDef.h:41
@ GOSSIP_OPTION_DUALSPEC_INFO
Definition: GossipDef.h:54
@ GOSSIP_OPTION_PETITIONER
Definition: GossipDef.h:44
@ GOSSIP_OPTION_BANKER
Definition: GossipDef.h:43
@ GOSSIP_OPTION_GOSSIP
Definition: GossipDef.h:35
@ GOSSIP_OPTION_SPIRITHEALER
Definition: GossipDef.h:40
@ GOSSIP_OPTION_STABLEPET
Definition: GossipDef.h:48
@ GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT
Definition: Player.h:1018
@ UNIT_NPC_FLAG_FLIGHTMASTER
Definition: UnitDefines.h:307
@ LANG_INSTANT_FLIGHT_OFF
Definition: Language.h:1316
@ LANG_INSTANT_FLIGHT_ON
Definition: Language.h:1315
@ CONFIG_MIN_DUALSPEC_LEVEL
Definition: IWorld.h:241
BattlegroundTypeId
Definition: SharedDefines.h:3479
@ BATTLEGROUND_TYPE_NONE
Definition: SharedDefines.h:3480
void SendNotification(std::string_view str)
Definition: Chat.cpp:107
Definition: GossipDef.h:131
uint32 OptionType
Definition: GossipDef.h:136
uint32 BoxMoney
Definition: GossipDef.h:138
Definition: GossipDef.h:145
uint32 GossipActionMenuId
Definition: GossipDef.h:146
uint32 GossipActionPoi
Definition: GossipDef.h:147
Definition: GossipDef.h:162
GossipMenuItem const * GetItem(uint32 id) const
Definition: GossipDef.h:187
uint32 GetMenuId() const
Definition: GossipDef.h:171
GossipMenuItemData const * GetItemData(uint32 indexId) const
Definition: GossipDef.h:196
void SendCloseGossip()
Definition: GossipDef.cpp:239
void SendPointOfInterest(uint32 poiId) const
Definition: GossipDef.cpp:247
GossipMenu & GetGossipMenu()
Definition: GossipDef.h:263
bool IsGameObject() const
Definition: Object.h:209
Unit * ToUnit()
Definition: Object.h:206
void SendTalentWipeConfirm(ObjectGuid guid)
Definition: Player.cpp:8835
void SendPreparedGossip(WorldObject *source)
Definition: PlayerGossip.cpp:209
void SendPreparedQuest(ObjectGuid guid)
Definition: PlayerQuest.cpp:115
void ToggleInstantFlight()
Definition: PlayerGossip.cpp:437
void ResetPetTalents()
Definition: Player.cpp:8844
void PrepareQuestMenu(ObjectGuid guid)
Definition: PlayerQuest.cpp:39
void SetBindPoint(ObjectGuid guid)
Definition: Player.cpp:8828
void PrepareGossipMenu(WorldObject *source, uint32 menuId=0, bool showQuests=false)
Definition: PlayerGossip.cpp:32
NPCFlags GetNpcFlags() const
Definition: Unit.h:990
void SendAuctionHello(ObjectGuid guid, Creature *unit)
Definition: AuctionHouseHandler.cpp:54
void SendPetitionShowList(ObjectGuid guid)
Definition: PetitionsHandler.cpp:824
void SendTaxiMenu(Creature *unit)
Definition: TaxiHandler.cpp:85
void SendListInventory(ObjectGuid guid, uint32 vendorEntry=0)
Definition: ItemHandler.cpp:1036
void SendTrainerList(ObjectGuid guid)
Definition: NPCHandler.cpp:88
void SendShowBank(ObjectGuid guid)
Definition: BankHandler.cpp:189
void SendStablePet(ObjectGuid guid)
Definition: NPCHandler.cpp:481
void SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId=BATTLEGROUND_RB)
Definition: BattleGroundHandler.cpp:65
void SendTabardVendorActivate(ObjectGuid guid)
Definition: NPCHandler.cpp:66

References BATTLEGROUND_TYPE_NONE, GossipMenuItem::BoxMoney, BUY_ERR_NOT_ENOUGHT_MONEY, Unit::CastSpell(), CONFIG_INSTANT_TAXI, CONFIG_MIN_DUALSPEC_LEVEL, Object::GetEntry(), PlayerMenu::GetGossipMenu(), Object::GetGUID(), GossipMenu::GetItem(), GossipMenu::GetItemData(), Unit::GetLevel(), GossipMenu::GetMenuId(), Unit::GetNpcFlags(), GetSession(), GetSpecsCount(), GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT, GOSSIP_OPTION_ARMORER, GOSSIP_OPTION_AUCTIONEER, GOSSIP_OPTION_BANKER, GOSSIP_OPTION_BATTLEFIELD, GOSSIP_OPTION_DUALSPEC_INFO, GOSSIP_OPTION_GOSSIP, GOSSIP_OPTION_INNKEEPER, GOSSIP_OPTION_LEARNDUALSPEC, GOSSIP_OPTION_OUTDOORPVP, GOSSIP_OPTION_PETITIONER, GOSSIP_OPTION_QUESTGIVER, GOSSIP_OPTION_SPIRITGUIDE, GOSSIP_OPTION_SPIRITHEALER, GOSSIP_OPTION_STABLEPET, GOSSIP_OPTION_TABARDDESIGNER, GOSSIP_OPTION_TAXIVENDOR, GOSSIP_OPTION_TRAINER, GOSSIP_OPTION_UNLEARNPETTALENTS, GOSSIP_OPTION_UNLEARNTALENTS, GOSSIP_OPTION_VENDOR, GossipMenuItemData::GossipActionMenuId, GossipMenuItemData::GossipActionPoi, HasEnoughMoney(), Object::IsCreature(), Unit::isDead(), Object::IsGameObject(), LANG_INSTANT_FLIGHT_OFF, LANG_INSTANT_FLIGHT_ON, LOG_ERROR, m_isInstantFlightOn, ModifyMoney(), GossipMenuItem::OptionType, PlayerTalkClass, PrepareGossipMenu(), PrepareQuestMenu(), ResetPetTalents(), sBattlegroundMgr, WorldSession::SendAuctionHello(), WorldSession::SendBattleGroundList(), SendBuyError(), PlayerMenu::SendCloseGossip(), WorldSession::SendListInventory(), ChatHandler::SendNotification(), WorldSession::SendPetitionShowList(), PlayerMenu::SendPointOfInterest(), SendPreparedGossip(), SendPreparedQuest(), WorldSession::SendShowBank(), WorldSession::SendStablePet(), WorldSession::SendTabardVendorActivate(), SendTalentWipeConfirm(), WorldSession::SendTaxiMenu(), WorldSession::SendTrainerList(), SetBindPoint(), sOutdoorPvPMgr, sWorld, Object::ToCreature(), ToggleInstantFlight(), Position::ToString(), Object::ToUnit(), and UNIT_NPC_FLAG_FLIGHTMASTER.

Referenced by WorldSession::HandleGossipSelectOptionOpcode().

◆ outDebugValues()

void Player::outDebugValues ( ) const
protected
7797{
7798 if (!sLog->ShouldLog("entities.player", LogLevel::LOG_LEVEL_DEBUG)) // optimize disabled debug output
7799 return;
7800
7801 LOG_DEBUG("entities.player", "HP is: \t\t\t{}\t\tMP is: \t\t\t{}", GetMaxHealth(), GetMaxPower(POWER_MANA));
7802 LOG_DEBUG("entities.player", "AGILITY is: \t\t{}\t\tSTRENGTH is: \t\t{}", GetStat(STAT_AGILITY), GetStat(STAT_STRENGTH));
7803 LOG_DEBUG("entities.player", "INTELLECT is: \t\t{}\t\tSPIRIT is: \t\t{}", GetStat(STAT_INTELLECT), GetStat(STAT_SPIRIT));
7804 LOG_DEBUG("entities.player", "STAMINA is: \t\t{}", GetStat(STAT_STAMINA));
7805 LOG_DEBUG("entities.player", "Armor is: \t\t{}\t\tBlock is: \t\t{}", GetArmor(), GetFloatValue(PLAYER_BLOCK_PERCENTAGE));
7806 LOG_DEBUG("entities.player", "HolyRes is: \t\t{}\t\tFireRes is: \t\t{}", GetResistance(SPELL_SCHOOL_HOLY), GetResistance(SPELL_SCHOOL_FIRE));
7807 LOG_DEBUG("entities.player", "NatureRes is: \t\t{}\t\tFrostRes is: \t\t{}", GetResistance(SPELL_SCHOOL_NATURE), GetResistance(SPELL_SCHOOL_FROST));
7808 LOG_DEBUG("entities.player", "ShadowRes is: \t\t{}\t\tArcaneRes is: \t\t{}", GetResistance(SPELL_SCHOOL_SHADOW), GetResistance(SPELL_SCHOOL_ARCANE));
7809 LOG_DEBUG("entities.player", "MIN_DAMAGE is: \t\t{}\tMAX_DAMAGE is: \t\t{}", GetFloatValue(UNIT_FIELD_MINDAMAGE), GetFloatValue(UNIT_FIELD_MAXDAMAGE));
7810 LOG_DEBUG("entities.player", "MIN_OFFHAND_DAMAGE is: \t{}\tMAX_OFFHAND_DAMAGE is: \t{}", GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE), GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE));
7811 LOG_DEBUG("entities.player", "MIN_RANGED_DAMAGE is: \t{}\tMAX_RANGED_DAMAGE is: \t{}", GetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE), GetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE));
7812 LOG_DEBUG("entities.player", "ATTACK_TIME is: \t{}\t\tRANGE_ATTACK_TIME is: \t{}", GetAttackTime(BASE_ATTACK), GetAttackTime(RANGED_ATTACK));
7813}
@ SPELL_SCHOOL_SHADOW
Definition: SharedDefines.h:288
@ SPELL_SCHOOL_NATURE
Definition: SharedDefines.h:286
@ SPELL_SCHOOL_FROST
Definition: SharedDefines.h:287
@ SPELL_SCHOOL_ARCANE
Definition: SharedDefines.h:289
@ SPELL_SCHOOL_FIRE
Definition: SharedDefines.h:285
#define sLog
Definition: Log.h:125
uint32 GetArmor() const
Definition: Unit.h:774

References BASE_ATTACK, Unit::GetArmor(), Unit::GetAttackTime(), Object::GetFloatValue(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetResistance(), Unit::GetStat(), LOG_DEBUG, PLAYER_BLOCK_PERCENTAGE, POWER_MANA, RANGED_ATTACK, sLog, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_SHADOW, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by LoadFromDB(), and SaveToDB().

◆ PetSpellInitialize()

void Player::PetSpellInitialize ( )
9426{
9427 Pet* pet = GetPet();
9428
9429 if (!pet)
9430 return;
9431
9432 LOG_DEBUG("entities.pet", "Pet Spells Groups");
9433
9434 CharmInfo* charmInfo = pet->GetCharmInfo();
9435
9436 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 1);
9437 data << pet->GetGUID();
9438 data << uint16(pet->GetCreatureTemplate()->family); // creature family (required for pet talents)
9439 data << uint32(pet->GetDuration().count());
9440 data << uint8(pet->GetReactState());
9441 data << uint8(charmInfo->GetCommandState());
9442 data << uint16(0); // Flags, mostly unknown
9443
9444 // action bar loop
9445 charmInfo->BuildActionBar(&data);
9446
9447 std::size_t spellsCountPos = data.wpos();
9448
9449 // spells count
9450 uint8 addlist = 0;
9451 data << uint8(addlist); // placeholder
9452
9453 if (pet->IsPermanentPetFor(this))
9454 {
9455 // spells loop
9456 for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr)
9457 {
9458 if (itr->second.state == PETSPELL_REMOVED)
9459 continue;
9460
9461 data << uint32(MAKE_UNIT_ACTION_BUTTON(itr->first, itr->second.active));
9462 ++addlist;
9463 }
9464 }
9465
9466 data.put<uint8>(spellsCountPos, addlist);
9467
9468 uint8 cooldownsCount = pet->m_CreatureSpellCooldowns.size();
9469 data << uint8(cooldownsCount);
9470
9471 uint32 curTime = GameTime::GetGameTimeMS().count();
9473
9474 for (CreatureSpellCooldowns::const_iterator itr = pet->m_CreatureSpellCooldowns.begin(); itr != pet->m_CreatureSpellCooldowns.end(); ++itr)
9475 {
9476 uint16 category = itr->second.category;
9477 uint32 cooldown = (itr->second.end > curTime) ? itr->second.end - curTime : 0;
9478
9479 data << uint32(itr->first); // spellid
9480 data << uint16(itr->second.category); // spell category
9481
9482 // send infinity cooldown in special format
9483 if (itr->second.end >= infTime)
9484 {
9485 data << uint32(1); // cooldown
9486 data << uint32(0x80000000); // category cooldown
9487 continue;
9488 }
9489
9490 data << uint32(category ? 0 : cooldown); // cooldown
9491 data << uint32(category ? cooldown : 0); // category cooldown
9492 }
9493
9494 GetSession()->SendPacket(&data);
9495}
@ PETSPELL_REMOVED
Definition: PetDefines.h:60
#define MAKE_UNIT_ACTION_BUTTON(A, T)
Definition: CharmInfo.h:32
CreatureSpellCooldowns m_CreatureSpellCooldowns
Definition: Creature.h:252
bool IsPermanentPetFor(Player *owner) const
Definition: Pet.cpp:2298
Milliseconds GetDuration() const
Definition: Pet.h:91
PetSpellMap m_spells
Definition: Pet.h:121

References CharmInfo::BuildActionBar(), CreatureTemplate::family, Unit::GetCharmInfo(), CharmInfo::GetCommandState(), Creature::GetCreatureTemplate(), Pet::GetDuration(), GameTime::GetGameTimeMS(), Object::GetGUID(), GetPet(), Creature::GetReactState(), GetSession(), infinityCooldownDelayCheck, Pet::IsPermanentPetFor(), LOG_DEBUG, Creature::m_CreatureSpellCooldowns, Pet::m_spells, MAKE_UNIT_ACTION_BUTTON, MAX_UNIT_ACTION_BAR_INDEX, PETSPELL_REMOVED, ByteBuffer::put(), WorldSession::SendPacket(), SMSG_PET_SPELLS, and ByteBuffer::wpos().

Referenced by CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectLearnPetSpell(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), AuraEffect::HandleModPossessPet(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandleRequestPetInfo(), Pet::learnSpell(), Pet::LoadPetFromDB(), Pet::resetTalents(), Unit::SetMinion(), and SummonPet().

◆ PossessSpellInitialize()

void Player::PossessSpellInitialize ( )
9498{
9499 Unit* charm = GetCharm();
9500 if (!charm)
9501 return;
9502
9503 CharmInfo* charmInfo = charm->GetCharmInfo();
9504
9505 if (!charmInfo)
9506 {
9507 LOG_ERROR("entities.player", "Player::PossessSpellInitialize(): charm ({}) has no charminfo!", charm->GetGUID().ToString());
9508 return;
9509 }
9510
9511 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 1);
9512 data << charm->GetGUID();
9513 data << uint16(0);
9514 data << uint32(0);
9515 data << uint32(0);
9516
9517 charmInfo->BuildActionBar(&data);
9518
9519 data << uint8(0); // spells count
9520 data << uint8(0); // cooldowns count
9521
9522 GetSession()->SendPacket(&data);
9523}
Unit * GetCharm() const
Definition: Unit.cpp:10611

References CharmInfo::BuildActionBar(), Unit::GetCharm(), Unit::GetCharmInfo(), Object::GetGUID(), GetSession(), LOG_ERROR, MAX_UNIT_ACTION_BAR_INDEX, WorldSession::SendPacket(), SMSG_PET_SPELLS, and ObjectGuid::ToString().

Referenced by Unit::SetCharmedBy().

◆ PrepareCharmAISpells()

void Player::PrepareCharmAISpells ( )
15364{
15365 for (int i = 0; i < NUM_CAI_SPELLS; ++i)
15366 m_charmAISpells[i] = 0;
15367
15368 uint32 damage_type[4] = {0, 0, 0, 0};
15369 uint32 periodic_damage = 0;
15370
15371 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
15372 {
15373 if (itr->second->State == PLAYERSPELL_REMOVED || !itr->second->Active || !itr->second->IsInSpec(GetActiveSpec()))
15374 continue;
15375
15376 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
15377 if (!spellInfo)
15378 continue;
15379
15380 if (!spellInfo->SpellFamilyName || spellInfo->IsPassive() || spellInfo->NeedsComboPoints() || (spellInfo->Stances && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED)))
15381 continue;
15382
15383 float cast = spellInfo->CalcCastTime() / 1000.0f;
15384 if (cast > 3.0f)
15385 continue;
15386
15387 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
15388 {
15389 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
15390 {
15391 int32 dmg = CalculateSpellDamage(this, spellInfo, i);
15392 uint8 offset = 0;
15393 if (cast)
15394 {
15395 dmg = dmg / cast;
15396 offset = 2;
15397 }
15398
15399 if ((int32)damage_type[offset] < dmg)
15400 {
15401 if (!m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] || !spellInfo->IsHighRankOf(sSpellMgr->GetSpellInfo(m_charmAISpells[SPELL_INSTANT_DAMAGE + offset])) || urand(0, 1))
15402 if (damage_type[1 + offset] < damage_type[offset])
15403 {
15405 damage_type[1 + offset] = damage_type[offset];
15406 }
15407
15408 m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] = spellInfo->Id;
15409 damage_type[offset] = dmg;
15410 }
15411 else if ((int32)damage_type[1 + offset] < dmg)
15412 {
15413 if (m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] && sSpellMgr->GetSpellInfo(m_charmAISpells[SPELL_INSTANT_DAMAGE + offset])->IsHighRankOf(spellInfo) && urand(0, 1))
15414 continue;
15415
15416 m_charmAISpells[SPELL_INSTANT_DAMAGE2 + offset] = spellInfo->Id;
15417 damage_type[1 + offset] = dmg;
15418 }
15419 break;
15420 }
15422 {
15423 m_charmAISpells[SPELL_T_CHARGE] = spellInfo->Id;
15424 break;
15425 }
15426 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_SPEED)
15427 {
15428 m_charmAISpells[SPELL_FAST_RUN] = spellInfo->Id;
15429 break;
15430 }
15431 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_SCHOOL_IMMUNITY)
15432 {
15433 m_charmAISpells[SPELL_IMMUNITY] = spellInfo->Id;
15434 break;
15435 }
15436 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE)
15437 {
15438 if( (int32)periodic_damage < CalculateSpellDamage(this, spellInfo, i) )
15439 {
15440 m_charmAISpells[SPELL_DOT_DAMAGE] = spellInfo->Id;
15441 break;
15442 }
15443 }
15444 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_STUN)
15445 {
15446 m_charmAISpells[SPELL_T_STUN] = spellInfo->Id;
15447 break;
15448 }
15449 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_ROOT || spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_FEAR)
15450 {
15452 break;
15453 }
15454 }
15455 }
15456}
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition: SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FEAR
Definition: SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition: SpellAuraDefines.h:89
@ SPELL_AURA_MOD_STUN
Definition: SpellAuraDefines.h:75
@ SPELL_ROOT_OR_FEAR
Definition: Player.h:916
@ SPELL_INSTANT_DAMAGE2
Definition: Player.h:918
@ SPELL_INSTANT_DAMAGE
Definition: Player.h:917
@ SPELL_T_CHARGE
Definition: Player.h:922
@ SPELL_DOT_DAMAGE
Definition: Player.h:921
@ SPELL_FAST_RUN
Definition: Player.h:924
@ SPELL_T_STUN
Definition: Player.h:915
@ SPELL_IMMUNITY
Definition: Player.h:923
@ SPELL_ATTR7_ATTACK_ON_CHARGE_TO_UNIT
Definition: SharedDefines.h:659
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition: SharedDefines.h:780
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition: Unit.cpp:14789
bool IsHighRankOf(SpellInfo const *spellInfo) const
Definition: SpellInfo.cpp:2580
bool NeedsComboPoints() const
Definition: SpellInfo.cpp:1265
uint32 CalcCastTime(Unit *caster=nullptr, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:2351

References SpellInfo::CalcCastTime(), Unit::CalculateSpellDamage(), SpellInfo::Effects, GetActiveSpec(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsHighRankOf(), SpellInfo::IsPassive(), m_charmAISpells, m_spells, MAX_SPELL_EFFECTS, SpellInfo::NeedsComboPoints(), NUM_CAI_SPELLS, PLAYERSPELL_REMOVED, SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED, SPELL_ATTR7_ATTACK_ON_CHARGE_TO_UNIT, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_SCHOOL_IMMUNITY, SPELL_DOT_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_FAST_RUN, SPELL_IMMUNITY, SPELL_INSTANT_DAMAGE, SPELL_INSTANT_DAMAGE2, SPELL_ROOT_OR_FEAR, SPELL_T_CHARGE, SPELL_T_STUN, SpellInfo::SpellFamilyName, sSpellMgr, SpellInfo::Stances, and urand().

Referenced by LoadFromDB().

◆ PrepareGossipMenu()

void Player::PrepareGossipMenu ( WorldObject source,
uint32  menuId = 0,
bool  showQuests = false 
)

Find localizations from database.

Find localizations from database.

33{
35 menu->ClearMenus();
36
37 menu->GetGossipMenu().SetMenuId(menuId);
38
39 GossipMenuItemsMapBounds menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId);
40
41 // if default menuId and no menu options exist for this, use options from default options
42 if (menuItemBounds.first == menuItemBounds.second && menuId == GetDefaultGossipMenuForSource(source))
43 menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(0);
44
45 uint32 npcflags = 0;
46
47 if (source->IsCreature())
48 {
49 npcflags = source->ToUnit()->GetNpcFlags();
50 if (showQuests && npcflags & UNIT_NPC_FLAG_QUESTGIVER)
51 PrepareQuestMenu(source->GetGUID());
52 }
53 else if (source->IsGameObject())
54 if (showQuests && source->ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER)
55 PrepareQuestMenu(source->GetGUID());
56
57 for (GossipMenuItemsContainer::const_iterator itr = menuItemBounds.first; itr != menuItemBounds.second; ++itr)
58 {
59 bool canTalk = true;
60 if (!sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
61 continue;
62
63 if (Creature* creature = source->ToCreature())
64 {
65 if (!(itr->second.OptionNpcFlag & npcflags))
66 continue;
67
68 switch (itr->second.OptionType)
69 {
71 canTalk = false; // added in special mode
72 break;
74 if (!isDead())
75 canTalk = false;
76 break;
78 {
79 if (!creature->isVendorWithIconSpeak())
80 {
81 VendorItemData const* vendorItems = itr->second.ActionMenuID ? sObjectMgr->GetNpcVendorItemList(itr->second.ActionMenuID) : creature->GetVendorItems();
82 if (!vendorItems || vendorItems->Empty())
83 {
84 LOG_ERROR("sql.sql", "Creature {} have UNIT_NPC_FLAG_VENDOR but have empty trading item list.", creature->GetGUID().ToString());
85 canTalk = false;
86 }
87 break;
88 }
89 break;
90 }
93 if (!(GetSpecsCount() == 1 && creature->isCanTrainingAndResetTalentsOf(this) && !(GetLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))))
94 canTalk = false;
95 break;
97 if (!creature->isCanTrainingAndResetTalentsOf(this))
98 canTalk = false;
99 break;
101 if (!GetPet() || GetPet()->getPetType() != HUNTER_PET || GetPet()->m_spells.size() <= 1 || creature->GetCreatureTemplate()->trainer_type != TRAINER_TYPE_PETS || creature->GetCreatureTemplate()->trainer_class != CLASS_HUNTER)
102 canTalk = false;
103 break;
105 if (GetSession()->SendLearnNewTaxiNode(creature))
106 return;
107 break;
109 if (!creature->isCanInteractWithBattleMaster(this, false))
110 canTalk = false;
111 break;
114 canTalk = false;
115 break;
117 canTalk = false;
118 break;
120 if (!creature->IsValidTrainerForPlayer(this))
121 {
122 canTalk = false;
123 }
124 break;
126 if (creature->isVendorWithIconSpeak())
127 {
128 VendorItemData const* vendorItems = creature->GetVendorItems();
129 if (!vendorItems || vendorItems->Empty())
130 {
131 canTalk = false;
132 }
133 }
134 break;
141 break; // no checks
143 if (!sOutdoorPvPMgr->CanTalkTo(this, creature, itr->second))
144 canTalk = false;
145 break;
146 default:
147 LOG_ERROR("sql.sql", "Creature entry {} has unknown OptionType {} for menu {}", creature->GetEntry(), itr->second.OptionType, itr->second.MenuID);
148 canTalk = false;
149 break;
150 }
151 }
152 else if (GameObject* go = source->ToGameObject())
153 {
154 switch (itr->second.OptionType)
155 {
157 if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER && go->GetGoType() != GAMEOBJECT_TYPE_GOOBER)
158 canTalk = false;
159 break;
160 default:
161 canTalk = false;
162 break;
163 }
164 }
165
166 if (canTalk)
167 {
168 // using gossip_menu_option texts by default
169 std::string strOptionText = itr->second.OptionText;
170 std::string strBoxText = itr->second.BoxText;
171 // search in broadcast_text and broadcast_text_locale
172 BroadcastText const* optionBroadcastText = sObjectMgr->GetBroadcastText(itr->second.OptionBroadcastTextID);
173 BroadcastText const* boxBroadcastText = sObjectMgr->GetBroadcastText(itr->second.BoxBroadcastTextID);
175
176 if (optionBroadcastText)
177 ObjectMgr::GetLocaleString(getGender() == GENDER_MALE ? optionBroadcastText->MaleText : optionBroadcastText->FemaleText, locale, strOptionText);
178
179 if (boxBroadcastText)
180 ObjectMgr::GetLocaleString(getGender() == GENDER_MALE ? boxBroadcastText->MaleText : boxBroadcastText->FemaleText, locale, strBoxText);
181
182 // if the language is not default and the texts weren't found, maybe they're in gossip_menu_option_locale table
183 if (locale != DEFAULT_LOCALE)
184 {
185 if (!optionBroadcastText)
186 {
188 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionID)))
189 ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, locale, strOptionText);
190 }
191
192 if (!boxBroadcastText)
193 {
195 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionID)))
196 ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, locale, strBoxText);
197 }
198 }
199
200 menu->GetGossipMenu().AddMenuItem(itr->second.OptionID, itr->second.OptionIcon, strOptionText, 0, itr->second.OptionType, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded);
201 menu->GetGossipMenu().AddGossipMenuItemData(itr->second.OptionID, itr->second.ActionMenuID, itr->second.ActionPoiID);
202 }
203 }
204
205 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && npcflags & UNIT_NPC_FLAG_FLIGHTMASTER)
207}
std::pair< GossipMenuItemsContainer::const_iterator, GossipMenuItemsContainer::const_iterator > GossipMenuItemsMapBounds
Definition: ObjectMgr.h:634
@ GOSSIP_ICON_INTERACT_1
Definition: GossipDef.h:64
@ HUNTER_PET
Definition: PetDefines.h:32
@ LANG_TOGGLE_INSTANT_FLIGHT
Definition: Language.h:1314
@ GAMEOBJECT_TYPE_GOOBER
Definition: SharedDefines.h:1570
@ TRAINER_TYPE_PETS
Definition: SharedDefines.h:2620
LocaleConstant
Definition: Common.h:65
#define DEFAULT_LOCALE
Definition: Common.h:79
AC_GAME_API char const * GetAcoreString(ChatHandler const *handler, AcoreStrings which)
Definition: ChatCommandHelpers.cpp:28
Definition: CreatureData.h:352
void SetMenuId(uint32 menu_id)
Definition: GossipDef.h:170
void AddMenuItem(int32 menuItemId, uint8 icon, std::string const &message, uint32 sender, uint32 action, std::string const &boxMessage, uint32 boxMoney, bool coded=false)
Definition: GossipDef.cpp:41
void AddGossipMenuItemData(uint32 menuItemId, uint32 gossipActionMenuId, uint32 gossipActionPoi)
Definition: GossipDef.cpp:136
void ClearMenus()
Definition: GossipDef.cpp:187
GameobjectTypes GetGoType() const
Definition: GameObject.h:204
Definition: ObjectMgr.h:435
std::vector< std::string > FemaleText
Definition: ObjectMgr.h:445
std::vector< std::string > MaleText
Definition: ObjectMgr.h:444
static std::string_view GetLocaleString(std::vector< std::string > const &data, std::size_t locale)
Definition: ObjectMgr.h:1405

References GossipMenu::AddGossipMenuItemData(), GossipMenu::AddMenuItem(), CLASS_CONTEXT_PET, CLASS_HUNTER, PlayerMenu::ClearMenus(), CONFIG_INSTANT_TAXI, CONFIG_MIN_DUALSPEC_LEVEL, DEFAULT_LOCALE, VendorItemData::Empty(), BroadcastText::FemaleText, GAMEOBJECT_TYPE_GOOBER, GAMEOBJECT_TYPE_QUESTGIVER, GENDER_MALE, GetDefaultGossipMenuForSource(), Unit::getGender(), PlayerMenu::GetGossipMenu(), GameObject::GetGoType(), Object::GetGUID(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), Unit::GetNpcFlags(), GetPet(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), GetSpecsCount(), GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT, GOSSIP_ICON_INTERACT_1, GOSSIP_OPTION_ARMORER, GOSSIP_OPTION_AUCTIONEER, GOSSIP_OPTION_BANKER, GOSSIP_OPTION_BATTLEFIELD, GOSSIP_OPTION_DUALSPEC_INFO, GOSSIP_OPTION_GOSSIP, GOSSIP_OPTION_INNKEEPER, GOSSIP_OPTION_LEARNDUALSPEC, GOSSIP_OPTION_OUTDOORPVP, GOSSIP_OPTION_PETITIONER, GOSSIP_OPTION_QUESTGIVER, GOSSIP_OPTION_SPIRITGUIDE, GOSSIP_OPTION_SPIRITHEALER, GOSSIP_OPTION_STABLEPET, GOSSIP_OPTION_TABARDDESIGNER, GOSSIP_OPTION_TAXIVENDOR, GOSSIP_OPTION_TRAINER, GOSSIP_OPTION_UNLEARNPETTALENTS, GOSSIP_OPTION_UNLEARNTALENTS, GOSSIP_OPTION_VENDOR, HUNTER_PET, IsClass(), Object::IsCreature(), Unit::isDead(), Object::IsGameObject(), LANG_TOGGLE_INSTANT_FLIGHT, LOG_ERROR, m_spells, MAKE_PAIR32(), BroadcastText::MaleText, PlayerTalkClass, PrepareQuestMenu(), sConditionMgr, GossipMenu::SetMenuId(), sObjectMgr, sOutdoorPvPMgr, sWorld, Object::ToCreature(), Object::ToGameObject(), Object::ToUnit(), TRAINER_TYPE_PETS, UNIT_NPC_FLAG_FLIGHTMASTER, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), npc_thrall_old_hillsbrad::OnGossipHello(), brann_bronzebeard::OnGossipHello(), go_apexis_relic::OnGossipHello(), OnGossipSelect(), Spell::SendLoot(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and GameObject::Use().

◆ PrepareQuestMenu()

void Player::PrepareQuestMenu ( ObjectGuid  guid)
40{
41 QuestRelationBounds objectQR;
42 QuestRelationBounds objectQIR;
43
44 // pets also can have quests
46 if (creature)
47 {
48 objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
49 objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry());
50 }
51 else
52 {
53 //we should obtain map pointer from GetMap() in 99% of cases. Special case
54 //only for quests which cast teleport spells on player
56 ASSERT(_map);
57 GameObject* pGameObject = _map->GetGameObject(guid);
58 if (pGameObject)
59 {
60 objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry());
61 objectQIR = sObjectMgr->GetGOQuestInvolvedRelationBounds(pGameObject->GetEntry());
62 }
63 else
64 return;
65 }
66
68 qm.ClearMenu();
69
70 for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i)
71 {
72 uint32 quest_id = i->second;
73 QuestStatus status = GetQuestStatus(quest_id);
74 if (status == QUEST_STATUS_COMPLETE)
75 qm.AddMenuItem(quest_id, 4);
76 else if (status == QUEST_STATUS_INCOMPLETE)
77 qm.AddMenuItem(quest_id, 4);
78 //else if (status == QUEST_STATUS_AVAILABLE)
79 // qm.AddMenuItem(quest_id, 2);
80 }
81
82 for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i)
83 {
84 uint32 quest_id = i->second;
85 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
86 if (!quest)
87 continue;
88
89 if (!CanTakeQuest(quest, false))
90 continue;
91
92 if (quest->IsAutoComplete() && (!quest->IsRepeatable() || quest->IsDaily() || quest->IsWeekly() || quest->IsMonthly()))
93 qm.AddMenuItem(quest_id, 0);
94 else if (quest->IsAutoComplete())
95 qm.AddMenuItem(quest_id, 4);
96 else if (GetQuestStatus(quest_id) == QUEST_STATUS_NONE)
97 qm.AddMenuItem(quest_id, 2);
98 }
99}
Definition: GossipDef.h:228
void ClearMenu()
Definition: GossipDef.cpp:310
void AddMenuItem(uint32 QuestId, uint8 Icon)
Definition: GossipDef.cpp:286
QuestMenu & GetQuestMenu()
Definition: GossipDef.h:264

References QuestMenu::AddMenuItem(), ASSERT, CanTakeQuest(), QuestMenu::ClearMenu(), ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), Map::GetGameObject(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), PlayerMenu::GetQuestMenu(), GetQuestStatus(), Quest::IsAutoComplete(), Quest::IsDaily(), Object::IsInWorld(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), PlayerTalkClass, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, sMapMgr, and sObjectMgr.

Referenced by npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), npc_sayge::OnGossipHello(), go_fel_crystalforge::OnGossipHello(), go_bashir_crystalforge::OnGossipHello(), OnGossipSelect(), PrepareGossipMenu(), and npc_maredis_firestar::npc_maredis_firestarAI::sGossipSelect().

◆ PrettyPrintRequirementsAchievementsList()

void Player::PrettyPrintRequirementsAchievementsList ( const std::vector< const ProgressionRequirement * > &  missingAchievements) const
6650{
6652 for (const ProgressionRequirement* missingReq : missingAchievements)
6653 {
6654 AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(missingReq->id);
6655 if (!achievementEntry)
6656 {
6657 continue;
6658 }
6659
6660 std::string name = achievementEntry->name[sObjectMgr->GetDBCLocaleIndex()];
6661
6662 std::stringstream stream;
6663 stream << "|cffff7c0a|Hachievement:";
6664 stream << missingReq->id;
6665 stream << ":";
6666 stream << GetGUID().ToString();
6667 stream << ":0:0:0:0:0:0:0:0|h[";
6668 stream << name;
6669 stream << "]|h|r";
6670
6671 if (missingReq->note.empty())
6672 {
6673 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6674 }
6675 else
6676 {
6677 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6678 }
6679 }
6680}
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
@ LANG_ACCESS_REQUIREMENT_NOTE
Definition: Language.h:845
Definition: Player.h:933
Definition: DBCStructure.h:40
std::array< char const *, 16 > name
Definition: DBCStructure.h:45

References Object::GetGUID(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), LANG_ACCESS_REQUIREMENT_NOTE, AchievementEntry::name, ChatHandler::PSendSysMessage(), sAchievementStore, sObjectMgr, and ObjectGuid::ToString().

Referenced by Satisfy().

◆ PrettyPrintRequirementsItemsList()

void Player::PrettyPrintRequirementsItemsList ( const std::vector< const ProgressionRequirement * > &  missingItems) const
6683{
6685 for (const ProgressionRequirement* missingReq : missingItems)
6686 {
6687 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(missingReq->id);
6688 if (!itemTemplate)
6689 {
6690 continue;
6691 }
6692
6693 //Get the localised name
6694 std::string name = itemTemplate->Name1;
6695 if (ItemLocale const* il = sObjectMgr->GetItemLocale(itemTemplate->ItemId))
6696 {
6697 ObjectMgr::GetLocaleString(il->Name, loc_idx, name);
6698 }
6699
6700 std::stringstream stream;
6701 stream << "|c";
6702 stream << std::hex << ItemQualityColors[itemTemplate->Quality] << std::dec;
6703 stream << "|Hitem:";
6704 stream << itemTemplate->ItemId;
6705 stream << ":0:0:0:0:0:0:0:0:0|h[";
6706 stream << name;
6707 stream << "]|h|r";
6708
6709 if (missingReq->note.empty())
6710 {
6711 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6712 }
6713 else
6714 {
6715 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6716 }
6717 }
6718}
const uint32 ItemQualityColors[MAX_ITEM_QUALITY]
Definition: SharedDefines.h:353
std::string Name1
Definition: ItemTemplate.h:624
Definition: ItemTemplate.h:838

References ObjectMgr::GetLocaleString(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), ItemTemplate::ItemId, ItemQualityColors, LANG_ACCESS_REQUIREMENT_NOTE, ItemTemplate::Name1, ChatHandler::PSendSysMessage(), ItemTemplate::Quality, and sObjectMgr.

Referenced by Satisfy().

◆ PrettyPrintRequirementsQuestList()

void Player::PrettyPrintRequirementsQuestList ( const std::vector< const ProgressionRequirement * > &  missingQuests) const
6613{
6615 for (const ProgressionRequirement* missingReq : missingQuests)
6616 {
6617 Quest const* questTemplate = sObjectMgr->GetQuestTemplate(missingReq->id);
6618 if (!questTemplate)
6619 {
6620 continue;
6621 }
6622
6623 std::string questTitle = questTemplate->GetTitle();
6624 if (QuestLocale const* questLocale = sObjectMgr->GetQuestLocale(questTemplate->GetQuestId()))
6625 {
6626 ObjectMgr::GetLocaleString(questLocale->Title, loc_idx, questTitle);
6627 }
6628
6629 std::stringstream stream;
6630 stream << "|cffff7c0a|Hquest:";
6631 stream << questTemplate->GetQuestId();
6632 stream << ":";
6633 stream << questTemplate->GetQuestLevel();
6634 stream << "|h[";
6635 stream << questTitle;
6636 stream << "]|h|r";
6637
6638 if (missingReq->note.empty())
6639 {
6640 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6641 }
6642 else
6643 {
6644 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6645 }
6646 }
6647}
Definition: QuestDef.h:182
int32 GetQuestLevel() const
Definition: QuestDef.h:232
std::string const & GetTitle() const
Definition: QuestDef.h:260

References ObjectMgr::GetLocaleString(), Quest::GetQuestId(), Quest::GetQuestLevel(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetTitle(), LANG_ACCESS_REQUIREMENT_NOTE, ChatHandler::PSendSysMessage(), and sObjectMgr.

Referenced by Satisfy().

◆ ProcessDelayedOperations()

void Player::ProcessDelayedOperations ( )
1615{
1616 if (m_DelayedOperations == 0)
1617 return;
1618
1620 {
1621 ResurrectPlayer(0.0f, false);
1622
1625 else
1626 SetFullHealth();
1627
1630 else
1632
1633 SetPower(POWER_RAGE, 0);
1635
1637 }
1638
1640 SaveToDB(false, false);
1641
1643 {
1644 Aura* aura = GetAura(26013);
1645 if (!aura || aura->GetDuration() <= 900000)
1646 CastSpell(this, 26013, true);
1647 }
1648
1650 {
1652 {
1653 // xinef: remove shapeshift auras
1655 {
1657 }
1660 }
1661 }
1662
1664 {
1666 {
1671 }
1672 }
1673
1675 {
1676 if (Group* g = GetGroup())
1677 g->SendUpdateToPlayer(GetGUID());
1678 }
1679
1681 {
1682 if (Vehicle* vehicle = GetVehicle())
1683 {
1684 SeatMap::iterator itr = vehicle->GetSeatIteratorForPassenger(this);
1685 if (itr != vehicle->Seats.end())
1686 if (Unit* base = vehicle->GetBase())
1687 {
1688 ExitVehicle();
1689 base->HandleSpellClick(this, itr->first);
1690 }
1691 }
1692 }
1693
1694 //we have executed ALL delayed ops, so clear the flag
1696}
@ DELAYED_BG_GROUP_RESTORE
Flag to restore group state after teleport from BG.
Definition: Player.h:908
@ DELAYED_SAVE_PLAYER
Definition: Player.h:903
@ DELAYED_BG_MOUNT_RESTORE
Flag to restore mount state after teleport from BG.
Definition: Player.h:906
@ DELAYED_VEHICLE_TELEPORT
Definition: Player.h:909
@ DELAYED_BG_TAXI_RESTORE
Flag to restore taxi state after teleport from BG.
Definition: Player.h:907
@ DELAYED_SPELL_CAST_DESERTER
Definition: Player.h:905
@ DELAYED_RESURRECT_PLAYER
Definition: Player.h:904
void SaveToDB(bool create, bool logout)
Definition: PlayerStorage.cpp:7064
uint32 m_resurrectMana
Definition: Player.h:2807
void ContinueTaxiFlight()
Definition: Player.cpp:10398
uint32 m_resurrectHealth
Definition: Player.h:2807
Aura * AddAura(uint32 spellId, Unit *target)
Definition: Unit.cpp:18791
Definition: Vehicle.h:28

References Unit::AddAura(), PlayerTaxi::AddTaxiDestination(), Unit::CastSpell(), EntryPointData::ClearTaxiPath(), ContinueTaxiFlight(), DELAYED_BG_GROUP_RESTORE, DELAYED_BG_MOUNT_RESTORE, DELAYED_BG_TAXI_RESTORE, DELAYED_RESURRECT_PLAYER, DELAYED_SAVE_PLAYER, DELAYED_SPELL_CAST_DESERTER, DELAYED_VEHICLE_TELEPORT, Unit::ExitVehicle(), Unit::GetAura(), Aura::GetDuration(), GetGroup(), Object::GetGUID(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetVehicle(), EntryPointData::HasTaxiPath(), Unit::IsInDisallowedMountForm(), m_DelayedOperations, m_entryPointData, m_resurrectHealth, m_resurrectMana, m_taxi, EntryPointData::mountSpell, POWER_ENERGY, POWER_MANA, POWER_RAGE, Unit::RemoveAurasByType(), ResurrectPlayer(), SaveToDB(), Unit::SetFullHealth(), Unit::SetHealth(), Unit::SetPower(), SpawnCorpseBones(), SPELL_AURA_MOD_SHAPESHIFT, and EntryPointData::taxiPath.

Referenced by WorldSession::HandleMoveTeleportAck(), and WorldSession::HandleMoveWorldportAck().

◆ ProcessTerrainStatusUpdate()

void Player::ProcessTerrainStatusUpdate ( )
overridevirtual

Reimplemented from Unit.

2202{
2203 // process liquid auras using generic unit code
2205
2206 LiquidData const& liquidData = GetLiquidData();
2207
2208 // player specific logic for mirror timers
2209 if (liquidData.Status != LIQUID_MAP_NO_WATER)
2210 {
2211 // Breath bar state (under water in any liquid type)
2212 if ((liquidData.Flags & MAP_ALL_LIQUIDS) != 0)
2213 {
2214 if ((liquidData.Status & LIQUID_MAP_UNDER_WATER) != 0)
2216 else
2217 m_MirrorTimerFlags &= ~UNDERWATER_INWATER;
2218 }
2219
2220 // Fatigue bar state (if not on flight path or transport)
2221 if ((liquidData.Flags & MAP_LIQUID_TYPE_DARK_WATER) && !IsInFlight() && !GetTransport())
2222 {
2223 // Exclude also uncontrollable vehicles
2224 Vehicle* vehicle = GetVehicle();
2225 VehicleSeatEntry const* vehicleSeat = vehicle ? vehicle->GetSeatForPassenger(this) : nullptr;
2226 if (!vehicleSeat || vehicleSeat->CanControl())
2228 else
2229 m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
2230 }
2231 else
2232 m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
2233
2234 // Lava state (any contact)
2235 if (liquidData.Flags & MAP_LIQUID_TYPE_MAGMA)
2236 {
2237 if (liquidData.Status & MAP_LIQUID_STATUS_IN_CONTACT)
2239 else
2240 m_MirrorTimerFlags &= ~UNDERWATER_INLAVA;
2241 }
2242
2243 // Slime state (any contact)
2244 if (liquidData.Flags & MAP_LIQUID_TYPE_SLIME)
2245 {
2246 if (liquidData.Status & MAP_LIQUID_STATUS_IN_CONTACT)
2248 else
2249 m_MirrorTimerFlags &= ~UNDERWATER_INSLIME;
2250 }
2251 }
2252 else
2254}
#define MAP_LIQUID_TYPE_MAGMA
Definition: Map.h:157
@ LIQUID_MAP_UNDER_WATER
Definition: Map.h:148
@ LIQUID_MAP_NO_WATER
Definition: Map.h:144
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition: Map.h:152
#define MAP_LIQUID_TYPE_DARK_WATER
Definition: Map.h:162
#define MAP_LIQUID_TYPE_SLIME
Definition: Map.h:158
#define MAP_ALL_LIQUIDS
Definition: Map.h:160
@ UNDERWATER_INSLIME
Definition: Player.h:103
LiquidData const & GetLiquidData() const
Definition: Object.cpp:3174
virtual void ProcessTerrainStatusUpdate()
Definition: Unit.cpp:4225
VehicleSeatEntry const * GetSeatForPassenger(Unit const *passenger)
Definition: Vehicle.cpp:580
Definition: Map.h:171
uint32 Flags
Definition: Map.h:175
LiquidStatus Status
Definition: Map.h:178
Definition: DBCStructure.h:2064
bool CanControl() const
Definition: DBCStructure.h:2127

References VehicleSeatEntry::CanControl(), LiquidData::Flags, WorldObject::GetLiquidData(), Vehicle::GetSeatForPassenger(), WorldObject::GetTransport(), Unit::GetVehicle(), Unit::IsInFlight(), LIQUID_MAP_NO_WATER, LIQUID_MAP_UNDER_WATER, m_MirrorTimerFlags, MAP_ALL_LIQUIDS, MAP_LIQUID_STATUS_IN_CONTACT, MAP_LIQUID_TYPE_DARK_WATER, MAP_LIQUID_TYPE_MAGMA, MAP_LIQUID_TYPE_SLIME, Unit::ProcessTerrainStatusUpdate(), LiquidData::Status, UNDERWATER_INDARKWATER, UNDERWATER_INLAVA, UNDERWATER_INSLIME, and UNDERWATER_INWATER.

◆ ProhibitSpellSchool()

void Player::ProhibitSpellSchool ( SpellSchoolMask  idSchoolMask,
uint32  unTimeMs 
)
overridevirtual

Reimplemented from Unit.

10494{
10495 PacketCooldowns cooldowns;
10496 WorldPacket data;
10497
10498 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
10499 {
10500 if (itr->second->State == PLAYERSPELL_REMOVED)
10501 continue;
10502 uint32 unSpellId = itr->first;
10503 SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(unSpellId);
10504
10505 // Not send cooldown for this spells
10506 if (spellInfo->IsCooldownStartedOnEvent())
10507 continue;
10508
10510 continue;
10511
10512 if ((idSchoolMask & spellInfo->GetSchoolMask()) && GetSpellCooldownDelay(unSpellId) < unTimeMs)
10513 {
10514 cooldowns[unSpellId] = unTimeMs;
10515 AddSpellCooldown(unSpellId, 0, unTimeMs, true);
10516 }
10517 }
10518
10519 if (!cooldowns.empty())
10520 {
10522 GetSession()->SendPacket(&data);
10523 }
10524}
@ SPELL_PREVENTION_TYPE_SILENCE
Definition: SharedDefines.h:1554
uint32 GetSpellCooldownDelay(uint32 spell_id) const
Definition: Player.cpp:16295
uint32 PreventionType
Definition: SpellInfo.h:390
bool IsCooldownStartedOnEvent() const
Definition: SpellInfo.cpp:1211
SpellSchoolMask GetSchoolMask() const
Definition: SpellInfo.cpp:1986

References AddSpellCooldown(), Unit::BuildCooldownPacket(), SpellInfo::GetSchoolMask(), GetSession(), GetSpellCooldownDelay(), SpellInfo::IsCooldownStartedOnEvent(), m_spells, PLAYERSPELL_REMOVED, SpellInfo::PreventionType, WorldSession::SendPacket(), SPELL_COOLDOWN_FLAG_NONE, SPELL_PREVENTION_TYPE_SILENCE, and sSpellMgr.

◆ QuickEquipItem()

void Player::QuickEquipItem ( uint16  pos,
Item pItem 
)
2851{
2852 if (pItem)
2853 {
2855 AddItemDurations(pItem);
2856
2857 uint8 slot = pos & 255;
2858 VisualizeItem(slot, pItem);
2859
2860 if (IsInWorld())
2861 {
2862 pItem->AddToWorld();
2863 pItem->SendUpdateToPlayer(this);
2864 }
2865
2868
2869 sScriptMgr->OnEquip(this, pItem, (pos >> 8), slot, true);
2870 }
2871}

References ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, AddEnchantmentDurations(), AddItemDurations(), Object::AddToWorld(), Object::GetEntry(), Object::IsInWorld(), Object::SendUpdateToPlayer(), sScriptMgr, UpdateAchievementCriteria(), and VisualizeItem().

Referenced by _LoadInventory().

◆ RecalculateRating()

void Player::RecalculateRating ( CombatRating  cr)
inline
1939{ ApplyRatingMod(cr, 0, true);}

References ApplyRatingMod().

Referenced by DestroyItem(), EquipItem(), RemoveItem(), and UpdateAllStats().

◆ RefundItem()

void Player::RefundItem ( Item item)
private

Already checked before

15542{
15543 if (!item->IsRefundable())
15544 {
15545 LOG_DEBUG("entities.player.items", "Item refund: item not refundable!");
15546 return;
15547 }
15548
15549 if (item->IsRefundExpired()) // item refund has expired
15550 {
15551 item->SetNotRefundable(this);
15553 data << item->GetGUID(); // Guid
15554 data << uint32(10); // Error!
15555 GetSession()->SendPacket(&data);
15556 return;
15557 }
15558
15559 if (GetGUID().GetCounter() != item->GetRefundRecipient()) // Formerly refundable item got traded
15560 {
15561 LOG_DEBUG("entities.player.items", "Item refund: item was traded!");
15562 item->SetNotRefundable(this);
15563 return;
15564 }
15565
15566 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(item->GetPaidExtendedCost());
15567 if (!iece)
15568 {
15569 LOG_DEBUG("entities.player.items", "Item refund: cannot find extendedcost data.");
15570 return;
15571 }
15572
15573 bool store_error = false;
15574 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
15575 {
15576 uint32 count = iece->reqitemcount[i];
15577 uint32 itemid = iece->reqitem[i];
15578
15579 if (count && itemid)
15580 {
15581 ItemPosCountVec dest;
15582 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count);
15583 if (msg != EQUIP_ERR_OK)
15584 {
15585 store_error = true;
15586 break;
15587 }
15588 }
15589 }
15590
15591 if (store_error)
15592 {
15594 data << item->GetGUID(); // Guid
15595 data << uint32(10); // Error!
15596 GetSession()->SendPacket(&data);
15597 return;
15598 }
15599
15600 WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8 + 4 + 4 + 4 + 4 + 4 * 4 + 4 * 4);
15601 data << item->GetGUID(); // item guid
15602 data << uint32(0); // 0, or error code
15603 data << uint32(item->GetPaidMoney()); // money cost
15604 data << uint32(iece->reqhonorpoints); // honor point cost
15605 data << uint32(iece->reqarenapoints); // arena point cost
15606 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
15607 {
15608 data << uint32(iece->reqitem[i]);
15609 data << uint32(iece->reqitemcount[i]);
15610 }
15611 GetSession()->SendPacket(&data);
15612
15613 uint32 moneyRefund = item->GetPaidMoney(); // item-> will be invalidated in DestroyItem
15614
15615 // Save all relevant data to DB to prevent desynchronisation exploits
15616 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15617
15618 // Delete any references to the refund data
15619 item->SetNotRefundable(this, true, &trans);
15620
15621 // Destroy item
15622 DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
15623
15624 // Grant back extendedcost items
15625 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
15626 {
15627 uint32 count = iece->reqitemcount[i];
15628 uint32 itemid = iece->reqitem[i];
15629 if (count && itemid)
15630 {
15631 ItemPosCountVec dest;
15632 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count);
15633 ASSERT(msg == EQUIP_ERR_OK);
15634 Item* it = StoreNewItem(dest, itemid, true);
15635 SendNewItem(it, count, true, false, true);
15636 }
15637 }
15638
15639 // Grant back money
15640 if (moneyRefund)
15641 ModifyMoney(moneyRefund); // Saved in SaveInventoryAndGoldToDB
15642
15643 // Grant back Honor points
15644 if (uint32 honorRefund = iece->reqhonorpoints)
15645 ModifyHonorPoints(honorRefund, trans);
15646
15647 // Grant back Arena points
15648 if (uint32 arenaRefund = iece->reqarenapoints)
15649 ModifyArenaPoints(arenaRefund, trans);
15650
15652
15653 CharacterDatabase.CommitTransaction(trans);
15654}
@ SMSG_ITEM_REFUND_RESULT
Definition: Opcodes.h:1235
uint32 GetPaidExtendedCost()
Definition: Item.h:349
uint32 GetPaidMoney()
Definition: Item.h:348
ObjectGuid::LowType GetRefundRecipient()
Definition: Item.h:347
bool IsRefundExpired()
Definition: Item.cpp:1254
void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7135

References ASSERT, CanStoreNewItem(), CharacterDatabase, DestroyItem(), EQUIP_ERR_OK, Item::GetBagSlot(), Object::GetGUID(), Item::GetPaidExtendedCost(), Item::GetPaidMoney(), Item::GetRefundRecipient(), GetSession(), Item::GetSlot(), Item::IsRefundable(), Item::IsRefundExpired(), LOG_DEBUG, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, ModifyArenaPoints(), ModifyHonorPoints(), ModifyMoney(), NULL_BAG, NULL_SLOT, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, SaveInventoryAndGoldToDB(), SendNewItem(), WorldSession::SendPacket(), Item::SetNotRefundable(), sItemExtendedCostStore, SMSG_ITEM_REFUND_RESULT, and StoreNewItem().

Referenced by WorldSession::HandleItemRefund().

◆ Regenerate()

void Player::Regenerate ( Powers  power)
Todo:
: possible use of miscvalueb instead of amount
1836{
1837 uint32 maxValue = GetMaxPower(power);
1838 if (!maxValue)
1839 return;
1840
1841 //If .cheat power is on always have the max power
1843 {
1844 if (m_regenTimerCount >= 2000)
1845 {
1846 //Set the value to 0 first then set it to max to force resend of packet as for range clients keeps removing rage
1847 if (power == POWER_RAGE || power == POWER_RUNIC_POWER)
1848 {
1849 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, 0);
1850 }
1851
1852 SetPower(power, maxValue);
1853 return;
1854 }
1855 }
1856
1857 uint32 curValue = GetPower(power);
1858
1861 return;
1862
1863 float addvalue = 0.0f;
1864
1865 switch (power)
1866 {
1867 case POWER_MANA:
1868 {
1869 bool recentCast = IsUnderLastManaUseEffect();
1870 float ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA);
1871
1872 if (sWorld->getBoolConfig(CONFIG_LOW_LEVEL_REGEN_BOOST) && GetLevel() < 15)
1873 ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA) * (2.066f - (GetLevel() * 0.066f));
1874
1875 if (recentCast) // Trinity Updates Mana in intervals of 2s, which is correct
1876 addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
1877 else
1878 addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
1879 }
1880 break;
1881 case POWER_RAGE: // Regenerate rage
1882 {
1884 {
1885 float RageDecreaseRate = sWorld->getRate(RATE_POWER_RAGE_LOSS);
1886 addvalue += -20 * RageDecreaseRate; // 2 rage by tick (= 2 seconds => 1 rage/sec)
1887 }
1888 }
1889 break;
1890 case POWER_ENERGY: // Regenerate energy (rogue)
1891 addvalue += 0.01f * m_regenTimer * sWorld->getRate(RATE_POWER_ENERGY);
1892 break;
1893 case POWER_RUNIC_POWER:
1894 {
1896 {
1897 float RunicPowerDecreaseRate = sWorld->getRate(RATE_POWER_RUNICPOWER_LOSS);
1898 addvalue += -30 * RunicPowerDecreaseRate; // 3 RunicPower by tick
1899 }
1900 }
1901 break;
1902 case POWER_RUNE:
1903 case POWER_FOCUS:
1904 case POWER_HAPPINESS:
1905 break;
1906 case POWER_HEALTH:
1907 return;
1908 default:
1909 break;
1910 }
1911
1912 // Mana regen calculated in Player::UpdateManaRegen()
1913 if (power != POWER_MANA)
1914 {
1916 for (AuraEffectList::const_iterator i = ModPowerRegenPCTAuras.begin(); i != ModPowerRegenPCTAuras.end(); ++i)
1917 if (Powers((*i)->GetMiscValue()) == power)
1918 AddPct(addvalue, (*i)->GetAmount());
1919
1920 // Butchery requires combat for this effect
1921 if (power != POWER_RUNIC_POWER || IsInCombat())
1923 }
1924
1925 if (addvalue < 0.0f)
1926 {
1927 if (curValue == 0)
1928 return;
1929 }
1930 else if (addvalue > 0.0f)
1931 {
1932 if (curValue == maxValue)
1933 return;
1934 }
1935 else
1936 return;
1937
1938 addvalue += m_powerFraction[power];
1939 uint32 integerValue = uint32(std::fabs(addvalue));
1940
1941 bool forcedUpdate = false;
1942 if (addvalue < 0.0f)
1943 {
1944 if (curValue > integerValue)
1945 {
1946 curValue -= integerValue;
1947 m_powerFraction[power] = addvalue + integerValue;
1948 }
1949 else
1950 {
1951 curValue = 0;
1952 m_powerFraction[power] = 0;
1953 forcedUpdate = true;
1954 }
1955 }
1956 else
1957 {
1958 curValue += integerValue;
1959
1960 if (curValue >= maxValue)
1961 {
1962 curValue = maxValue;
1963 m_powerFraction[power] = 0;
1964 forcedUpdate = true;
1965 }
1966 else
1967 {
1968 m_powerFraction[power] = addvalue - integerValue;
1969 }
1970 }
1971
1972 if (m_regenTimerCount >= 2000 || forcedUpdate)
1973 {
1974 SetPower(power, curValue, true, true);
1975 }
1976 else
1977 {
1978 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, curValue);
1979 }
1980}
@ SPELL_AURA_INTERRUPT_REGEN
Definition: SpellAuraDefines.h:157
@ SPELL_AURA_MOD_POWER_REGEN
Definition: SpellAuraDefines.h:148
@ SPELL_AURA_PREVENT_REGENERATE_POWER
Definition: SpellAuraDefines.h:357
@ UNIT_FIELD_POWER1
Definition: UpdateFields.h:97
@ UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER
Definition: UpdateFields.h:113
@ UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER
Definition: UpdateFields.h:112
@ CHEAT_POWER
Definition: Player.h:1002
@ CONFIG_LOW_LEVEL_REGEN_BOOST
Definition: IWorld.h:184
@ RATE_POWER_RAGE_LOSS
Definition: IWorld.h:434
@ RATE_POWER_RUNICPOWER_LOSS
Definition: IWorld.h:436
@ RATE_POWER_ENERGY
Definition: IWorld.h:438
@ RATE_POWER_MANA
Definition: IWorld.h:432
@ POWER_HEALTH
Definition: SharedDefines.h:278
void UpdateUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:663
bool IsUnderLastManaUseEffect() const
Definition: Unit.cpp:17182
bool HasAuraTypeWithMiscvalue(AuraType auratype, int32 miscvalue) const
Definition: Unit.cpp:5683

References AddPct(), CHEAT_POWER, CONFIG_LOW_LEVEL_REGEN_BOOST, Unit::GetAuraEffectsByType(), GetCommandStatus(), Object::GetFloatValue(), Unit::GetLevel(), Unit::GetMaxPower(), Unit::GetPower(), Unit::GetTotalAuraModifierByMiscValue(), Unit::HasAuraType(), Unit::HasAuraTypeWithMiscvalue(), IN_MILLISECONDS, Unit::IsInCombat(), Unit::IsUnderLastManaUseEffect(), m_powerFraction, Unit::m_regenTimer, m_regenTimerCount, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, RATE_POWER_ENERGY, RATE_POWER_MANA, RATE_POWER_RAGE_LOSS, RATE_POWER_RUNICPOWER_LOSS, Unit::SetPower(), SPELL_AURA_INTERRUPT_REGEN, SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELL_AURA_PREVENT_REGENERATE_POWER, sWorld, UNIT_FIELD_POWER1, UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, and Object::UpdateUInt32Value().

Referenced by RegenerateAll().

◆ RegenerateAll()

void Player::RegenerateAll ( )
1753{
1754 //if (m_regenTimer <= 500)
1755 // return;
1756
1759
1761
1763
1764 // Runes act as cooldowns, and they don't need to send any data
1766 for (uint8 i = 0; i < MAX_RUNES; ++i)
1767 {
1768 // xinef: implement grace
1769 if (int32 cd = GetRuneCooldown(i))
1770 {
1771 SetRuneCooldown(i, (cd > m_regenTimer) ? cd - m_regenTimer : 0);
1772 // start grace counter, player must be in combat and rune has to go off cooldown
1773 if (IsInCombat() && cd <= m_regenTimer)
1774 SetGracePeriod(i, m_regenTimer - cd + 1); // added 1 because m_regenTimer-cd can be equal 0
1775 }
1776 // xinef: if grace is started, increase it but no more than cap
1777 else if (uint32 grace = GetGracePeriod(i))
1778 {
1779 if (grace < RUNE_GRACE_PERIOD)
1780 SetGracePeriod(i, std::min<uint32>(grace + m_regenTimer, RUNE_GRACE_PERIOD));
1781 }
1782 }
1783
1784 if (m_regenTimerCount >= 2000)
1785 {
1786 // Not in combat or they have regeneration
1790 {
1792 }
1793
1797
1798 m_regenTimerCount -= 2000;
1799 }
1800
1801 m_regenTimer = 0;
1802
1803 // Handles the emotes for drinking and eating.
1804 // According to sniffs there is a background timer going on that repeats independed from the time window where the aura applies.
1805 // That's why we dont need to reset the timer on apply. In sniffs I have seen that the first call for the spell visual is totally random, then after
1806 // 5 seconds over and over again which confirms my theory that we have a independed timer.
1807 if (m_foodEmoteTimerCount >= 5000)
1808 {
1809 std::vector<AuraEffect*> auraList;
1812
1813 auraList.reserve(ModRegenAuras.size() + ModPowerRegenAuras.size());
1814 auraList.insert(auraList.end(), ModRegenAuras.begin(), ModRegenAuras.end());
1815 auraList.insert(auraList.end(), ModPowerRegenAuras.begin(), ModPowerRegenAuras.end());
1816
1817 for (auto itr = auraList.begin(); itr != auraList.end(); ++itr)
1818 {
1819 // Food emote comes above drinking emote if we have to decide (mage regen food for example)
1820 if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
1821 {
1823 break;
1824 }
1825 else if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_POWER_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
1826 {
1828 break;
1829 }
1830 }
1831 m_foodEmoteTimerCount -= 5000;
1832 }
1833}
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition: SpellDefines.h:62
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition: SpellAuraDefines.h:179
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition: SpellAuraDefines.h:224
@ SPELL_AURA_MOD_REGEN
Definition: SpellAuraDefines.h:147
@ RUNE_GRACE_PERIOD
Definition: Player.h:403
@ SPELL_VISUAL_KIT_DRINK
Definition: SharedDefines.h:350
@ SPELL_VISUAL_KIT_FOOD
Definition: SharedDefines.h:349
void Regenerate(Powers power)
Definition: Player.cpp:1835
void RegenerateHealth()
Definition: Player.cpp:1982
bool IsPolymorphed() const
Definition: Unit.cpp:16680
void SendPlaySpellVisual(uint32 id)
Definition: Unit.cpp:18839

References AURA_INTERRUPT_FLAG_NOT_SEATED, CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, Unit::GetAuraEffectsByType(), GetGracePeriod(), GetRuneCooldown(), Unit::HasAuraType(), IsClass(), Unit::IsInCombat(), Unit::IsPolymorphed(), m_baseHealthRegen, m_foodEmoteTimerCount, Unit::m_regenTimer, m_regenTimerCount, MAX_RUNES, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, Regenerate(), RegenerateHealth(), RUNE_GRACE_PERIOD, Unit::SendPlaySpellVisual(), SetGracePeriod(), SetRuneCooldown(), SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT, SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_REGEN, SPELL_AURA_MOD_REGEN_DURING_COMBAT, SPELL_VISUAL_KIT_DRINK, and SPELL_VISUAL_KIT_FOOD.

Referenced by Update().

◆ RegenerateHealth()

void Player::RegenerateHealth ( )
1983{
1984 uint32 curValue = GetHealth();
1985 uint32 maxValue = GetMaxHealth();
1986
1987 if (curValue >= maxValue)
1988 return;
1989
1990 float HealthIncreaseRate = sWorld->getRate(RATE_HEALTH);
1991
1992 if (sWorld->getBoolConfig(CONFIG_LOW_LEVEL_REGEN_BOOST) && GetLevel() < 15)
1993 HealthIncreaseRate = sWorld->getRate(RATE_HEALTH) * (2.066f - (GetLevel() * 0.066f));
1994
1995 float addvalue = 0.0f;
1996
1997 // polymorphed case
1998 if (IsPolymorphed())
1999 addvalue = (float)GetMaxHealth() / 3;
2000 // normal regen case (maybe partly in combat case)
2002 {
2003 addvalue = OCTRegenHPPerSpirit() * HealthIncreaseRate;
2004
2005 if (!IsStandState())
2006 {
2007 addvalue *= 1.33f;
2008 }
2009
2011 for (AuraEffectList::const_iterator i = mModHealthRegenPct.begin(); i != mModHealthRegenPct.end(); ++i)
2012 {
2013 AddPct(addvalue, (*i)->GetAmount());
2014 }
2015
2016 if (!IsInCombat())
2017 {
2019 }
2021 {
2023 }
2024 }
2025
2026 // always regeneration bonus (including combat)
2028 addvalue += m_baseHealthRegen / 2.5f;
2029
2030 if (addvalue < 0)
2031 addvalue = 0;
2032
2033 ModifyHealth(int32(addvalue));
2034}
@ SPELL_AURA_MOD_HEALTH_REGEN_PERCENT
Definition: SpellAuraDefines.h:151
@ RATE_HEALTH
Definition: IWorld.h:431
T ApplyPct(T &base, U pct)
Definition: Util.h:73
float OCTRegenHPPerSpirit()
Definition: Player.cpp:5161
int32 ModifyHealth(int32 val)
Definition: Unit.cpp:14031
bool IsStandState() const
Definition: Unit.cpp:16659

References AddPct(), ApplyPct(), CONFIG_LOW_LEVEL_REGEN_BOOST, Unit::GetAuraEffectsByType(), Unit::GetHealth(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetTotalAuraModifier(), Unit::HasAuraType(), IN_MILLISECONDS, Unit::IsInCombat(), Unit::IsPolymorphed(), Unit::IsStandState(), m_baseHealthRegen, Unit::ModifyHealth(), OCTRegenHPPerSpirit(), RATE_HEALTH, SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT, SPELL_AURA_MOD_HEALTH_REGEN_PERCENT, SPELL_AURA_MOD_REGEN, SPELL_AURA_MOD_REGEN_DURING_COMBAT, and sWorld.

Referenced by RegenerateAll().

◆ removeActionButton()

void Player::removeActionButton ( uint8  button)
5582{
5583 ActionButtonList::iterator buttonItr = m_actionButtons.find(button);
5584 if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED)
5585 return;
5586
5587 if (buttonItr->second.uState == ACTIONBUTTON_NEW)
5588 m_actionButtons.erase(buttonItr); // new and not saved
5589 else
5590 buttonItr->second.uState = ACTIONBUTTON_DELETED; // saved, will deleted at next save
5591
5592 LOG_DEBUG("entities.player", "Action Button {} Removed from Player {}", button, GetGUID().ToString());
5593}

References ACTIONBUTTON_DELETED, ACTIONBUTTON_NEW, Object::GetGUID(), LOG_DEBUG, m_actionButtons, and Position::ToString().

Referenced by WorldSession::HandleSetActionButtonOpcode().

◆ RemoveActiveQuest()

void Player::RemoveActiveQuest ( uint32  questId,
bool  update = true 
)
1490{
1491 QuestStatusMap::iterator itr = m_QuestStatus.find(questId);
1492 if (itr != m_QuestStatus.end())
1493 {
1494 m_QuestStatus.erase(itr);
1495 m_QuestStatusSave[questId] = false;
1496 }
1497
1498 if (update)
1499 SendQuestUpdate(questId);
1500
1501 // Xinef: area auras may change on quest remove!
1505}

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), WorldObject::GetAreaId(), WorldObject::GetZoneId(), m_QuestStatus, m_QuestStatusSave, SendQuestUpdate(), UpdateAreaDependentAuras(), and UpdateZoneDependentAuras().

Referenced by Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), and RewardQuest().

◆ RemoveAllSpellCooldown()

void Player::RemoveAllSpellCooldown ( )
3555{
3557 if (!m_spellCooldowns.empty())
3558 {
3559 for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr)
3560 if (itr->second.end < infTime)
3561 SendClearCooldown(itr->first, this);
3562
3563 m_spellCooldowns.clear();
3564 }
3565}
void SendClearCooldown(uint32 spell_id, Unit *target)
Definition: Player.cpp:14600

References GameTime::GetGameTimeMS(), infinityCooldownDelayCheck, m_spellCooldowns, and SendClearCooldown().

Referenced by misc_commandscript::HandleCooldownCommand().

◆ RemoveAmmo()

◆ RemoveArenaEnchantments()

void Player::RemoveArenaEnchantments ( EnchantmentSlot  slot)
4241{
4242 // remove enchantments from equipped items first to clean up the m_enchantDuration list
4243 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(), next; itr != m_enchantDuration.end(); itr = next)
4244 {
4245 next = itr;
4246 if (itr->slot == slot)
4247 {
4248 if (itr->item && itr->item->GetEnchantmentId(slot))
4249 {
4250 // Poisons and DK runes are enchants which are allowed on arenas
4251 if (sSpellMgr->IsArenaAllowedEnchancment(itr->item->GetEnchantmentId(slot)))
4252 {
4253 ++next;
4254 continue;
4255 }
4256 // remove from stats
4257 ApplyEnchantment(itr->item, slot, false, false);
4258 // remove visual
4259 itr->item->ClearEnchantment(slot);
4260 }
4261 // remove from update list
4262 next = m_enchantDuration.erase(itr);
4263 }
4264 else
4265 ++next;
4266 }
4267
4268 // Xinef: check arena allowed enchantments :)
4269 // remove enchants from inventory items
4270 // NOTE: no need to remove these from stats, since these aren't equipped
4271 // in inventory
4273 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4274 if (uint32 enchId = pItem->GetEnchantmentId(slot))
4275 if (!sSpellMgr->IsArenaAllowedEnchancment(enchId))
4276 pItem->ClearEnchantment(slot);
4277
4278 // in inventory bags
4280 if (Bag* pBag = GetBagByPos(i))
4281 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4282 if (Item* pItem = pBag->GetItemByPos(j))
4283 if (uint32 enchId = pItem->GetEnchantmentId(slot))
4284 if (!sSpellMgr->IsArenaAllowedEnchancment(enchId))
4285 pItem->ClearEnchantment(slot);
4286}

References ApplyEnchantment(), GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, m_enchantDuration, and sSpellMgr.

Referenced by Battleground::AddPlayer().

◆ RemoveArenaSpellCooldowns()

void Player::RemoveArenaSpellCooldowns ( bool  removeActivePetCooldowns = false)
3520{
3521 // remove cooldowns on spells that have < 10 min CD
3523 SpellCooldowns::iterator itr, next;
3524 for (itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); itr = next)
3525 {
3526 next = itr;
3527 ++next;
3528 SpellInfo const* spellInfo = sSpellMgr->CheckSpellInfo(itr->first);
3529 if (!spellInfo)
3530 {
3531 continue;
3532 }
3533
3535 RemoveSpellCooldown(itr->first, true);
3536 else if (spellInfo->RecoveryTime < 10 * MINUTE * IN_MILLISECONDS && spellInfo->CategoryRecoveryTime < 10 * MINUTE * IN_MILLISECONDS && itr->second.end < infTime// xinef: dont remove active cooldowns - bugz
3537 && itr->second.maxduration < 10 * MINUTE * IN_MILLISECONDS) // xinef: dont clear cooldowns that have maxduration > 10 minutes (eg item cooldowns with no spell.dbc cooldown info)
3538 RemoveSpellCooldown(itr->first, true);
3539 }
3540
3541 // pet cooldowns
3542 if (removeActivePetCooldowns)
3543 if (Pet* pet = GetPet())
3544 {
3545 // notify player
3546 for (CreatureSpellCooldowns::const_iterator itr2 = pet->m_CreatureSpellCooldowns.begin(); itr2 != pet->m_CreatureSpellCooldowns.end(); ++itr2)
3547 SendClearCooldown(itr2->first, pet);
3548
3549 // actually clear cooldowns
3550 pet->m_CreatureSpellCooldowns.clear();
3551 }
3552}
@ SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS
Definition: SharedDefines.h:547
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition: Player.cpp:3503

References SpellInfo::CategoryRecoveryTime, GameTime::GetGameTimeMS(), GetPet(), SpellInfo::HasAttribute(), IN_MILLISECONDS, infinityCooldownDelayCheck, m_spellCooldowns, MINUTE, SpellInfo::RecoveryTime, RemoveSpellCooldown(), SendClearCooldown(), SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS, and sSpellMgr.

Referenced by TeleportTo().

◆ RemoveAtLoginFlag()

void Player::RemoveAtLoginFlag ( AtLoginFlags  flags,
bool  persist = false 
)
14586{
14587 m_atLoginFlags &= ~flags;
14588
14589 if (persist)
14590 {
14592
14593 stmt->SetData(0, uint16(flags));
14594 stmt->SetData(1, GetGUID().GetCounter());
14595
14596 CharacterDatabase.Execute(stmt);
14597 }
14598}
@ CHAR_UPD_REM_AT_LOGIN_FLAG
Definition: CharacterDatabase.h:275

References CHAR_UPD_REM_AT_LOGIN_FLAG, CharacterDatabase, Object::GetGUID(), m_atLoginFlags, and PreparedStatementBase::SetData().

Referenced by WorldSession::HandlePlayerLoginFromDB(), LoadCorpse(), resetSpells(), Pet::resetTalents(), resetTalents(), and Pet::resetTalentsForAllPetsOf().

◆ RemoveBattlegroundQueueId()

void Player::RemoveBattlegroundQueueId ( BattlegroundQueueTypeId  val)
12222{
12223 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12224 {
12225 if (_BgBattlegroundQueueID[i].bgQueueTypeId == val)
12226 {
12228 _BgBattlegroundQueueID[i].invitedToInstance = 0;
12229 return;
12230 }
12231 }
12232}

References _BgBattlegroundQueueID, BATTLEGROUND_QUEUE_NONE, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by BGQueueRemoveEvent::Execute(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::LogoutPlayer(), and Battleground::RemovePlayerAtLeave().

◆ RemoveCategoryCooldown()

void Player::RemoveCategoryCooldown ( uint32  cat)
3512{
3513 SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat);
3514 if (i_scstore != sSpellsByCategoryStore.end())
3515 for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset)
3516 RemoveSpellCooldown(i_scset->second, true);
3517}

References RemoveSpellCooldown(), and sSpellsByCategoryStore.

Referenced by spell_hun_readiness::HandleDummy(), spell_item_refocus::HandleDummy(), and Unit::HandleProcTriggerSpell().

◆ RemoveCorpse()

void Player::RemoveCorpse ( )
4616{
4617 if (GetCorpse())
4618 {
4620 }
4621
4622 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4623 Corpse::DeleteFromDB(GetGUID(), trans);
4624 CharacterDatabase.CommitTransaction(trans);
4625
4627}
void RemoveFromWorld() override
Definition: Corpse.cpp:52

References _corpseLocation, CharacterDatabase, Corpse::DeleteFromDB(), GetCorpse(), Object::GetGUID(), Corpse::RemoveFromWorld(), and WorldLocation::WorldRelocate().

Referenced by WorldSession::HandleMoveWorldportAck().

◆ RemovedInsignia()

void Player::RemovedInsignia ( Player looterPlr)
7692{
7693 // Xinef: If player is not in battleground and not in wintergrasp
7695 return;
7696
7697 // If not released spirit, do it !
7698 if (m_deathTimer > 0)
7699 {
7700 m_deathTimer = 0;
7703 }
7704
7706
7707 // We have to convert player corpse to bones, not to be able to resurrect there
7708 // SpawnCorpseBones isn't handy, 'cos it saves player while he in BG
7709 Corpse* bones = GetMap()->ConvertCorpseToBones(GetGUID(), true);
7710 if (!bones)
7711 return;
7712
7713 // Now we must make bones lootable, and send player loot
7715
7716 // We store the level of our player in the gold field
7717 // We retrieve this information at Player::SendLoot()
7718 bones->loot.gold = GetLevel();
7719 bones->lootRecipient = looterPlr;
7720 looterPlr->SendLoot(bones->GetGUID(), LOOT_INSIGNIA);
7721}
@ AREA_WINTERGRASP
Definition: BattlefieldWG.h:125
@ CORPSE_FIELD_DYNAMIC_FLAGS
Definition: UpdateFields.h:428
@ LOOT_INSIGNIA
Definition: LootMgr.h:91
@ CORPSE_DYNFLAG_LOOTABLE
Definition: SharedDefines.h:3133
Player * lootRecipient
Definition: Corpse.h:78
Loot loot
Definition: Corpse.h:77
void SendLoot(ObjectGuid guid, LootType loot_type)
Definition: Player.cpp:7730
void BuildPlayerRepop()
Definition: Player.cpp:4367
uint32 gold
Definition: LootMgr.h:322
Corpse * ConvertCorpseToBones(ObjectGuid const ownerGuid, bool insignia=false)
Definition: Map.cpp:3628

References _corpseLocation, AREA_WINTERGRASP, BuildPlayerRepop(), Map::ConvertCorpseToBones(), CORPSE_DYNFLAG_LOOTABLE, CORPSE_FIELD_DYNAMIC_FLAGS, GetBattlegroundId(), Object::GetGUID(), Unit::GetLevel(), WorldObject::GetMap(), WorldObject::GetZoneId(), Loot::gold, Corpse::loot, LOOT_INSIGNIA, Corpse::lootRecipient, m_deathTimer, RepopAtGraveyard(), SendLoot(), Object::SetFlag(), and WorldLocation::WorldRelocate().

Referenced by Spell::EffectSkinPlayerCorpse().

◆ RemoveEnchantmentDurations()

void Player::RemoveEnchantmentDurations ( Item item)
4215{
4216 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end();)
4217 {
4218 if (itr->item == item)
4219 {
4220 // save duration in item
4221 item->SetEnchantmentDuration(EnchantmentSlot(itr->slot), itr->leftduration, this);
4222 itr = m_enchantDuration.erase(itr);
4223 }
4224 else
4225 ++itr;
4226 }
4227}
void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration, Player *owner)
Definition: Item.cpp:942

References m_enchantDuration, and Item::SetEnchantmentDuration().

Referenced by _StoreItem(), DestroyItem(), EquipItem(), and RemoveItem().

◆ RemoveEnchantmentDurationsReferences()

void Player::RemoveEnchantmentDurationsReferences ( Item item)
4230{
4231 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end();)
4232 {
4233 if (itr->item == item)
4234 itr = m_enchantDuration.erase(itr);
4235 else
4236 ++itr;
4237 }
4238}

References m_enchantDuration.

Referenced by _SaveInventory().

◆ RemoveFromBattlegroundOrBattlefieldRaid()

void Player::RemoveFromBattlegroundOrBattlefieldRaid ( )
13049{
13050 //remove existing reference
13051 m_group.unlink();
13052 if (Group* group = GetOriginalGroup())
13053 {
13054 m_group.link(group, this);
13056 }
13057 SetOriginalGroup(nullptr);
13058}
void unlink()
Definition: Reference.h:62
void link(TO *toObj, FROM *fromObj)
Definition: Reference.h:45
void SetOriginalGroup(Group *group, int8 subgroup=-1)
Definition: Player.cpp:13060
Group * GetOriginalGroup()
Definition: Player.h:2460
uint8 GetOriginalSubGroup() const
Definition: Player.h:2462
void setSubGroup(uint8 pSubGroup)
Definition: GroupReference.h:39

References GetOriginalGroup(), GetOriginalSubGroup(), Reference< TO, FROM >::link(), m_group, SetOriginalGroup(), GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::Disband(), and Group::RemoveMember().

◆ RemoveFromGroup() [1/2]

void Player::RemoveFromGroup ( Group group,
ObjectGuid  guid,
RemoveMethod  method = GROUP_REMOVEMETHOD_DEFAULT,
ObjectGuid  kicker = ObjectGuid::Empty,
const char *  reason = nullptr 
)
static
2344{
2345 if (group)
2346 {
2347 group->RemoveMember(guid, method, kicker, reason);
2348 group = nullptr;
2349 }
2350}
bool RemoveMember(ObjectGuid guid, const RemoveMethod &method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition: Group.cpp:548

References Group::RemoveMember().

Referenced by DeleteFromDB(), WorldSession::HandleGroupDisbandOpcode(), WorldSession::HandleGroupUninviteGuidOpcode(), WorldSession::HandleGroupUninviteOpcode(), WorldSession::LogoutPlayer(), and lfg::LFGMgr::UpdateBoot().

◆ RemoveFromGroup() [2/2]

void Player::RemoveFromGroup ( RemoveMethod  method = GROUP_REMOVEMETHOD_DEFAULT)
inline
1866{ RemoveFromGroup(GetGroup(), GetGUID(), method); }

References GetGroup(), Object::GetGUID(), and RemoveFromGroup().

Referenced by RemoveFromGroup().

◆ RemoveFromWhisperWhiteList()

void Player::RemoveFromWhisperWhiteList ( ObjectGuid  guid)
inline
2538{ WhisperList.remove(guid); }

References WhisperList.

Referenced by message_commandscript::HandleWhispersCommand().

◆ RemoveFromWorld()

void Player::RemoveFromWorld ( )
overridevirtual
  • Release charmed creatures, unsummon totems and remove pets/guardians
  • Do not add/remove the player from the object storage
  • It will crash when updating the ObjectAccessor
  • The player should only be removed when logging out

Reimplemented from WorldObject.

1711{
1712 // cleanup
1713 if (IsInWorld())
1714 {
1719 ClearComboPoints(); // pussywizard: crashfix
1720 ClearComboPointHolders(); // pussywizard: crashfix
1721 if (ObjectGuid lguid = GetLootGUID()) // pussywizard: crashfix
1722 m_session->DoLootRelease(lguid);
1723 sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1724 sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1725 }
1726
1727 // Remove items from world before self - player must be found in Item::RemoveFromObjectUpdate
1728 for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
1729 {
1730 if (m_items[i])
1732 }
1733
1734 for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
1735 iter->second->RemoveFromWorld();
1736
1741
1742 if (m_uint32Values)
1743 {
1744 if (WorldObject* viewpoint = GetViewpoint())
1745 {
1746 LOG_FATAL("entities.player", "Player {} has viewpoint {} {} when removed from world", GetName(), viewpoint->GetEntry(), viewpoint->GetTypeId());
1747 SetViewpoint(viewpoint, false);
1748 }
1749 }
1750}
#define LOG_FATAL(filterType__,...)
Definition: Log.h:152
void SetViewpoint(WorldObject *target, bool apply)
Definition: Player.cpp:13117
void UnsummonPetTemporaryIfAny()
Definition: Player.cpp:14166
WorldObject * GetViewpoint() const
Definition: Player.cpp:13160
void ClearComboPointHolders()
Definition: Unit.cpp:16858
void RemoveFromWorld() override
Definition: Unit.cpp:15634
void DoLootRelease(ObjectGuid lguid)
Definition: LootHandler.cpp:270

References Unit::ClearComboPointHolders(), Unit::ClearComboPoints(), WorldSession::DoLootRelease(), GetLootGUID(), WorldObject::GetName(), GetViewpoint(), Object::IsInWorld(), LOG_FATAL, m_items, m_session, Object::m_uint32Values, m_zoneUpdateId, mMitems, PLAYER_SLOT_END, PLAYER_SLOT_START, Object::RemoveFromWorld(), Unit::RemoveFromWorld(), sBattlefieldMgr, SetViewpoint(), sOutdoorPvPMgr, StopCastingBindSight(), StopCastingCharm(), and UnsummonPetTemporaryIfAny().

Referenced by Map::RemovePlayerFromMap().

◆ RemoveItem()

void Player::RemoveItem ( uint8  bag,
uint8  slot,
bool  update,
bool  swap = false 
)
2915{
2916 // note: removeitem does not actually change the item
2917 // it only takes the item out of storage temporarily
2918 // note2: if removeitem is to be used for delinking
2919 // the item must be removed from the player's updatequeue
2920
2921 Item* pItem = GetItemByPos(bag, slot);
2922 if (pItem)
2923 {
2924 LOG_DEBUG("entities.player.items", "STORAGE: RemoveItem bag = {}, slot = {}, item = {}", bag, slot, pItem->GetEntry());
2925
2927 RemoveItemDurations(pItem);
2928 RemoveTradeableItem(pItem);
2929
2930 if (bag == INVENTORY_SLOT_BAG_0)
2931 {
2932 if (slot < INVENTORY_SLOT_BAG_END)
2933 {
2934 ItemTemplate const* pProto = pItem->GetTemplate();
2935 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
2936
2937 if (pProto && pProto->ItemSet)
2938 RemoveItemsSetItem(this, pProto);
2939
2940 _ApplyItemMods(pItem, slot, false);
2941 }
2942
2943 m_items[slot] = nullptr;
2944
2945 // remove item dependent auras and casts (only weapon and armor slots)
2946 if (slot < INVENTORY_SLOT_BAG_END && slot < EQUIPMENT_SLOT_END)
2947 {
2948 // Xinef: Ensure that this function is called for places with swap=true
2949 if (!swap)
2950 {
2952 }
2953
2954 // remove held enchantments, update expertise
2955 if (slot == EQUIPMENT_SLOT_MAINHAND)
2956 {
2958 }
2959 else if (slot == EQUIPMENT_SLOT_OFFHAND)
2960 {
2962 }
2963
2964 // update armor penetration - passive auras may need it
2965 switch (slot)
2966 {
2971 default:
2972 break;
2973 }
2974 }
2975
2977
2978 if (slot < EQUIPMENT_SLOT_END)
2979 SetVisibleItemSlot(slot, nullptr);
2980 }
2981 else if (Bag* pBag = GetBagByPos(bag))
2982 pBag->RemoveItem(slot, update);
2983
2985 // pItem->SetGuidValue(ITEM_FIELD_OWNER, ObjectGuid::Empty); not clear owner at remove (it will be set at store). This used in mail and auction code
2986 pItem->SetSlot(NULL_SLOT);
2987 if (IsInWorld() && update)
2988 pItem->SendUpdateToPlayer(this);
2989 }
2990}

References _ApplyItemMods(), BASE_ATTACK, CR_ARMOR_PENETRATION, ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetBagByPos(), Object::GetEntry(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, Object::IsInWorld(), ITEM_FIELD_CONTAINED, ItemTemplate::ItemSet, LOG_DEBUG, m_items, NULL_SLOT, OFF_ATTACK, PLAYER_FIELD_INV_SLOT_HEAD, RecalculateRating(), RemoveEnchantmentDurations(), RemoveItemDependentAurasAndCasts(), RemoveItemDurations(), RemoveItemsSetItem(), RemoveTradeableItem(), Object::SendUpdateToPlayer(), Object::SetGuidValue(), Item::SetSlot(), SetVisibleItemSlot(), and UpdateExpertise().

Referenced by AutoUnequipOffhandIfNeed(), Create(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleSellItemOpcode(), MoveItemFromInventory(), and SwapItem().

◆ RemoveItemDependentAurasAndCasts()

void Player::RemoveItemDependentAurasAndCasts ( Item pItem)
12526{
12527 for (AuraMap::iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end();)
12528 {
12529 Aura* aura = itr->second;
12530
12531 // skip passive (passive item dependent spells work in another way) and not self applied auras
12532 SpellInfo const* spellInfo = aura->GetSpellInfo();
12533 if (aura->IsPassive() || aura->GetCasterGUID() != GetGUID())
12534 {
12535 ++itr;
12536 continue;
12537 }
12538
12539 // skip if not item dependent or have alternative item
12540 if (HasItemFitToSpellRequirements(spellInfo, pItem))
12541 {
12542 ++itr;
12543 continue;
12544 }
12545
12546 // no alt item, remove aura, restart check
12547 RemoveOwnedAura(itr);
12548 }
12549
12550 // currently casted spells can be dependent from item
12551 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
12552 if (Spell* spell = GetCurrentSpell(CurrentSpellTypes(i)))
12553 if (spell->getState() != SPELL_STATE_DELAYED && !HasItemFitToSpellRequirements(spell->m_spellInfo, pItem))
12555}
@ SPELL_STATE_DELAYED
Definition: Spell.h:228
#define CURRENT_MAX_SPELL
Definition: Unit.h:544
CurrentSpellTypes
Definition: Unit.h:536
bool HasItemFitToSpellRequirements(SpellInfo const *spellInfo, Item const *ignoreItem=nullptr) const
Definition: Player.cpp:12463

References CURRENT_MAX_SPELL, Aura::GetCasterGUID(), Unit::GetCurrentSpell(), Object::GetGUID(), Aura::GetSpellInfo(), HasItemFitToSpellRequirements(), Unit::InterruptSpell(), Aura::IsPassive(), Unit::m_ownedAuras, Unit::RemoveOwnedAura(), and SPELL_STATE_DELAYED.

Referenced by DestroyItem(), WorldSession::HandleAutoEquipItemOpcode(), RemoveItem(), and SwapItem().

◆ RemoveItemDurations()

void Player::RemoveItemDurations ( Item item)
12396{
12397 for (ItemDurationList::iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end(); ++itr)
12398 {
12399 if (*itr == item)
12400 {
12401 m_itemDuration.erase(itr);
12402 break;
12403 }
12404 }
12405}

References m_itemDuration.

Referenced by _SaveInventory(), _StoreItem(), DestroyItem(), EquipItem(), and RemoveItem().

◆ RemoveItemFromBuyBackSlot()

void Player::RemoveItemFromBuyBackSlot ( uint32  slot,
bool  del 
)
4011{
4012 LOG_DEBUG("entities.player.items", "STORAGE: RemoveItemFromBuyBackSlot slot = {}", slot);
4013 if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END)
4014 {
4015 Item* pItem = m_items[slot];
4016 if (pItem)
4017 {
4018 pItem->RemoveFromWorld();
4019 if (del)
4020 pItem->SetState(ITEM_REMOVED, this);
4021 }
4022
4023 m_items[slot] = nullptr;
4024
4025 uint32 eslot = slot - BUYBACK_SLOT_START;
4029
4030 // if current backslot is filled set to now free slot
4032 m_currentBuybackSlot = slot;
4033 }
4034}

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, ObjectGuid::Empty, ITEM_REMOVED, LOG_DEBUG, m_currentBuybackSlot, m_items, PLAYER_FIELD_BUYBACK_PRICE_1, PLAYER_FIELD_BUYBACK_TIMESTAMP_1, PLAYER_FIELD_VENDORBUYBACK_SLOT_1, Object::RemoveFromWorld(), Object::SetGuidValue(), Item::SetState(), and Unit::SetUInt32Value().

Referenced by AddItemToBuyBackSlot(), WorldSession::HandleBuybackItem(), and reset_commandscript::ResetItemsInVendorBuyBackTab().

◆ RemoveMail()

void Player::RemoveMail ( uint32  id)
2841{
2842 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
2843 {
2844 if ((*itr)->messageID == id)
2845 {
2846 //do not delete item, because Player::removeMail() is called when returning mail to sender.
2847 m_mail.erase(itr);
2848 return;
2849 }
2850 }
2851}

References m_mail.

Referenced by WorldSession::HandleMailReturnToSender().

◆ RemoveMItem()

bool Player::RemoveMItem ( ObjectGuid::LowType  itemLowGuid)
inline
1666 {
1667 return !!mMitems.erase(itemLowGuid);
1668 }

References mMitems.

Referenced by WorldSession::HandleMailReturnToSender(), and WorldSession::HandleMailTakeItem().

◆ RemovePet()

void Player::RemovePet ( Pet pet,
PetSaveMode  mode,
bool  returnreagent = false 
)
9015{
9016 if (!pet)
9017 pet = GetPet();
9018
9019 if (pet)
9020 {
9021 // xinef: dont save dead pet as current, save him not in slot
9022 if (!pet->IsAlive() && mode == PET_SAVE_AS_CURRENT && pet->getPetType() == HUNTER_PET)
9023 {
9024 mode = PET_SAVE_NOT_IN_SLOT;
9026 }
9027
9028 LOG_DEBUG("entities.pet", "RemovePet {}, {}, {}", pet->GetEntry(), mode, returnreagent);
9029 if (pet->m_removed)
9030 return;
9031 }
9032
9033 if (returnreagent && (pet || (m_temporaryUnsummonedPetNumber && (!m_session || !m_session->PlayerLogout()))) && !InBattleground())
9034 {
9035 //returning of reagents only for players, so best done here
9037 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9038
9039 if (spellInfo)
9040 {
9041 for (uint32 i = 0; i < MAX_SPELL_REAGENTS; ++i)
9042 {
9043 if (spellInfo->Reagent[i] > 0)
9044 {
9045 ItemPosCountVec dest; //for succubus, voidwalker, felhunter and felguard credit soulshard when despawn reason other than death (out of range, logout)
9046 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, spellInfo->Reagent[i], spellInfo->ReagentCount[i]);
9047 if (msg == EQUIP_ERR_OK)
9048 {
9049 Item* item = StoreNewItem(dest, spellInfo->Reagent[i], true);
9050 if (IsInWorld())
9051 SendNewItem(item, spellInfo->ReagentCount[i], true, false);
9052 }
9053 }
9054 }
9055 }
9057 }
9058
9059 if (!pet)
9060 {
9061 if (mode == PET_SAVE_NOT_IN_SLOT && m_petStable && m_petStable->CurrentPet)
9062 {
9063 // Handle removing pet while it is in "temporarily unsummoned" state, for example on mount
9065 stmt->SetData(0, PET_SAVE_NOT_IN_SLOT);
9066 stmt->SetData(1, GetGUID().GetCounter());
9067 stmt->SetData(2, m_petStable->CurrentPet->PetNumber);
9068 CharacterDatabase.Execute(stmt);
9069
9070 m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
9071 m_petStable->CurrentPet.reset();
9072 }
9073
9074 return;
9075 }
9076 else
9077 {
9078 pet->CombatStop();
9079
9080 // only if current pet in slot
9081 pet->SavePetToDB(mode);
9082
9083 if (m_petStable->CurrentPet && m_petStable->CurrentPet->PetNumber == pet->GetCharmInfo()->GetPetNumber())
9084 {
9085 if (mode == PET_SAVE_NOT_IN_SLOT)
9086 {
9087 m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
9088 m_petStable->CurrentPet.reset();
9089 }
9090 else if (mode == PET_SAVE_AS_DELETED)
9091 m_petStable->CurrentPet.reset();
9092 // else if (stable slots) handled in opcode handlers due to required swaps
9093 // else (current pet) doesnt need to do anything
9094 }
9095
9096 SetMinion(pet, false);
9097
9098 pet->AddObjectToRemoveList();
9099 pet->m_removed = true;
9100
9101 if (pet->isControlled())
9102 {
9104 data << uint64(0);
9105 GetSession()->SendPacket(&data);
9106
9107 if (GetGroup())
9109 }
9110
9112 {
9115 }
9116 }
9117}
@ GROUP_UPDATE_PET
Definition: Group.h:120
@ UNIT_CREATED_BY_SPELL
Definition: UpdateFields.h:138
@ PET_SAVE_AS_DELETED
Definition: PetDefines.h:41
@ CHAR_UPD_CHAR_PET_SLOT_BY_ID
Definition: CharacterDatabase.h:483
#define MAX_SPELL_REAGENTS
Definition: DBCStructure.h:1639
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition: ArenaSpectator.h:62
void AddObjectToRemoveList()
Definition: Object.cpp:2149
PetType getPetType() const
Definition: Pet.h:52
bool isControlled() const
Definition: Pet.h:54
bool m_removed
Definition: Pet.h:142
void SetGroupUpdateFlag(uint32 flag)
Definition: Player.h:2451
uint32 GetPetNumber() const
Definition: CharmInfo.h:130
std::array< int32, MAX_SPELL_REAGENTS > Reagent
Definition: SpellInfo.h:373
std::array< uint32, MAX_SPELL_REAGENTS > ReagentCount
Definition: SpellInfo.h:374

References WorldObject::AddObjectToRemoveList(), CanStoreNewItem(), CHAR_UPD_CHAR_PET_SLOT_BY_ID, CharacterDatabase, Unit::CombatStop(), EQUIP_ERR_OK, CreatureTemplate::family, WorldObject::FindMap(), Unit::GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetGroup(), Object::GetGUID(), GetPet(), CharmInfo::GetPetNumber(), Pet::getPetType(), GetSession(), Object::GetUInt32Value(), GROUP_UPDATE_PET, HUNTER_PET, InBattleground(), Unit::IsAlive(), Pet::isControlled(), Object::IsInWorld(), LOG_DEBUG, m_oldpetspell, m_petStable, Pet::m_removed, m_session, m_temporaryUnsummonedPetNumber, MAX_SPELL_REAGENTS, NeedSendSpectatorData(), NULL_BAG, NULL_SLOT, PET_SAVE_AS_CURRENT, PET_SAVE_AS_DELETED, PET_SAVE_NOT_IN_SLOT, WorldSession::PlayerLogout(), SpellInfo::Reagent, SpellInfo::ReagentCount, Pet::SavePetToDB(), ArenaSpectator::SendCommand_UInt32Value(), SendNewItem(), WorldSession::SendPacket(), PreparedStatementBase::SetData(), SetGroupUpdateFlag(), Unit::SetMinion(), SMSG_PET_SPELLS, sSpellMgr, StoreNewItem(), and UNIT_CREATED_BY_SPELL.

Referenced by Spell::_cast(), ActivateSpec(), Spell::EffectSummonPet(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleUnstablePet(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Pet::Remove(), resetTalents(), setDeathState(), SummonPet(), UnsummonPetTemporaryIfAny(), and Update().

◆ RemovePetitionsAndSigns()

void Player::RemovePetitionsAndSigns ( ObjectGuid  guid,
uint32  type 
)
static
10066{
10067 SignatureContainer* signatureStore = sPetitionMgr->GetSignatureStore();
10068 for (SignatureContainer::iterator itr = signatureStore->begin(); itr != signatureStore->end(); ++itr)
10069 {
10070 SignatureMap::iterator signItr = itr->second.signatureMap.find(guid);
10071 if (signItr != itr->second.signatureMap.end())
10072 {
10073 Petition const* petition = sPetitionMgr->GetPetition(itr->first);
10074 if (!petition || (type != 10 && type != petition->petitionType))
10075 continue;
10076
10077 // erase this
10078 itr->second.signatureMap.erase(signItr);
10079
10080 // send update if charter owner in game
10082 if (owner)
10083 owner->GetSession()->SendPetitionQueryOpcode(petition->petitionGuid);
10084 }
10085 }
10086
10087 if (type == 10)
10088 {
10090 stmt->SetData(0, guid.GetCounter());
10091 CharacterDatabase.Execute(stmt);
10092 }
10093 else
10094 {
10096 stmt->SetData(0, guid.GetCounter());
10097 stmt->SetData(1, uint8(type));
10098 CharacterDatabase.Execute(stmt);
10099 }
10100
10101 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
10102 if (type == 10)
10103 {
10105 stmt->SetData(0, guid.GetCounter());
10106 trans->Append(stmt);
10107
10108 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER);
10109 stmt->SetData(0, guid.GetCounter());
10110 trans->Append(stmt);
10111
10112 // xinef: clear petition store
10113 sPetitionMgr->RemovePetitionByOwnerAndType(guid, 0);
10114 }
10115 else
10116 {
10118 stmt->SetData(0, guid.GetCounter());
10119 stmt->SetData(1, uint8(type));
10120 trans->Append(stmt);
10121
10123 stmt->SetData(0, guid.GetCounter());
10124 stmt->SetData(1, uint8(type));
10125 trans->Append(stmt);
10126
10127 // xinef: clear petition store
10128 sPetitionMgr->RemovePetitionByOwnerAndType(guid, uint8(type));
10129 }
10130 CharacterDatabase.CommitTransaction(trans);
10131}
#define sPetitionMgr
Definition: PetitionMgr.h:88
std::map< ObjectGuid, Signatures > SignatureContainer
Definition: PetitionMgr.h:53
@ CHAR_DEL_PETITION_SIGNATURE
Definition: CharacterDatabase.h:235
@ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER
Definition: CharacterDatabase.h:451
@ CHAR_DEL_ALL_PETITION_SIGNATURES
Definition: CharacterDatabase.h:234
@ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE
Definition: CharacterDatabase.h:453
@ CHAR_DEL_PETITION_BY_OWNER
Definition: CharacterDatabase.h:450
@ CHAR_DEL_PETITION_BY_OWNER_AND_TYPE
Definition: CharacterDatabase.h:452
Definition: PetitionMgr.h:40
ObjectGuid petitionGuid
Definition: PetitionMgr.h:41
ObjectGuid ownerGuid
Definition: PetitionMgr.h:42
uint8 petitionType
Definition: PetitionMgr.h:43
void SendPetitionQueryOpcode(ObjectGuid petitionguid)
Definition: PetitionsHandler.cpp:278

References CHAR_DEL_ALL_PETITION_SIGNATURES, CHAR_DEL_PETITION_BY_OWNER, CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, CHAR_DEL_PETITION_SIGNATURE, CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, CharacterDatabase, ObjectAccessor::FindConnectedPlayer(), ObjectGuid::GetCounter(), GetSession(), Petition::ownerGuid, Petition::petitionGuid, Petition::petitionType, WorldSession::SendPetitionQueryOpcode(), PreparedStatementBase::SetData(), and sPetitionMgr.

Referenced by Guild::AddMember(), ArenaTeam::AddMember(), and DeleteFromDB().

◆ RemovePlayerFlag()

◆ RemoveQuestSlotState()

void Player::RemoveQuestSlotState ( uint16  slot,
uint32  state 
)
inline

◆ RemoveReceivedSpectatorResetFor()

void Player::RemoveReceivedSpectatorResetFor ( ObjectGuid  guid)
inline
2563{ m_receivedSpectatorResetFor.erase(guid); }

References m_receivedSpectatorResetFor.

◆ RemoveRestFlag()

void Player::RemoveRestFlag ( RestFlag  restFlag)
16116{
16117 uint32 oldRestMask = _restFlagMask;
16118 _restFlagMask &= ~restFlag;
16119
16120 if (oldRestMask && !_restFlagMask) // only remove flag/time on the last rest state remove
16121 {
16122 _restTime = 0;
16124 }
16125}

References _restFlagMask, _restTime, PLAYER_FLAGS_RESTING, and RemovePlayerFlag().

Referenced by Update(), UpdateArea(), and UpdateZone().

◆ RemoveRestState()

void Player::RemoveRestState ( )

◆ RemoveRewardedQuest()

void Player::RemoveRewardedQuest ( uint32  questId,
bool  update = true 
)
1508{
1509 RewardedQuestSet::iterator rewItr = m_RewardedQuests.find(questId);
1510 if (rewItr != m_RewardedQuests.end())
1511 {
1512 m_RewardedQuests.erase(rewItr);
1513 m_RewardedQuestsSave[questId] = false;
1514 }
1515
1516 if (update)
1517 SendQuestUpdate(questId);
1518}

References m_RewardedQuests, m_RewardedQuestsSave, and SendQuestUpdate().

Referenced by Spell::EffectQuestClear().

◆ RemoveRunesByAuraEffect()

void Player::RemoveRunesByAuraEffect ( AuraEffect const *  aura)
13335{
13336 for (uint8 i = 0; i < MAX_RUNES; ++i)
13337 {
13338 if (m_runes->runes[i].ConvertAura == aura)
13339 {
13340 ConvertRune(i, GetBaseRune(i));
13341 SetRuneConvertAura(i, nullptr);
13342 }
13343 }
13344}
AuraEffect const * ConvertAura
Definition: Player.h:422

References RuneInfo::ConvertAura, ConvertRune(), GetBaseRune(), m_runes, MAX_RUNES, Runes::runes, and SetRuneConvertAura().

Referenced by AuraEffect::HandleAuraConvertRune(), Aura::HandleAuraSpecificMods(), and AuraEffect::HandlePeriodicDummyAuraTick().

◆ removeSpell()

void Player::removeSpell ( uint32  spellId,
uint8  removeSpecMask,
bool  onlyTemporary 
)
3313{
3314 PlayerSpellMap::iterator itr = m_spells.find(spell_id);
3315 if (itr == m_spells.end())
3316 return;
3317
3318 // pussywizard: nothing to do if already removed or not in specs of removeSpecMask
3319 if (itr->second->State == PLAYERSPELL_REMOVED || (itr->second->specMask & removeSpecMask) == 0)
3320 return;
3321
3322 // pussywizard: avoid any possible bugs
3323 if (onlyTemporary && itr->second->State != PLAYERSPELL_TEMPORARY)
3324 return;
3325
3326 // pussywizard: remove non-talent higher ranks (recursive)
3327 // pussywizard: do this at the beginning, not in the middle of removing!
3328 if (uint32 nextSpell = sSpellMgr->GetNextSpellInChain(spell_id))
3329 if (!GetTalentSpellPos(nextSpell))
3330 removeSpell(nextSpell, removeSpecMask, onlyTemporary);
3331
3332 // xinef: if current spell has talentcost, remove spells requiring this spell
3333 uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spell_id);
3334 if (GetTalentSpellCost(firstRankSpellId))
3335 {
3336 SpellsRequiringSpellMapBounds spellsRequiringSpell = sSpellMgr->GetSpellsRequiringSpellBounds(firstRankSpellId);
3337 for (auto spellsItr = spellsRequiringSpell.first; spellsItr != spellsRequiringSpell.second; ++spellsItr)
3338 {
3339 removeSpell(spellsItr->second, removeSpecMask, onlyTemporary);
3340 }
3341 }
3342
3343 // pussywizard: re-search, it can be corrupted in prev loop
3344 itr = m_spells.find(spell_id);
3345 if (itr == m_spells.end())
3346 return;
3347
3348 itr->second->specMask = (((uint8)itr->second->specMask) & ~removeSpecMask); // pussywizard: update specMask in map
3349
3350 // pussywizard: some more conditions needed for spells like pyroblast (shouldn't be fully removed when not available in any spec, should stay in db with specMask = 0)
3351 if (GetTalentSpellCost(firstRankSpellId) == 0 && !sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId) && itr->second->specMask == 0)
3352 {
3353 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_TEMPORARY)
3354 {
3355 delete itr->second;
3356 m_spells.erase(itr);
3357 }
3358 else
3359 itr->second->State = PLAYERSPELL_REMOVED;
3360 }
3361 else if (itr->second->State != PLAYERSPELL_NEW && itr->second->State != PLAYERSPELL_TEMPORARY)
3362 itr->second->State = PLAYERSPELL_CHANGED;
3363
3364 // xinef: this is used for talents and they are not removed in removeSpell function...
3365 // xinef: however ill leave this here just in case
3366 // pussywizard: remove owned aura obtained from currently removed spell
3367 RemoveOwnedAura(spell_id);
3368
3369 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id);
3370 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3371 {
3372 // pussywizard: remove pet auras
3373 if (PetAura const* petSpell = sSpellMgr->GetPetAura(spell_id, i))
3374 RemovePetAura(petSpell);
3375
3376 // pussywizard: remove all triggered auras
3377 if (spellInfo->Effects[i].TriggerSpell > 0)
3378 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
3379 }
3380
3381 // pussywizard: update free primary prof points
3382 if (spellInfo->IsPrimaryProfessionFirstRank())
3383 {
3384 uint32 freeProfs = GetFreePrimaryProfessionPoints() + 1;
3385 if (freeProfs <= sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL))
3386 SetFreePrimaryProfessions(freeProfs);
3387 }
3388
3389 // pussywizard: update 310 flyer
3390 if (Has310Flyer(false))
3391 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3392 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && spellInfo->Effects[i].CalcValue() == 310)
3393 Has310Flyer(true, spell_id);
3394
3395 // pussywizard: remove dependent skill
3396 SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spell_id);
3397 if (spellLearnSkill)
3398 {
3399 uint32 prev_spell = sSpellMgr->GetPrevSpellInChain(spell_id);
3400
3401 if (!prev_spell) // pussywizard: first rank, remove skill
3402 SetSkill(spellLearnSkill->skill, 0, 0, 0);
3403 else // pussywizard: search previous ranks
3404 {
3405 SpellLearnSkillNode const* prevSkill = sSpellMgr->GetSpellLearnSkill(prev_spell);
3406 while (!prevSkill && prev_spell)
3407 {
3408 prev_spell = sSpellMgr->GetPrevSpellInChain(prev_spell);
3409 prevSkill = sSpellMgr->GetSpellLearnSkill(sSpellMgr->GetFirstSpellInChain(prev_spell));
3410 }
3411
3412 if (!prevSkill) // pussywizard: not found prev skill setting, remove skill
3413 SetSkill(spellLearnSkill->skill, 0, 0, 0);
3414 else // pussywizard: set to prev skill setting values
3415 {
3416 uint32 skill_value = GetPureSkillValue(prevSkill->skill);
3417 uint32 skill_max_value = GetPureMaxSkillValue(prevSkill->skill);
3418 uint32 new_skill_max_value = prevSkill->maxvalue == 0 ? GetMaxSkillValueForLevel() : prevSkill->maxvalue;
3419
3420 if (skill_value > prevSkill->value)
3421 skill_value = prevSkill->value;
3422 if (skill_max_value > new_skill_max_value)
3423 skill_max_value = new_skill_max_value;
3424
3425 SetSkill(prevSkill->skill, prevSkill->step, skill_value, skill_max_value);
3426 }
3427 }
3428 }
3429 else
3430 {
3431 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id);
3432 // most likely will never be used, haven't heard of cases where players unlearn a mount
3433 if (Has310Flyer(false) && spellInfo)
3434 {
3435 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
3436 {
3437 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine);
3438 if (!pSkill)
3439 continue;
3440
3441 if (_spell_idx->second->SkillLine == SKILL_MOUNTS)
3442 {
3443 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3444 {
3445 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&
3446 spellInfo->Effects[i].CalcValue() == 310)
3447 {
3448 Has310Flyer(true, spell_id); // with true as first argument its also used to set/remove the flag
3449 break;
3450 }
3451 }
3452 }
3453 }
3454 }
3455 }
3456
3457 // pussywizard: remove from spell book (can't be replaced by previous rank, because such spells can't be unlearnt)
3458 if (!onlyTemporary || ((!spellInfo->HasAttribute(SpellAttr0(SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) || !spellInfo->HasAnyAura()) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL)))
3459 {
3460 sScriptMgr->OnPlayerForgotSpell(this, spell_id);
3461 SendLearnPacket(spell_id, false);
3462 }
3463}

References CONFIG_MAX_PRIMARY_TRADE_SKILL, SpellInfo::Effects, GetFreePrimaryProfessionPoints(), GetMaxSkillValueForLevel(), GetPureMaxSkillValue(), GetPureSkillValue(), GetTalentSpellCost(), GetTalentSpellPos(), Has310Flyer(), SpellInfo::HasAnyAura(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), SpellInfo::IsPrimaryProfessionFirstRank(), m_spells, MAX_SPELL_EFFECTS, SpellLearnSkillNode::maxvalue, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), Unit::RemovePetAura(), removeSpell(), SendLearnPacket(), SetFreePrimaryProfessions(), SetSkill(), SpellLearnSkillNode::skill, SKILL_MOUNTS, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_ATTR0_PASSIVE, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSkillLineStore, sSpellMgr, SpellLearnSkillNode::step, and SpellLearnSkillNode::value.

Referenced by _removeTalentAurasAndSpells(), Spell::EffectUnlearnSpecialization(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraOverrideSpells(), Acore::PlayerCommand::HandleUnlearnSpellCommand(), learnSkillRewardedSpells(), ProfessionUnlearnSpells(), removeSpell(), resetSpells(), resetTalents(), and SetSkill().

◆ RemoveSpellCooldown()

◆ RemoveSpellMods()

void Player::RemoveSpellMods ( Spell spell)
9967{
9968 if (!spell)
9969 return;
9970
9971 if (spell->m_appliedMods.empty())
9972 return;
9973
9974 SpellInfo const* const spellInfo = spell->m_spellInfo;
9975
9976 for (uint8 i = 0; i < MAX_SPELLMOD; ++i)
9977 {
9978 for (SpellModList::const_iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end();)
9979 {
9980 SpellModifier* mod = *itr;
9981 ++itr;
9982
9983 // don't handle spells with proc_event entry defined
9984 // this is a temporary workaround, because all spellmods should be handled like that
9985 if (sSpellMgr->GetSpellProcEvent(mod->spellId))
9986 {
9987 continue;
9988 }
9989
9990 // spellmods without aura set cannot be charged
9991 if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
9992 continue;
9993
9994 // check if mod affected this spell
9995 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
9996 if (iterMod == spell->m_appliedMods.end())
9997 continue;
9998
9999 // remove from list
10000 // leave this here, if spell have two mods it will remove 2 charges - wrong
10001 spell->m_appliedMods.erase(iterMod);
10002
10003 // MAGE T8P4 BONUS
10004 if( spellInfo->SpellFamilyName == SPELLFAMILY_MAGE )
10005 {
10006 SpellInfo const* sp = mod->ownerAura->GetSpellInfo();
10007 // Missile Barrage, Hot Streak, Brain Freeze (trigger spell - Fireball!)
10008 if( sp->SpellIconID == 3261 || sp->SpellIconID == 2999 || sp->SpellIconID == 2938 )
10009 if( AuraEffect* aurEff = GetAuraEffectDummy(64869) )
10010 if( roll_chance_i(aurEff->GetAmount()) )
10011 {
10012 mod->charges = 1;
10013 continue;
10014 }
10015 }
10016
10018 itr = m_spellMods[i].begin();
10019 }
10020 }
10021}
#define MAX_SPELLMOD
Definition: SpellDefines.h:110
@ AURA_REMOVE_BY_EXPIRE
Definition: SpellAuraDefines.h:395
@ SPELLFAMILY_MAGE
Definition: SharedDefines.h:3531
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition: Unit.cpp:5504
bool IsUsingCharges() const
Definition: SpellAuras.h:200
bool DropCharge(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: SpellAuras.h:146
SpellInfo const *const m_spellInfo
Definition: Spell.h:520
uint32 SpellIconID
Definition: SpellInfo.h:380

References AURA_REMOVE_BY_EXPIRE, SpellModifier::charges, Aura::DropCharge(), Unit::GetAuraEffectDummy(), Aura::GetSpellInfo(), Aura::IsUsingCharges(), Spell::m_appliedMods, Spell::m_spellInfo, m_spellMods, MAX_SPELLMOD, SpellModifier::ownerAura, roll_chance_i(), SPELLFAMILY_MAGE, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SpellModifier::spellId, and sSpellMgr.

Referenced by Spell::_cast().

◆ RemoveTimedAchievement()

void Player::RemoveTimedAchievement ( AchievementCriteriaTimedTypes  type,
uint32  entry 
)
13875{
13877}
void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
Definition: AchievementMgr.cpp:2249

References m_achievementMgr, and AchievementMgr::RemoveTimedAchievement().

Referenced by InstanceScript::DoStopTimedAchievement(), and WorldSession::HandleQuestLogRemoveQuest().

◆ RemoveTimedQuest()

void Player::RemoveTimedQuest ( uint32  quest_id)
inline
1546{ m_timedquests.erase(quest_id); }

References m_timedquests.

Referenced by FailQuest(), WorldSession::HandleQuestLogRemoveQuest(), and RewardQuest().

◆ RemoveTradeableItem()

◆ ReplaceAllPlayerFlags()

void Player::ReplaceAllPlayerFlags ( PlayerFlags  flags)
inline
1111{ SetUInt32Value(PLAYER_FLAGS, flags); }

References PLAYER_FLAGS, and Unit::SetUInt32Value().

Referenced by LoadFromDB().

◆ RepopAtGraveyard()

void Player::RepopAtGraveyard ( )
4864{
4865 // note: this can be called also when the player is alive
4866 // for example from WorldSession::HandleMovementOpcodes
4867
4868 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(GetAreaId());
4869
4870 if (!sScriptMgr->CanRepopAtGraveyard(this))
4871 return;
4872
4873 // Such zones are considered unreachable as a ghost and the player must be automatically revived
4874 // Xinef: Get Transport Check is not needed
4875 if ((!IsAlive() && zone && zone->flags & AREA_FLAG_NEED_FLY) /*|| GetTransport()*/ || GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY()))
4876 {
4877 ResurrectPlayer(0.5f);
4879 }
4880
4881 GraveyardStruct const* ClosestGrave = nullptr;
4882
4883 // Special handle for battleground maps
4884 if (Battleground* bg = GetBattleground())
4885 ClosestGrave = bg->GetClosestGraveyard(this);
4886 else
4887 {
4888 if (sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId()))
4889 ClosestGrave = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())->GetClosestGraveyard(this);
4890 else
4891 ClosestGrave = sGraveyard->GetClosestGraveyard(this, GetTeamId());
4892 }
4893
4894 // stop countdown until repop
4895 m_deathTimer = 0;
4896
4897 // if no grave found, stay at the current location
4898 // and don't show spirit healer location
4899 if (ClosestGrave)
4900 {
4901 TeleportTo(ClosestGrave->Map, ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, GetOrientation());
4902 if (isDead()) // not send if alive, because it used in TeleportTo()
4903 {
4904 WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // show spirit healer position on minimap
4905 data << ClosestGrave->Map;
4906 data << ClosestGrave->x;
4907 data << ClosestGrave->y;
4908 data << ClosestGrave->z;
4909 GetSession()->SendPacket(&data);
4910 }
4911 }
4912 else if (GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY()))
4914
4916}
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition: Player.h:488
#define sGraveyard
Definition: GameGraveyard.h:75
@ AREA_FLAG_NEED_FLY
Definition: DBCEnums.h:246
@ SMSG_DEATH_RELEASE_LOC
Definition: Opcodes.h:918
Definition: GameGraveyard.h:28
float z
Definition: GameGraveyard.h:33
float x
Definition: GameGraveyard.h:31
float y
Definition: GameGraveyard.h:32
uint32 Map
Definition: GameGraveyard.h:30

References AREA_FLAG_NEED_FLY, AreaTableEntry::flags, WorldObject::GetAreaId(), GetBattleground(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), GetTeamId(), WorldObject::GetZoneId(), Unit::IsAlive(), Unit::isDead(), m_deathTimer, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GraveyardStruct::Map, PLAYER_FLAGS_IS_OUT_OF_BOUNDS, RemovePlayerFlag(), ResurrectPlayer(), sAreaTableStore, sBattlefieldMgr, WorldSession::SendPacket(), sGraveyard, SMSG_DEATH_RELEASE_LOC, SpawnCorpseBones(), sScriptMgr, TeleportTo(), GraveyardStruct::x, GraveyardStruct::y, and GraveyardStruct::z.

Referenced by Spell::EffectStuck(), HandleDrowning(), WorldSession::HandleInstanceLockResponse(), WorldSession::HandleRepopRequestOpcode(), misc_commandscript::HandleUnstuckCommand(), WorldSession::LogoutPlayer(), RemovedInsignia(), TeleportTo(), Update(), and UpdateHomebindTime().

◆ ReportedAfkBy()

void Player::ReportedAfkBy ( Player reporter)

This player has been blamed to be inactive in a battleground.

11332{
11334 // Battleground also must be in progress!
11335 if (!bg || bg != reporter->GetBattleground() || GetTeamId() != reporter->GetTeamId() || bg->GetStatus() != STATUS_IN_PROGRESS)
11336 return;
11337
11338 // Xinef: 2 minutes startup + 2 minute of match
11340 return;
11341
11342 // check if player has 'Idle' or 'Inactive' debuff
11343 if (m_bgData.bgAfkReporter.find(reporter->GetGUID()) == m_bgData.bgAfkReporter.end() && !HasAura(43680) && !HasAura(43681) && reporter->CanReportAfkDueToLimit())
11344 {
11345 m_bgData.bgAfkReporter.insert(reporter->GetGUID());
11346 // by default 3 players have to complain to apply debuff
11347 if (m_bgData.bgAfkReporter.size() >= sWorld->getIntConfig(CONFIG_BATTLEGROUND_REPORT_AFK))
11348 {
11349 // cast 'Idle' spell
11350 CastSpell(this, 43680, true);
11351 m_bgData.bgAfkReporter.clear();
11352 }
11353 }
11354}
@ CONFIG_BATTLEGROUND_REPORT_AFK_TIMER
Definition: IWorld.h:316
@ CONFIG_BATTLEGROUND_REPORT_AFK
Definition: IWorld.h:317
uint32 GetStartTime() const
Definition: Battleground.h:329
bool CanReportAfkDueToLimit()
Definition: Player.cpp:11321

References BGData::bgAfkReporter, CanReportAfkDueToLimit(), Unit::CastSpell(), CONFIG_BATTLEGROUND_REPORT_AFK, CONFIG_BATTLEGROUND_REPORT_AFK_TIMER, GetBattleground(), Object::GetGUID(), Battleground::GetStartTime(), Battleground::GetStatus(), GetTeamId(), Unit::HasAura(), IN_MILLISECONDS, m_bgData, MINUTE, STATUS_IN_PROGRESS, and sWorld.

Referenced by WorldSession::HandleReportPvPAFK().

◆ ReputationChanged()

void Player::ReputationChanged ( FactionEntry const *  factionEntry)
2203{
2204 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2205 {
2206 if (uint32 questid = GetQuestSlotQuestId(i))
2207 {
2208 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2209 {
2210 if (qInfo->GetRepObjectiveFaction() == factionEntry->ID)
2211 {
2212 QuestStatusData& q_status = m_QuestStatus[questid];
2213 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2214 {
2215 if (GetReputationMgr().GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue())
2216 if (CanCompleteQuest(questid))
2217 CompleteQuest(questid);
2218 }
2219 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2220 {
2221 if (GetReputationMgr().GetReputation(factionEntry) < qInfo->GetRepObjectiveValue())
2222 IncompleteQuest(questid);
2223 }
2224 }
2225 }
2226 }
2227 }
2228}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), GetReputation(), GetReputationMgr(), FactionEntry::ID, IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by ReputationMgr::SetOneFactionReputation().

◆ ReputationChanged2()

void Player::ReputationChanged2 ( FactionEntry const *  factionEntry)
2231{
2232 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2233 {
2234 if (uint32 questid = GetQuestSlotQuestId(i))
2235 {
2236 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2237 {
2238 if (qInfo->GetRepObjectiveFaction2() == factionEntry->ID)
2239 {
2240 QuestStatusData& q_status = m_QuestStatus[questid];
2241 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2242 {
2243 if (GetReputationMgr().GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue2())
2244 if (CanCompleteQuest(questid))
2245 CompleteQuest(questid);
2246 }
2247 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2248 {
2249 if (GetReputationMgr().GetReputation(factionEntry) < qInfo->GetRepObjectiveValue2())
2250 IncompleteQuest(questid);
2251 }
2252 }
2253 }
2254 }
2255 }
2256}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), GetReputation(), GetReputationMgr(), FactionEntry::ID, IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

◆ ResetAchievementCriteria()

void Player::ResetAchievementCriteria ( AchievementCriteriaCondition  condition,
uint32  value,
bool  evenIfCriteriaComplete = false 
)
13880{
13881 m_achievementMgr->ResetAchievementCriteria(condition, value, evenIfCriteriaComplete);
13882}
void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
Definition: AchievementMgr.cpp:515

References m_achievementMgr, and AchievementMgr::ResetAchievementCriteria().

Referenced by Battleground::AddPlayer(), spell_algalon_supermassive_fail::RecalculateDamage(), Battleground::RemovePlayerAtLeave(), and setDeathState().

◆ ResetAchievements()

void Player::ResetAchievements ( )
13855{
13857}
void Reset()
Definition: AchievementMgr.cpp:491

References m_achievementMgr, and AchievementMgr::Reset().

Referenced by reset_commandscript::HandleResetAchievementsCommand().

◆ ResetAllPowers()

◆ ResetContestedPvP()

void Player::ResetContestedPvP ( )
inline
1848 {
1852 }
@ PLAYER_FLAGS_CONTESTED_PVP
Definition: Player.h:482
@ UNIT_STATE_ATTACK_PLAYER
Definition: UnitDefines.h:163
void ClearUnitState(uint32 f)
Definition: Unit.h:740

References Unit::ClearUnitState(), m_contestedPvPTimer, PLAYER_FLAGS_CONTESTED_PVP, RemovePlayerFlag(), and UNIT_STATE_ATTACK_PLAYER.

Referenced by SetGameMaster(), SetIsSpectator(), and UpdateContestedPvP().

◆ ResetDailyQuestStatus()

void Player::ResetDailyQuestStatus ( )
12108{
12109 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12110 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, 0);
12111
12112 m_DFQuests.clear(); // Dungeon Finder Quests.
12113
12114 // DB data deleted in caller
12115 m_DailyQuestChanged = false;
12117}

References m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and Unit::SetUInt32Value().

◆ ResetFarSightDistance()

void Player::ResetFarSightDistance ( )
16226{
16227 _farSightDistance.reset();
16228}

References _farSightDistance.

Referenced by AuraEffect::HandleFarSight().

◆ ResetInstances()

void Player::ResetInstances ( ObjectGuid  guid,
uint8  method,
bool  isRaid 
)
static

Reset all solo instances and optionally send a message on success for each.

196{
197 switch (method)
198 {
200 {
202 if (!p || p->GetDifficulty(false) != DUNGEON_DIFFICULTY_NORMAL)
203 break;
204 std::vector<InstanceSave*> toUnbind;
205 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), Difficulty(DUNGEON_DIFFICULTY_NORMAL));
206 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
207 {
208 InstanceSave* instanceSave = itr->second.save;
209 MapEntry const* entry = sMapStore.LookupEntry(itr->first);
210 if (!entry || entry->IsRaid() || !instanceSave->CanReset())
211 {
212 continue;
213 }
214
215 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
216 if (!map || map->ToInstanceMap()->Reset(method))
217 {
218 p->SendResetInstanceSuccess(instanceSave->GetMapId());
219 toUnbind.push_back(instanceSave);
220 }
221 else
222 {
223 p->SendResetInstanceFailed(0, instanceSave->GetMapId());
224 }
225
226 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
227 }
228 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
229 {
230 sInstanceSaveMgr->UnbindAllFor(*itr);
231 }
232 }
233 break;
235 {
237 if (!p)
238 break;
239 std::vector<InstanceSave*> toUnbind;
240 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), p->GetDifficulty(isRaid));
241 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
242 {
243 InstanceSave* instanceSave = itr->second.save;
244 MapEntry const* entry = sMapStore.LookupEntry(itr->first);
245 if (!entry || entry->IsRaid() != isRaid || !instanceSave->CanReset())
246 {
247 continue;
248 }
249
250 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
251 if (!map || map->ToInstanceMap()->Reset(method))
252 {
253 p->SendResetInstanceSuccess(instanceSave->GetMapId());
254 toUnbind.push_back(instanceSave);
255 }
256 else
257 {
258 p->SendResetInstanceFailed(0, instanceSave->GetMapId());
259 }
260
261 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
262 }
263 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
264 sInstanceSaveMgr->UnbindAllFor(*itr);
265 }
266 break;
268 {
270 if (!p)
271 break;
272 for (uint8 d = 0; d < MAX_DIFFICULTY; ++d)
273 {
274 std::vector<InstanceSave*> toUnbind;
275 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), Difficulty(d));
276 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
277 {
278 if (itr->second.perm)
279 continue;
280 InstanceSave* instanceSave = itr->second.save;
281 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
282 if (!map || p->FindMap() != map)
283 {
284 //p->SendResetInstanceSuccess(instanceSave->GetMapId());
285 toUnbind.push_back(instanceSave);
286 }
287 //else
288 // p->SendResetInstanceFailed(0, instanceSave->GetMapId());
289
290 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
291 }
292 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
293 sInstanceSaveMgr->PlayerUnbindInstance(p->GetGUID(), (*itr)->GetMapId(), (*itr)->GetDifficulty(), true, p);
294 }
295 }
296 break;
298 {
300 for (uint8 d = 0; d < MAX_DIFFICULTY; ++d)
301 {
302 std::vector<InstanceSave*> toUnbind;
303 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(guid, Difficulty(d));
304 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
305 {
306 if (itr->second.perm)
307 continue;
308 InstanceSave* instanceSave = itr->second.save;
309 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
310 if (!p || !map || p->FindMap() != map)
311 {
312 //p->SendResetInstanceSuccess(instanceSave->GetMapId());
313 toUnbind.push_back(instanceSave);
314 }
315 //else
316 // p->SendResetInstanceFailed(0, instanceSave->GetMapId());
317 }
318 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
319 sInstanceSaveMgr->PlayerUnbindInstance(guid, (*itr)->GetMapId(), (*itr)->GetDifficulty(), true, p);
320 }
321 }
322 break;
323 }
324}
@ INSTANCE_RESET_GROUP_JOIN
Definition: Map.h:814
@ INSTANCE_RESET_CHANGE_DIFFICULTY
Definition: Map.h:812
@ INSTANCE_RESET_GROUP_LEAVE
Definition: Map.h:815
@ INSTANCE_RESET_ALL
Definition: Map.h:811
std::unordered_map< uint32, InstancePlayerBind > BoundInstancesMap
Definition: InstanceSaveMgr.h:46
#define MAX_DIFFICULTY
Definition: DBCEnums.h:283
void SendResetInstanceSuccess(uint32 MapId)
Definition: PlayerMisc.cpp:326
void SendResetInstanceFailed(uint32 reason, uint32 MapId)
Definition: PlayerMisc.cpp:333
uint32 GetMapId() const
Definition: InstanceSaveMgr.h:62
bool CanReset() const
Definition: InstanceSaveMgr.h:81
InstanceMap * ToInstanceMap()
Definition: Map.h:546
bool Reset(uint8 method, GuidList *globalSkipList=nullptr)
Definition: Map.cpp:3105

References InstanceSave::CanReset(), DUNGEON_DIFFICULTY_NORMAL, ObjectAccessor::FindConnectedPlayer(), WorldObject::FindMap(), GetDifficulty(), Object::GetGUID(), InstanceSave::GetInstanceId(), InstanceSave::GetMapId(), INSTANCE_RESET_ALL, INSTANCE_RESET_CHANGE_DIFFICULTY, INSTANCE_RESET_GROUP_JOIN, INSTANCE_RESET_GROUP_LEAVE, MapEntry::IsRaid(), MAX_DIFFICULTY, InstanceMap::Reset(), SendResetInstanceFailed(), SendResetInstanceSuccess(), sInstanceSaveMgr, sMapMgr, sMapStore, and Map::ToInstanceMap().

Referenced by Group::AddMember(), Group::Disband(), WorldSession::HandleResetInstancesOpcode(), WorldSession::HandleSetDungeonDifficultyOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), and Group::RemoveMember().

◆ ResetMap()

void Player::ResetMap ( )
overridevirtual

Reimplemented from WorldObject.

14612{
14613 // this may be called during Map::Update
14614 // after decrement+unlink, ++m_mapRefIter will continue correctly
14615 // when the first element of the list is being removed
14616 // nocheck_prev will return the padding element of the RefMgr
14617 // instead of nullptr in the case of prev
14618 GetMap()->UpdateIteratorBack(this);
14620 GetMapRef().unlink();
14621}
virtual void ResetMap()
Definition: Object.cpp:2131
MapReference & GetMapRef()
Definition: Player.h:2468
void UpdateIteratorBack(Player *player)
Definition: Map.cpp:3343

References WorldObject::GetMap(), GetMapRef(), WorldObject::ResetMap(), Reference< TO, FROM >::unlink(), and Map::UpdateIteratorBack().

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::HandleSetRaidDifficultyOpcode().

◆ ResetMonthlyQuestStatus()

void Player::ResetMonthlyQuestStatus ( )
12140{
12141 if (m_monthlyquests.empty())
12142 return;
12143
12144 m_monthlyquests.clear();
12145 // DB data deleted in caller
12146 m_MonthlyQuestChanged = false;
12147}

References m_MonthlyQuestChanged, and m_monthlyquests.

◆ ResetPetTalents()

void Player::ResetPetTalents ( )
8845{
8846 // This needs another gossip option + NPC text as a confirmation.
8847 // The confirmation gossip listid has the text: "Yes, please do."
8848 Pet* pet = GetPet();
8849
8850 if (!pet || pet->getPetType() != HUNTER_PET || pet->m_usedTalentCount == 0)
8851 return;
8852
8853 CharmInfo* charmInfo = pet->GetCharmInfo();
8854 if (!charmInfo)
8855 {
8856 LOG_ERROR("entities.player", "Object ({}) is considered pet-like but doesn't have a charminfo!", pet->GetGUID().ToString());
8857 return;
8858 }
8859 pet->resetTalents();
8860 SendTalentsInfoData(true);
8861}
uint32 m_usedTalentCount
Definition: Pet.h:134
bool resetTalents()
Definition: Pet.cpp:2060

References Unit::GetCharmInfo(), Object::GetGUID(), GetPet(), Pet::getPetType(), HUNTER_PET, LOG_ERROR, Pet::m_usedTalentCount, Pet::resetTalents(), SendTalentsInfoData(), and ObjectGuid::ToString().

Referenced by OnGossipSelect(), and npc_pet_trainer::npc_pet_trainerAI::sGossipSelect().

◆ ResetSeasonalQuestStatus()

void Player::ResetSeasonalQuestStatus ( uint16  event_id)
12130{
12131 if (m_seasonalquests.empty() || m_seasonalquests[event_id].empty())
12132 return;
12133
12134 m_seasonalquests.erase(event_id);
12135 // DB data deleted in caller
12136 m_SeasonalQuestChanged = false;
12137}

References m_SeasonalQuestChanged, and m_seasonalquests.

◆ resetSpells()

void Player::resetSpells ( )
11773{
11774 // not need after this call
11777
11778 // make full copy of map (spells removed and marked as deleted at another spell remove
11779 // and we can't use original map for safe iterative with visit each spell at loop end
11780 PlayerSpellMap spellMap = GetSpellMap();
11781
11782 for (PlayerSpellMap::const_iterator iter = spellMap.begin(); iter != spellMap.end(); ++iter)
11783 removeSpell(iter->first, SPEC_MASK_ALL, false);
11784
11788}
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition: Player.h:193
@ AT_LOGIN_RESET_SPELLS
Definition: Player.h:601
PlayerSpellMap const & GetSpellMap() const
Definition: Player.h:1753

References AT_LOGIN_RESET_SPELLS, GetSpellMap(), HasAtLoginFlag(), LearnCustomSpells(), LearnDefaultSkills(), learnQuestRewardedSpells(), RemoveAtLoginFlag(), removeSpell(), and SPEC_MASK_ALL.

Referenced by WorldSession::HandlePlayerLoginFromDB(), and reset_commandscript::HandleResetSpellsCommand().

◆ resetTalents()

bool Player::resetTalents ( bool  noResetCost = false)
3685{
3686 sScriptMgr->OnPlayerTalentsReset(this, noResetCost);
3687
3688 // xinef: remove at login flag upon talents reset
3691
3692 // xinef: get max available talent points amount
3693 uint32 talentPointsForLevel = CalculateTalentsPoints();
3694
3695 // xinef: no talent points are used, return
3696 if (m_usedTalentCount == 0)
3697 return false;
3699
3700 // xinef: check if we have enough money
3701 uint32 resetCost = 0;
3702 if (!noResetCost && !sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST))
3703 {
3704 resetCost = resetTalentsCost();
3705 if (!HasEnoughMoney(resetCost))
3706 {
3708 return false;
3709 }
3710 }
3711
3712 RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
3713
3714 // xinef: reset talents
3715 for (PlayerTalentMap::iterator iter = m_talents.begin(); iter != m_talents.end(); )
3716 {
3717 PlayerTalentMap::iterator itr = iter++;
3718
3719 if (itr->second->State == PLAYERSPELL_REMOVED)
3720 continue;
3721
3722 // xinef: talent not in current spec
3723 if (!(itr->second->specMask & GetActiveSpecMask()))
3724 continue;
3725
3726 // xinef: remove talent auras
3727 _removeTalentAurasAndSpells(itr->first);
3728
3729 // xinef: check if talent learns spell to spell book
3730 TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID);
3731 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
3732
3733 bool removed = false;
3734 if (talentInfo->addToSpellBook)
3735 if (!spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3736 {
3737 removeSpell(itr->first, GetActiveSpecMask(), false);
3738 removed = true;
3739 }
3740
3741 // Xinef: send unlearn spell packet at talent remove
3742 if (!removed)
3743 SendLearnPacket(itr->first, false);
3744
3745 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3746 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
3747 if (sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
3748 removeSpell(spellInfo->Effects[i].TriggerSpell, GetActiveSpecMask(), false);
3749
3750 // xinef: remove talent modifies m_talents, move itr to map begin
3752 }
3753
3754 // xinef: remove titan grip if player had it set
3755 if (m_canTitanGrip)
3756 SetCanTitanGrip(false);
3757 // xinef: remove dual wield if player does not have dual wield spell (shamans)
3758 if (!HasSpell(674) && m_canDualWield)
3759 SetCanDualWield(false);
3760
3762
3763 // pussywizard: removed saving to db, nothing important happens and saving only spells and talents may cause data integrity problems (eg. with skills saved to db)
3764 SetFreeTalentPoints(talentPointsForLevel);
3765
3766 if (!noResetCost)
3767 {
3768 ModifyMoney(-(int32)resetCost);
3771
3772 m_resetTalentsCost = resetCost;
3774 }
3775
3776 return true;
3777}
@ AT_LOGIN_RESET_TALENTS
Definition: Player.h:602
@ CONFIG_NO_RESET_TALENT_COST
Definition: IWorld.h:135
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS
Definition: DBCEnums.h:173
@ ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS
Definition: DBCEnums.h:174
uint32 resetTalentsCost() const
Definition: Player.cpp:3651

References _removeTalent(), _removeTalentAurasAndSpells(), ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS, ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS, TalentEntry::addToSpellBook, AT_LOGIN_RESET_TALENTS, AutoUnequipOffhandIfNeed(), BUY_ERR_NOT_ENOUGHT_MONEY, CalculateTalentsPoints(), CONFIG_NO_RESET_TALENT_COST, SpellInfo::Effects, GetActiveSpecMask(), GameTime::GetGameTime(), HasAtLoginFlag(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), HasEnoughMoney(), HasSpell(), Unit::m_canDualWield, m_canTitanGrip, m_resetTalentsCost, m_resetTalentsTime, m_talents, m_usedTalentCount, MAX_SPELL_EFFECTS, ModifyMoney(), PET_SAVE_NOT_IN_SLOT, PLAYERSPELL_REMOVED, RemoveAtLoginFlag(), RemovePet(), removeSpell(), resetTalentsCost(), SendBuyError(), SendLearnPacket(), Unit::SetCanDualWield(), SetCanTitanGrip(), SetFreeTalentPoints(), SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, sTalentStore, sWorld, and UpdateAchievementCriteria().

Referenced by WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetTalentsCommand(), WorldSession::HandleTalentWipeConfirmOpcode(), and InitTalentForLevel().

◆ resetTalentsCost()

uint32 Player::resetTalentsCost ( ) const
3652{
3653 // The first time reset costs 1 gold
3654 if (m_resetTalentsCost < 1 * GOLD)
3655 return 1 * GOLD;
3656 // then 5 gold
3657 else if (m_resetTalentsCost < 5 * GOLD)
3658 return 5 * GOLD;
3659 // After that it increases in increments of 5 gold
3660 else if (m_resetTalentsCost < 10 * GOLD)
3661 return 10 * GOLD;
3662 else
3663 {
3664 uint64 months = (GameTime::GetGameTime().count() - m_resetTalentsTime) / MONTH;
3665 if (months > 0)
3666 {
3667 // This cost will be reduced by a rate of 5 gold per month
3668 int32 new_cost = int32(m_resetTalentsCost - 5 * GOLD * months);
3669 // to a minimum of 10 gold.
3670 return (new_cost < 10 * GOLD ? 10 * GOLD : new_cost);
3671 }
3672 else
3673 {
3674 // After that it increases in increments of 5 gold
3675 int32 new_cost = m_resetTalentsCost + 5 * GOLD;
3676 // until it hits a cap of 50 gold.
3677 if (new_cost > 50 * GOLD)
3678 new_cost = 50 * GOLD;
3679 return new_cost;
3680 }
3681 }
3682}
@ GOLD
Definition: SharedDefines.h:253
constexpr auto MONTH
Definition: Common.h:51

References GameTime::GetGameTime(), GOLD, m_resetTalentsCost, m_resetTalentsTime, and MONTH.

Referenced by resetTalents(), and SendTalentWipeConfirm().

◆ ResetWeeklyQuestStatus()

void Player::ResetWeeklyQuestStatus ( )
12120{
12121 if (m_weeklyquests.empty())
12122 return;
12123
12124 m_weeklyquests.clear();
12125 // DB data deleted in caller
12126 m_WeeklyQuestChanged = false;
12127}

References m_WeeklyQuestChanged, and m_weeklyquests.

◆ RestoreAllSpellMods()

void Player::RestoreAllSpellMods ( uint32  ownerAuraId = 0,
Aura aura = nullptr 
)
9960{
9961 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
9962 if (m_currentSpells[i])
9963 RestoreSpellMods(m_currentSpells[i], ownerAuraId, aura);
9964}
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition: Player.cpp:9892
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition: Unit.h:1844

References CURRENT_MAX_SPELL, Unit::m_currentSpells, and RestoreSpellMods().

◆ RestoreBaseRune()

void Player::RestoreBaseRune ( uint8  index)
13347{
13348 AuraEffect const* aura = m_runes->runes[index].ConvertAura;
13349 // If rune was converted by a non-pasive aura that still active we should keep it converted
13350 if (aura && !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_PASSIVE))
13351 return;
13352 ConvertRune(index, GetBaseRune(index));
13353 SetRuneConvertAura(index, nullptr);
13354 // Don't drop passive talents providing rune convertion
13355 if (!aura || aura->GetAuraType() != SPELL_AURA_CONVERT_RUNE)
13356 return;
13357 for (uint8 i = 0; i < MAX_RUNES; ++i)
13358 {
13359 if (aura == m_runes->runes[i].ConvertAura)
13360 return;
13361 }
13362 aura->GetBase()->Remove();
13363}
@ SPELL_AURA_CONVERT_RUNE
Definition: SpellAuraDefines.h:312
SpellInfo const * GetSpellInfo() const
Definition: SpellAuraEffects.h:54
AuraType GetAuraType() const
Definition: SpellAuraEffects.cpp:447
Aura * GetBase() const
Definition: SpellAuraEffects.h:49

References RuneInfo::ConvertAura, ConvertRune(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), GetBaseRune(), AuraEffect::GetSpellInfo(), SpellInfo::HasAttribute(), m_runes, MAX_RUNES, Aura::Remove(), Runes::runes, SetRuneConvertAura(), SPELL_ATTR0_PASSIVE, and SPELL_AURA_CONVERT_RUNE.

Referenced by Spell::TakeRunePower().

◆ RestoreHealthAfterDuel()

void Player::RestoreHealthAfterDuel ( )
inline
uint32 healthBeforeDuel
Definition: Player.h:2957

References healthBeforeDuel, and Unit::SetHealth().

◆ RestoreManaAfterDuel()

void Player::RestoreManaAfterDuel ( )
inline
uint32 manaBeforeDuel
Definition: Player.h:2958

References manaBeforeDuel, POWER_MANA, and Unit::SetPower().

◆ RestoreSpellMods()

void Player::RestoreSpellMods ( Spell spell,
uint32  ownerAuraId = 0,
Aura aura = nullptr 
)
Todo:
track these changes correctly
9893{
9894 if (!spell || spell->m_appliedMods.empty())
9895 return;
9896
9897 std::list<Aura*> aurasQueue;
9898
9899 for (uint8 i = 0; i < MAX_SPELLMOD; ++i)
9900 {
9901 for (SpellModList::iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end(); ++itr)
9902 {
9903 SpellModifier* mod = *itr;
9904
9905 // Spellmods without aura set cannot be charged
9906 if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
9907 continue;
9908
9909 // Restore only specific owner aura mods
9910 if (ownerAuraId && (ownerAuraId != mod->ownerAura->GetSpellInfo()->Id))
9911 continue;
9912
9913 if (aura && mod->ownerAura != aura)
9914 continue;
9915
9916 // Check if mod affected this spell
9917 // First, check if the mod aura applied at least one spellmod to this spell
9918 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
9919 if (iterMod == spell->m_appliedMods.end())
9920 continue;
9921 // Second, check if the current mod is one of those applied by the mod aura
9922 if (!(mod->mask & spell->m_spellInfo->SpellFamilyFlags))
9923 continue;
9924
9925 // remove from list - This will be done after all mods have been gone through
9926 // to ensure we iterate over all mods of an aura before removing said aura
9927 // from applied mods (Else, an aura with two mods on the current spell would
9928 // only see the first of its modifier restored)
9929 aurasQueue.push_back(mod->ownerAura);
9930
9931 // add mod charges back to mod
9932 if (mod->charges == -1)
9933 mod->charges = 1;
9934 else
9935 mod->charges++;
9936
9937 // Do not set more spellmods than available
9938 if (mod->ownerAura->GetCharges() < mod->charges)
9939 mod->charges = mod->ownerAura->GetCharges();
9940
9941 // Skip this check for now - aura charges may change due to various reason
9943 //ASSERT (mod->ownerAura->GetCharges() <= mod->charges);
9944 }
9945 }
9946
9947 for (std::list<Aura*>::iterator itr = aurasQueue.begin(); itr != aurasQueue.end(); ++itr)
9948 {
9949 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(*itr);
9950 if (iterMod != spell->m_appliedMods.end())
9951 spell->m_appliedMods.erase(iterMod);
9952 }
9953
9954 // Xinef: clear the list just do be sure
9955 if (!ownerAuraId && !aura)
9956 spell->m_appliedMods.clear();
9957}
uint8 GetCharges() const
Definition: SpellAuras.h:141
flag96 SpellFamilyFlags
Definition: SpellInfo.h:388

References SpellModifier::charges, Aura::GetCharges(), Aura::GetSpellInfo(), SpellInfo::Id, Aura::IsUsingCharges(), Spell::m_appliedMods, Spell::m_spellInfo, m_spellMods, SpellModifier::mask, MAX_SPELLMOD, SpellModifier::ownerAura, and SpellInfo::SpellFamilyFlags.

Referenced by Spell::DoAllEffectOnTarget(), Spell::finish(), Unit::HandleDummyAuraProc(), and RestoreAllSpellMods().

◆ ResummonPetTemporaryUnSummonedIfAny()

void Player::ResummonPetTemporaryUnSummonedIfAny ( )
14182{
14184 return;
14185
14186 // not resummon in not appropriate state
14188 return;
14189
14190 if (GetPetGUID())
14191 return;
14192
14194 return;
14195
14196 Pet* newPet = new Pet(this);
14197 if (!newPet->LoadPetFromDB(this, 0, m_temporaryUnsummonedPetNumber, true))
14198 delete newPet;
14199
14201}
bool IsPetNeedBeTemporaryUnsummoned() const
Definition: Player.h:2394
uint32 GetLastPetSpell() const
Definition: Player.h:2436
bool CanResummonPet(uint32 spellid)
Definition: Player.cpp:14203

References CanResummonPet(), GetLastPetSpell(), Unit::GetPetGUID(), IsPetNeedBeTemporaryUnsummoned(), IsSpectator(), Pet::LoadPetFromDB(), and m_temporaryUnsummonedPetNumber.

Referenced by Unit::_ExitVehicle(), WorldSession::HandleMoveTeleportAck(), and WorldSession::HandleMoveWorldportAck().

◆ ResurectUsingRequestData()

void Player::ResurectUsingRequestData ( )

Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse

12774{
12777
12778 if (IsBeingTeleported())
12779 {
12781 return;
12782 }
12783
12784 ResurrectPlayer(0.0f, false);
12785
12788 else
12789 SetFullHealth();
12790
12793 else
12795
12796 SetPower(POWER_RAGE, 0);
12797
12799
12801}
void ScheduleDelayedOperation(uint32 operation)
Definition: Player.h:2076
float m_resurrectZ
Definition: Player.h:2806
uint32 m_resurrectMap
Definition: Player.h:2805
float m_resurrectX
Definition: Player.h:2806
float m_resurrectY
Definition: Player.h:2806

References DELAYED_RESURRECT_PLAYER, Unit::GetMaxHealth(), Unit::GetMaxPower(), Position::GetOrientation(), IsBeingTeleported(), m_resurrectHealth, m_resurrectMana, m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, POWER_ENERGY, POWER_MANA, POWER_RAGE, ResurrectPlayer(), ScheduleDelayedOperation(), Unit::SetFullHealth(), Unit::SetHealth(), Unit::SetPower(), SpawnCorpseBones(), and TeleportTo().

Referenced by WorldSession::HandleResurrectResponseOpcode().

◆ ResurrectPlayer()

void Player::ResurrectPlayer ( float  restore_percent,
bool  applySickness = false 
)
4417{
4418 WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // remove spirit healer position
4419 data << uint32(-1);
4420 data << float(0);
4421 data << float(0);
4422 data << float(0);
4423 GetSession()->SendPacket(&data);
4424
4425 // speed change, land walk
4426
4427 // remove death flag + set aura
4429 RemoveAurasDueToSpell(20584); // speed bonuses
4430 RemoveAurasDueToSpell(8326); // SPELL_AURA_GHOST
4431
4432 if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0))
4434
4435 setDeathState(DeathState::Alive);
4438 SetWaterWalking(false);
4439 m_deathTimer = 0;
4440
4441 // set health/powers (0- will be set in caller)
4442 if (restore_percent > 0.0f)
4443 {
4444 SetHealth(uint32(GetMaxHealth()*restore_percent));
4445 SetPower(POWER_MANA, uint32(GetMaxPower(POWER_MANA)*restore_percent));
4446 SetPower(POWER_RAGE, 0);
4448 }
4449
4450 // trigger update zone for alive state zone updates
4451 uint32 newzone, newarea;
4452 GetZoneAndAreaId(newzone, newarea);
4453 UpdateZone(newzone, newarea);
4454 sOutdoorPvPMgr->HandlePlayerResurrects(this, newzone);
4455
4456 if (Battleground* bg = GetBattleground())
4457 bg->HandlePlayerResurrect(this);
4458
4459 // update visibility
4461
4462 sScriptMgr->OnPlayerResurrect(this, restore_percent, applySickness);
4463
4464 if (!applySickness)
4465 {
4466 return;
4467 }
4468
4469 //Characters from level 1-10 are not affected by resurrection sickness.
4470 //Characters from level 11-19 will suffer from one minute of sickness
4471 //for each level they are above 10.
4472 //Characters level 20 and up suffer from ten minutes of sickness.
4473 int32 startLevel = sWorld->getIntConfig(CONFIG_DEATH_SICKNESS_LEVEL);
4474
4475 if (int32(GetLevel()) >= startLevel)
4476 {
4477 // set resurrection sickness
4478 CastSpell(this, 15007, true);
4479
4480 // not full duration
4481 if (int32(GetLevel()) < startLevel + 9)
4482 {
4483 int32 delta = (int32(GetLevel()) - startLevel + 1) * MINUTE;
4484
4485 if (Aura* aur = GetAura(15007, GetGUID()))
4486 {
4487 aur->SetDuration(delta * IN_MILLISECONDS);
4488 }
4489 }
4490 }
4491}
@ MOVE_LAND_WALK
Definition: Player.h:459
@ UNIT_BYTE1_FLAG_GROUND
Definition: UnitDefines.h:58
@ CONFIG_DEATH_SICKNESS_LEVEL
Definition: IWorld.h:309
void GetZoneAndAreaId(uint32 &zoneid, uint32 &areaid) const
Definition: Object.cpp:3157
void UpdateZone(uint32 newZone, uint32 newArea)
Definition: PlayerUpdates.cpp:1207
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: PlayerUpdates.cpp:1567

References Unit::CastSpell(), CONFIG_DEATH_SICKNESS_LEVEL, Unit::GetAura(), GetBattleground(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetMaxPower(), GetSession(), WorldObject::GetZoneAndAreaId(), IN_MILLISECONDS, m_deathTimer, MINUTE, MOVE_LAND_WALK, MOVE_UNROOT, POWER_ENERGY, POWER_MANA, POWER_RAGE, Unit::RemoveAurasDueToSpell(), WorldSession::SendPacket(), Object::SetByteValue(), setDeathState(), Object::SetDynamicFlag(), Unit::SetHealth(), SetMovement(), Unit::SetPower(), SetWaterWalking(), SMSG_DEATH_RELEASE_LOC, sOutdoorPvPMgr, sScriptMgr, sWorld, UNIT_BYTE1_FLAG_GROUND, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_DYNFLAG_REFER_A_FRIEND, UNIT_FIELD_BYTES_1, UpdateObjectVisibility(), and UpdateZone().

Referenced by Battleground::_ProcessResurrect(), Spell::EffectSelfResurrect(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleReclaimCorpseOpcode(), LoadCorpse(), LoadFromDB(), ProcessDelayedOperations(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), ResurectUsingRequestData(), BfGraveyard::Resurrect(), and WorldSession::SendSpiritResurrect().

◆ ResyncRunes()

void Player::ResyncRunes ( uint8  count)
13376{
13377 WorldPacket data(SMSG_RESYNC_RUNES, 4 + count * 2);
13378 data << uint32(count);
13379 for (uint32 i = 0; i < count; ++i)
13380 {
13381 data << uint8(GetCurrentRune(i)); // rune type
13382 data << uint8(255 - (GetRuneCooldown(i) * 51)); // passed cooldown time (0-255)
13383 }
13384 GetSession()->SendPacket(&data);
13385}
@ SMSG_RESYNC_RUNES
Definition: Opcodes.h:1189
RuneType GetCurrentRune(uint8 index) const
Definition: Player.h:2484

References GetCurrentRune(), GetRuneCooldown(), GetSession(), WorldSession::SendPacket(), and SMSG_RESYNC_RUNES.

◆ RewardExtraBonusTalentPoints()

void Player::RewardExtraBonusTalentPoints ( uint32  bonusTalentPoints)

A talent point boost. Usage: 1). Hot update situation (occurred when character is online, like PlayerScript:OnAchiComplete): Right after calling this function, character can reward talent points by calling function player->InitTalentForLevel().

2). Data initing situation (like PlayerScript:OnLoadFromDB)

6011{
6012 if (bonusTalentPoints)
6013 {
6014 m_extraBonusTalentCount += bonusTalentPoints;
6015 }
6016}

References m_extraBonusTalentCount.

◆ RewardHonor()

bool Player::RewardHonor ( Unit uVictim,
uint32  groupsize,
int32  honor = -1,
bool  awardXP = true 
)

Calculate the amount of honor gained based on the victim and the size of the group for which the honor is divided An exact honor value can also be given (overriding the calcs)

6022{
6023 // do not reward honor in arenas, but enable onkill spellproc
6024 if (InArena())
6025 {
6026 if (!uVictim || uVictim == this || !uVictim->IsPlayer())
6027 return false;
6028
6029 if (GetBgTeamId() == uVictim->ToPlayer()->GetBgTeamId())
6030 return false;
6031
6032 return true;
6033 }
6034
6035 // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
6037 return false;
6038
6039 /* check if player has same IP
6040 if (uVictim && uVictim->IsPlayer())
6041 {
6042 if (GetSession()->GetRemoteAddress() == uVictim->ToPlayer()->GetSession()->GetRemoteAddress())
6043 return false;
6044 }
6045 */
6046
6047 ObjectGuid victim_guid;
6048 uint32 victim_rank = 0;
6049
6050 // need call before fields update to have chance move yesterday data to appropriate fields before today data change.
6052
6053 // do not reward honor in arenas, but return true to enable onkill spellproc
6054 if (InArena())
6055 return true;
6056
6057 // Promote to float for calculations
6058 float honor_f = (float)honor;
6059
6060 if (honor_f <= 0)
6061 {
6062 if (!uVictim || uVictim == this || uVictim->HasAuraType(SPELL_AURA_NO_PVP_CREDIT))
6063 return false;
6064
6065 victim_guid = uVictim->GetGUID();
6066
6067 if (uVictim->IsPlayer())
6068 {
6069 Player* victim = uVictim->ToPlayer();
6070
6071 if (GetTeamId() == victim->GetTeamId() && !sWorld->IsFFAPvPRealm())
6072 return false;
6073
6074 uint8 k_level = GetLevel();
6075 uint8 k_grey = Acore::XP::GetGrayLevel(k_level);
6076 uint8 v_level = victim->GetLevel();
6077
6078 if (v_level <= k_grey)
6079 return false;
6080
6081 // PLAYER_CHOSEN_TITLE VALUES DESCRIPTION
6082 // [0] Just name
6083 // [1..14] Alliance honor titles and player name
6084 // [15..28] Horde honor titles and player name
6085 // [29..38] Other title and player name
6086 // [39+] Nothing
6087 uint32 victim_title = victim->GetUInt32Value(PLAYER_CHOSEN_TITLE);
6088 uint32 killer_title = 0;
6089 sScriptMgr->OnVictimRewardBefore(this, victim, killer_title, victim_title);
6090 // Get Killer titles, CharTitlesEntry::bit_index
6091 // Ranks:
6092 // title[1..14] -> rank[5..18]
6093 // title[15..28] -> rank[5..18]
6094 // title[other] -> 0
6095 if (victim_title == 0)
6096 victim_guid.Clear(); // Don't show HK: <rank> message, only log.
6097 else if (victim_title < 15)
6098 victim_rank = victim_title + 4;
6099 else if (victim_title < 29)
6100 victim_rank = victim_title - 14 + 4;
6101 else
6102 victim_guid.Clear(); // Don't show HK: <rank> message, only log.
6103
6104 honor_f = std::ceil(Acore::Honor::hk_honor_at_level_f(k_level) * (v_level - k_grey) / (k_level - k_grey));
6105
6106 // count the number of playerkills in one day
6108 // and those in a lifetime
6116 sScriptMgr->OnVictimRewardAfter(this, victim, killer_title, victim_rank, honor_f);
6117 }
6118 else
6119 {
6120 if (!uVictim->ToCreature()->IsRacialLeader())
6121 return false;
6122
6123 honor_f = 100.0f; // ??? need more info
6124 victim_rank = 19; // HK: Leader
6125 }
6126 }
6127
6128 if (uVictim)
6129 {
6130 if (groupsize > 1)
6131 honor_f /= groupsize;
6132
6133 // apply honor multiplier from aura (not stacking-get highest)
6135 }
6136
6137 honor_f *= sWorld->getRate(RATE_HONOR);
6138 // Back to int now
6139 honor = int32(honor_f);
6140 // honor - for show honor points in log
6141 // victim_guid - for show victim name in log
6142 // victim_rank [1..4] HK: <dishonored rank>
6143 // victim_rank [5..19] HK: <alliance\horde rank>
6144 // victim_rank [0, 20+] HK: <>
6145 WorldPacket data(SMSG_PVP_CREDIT, 4 + 8 + 4);
6146 data << honor;
6147 data << victim_guid;
6148 data << victim_rank;
6149
6150 // Xinef: non quest case, quest honor obtain is send in quest reward packet
6151 if (uVictim || groupsize > 0)
6152 GetSession()->SendPacket(&data);
6153
6154 // add honor points
6155 ModifyHonorPoints(honor);
6156
6158
6159 // Xinef: Battleground experience
6160 if (awardXP)
6161 if (Battleground* bg = GetBattleground())
6162 {
6163 bg->UpdatePlayerScore(this, SCORE_BONUS_HONOR, honor, false); //false: prevent looping
6164 // Xinef: Only for BG activities
6165 if (!uVictim)
6166 {
6167 uint32 xp = uint32(honor * (3 + GetLevel() * 0.30f));
6168 sScriptMgr->OnGivePlayerXP(this, xp, nullptr, PlayerXPSource::XPSOURCE_BATTLEGROUND);
6169 GiveXP(xp, nullptr);
6170 }
6171 }
6172
6173 if (sWorld->getBoolConfig(CONFIG_PVP_TOKEN_ENABLE))
6174 {
6175 if (!uVictim || uVictim == this || uVictim->HasAuraType(SPELL_AURA_NO_PVP_CREDIT))
6176 return true;
6177
6178 if (uVictim->IsPlayer())
6179 {
6180 // Check if allowed to receive it in current map
6182 if ((MapType == 1 && !InBattleground() && !IsFFAPvP())
6183 || (MapType == 2 && !IsFFAPvP())
6184 || (MapType == 3 && !InBattleground()))
6185 return true;
6186
6187 uint32 itemID = sWorld->getIntConfig(CONFIG_PVP_TOKEN_ID);
6188 int32 count = sWorld->getIntConfig(CONFIG_PVP_TOKEN_COUNT);
6189
6190 if (AddItem(itemID, count))
6191 ChatHandler(GetSession()).PSendSysMessage("You have been awarded a token for slaying another player.");
6192 }
6193 }
6194
6195 return true;
6196}
@ SPELL_AURA_MOD_HONOR_GAIN_PCT
Definition: SpellAuraDefines.h:344
@ SPELL_AURA_NO_PVP_CREDIT
Definition: SpellAuraDefines.h:222
@ SCORE_BONUS_HONOR
Definition: BattlegroundScore.h:32
@ SPELL_AURA_PLAYER_INACTIVE
Definition: Battleground.h:140
@ CONFIG_PVP_TOKEN_MAP_TYPE
Definition: IWorld.h:338
@ CONFIG_PVP_TOKEN_ID
Definition: IWorld.h:339
@ CONFIG_PVP_TOKEN_COUNT
Definition: IWorld.h:340
@ CONFIG_PVP_TOKEN_ENABLE
Definition: IWorld.h:134
@ RATE_HONOR
Definition: IWorld.h:509
@ ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL
Definition: DBCEnums.h:219
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL
Definition: DBCEnums.h:149
@ ACHIEVEMENT_CRITERIA_TYPE_HK_RACE
Definition: DBCEnums.h:167
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA
Definition: DBCEnums.h:145
@ ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL
Definition: DBCEnums.h:182
@ ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS
Definition: DBCEnums.h:166
@ SMSG_PVP_CREDIT
Definition: Opcodes.h:682
std::unordered_map< std::string, Player * > MapType
Definition: ObjectAccessor.cpp:88
float hk_honor_at_level_f(uint8 level, float multiplier=1.0f)
Definition: Formulas.h:31
bool IsRacialLeader() const
Definition: Creature.h:76
void Clear()
Definition: ObjectGuid.h:138
bool AddItem(uint32 itemId, uint32 count)
Definition: Player.cpp:15510
bool IsFFAPvP()
Definition: Player.cpp:16170
TeamId GetBgTeamId() const
Definition: Player.h:2255
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition: Unit.cpp:5889

References ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, AddItem(), AddPct(), Object::ApplyModUInt32Value(), ObjectGuid::Clear(), CONFIG_PVP_TOKEN_COUNT, CONFIG_PVP_TOKEN_ENABLE, CONFIG_PVP_TOKEN_ID, CONFIG_PVP_TOKEN_MAP_TYPE, WorldObject::GetAreaId(), GetBattleground(), GetBgTeamId(), Unit::getClass(), Acore::XP::GetGrayLevel(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxPositiveAuraModifier(), Unit::getRace(), GetSession(), GetTeamId(), Object::GetUInt32Value(), GiveXP(), Unit::HasAura(), Unit::HasAuraType(), Acore::Honor::hk_honor_at_level_f(), InArena(), InBattleground(), IsFFAPvP(), Object::IsPlayer(), Creature::IsRacialLeader(), ModifyHonorPoints(), PLAYER_CHOSEN_TITLE, PLAYER_FIELD_KILLS, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, ChatHandler::PSendSysMessage(), RATE_HONOR, SCORE_BONUS_HONOR, WorldSession::SendPacket(), SMSG_PVP_CREDIT, SPELL_AURA_MOD_HONOR_GAIN_PCT, SPELL_AURA_NO_PVP_CREDIT, SPELL_AURA_PLAYER_INACTIVE, sScriptMgr, sWorld, Object::ToCreature(), Object::ToPlayer(), UpdateAchievementCriteria(), and UpdateHonorFields().

Referenced by KillRewarder::_RewardHonor(), DuelComplete(), Spell::EffectAddHonor(), OutdoorPvPSI::HandleAreaTrigger(), honor_commandscript::HandleHonorAddCommand(), honor_commandscript::HandleHonorAddKillCommand(), RewardQuest(), and Battleground::UpdatePlayerScore().

◆ RewardPlayerAndGroupAtEvent()

void Player::RewardPlayerAndGroupAtEvent ( uint32  creature_id,
WorldObject pRewardSource 
)
12683{
12684 if (!pRewardSource)
12685 return;
12686
12687 ObjectGuid creature_guid = (pRewardSource->IsCreature()) ? pRewardSource->GetGUID() : ObjectGuid::Empty;
12688
12689 // prepare data for near group iteration
12690 if (Group* group = GetGroup())
12691 {
12692 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12693 {
12694 Player* player = itr->GetSource();
12695 if (!player)
12696 continue;
12697
12698 if (!player->IsAtGroupRewardDistance(pRewardSource))
12699 continue; // member (alive or dead) or his corpse at req. distance
12700
12701 // quest objectives updated only for alive group member or dead but with not released body
12702 if (player->IsAlive() || !player->GetCorpse())
12703 player->KilledMonsterCredit(creature_id, creature_guid);
12704 }
12705 }
12706 else // if (!group)
12707 KilledMonsterCredit(creature_id, creature_guid);
12708}

References ObjectGuid::Empty, GetCorpse(), GetGroup(), Object::GetGUID(), Unit::IsAlive(), IsAtGroupRewardDistance(), Object::IsCreature(), KilledMonsterCredit(), and GroupReference::next().

Referenced by Spell::EffectKillCredit(), spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), SmartScript::ProcessAction(), and SmartAI::StopFollow().

◆ RewardPlayerAndGroupAtKill()

void Player::RewardPlayerAndGroupAtKill ( Unit victim,
bool  isBattleGround 
)
12678{
12679 KillRewarder(this, victim, isBattleGround).Reward();
12680}
Definition: KillRewarder.h:28
void Reward()
Definition: KillRewarder.cpp:268

References KillRewarder::Reward().

Referenced by Unit::Kill(), and Battleground::RewardXPAtKill().

◆ RewardQuest()

void Player::RewardQuest ( Quest const *  quest,
uint32  reward,
Object questGiver,
bool  announce = true,
bool  isLFGReward = false 
)
659{
660 //this THING should be here to protect code from quest, which cast on player far teleport as a reward
661 //should work fine, cause far teleport will be executed in Player::Update()
663
664 uint32 quest_id = quest->GetQuestId();
665
666 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
667 {
668 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
669 {
670 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM && !quest->IsRepeatable() && !HasQuestForItem(quest->RequiredItemId[i], quest_id, true))
671 DestroyItemCount(quest->RequiredItemId[i], 9999, true);
672 else
673 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
674 }
675 }
676 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
677 {
678 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
679 {
680 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM && !quest->IsRepeatable() && !HasQuestForItem(quest->ItemDrop[i], quest_id))
681 DestroyItemCount(quest->ItemDrop[i], 9999, true);
682 else
683 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
684 }
685 }
686
687 RemoveTimedQuest(quest_id);
688
689 std::vector<std::pair<uint32, uint32>> problematicItems;
690
691 if (quest->GetRewChoiceItemsCount())
692 {
693 if (uint32 itemId = quest->RewardChoiceItemId[reward])
694 {
695 ItemPosCountVec dest;
696 if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardChoiceItemCount[reward]) == EQUIP_ERR_OK)
697 {
698 Item* item = StoreNewItem(dest, itemId, true);
699 SendNewItem(item, quest->RewardChoiceItemCount[reward], true, false, false, false);
700
701 sScriptMgr->OnQuestRewardItem(this, item, quest->RewardChoiceItemCount[reward]);
702 }
703 else
704 {
705 problematicItems.emplace_back(itemId, quest->RewardChoiceItemCount[reward]);
706 }
707 }
708 }
709
710 if (quest->GetRewItemsCount())
711 {
712 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
713 {
714 if (uint32 itemId = quest->RewardItemId[i])
715 {
716 ItemPosCountVec dest;
717 if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardItemIdCount[i]) == EQUIP_ERR_OK)
718 {
719 Item* item = StoreNewItem(dest, itemId, true);
720 SendNewItem(item, quest->RewardItemIdCount[i], true, false, false, false);
721
722 sScriptMgr->OnQuestRewardItem(this, item, quest->RewardItemIdCount[i]);
723 }
724 else
725 problematicItems.emplace_back(itemId, quest->RewardItemIdCount[i]);
726 }
727 }
728 }
729
730 // Xinef: send items that couldn't be added properly by mail
731 if (!problematicItems.empty())
732 {
733 SendItemRetrievalMail(problematicItems);
734 }
735
736 RewardReputation(quest);
737
738 uint16 log_slot = FindQuestSlot(quest_id);
739 if (log_slot < MAX_QUEST_LOG_SIZE)
740 SetQuestSlot(log_slot, 0);
741
742 bool rewarded = IsQuestRewarded(quest_id) && !quest->IsDFQuest();
743
744 // Not give XP in case already completed once repeatable quest
745 uint32 XP = rewarded ? 0 : CalculateQuestRewardXP(quest);
746
747 sScriptMgr->OnQuestComputeXP(this, quest, XP);
748 int32 moneyRew = 0;
749 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || sScriptMgr->ShouldBeRewardedWithMoneyInsteadOfExp(this))
750 {
751 moneyRew = quest->GetRewMoneyMaxLevel();
752 }
753 else
754 {
755 sScriptMgr->OnGivePlayerXP(this, XP, nullptr, isLFGReward ? PlayerXPSource::XPSOURCE_QUEST_DF : PlayerXPSource::XPSOURCE_QUEST);
756 GiveXP(XP, nullptr, 1.0f, isLFGReward);
757 }
758
759 // Give player extra money if GetRewOrReqMoney > 0 and get ReqMoney if negative
760 if (int32 rewOrReqMoney = quest->GetRewOrReqMoney(GetLevel()))
761 {
762 moneyRew += rewOrReqMoney;
763 }
764
765 if (moneyRew)
766 {
767 ModifyMoney(moneyRew);
768
769 if (moneyRew > 0)
771 }
772
773 // honor reward
774 if (uint32 honor = quest->CalculateHonorGain(GetLevel()))
775 RewardHonor(nullptr, 0, honor);
776
777 // title reward
778 if (quest->GetCharTitleId())
779 {
780 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(quest->GetCharTitleId()))
781 SetTitle(titleEntry);
782 }
783
784 if (quest->GetBonusTalents())
785 {
786 m_questRewardTalentCount += quest->GetBonusTalents();
788 }
789
790 if (quest->GetRewArenaPoints())
791 ModifyArenaPoints(quest->GetRewArenaPoints());
792
793 // Send reward mail
794 if (uint32 mail_template_id = quest->GetRewMailTemplateId())
795 {
796 //- TODO: Poor design of mail system
797 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
798 if (quest->GetRewMailSenderEntry() != 0)
799 MailDraft(mail_template_id).SendMailTo(trans, this, quest->GetRewMailSenderEntry(), MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
800 else
801 MailDraft(mail_template_id).SendMailTo(trans, this, questGiver, MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
802 CharacterDatabase.CommitTransaction(trans);
803 }
804
805 if (quest->IsDaily() || quest->IsDFQuest())
806 {
807 SetDailyQuestStatus(quest_id);
808 if (quest->IsDaily())
809 {
812 }
813 }
814 else if (quest->IsWeekly())
815 SetWeeklyQuestStatus(quest_id);
816 else if (quest->IsMonthly())
817 SetMonthlyQuestStatus(quest_id);
818 else if (quest->IsSeasonal())
819 SetSeasonalQuestStatus(quest_id);
820
821 RemoveActiveQuest(quest_id, false);
822 m_RewardedQuests.insert(quest_id);
823 m_RewardedQuestsSave[quest_id] = true;
824
825 if (announce)
826 SendQuestReward(quest, XP);
827
828 // cast spells after mark quest complete (some spells have quest completed state requirements in spell_area data)
829 if (quest->GetRewSpellCast() > 0)
830 {
831 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast());
832 if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
833 {
834 if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
835 creature->CastSpell(this, quest->GetRewSpellCast(), true);
836 }
837 else
838 CastSpell(this, quest->GetRewSpellCast(), true);
839 }
840 else if (quest->GetRewSpell() > 0)
841 {
842 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell());
843 if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
844 {
845 if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
846 creature->CastSpell(this, quest->GetRewSpell(), true);
847 }
848 else
849 CastSpell(this, quest->GetRewSpell(), true);
850 }
851
852 if (quest->GetZoneOrSort() > 0)
856
857 // pussywizard: replaced partial save with full save
858 SaveToDB(false, false);
859
860 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
861 {
864 }
865
866 SendQuestUpdate(quest_id);
867
869
870 //lets remove flag for delayed teleports
872
873 // Xinef: area auras may change on quest completion!
876
877 sScriptMgr->OnPlayerCompleteQuest(this, quest);
878}
@ MAIL_CHECK_MASK_HAS_BODY
Definition: Mail.h:52
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE
Definition: DBCEnums.h:129
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY
Definition: DBCEnums.h:128
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT
Definition: DBCEnums.h:127
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST
Definition: DBCEnums.h:131
@ ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD
Definition: DBCEnums.h:175
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST
Definition: DBCEnums.h:141
@ SPELL_EFFECT_CREATE_ITEM
Definition: SharedDefines.h:802
bool IsUnit() const
Definition: Object.h:205
bool IsInHostileArea
Definition: Player.h:361
bool HasPvPForcingQuest() const
Definition: PlayerQuest.cpp:2489
bool HasQuestForItem(uint32 itemId, uint32 excludeQuestId=0, bool turnIn=false, bool *showInLoot=nullptr) const
Definition: PlayerQuest.cpp:2258
uint32 CalculateQuestRewardXP(Quest const *quest)
Definition: PlayerQuest.cpp:1396
void SetMonthlyQuestStatus(uint32 quest_id)
Definition: Player.cpp:12101
void SetSeasonalQuestStatus(uint32 quest_id)
Definition: Player.cpp:12091
void SendItemRetrievalMail(uint32 itemEntry, uint32 count)
Definition: PlayerMisc.cpp:439
void SendQuestReward(Quest const *quest, uint32 XP)
Definition: PlayerQuest.cpp:2351
void SetDailyQuestStatus(uint32 quest_id)
Definition: Player.cpp:12043
void RewardReputation(Unit *victim)
Definition: Player.cpp:5906
void SetWeeklyQuestStatus(uint32 quest_id)
Definition: Player.cpp:12085
void RemoveActiveQuest(uint32 questId, bool update=true)
Definition: PlayerQuest.cpp:1489
void SetMustDelayTeleport(bool setting)
Definition: Player.h:2909
bool IsSelfCast() const
Definition: SpellInfo.cpp:1089

References ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD, BIND_QUEST_ITEM, Quest::CalculateHonorGain(), CalculateQuestRewardXP(), CanStoreNewItem(), Unit::CastSpell(), CharacterDatabase, CONFIG_MAX_PLAYER_LEVEL, DestroyItemCount(), EQUIP_ERR_OK, FindQuestSlot(), WorldObject::GetAreaId(), Quest::GetBonusTalents(), Quest::GetCharTitleId(), Object::GetGUID(), Unit::GetLevel(), WorldObject::GetMap(), Quest::GetQuestId(), Quest::GetRewArenaPoints(), Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), Quest::GetRewMailDelaySecs(), Quest::GetRewMailSenderEntry(), Quest::GetRewMailTemplateId(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), Quest::GetRewSpell(), Quest::GetRewSpellCast(), WorldObject::GetZoneId(), Quest::GetZoneOrSort(), GiveXP(), SpellInfo::HasEffect(), Quest::HasFlag(), HasPvPForcingQuest(), HasQuestForItem(), InitTalentForLevel(), Quest::IsDaily(), Quest::IsDFQuest(), PvPInfo::IsHostile, PvPInfo::IsInHostileArea, Quest::IsMonthly(), IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), SpellInfo::IsSelfCast(), Object::IsUnit(), Quest::IsWeekly(), Quest::ItemDrop, Quest::ItemDropQuantity, m_questRewardTalentCount, m_RewardedQuests, m_RewardedQuestsSave, MAIL_CHECK_MASK_HAS_BODY, MAX_QUEST_LOG_SIZE, ModifyArenaPoints(), ModifyMoney(), NULL_BAG, NULL_SLOT, pvpInfo, QUEST_FLAGS_FLAGS_PVP, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, RemoveActiveQuest(), RemoveTimedQuest(), Quest::RequiredItemCount, Quest::RequiredItemId, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, RewardHonor(), Quest::RewardItemId, Quest::RewardItemIdCount, RewardReputation(), SaveToDB(), sCharTitlesStore, SendItemRetrievalMail(), MailDraft::SendMailTo(), SendNewItem(), SendQuestGiverStatusMultiple(), SendQuestReward(), SendQuestUpdate(), SetDailyQuestStatus(), SetMonthlyQuestStatus(), SetMustDelayTeleport(), SetQuestSlot(), SetSeasonalQuestStatus(), SetTitle(), SetWeeklyQuestStatus(), sObjectMgr, SPELL_EFFECT_CREATE_ITEM, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, StoreNewItem(), sWorld, UpdateAchievementCriteria(), UpdateAreaDependentAuras(), UpdatePvPState(), and UpdateZoneDependentAuras().

Referenced by CompleteQuest(), lfg::LFGMgr::FinishDungeon(), and WorldSession::HandleQuestgiverChooseRewardOpcode().

◆ RewardReputation() [1/2]

void Player::RewardReputation ( Quest const *  quest)
5957{
5958 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
5959 {
5960 if (!quest->RewardFactionId[i])
5961 continue;
5962
5963 float rep = 0.f;
5964
5965 if (quest->RewardFactionValueIdOverride[i])
5966 {
5967 rep = quest->RewardFactionValueIdOverride[i] / 100.f;
5968 }
5969 else
5970 {
5971 uint32 row = ((quest->RewardFactionValueId[i] < 0) ? 1 : 0) + 1;
5972 if (QuestFactionRewEntry const* questFactionRewEntry = sQuestFactionRewardStore.LookupEntry(row))
5973 {
5974 uint32 field = std::abs(quest->RewardFactionValueId[i]);
5975 rep = static_cast<float>(questFactionRewEntry->QuestRewFactionValue[field]);
5976 }
5977 }
5978
5979 if (rep == 0.f)
5980 continue;
5981
5982 if (quest->IsDaily())
5983 {
5984 rep = CalculateReputationGain(REPUTATION_SOURCE_DAILY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5985 }
5986 else if (quest->IsWeekly())
5987 {
5988 rep = CalculateReputationGain(REPUTATION_SOURCE_WEEKLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5989 }
5990 else if (quest->IsMonthly())
5991 {
5992 rep = CalculateReputationGain(REPUTATION_SOURCE_MONTHLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5993 }
5994 else if (quest->IsRepeatable())
5995 {
5996 rep = CalculateReputationGain(REPUTATION_SOURCE_REPEATABLE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5997 }
5998 else
5999 {
6000 rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6001 }
6002
6003 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->RewardFactionId[i]))
6004 {
6005 GetReputationMgr().ModifyReputation(factionEntry, rep, quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER));
6006 }
6007 }
6008}
DBCStorage< QuestFactionRewEntry > sQuestFactionRewardStore(QuestFactionRewardfmt)
#define QUEST_REPUTATIONS_COUNT
Definition: QuestDef.h:41
@ QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER
Definition: QuestDef.h:166
float CalculateReputationGain(ReputationSource source, uint32 creatureOrQuestLevel, float rep, int32 faction, bool noQuestBonus=false)
Definition: Player.cpp:5826
bool ModifyReputation(FactionEntry const *factionEntry, float standing, bool noSpillOver=false, Optional< ReputationRank > repMaxCap={})
Definition: ReputationMgr.h:118
Definition: DBCStructure.h:1458

References CalculateReputationGain(), GetQuestLevel(), GetReputationMgr(), Quest::HasSpecialFlag(), Quest::IsDaily(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), ReputationMgr::ModifyReputation(), QUEST_REPUTATIONS_COUNT, QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER, REPUTATION_SOURCE_DAILY_QUEST, REPUTATION_SOURCE_MONTHLY_QUEST, REPUTATION_SOURCE_QUEST, REPUTATION_SOURCE_REPEATABLE_QUEST, REPUTATION_SOURCE_WEEKLY_QUEST, Quest::RewardFactionId, Quest::RewardFactionValueId, Quest::RewardFactionValueIdOverride, sFactionStore, and sQuestFactionRewardStore.

◆ RewardReputation() [2/2]

void Player::RewardReputation ( Unit victim)
5907{
5908 if (!victim || victim->IsPlayer())
5909 return;
5910
5911 if (victim->ToCreature()->IsReputationGainDisabled())
5912 return;
5913
5914 ReputationOnKillEntry const* Rep = sObjectMgr->GetReputationOnKilEntry(victim->ToCreature()->GetCreatureTemplate()->Entry);
5915 if (!Rep)
5916 return;
5917
5918 uint32 ChampioningFaction = 0;
5919
5921 {
5922 // support for: Championing - http://www.wowwiki.com/Championing
5923 Map const* map = GetMap();
5924 if (map->IsNonRaidDungeon())
5925 if (LFGDungeonEntry const* dungeon = GetLFGDungeon(map->GetId(), map->GetDifficulty()))
5926 if (dungeon->TargetLevel == 80)
5927 ChampioningFaction = GetChampioningFaction();
5928 }
5929
5930 TeamId teamId = GetTeamId(true); // Always check player original reputation when rewarding
5931
5932 if (Rep->RepFaction1 && (!Rep->TeamDependent || teamId == TEAM_ALLIANCE))
5933 {
5934 float donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast<float>(Rep->RepValue1), ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
5935
5936 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
5937 if (factionEntry1)
5938 {
5939 GetReputationMgr().ModifyReputation(factionEntry1, donerep1, false, static_cast<ReputationRank>(Rep->ReputationMaxCap1));
5940 }
5941 }
5942
5943 if (Rep->RepFaction2 && (!Rep->TeamDependent || teamId == TEAM_HORDE))
5944 {
5945 float donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast<float>(Rep->RepValue2), ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
5946
5947 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
5948 if (factionEntry2)
5949 {
5950 GetReputationMgr().ModifyReputation(factionEntry2, donerep2, false, static_cast<ReputationRank>(Rep->ReputationMaxCap2));
5951 }
5952 }
5953}
LFGDungeonEntry const * GetLFGDungeon(uint32 mapId, Difficulty difficulty)
Returns LFGDungeonEntry for a specific map and difficulty. Will return first found entry if multiple ...
Definition: DBCStores.cpp:852
TeamId
Definition: SharedDefines.h:759
bool IsReputationGainDisabled() const
Definition: Creature.h:361
uint32 Entry
Definition: CreatureData.h:190
uint32 GetChampioningFaction() const
Definition: Player.h:2527
Definition: ObjectMgr.h:568
uint32 ReputationMaxCap1
Definition: ObjectMgr.h:571
float RepValue1
Definition: ObjectMgr.h:572
uint32 RepFaction1
Definition: ObjectMgr.h:569
uint32 RepFaction2
Definition: ObjectMgr.h:570
bool TeamDependent
Definition: ObjectMgr.h:577
float RepValue2
Definition: ObjectMgr.h:574
uint32 ReputationMaxCap2
Definition: ObjectMgr.h:573
bool IsNonRaidDungeon() const
Definition: Map.h:449
Definition: DBCStructure.h:1245

References CalculateReputationGain(), CreatureTemplate::Entry, GetChampioningFaction(), Creature::GetCreatureTemplate(), Map::GetDifficulty(), Map::GetId(), Unit::GetLevel(), GetLFGDungeon(), WorldObject::GetMap(), GetReputationMgr(), GetTeamId(), Map::IsNonRaidDungeon(), Object::IsPlayer(), Creature::IsReputationGainDisabled(), ReputationMgr::ModifyReputation(), ReputationOnKillEntry::RepFaction1, ReputationOnKillEntry::RepFaction2, REPUTATION_SOURCE_KILL, ReputationOnKillEntry::ReputationMaxCap1, ReputationOnKillEntry::ReputationMaxCap2, ReputationOnKillEntry::RepValue1, ReputationOnKillEntry::RepValue2, sFactionStore, sObjectMgr, TEAM_ALLIANCE, TEAM_HORDE, ReputationOnKillEntry::TeamDependent, and Object::ToCreature().

Referenced by KillRewarder::_RewardReputation(), and RewardQuest().

◆ Satisfy()

bool Player::Satisfy ( DungeonProgressionRequirements const *  ar,
uint32  target_map,
bool  report = false 
)
6721{
6722 if (!IsGameMaster() && ar)
6723 {
6724 uint8 LevelMin = 0;
6725 uint8 LevelMax = 0;
6726
6727 MapEntry const* mapEntry = sMapStore.LookupEntry(target_map);
6728 if (!mapEntry)
6729 return false;
6730
6731 if (!sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_LEVEL))
6732 {
6733 if (ar->levelMin && GetLevel() < ar->levelMin)
6734 LevelMin = ar->levelMin;
6735 if (ar->levelMax && GetLevel() > ar->levelMax)
6736 LevelMax = ar->levelMax;
6737 }
6738
6739 if (DisableMgr::IsDisabledFor(DISABLE_TYPE_MAP, target_map, this))
6740 {
6742 return false;
6743 }
6744
6745 Player* partyLeader = this;
6746 std::string leaderName = m_session->GetAcoreString(LANG_YOU);
6747 {
6748 ObjectGuid leaderGuid = GetGroup() ? GetGroup()->GetLeaderGUID() : GetGUID();
6749 Player* tempLeader = HashMapHolder<Player>::Find(leaderGuid);
6750 if (leaderGuid != GetGUID())
6751 {
6752 if (tempLeader != nullptr)
6753 {
6754 partyLeader = tempLeader;
6755 }
6756 leaderName = GetGroup()->GetLeaderName();
6757 }
6758 }
6759
6760 //Check all items
6761 std::vector<const ProgressionRequirement*> missingPlayerItems;
6762 std::vector<const ProgressionRequirement*> missingLeaderItems;
6763 for (const ProgressionRequirement* itemRequirement : ar->items)
6764 {
6765 Player* checkPlayer = this;
6766 std::vector<const ProgressionRequirement*>* missingItems = &missingPlayerItems;
6767 if (itemRequirement->checkLeaderOnly)
6768 {
6769 checkPlayer = partyLeader;
6770 missingItems = &missingLeaderItems;
6771 }
6772
6773 if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == checkPlayer->GetTeamId(true))
6774 {
6775 if (!checkPlayer->HasItemCount(itemRequirement->id, 1))
6776 {
6777 missingItems->push_back(itemRequirement);
6778 }
6779 }
6780 }
6781
6782 //Check all achievements
6783 std::vector<const ProgressionRequirement*> missingPlayerAchievements;
6784 std::vector<const ProgressionRequirement*> missingLeaderAchievements;
6785 for (const ProgressionRequirement* achievementRequirement : ar->achievements)
6786 {
6787 Player* checkPlayer = this;
6788 std::vector<const ProgressionRequirement*>* missingAchievements = &missingPlayerAchievements;
6789 if (achievementRequirement->checkLeaderOnly)
6790 {
6791 checkPlayer = partyLeader;
6792 missingAchievements = &missingLeaderAchievements;
6793 }
6794
6795 if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == GetTeamId(true))
6796 {
6797 if (!checkPlayer || !checkPlayer->HasAchieved(achievementRequirement->id))
6798 {
6799 missingAchievements->push_back(achievementRequirement);
6800 }
6801 }
6802 }
6803
6804 //Check all quests
6805 std::vector<const ProgressionRequirement*> missingPlayerQuests;
6806 std::vector<const ProgressionRequirement*> missingLeaderQuests;
6807 for (const ProgressionRequirement* questRequirement : ar->quests)
6808 {
6809 Player* checkPlayer = this;
6810 std::vector<const ProgressionRequirement*>* missingQuests = &missingPlayerQuests;
6811 if (questRequirement->checkLeaderOnly)
6812 {
6813 checkPlayer = partyLeader;
6814 missingQuests = &missingLeaderQuests;
6815 }
6816
6817 if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == checkPlayer->GetTeamId(true))
6818 {
6819 if (!checkPlayer->GetQuestRewardStatus(questRequirement->id))
6820 {
6821 missingQuests->push_back(questRequirement);
6822 }
6823 }
6824 }
6825
6826 //Check if avg ILVL requirement is allowed
6827 bool ilvlRequirementNotMet = false;
6829 {
6830 const int32 currentIlvl = (int32)GetAverageItemLevelForDF();
6831 if (ar->reqItemLevel > currentIlvl)
6832 {
6833 ilvlRequirementNotMet = true;
6834 }
6835 }
6836
6837 Difficulty target_difficulty = GetDifficulty(mapEntry->IsRaid());
6838 MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty);
6839 if (LevelMin || LevelMax || ilvlRequirementNotMet
6840 || missingPlayerItems.size() || missingPlayerQuests.size() || missingPlayerAchievements.size()
6841 || missingLeaderItems.size() || missingLeaderQuests.size() || missingLeaderAchievements.size())
6842 {
6843 if (!sScriptMgr->NotAvoidSatisfy(partyLeader, ar, target_map, report))
6844 return true;
6845
6846 if (report)
6847 {
6848 uint8 requirementPrintMode = sWorld->getIntConfig(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE);
6849
6850 if (requirementPrintMode == 0)
6851 {
6852 //Just print out the requirements are not met
6854 }
6855 else if (requirementPrintMode == 1)
6856 {
6857 //Blizzlike method of printing out the requirements
6858 if (missingPlayerQuests.size() && !missingPlayerQuests[0]->note.empty())
6859 {
6860 ChatHandler(GetSession()).PSendSysMessage("{}", missingPlayerQuests[0]->note);
6861 }
6862 else if (missingLeaderQuests.size() && !missingLeaderQuests[0]->note.empty())
6863 {
6864 ChatHandler(GetSession()).PSendSysMessage("{}", missingLeaderQuests[0]->note);
6865 }
6866 else if (mapDiff->hasErrorMessage)
6867 {
6868 // if (missingAchievement) covered by this case
6869 SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
6870 }
6871 else if (missingPlayerItems.size())
6872 {
6874 std::string name = sObjectMgr->GetItemTemplate(missingPlayerItems[0]->id)->Name1;
6875 if (ItemLocale const* il = sObjectMgr->GetItemLocale(missingPlayerItems[0]->id))
6876 {
6877 ObjectMgr::GetLocaleString(il->Name, loc_idx, name);
6878 }
6880 }
6881 else if (LevelMin)
6882 {
6884 }
6885 else if (ilvlRequirementNotMet)
6886 {
6888 }
6889 }
6890 else
6891 {
6892 bool errorAlreadyPrinted = false;
6893 //Pretty way of printing out requirements
6894 if (missingPlayerQuests.size())
6895 {
6897 PrettyPrintRequirementsQuestList(missingPlayerQuests);
6898 errorAlreadyPrinted = true;
6899 }
6900 if (missingLeaderQuests.size())
6901 {
6903 PrettyPrintRequirementsQuestList(missingLeaderQuests);
6904 errorAlreadyPrinted = true;
6905 }
6906
6907 if (missingPlayerAchievements.size())
6908 {
6910 PrettyPrintRequirementsAchievementsList(missingPlayerAchievements);
6911 errorAlreadyPrinted = true;
6912 }
6913 if (missingLeaderAchievements.size())
6914 {
6916 PrettyPrintRequirementsAchievementsList(missingLeaderAchievements);
6917 errorAlreadyPrinted = true;
6918 }
6919
6920 if (missingPlayerItems.size())
6921 {
6923 PrettyPrintRequirementsItemsList(missingPlayerItems);
6924 errorAlreadyPrinted = true;
6925 }
6926
6927 if (missingLeaderItems.size())
6928 {
6930 PrettyPrintRequirementsItemsList(missingLeaderItems);
6931 errorAlreadyPrinted = true;
6932 }
6933
6934 if (ilvlRequirementNotMet)
6935 {
6937 }
6938
6939 if (LevelMin)
6940 {
6942 }
6943 else if (LevelMax)
6944 {
6946 }
6947 else if (mapDiff->hasErrorMessage && !errorAlreadyPrinted)
6948 {
6949 SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
6950 }
6951 }
6952
6953 //Print the extra string
6955 if (optionalStringID > 0)
6956 {
6957 ChatHandler(GetSession()).SendSysMessage(optionalStringID);
6958 }
6959 }
6960 return false;
6961 }
6962 }
6963 return true;
6964}
MapDifficulty const * GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty)
Definition: DBCStores.cpp:767
@ TRANSFER_ABORT_DIFFICULTY
Definition: Player.h:790
@ DISABLE_TYPE_MAP
Definition: DisableMgr.h:31
@ LANG_INSTANCE_CLOSED
Definition: Language.h:1054
@ LANG_ACCESS_REQUIREMENT_LEADER_OBTAIN_ITEMS
Definition: Language.h:851
@ LANG_YOU
Definition: Language.h:76
@ LANG_ACCESS_REQUIREMENT_AVERAGE_ILVL_NOT_MET
Definition: Language.h:847
@ LANG_ACCESS_REQUIREMENT_OBTAIN_ITEMS
Definition: Language.h:844
@ LANG_ACCESS_REQUIREMENT_COMPLETE_QUESTS
Definition: Language.h:842
@ LANG_ACCESS_REQUIREMENT_NOT_MET
Definition: Language.h:846
@ LANG_LEVEL_MINREQUIRED_AND_ITEM
Definition: Language.h:82
@ LANG_ACCESS_REQUIREMENT_MAX_LEVEL
Definition: Language.h:848
@ LANG_ACCESS_REQUIREMENT_COMPLETE_ACHIEVEMENTS
Definition: Language.h:843
@ LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_QUESTS
Definition: Language.h:849
@ LANG_LEVEL_MINREQUIRED
Definition: Language.h:81
@ LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_ACHIEVEMENTS
Definition: Language.h:850
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID
Definition: IWorld.h:405
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE
Definition: IWorld.h:404
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL
Definition: IWorld.h:170
@ CONFIG_INSTANCE_IGNORE_LEVEL
Definition: IWorld.h:89
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:162
TeamId faction
Definition: Player.h:935
uint32 id
Definition: Player.h:934
bool checkLeaderOnly
Definition: Player.h:938
float GetAverageItemLevelForDF()
Definition: Player.cpp:15694
void PrettyPrintRequirementsQuestList(const std::vector< const ProgressionRequirement * > &missingQuests) const
Definition: PlayerStorage.cpp:6612
void PrettyPrintRequirementsItemsList(const std::vector< const ProgressionRequirement * > &missingItems) const
Definition: PlayerStorage.cpp:6682
void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg=0)
Definition: Player.cpp:11670
void PrettyPrintRequirementsAchievementsList(const std::vector< const ProgressionRequirement * > &missingAchievements) const
Definition: PlayerStorage.cpp:6649
const char * GetLeaderName() const
Definition: Group.cpp:2311
ObjectGuid GetLeaderGUID() const
Definition: Group.cpp:2296
void SendAreaTriggerMessage(const char *Text,...) ATTR_PRINTF(2
Definition: MiscHandler.cpp:691
Definition: DBCStructure.h:2222
bool hasErrorMessage
Definition: DBCStructure.h:2228

References DungeonProgressionRequirements::achievements, ProgressionRequirement::checkLeaderOnly, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE, CONFIG_INSTANCE_IGNORE_LEVEL, DISABLE_TYPE_MAP, ProgressionRequirement::faction, HashMapHolder< T >::Find(), WorldSession::GetAcoreString(), GetAverageItemLevelForDF(), GetDifficulty(), GetDownscaledMapDifficultyData(), GetGroup(), Object::GetGUID(), Group::GetLeaderGUID(), Group::GetLeaderName(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), GetQuestRewardStatus(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), GetTeamId(), HasAchieved(), MapDifficulty::hasErrorMessage, HasItemCount(), ProgressionRequirement::id, DisableMgr::IsDisabledFor(), IsGameMaster(), MapEntry::IsRaid(), DungeonProgressionRequirements::items, LANG_ACCESS_REQUIREMENT_AVERAGE_ILVL_NOT_MET, LANG_ACCESS_REQUIREMENT_COMPLETE_ACHIEVEMENTS, LANG_ACCESS_REQUIREMENT_COMPLETE_QUESTS, LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_ACHIEVEMENTS, LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_QUESTS, LANG_ACCESS_REQUIREMENT_LEADER_OBTAIN_ITEMS, LANG_ACCESS_REQUIREMENT_MAX_LEVEL, LANG_ACCESS_REQUIREMENT_NOT_MET, LANG_ACCESS_REQUIREMENT_OBTAIN_ITEMS, LANG_INSTANCE_CLOSED, LANG_LEVEL_MINREQUIRED, LANG_LEVEL_MINREQUIRED_AND_ITEM, LANG_YOU, DungeonProgressionRequirements::levelMax, DungeonProgressionRequirements::levelMin, m_session, PrettyPrintRequirementsAchievementsList(), PrettyPrintRequirementsItemsList(), PrettyPrintRequirementsQuestList(), ChatHandler::PSendSysMessage(), DungeonProgressionRequirements::quests, DungeonProgressionRequirements::reqItemLevel, WorldSession::SendAreaTriggerMessage(), ChatHandler::SendSysMessage(), SendTransferAborted(), sMapStore, sObjectMgr, sScriptMgr, sWorld, TEAM_NEUTRAL, and TRANSFER_ABORT_DIFFICULTY.

Referenced by Spell::CheckCast(), WorldSession::HandleSetRaidDifficultyOpcode(), and MapMgr::PlayerCannotEnter().

◆ SatisfyQuestClass()

bool Player::SatisfyQuestClass ( Quest const *  qInfo,
bool  msg 
) const
1080{
1081 uint32 reqClass = qInfo->GetRequiredClasses();
1082
1083 if (reqClass == 0)
1084 return true;
1085
1086 if ((reqClass & getClassMask()) == 0)
1087 {
1088 if (msg)
1090
1091 return false;
1092 }
1093
1094 return true;
1095}
@ INVALIDREASON_DONT_HAVE_REQ
Definition: QuestDef.h:48
void SendCanTakeQuestResponse(uint32 msg) const
Definition: PlayerQuest.cpp:2399

References Unit::getClassMask(), Quest::GetRequiredClasses(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestConditions()

bool Player::SatisfyQuestConditions ( Quest const *  qInfo,
bool  msg 
)
1154{
1155 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, qInfo->GetQuestId());
1156 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1157 {
1158 if (msg)
1160 LOG_DEBUG("condition", "Player::SatisfyQuestConditions: conditions not met for quest {}", qInfo->GetQuestId());
1161 return false;
1162 }
1163 return true;
1164}

References CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, Quest::GetQuestId(), INVALIDREASON_DONT_HAVE_REQ, LOG_DEBUG, sConditionMgr, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest().

◆ SatisfyQuestDay()

bool Player::SatisfyQuestDay ( Quest const *  qInfo,
bool  msg 
) const
1263{
1264 if (!qInfo->IsDaily() && !qInfo->IsDFQuest())
1265 return true;
1266
1267 if (qInfo->IsDFQuest())
1268 {
1269 if (!m_DFQuests.empty())
1270 return false;
1271
1272 return true;
1273 }
1274
1275 bool have_slot = false;
1276 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
1277 {
1278 uint32 id = GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx);
1279 if (qInfo->GetQuestId() == id)
1280 return false;
1281
1282 if (!id)
1283 have_slot = true;
1284 }
1285
1286 if (!have_slot)
1287 {
1288 if (msg)
1290 return false;
1291 }
1292
1293 return true;
1294}
@ INVALIDREASON_DAILY_QUESTS_REMAINING
Definition: QuestDef.h:58

References Quest::GetQuestId(), Object::GetUInt32Value(), INVALIDREASON_DAILY_QUESTS_REMAINING, Quest::IsDaily(), Quest::IsDFQuest(), m_DFQuests, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and SendCanTakeQuestResponse().

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), and SatisfyQuestExclusiveGroup().

◆ SatisfyQuestExclusiveGroup()

bool Player::SatisfyQuestExclusiveGroup ( Quest const *  qInfo,
bool  msg 
) const
1178{
1179 // non positive exclusive group, if > 0 then can be start if any other quest in exclusive group already started/completed
1180 if (qInfo->GetExclusiveGroup() <= 0)
1181 return true;
1182
1183 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qInfo->GetExclusiveGroup()));
1184
1185 for (; range.first != range.second; ++range.first)
1186 {
1187 uint32 exclude_Id = range.first->second;
1188
1189 // skip checked quest id, only state of other quests in group is interesting
1190 if (exclude_Id == qInfo->GetQuestId())
1191 continue;
1192
1193 // not allow have daily quest if daily quest from exclusive group already recently completed
1194 Quest const* Nquest = sObjectMgr->GetQuestTemplate(exclude_Id);
1195 if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false) || !SatisfyQuestSeasonal(Nquest, false))
1196 {
1197 if (msg)
1199
1200 return false;
1201 }
1202
1203 // alternative quest already started or completed - but don't check rewarded states if both are repeatable
1204 if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE || (!(qInfo->IsRepeatable() && Nquest->IsRepeatable()) && !Nquest->IsSeasonal() && IsQuestRewarded(exclude_Id))) // pussywizard: added !Nquest->IsSeasonal() because seasonal quests are considered rewarded only if finished this year, this is checked above in SatisfyQuestSeasonal
1205 {
1206 if (msg)
1208 return false;
1209 }
1210 }
1211 return true;
1212}
std::pair< ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator > ExclusiveQuestGroupsBounds
Definition: ObjectMgr.h:1131

References Quest::GetExclusiveGroup(), Quest::GetQuestId(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), QUEST_STATUS_NONE, SatisfyQuestDay(), SatisfyQuestSeasonal(), SatisfyQuestWeek(), SendCanTakeQuestResponse(), and sObjectMgr.

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestLevel()

bool Player::SatisfyQuestLevel ( Quest const *  qInfo,
bool  msg 
) const
962{
963 if (GetLevel() < qInfo->GetMinLevel())
964 {
965 if (msg)
967 return false;
968 }
969 else if (qInfo->GetMaxLevel() > 0 && GetLevel() > qInfo->GetMaxLevel())
970 {
971 if (msg)
972 SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); // There doesn't seem to be a specific response for too high player level
973 return false;
974 }
975 return true;
976}
@ INVALIDREASON_QUEST_FAILED_LOW_LEVEL
Definition: QuestDef.h:49

References Unit::GetLevel(), Quest::GetMaxLevel(), Quest::GetMinLevel(), INVALIDREASON_DONT_HAVE_REQ, INVALIDREASON_QUEST_FAILED_LOW_LEVEL, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest(), npc_wg_quest_giver::GetDialogStatus(), and GetQuestDialogStatus().

◆ SatisfyQuestLog()

bool Player::SatisfyQuestLog ( bool  msg)
979{
980 // exist free slot
982 return true;
983
984 if (msg)
985 {
987 GetSession()->SendPacket(&data);
988 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTLOG_FULL");
989 }
990 return false;
991}
@ SMSG_QUESTLOG_FULL
Definition: Opcodes.h:435

References FindQuestSlot(), GetSession(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, WorldSession::SendPacket(), and SMSG_QUESTLOG_FULL.

Referenced by CanAddQuest(), and WorldSession::HandlePushQuestToParty().

◆ SatisfyQuestMonth()

bool Player::SatisfyQuestMonth ( Quest const *  qInfo,
bool  msg 
) const
1321{
1322 if (!qInfo->IsMonthly() || m_monthlyquests.empty())
1323 return true;
1324
1325 // if not found in cooldown list
1326 return m_monthlyquests.find(qInfo->GetQuestId()) == m_monthlyquests.end();
1327}

References Quest::GetQuestId(), Quest::IsMonthly(), and m_monthlyquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestNextChain()

bool Player::SatisfyQuestNextChain ( Quest const *  qInfo,
bool  msg 
) const
1215{
1216 uint32 nextQuest = qInfo->GetNextQuestInChain();
1217 if (!nextQuest)
1218 return true;
1219
1220 // next quest in chain already started or completed
1221 if (GetQuestStatus(nextQuest) != QUEST_STATUS_NONE) // GetQuestStatus returns QUEST_STATUS_COMPLETED for rewarded quests
1222 {
1223 if (msg)
1225 return false;
1226 }
1227
1228 // check for all quests further up the chain
1229 // only necessary if there are quest chains with more than one quest that can be skipped
1230 //return SatisfyQuestNextChain(qInfo->GetNextQuestInChain(), msg);
1231 return true;
1232}

References Quest::GetNextQuestInChain(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestPrevChain()

bool Player::SatisfyQuestPrevChain ( Quest const *  qInfo,
bool  msg 
) const
1235{
1236 // No previous quest in chain
1237 if (qInfo->prevChainQuests.empty())
1238 return true;
1239
1240 for (Quest::PrevChainQuests::const_iterator iter = qInfo->prevChainQuests.begin(); iter != qInfo->prevChainQuests.end(); ++iter)
1241 {
1242 QuestStatusMap::const_iterator itr = m_QuestStatus.find(*iter);
1243
1244 // If any of the previous quests in chain active, return false
1245 if (itr != m_QuestStatus.end() && itr->second.Status != QUEST_STATUS_NONE)
1246 {
1247 if (msg)
1249 return false;
1250 }
1251
1252 // check for all quests further down the chain
1253 // only necessary if there are quest chains with more than one quest that can be skipped
1254 //if (!SatisfyQuestPrevChain(prevId, msg))
1255 // return false;
1256 }
1257
1258 // No previous quest in chain active
1259 return true;
1260}

References INVALIDREASON_DONT_HAVE_REQ, m_QuestStatus, Quest::prevChainQuests, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestPreviousQuest()

bool Player::SatisfyQuestPreviousQuest ( Quest const *  qInfo,
bool  msg 
) const
994{
995 // No previous quest (might be first quest in a series)
996 if (qInfo->prevQuests.empty())
997 return true;
998
999 for (Quest::PrevQuests::const_iterator iter = qInfo->prevQuests.begin(); iter != qInfo->prevQuests.end(); ++iter)
1000 {
1001 uint32 prevId = std::abs(*iter);
1002
1003 Quest const* qPrevInfo = sObjectMgr->GetQuestTemplate(prevId);
1004
1005 if (qPrevInfo)
1006 {
1007 // If any of the positive previous quests completed, return true
1008 if (*iter > 0 && IsQuestRewarded(prevId) && (!qPrevInfo->IsSeasonal() || !SatisfyQuestSeasonal(qPrevInfo, false)))
1009 {
1010 // skip one-from-all exclusive group
1011 if (qPrevInfo->GetExclusiveGroup() >= 0)
1012 return true;
1013
1014 // each-from-all exclusive group (< 0)
1015 // can be start if only all quests in prev quest exclusive group completed and rewarded
1016 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
1017
1018 for (; range.first != range.second; ++range.first)
1019 {
1020 uint32 exclude_Id = range.first->second;
1021
1022 // skip checked quest id, only state of other quests in group is interesting
1023 if (exclude_Id == prevId)
1024 continue;
1025
1026 // alternative quest from group also must be completed and rewarded(reported)
1027
1028 Quest const* qExcludeInfo = sObjectMgr->GetQuestTemplate(exclude_Id);
1029 if (!IsQuestRewarded(exclude_Id) || (qExcludeInfo->IsSeasonal() && SatisfyQuestSeasonal(qExcludeInfo, false)))
1030 {
1031 if (msg)
1033 return false;
1034 }
1035 }
1036 return true;
1037 }
1038
1039 // If any of the negative previous quests active, return true
1040 if (*iter < 0 && GetQuestStatus(prevId) != QUEST_STATUS_NONE)
1041 {
1042 // skip one-from-all exclusive group
1043 if (qPrevInfo->GetExclusiveGroup() >= 0)
1044 return true;
1045
1046 // each-from-all exclusive group (< 0)
1047 // can be start if only all quests in prev quest exclusive group active
1048 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
1049
1050 for (; range.first != range.second; ++range.first)
1051 {
1052 uint32 exclude_Id = range.first->second;
1053
1054 // skip checked quest id, only state of other quests in group is interesting
1055 if (exclude_Id == prevId)
1056 continue;
1057
1058 // alternative quest from group also must be active
1059 if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE)
1060 {
1061 if (msg)
1063 return false;
1064 }
1065 }
1066 return true;
1067 }
1068 }
1069 }
1070
1071 // Has only positive prev. quests in non-rewarded state
1072 // and negative prev. quests in non-active state
1073 if (msg)
1075
1076 return false;
1077}
int32 GetExclusiveGroup() const
Definition: QuestDef.h:250

References Quest::GetExclusiveGroup(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, IsQuestRewarded(), Quest::IsSeasonal(), Quest::prevQuests, QUEST_STATUS_NONE, SatisfyQuestSeasonal(), SendCanTakeQuestResponse(), and sObjectMgr.

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestRace()

bool Player::SatisfyQuestRace ( Quest const *  qInfo,
bool  msg 
) const
1098{
1099 uint32 reqraces = qInfo->GetAllowableRaces();
1100 if (reqraces == 0)
1101 return true;
1102 if ((reqraces & getRaceMask()) == 0)
1103 {
1104 if (msg)
1106 return false;
1107 }
1108 return true;
1109}
@ INVALIDREASON_QUEST_FAILED_WRONG_RACE
Definition: QuestDef.h:50

References Quest::GetAllowableRaces(), Unit::getRaceMask(), INVALIDREASON_QUEST_FAILED_WRONG_RACE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestReputation()

bool Player::SatisfyQuestReputation ( Quest const *  qInfo,
bool  msg 
) const
1112{
1113 uint32 fIdMin = qInfo->GetRequiredMinRepFaction(); //Min required rep
1114 if (fIdMin && GetReputationMgr().GetReputation(fIdMin) < qInfo->GetRequiredMinRepValue())
1115 {
1116 if (msg)
1118 return false;
1119 }
1120
1121 uint32 fIdMax = qInfo->GetRequiredMaxRepFaction(); //Max required rep
1122 if (fIdMax && GetReputationMgr().GetReputation(fIdMax) >= qInfo->GetRequiredMaxRepValue())
1123 {
1124 if (msg)
1126 return false;
1127 }
1128
1129 // ReputationObjective2 does not seem to be an objective requirement but a requirement
1130 // to be able to accept the quest
1131 uint32 fIdObj = qInfo->GetRepObjectiveFaction2();
1132 if (fIdObj && GetReputationMgr().GetReputation(fIdObj) >= qInfo->GetRepObjectiveValue2())
1133 {
1134 if (msg)
1136 return false;
1137 }
1138
1139 return true;
1140}

References Quest::GetRepObjectiveFaction2(), Quest::GetRepObjectiveValue2(), GetReputation(), GetReputationMgr(), Quest::GetRequiredMaxRepFaction(), Quest::GetRequiredMaxRepValue(), Quest::GetRequiredMinRepFaction(), Quest::GetRequiredMinRepValue(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestSeasonal()

bool Player::SatisfyQuestSeasonal ( Quest const *  qInfo,
bool  msg 
) const
1306{
1307 if (!qInfo->IsSeasonal() || m_seasonalquests.empty())
1308 return true;
1309
1310 // cppcheck-suppress mismatchingContainers
1311 Player::SeasonalEventQuestMap::iterator itr = ((Player*)this)->m_seasonalquests.find(qInfo->GetEventIdForQuest());
1312
1313 if (itr == m_seasonalquests.end() || itr->second.empty())
1314 return true;
1315
1316 // if not found in cooldown list
1317 return itr->second.find(qInfo->GetQuestId()) == itr->second.end();
1318}

References Quest::GetEventIdForQuest(), Quest::GetQuestId(), Quest::IsSeasonal(), and m_seasonalquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), GetQuestRewardStatus(), GetQuestStatus(), SatisfyQuestExclusiveGroup(), and SatisfyQuestPreviousQuest().

◆ SatisfyQuestSkill()

bool Player::SatisfyQuestSkill ( Quest const *  qInfo,
bool  msg 
) const
942{
943 uint32 skill = qInfo->GetRequiredSkill();
944
945 // skip 0 case RequiredSkill
946 if (skill == 0)
947 return true;
948
949 // check skill value
950 if (GetBaseSkillValue(skill) < qInfo->GetRequiredSkillValue())
951 {
952 if (msg)
954
955 return false;
956 }
957
958 return true;
959}

References GetBaseSkillValue(), Quest::GetRequiredSkill(), Quest::GetRequiredSkillValue(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestStatus()

bool Player::SatisfyQuestStatus ( Quest const *  qInfo,
bool  msg 
) const
1143{
1144 if (GetQuestStatus(qInfo->GetQuestId()) != QUEST_STATUS_NONE)
1145 {
1146 if (msg)
1148 return false;
1149 }
1150 return true;
1151}
@ INVALIDREASON_QUEST_ALREADY_ON
Definition: QuestDef.h:53

References Quest::GetQuestId(), GetQuestStatus(), INVALIDREASON_QUEST_ALREADY_ON, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest(), and WorldSession::HandlePushQuestToParty().

◆ SatisfyQuestTimed()

bool Player::SatisfyQuestTimed ( Quest const *  qInfo,
bool  msg 
) const
1167{
1168 if (!m_timedquests.empty() && qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
1169 {
1170 if (msg)
1172 return false;
1173 }
1174 return true;
1175}
@ INVALIDREASON_QUEST_ONLY_ONE_TIMED
Definition: QuestDef.h:52

References Quest::HasSpecialFlag(), INVALIDREASON_QUEST_ONLY_ONE_TIMED, m_timedquests, QUEST_SPECIAL_FLAGS_TIMED, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest().

◆ SatisfyQuestWeek()

bool Player::SatisfyQuestWeek ( Quest const *  qInfo,
bool  msg 
) const
1297{
1298 if (!qInfo->IsWeekly() || m_weeklyquests.empty())
1299 return true;
1300
1301 // if not found in cooldown list
1302 return m_weeklyquests.find(qInfo->GetQuestId()) == m_weeklyquests.end();
1303}

References Quest::GetQuestId(), Quest::IsWeekly(), and m_weeklyquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), and SatisfyQuestExclusiveGroup().

◆ SaveGoldToDB()

void Player::SaveGoldToDB ( CharacterDatabaseTransaction  trans)
7142{
7144 stmt->SetData(0, GetMoney());
7145 stmt->SetData(1, GetGUID().GetCounter());
7146 trans->Append(stmt);
7147}
@ CHAR_UDP_CHAR_MONEY
Definition: CharacterDatabase.h:427

References CHAR_UDP_CHAR_MONEY, CharacterDatabase, Object::GetGUID(), GetMoney(), and PreparedStatementBase::SetData().

Referenced by WorldSession::HandleMailTakeMoney(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), and SaveInventoryAndGoldToDB().

◆ SaveHealthBeforeDuel()

void Player::SaveHealthBeforeDuel ( )
inline

◆ SaveInventoryAndGoldToDB()

void Player::SaveInventoryAndGoldToDB ( CharacterDatabaseTransaction  trans)
7136{
7137 _SaveInventory(trans);
7138 SaveGoldToDB(trans);
7139}
void SaveGoldToDB(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7141
void _SaveInventory(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7255

References _SaveInventory(), and SaveGoldToDB().

Referenced by WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleMailTakeItem(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleSendMail(), WorldSession::HandleWrapItemOpcode(), and RefundItem().

◆ SaveManaBeforeDuel()

void Player::SaveManaBeforeDuel ( )
inline

◆ SavePositionInDB() [1/2]

void Player::SavePositionInDB ( uint32  mapid,
float  x,
float  y,
float  z,
float  o,
uint32  zone,
ObjectGuid  guid 
)
static

◆ SavePositionInDB() [2/2]

void Player::SavePositionInDB ( WorldLocation const &  loc,
uint16  zoneId,
ObjectGuid  guid,
CharacterDatabaseTransaction  trans 
)
static
100{
102
103 stmt->SetData(0, loc.GetPositionX());
104 stmt->SetData(1, loc.GetPositionY());
105 stmt->SetData(2, loc.GetPositionZ());
106 stmt->SetData(3, loc.GetOrientation());
107 stmt->SetData(4, uint16(loc.GetMapId()));
108 stmt->SetData(5, zoneId);
109 stmt->SetData(6, guid.GetCounter());
110
111 CharacterDatabase.ExecuteOrAppend(trans, stmt);
112}

References CHAR_UPD_CHARACTER_POSITION, CharacterDatabase, ObjectGuid::GetCounter(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and PreparedStatementBase::SetData().

◆ SaveRecallPosition()

◆ SaveToDB() [1/2]

void Player::SaveToDB ( bool  create,
bool  logout 
)

◆ SaveToDB() [2/2]

void Player::SaveToDB ( CharacterDatabaseTransaction  trans,
bool  create,
bool  logout 
)
7074{
7075 // delay auto save at any saves (manual, in code, or autosave)
7076 m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
7077
7078 //lets allow only players in world to be saved
7080 {
7082 return;
7083 }
7084
7085 // pussywizard: full save now, so clear partial additional saves
7088
7089 // first save/honor gain after midnight will also update the player's honor fields
7091
7092 LOG_DEBUG("entities.unit", "The value of player {} at save: ", m_name);
7094
7095 if (!create)
7096 sScriptMgr->OnPlayerSave(this);
7097
7098 _SaveCharacter(create, trans);
7099
7100 if (m_mailsUpdated) //save mails only when needed
7101 _SaveMail(trans);
7102
7103 _SaveEntryPoint(trans);
7104 _SaveInventory(trans);
7105 _SaveQuestStatus(trans);
7106 _SaveDailyQuestStatus(trans);
7110 _SaveTalents(trans);
7111 _SaveSpells(trans);
7112 _SaveSpellCooldowns(trans, logout);
7113 _SaveActions(trans);
7114 _SaveAuras(trans, logout);
7115 _SaveSkills(trans);
7116 m_achievementMgr->SaveToDB(trans);
7117 m_reputationMgr->SaveToDB(trans);
7118 _SaveEquipmentSets(trans);
7119 GetSession()->SaveTutorialsData(trans); // changed only while character in game
7120 _SaveGlyphs(trans);
7122 _SavePlayerSettings(trans);
7123
7124 // check if stats should only be saved on logout
7125 // save stats can be out of transaction
7127 _SaveStats(trans);
7128
7129 // save pet (hunter pet level and experience and all type pets health/mana).
7130 if (Pet* pet = GetPet())
7131 pet->SavePetToDB(PET_SAVE_AS_CURRENT);
7132}
@ CONFIG_STATS_SAVE_ONLY_ON_LOGOUT
Definition: IWorld.h:75
void SaveToDB(CharacterDatabaseTransaction trans)
Definition: AchievementMgr.cpp:561
bool IsBeingTeleportedFar() const
Definition: Player.h:2069
void _SaveMonthlyQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7630
void _SaveTalents(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14975
void _SaveDailyQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7535
void _SaveSpells(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7708
void _SaveCharacter(bool create, CharacterDatabaseTransaction trans)
Definition: Player.cpp:14629
void _SaveSkills(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7652
void _SaveEquipmentSets(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14495
void _SaveGlyphs(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14928
void _SaveMail(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7393
void _SaveQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7468
void _SaveAuras(CharacterDatabaseTransaction trans, bool logout)
Definition: PlayerStorage.cpp:7197
void _SaveSeasonalQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7596
void _SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans)
Definition: Player.cpp:15821
void _SavePlayerSettings(CharacterDatabaseTransaction trans)
Definition: PlayerSettings.cpp:91
void _SaveWeeklyQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7573
void _SaveSpellCooldowns(CharacterDatabaseTransaction trans, bool logout)
Definition: Player.cpp:3603
void _SaveEntryPoint(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14546
void _SaveStats(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7755
void SaveToDB(CharacterDatabaseTransaction trans)
Definition: ReputationMgr.cpp:625
bool isLogingOut() const
Is the user engaged in a log out process?
Definition: WorldSession.h:385
void SaveTutorialsData(CharacterDatabaseTransaction trans)
Definition: WorldSession.cpp:937

References _SaveActions(), _SaveAuras(), _SaveCharacter(), _SaveDailyQuestStatus(), _SaveEntryPoint(), _SaveEquipmentSets(), _SaveGlyphs(), _SaveInstanceTimeRestrictions(), _SaveInventory(), _SaveMail(), _SaveMonthlyQuestStatus(), _SavePlayerSettings(), _SaveQuestStatus(), _SaveSeasonalQuestStatus(), _SaveSkills(), _SaveSpellCooldowns(), _SaveSpells(), _SaveStats(), _SaveTalents(), _SaveWeeklyQuestStatus(), CONFIG_INTERVAL_SAVE, CONFIG_STATS_SAVE_ONLY_ON_LOGOUT, DELAYED_SAVE_PLAYER, GetPet(), GetSession(), IsBeingTeleportedFar(), WorldSession::isLogingOut(), LOG_DEBUG, m_achievementMgr, m_additionalSaveMask, m_additionalSaveTimer, m_mailsUpdated, WorldObject::m_name, m_nextSave, m_reputationMgr, m_session, outDebugValues(), PET_SAVE_AS_CURRENT, AchievementMgr::SaveToDB(), ReputationMgr::SaveToDB(), WorldSession::SaveTutorialsData(), ScheduleDelayedOperation(), sScriptMgr, sWorld, and UpdateHonorFields().

◆ Say() [1/2]

void Player::Say ( std::string_view  text,
Language  language,
WorldObject const *  = nullptr 
)
overridevirtual

Handles said message in regular chat based on declared language and in config pre-defined Range.

Reimplemented from Unit.

9296{
9297 std::string _text(text);
9298 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_SAY, language, _text))
9299 {
9300 return;
9301 }
9302
9303 sScriptMgr->OnPlayerChat(this, CHAT_MSG_SAY, language, _text);
9304
9305 WorldPacket data;
9306 ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, language, this, this, _text);
9307 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true, false, false, true);
9308}
@ CONFIG_LISTEN_RANGE_SAY
Definition: IWorld.h:199
@ CHAT_MSG_SAY
Definition: SharedDefines.h:3153
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition: Chat.cpp:267
void SendMessageToSetInRange(WorldPacket const *data, float dist, bool self) const override
Definition: Player.cpp:5618

References ChatHandler::BuildChatPacket(), CHAT_MSG_SAY, CONFIG_LISTEN_RANGE_SAY, SendMessageToSetInRange(), sScriptMgr, and sWorld.

Referenced by Unit::HandleDummyAuraProc(), WorldSession::HandleMessagechatOpcode(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_jungle_punch_target::npc_jungle_punch_targetAI::SpellHit(), and boss_headless_horseman::UpdateAI().

◆ Say() [2/2]

void Player::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
overridevirtual

Reimplemented from Unit.

9311{
9312 Talk(textId, CHAT_MSG_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
9313}
Talk
Definition: hyjal.cpp:82

References CHAT_MSG_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ ScheduleDelayedOperation()

void Player::ScheduleDelayedOperation ( uint32  operation)
inline
2077 {
2078 if (operation < DELAYED_END)
2079 m_DelayedOperations |= operation;
2080 }
@ DELAYED_END
Definition: Player.h:910

References DELAYED_END, and m_DelayedOperations.

Referenced by Battleground::RemovePlayerAtLeave(), ResurectUsingRequestData(), SaveToDB(), and TeleportToEntryPoint().

◆ SendActionButtons()

void Player::SendActionButtons ( uint32  state) const
5496{
5497 LOG_DEBUG("entities.player", "Sending Action Buttons for {} spec {}", GetGUID().ToString(), m_activeSpec);
5498
5500 data << uint8(state);
5501 /*
5502 state can be 0, 1, 2
5503 0 - Looks to be sent when initial action buttons get sent, however on Trinity we use 1 since 0 had some difficulties
5504 1 - Used in any SMSG_ACTION_BUTTONS packet with button data on Trinity. Only used after spec swaps on retail.
5505 2 - Clears the action bars client sided. This is sent during spec swap before unlearning and before sending the new buttons
5506 */
5507 if (state != 2)
5508 {
5509 for (uint8 button = 0; button < MAX_ACTION_BUTTONS; ++button)
5510 {
5511 ActionButtonList::const_iterator itr = m_actionButtons.find(button);
5512 if (itr != m_actionButtons.end() && itr->second.uState != ACTIONBUTTON_DELETED)
5513 data << uint32(itr->second.packedData);
5514 else
5515 data << uint32(0);
5516 }
5517 }
5518
5519 GetSession()->SendPacket(&data);
5520 LOG_DEBUG("entities.player", "Action Buttons for {} spec {} Sent", GetGUID().ToString(), m_activeSpec);
5521}
@ SMSG_ACTION_BUTTONS
Definition: Opcodes.h:327

References ACTIONBUTTON_DELETED, Object::GetGUID(), GetSession(), LOG_DEBUG, m_actionButtons, m_activeSpec, MAX_ACTION_BUTTONS, WorldSession::SendPacket(), SMSG_ACTION_BUTTONS, and Position::ToString().

Referenced by ActivateSpec(), WorldSession::HandleLoadActionsSwitchSpec(), LoadActions(), and SendInitialActionButtons().

◆ SendAttackSwingBadFacingAttack()

void Player::SendAttackSwingBadFacingAttack ( )
147{
149 GetSession()->SendPacket(&data);
150}
@ SMSG_ATTACKSWING_BADFACING
Definition: Opcodes.h:356

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_BADFACING.

Referenced by Update().

◆ SendAttackSwingCancelAttack()

◆ SendAttackSwingCantAttack()

void Player::SendAttackSwingCantAttack ( )
135{
137 GetSession()->SendPacket(&data);
138}
@ SMSG_ATTACKSWING_CANT_ATTACK
Definition: Opcodes.h:359

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_CANT_ATTACK.

◆ SendAttackSwingDeadTarget()

void Player::SendAttackSwingDeadTarget ( )
129{
131 GetSession()->SendPacket(&data);
132}
@ SMSG_ATTACKSWING_DEADTARGET
Definition: Opcodes.h:358

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_DEADTARGET.

◆ SendAttackSwingNotInRange()

void Player::SendAttackSwingNotInRange ( )
79{
81 GetSession()->SendPacket(&data);
82}
@ SMSG_ATTACKSWING_NOTINRANGE
Definition: Opcodes.h:355

References GetSession(), WorldSession::SendPacket(), and SMSG_ATTACKSWING_NOTINRANGE.

Referenced by Update().

◆ SendAutoRepeatCancel()

void Player::SendAutoRepeatCancel ( Unit target)
153{
155 data << target->GetPackGUID(); // may be it's target guid
156 SendMessageToSet(&data, true);
157}
@ SMSG_CANCEL_AUTO_REPEAT
Definition: Opcodes.h:698
std::size_t size() const
Definition: ObjectGuid.h:274

References Object::GetPackGUID(), SendMessageToSet(), PackedGuid::size(), and SMSG_CANCEL_AUTO_REPEAT.

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), and Unit::InterruptSpell().

◆ SendBattlefieldWorldStates()

void Player::SendBattlefieldWorldStates ( )

Send misc stuff that needs to be sent on every login, like the battle timers.

8798{
8800 if (sWorld->getIntConfig(CONFIG_WINTERGRASP_ENABLE) == 1)
8801 {
8802 if (BattlefieldWG* wg = (BattlefieldWG*)sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
8803 {
8806 SendUpdateWorldState(BATTLEFIELD_WG_WORLD_STATE_ACTIVE, wg->IsWarTime() ? 0 : 1); // Note: cleanup these two, their names look awkward
8808
8809 for (uint32 i = 0; i < 2; ++i)
8810 SendUpdateWorldState(ClockWorldState[i], uint32(GameTime::GetGameTime().count() + (wg->GetTimer() / 1000)));
8811 }
8812 }
8813}
const uint32 ClockWorldState[2]
Definition: BattlefieldWG.h:42
@ BATTLEFIELD_WG_WORLD_STATE_SHOW_WORLDSTATE
Definition: BattlefieldWG.h:112
@ BATTLEFIELD_WG_WORLD_STATE_ACTIVE
Definition: BattlefieldWG.h:109
@ BATTLEFIELD_WG_WORLD_STATE_DEFENDER
Definition: BattlefieldWG.h:110
@ BATTLEFIELD_WG_WORLD_STATE_ATTACKER
Definition: BattlefieldWG.h:111
@ CONFIG_WINTERGRASP_ENABLE
Definition: IWorld.h:325
Definition: BattlefieldWG.h:277
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition: PlayerUpdates.cpp:2193

References BATTLEFIELD_BATTLEID_WG, BATTLEFIELD_WG_WORLD_STATE_ACTIVE, BATTLEFIELD_WG_WORLD_STATE_ATTACKER, BATTLEFIELD_WG_WORLD_STATE_DEFENDER, BATTLEFIELD_WG_WORLD_STATE_SHOW_WORLDSTATE, ClockWorldState, CONFIG_WINTERGRASP_ENABLE, GameTime::GetGameTime(), sBattlefieldMgr, SendUpdateWorldState(), and sWorld.

Referenced by SendInitWorldStates().

◆ SendBGWeekendWorldStates()

void Player::SendBGWeekendWorldStates ( )
8783{
8784 for (uint32 i = 1; i < sBattlemasterListStore.GetNumRows(); ++i)
8785 {
8786 BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(i);
8787 if (bl && bl->HolidayWorldStateId)
8788 {
8791 else
8793 }
8794 }
8795}
DBCStorage< BattlemasterListEntry > sBattlemasterListStore(BattlemasterListEntryfmt)
static bool IsBGWeekend(BattlegroundTypeId bgTypeId)
Definition: BattlegroundMgr.cpp:896
Definition: DBCStructure.h:604
uint32 HolidayWorldStateId
Definition: DBCStructure.h:612
uint32 id
Definition: DBCStructure.h:605

References BattlemasterListEntry::HolidayWorldStateId, BattlemasterListEntry::id, BattlegroundMgr::IsBGWeekend(), sBattlemasterListStore, and SendUpdateWorldState().

Referenced by SendInitWorldStates().

◆ SendBuyError()

void Player::SendBuyError ( BuyResult  msg,
Creature creature,
uint32  item,
uint32  param 
)
4080{
4081 LOG_DEBUG("network", "WORLD: Sent SMSG_BUY_FAILED");
4082 WorldPacket data(SMSG_BUY_FAILED, (8 + 4 + 4 + 1));
4083 data << (creature ? creature->GetGUID() : ObjectGuid::Empty);
4084 data << uint32(item);
4085 if (param > 0)
4086 data << uint32(param);
4087 data << uint8(msg);
4088 GetSession()->SendPacket(&data);
4089}
@ SMSG_BUY_FAILED
Definition: Opcodes.h:451

References ObjectGuid::Empty, Object::GetGUID(), GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_BUY_FAILED.

Referenced by BuyItemFromVendorSlot(), WorldSession::HandleBuybackItem(), debug_commandscript::HandleDebugSendBuyErrorCommand(), WorldSession::HandlePetitionBuyOpcode(), npc_experience::OnGossipSelect(), OnGossipSelect(), ProcessCastaction(), ProcessUnlearnAction(), and resetTalents().

◆ SendCanTakeQuestResponse()

◆ SendCinematicStart()

void Player::SendCinematicStart ( uint32  CinematicSequenceId) const
5655{
5657 data << uint32(CinematicSequenceId);
5658 SendDirectMessage(&data);
5659 if (CinematicSequencesEntry const* sequence = sCinematicSequencesStore.LookupEntry(CinematicSequenceId))
5660 {
5661 _cinematicMgr->SetActiveCinematicCamera(sequence->cinematicCamera);
5662 }
5663}
DBCStorage< CinematicSequencesEntry > sCinematicSequencesStore(CinematicSequencesEntryfmt)
@ SMSG_TRIGGER_CINEMATIC
Definition: Opcodes.h:280
void SetActiveCinematicCamera(uint32 cinematicCameraId=0)
Definition: CinematicMgr.h:39
Definition: DBCStructure.h:713

References _cinematicMgr, sCinematicSequencesStore, SendDirectMessage(), CinematicMgr::SetActiveCinematicCamera(), and SMSG_TRIGGER_CINEMATIC.

Referenced by debug_commandscript::HandleDebugPlayCinematicCommand(), WorldSession::HandlePlayerLoginFromDB(), and GameObject::Use().

◆ SendClearCooldown()

void Player::SendClearCooldown ( uint32  spell_id,
Unit target 
)

◆ SendCooldownEvent()

void Player::SendCooldownEvent ( SpellInfo const *  spellInfo,
uint32  itemId = 0,
Spell spell = nullptr,
bool  setCooldown = true 
)
11063{
11064 // start cooldowns at server side, if any
11065 if (setCooldown)
11066 AddSpellAndCategoryCooldowns(spellInfo, itemId, spell);
11067
11068 // Send activate cooldown timer (possible 0) at client side
11069 WorldPacket data(SMSG_COOLDOWN_EVENT, 4 + 8);
11070 data << uint32(spellInfo->Id);
11071 data << GetGUID();
11072 SendDirectMessage(&data);
11073}
@ SMSG_COOLDOWN_EVENT
Definition: Opcodes.h:339
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition: Player.cpp:10864

References AddSpellAndCategoryCooldowns(), Object::GetGUID(), SpellInfo::Id, SendDirectMessage(), and SMSG_COOLDOWN_EVENT.

Referenced by Spell::_handle_finish_phase(), Aura::_UnapplyForTarget(), Spell::finish(), Unit::RemoveGameObject(), Unit::SetMinion(), and UpdatePotionCooldown().

◆ SendCorpseReclaimDelay()

void Player::SendCorpseReclaimDelay ( uint32  delay)
12926{
12928 data << uint32(delay);
12929 GetSession()->SendPacket(&data);
12930}
@ SMSG_CORPSE_RECLAIM_DELAY
Definition: Opcodes.h:647

References GetSession(), WorldSession::SendPacket(), and SMSG_CORPSE_RECLAIM_DELAY.

Referenced by BuildPlayerRepop(), and KillPlayer().

◆ SendDirectMessage()

void Player::SendDirectMessage ( WorldPacket const *  data) const
5650{
5651 m_session->SendPacket(data);
5652}

References m_session, and WorldSession::SendPacket().

Referenced by Guild::_SendBankList(), Group::AddMember(), AddSpellAndCategoryCooldowns(), Creature::AddSpellCooldown(), AddSpellMod(), DoRandomRoll(), DuelComplete(), Spell::EffectBind(), Spell::EffectPlayMusic(), BGQueueRemoveEvent::Execute(), GiveLevel(), Aura::HandleAuraSpecificMods(), Guild::HandleInviteMember(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), Unit::Kill(), Pet::learnSpell(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), Acore::LocalizedPacketDo< Builder >::operator()(), Acore::LocalizedPacketListDo< Builder >::operator()(), CreatureTextLocalizer< Builder >::operator()(), WorldObject::PlayDirectMusic(), WorldObject::PlayDirectSound(), WorldObject::PlayDistanceSound(), AchievementMgr::RemoveCriteriaProgress(), AchievementMgr::Reset(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), SendCinematicStart(), SendClearCooldown(), Unit::SendComboPoints(), SendCooldownEvent(), AchievementMgr::SendCriteriaUpdate(), SendDurabilityLoss(), WeatherMgr::SendFineWeatherUpdateToPlayer(), ReputationMgr::SendForceReactions(), ReputationMgr::SendInitialReputations(), Map::SendInitSelf(), SendLoot(), SendLootError(), SendLootRelease(), Unit::SendMeleeAttackStart(), SendMessageToSet(), SendMessageToSetInRange(), SendMirrorTimer(), Unit::SendMovementFeatherFall(), Unit::SendMovementHover(), Unit::SendMovementWaterWalking(), SendMovieStart(), World::SendServerMessage(), Unit::SendSpellNonMeleeReflectLog(), ReputationMgr::SendState(), Unit::SendTameFailure(), SendTaxiNodeStatusMultiple(), SendUpdateWorldState(), ReputationMgr::SendVisible(), Weather::SendWeatherUpdateToPlayer(), ChatHandler::SendWorldTextOptional(), Map::SendZoneDynamicInfo(), SetCanFly(), Creature::SetCanFly(), Creature::SetDisableGravity(), SetDisableGravity(), SetFeatherFall(), Creature::SetFeatherFall(), SetHover(), Unit::SetOwnerGUID(), Unit::SetRooted(), SetWaterWalking(), Creature::SetWaterWalking(), StopMirrorTimer(), Pet::unlearnSpell(), Unit::Whisper(), and Whisper().

◆ SendDuelCountdown()

void Player::SendDuelCountdown ( uint32  counter)
15300{
15302 data << uint32(counter); // seconds
15303 GetSession()->SendPacket(&data);
15304}
@ SMSG_DUEL_COUNTDOWN
Definition: Opcodes.h:725

References GetSession(), WorldSession::SendPacket(), and SMSG_DUEL_COUNTDOWN.

Referenced by WorldSession::HandleDuelAcceptedOpcode().

◆ SendDungeonDifficulty()

void Player::SendDungeonDifficulty ( bool  IsInGroup)

◆ SendDurabilityLoss()

void Player::SendDurabilityLoss ( )

◆ SendEnchantmentDurations()

void Player::SendEnchantmentDurations ( )
4742{
4743 for (EnchantDurationList::const_iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4744 {
4745 GetSession()->SendItemEnchantTimeUpdate(GetGUID(), itr->item->GetGUID(), itr->slot, uint32(itr->leftduration) / 1000);
4746 }
4747}

References Object::GetGUID(), GetSession(), m_enchantDuration, and WorldSession::SendItemEnchantTimeUpdate().

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendEquipError()

void Player::SendEquipError ( InventoryResult  msg,
Item pItem,
Item pItem2 = nullptr,
uint32  itemid = 0 
)
4037{
4038 LOG_DEBUG("network", "WORLD: Sent SMSG_INVENTORY_CHANGE_FAILURE ({})", msg);
4040 data << uint8(msg);
4041
4042 if (msg != EQUIP_ERR_OK)
4043 {
4044 data << (pItem ? pItem->GetGUID() : ObjectGuid::Empty);
4045 data << (pItem2 ? pItem2->GetGUID() : ObjectGuid::Empty);
4046 data << uint8(0); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2
4047
4048 switch (msg)
4049 {
4052 {
4053 ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
4054 data << uint32(proto ? proto->RequiredLevel : 0);
4055 break;
4056 }
4057 case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM: // no idea about this one...
4058 {
4059 data << ObjectGuid::Empty; // item guid
4060 data << uint32(0); // slot
4061 data << ObjectGuid::Empty; // container
4062 break;
4063 }
4067 {
4068 ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
4069 data << uint32(proto ? proto->ItemLimitCategory : 0);
4070 break;
4071 }
4072 default:
4073 break;
4074 }
4075 }
4076 GetSession()->SendPacket(&data);
4077}
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED
Definition: Item.h:131
@ EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM
Definition: Item.h:127
@ EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW
Definition: Item.h:133
@ SMSG_INVENTORY_CHANGE_FAILURE
Definition: Opcodes.h:304
uint32 RequiredLevel
Definition: ItemTemplate.h:636

References ObjectGuid::Empty, EQUIP_ERR_CANT_EQUIP_LEVEL_I, EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED, EQUIP_ERR_OK, EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW, Object::GetGUID(), GetSession(), Item::GetTemplate(), ItemTemplate::ItemLimitCategory, LOG_DEBUG, ItemTemplate::RequiredLevel, WorldSession::SendPacket(), SMSG_INVENTORY_CHANGE_FAILURE, and sObjectMgr.

Referenced by _StoreOrEquipNewItem(), AutoStoreLoot(), BuyItemFromVendorSlot(), CanAddQuest(), CanRewardQuest(), CastItemUseSpell(), Spell::CheckItems(), Group::CountTheRoll(), Spell::DoCreateItem(), Spell::EffectRechargeManaGem(), GiveQuestSourceItem(), WorldSession::HandleAcceptTradeOpcode(), misc_commandscript::HandleAddItemSetCommand(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), AuraEffect::HandleChannelDeathItem(), debug_commandscript::HandleDebugSendEquipErrorCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleGuildBankSwapItems(), WorldSession::HandleOpenItemOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleReadItem(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSocketOpcode(), WorldSession::HandleSplitItemOpcode(), WorldSession::HandleSwapInvItemOpcode(), WorldSession::HandleSwapItem(), WorldSession::HandleUseItemOpcode(), WorldSession::HandleWrapItemOpcode(), ModifyMoney(), item_petrov_cluster_bombs::OnUse(), item_only_for_flight::OnUse(), item_incendiary_explosives::OnUse(), item_captured_frog::OnUse(), ProcessUnlearnAction(), SetAmmo(), SplitItem(), StoreLootItem(), SwapItem(), and TakeQuestSourceItem().

◆ SendEquipmentSetList()

void Player::SendEquipmentSetList ( )
14425{
14426 uint32 count = 0;
14428 std::size_t count_pos = data.wpos();
14429 data << uint32(count); // count placeholder
14430 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14431 {
14432 if (itr->second.state == EQUIPMENT_SET_DELETED)
14433 continue;
14434
14435 data.appendPackGUID(itr->second.Guid);
14436 data << uint32(itr->first);
14437 data << itr->second.Name;
14438 data << itr->second.IconName;
14439 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14440 {
14441 // ignored slots stored in IgnoreMask, client wants "1" as raw GUID, so no HighGuid::Item
14442 if (itr->second.IgnoreMask & (1 << i))
14443 data.appendPackGUID(uint64(1));
14444 else // xinef: send proper data (do not append 0 with high guid)
14445 data.appendPackGUID(itr->second.Items[i] ? itr->second.Items[i].GetRawValue() : uint64(0));
14446 }
14447
14448 ++count; // client have limit but it checked at loading and set
14449 }
14450 data.put<uint32>(count_pos, count);
14451 GetSession()->SendPacket(&data);
14452}
@ SMSG_EQUIPMENT_SET_LIST
Definition: Opcodes.h:1242

References ByteBuffer::appendPackGUID(), EQUIPMENT_SET_DELETED, EQUIPMENT_SLOT_END, GetSession(), m_EquipmentSets, ByteBuffer::put(), WorldSession::SendPacket(), SMSG_EQUIPMENT_SET_LIST, and ByteBuffer::wpos().

Referenced by SendInitialPacketsBeforeAddToMap().

◆ SendExplorationExperience()

void Player::SendExplorationExperience ( uint32  Area,
uint32  Experience 
)
160{
162 data << uint32(Area);
163 data << uint32(Experience);
164 GetSession()->SendPacket(&data);
165}
@ SMSG_EXPLORATION_EXPERIENCE
Definition: Opcodes.h:534

References GetSession(), WorldSession::SendPacket(), and SMSG_EXPLORATION_EXPERIENCE.

Referenced by CheckAreaExploreAndOutdoor().

◆ SendInitialActionButtons()

void Player::SendInitialActionButtons ( ) const
inline

◆ SendInitialPacketsAfterAddToMap()

void Player::SendInitialPacketsAfterAddToMap ( )
11589{
11591
11594
11595 CastSpell(this, 836, true); // LOGINEFFECT
11596
11597 // set some aura effects that send packet to player client after add player to map
11598 // SendMessageToSet not send it to player not it map, only for aura that not changed anything at re-apply
11599 // same auras state lost at far teleport, send it one more time in this case also
11600 static const AuraType auratypes[] =
11601 {
11605 };
11606 for (AuraType const* itr = &auratypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
11607 {
11608 Unit::AuraEffectList const& auraList = GetAuraEffectsByType(*itr);
11609 if (!auraList.empty())
11610 auraList.front()->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
11611 }
11612
11613 // Fix mount, update block gets messed somewhere
11614 {
11616 {
11617 AddAura(GetMountBlockId(), this);
11618 SetMountBlockId(0);
11619 }
11620 }
11621
11622 // update zone
11623 uint32 newzone, newarea;
11624 GetZoneAndAreaId(newzone, newarea);
11625 UpdateZone(newzone, newarea); // also call SendInitWorldStates();
11626
11629
11630 // manual send package (have code in HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true); that must not be re-applied.
11632 {
11634 data2 << GetPackGUID();
11635 data2 << (uint32)2;
11636 SendMessageToSet(&data2, true);
11637 }
11638
11639 SendEnchantmentDurations(); // must be after add to map
11640 SendItemDurations(); // must be after add to map
11643
11644 // raid downscaling - send difficulty to player
11645 if (GetMap()->IsRaid())
11646 {
11648 {
11651 }
11652 }
11654 SendRaidDifficulty(GetGroup() != nullptr);
11655}
AuraType
Definition: SpellAuraDefines.h:62
@ SPELL_AURA_TRANSFORM
Definition: SpellAuraDefines.h:119
@ SPELL_AURA_NONE
Definition: SpellAuraDefines.h:63
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition: SpellAuraDefines.h:43
@ SMSG_FORCE_MOVE_ROOT
Definition: Opcodes.h:262
void UpdateVisibilityForPlayer(bool mapChange=false)
Definition: PlayerUpdates.cpp:1542
uint32 GetMountBlockId()
Definition: Player.h:2581
void SendTaxiNodeStatusMultiple()
Definition: Player.cpp:10460
Difficulty GetStoredRaidDifficulty() const
Definition: Player.h:1900
void SendEnchantmentDurations()
Definition: PlayerStorage.cpp:4741
void SendItemDurations()
Definition: PlayerStorage.cpp:4757
void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty=-1)
Definition: PlayerMisc.cpp:177
void SendTimeSync()
Definition: WorldSession.cpp:1617
void ResetTimeSync()
Definition: WorldSession.cpp:1611

References Unit::AddAura(), AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Unit::CastSpell(), Unit::GetAuraEffectsByType(), GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetMountBlockId(), Object::GetPackGUID(), GetRaidDifficulty(), GetSession(), GetStoredRaidDifficulty(), WorldObject::GetZoneAndAreaId(), Unit::HasAuraType(), isBeingLoaded(), MOVE_ROOT, WorldSession::ResetTimeSync(), SendEnchantmentDurations(), SendItemDurations(), SendMessageToSet(), SendQuestGiverStatusMultiple(), SendRaidDifficulty(), SendTaxiNodeStatusMultiple(), WorldSession::SendTimeSync(), SetMountBlockId(), SetMovement(), SMSG_FORCE_MOVE_ROOT, SPELL_AURA_FEATHER_FALL, SPELL_AURA_FLY, SPELL_AURA_HOVER, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_MOUNTED, SPELL_AURA_NONE, SPELL_AURA_SAFE_FALL, SPELL_AURA_TRANSFORM, SPELL_AURA_WATER_WALK, StoreRaidMapDifficulty(), UpdateVisibilityForPlayer(), and UpdateZone().

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendInitialPacketsBeforeAddToMap()

void Player::SendInitialPacketsBeforeAddToMap ( )

Pass 'this' as argument because we're not stored in ObjectAccessor yet

11532{
11535
11536 // guild bank list?
11537
11538 // Homebind
11539 WorldPacket data(SMSG_BINDPOINTUPDATE, 5 * 4);
11540 data << m_homebindX << m_homebindY << m_homebindZ;
11541 data << (uint32) m_homebindMapId;
11542 data << (uint32) m_homebindAreaId;
11543 GetSession()->SendPacket(&data);
11544
11545 // SMSG_SET_PROFICIENCY
11546 // SMSG_SET_PCT_SPELL_MODIFIER
11547 // SMSG_SET_FLAT_SPELL_MODIFIER
11548 // SMSG_UPDATE_AURA_DURATION
11549
11550 SendTalentsInfoData(false);
11551
11552 // SMSG_INSTANCE_DIFFICULTY
11553 data.Initialize(SMSG_INSTANCE_DIFFICULTY, 4 + 4);
11554 data << uint32(GetMap()->GetDifficulty());
11555 data << uint32(GetMap()->GetEntry()->IsDynamicDifficultyMap() && GetMap()->IsHeroic()); // Raid dynamic difficulty
11556 GetSession()->SendPacket(&data);
11557
11559
11560 data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4);
11561 data << uint32(0); // count, for (count) uint32;
11562 GetSession()->SendPacket(&data);
11563
11567
11569
11570 data.Initialize(SMSG_LOGIN_SETTIMESPEED, 4 + 4 + 4);
11571 data.AppendPackedTime(GameTime::GetGameTime().count());
11572 data << float(0.01666667f); // game speed
11573 data << uint32(0); // added in 3.1.2
11574 GetSession()->SendPacket(&data);
11575
11576 GetReputationMgr().SendForceReactions(); // SMSG_SET_FORCED_REACTIONS
11577
11578 // SMSG_TALENTS_INFO x 2 for pet (unspent points and talents in separate packets...)
11579 // SMSG_PET_GUIDS
11580 // SMSG_UPDATE_WORLD_STATE
11581 // SMSG_POWER_UPDATE
11582
11583 SetMover(this);
11584
11585 sScriptMgr->OnSendInitialPacketsBeforeAddToMap(this, data);
11586}
@ SMSG_INSTANCE_DIFFICULTY
Definition: Opcodes.h:857
@ SMSG_BINDPOINTUPDATE
Definition: Opcodes.h:371
@ SMSG_LOGIN_SETTIMESPEED
Definition: Opcodes.h:96
@ SMSG_SEND_UNLEARN_SPELLS
Definition: Opcodes.h:1084
void SendAllAchievementData() const
Definition: AchievementMgr.cpp:2382
void SendInitialSpells()
Definition: Player.cpp:2744
PlayerSocial * GetSocial()
Definition: Player.h:1141
void SendInitialActionButtons() const
Definition: Player.h:1820
void SendEquipmentSetList()
Definition: Player.cpp:14424
void SetMover(Unit *target)
Definition: Player.cpp:12844
void SendSocialList(Player *player, uint32 flags)
Definition: SocialMgr.cpp:124
void SendInitialReputations()
Definition: ReputationMgr.cpp:211
void SendForceReactions()
Definition: ReputationMgr.cpp:165

References ByteBuffer::AppendPackedTime(), GetDifficulty(), Object::GetEntry(), GameTime::GetGameTime(), WorldObject::GetMap(), GetReputationMgr(), GetSession(), GetSocial(), WorldPacket::Initialize(), m_achievementMgr, m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_reputationMgr, AchievementMgr::SendAllAchievementData(), SendEquipmentSetList(), ReputationMgr::SendForceReactions(), SendInitialActionButtons(), ReputationMgr::SendInitialReputations(), SendInitialSpells(), WorldSession::SendPacket(), PlayerSocial::SendSocialList(), SendTalentsInfoData(), SetMover(), SMSG_BINDPOINTUPDATE, SMSG_INSTANCE_DIFFICULTY, SMSG_LOGIN_SETTIMESPEED, SMSG_SEND_UNLEARN_SPELLS, SOCIAL_FLAG_ALL, and sScriptMgr.

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendInitialSpells()

void Player::SendInitialSpells ( )
2745{
2746 uint32 curTime = GameTime::GetGameTimeMS().count();
2748
2749 uint16 spellCount = 0;
2750
2751 WorldPacket data(SMSG_INITIAL_SPELLS, (1 + 2 + 4 * m_spells.size() + 2 + m_spellCooldowns.size() * (4 + 2 + 2 + 4 + 4)));
2752 data << uint8(0);
2753
2754 std::size_t countPos = data.wpos();
2755 data << uint16(spellCount); // spell count placeholder
2756
2757 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
2758 {
2759 if (itr->second->State == PLAYERSPELL_REMOVED)
2760 continue;
2761
2762 if (!itr->second->Active || !itr->second->IsInSpec(GetActiveSpec()))
2763 continue;
2764
2765 data << uint32(itr->first);
2766 data << uint16(0); // it's not slot id
2767
2768 ++spellCount;
2769 }
2770
2771 // Added spells from glyphs too (needed by spell tooltips)
2772 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
2773 {
2774 if (uint32 glyph = GetGlyph(i))
2775 {
2776 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyph))
2777 {
2778 data << uint32(glyphEntry->SpellId);
2779 data << uint16(0); // it's not slot id
2780
2781 ++spellCount;
2782 }
2783 }
2784 }
2785
2786 // xinef: we have to send talents, but not those on m_spells list
2787 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
2788 {
2789 if (itr->second->State == PLAYERSPELL_REMOVED)
2790 continue;
2791
2792 // xinef: remove all active talent auras
2793 if (!(itr->second->specMask & GetActiveSpecMask()))
2794 continue;
2795
2796 // xinef: already sent from m_spells
2797 if (itr->second->inSpellBook)
2798 continue;
2799
2800 data << uint32(itr->first);
2801 data << uint16(0); // it's not slot id
2802
2803 ++spellCount;
2804 }
2805
2806 data.put<uint16>(countPos, spellCount); // write real count value
2807
2808 uint16 spellCooldowns = m_spellCooldowns.size();
2809 data << uint16(spellCooldowns);
2810 for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr)
2811 {
2812 if (!itr->second.needSendToClient)
2813 continue;
2814
2815 SpellInfo const* sEntry = sSpellMgr->GetSpellInfo(itr->first);
2816 if (!sEntry)
2817 continue;
2818
2819 data << uint32(itr->first);
2820
2821 data << uint16(itr->second.itemid); // cast item id
2822 data << uint16(itr->second.category); // spell category
2823
2824 // send infinity cooldown in special format
2825 if (itr->second.end >= infTime)
2826 {
2827 data << uint32(1); // cooldown
2828 data << uint32(0x80000000); // category cooldown
2829 continue;
2830 }
2831
2832 uint32 cooldown = itr->second.end > curTime ? itr->second.end - curTime : 0;
2833 data << uint32(itr->second.category ? 0 : cooldown); // cooldown
2834 data << uint32(itr->second.category ? cooldown : 0); // category cooldown
2835 }
2836
2837 GetSession()->SendPacket(&data);
2838}
@ SMSG_INITIAL_SPELLS
Definition: Opcodes.h:328

References GetActiveSpec(), GetActiveSpecMask(), GameTime::GetGameTimeMS(), GetGlyph(), GetSession(), infinityCooldownDelayCheck, m_spellCooldowns, m_spells, m_talents, MAX_GLYPH_SLOT_INDEX, PLAYERSPELL_REMOVED, ByteBuffer::put(), WorldSession::SendPacket(), sGlyphPropertiesStore, SMSG_INITIAL_SPELLS, sSpellMgr, and ByteBuffer::wpos().

Referenced by SendInitialPacketsBeforeAddToMap().

◆ SendInitWorldStates()

void Player::SendInitWorldStates ( uint32  zone,
uint32  area 
)
8144{
8145 // data depends on zoneid/mapid...
8147 uint32 mapid = GetMapId();
8148 OutdoorPvP* pvp = sOutdoorPvPMgr->GetOutdoorPvPToZoneId(zoneid);
8149 InstanceScript* instance = GetInstanceScript();
8150 Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(zoneid);
8151
8152 LOG_DEBUG("network", "Sending SMSG_INIT_WORLD_STATES to Map: {}, Zone: {}", mapid, zoneid);
8153
8154 WorldPacket data(SMSG_INIT_WORLD_STATES, (4 + 4 + 4 + 2 + (12 * 8)));
8155 data << uint32(mapid); // mapid
8156 data << uint32(zoneid); // zone id
8157 data << uint32(areaid); // area id, new 2.1.0
8158 std::size_t countPos = data.wpos();
8159 data << uint16(0); // count of uint64 blocks
8160 data << uint32(0x8d8) << uint32(0x0); // 1
8161 data << uint32(0x8d7) << uint32(0x0); // 2
8162 data << uint32(0x8d6) << uint32(0x0); // 3
8163 data << uint32(0x8d5) << uint32(0x0); // 4
8164 data << uint32(0x8d4) << uint32(0x0); // 5
8165 data << uint32(0x8d3) << uint32(0x0); // 6
8166 // 7 1 - Arena season in progress, 0 - end of season
8167 data << uint32(0xC77) << uint32(sWorld->getBoolConfig(CONFIG_ARENA_SEASON_IN_PROGRESS));
8168 // 8 Arena season id
8169 data << uint32(0xF3D) << uint32(sWorld->getIntConfig(CONFIG_ARENA_SEASON_ID));
8170
8171 if (mapid == 530) // Outland
8172 {
8173 data << uint32(0x9bf) << uint32(0x0); // 7
8174 data << uint32(0x9bd) << uint32(0xF); // 8
8175 data << uint32(0x9bb) << uint32(0xF); // 9
8176 }
8177
8179 {
8180 Player::bgZoneIdToFillWorldStates[zoneid](bg, data);
8181 }
8182 else
8183 {
8184 // insert <field> <value>
8185 switch (zoneid)
8186 {
8187 case 1: // Dun Morogh
8188 case 11: // Wetlands
8189 case 12: // Elwynn Forest
8190 case 38: // Loch Modan
8191 case 40: // Westfall
8192 case 51: // Searing Gorge
8193 case 1519: // Stormwind City
8194 case 1537: // Ironforge
8195 case 2257: // Deeprun Tram
8196 case 3703: // Shattrath City
8197 break;
8198 case 139: // Eastern Plaguelands
8199 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_EP)
8200 pvp->FillInitialWorldStates(data);
8201 else
8202 {
8203 data << uint32(0x97a) << uint32(0x0); // 10 2426
8204 data << uint32(0x917) << uint32(0x0); // 11 2327
8205 data << uint32(0x918) << uint32(0x0); // 12 2328
8206 data << uint32(0x97b) << uint32(0x32); // 13 2427
8207 data << uint32(0x97c) << uint32(0x32); // 14 2428
8208 data << uint32(0x933) << uint32(0x1); // 15 2355
8209 data << uint32(0x946) << uint32(0x0); // 16 2374
8210 data << uint32(0x947) << uint32(0x0); // 17 2375
8211 data << uint32(0x948) << uint32(0x0); // 18 2376
8212 data << uint32(0x949) << uint32(0x0); // 19 2377
8213 data << uint32(0x94a) << uint32(0x0); // 20 2378
8214 data << uint32(0x94b) << uint32(0x0); // 21 2379
8215 data << uint32(0x932) << uint32(0x0); // 22 2354
8216 data << uint32(0x934) << uint32(0x0); // 23 2356
8217 data << uint32(0x935) << uint32(0x0); // 24 2357
8218 data << uint32(0x936) << uint32(0x0); // 25 2358
8219 data << uint32(0x937) << uint32(0x0); // 26 2359
8220 data << uint32(0x938) << uint32(0x0); // 27 2360
8221 data << uint32(0x939) << uint32(0x1); // 28 2361
8222 data << uint32(0x930) << uint32(0x1); // 29 2352
8223 data << uint32(0x93a) << uint32(0x0); // 30 2362
8224 data << uint32(0x93b) << uint32(0x0); // 31 2363
8225 data << uint32(0x93c) << uint32(0x0); // 32 2364
8226 data << uint32(0x93d) << uint32(0x0); // 33 2365
8227 data << uint32(0x944) << uint32(0x0); // 34 2372
8228 data << uint32(0x945) << uint32(0x0); // 35 2373
8229 data << uint32(0x931) << uint32(0x1); // 36 2353
8230 data << uint32(0x93e) << uint32(0x0); // 37 2366
8231 data << uint32(0x931) << uint32(0x1); // 38 2367 ?? grey horde not in dbc! send for consistency's sake, and to match field count
8232 data << uint32(0x940) << uint32(0x0); // 39 2368
8233 data << uint32(0x941) << uint32(0x0); // 7 2369
8234 data << uint32(0x942) << uint32(0x0); // 8 2370
8235 data << uint32(0x943) << uint32(0x0); // 9 2371
8236 }
8237 break;
8238 case 1377: // Silithus
8239 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_SI)
8240 pvp->FillInitialWorldStates(data);
8241 else
8242 {
8243 // states are always shown
8244 data << uint32(2313) << uint32(0x0); // 7 ally silityst gathered
8245 data << uint32(2314) << uint32(0x0); // 8 horde silityst gathered
8246 data << uint32(2317) << uint32(0x0); // 9 max silithyst
8247 }
8248 // dunno about these... aq opening event maybe?
8249 data << uint32(2322) << uint32(0x0); // 10 sandworm N
8250 data << uint32(2323) << uint32(0x0); // 11 sandworm S
8251 data << uint32(2324) << uint32(0x0); // 12 sandworm SW
8252 data << uint32(2325) << uint32(0x0); // 13 sandworm E
8253 break;
8254 case 2597: // Alterac Valley
8255 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_AV)
8256 bg->FillInitialWorldStates(data);
8257 else
8258 {
8259 data << uint32(0x7ae) << uint32(0x1); // 7 snowfall n
8260 data << uint32(0x532) << uint32(0x1); // 8 frostwolfhut hc
8261 data << uint32(0x531) << uint32(0x0); // 9 frostwolfhut ac
8262 data << uint32(0x52e) << uint32(0x0); // 10 stormpike firstaid a_a
8263 data << uint32(0x571) << uint32(0x0); // 11 east frostwolf tower horde assaulted -unused
8264 data << uint32(0x570) << uint32(0x0); // 12 west frostwolf tower horde assaulted - unused
8265 data << uint32(0x567) << uint32(0x1); // 13 frostwolfe c
8266 data << uint32(0x566) << uint32(0x1); // 14 frostwolfw c
8267 data << uint32(0x550) << uint32(0x1); // 15 irondeep (N) ally
8268 data << uint32(0x544) << uint32(0x0); // 16 ice grave a_a
8269 data << uint32(0x536) << uint32(0x0); // 17 stormpike grave h_c
8270 data << uint32(0x535) << uint32(0x1); // 18 stormpike grave a_c
8271 data << uint32(0x518) << uint32(0x0); // 19 stoneheart grave a_a
8272 data << uint32(0x517) << uint32(0x0); // 20 stoneheart grave h_a
8273 data << uint32(0x574) << uint32(0x0); // 21 1396 unk
8274 data << uint32(0x573) << uint32(0x0); // 22 iceblood tower horde assaulted -unused
8275 data << uint32(0x572) << uint32(0x0); // 23 towerpoint horde assaulted - unused
8276 data << uint32(0x56f) << uint32(0x0); // 24 1391 unk
8277 data << uint32(0x56e) << uint32(0x0); // 25 iceblood a
8278 data << uint32(0x56d) << uint32(0x0); // 26 towerp a
8279 data << uint32(0x56c) << uint32(0x0); // 27 frostwolfe a
8280 data << uint32(0x56b) << uint32(0x0); // 28 froswolfw a
8281 data << uint32(0x56a) << uint32(0x1); // 29 1386 unk
8282 data << uint32(0x569) << uint32(0x1); // 30 iceblood c
8283 data << uint32(0x568) << uint32(0x1); // 31 towerp c
8284 data << uint32(0x565) << uint32(0x0); // 32 stoneh tower a
8285 data << uint32(0x564) << uint32(0x0); // 33 icewing tower a
8286 data << uint32(0x563) << uint32(0x0); // 34 dunn a
8287 data << uint32(0x562) << uint32(0x0); // 35 duns a
8288 data << uint32(0x561) << uint32(0x0); // 36 stoneheart bunker alliance assaulted - unused
8289 data << uint32(0x560) << uint32(0x0); // 37 icewing bunker alliance assaulted - unused
8290 data << uint32(0x55f) << uint32(0x0); // 38 dunbaldar south alliance assaulted - unused
8291 data << uint32(0x55e) << uint32(0x0); // 39 dunbaldar north alliance assaulted - unused
8292 data << uint32(0x55d) << uint32(0x0); // 40 stone tower d
8293 data << uint32(0x3c6) << uint32(0x0); // 41 966 unk
8294 data << uint32(0x3c4) << uint32(0x0); // 42 964 unk
8295 data << uint32(0x3c2) << uint32(0x0); // 43 962 unk
8296 data << uint32(0x516) << uint32(0x1); // 44 stoneheart grave a_c
8297 data << uint32(0x515) << uint32(0x0); // 45 stonheart grave h_c
8298 data << uint32(0x3b6) << uint32(0x0); // 46 950 unk
8299 data << uint32(0x55c) << uint32(0x0); // 47 icewing tower d
8300 data << uint32(0x55b) << uint32(0x0); // 48 dunn d
8301 data << uint32(0x55a) << uint32(0x0); // 49 duns d
8302 data << uint32(0x559) << uint32(0x0); // 50 1369 unk
8303 data << uint32(0x558) << uint32(0x0); // 51 iceblood d
8304 data << uint32(0x557) << uint32(0x0); // 52 towerp d
8305 data << uint32(0x556) << uint32(0x0); // 53 frostwolfe d
8306 data << uint32(0x555) << uint32(0x0); // 54 frostwolfw d
8307 data << uint32(0x554) << uint32(0x1); // 55 stoneh tower c
8308 data << uint32(0x553) << uint32(0x1); // 56 icewing tower c
8309 data << uint32(0x552) << uint32(0x1); // 57 dunn c
8310 data << uint32(0x551) << uint32(0x1); // 58 duns c
8311 data << uint32(0x54f) << uint32(0x0); // 59 irondeep (N) horde
8312 data << uint32(0x54e) << uint32(0x0); // 60 irondeep (N) ally
8313 data << uint32(0x54d) << uint32(0x1); // 61 mine (S) neutral
8314 data << uint32(0x54c) << uint32(0x0); // 62 mine (S) horde
8315 data << uint32(0x54b) << uint32(0x0); // 63 mine (S) ally
8316 data << uint32(0x545) << uint32(0x0); // 64 iceblood h_a
8317 data << uint32(0x543) << uint32(0x1); // 65 iceblod h_c
8318 data << uint32(0x542) << uint32(0x0); // 66 iceblood a_c
8319 data << uint32(0x540) << uint32(0x0); // 67 snowfall h_a
8320 data << uint32(0x53f) << uint32(0x0); // 68 snowfall a_a
8321 data << uint32(0x53e) << uint32(0x0); // 69 snowfall h_c
8322 data << uint32(0x53d) << uint32(0x0); // 70 snowfall a_c
8323 data << uint32(0x53c) << uint32(0x0); // 71 frostwolf g h_a
8324 data << uint32(0x53b) << uint32(0x0); // 72 frostwolf g a_a
8325 data << uint32(0x53a) << uint32(0x1); // 73 frostwolf g h_c
8326 data << uint32(0x539) << uint32(0x0); // 74 frostwolf g a_c
8327 data << uint32(0x538) << uint32(0x0); // 75 stormpike grave h_a
8328 data << uint32(0x537) << uint32(0x0); // 76 stormpike grave a_a
8329 data << uint32(0x534) << uint32(0x0); // 77 frostwolf hut h_a
8330 data << uint32(0x533) << uint32(0x0); // 78 frostwolf hut a_a
8331 data << uint32(0x530) << uint32(0x0); // 79 stormpike first aid h_a
8332 data << uint32(0x52f) << uint32(0x0); // 80 stormpike first aid h_c
8333 data << uint32(0x52d) << uint32(0x1); // 81 stormpike first aid a_c
8334 }
8335 break;
8336 case 3277: // Warsong Gulch
8337 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_WS)
8338 bg->FillInitialWorldStates(data);
8339 else
8340 {
8341 data << uint32(0x62d) << uint32(0x0); // 7 1581 alliance flag captures
8342 data << uint32(0x62e) << uint32(0x0); // 8 1582 horde flag captures
8343 data << uint32(0x609) << uint32(0x0); // 9 1545 unk, set to 1 on alliance flag pickup...
8344 data << uint32(0x60a) << uint32(0x0); // 10 1546 unk, set to 1 on horde flag pickup, after drop it's -1
8345 data << uint32(0x60b) << uint32(0x2); // 11 1547 unk
8346 data << uint32(0x641) << uint32(0x3); // 12 1601 unk (max flag captures?)
8347 data << uint32(0x922) << uint32(0x1); // 13 2338 horde (0 - hide, 1 - flag ok, 2 - flag picked up (flashing), 3 - flag picked up (not flashing)
8348 data << uint32(0x923) << uint32(0x1); // 14 2339 alliance (0 - hide, 1 - flag ok, 2 - flag picked up (flashing), 3 - flag picked up (not flashing)
8349 }
8350 break;
8351 case 3358: // Arathi Basin
8352 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_AB)
8353 bg->FillInitialWorldStates(data);
8354 else
8355 {
8356 data << uint32(0x6e7) << uint32(0x0); // 7 1767 stables alliance
8357 data << uint32(0x6e8) << uint32(0x0); // 8 1768 stables horde
8358 data << uint32(0x6e9) << uint32(0x0); // 9 1769 unk, ST?
8359 data << uint32(0x6ea) << uint32(0x0); // 10 1770 stables (show/hide)
8360 data << uint32(0x6ec) << uint32(0x0); // 11 1772 farm (0 - horde controlled, 1 - alliance controlled)
8361 data << uint32(0x6ed) << uint32(0x0); // 12 1773 farm (show/hide)
8362 data << uint32(0x6ee) << uint32(0x0); // 13 1774 farm color
8363 data << uint32(0x6ef) << uint32(0x0); // 14 1775 gold mine color, may be FM?
8364 data << uint32(0x6f0) << uint32(0x0); // 15 1776 alliance resources
8365 data << uint32(0x6f1) << uint32(0x0); // 16 1777 horde resources
8366 data << uint32(0x6f2) << uint32(0x0); // 17 1778 horde bases
8367 data << uint32(0x6f3) << uint32(0x0); // 18 1779 alliance bases
8368 data << uint32(0x6f4) << uint32(0x640); // 19 1780 max resources (1600)
8369 data << uint32(0x6f6) << uint32(0x0); // 20 1782 blacksmith color
8370 data << uint32(0x6f7) << uint32(0x0); // 21 1783 blacksmith (show/hide)
8371 data << uint32(0x6f8) << uint32(0x0); // 22 1784 unk, bs?
8372 data << uint32(0x6f9) << uint32(0x0); // 23 1785 unk, bs?
8373 data << uint32(0x6fb) << uint32(0x0); // 24 1787 gold mine (0 - horde contr, 1 - alliance contr)
8374 data << uint32(0x6fc) << uint32(0x0); // 25 1788 gold mine (0 - conflict, 1 - horde)
8375 data << uint32(0x6fd) << uint32(0x0); // 26 1789 gold mine (1 - show/0 - hide)
8376 data << uint32(0x6fe) << uint32(0x0); // 27 1790 gold mine color
8377 data << uint32(0x700) << uint32(0x0); // 28 1792 gold mine color, may be LM?
8378 data << uint32(0x701) << uint32(0x0); // 29 1793 lumber mill color (0 - conflict, 1 - horde contr)
8379 data << uint32(0x702) << uint32(0x0); // 30 1794 lumber mill (show/hide)
8380 data << uint32(0x703) << uint32(0x0); // 31 1795 lumber mill color color
8381 data << uint32(0x732) << uint32(0x1); // 32 1842 stables (1 - uncontrolled)
8382 data << uint32(0x733) << uint32(0x1); // 33 1843 gold mine (1 - uncontrolled)
8383 data << uint32(0x734) << uint32(0x1); // 34 1844 lumber mill (1 - uncontrolled)
8384 data << uint32(0x735) << uint32(0x1); // 35 1845 farm (1 - uncontrolled)
8385 data << uint32(0x736) << uint32(0x1); // 36 1846 blacksmith (1 - uncontrolled)
8386 data << uint32(0x745) << uint32(0x2); // 37 1861 unk
8387 data << uint32(0x7a3) << uint32(0x578); // 38 1955 warning limit (1400)
8388 }
8389 break;
8390 case 3820: // Eye of the Storm
8391 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_EY)
8392 bg->FillInitialWorldStates(data);
8393 else
8394 {
8395 data << uint32(0xac1) << uint32(0x0); // 7 2753 Horde Bases
8396 data << uint32(0xac0) << uint32(0x0); // 8 2752 Alliance Bases
8397 data << uint32(0xab6) << uint32(0x0); // 9 2742 Mage Tower - Horde conflict
8398 data << uint32(0xab5) << uint32(0x0); // 10 2741 Mage Tower - Alliance conflict
8399 data << uint32(0xab4) << uint32(0x0); // 11 2740 Fel Reaver - Horde conflict
8400 data << uint32(0xab3) << uint32(0x0); // 12 2739 Fel Reaver - Alliance conflict
8401 data << uint32(0xab2) << uint32(0x0); // 13 2738 Draenei - Alliance conflict
8402 data << uint32(0xab1) << uint32(0x0); // 14 2737 Draenei - Horde conflict
8403 data << uint32(0xab0) << uint32(0x0); // 15 2736 unk // 0 at start
8404 data << uint32(0xaaf) << uint32(0x0); // 16 2735 unk // 0 at start
8405 data << uint32(0xaad) << uint32(0x0); // 17 2733 Draenei - Horde control
8406 data << uint32(0xaac) << uint32(0x0); // 18 2732 Draenei - Alliance control
8407 data << uint32(0xaab) << uint32(0x1); // 19 2731 Draenei uncontrolled (1 - yes, 0 - no)
8408 data << uint32(0xaaa) << uint32(0x0); // 20 2730 Mage Tower - Alliance control
8409 data << uint32(0xaa9) << uint32(0x0); // 21 2729 Mage Tower - Horde control
8410 data << uint32(0xaa8) << uint32(0x1); // 22 2728 Mage Tower uncontrolled (1 - yes, 0 - no)
8411 data << uint32(0xaa7) << uint32(0x0); // 23 2727 Fel Reaver - Horde control
8412 data << uint32(0xaa6) << uint32(0x0); // 24 2726 Fel Reaver - Alliance control
8413 data << uint32(0xaa5) << uint32(0x1); // 25 2725 Fel Reaver uncontrolled (1 - yes, 0 - no)
8414 data << uint32(0xaa4) << uint32(0x0); // 26 2724 Boold Elf - Horde control
8415 data << uint32(0xaa3) << uint32(0x0); // 27 2723 Boold Elf - Alliance control
8416 data << uint32(0xaa2) << uint32(0x1); // 28 2722 Boold Elf uncontrolled (1 - yes, 0 - no)
8417 data << uint32(0xac5) << uint32(0x1); // 29 2757 Flag (1 - show, 0 - hide) - doesn't work exactly this way!
8418 data << uint32(0xad2) << uint32(0x1); // 30 2770 Horde top-stats (1 - show, 0 - hide) // 02 -> horde picked up the flag
8419 data << uint32(0xad1) << uint32(0x1); // 31 2769 Alliance top-stats (1 - show, 0 - hide) // 02 -> alliance picked up the flag
8420 data << uint32(0xabe) << uint32(0x0); // 32 2750 Horde resources
8421 data << uint32(0xabd) << uint32(0x0); // 33 2749 Alliance resources
8422 data << uint32(0xa05) << uint32(0x8e); // 34 2565 unk, constant?
8423 data << uint32(0xaa0) << uint32(0x0); // 35 2720 Capturing progress-bar (100 -> empty (only grey), 0 -> blue|red (no grey), default 0)
8424 data << uint32(0xa9f) << uint32(0x0); // 36 2719 Capturing progress-bar (0 - left, 100 - right)
8425 data << uint32(0xa9e) << uint32(0x0); // 37 2718 Capturing progress-bar (1 - show, 0 - hide)
8426 data << uint32(0xc0d) << uint32(0x17b); // 38 3085 unk
8427 // and some more ... unknown
8428 }
8429 break;
8430 // any of these needs change! the client remembers the prev setting!
8431 // ON EVERY ZONE LEAVE, RESET THE OLD ZONE'S WORLD STATE, BUT AT LEAST THE UI STUFF!
8432 case 3483: // Hellfire Peninsula
8433 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_HP)
8434 pvp->FillInitialWorldStates(data);
8435 else
8436 {
8437 data << uint32(0x9ba) << uint32(0x1); // 10 // add ally tower main gui icon // maybe should be sent only on login?
8438 data << uint32(0x9b9) << uint32(0x1); // 11 // add horde tower main gui icon // maybe should be sent only on login?
8439 data << uint32(0x9b5) << uint32(0x0); // 12 // show neutral broken hill icon // 2485
8440 data << uint32(0x9b4) << uint32(0x1); // 13 // show icon above broken hill // 2484
8441 data << uint32(0x9b3) << uint32(0x0); // 14 // show ally broken hill icon // 2483
8442 data << uint32(0x9b2) << uint32(0x0); // 15 // show neutral overlook icon // 2482
8443 data << uint32(0x9b1) << uint32(0x1); // 16 // show the overlook arrow // 2481
8444 data << uint32(0x9b0) << uint32(0x0); // 17 // show ally overlook icon // 2480
8445 data << uint32(0x9ae) << uint32(0x0); // 18 // horde pvp objectives captured // 2478
8446 data << uint32(0x9ac) << uint32(0x0); // 19 // ally pvp objectives captured // 2476
8447 data << uint32(2475) << uint32(100); //: ally / horde slider grey area // show only in direct vicinity!
8448 data << uint32(2474) << uint32(50); //: ally / horde slider percentage, 100 for ally, 0 for horde // show only in direct vicinity!
8449 data << uint32(2473) << uint32(0); //: ally / horde slider display // show only in direct vicinity!
8450 data << uint32(0x9a8) << uint32(0x0); // 20 // show the neutral stadium icon // 2472
8451 data << uint32(0x9a7) << uint32(0x0); // 21 // show the ally stadium icon // 2471
8452 data << uint32(0x9a6) << uint32(0x1); // 22 // show the horde stadium icon // 2470
8453 }
8454 break;
8455 case 3518: // Nagrand
8456 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_NA)
8457 pvp->FillInitialWorldStates(data);
8458 else
8459 {
8460 data << uint32(2503) << uint32(0x0); // 10
8461 data << uint32(2502) << uint32(0x0); // 11
8462 data << uint32(2493) << uint32(0x0); // 12
8463 data << uint32(2491) << uint32(0x0); // 13
8464
8465 data << uint32(2495) << uint32(0x0); // 14
8466 data << uint32(2494) << uint32(0x0); // 15
8467 data << uint32(2497) << uint32(0x0); // 16
8468
8469 data << uint32(2762) << uint32(0x0); // 17
8470 data << uint32(2662) << uint32(0x0); // 18
8471 data << uint32(2663) << uint32(0x0); // 19
8472 data << uint32(2664) << uint32(0x0); // 20
8473
8474 data << uint32(2760) << uint32(0x0); // 21
8475 data << uint32(2670) << uint32(0x0); // 22
8476 data << uint32(2668) << uint32(0x0); // 23
8477 data << uint32(2669) << uint32(0x0); // 24
8478
8479 data << uint32(2761) << uint32(0x0); // 25
8480 data << uint32(2667) << uint32(0x0); // 26
8481 data << uint32(2665) << uint32(0x0); // 27
8482 data << uint32(2666) << uint32(0x0); // 28
8483
8484 data << uint32(2763) << uint32(0x0); // 29
8485 data << uint32(2659) << uint32(0x0); // 30
8486 data << uint32(2660) << uint32(0x0); // 31
8487 data << uint32(2661) << uint32(0x0); // 32
8488
8489 data << uint32(2671) << uint32(0x0); // 33
8490 data << uint32(2676) << uint32(0x0); // 34
8491 data << uint32(2677) << uint32(0x0); // 35
8492 data << uint32(2672) << uint32(0x0); // 36
8493 data << uint32(2673) << uint32(0x0); // 37
8494 }
8495 break;
8496 case 3519: // Terokkar Forest
8497 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_TF)
8498 pvp->FillInitialWorldStates(data);
8499 else
8500 {
8501 data << uint32(0xa41) << uint32(0x0); // 10 // 2625 capture bar pos
8502 data << uint32(0xa40) << uint32(0x14); // 11 // 2624 capture bar neutral
8503 data << uint32(0xa3f) << uint32(0x0); // 12 // 2623 show capture bar
8504 data << uint32(0xa3e) << uint32(0x0); // 13 // 2622 horde towers controlled
8505 data << uint32(0xa3d) << uint32(0x5); // 14 // 2621 ally towers controlled
8506 data << uint32(0xa3c) << uint32(0x0); // 15 // 2620 show towers controlled
8507 data << uint32(0xa88) << uint32(0x0); // 16 // 2696 SE Neu
8508 data << uint32(0xa87) << uint32(0x0); // 17 // SE Horde
8509 data << uint32(0xa86) << uint32(0x0); // 18 // SE Ally
8510 data << uint32(0xa85) << uint32(0x0); // 19 //S Neu
8511 data << uint32(0xa84) << uint32(0x0); // 20 S Horde
8512 data << uint32(0xa83) << uint32(0x0); // 21 S Ally
8513 data << uint32(0xa82) << uint32(0x0); // 22 NE Neu
8514 data << uint32(0xa81) << uint32(0x0); // 23 NE Horde
8515 data << uint32(0xa80) << uint32(0x0); // 24 NE Ally
8516 data << uint32(0xa7e) << uint32(0x0); // 25 // 2686 N Neu
8517 data << uint32(0xa7d) << uint32(0x0); // 26 N Horde
8518 data << uint32(0xa7c) << uint32(0x0); // 27 N Ally
8519 data << uint32(0xa7b) << uint32(0x0); // 28 NW Ally
8520 data << uint32(0xa7a) << uint32(0x0); // 29 NW Horde
8521 data << uint32(0xa79) << uint32(0x0); // 30 NW Neutral
8522 data << uint32(0x9d0) << uint32(0x5); // 31 // 2512 locked time remaining seconds first digit
8523 data << uint32(0x9ce) << uint32(0x0); // 32 // 2510 locked time remaining seconds second digit
8524 data << uint32(0x9cd) << uint32(0x0); // 33 // 2509 locked time remaining minutes
8525 data << uint32(0x9cc) << uint32(0x0); // 34 // 2508 neutral locked time show
8526 data << uint32(0xad0) << uint32(0x0); // 35 // 2768 horde locked time show
8527 data << uint32(0xacf) << uint32(0x1); // 36 // 2767 ally locked time show
8528 }
8529 break;
8530 case 3521: // Zangarmarsh
8531 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_ZM)
8532 pvp->FillInitialWorldStates(data);
8533 else
8534 {
8535 data << uint32(0x9e1) << uint32(0x0); // 10 //2529
8536 data << uint32(0x9e0) << uint32(0x0); // 11
8537 data << uint32(0x9df) << uint32(0x0); // 12
8538 data << uint32(0xa5d) << uint32(0x1); // 13 //2653
8539 data << uint32(0xa5c) << uint32(0x0); // 14 //2652 east beacon neutral
8540 data << uint32(0xa5b) << uint32(0x1); // 15 horde
8541 data << uint32(0xa5a) << uint32(0x0); // 16 ally
8542 data << uint32(0xa59) << uint32(0x1); // 17 // 2649 Twin spire graveyard horde 12???
8543 data << uint32(0xa58) << uint32(0x0); // 18 ally 14 ???
8544 data << uint32(0xa57) << uint32(0x0); // 19 neutral 7???
8545 data << uint32(0xa56) << uint32(0x0); // 20 // 2646 west beacon neutral
8546 data << uint32(0xa55) << uint32(0x1); // 21 horde
8547 data << uint32(0xa54) << uint32(0x0); // 22 ally
8548 data << uint32(0x9e7) << uint32(0x0); // 23 // 2535
8549 data << uint32(0x9e6) << uint32(0x0); // 24
8550 data << uint32(0x9e5) << uint32(0x0); // 25
8551 data << uint32(0xa00) << uint32(0x0); // 26 // 2560
8552 data << uint32(0x9ff) << uint32(0x1); // 27
8553 data << uint32(0x9fe) << uint32(0x0); // 28
8554 data << uint32(0x9fd) << uint32(0x0); // 29
8555 data << uint32(0x9fc) << uint32(0x1); // 30
8556 data << uint32(0x9fb) << uint32(0x0); // 31
8557 data << uint32(0xa62) << uint32(0x0); // 32 // 2658
8558 data << uint32(0xa61) << uint32(0x1); // 33
8559 data << uint32(0xa60) << uint32(0x1); // 34
8560 data << uint32(0xa5f) << uint32(0x0); // 35
8561 }
8562 break;
8563 case 3698: // Nagrand Arena
8564 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_NA)
8565 bg->FillInitialWorldStates(data);
8566 else
8567 {
8568 data << uint32(0xa0f) << uint32(0x0); // 7
8569 data << uint32(0xa10) << uint32(0x0); // 8
8570 data << uint32(0xa11) << uint32(0x0); // 9 show
8571 }
8572 break;
8573 case 3702: // Blade's Edge Arena
8574 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_BE)
8575 bg->FillInitialWorldStates(data);
8576 else
8577 {
8578 data << uint32(0x9f0) << uint32(0x0); // 7 gold
8579 data << uint32(0x9f1) << uint32(0x0); // 8 green
8580 data << uint32(0x9f3) << uint32(0x0); // 9 show
8581 }
8582 break;
8583 case 3968: // Ruins of Lordaeron
8584 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_RL)
8585 bg->FillInitialWorldStates(data);
8586 else
8587 {
8588 data << uint32(0xbb8) << uint32(0x0); // 7 gold
8589 data << uint32(0xbb9) << uint32(0x0); // 8 green
8590 data << uint32(0xbba) << uint32(0x0); // 9 show
8591 }
8592 break;
8593 case 4378: // Dalaran Sewers
8594 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_DS)
8595 bg->FillInitialWorldStates(data);
8596 else
8597 {
8598 data << uint32(3601) << uint32(0x0); // 7 gold
8599 data << uint32(3600) << uint32(0x0); // 8 green
8600 data << uint32(3610) << uint32(0x0); // 9 show
8601 }
8602 break;
8603 case 4384: // Strand of the Ancients
8604 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_SA)
8605 bg->FillInitialWorldStates(data);
8606 else
8607 {
8608 // 1-3 A defend, 4-6 H defend, 7-9 unk defend, 1 - ok, 2 - half destroyed, 3 - destroyed
8609 data << uint32(0xf09) << uint32(0x0); // 7 3849 Gate of Temple
8610 data << uint32(0xe36) << uint32(0x0); // 8 3638 Gate of Yellow Moon
8611 data << uint32(0xe27) << uint32(0x0); // 9 3623 Gate of Green Emerald
8612 data << uint32(0xe24) << uint32(0x0); // 10 3620 Gate of Blue Sapphire
8613 data << uint32(0xe21) << uint32(0x0); // 11 3617 Gate of Red Sun
8614 data << uint32(0xe1e) << uint32(0x0); // 12 3614 Gate of Purple Ametyst
8615
8616 data << uint32(0xdf3) << uint32(0x0); // 13 3571 bonus timer (1 - on, 0 - off)
8617 data << uint32(0xded) << uint32(0x0); // 14 3565 Horde Attacker
8618 data << uint32(0xdec) << uint32(0x0); // 15 3564 Alliance Attacker
8619 // End Round (timer), better explain this by example, eg. ends in 19:59 -> A:BC
8620 data << uint32(0xde9) << uint32(0x0); // 16 3561 C
8621 data << uint32(0xde8) << uint32(0x0); // 17 3560 B
8622 data << uint32(0xde7) << uint32(0x0); // 18 3559 A
8623 data << uint32(0xe35) << uint32(0x0); // 19 3637 East g - Horde control
8624 data << uint32(0xe34) << uint32(0x0); // 20 3636 West g - Horde control
8625 data << uint32(0xe33) << uint32(0x0); // 21 3635 South g - Horde control
8626 data << uint32(0xe32) << uint32(0x0); // 22 3634 East g - Alliance control
8627 data << uint32(0xe31) << uint32(0x0); // 23 3633 West g - Alliance control
8628 data << uint32(0xe30) << uint32(0x0); // 24 3632 South g - Alliance control
8629 data << uint32(0xe2f) << uint32(0x0); // 25 3631 Chamber of Ancients - Horde control
8630 data << uint32(0xe2e) << uint32(0x0); // 26 3630 Chamber of Ancients - Alliance control
8631 data << uint32(0xe2d) << uint32(0x0); // 27 3629 Beach1 - Horde control
8632 data << uint32(0xe2c) << uint32(0x0); // 28 3628 Beach2 - Horde control
8633 data << uint32(0xe2b) << uint32(0x0); // 29 3627 Beach1 - Alliance control
8634 data << uint32(0xe2a) << uint32(0x0); // 30 3626 Beach2 - Alliance control
8635 // and many unks...
8636 }
8637 break;
8638 case 4406: // Ring of Valor
8639 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_RV)
8640 bg->FillInitialWorldStates(data);
8641 else
8642 {
8643 data << uint32(0xe10) << uint32(0x0); // 7 gold
8644 data << uint32(0xe11) << uint32(0x0); // 8 green
8645 data << uint32(0xe1a) << uint32(0x0); // 9 show
8646 }
8647 break;
8648 case 4710: // Isle of Conquest
8649 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_IC)
8650 bg->FillInitialWorldStates(data);
8651 else
8652 {
8653 data << uint32(4221) << uint32(1); // 7 BG_IC_ALLIANCE_RENFORT_SET
8654 data << uint32(4222) << uint32(1); // 8 BG_IC_HORDE_RENFORT_SET
8655 data << uint32(4226) << uint32(300); // 9 BG_IC_ALLIANCE_RENFORT
8656 data << uint32(4227) << uint32(300); // 10 BG_IC_HORDE_RENFORT
8657 data << uint32(4322) << uint32(1); // 11 BG_IC_GATE_FRONT_H_WS_OPEN
8658 data << uint32(4321) << uint32(1); // 12 BG_IC_GATE_WEST_H_WS_OPEN
8659 data << uint32(4320) << uint32(1); // 13 BG_IC_GATE_EAST_H_WS_OPEN
8660 data << uint32(4323) << uint32(1); // 14 BG_IC_GATE_FRONT_A_WS_OPEN
8661 data << uint32(4324) << uint32(1); // 15 BG_IC_GATE_WEST_A_WS_OPEN
8662 data << uint32(4325) << uint32(1); // 16 BG_IC_GATE_EAST_A_WS_OPEN
8663 data << uint32(4317) << uint32(1); // 17 unknown
8664
8665 data << uint32(4301) << uint32(1); // 18 BG_IC_DOCKS_UNCONTROLLED
8666 data << uint32(4296) << uint32(1); // 19 BG_IC_HANGAR_UNCONTROLLED
8667 data << uint32(4306) << uint32(1); // 20 BG_IC_QUARRY_UNCONTROLLED
8668 data << uint32(4311) << uint32(1); // 21 BG_IC_REFINERY_UNCONTROLLED
8669 data << uint32(4294) << uint32(1); // 22 BG_IC_WORKSHOP_UNCONTROLLED
8670 data << uint32(4243) << uint32(1); // 23 unknown
8671 data << uint32(4345) << uint32(1); // 24 unknown
8672 }
8673 break;
8674 // The Ruby Sanctum
8675 case 4987:
8676 if (instance && mapid == 724)
8677 instance->FillInitialWorldStates(data);
8678 else
8679 {
8680 data << uint32(5049) << uint32(50); // 9 WORLDSTATE_CORPOREALITY_MATERIAL
8681 data << uint32(5050) << uint32(50); // 10 WORLDSTATE_CORPOREALITY_TWILIGHT
8682 data << uint32(5051) << uint32(0); // 11 WORLDSTATE_CORPOREALITY_TOGGLE
8683 }
8684 break;
8685 // Icecrown Citadel
8686 case 4812:
8687 if (instance && mapid == 631)
8688 instance->FillInitialWorldStates(data);
8689 else
8690 {
8691 data << uint32(4903) << uint32(0); // 9 WORLDSTATE_SHOW_TIMER (Blood Quickening weekly)
8692 data << uint32(4904) << uint32(30); // 10 WORLDSTATE_EXECUTION_TIME
8693 data << uint32(4940) << uint32(0); // 11 WORLDSTATE_SHOW_ATTEMPTS
8694 data << uint32(4941) << uint32(50); // 12 WORLDSTATE_ATTEMPTS_REMAINING
8695 data << uint32(4942) << uint32(50); // 13 WORLDSTATE_ATTEMPTS_MAX
8696 }
8697 break;
8698 // The Culling of Stratholme
8699 case 4100:
8700 if (instance && mapid == 595)
8701 instance->FillInitialWorldStates(data);
8702 else
8703 {
8704 data << uint32(3479) << uint32(0); // 9 WORLDSTATE_SHOW_CRATES
8705 data << uint32(3480) << uint32(0); // 10 WORLDSTATE_CRATES_REVEALED
8706 data << uint32(3504) << uint32(0); // 11 WORLDSTATE_WAVE_COUNT
8707 data << uint32(3931) << uint32(25); // 12 WORLDSTATE_TIME_GUARDIAN
8708 data << uint32(3932) << uint32(0); // 13 WORLDSTATE_TIME_GUARDIAN_SHOW
8709 }
8710 break;
8711 // The Oculus
8712 case 4228:
8713 if (instance && mapid == 578)
8714 instance->FillInitialWorldStates(data);
8715 else
8716 {
8717 data << uint32(3524) << uint32(0); // 9 WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW
8718 data << uint32(3486) << uint32(0); // 10 WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT
8719 }
8720 break;
8721 // Ulduar
8722 case 4273:
8723 if (instance && mapid == 603)
8724 instance->FillInitialWorldStates(data);
8725 else
8726 {
8727 data << uint32(4132) << uint32(0); // 9 WORLDSTATE_ALGALON_TIMER_ENABLED
8728 data << uint32(4131) << uint32(0); // 10 WORLDSTATE_ALGALON_DESPAWN_TIMER
8729 }
8730 break;
8731 // Halls of Refection
8732 case 4820:
8733 if (instance && mapid == 668)
8734 instance->FillInitialWorldStates(data);
8735 else
8736 {
8737 data << uint32(4884) << uint32(0); // 9 WORLD_STATE_HOR_WAVES_ENABLED
8738 data << uint32(4882) << uint32(0); // 10 WORLD_STATE_HOR_WAVE_COUNT
8739 }
8740 break;
8741 // Scarlet Enclave (DK starting zone)
8742 case 4298:
8743 // Get Mograine, GUID and ENTRY should NEVER change
8744 if (Creature* mograine = ObjectAccessor::GetCreature(*this, ObjectGuid::Create<HighGuid::Unit>(29173, 130956)))
8745 {
8746 if (CreatureAI* mograineAI = mograine->AI())
8747 {
8748 data << uint32(3590) << uint32(mograineAI->GetData(3590));
8749 data << uint32(3591) << uint32(mograineAI->GetData(3591));
8750 data << uint32(3592) << uint32(mograineAI->GetData(3592));
8751 data << uint32(3603) << uint32(mograineAI->GetData(3603));
8752 data << uint32(3604) << uint32(mograineAI->GetData(3604));
8753 data << uint32(3605) << uint32(mograineAI->GetData(3605));
8754 }
8755 }
8756 break;
8757 // Wintergrasp
8758 case 4197:
8759 if (bf && bf->GetTypeId() == BATTLEFIELD_WG)
8760 {
8761 bf->FillInitialWorldStates(data);
8762 break;
8763 }
8764 [[fallthrough]];
8765 default:
8766 data << uint32(0x914) << uint32(0x0); // 7
8767 data << uint32(0x913) << uint32(0x0); // 8
8768 data << uint32(0x912) << uint32(0x0); // 9
8769 data << uint32(0x915) << uint32(0x0); // 10
8770 break;
8771 }
8772 }
8773
8774 uint16 length = (data.wpos() - countPos) / 8;
8775 data.put<uint16>(countPos, length);
8776
8777 GetSession()->SendPacket(&data);
8780}
@ BATTLEFIELD_WG
Definition: Battlefield.h:31
@ OUTDOOR_PVP_SI
Definition: OutdoorPvP.h:34
@ OUTDOOR_PVP_TF
Definition: OutdoorPvP.h:32
@ OUTDOOR_PVP_ZM
Definition: OutdoorPvP.h:33
@ OUTDOOR_PVP_EP
Definition: OutdoorPvP.h:35
@ OUTDOOR_PVP_NA
Definition: OutdoorPvP.h:31
@ OUTDOOR_PVP_HP
Definition: OutdoorPvP.h:30
@ CONFIG_ARENA_SEASON_ID
Definition: IWorld.h:331
@ CONFIG_ARENA_SEASON_IN_PROGRESS
Definition: IWorld.h:124
@ BATTLEGROUND_IC
Definition: SharedDefines.h:3492
@ BATTLEGROUND_WS
Definition: SharedDefines.h:3482
@ BATTLEGROUND_EY
Definition: SharedDefines.h:3487
@ BATTLEGROUND_AV
Definition: SharedDefines.h:3481
@ BATTLEGROUND_BE
Definition: SharedDefines.h:3485
@ BATTLEGROUND_RV
Definition: SharedDefines.h:3491
@ BATTLEGROUND_NA
Definition: SharedDefines.h:3484
@ BATTLEGROUND_DS
Definition: SharedDefines.h:3490
@ BATTLEGROUND_SA
Definition: SharedDefines.h:3489
@ BATTLEGROUND_AB
Definition: SharedDefines.h:3483
@ BATTLEGROUND_RL
Definition: SharedDefines.h:3488
@ SMSG_INIT_WORLD_STATES
Definition: Opcodes.h:736
Definition: CreatureAI.h:71
virtual void FillInitialWorldStates(WorldPacket &)=0
uint32 GetTypeId()
Definition: Battlefield.h:243
virtual void FillInitialWorldStates(WorldPacket &)
Definition: Battleground.h:443
BattlegroundTypeId GetBgTypeID(bool GetRandom=false) const
Definition: Battleground.h:324
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1192
void SendBGWeekendWorldStates()
Definition: Player.cpp:8782
void SendBattlefieldWorldStates()
Definition: Player.cpp:8797
static std::unordered_map< int, bgZoneRef > bgZoneIdToFillWorldStates
Definition: Player.h:2594
Definition: InstanceScript.h:142
virtual void FillInitialWorldStates(WorldPacket &)
Definition: InstanceScript.h:257
Definition: OutdoorPvP.h:186
virtual void FillInitialWorldStates(WorldPacket &)
Definition: OutdoorPvP.h:203
uint32 GetTypeId() const
Definition: OutdoorPvP.h:238

References BATTLEFIELD_WG, BATTLEGROUND_AB, BATTLEGROUND_AV, BATTLEGROUND_BE, BATTLEGROUND_DS, BATTLEGROUND_EY, BATTLEGROUND_IC, BATTLEGROUND_NA, BATTLEGROUND_RL, BATTLEGROUND_RV, BATTLEGROUND_SA, BATTLEGROUND_WS, bgZoneIdToFillWorldStates, CONFIG_ARENA_SEASON_ID, CONFIG_ARENA_SEASON_IN_PROGRESS, Battleground::FillInitialWorldStates(), InstanceScript::FillInitialWorldStates(), OutdoorPvP::FillInitialWorldStates(), Battlefield::FillInitialWorldStates(), GetBattleground(), Battleground::GetBgTypeID(), ObjectAccessor::GetCreature(), WorldObject::GetInstanceScript(), WorldLocation::GetMapId(), GetSession(), Battlefield::GetTypeId(), OutdoorPvP::GetTypeId(), LOG_DEBUG, OUTDOOR_PVP_EP, OUTDOOR_PVP_HP, OUTDOOR_PVP_NA, OUTDOOR_PVP_SI, OUTDOOR_PVP_TF, OUTDOOR_PVP_ZM, ByteBuffer::put(), sBattlefieldMgr, SendBattlefieldWorldStates(), SendBGWeekendWorldStates(), WorldSession::SendPacket(), SMSG_INIT_WORLD_STATES, sOutdoorPvPMgr, sWorld, and ByteBuffer::wpos().

Referenced by WorldSession::HandlePlayerLoginToCharInWorld(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerAreaUpdate(), and UpdateZone().

◆ SendInstanceResetWarning()

void Player::SendInstanceResetWarning ( uint32  mapid,
Difficulty  difficulty,
uint32  time,
bool  onEnterMap 
)
11690{
11691 // pussywizard:
11692 InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(GetGUID(), mapid, difficulty);
11693 if (bind && bind->extended)
11694 {
11695 if (!onEnterMap) // extended id player shouldn't be warned about lock expiration
11696 return;
11697 time += (bind->save->GetExtendedResetTime() - bind->save->GetResetTime()); // add lockout period to the time left
11698 }
11699
11700 // type of warning, based on the time remaining until reset
11701 uint32 type;
11702 if (time > 3600)
11703 type = RAID_INSTANCE_WELCOME;
11704 else if (time > 900)
11706 else if (time > 300)
11708 else
11710
11711 WorldPacket data(SMSG_RAID_INSTANCE_MESSAGE, 4 + 4 + 4 + 4);
11712 data << uint32(type);
11713 data << uint32(mapid);
11714 data << uint32(difficulty); // difficulty
11715 data << uint32(time);
11716 if (type == RAID_INSTANCE_WELCOME)
11717 {
11718 data << uint8(bind && bind->perm); // is locked
11719 data << uint8(bind && bind->extended); // is extended, ignored if prev field is 0
11720 }
11721 GetSession()->SendPacket(&data);
11722}
@ RAID_INSTANCE_WARNING_MIN
Definition: Player.h:804
@ RAID_INSTANCE_WARNING_MIN_SOON
Definition: Player.h:805
@ RAID_INSTANCE_WARNING_HOURS
Definition: Player.h:803
@ RAID_INSTANCE_WELCOME
Definition: Player.h:806
@ SMSG_RAID_INSTANCE_MESSAGE
Definition: Opcodes.h:792
Definition: InstanceSaveMgr.h:39
InstanceSave * save
Definition: InstanceSaveMgr.h:40
bool extended
Definition: InstanceSaveMgr.h:42
bool perm
Definition: InstanceSaveMgr.h:41
time_t GetExtendedResetTime() const
Definition: InstanceSaveMgr.h:76
time_t GetResetTime() const
Definition: InstanceSaveMgr.h:75

References InstancePlayerBind::extended, InstanceSave::GetExtendedResetTime(), Object::GetGUID(), InstanceSave::GetResetTime(), GetSession(), InstancePlayerBind::perm, RAID_INSTANCE_WARNING_HOURS, RAID_INSTANCE_WARNING_MIN, RAID_INSTANCE_WARNING_MIN_SOON, RAID_INSTANCE_WELCOME, InstancePlayerBind::save, WorldSession::SendPacket(), sInstanceSaveMgr, and SMSG_RAID_INSTANCE_MESSAGE.

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendItemDurations()

void Player::SendItemDurations ( )
4758{
4759 for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end(); ++itr)
4760 {
4761 (*itr)->SendTimeUpdate(this);
4762 }
4763}

References m_itemDuration.

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendItemRetrievalMail() [1/2]

void Player::SendItemRetrievalMail ( std::vector< std::pair< uint32, uint32 > >  mailItems)
445{
446 if (mailItems.empty())
447 {
448 // Skip send if empty items
449 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Attempt to send almost with items without items. Player {}", GetGUID().ToString());
450 return;
451 }
452
453 using SendMailTempateVector = std::vector<std::pair<uint32, uint32>>;
454
455 std::vector<SendMailTempateVector> allItems;
456
457 auto AddMailItem = [&allItems](uint32 itemEntry, uint32 itemCount)
458 {
459 SendMailTempateVector toSendItems;
460
461 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemEntry);
462 if (!itemTemplate)
463 {
464 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Item id {} is invalid", itemEntry);
465 return;
466 }
467
468 if (itemCount < 1 || (itemTemplate->MaxCount > 0 && itemCount > static_cast<uint32>(itemTemplate->MaxCount)))
469 {
470 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Incorrect item count ({}) for item id {}", itemEntry, itemCount);
471 return;
472 }
473
474 while (itemCount > itemTemplate->GetMaxStackSize())
475 {
476 if (toSendItems.size() <= MAX_MAIL_ITEMS)
477 {
478 toSendItems.emplace_back(itemEntry, itemTemplate->GetMaxStackSize());
479 itemCount -= itemTemplate->GetMaxStackSize();
480 }
481 else
482 {
483 allItems.emplace_back(toSendItems);
484 toSendItems.clear();
485 }
486 }
487
488 toSendItems.emplace_back(itemEntry, itemCount);
489 allItems.emplace_back(toSendItems);
490 };
491
492 for (auto& [itemEntry, itemCount] : mailItems)
493 {
494 AddMailItem(itemEntry, itemCount);
495 }
496
497 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
498
499 for (auto const& items : allItems)
500 {
501 MailSender sender(MAIL_CREATURE, 34337 /* The Postmaster */);
502 MailDraft draft("Recovered Item", "We recovered a lost item in the twisting nether and noted that it was yours.$B$BPlease find said object enclosed."); // This is the text used in Cataclysm, it probably wasn't changed.
503
504 for (auto const& [itemEntry, itemCount] : items)
505 {
506 if (Item* mailItem = Item::CreateItem(itemEntry, itemCount))
507 {
508 mailItem->SaveToDB(trans);
509 draft.AddItem(mailItem);
510 }
511 }
512
513 draft.SendMailTo(trans, MailReceiver(this, GetGUID().GetCounter()), sender);
514 }
515
516 CharacterDatabase.CommitTransaction(trans);
517}

References MailDraft::AddItem(), CharacterDatabase, Item::CreateItem(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), LOG_ERROR, MAIL_CREATURE, MAX_MAIL_ITEMS, ItemTemplate::MaxCount, MailDraft::SendMailTo(), sObjectMgr, and Position::ToString().

◆ SendItemRetrievalMail() [2/2]

void Player::SendItemRetrievalMail ( uint32  itemEntry,
uint32  count 
)

◆ SendLearnPacket()

void Player::SendLearnPacket ( uint32  spellId,
bool  learn 
)
3020{
3021 if (learn)
3022 {
3024 data << uint32(spellId);
3025 data << uint16(0);
3026 GetSession()->SendPacket(&data);
3027 }
3028 else
3029 {
3031 data << uint32(spellId);
3032 GetSession()->SendPacket(&data);
3033 }
3034}
@ SMSG_REMOVED_SPELL
Definition: Opcodes.h:545
@ SMSG_LEARNED_SPELL
Definition: Opcodes.h:329

References GetSession(), WorldSession::SendPacket(), SMSG_LEARNED_SPELL, and SMSG_REMOVED_SPELL.

Referenced by _addSpell(), ActivateSpec(), addTalent(), Spell::EffectApplyGlyph(), WorldSession::HandleRemoveGlyph(), learnSpell(), LearnTalent(), removeSpell(), and resetTalents().

◆ SendLogXPGain()

void Player::SendLogXPGain ( uint32  GivenXP,
Unit victim,
uint32  BonusXP,
bool  recruitAFriend = false,
float  group_rate = 1.0f 
)
2353{
2354 WorldPacket data(SMSG_LOG_XPGAIN, 22); // guess size?
2355 data << (victim ? victim->GetGUID() : ObjectGuid::Empty); // guid
2356 data << uint32(GivenXP + BonusXP); // given experience
2357 data << uint8(victim ? 0 : 1); // 00-kill_xp type, 01-non_kill_xp type
2358
2359 if (victim)
2360 {
2361 data << uint32(GivenXP); // experience without bonus
2362
2363 // should use group_rate here but can't figure out how
2364 data << float(1); // 1 - none 0 - 100% group bonus output
2365 }
2366
2367 data << uint8(recruitAFriend ? 1 : 0); // does the GivenXP include a RaF bonus?
2368 GetSession()->SendPacket(&data);
2369}
@ SMSG_LOG_XPGAIN
Definition: Opcodes.h:494

References ObjectGuid::Empty, Object::GetGUID(), GetSession(), WorldSession::SendPacket(), and SMSG_LOG_XPGAIN.

Referenced by GiveXP().

◆ SendLoot()

void Player::SendLoot ( ObjectGuid  guid,
LootType  loot_type 
)
7731{
7732 if (ObjectGuid lguid = GetLootGUID())
7733 m_session->DoLootRelease(lguid);
7734
7735 Loot* loot = 0;
7736 PermissionTypes permission = ALL_PERMISSION;
7737
7738 LOG_DEBUG("loot", "Player::SendLoot");
7739
7740 // remove FD and invisibility at all loots
7741 constexpr std::array<AuraType, 2> toRemove = {SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_FEIGN_DEATH};
7742 for (auto const& aura : toRemove)
7743 {
7744 RemoveAurasByType(aura);
7745 }
7746 // remove stealth only if looting a corpse
7747 if (loot_type == LOOT_CORPSE && !guid.IsItem())
7748 {
7750 }
7751
7752 if (guid.IsGameObject())
7753 {
7754 LOG_DEBUG("loot", "guid.IsGameObject");
7755 GameObject* go = GetMap()->GetGameObject(guid);
7756
7757 // not check distance for GO in case owned GO (fishing bobber case, for example)
7758 // And permit out of range GO with no owner in case fishing hole
7759 if (!go || (loot_type != LOOT_FISHINGHOLE && ((loot_type != LOOT_FISHING && loot_type != LOOT_FISHING_JUNK) || go->GetOwnerGUID() != GetGUID()) && !go->IsWithinDistInMap(this)) || (loot_type == LOOT_CORPSE && go->GetRespawnTime() && go->isSpawnedByDefault()))
7760 {
7762 SendLootRelease(guid);
7763 return;
7764 }
7765
7766 loot = &go->loot;
7767
7768 // Xinef: loot was generated and respawntime has passed since then, allow to recreate loot
7769 // Xinef: to avoid bugs, this rule covers spawned gameobjects only
7770 if (go->isSpawnedByDefault() && go->getLootState() == GO_ACTIVATED && !go->loot.isLooted() && go->GetLootGenerationTime() + go->GetRespawnDelay() < GameTime::GetGameTime().count())
7772
7773 if (go->getLootState() == GO_READY)
7774 {
7775 uint32 lootid = go->GetGOInfo()->GetLootId();
7776
7777 //TODO: fix this big hack
7779 if (Battleground* bg = GetBattleground())
7780 if (bg->GetBgTypeID(true) == BATTLEGROUND_AV)
7781 if (!bg->ToBattlegroundAV()->PlayerCanDoMineQuest(go->GetEntry(), GetTeamId()))
7782 {
7784 SendLootRelease(guid);
7785 return;
7786 }
7787
7788 if (lootid)
7789 {
7790 loot->clear();
7791
7792 Group* group = GetGroup();
7793 bool groupRules = (group && go->GetGOInfo()->type == GAMEOBJECT_TYPE_CHEST && go->GetGOInfo()->chest.groupLootRules);
7794
7795 // check current RR player and get next if necessary
7796 if (groupRules)
7797 group->UpdateLooterGuid(go, true);
7798
7799 loot->FillLoot(lootid, LootTemplates_Gameobject, this, !groupRules, false, go->GetLootMode(), go);
7801
7802 // get next RR player (for next loot)
7803 if (groupRules && !go->loot.empty())
7804 group->UpdateLooterGuid(go);
7805 }
7806 if (GameObjectTemplateAddon const* addon = go->GetTemplateAddon())
7807 loot->generateMoneyLoot(addon->mingold, addon->maxgold);
7808
7809 if (loot_type == LOOT_FISHING)
7810 go->GetFishLoot(loot, this);
7811 else if (loot_type == LOOT_FISHING_JUNK)
7812 go->GetFishLootJunk(loot, this);
7813
7815 {
7816 if (Group* group = GetGroup())
7817 {
7818 switch (group->GetLootMethod())
7819 {
7820 case GROUP_LOOT:
7821 // GroupLoot: rolls items over threshold. Items with quality < threshold, round robin
7822 group->GroupLoot(loot, go);
7823 break;
7824 case NEED_BEFORE_GREED:
7825 group->NeedBeforeGreed(loot, go);
7826 break;
7827 case MASTER_LOOT:
7828 group->MasterLoot(loot, go);
7829 break;
7830 default:
7831 break;
7832 }
7833 }
7834 }
7835
7836 go->SetLootState(GO_ACTIVATED, this);
7837 }
7838
7839 if (go->getLootState() == GO_ACTIVATED)
7840 {
7841 if (Group* group = GetGroup())
7842 {
7843 switch (group->GetLootMethod())
7844 {
7845 case MASTER_LOOT:
7847 break;
7848 case FREE_FOR_ALL:
7849 permission = ALL_PERMISSION;
7850 break;
7851 case ROUND_ROBIN:
7852 permission = ROUND_ROBIN_PERMISSION;
7853 break;
7854 default:
7855 permission = GROUP_PERMISSION;
7856 break;
7857 }
7858 }
7859 else
7860 permission = ALL_PERMISSION;
7861 }
7862 }
7863 else if (guid.IsItem())
7864 {
7865 Item* item = GetItemByGuid(guid);
7866
7867 if (!item)
7868 {
7869 SendLootRelease(guid);
7870 return;
7871 }
7872
7873 permission = OWNER_PERMISSION;
7874
7875 loot = &item->loot;
7876
7877 // Xinef: Store container id
7878 loot->containerGUID = item->GetGUID();
7879
7880 if (!item->m_lootGenerated && !sLootItemStorage->LoadStoredLoot(item, this))
7881 {
7882 item->m_lootGenerated = true;
7883 loot->clear();
7884
7885 switch (loot_type)
7886 {
7887 case LOOT_DISENCHANTING:
7888 loot->FillLoot(item->GetTemplate()->DisenchantID, LootTemplates_Disenchant, this, true);
7889 break;
7890 case LOOT_PROSPECTING:
7891 loot->FillLoot(item->GetEntry(), LootTemplates_Prospecting, this, true);
7892 break;
7893 case LOOT_MILLING:
7894 loot->FillLoot(item->GetEntry(), LootTemplates_Milling, this, true);
7895 break;
7896 default:
7898 loot->FillLoot(item->GetEntry(), LootTemplates_Item, this, true, loot->gold != 0);
7899
7900 // Xinef: Add to storage
7901 if (loot->gold > 0 || loot->unlootedCount > 0)
7902 sLootItemStorage->AddNewStoredLoot(loot, this);
7903
7904 break;
7905 }
7906 }
7907 }
7908 else if (guid.IsCorpse()) // remove insignia
7909 {
7910 Corpse* bones = ObjectAccessor::GetCorpse(*this, guid);
7911
7912 if (!bones || !(loot_type == LOOT_CORPSE || loot_type == LOOT_INSIGNIA) || bones->GetType() != CORPSE_BONES || !bones->HasFlag(CORPSE_FIELD_DYNAMIC_FLAGS, CORPSE_DYNFLAG_LOOTABLE))
7913 {
7914 SendLootRelease(guid);
7915 return;
7916 }
7917
7918 loot = &bones->loot;
7919
7920 if (loot->loot_type == LOOT_NONE)
7921 {
7922 uint32 pLevel = bones->loot.gold;
7923 bones->loot.clear();
7924
7925 loot->FillLoot(GetTeamId(), LootTemplates_Player, this, true);
7926
7927 // It may need a better formula
7928 // Now it works like this: lvl10: ~6copper, lvl70: ~9silver
7929 bones->loot.gold = uint32(urand(50, 150) * 0.016f * pow(float(pLevel) / 5.76f, 2.5f) * sWorld->getRate(RATE_DROP_MONEY));
7930 }
7931
7932 if (bones->lootRecipient != this)
7933 permission = NONE_PERMISSION;
7934 else
7935 permission = OWNER_PERMISSION;
7936 }
7937 else
7938 {
7939 Creature* creature = GetMap()->GetCreature(guid);
7940
7941 // must be in range and creature must be alive for pickpocket and must be dead for another loot
7942 if (!creature || creature->IsAlive() != (loot_type == LOOT_PICKPOCKETING) || !creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
7943 {
7944 SendLootRelease(guid);
7945 return;
7946 }
7947
7948 if (loot_type == LOOT_PICKPOCKETING && IsFriendlyTo(creature))
7949 {
7950 SendLootRelease(guid);
7951 return;
7952 }
7953
7954 loot = &creature->loot;
7955
7956 if (loot_type == LOOT_PICKPOCKETING)
7957 {
7958 if (!loot || loot->loot_type != LOOT_PICKPOCKETING)
7959 {
7960 if (creature->CanGeneratePickPocketLoot())
7961 {
7962 creature->SetPickPocketLootTime();
7963 loot->clear();
7964
7965 if (uint32 lootid = creature->GetCreatureTemplate()->pickpocketLootId)
7966 loot->FillLoot(lootid, LootTemplates_Pickpocketing, this, true);
7967
7968 // Generate extra money for pick pocket loot
7969 const uint32 a = urand(0, creature->GetLevel() / 2);
7970 const uint32 b = urand(0, GetLevel() / 2);
7971 loot->gold = uint32(10 * (a + b) * sWorld->getRate(RATE_DROP_MONEY));
7972 permission = OWNER_PERMISSION;
7973 }
7974 else
7975 {
7976 permission = NONE_PERMISSION;
7978 return;
7979 }
7980 }
7981 }
7982 else
7983 {
7984 // Xinef: Exploit fix
7985 if (!creature->HasDynamicFlag(UNIT_DYNFLAG_LOOTABLE))
7986 {
7988 return;
7989 }
7990
7991 // the player whose group may loot the corpse
7992 Player* recipient = creature->GetLootRecipient();
7993 Group* recipientGroup = creature->GetLootRecipientGroup();
7994 if (!recipient && !recipientGroup)
7995 return;
7996
7997 if (loot->loot_type == LOOT_NONE)
7998 {
7999 // for creature, loot is filled when creature is killed.
8000 if (recipientGroup)
8001 {
8002 switch (recipientGroup->GetLootMethod())
8003 {
8004 case GROUP_LOOT:
8005 // GroupLoot: rolls items over threshold. Items with quality < threshold, round robin
8006 recipientGroup->GroupLoot(loot, creature);
8007 break;
8008 case NEED_BEFORE_GREED:
8009 recipientGroup->NeedBeforeGreed(loot, creature);
8010 break;
8011 case MASTER_LOOT:
8012 recipientGroup->MasterLoot(loot, creature);
8013 break;
8014 default:
8015 break;
8016 }
8017 }
8018 }
8019
8020 // if loot is already skinning loot then don't do anything else
8021 if (loot->loot_type == LOOT_SKINNING)
8022 {
8023 loot_type = LOOT_SKINNING;
8024 permission = creature->GetLootRecipientGUID() == GetGUID() ? OWNER_PERMISSION : NONE_PERMISSION;
8025 }
8026 else if (loot_type == LOOT_SKINNING)
8027 {
8028 loot->clear();
8029 loot->FillLoot(creature->GetCreatureTemplate()->SkinLootId, LootTemplates_Skinning, this, true);
8030 permission = OWNER_PERMISSION;
8031
8032 //Inform instance if creature is skinned.
8033 if (InstanceScript* mapInstance = creature->GetInstanceScript())
8034 {
8035 mapInstance->CreatureLooted(creature, LOOT_SKINNING);
8036 }
8037
8038 // Xinef: Set new loot recipient
8039 creature->SetLootRecipient(this, false);
8040 }
8041 // set group rights only for loot_type != LOOT_SKINNING
8042 else
8043 {
8044 if (recipientGroup)
8045 {
8046 if (GetGroup() == recipientGroup)
8047 {
8048 switch (recipientGroup->GetLootMethod())
8049 {
8050 case MASTER_LOOT:
8051 permission = recipientGroup->GetMasterLooterGuid() == GetGUID() ? MASTER_PERMISSION : RESTRICTED_PERMISSION;
8052 break;
8053 case FREE_FOR_ALL:
8054 permission = ALL_PERMISSION;
8055 break;
8056 case ROUND_ROBIN:
8057 permission = ROUND_ROBIN_PERMISSION;
8058 break;
8059 default:
8060 permission = GROUP_PERMISSION;
8061 break;
8062 }
8063 }
8064 else
8065 permission = NONE_PERMISSION;
8066 }
8067 else if (recipient == this)
8068 permission = OWNER_PERMISSION;
8069 else
8070 permission = NONE_PERMISSION;
8071 }
8072 }
8073 }
8074
8075 // LOOT_INSIGNIA and LOOT_FISHINGHOLE unsupported by client
8076 switch (loot_type)
8077 {
8078 case LOOT_INSIGNIA:
8079 loot_type = LOOT_SKINNING;
8080 break;
8081 case LOOT_FISHINGHOLE:
8082 loot_type = LOOT_FISHING;
8083 break;
8084 case LOOT_FISHING_JUNK:
8085 loot_type = LOOT_FISHING;
8086 break;
8087 default:
8088 break;
8089 }
8090
8091 // need know merged fishing/corpse loot type for achievements
8092 loot->loot_type = loot_type;
8093
8094 if (!sScriptMgr->OnAllowedToLootContainerCheck(this, guid))
8095 {
8097 return;
8098 }
8099
8100 if (permission != NONE_PERMISSION)
8101 {
8102 SetLootGUID(guid);
8103
8104 WorldPacket data(SMSG_LOOT_RESPONSE, (9 + 50)); // we guess size
8105 data << guid;
8106 data << uint8(loot_type);
8107 data << LootView(*loot, this, permission);
8108
8109 SendDirectMessage(&data);
8110
8111 // add 'this' player as one of the players that are looting 'loot'
8112 loot->AddLooter(GetGUID());
8113
8114 if (loot_type == LOOT_CORPSE && !guid.IsItem())
8116 }
8117 else
8119}
@ SPELL_AURA_MOD_INVISIBILITY
Definition: SpellAuraDefines.h:81
@ SPELL_AURA_FEIGN_DEATH
Definition: SpellAuraDefines.h:129
@ SPELL_AURA_MOD_STEALTH
Definition: SpellAuraDefines.h:79
@ BG_AV_OBJECTID_MINE_N
Definition: BattlegroundAV.h:160
@ BG_AV_OBJECTID_MINE_S
Definition: BattlegroundAV.h:161
@ GAMEOBJECT_BYTES_1
Definition: UpdateFields.h:404
@ GO_ACTIVATED
Definition: GameObject.h:113
@ GO_READY
Definition: GameObject.h:112
@ CORPSE_BONES
Definition: Corpse.h:28
LootStore LootTemplates_Skinning("skinning_loot_template", "creature skinning id", true)
LootStore LootTemplates_Gameobject("gameobject_loot_template", "gameobject entry", true)
LootStore LootTemplates_Item("item_loot_template", "item entry", true)
LootStore LootTemplates_Milling("milling_loot_template", "item entry (herb)", true)
LootStore LootTemplates_Disenchant("disenchant_loot_template", "item disenchant id", true)
LootStore LootTemplates_Prospecting("prospecting_loot_template", "item entry (ore)", true)
LootStore LootTemplates_Pickpocketing("pickpocketing_loot_template", "creature pickpocket lootid", true)
LootStore LootTemplates_Player("player_loot_template", "team id", true)
PermissionTypes
Definition: LootMgr.h:67
@ OWNER_PERMISSION
Definition: LootMgr.h:73
@ ALL_PERMISSION
Definition: LootMgr.h:68
@ RESTRICTED_PERMISSION
Definition: LootMgr.h:71
@ NONE_PERMISSION
Definition: LootMgr.h:74
@ ROUND_ROBIN_PERMISSION
Definition: LootMgr.h:72
@ MASTER_PERMISSION
Definition: LootMgr.h:70
@ GROUP_PERMISSION
Definition: LootMgr.h:69
@ LOOT_ERROR_DIDNT_KILL
Definition: LootMgr.h:97
@ LOOT_ERROR_ALREADY_PICKPOCKETED
Definition: LootMgr.h:108
@ LOOT_PICKPOCKETING
Definition: LootMgr.h:82
@ LOOT_MILLING
Definition: LootMgr.h:88
@ LOOT_FISHING_JUNK
Definition: LootMgr.h:92
@ LOOT_CORPSE
Definition: LootMgr.h:81
@ LOOT_FISHING
Definition: LootMgr.h:83
@ LOOT_DISENCHANTING
Definition: LootMgr.h:84
@ LOOT_FISHINGHOLE
Definition: LootMgr.h:90
@ LOOT_NONE
Definition: LootMgr.h:79
@ LOOT_PROSPECTING
Definition: LootMgr.h:87
@ RATE_DROP_MONEY
Definition: IWorld.h:466
@ GAMEOBJECT_TYPE_CHEST
Definition: SharedDefines.h:1563
@ UNIT_DYNFLAG_LOOTABLE
Definition: SharedDefines.h:3121
@ SMSG_LOOT_RESPONSE
Definition: Opcodes.h:382
Corpse * GetCorpse(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:182
Loot loot
Definition: Creature.h:227
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition: Creature.cpp:1315
ObjectGuid GetLootRecipientGUID() const
Definition: Creature.h:228
void SetPickPocketLootTime()
Definition: Creature.cpp:3752
Player * GetLootRecipient() const
Definition: Creature.cpp:1301
bool CanGeneratePickPocketLoot() const
Definition: Creature.cpp:3757
Group * GetLootRecipientGroup() const
Definition: Creature.cpp:1308
uint32 SkinLootId
Definition: CreatureData.h:229
uint32 pickpocketLootId
Definition: CreatureData.h:228
uint32 GetRespawnDelay() const
Definition: GameObject.h:198
bool IsWithinDistInMap(Player const *player) const
Definition: GameObject.cpp:3003
Loot loot
Definition: GameObject.h:248
LootState getLootState() const
Definition: GameObject.h:225
bool isSpawnedByDefault() const
Definition: GameObject.h:196
time_t GetRespawnTime() const
Definition: GameObject.h:184
uint32 GetLootGenerationTime() const
Definition: GameObject.h:259
void SetLootState(LootState s, Unit *unit=nullptr)
Definition: GameObject.cpp:2442
void GetFishLootJunk(Loot *loot, Player *loot_owner)
Definition: GameObject.cpp:1022
ObjectGuid GetOwnerGUID() const
Definition: GameObject.h:174
void GetFishLoot(Loot *loot, Player *loot_owner)
Definition: GameObject.cpp:1002
GameObjectTemplateAddon const * GetTemplateAddon() const
Definition: GameObject.cpp:912
void SetLootGenerationTime()
Definition: GameObject.cpp:2932
uint16 GetLootMode() const
Definition: GameObject.h:229
uint32 type
Definition: GameObjectData.h:34
struct GameObjectTemplate::@227::@232 chest
uint32 groupLootRules
Definition: GameObjectData.h:99
uint32 GetLootId() const
Definition: GameObjectData.h:540
Definition: GameObjectData.h:665
Loot loot
Definition: Item.h:320
uint32 DisenchantID
Definition: ItemTemplate.h:690
uint32 MinMoneyLoot
Definition: ItemTemplate.h:692
uint32 MaxMoneyLoot
Definition: ItemTemplate.h:693
bool HasDynamicFlag(uint32 flag) const
Definition: Object.h:119
void ForceValuesUpdateAtIndex(uint32)
Definition: Object.cpp:2067
bool IsCorpse() const
Definition: ObjectGuid.h:173
bool IsItem() const
Definition: ObjectGuid.h:170
bool IsGameObject() const
Definition: ObjectGuid.h:171
void SendLootRelease(ObjectGuid guid)
Definition: Player.cpp:7723
void SetLootGUID(ObjectGuid guid)
Definition: Player.h:1971
void SendLootError(ObjectGuid guid, LootError error)
Definition: Player.cpp:8121
bool IsFriendlyTo(Unit const *unit) const
Definition: Unit.cpp:10186
void NeedBeforeGreed(Loot *loot, WorldObject *pLootedObject)
Definition: Group.cpp:1160
ObjectGuid GetMasterLooterGuid() const
Definition: Group.cpp:2326
void GroupLoot(Loot *loot, WorldObject *pLootedObject)
Definition: Group.cpp:1006
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition: Group.cpp:1868
void MasterLoot(Loot *loot, WorldObject *pLootedObject)
Definition: Group.cpp:1311
void AddLooter(ObjectGuid GUID)
Definition: LootMgr.h:373
ObjectGuid containerGUID
Definition: LootMgr.h:329
bool empty() const
Definition: LootMgr.h:367
void clear()
Definition: LootMgr.h:343
uint8 unlootedCount
Definition: LootMgr.h:323
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition: LootMgr.cpp:829
Definition: LootMgr.h:405

References Loot::AddLooter(), ALL_PERMISSION, BATTLEGROUND_AV, BG_AV_OBJECTID_MINE_N, BG_AV_OBJECTID_MINE_S, Creature::CanGeneratePickPocketLoot(), GameObjectTemplate::chest, Loot::clear(), Loot::containerGUID, CORPSE_BONES, CORPSE_DYNFLAG_LOOTABLE, CORPSE_FIELD_DYNAMIC_FLAGS, ItemTemplate::DisenchantID, WorldSession::DoLootRelease(), Loot::empty(), Loot::FillLoot(), Object::ForceValuesUpdateAtIndex(), FREE_FOR_ALL, GAMEOBJECT_BYTES_1, GAMEOBJECT_TYPE_CHEST, Loot::generateMoneyLoot(), GetBattleground(), ObjectAccessor::GetCorpse(), Map::GetCreature(), Creature::GetCreatureTemplate(), Object::GetEntry(), GameObject::GetFishLoot(), GameObject::GetFishLootJunk(), Map::GetGameObject(), GameTime::GetGameTime(), GameObject::GetGOInfo(), GetGroup(), Object::GetGUID(), WorldObject::GetInstanceScript(), GetItemByGuid(), Unit::GetLevel(), GameObject::GetLootGenerationTime(), GetLootGUID(), GameObjectTemplate::GetLootId(), Group::GetLootMethod(), GameObject::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), Creature::GetLootRecipientGUID(), GameObject::getLootState(), WorldObject::GetMap(), Group::GetMasterLooterGuid(), GameObject::GetOwnerGUID(), GameObject::GetRespawnDelay(), GameObject::GetRespawnTime(), GetTeamId(), Item::GetTemplate(), GameObject::GetTemplateAddon(), Corpse::GetType(), GO_ACTIVATED, GO_READY, Loot::gold, GROUP_LOOT, GROUP_PERMISSION, Group::GroupLoot(), GameObjectTemplate::groupLootRules, Object::HasDynamicFlag(), Object::HasFlag(), INTERACTION_DISTANCE, Unit::IsAlive(), ObjectGuid::IsCorpse(), Unit::IsFriendlyTo(), ObjectGuid::IsGameObject(), ObjectGuid::IsItem(), Loot::isLooted(), GameObject::isSpawnedByDefault(), GameObject::IsWithinDistInMap(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, Corpse::loot, Creature::loot, GameObject::loot, Item::loot, LOOT_CORPSE, LOOT_DISENCHANTING, LOOT_ERROR_ALREADY_PICKPOCKETED, LOOT_ERROR_DIDNT_KILL, LOOT_FISHING, LOOT_FISHING_JUNK, LOOT_FISHINGHOLE, LOOT_INSIGNIA, LOOT_MILLING, LOOT_NONE, LOOT_PICKPOCKETING, LOOT_PROSPECTING, LOOT_SKINNING, Loot::loot_type, Corpse::lootRecipient, LootTemplates_Disenchant, LootTemplates_Gameobject, LootTemplates_Item, LootTemplates_Milling, LootTemplates_Pickpocketing, LootTemplates_Player, LootTemplates_Prospecting, LootTemplates_Skinning, Item::m_lootGenerated, m_session, MASTER_LOOT, MASTER_PERMISSION, Group::MasterLoot(), ItemTemplate::MaxMoneyLoot, ItemTemplate::MinMoneyLoot, NEED_BEFORE_GREED, Group::NeedBeforeGreed(), NONE_PERMISSION, OWNER_PERMISSION, CreatureTemplate::pickpocketLootId, RATE_DROP_MONEY, Unit::RemoveAurasByType(), RESTRICTED_PERMISSION, ROUND_ROBIN, ROUND_ROBIN_PERMISSION, SendDirectMessage(), SendLootError(), SendLootRelease(), GameObject::SetLootGenerationTime(), SetLootGUID(), Creature::SetLootRecipient(), GameObject::SetLootState(), Creature::SetPickPocketLootTime(), Unit::SetUnitFlag(), CreatureTemplate::SkinLootId, sLootItemStorage, SMSG_LOOT_RESPONSE, SPELL_AURA_FEIGN_DEATH, SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_MOD_STEALTH, sScriptMgr, sWorld, GameObjectTemplate::type, UNIT_DYNFLAG_LOOTABLE, UNIT_FLAG_LOOTING, Loot::unlootedCount, Group::UpdateLooterGuid(), and urand().

Referenced by Spell::EffectMilling(), Spell::EffectPickPocket(), Spell::EffectProspecting(), Spell::EffectSkinning(), WorldSession::HandleLootOpcode(), WorldSession::HandleOpenItemOpcode(), go_hive_pod::OnGossipHello(), RemovedInsignia(), Spell::SendLoot(), and GameObject::Use().

◆ SendLootError()

void Player::SendLootError ( ObjectGuid  guid,
LootError  error 
)

◆ SendLootRelease()

void Player::SendLootRelease ( ObjectGuid  guid)
7724{
7726 data << guid << uint8(1);
7727 SendDirectMessage(&data);
7728}
@ SMSG_LOOT_RELEASE_RESPONSE
Definition: Opcodes.h:383

References SendDirectMessage(), and SMSG_LOOT_RELEASE_RESPONSE.

Referenced by WorldSession::DoLootRelease(), WorldSession::HandleAutostoreLootItemOpcode(), SendLoot(), and StoreLootItem().

◆ SendMailResult()

void Player::SendMailResult ( uint32  mailId,
MailResponseType  mailAction,
MailResponseResult  mailError,
uint32  equipError = 0,
ObjectGuid::LowType  item_guid = 0,
uint32  item_count = 0 
)
2854{
2855 WorldPacket data(SMSG_SEND_MAIL_RESULT, (4 + 4 + 4 + (mailError == MAIL_ERR_EQUIP_ERROR ? 4 : (mailAction == MAIL_ITEM_TAKEN ? 4 + 4 : 0))));
2856 data << (uint32) mailId;
2857 data << (uint32) mailAction;
2858 data << (uint32) mailError;
2859 if (mailError == MAIL_ERR_EQUIP_ERROR)
2860 data << (uint32) equipError;
2861 else if (mailAction == MAIL_ITEM_TAKEN)
2862 {
2863 data << (uint32) item_guid; // item guid low?
2864 data << (uint32) item_count; // item count?
2865 }
2866 GetSession()->SendPacket(&data);
2867}
@ MAIL_ITEM_TAKEN
Definition: SharedDefines.h:3502
@ MAIL_ERR_EQUIP_ERROR
Definition: SharedDefines.h:3511
@ SMSG_SEND_MAIL_RESULT
Definition: Opcodes.h:599

References GetSession(), MAIL_ERR_EQUIP_ERROR, MAIL_ITEM_TAKEN, WorldSession::SendPacket(), and SMSG_SEND_MAIL_RESULT.

Referenced by WorldSession::HandleMailCreateTextItem(), WorldSession::HandleMailDelete(), WorldSession::HandleMailReturnToSender(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), and WorldSession::HandleSendMail().

◆ SendMessageToSet() [1/2]

◆ SendMessageToSet() [2/2]

void Player::SendMessageToSet ( WorldPacket const *  data,
Player const *  skipped_rcvr 
) const
overridevirtual

Reimplemented from WorldObject.

5641{
5642 if (skipped_rcvr != this)
5643 SendDirectMessage(data);
5644
5645 Acore::MessageDistDeliverer notifier(this, data, GetVisibilityRange(), false, skipped_rcvr);
5647}
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:193
Definition: GridNotifiers.h:100

References WorldObject::GetVisibilityRange(), SendDirectMessage(), and Cell::VisitWorldObjects().

◆ SendMessageToSetInRange() [1/2]

void Player::SendMessageToSetInRange ( WorldPacket const *  data,
float  dist,
bool  self 
) const
overridevirtual

Reimplemented from WorldObject.

5619{
5620 if (self)
5621 SendDirectMessage(data);
5622
5623 Acore::MessageDistDeliverer notifier(this, data, dist);
5624 Cell::VisitWorldObjects(this, notifier, dist);
5625}

References SendDirectMessage(), and Cell::VisitWorldObjects().

Referenced by Say(), AchievementMgr::SendAchievementEarned(), SendMessageToSet(), TextEmote(), and Yell().

◆ SendMessageToSetInRange() [2/2]

void Player::SendMessageToSetInRange ( WorldPacket const *  data,
float  dist,
bool  self,
bool  includeMargin,
bool  ownTeamOnly,
bool  required3dDist = false 
) const
5628{
5629 if (self)
5630 SendDirectMessage(data);
5631
5632 dist += GetObjectSize();
5633 if (includeMargin)
5634 dist += VISIBILITY_COMPENSATION; // pussywizard: to ensure everyone receives all important packets
5635
5636 Acore::MessageDistDeliverer notifier(this, data, dist, ownTeamOnly, nullptr, required3dDist);
5637 Cell::VisitWorldObjects(this, notifier, dist);
5638}
#define VISIBILITY_COMPENSATION
Definition: ObjectDefines.h:26
float GetObjectSize() const
Definition: Object.cpp:2768

References WorldObject::GetObjectSize(), SendDirectMessage(), VISIBILITY_COMPENSATION, and Cell::VisitWorldObjects().

◆ SendMirrorTimer()

void Player::SendMirrorTimer ( MirrorTimerType  Type,
uint32  MaxValue,
uint32  CurrentValue,
int32  Regen 
)
protected
732{
733 if (int(MaxValue) == DISABLED_MIRROR_TIMER)
734 {
735 if (int(CurrentValue) != DISABLED_MIRROR_TIMER)
736 StopMirrorTimer(Type);
737 return;
738 }
739 SendDirectMessage(WorldPackets::Misc::StartMirrorTimer(Type, CurrentValue, MaxValue, Regen, 0, 0).Write());
740}
Definition: MiscPackets.h:121

References DISABLED_MIRROR_TIMER, SendDirectMessage(), and StopMirrorTimer().

Referenced by HandleDrowning().

◆ SendMovieStart()

void Player::SendMovieStart ( uint32  MovieId)
5666{
5668 data << uint32(MovieId);
5669 SendDirectMessage(&data);
5670}
@ SMSG_TRIGGER_MOVIE
Definition: Opcodes.h:1154

References SendDirectMessage(), and SMSG_TRIGGER_MOVIE.

Referenced by debug_commandscript::HandleDebugPlayMovieCommand().

◆ SendNewItem()

void Player::SendNewItem ( Item item,
uint32  count,
bool  received,
bool  created,
bool  broadcast = false,
bool  sendChatMessage = true 
)
4766{
4767 if (!item) // prevent crash
4768 return;
4769
4770 // last check 2.0.10
4771 WorldPacket data(SMSG_ITEM_PUSH_RESULT, (8 + 4 + 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4));
4772 data << GetGUID(); // player GUID
4773 data << uint32(received); // 0=looted, 1=from npc
4774 data << uint32(created); // 0=received, 1=created
4775 data << uint32(sendChatMessage); // bool print message to chat
4776 data << uint8(item->GetBagSlot()); // bagslot
4777 // item slot, but when added to stack: 0xFFFFFFFF
4778 data << uint32((item->GetCount() == count) ? item->GetSlot() : -1);
4779 data << uint32(item->GetEntry()); // item id
4780 data << uint32(item->GetItemSuffixFactor()); // SuffixFactor
4781 data << int32(item->GetItemRandomPropertyId()); // random item property id
4782 data << uint32(count); // count of items
4783 data << uint32(GetItemCount(item->GetEntry())); // count of items in inventory
4784
4785 if (broadcast && GetGroup())
4786 GetGroup()->BroadcastPacket(&data, true);
4787 else
4788 GetSession()->SendPacket(&data);
4789}
@ SMSG_ITEM_PUSH_RESULT
Definition: Opcodes.h:388
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition: Group.cpp:1757

References Group::BroadcastPacket(), Item::GetBagSlot(), Item::GetCount(), Object::GetEntry(), GetGroup(), Object::GetGUID(), GetItemCount(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), GetSession(), Item::GetSlot(), WorldSession::SendPacket(), and SMSG_ITEM_PUSH_RESULT.

Referenced by _StoreOrEquipNewItem(), AddItem(), AutoStoreLoot(), Spell::DoCreateItem(), GiveQuestSourceItem(), misc_commandscript::HandleAddItemCommand(), misc_commandscript::HandleAddItemSetCommand(), AuraEffect::HandleChannelDeathItem(), OPvPCapturePointNA::HandleCustomSpell(), WorldSession::HandleLootMasterGiveOpcode(), WorldSession::HandlePetitionBuyOpcode(), RefundItem(), RemovePet(), RewardQuest(), npc_oculus_drakegiver::StoreEssence(), and StoreLootItem().

◆ SendNewMail()

void Player::SendNewMail ( )
2870{
2871 // deliver undelivered mail
2873 data << (uint32) 0;
2874 GetSession()->SendPacket(&data);
2875}
@ SMSG_RECEIVED_MAIL
Definition: Opcodes.h:675

References GetSession(), WorldSession::SendPacket(), and SMSG_RECEIVED_MAIL.

Referenced by AddNewMailDeliverTime(), and Update().

◆ SendNotifyLootItemRemoved()

void Player::SendNotifyLootItemRemoved ( uint8  lootSlot)
8137{
8139 data << uint8(lootSlot);
8140 GetSession()->SendPacket(&data);
8141}
@ SMSG_LOOT_REMOVED
Definition: Opcodes.h:384

References GetSession(), WorldSession::SendPacket(), and SMSG_LOOT_REMOVED.

Referenced by Loot::NotifyItemRemoved(), Loot::NotifyQuestItemRemoved(), and StoreLootItem().

◆ SendNotifyLootMoneyRemoved()

void Player::SendNotifyLootMoneyRemoved ( )
8131{
8133 GetSession()->SendPacket(&data);
8134}
@ SMSG_LOOT_CLEAR_MONEY
Definition: Opcodes.h:387

References GetSession(), WorldSession::SendPacket(), and SMSG_LOOT_CLEAR_MONEY.

Referenced by Loot::NotifyMoneyRemoved().

◆ SendPreparedGossip()

void Player::SendPreparedGossip ( WorldObject source)
210{
211 if (!source)
212 return;
213
214 if (source->IsCreature())
215 {
216 // in case no gossip flag and quest menu not empty, open quest menu (client expect gossip menu with this flag)
218 {
219 SendPreparedQuest(source->GetGUID());
220 return;
221 }
222 }
223 else if (source->IsGameObject())
224 {
225 // probably need to find a better way here
227 {
228 SendPreparedQuest(source->GetGUID());
229 return;
230 }
231 }
232
233 // in case non empty gossip menu (that not included quests list size) show it
234 // (quest entries from quest menu will be included in list)
235
236 uint32 textId = GetGossipTextId(source);
237
239 textId = GetGossipTextId(menuId, source);
240
241 PlayerTalkClass->SendGossipMenu(textId, source->GetGUID());
242}
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:294
bool Empty() const
Definition: GossipDef.h:241
void SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
Definition: GossipDef.cpp:193

References QuestMenu::Empty(), PlayerMenu::GetGossipMenu(), GetGossipTextId(), Object::GetGUID(), GossipMenu::GetMenuId(), PlayerMenu::GetQuestMenu(), Unit::HasNpcFlag(), Object::IsCreature(), Object::IsGameObject(), PlayerTalkClass, PlayerMenu::SendGossipMenu(), SendPreparedQuest(), Object::ToCreature(), and UNIT_NPC_FLAG_GOSSIP.

Referenced by WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), npc_thrall_old_hillsbrad::OnGossipHello(), go_apexis_relic::OnGossipHello(), OnGossipSelect(), Spell::SendLoot(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and GameObject::Use().

◆ SendPreparedQuest()

void Player::SendPreparedQuest ( ObjectGuid  guid)
Todo:
verify if check for !quest->IsDaily() is really correct (possibly not)
116{
117 QuestMenu& questMenu = PlayerTalkClass->GetQuestMenu();
118 if (questMenu.Empty())
119 return;
120
121 // single element case
122 if (questMenu.GetMenuItemCount() == 1)
123 {
124 QuestMenuItem const& qmi0 = questMenu.GetItem(0);
125 uint32 questId = qmi0.QuestId;
126
127 // Auto open -- maybe also should verify there is no greeting
128 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
129 {
130 if (qmi0.QuestIcon == 4)
131 PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, CanRewardQuest(quest, false), true);
132 // Send completable on repeatable and autoCompletable quest if player don't have quest
134 else
135 {
137 if (!object || (!object->hasQuest(questId) && !object->hasInvolvedQuest(questId)))
138 {
140 return;
141 }
142
143 if (quest->IsAutoAccept() && CanAddQuest(quest, true) && CanTakeQuest(quest, true))
144 AddQuestAndCheckCompletion(quest, object);
145
146 if (quest->IsAutoComplete() || !quest->GetQuestMethod())
148 else
150 }
151 }
152 }
153 // multiple entries
154 else
155 {
156 QEmote qe;
157 qe._Delay = 0;
158 qe._Emote = 0;
159 std::string title = "";
160
161 // need pet case for some quests
163 if (creature)
164 {
165 uint32 textid = GetGossipTextId(creature);
166 GossipText const* gossiptext = sObjectMgr->GetGossipText(textid);
167 if (!gossiptext)
168 {
169 qe._Delay = 0; //TEXTEMOTE_MESSAGE; //zyg: player emote
170 qe._Emote = 0; //TEXTEMOTE_HELLO; //zyg: NPC emote
171 title = "";
172 }
173 else
174 {
175 qe = gossiptext->Options[0].Emotes[0];
176
177 if (!gossiptext->Options[0].Text_0.empty())
178 {
179 title = gossiptext->Options[0].Text_0;
180
181 int loc_idx = GetSession()->GetSessionDbLocaleIndex();
182 if (loc_idx >= 0)
183 if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textid))
184 ObjectMgr::GetLocaleString(npcTextLocale->Text_0[0], loc_idx, title);
185 }
186 else
187 {
188 title = gossiptext->Options[0].Text_1;
189
190 int loc_idx = GetSession()->GetSessionDbLocaleIndex();
191 if (loc_idx >= 0)
192 if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textid))
193 ObjectMgr::GetLocaleString(npcTextLocale->Text_1[0], loc_idx, title);
194 }
195 }
196 }
197
199 }
200}
@ TYPEMASK_ITEM
Definition: ObjectGuid.h:47
@ TYPEMASK_UNIT
Definition: ObjectGuid.h:49
@ TYPEMASK_GAMEOBJECT
Definition: ObjectGuid.h:51
Definition: GossipDef.h:154
uint32 QuestId
Definition: GossipDef.h:155
uint8 QuestIcon
Definition: GossipDef.h:156
QuestMenuItem const & GetItem(uint16 index) const
Definition: GossipDef.h:248
uint8 GetMenuItemCount() const
Definition: GossipDef.h:236
void SendQuestGiverQuestList(QEmote const &eEmote, std::string const &Title, ObjectGuid guid)
Definition: GossipDef.cpp:315
void SendQuestGiverQuestDetails(Quest const *quest, ObjectGuid npcGUID, bool activateAccept) const
Definition: GossipDef.cpp:388
void SendQuestGiverRequestItems(Quest const *quest, ObjectGuid npcGUID, bool canComplete, bool closeOnCancel) const
Definition: GossipDef.cpp:752
Definition: Object.h:100
virtual bool hasQuest(uint32) const
Definition: Object.h:186
virtual bool hasInvolvedQuest(uint32) const
Definition: Object.h:187
bool CanAddQuest(Quest const *quest, bool msg)
Definition: PlayerQuest.cpp:264
void AddQuestAndCheckCompletion(Quest const *quest, Object *questGiver)
Definition: PlayerQuest.cpp:420
bool CanCompleteRepeatableQuest(Quest const *quest)
Definition: PlayerQuest.cpp:365
Definition: NPCHandler.h:25
uint32 _Emote
Definition: NPCHandler.h:26
uint32 _Delay
Definition: NPCHandler.h:27
std::string Text_0
Definition: NPCHandler.h:34
QEmote Emotes[MAX_GOSSIP_TEXT_EMOTES]
Definition: NPCHandler.h:39
std::string Text_1
Definition: NPCHandler.h:35
Definition: NPCHandler.h:45
GossipTextOption Options[MAX_GOSSIP_TEXT_OPTIONS]
Definition: NPCHandler.h:46
Definition: NPCHandler.h:55

References QEmote::_Delay, QEmote::_Emote, AddQuestAndCheckCompletion(), CanAddQuest(), CanCompleteRepeatableQuest(), CanRewardQuest(), CanTakeQuest(), GossipTextOption::Emotes, QuestMenu::Empty(), ObjectAccessor::GetCreatureOrPetOrVehicle(), GetGossipTextId(), QuestMenu::GetItem(), ObjectMgr::GetLocaleString(), QuestMenu::GetMenuItemCount(), ObjectAccessor::GetObjectByTypeMask(), PlayerMenu::GetQuestMenu(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Object::hasInvolvedQuest(), Object::hasQuest(), GossipText::Options, PlayerTalkClass, QuestMenuItem::QuestIcon, QuestMenuItem::QuestId, PlayerMenu::SendCloseGossip(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestGiverQuestList(), PlayerMenu::SendQuestGiverRequestItems(), sObjectMgr, GossipTextOption::Text_0, GossipTextOption::Text_1, TYPEMASK_GAMEOBJECT, TYPEMASK_ITEM, and TYPEMASK_UNIT.

Referenced by npc_cos_chromie_middle::OnGossipHello(), OnGossipSelect(), SendPreparedGossip(), npc_costumed_orphan_matron::sGossipHello(), and npc_maredis_firestar::npc_maredis_firestarAI::sGossipSelect().

◆ SendProficiency()

void Player::SendProficiency ( ItemClass  itemClass,
uint32  itemSubclassMask 
)
10059{
10060 WorldPacket data(SMSG_SET_PROFICIENCY, 1 + 4);
10061 data << uint8(itemClass) << uint32(itemSubclassMask);
10062 GetSession()->SendPacket(&data);
10063}
@ SMSG_SET_PROFICIENCY
Definition: Opcodes.h:325

References GetSession(), WorldSession::SendPacket(), and SMSG_SET_PROFICIENCY.

Referenced by Spell::EffectProficiency().

◆ SendPushToPartyResponse()

void Player::SendPushToPartyResponse ( Player const *  player,
uint8  msg 
) const
2430{
2431 if (player)
2432 {
2433 WorldPacket data(MSG_QUEST_PUSH_RESULT, (8 + 1));
2434 data << player->GetGUID();
2435 data << uint8(msg); // valid values: 0-8
2436 GetSession()->SendPacket(&data);
2437 LOG_DEBUG("network", "WORLD: Sent MSG_QUEST_PUSH_RESULT");
2438 }
2439}
@ MSG_QUEST_PUSH_RESULT
Definition: Opcodes.h:660

References Object::GetGUID(), GetSession(), LOG_DEBUG, MSG_QUEST_PUSH_RESULT, and WorldSession::SendPacket().

Referenced by CanShareQuest(), debug_commandscript::HandleDebugSendQuestPartyMsgCommand(), WorldSession::HandlePushQuestToParty(), and WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ SendQuestComplete()

void Player::SendQuestComplete ( uint32  quest_id)
2341{
2342 if (quest_id)
2343 {
2345 data << uint32(quest_id);
2346 GetSession()->SendPacket(&data);
2347 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_COMPLETE quest = {}", quest_id);
2348 }
2349}
@ SMSG_QUESTUPDATE_COMPLETE
Definition: Opcodes.h:438

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTUPDATE_COMPLETE.

Referenced by AreaExploredOrEventHappens().

◆ SendQuestConfirmAccept()

void Player::SendQuestConfirmAccept ( Quest const *  quest,
Player pReceiver 
)
2408{
2409 if (pReceiver)
2410 {
2411 //load locale from db
2412 std::string strTitle = quest->GetTitle();
2413
2414 int loc_idx = pReceiver->GetSession()->GetSessionDbLocaleIndex();
2415 if (loc_idx >= 0)
2416 if (const QuestLocale* pLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
2417 ObjectMgr::GetLocaleString(pLocale->Title, loc_idx, strTitle);
2418
2419 WorldPacket data(SMSG_QUEST_CONFIRM_ACCEPT, (4 + quest->GetTitle().size() + 8));
2420 data << uint32(quest->GetQuestId());
2421 data << quest->GetTitle();
2422 data << GetGUID();
2423 pReceiver->GetSession()->SendPacket(&data);
2424
2425 LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_CONFIRM_ACCEPT");
2426 }
2427}
@ SMSG_QUEST_CONFIRM_ACCEPT
Definition: Opcodes.h:442

References Object::GetGUID(), ObjectMgr::GetLocaleString(), Quest::GetQuestId(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetTitle(), LOG_DEBUG, WorldSession::SendPacket(), SMSG_QUEST_CONFIRM_ACCEPT, and sObjectMgr.

Referenced by WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ SendQuestFailed()

void Player::SendQuestFailed ( uint32  questId,
InventoryResult  reason = EQUIP_ERR_OK 
)
2377{
2378 if (questId)
2379 {
2381 data << uint32(questId);
2382 data << uint32(reason); // failed reason (valid reasons: 4, 16, 50, 17, 74, other values show default message)
2383 GetSession()->SendPacket(&data);
2384 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_FAILED");
2385 }
2386}
@ SMSG_QUESTGIVER_QUEST_FAILED
Definition: Opcodes.h:432

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTGIVER_QUEST_FAILED.

Referenced by FailQuest().

◆ SendQuestGiverStatusMultiple()

void Player::SendQuestGiverStatusMultiple ( )
protected
7646{
7647 uint32 count = 0;
7648
7650 data << uint32(count); // placeholder
7651
7652 for (GuidUnorderedSet::const_iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
7653 {
7654 uint32 questStatus = DIALOG_STATUS_NONE;
7655
7656 if ((*itr).IsAnyTypeCreature())
7657 {
7658 // need also pet quests case support
7659 Creature* questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, *itr);
7660 if (!questgiver || questgiver->IsHostileTo(this))
7661 continue;
7662 if (!questgiver->HasNpcFlag(UNIT_NPC_FLAG_QUESTGIVER))
7663 continue;
7664
7665 questStatus = GetQuestDialogStatus(questgiver);
7666
7667 data << questgiver->GetGUID();
7668 data << uint8(questStatus);
7669 ++count;
7670 }
7671 else if ((*itr).IsGameObject())
7672 {
7673 GameObject* questgiver = GetMap()->GetGameObject(*itr);
7674 if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER)
7675 continue;
7676
7677 questStatus = GetQuestDialogStatus(questgiver);
7678
7679 data << questgiver->GetGUID();
7680 data << uint8(questStatus);
7681 ++count;
7682 }
7683 }
7684
7685 data.put<uint32>(0, count); // write real count
7686 GetSession()->SendPacket(&data);
7687}
@ SMSG_QUESTGIVER_STATUS_MULTIPLE
Definition: Opcodes.h:1078
QuestGiverStatus GetQuestDialogStatus(Object *questGiver)
Definition: PlayerQuest.cpp:1589

References DIALOG_STATUS_NONE, GAMEOBJECT_TYPE_QUESTGIVER, ObjectAccessor::GetCreatureOrPetOrVehicle(), Map::GetGameObject(), GameObject::GetGoType(), Object::GetGUID(), WorldObject::GetMap(), GetQuestDialogStatus(), GetSession(), Unit::HasNpcFlag(), Unit::IsHostileTo(), m_clientGUIDs, ByteBuffer::put(), WorldSession::SendPacket(), SMSG_QUESTGIVER_STATUS_MULTIPLE, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by GiveLevel(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleQuestgiverStatusMultipleQuery(), RewardQuest(), and SendInitialPacketsAfterAddToMap().

◆ SendQuestReward()

void Player::SendQuestReward ( Quest const *  quest,
uint32  XP 
)
2352{
2353 uint32 questid = quest->GetQuestId();
2354 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_COMPLETE quest = {}", questid);
2355 sGameEventMgr->HandleQuestComplete(questid);
2356 WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4 + 4 + 4 + 4 + 4));
2357 data << uint32(questid);
2358
2359 if (!IsMaxLevel())
2360 {
2361 data << uint32(XP);
2362 data << uint32(quest->GetRewOrReqMoney(GetLevel()));
2363 }
2364 else
2365 {
2366 data << uint32(0);
2367 data << uint32(quest->GetRewOrReqMoney(GetLevel()) + quest->GetRewMoneyMaxLevel());
2368 }
2369
2370 data << uint32(10 * quest->CalculateHonorGain(GetQuestLevel(quest)));
2371 data << uint32(quest->GetBonusTalents()); // bonus talents
2372 data << uint32(quest->GetRewArenaPoints());
2373 GetSession()->SendPacket(&data);
2374}
@ SMSG_QUESTGIVER_QUEST_COMPLETE
Definition: Opcodes.h:431
bool IsMaxLevel() const
Definition: Player.cpp:2548

References Quest::CalculateHonorGain(), Quest::GetBonusTalents(), Unit::GetLevel(), Quest::GetQuestId(), GetQuestLevel(), Quest::GetRewArenaPoints(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), GetSession(), IsMaxLevel(), LOG_DEBUG, WorldSession::SendPacket(), sGameEventMgr, and SMSG_QUESTGIVER_QUEST_COMPLETE.

Referenced by RewardQuest().

◆ SendQuestTimerFailed()

void Player::SendQuestTimerFailed ( uint32  quest_id)
2389{
2390 if (quest_id)
2391 {
2393 data << uint32(quest_id);
2394 GetSession()->SendPacket(&data);
2395 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_FAILEDTIMER");
2396 }
2397}
@ SMSG_QUESTUPDATE_FAILEDTIMER
Definition: Opcodes.h:437

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTUPDATE_FAILEDTIMER.

Referenced by FailQuest().

◆ SendQuestUpdate()

void Player::SendQuestUpdate ( uint32  questId)
1521{
1522 uint32 zone = 0, area = 0;
1523 // xinef: fixup
1524 uint32 oldSpellId = 0;
1525
1526 SpellAreaForQuestMapBounds saBounds = sSpellMgr->GetSpellAreaForQuestMapBounds(questId);
1527 if (saBounds.first != saBounds.second)
1528 {
1529 GetZoneAndAreaId(zone, area);
1530
1531 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1532 {
1533 // xinef: spell was already casted, skip different areas with same spell
1534 if (itr->second->spellId == oldSpellId)
1535 continue;
1536 if (itr->second->autocast && itr->second->IsFitToRequirements(this, zone, area))
1537 if (!HasAura(itr->second->spellId))
1538 {
1539 CastSpell(this, itr->second->spellId, true);
1540 oldSpellId = itr->second->spellId;
1541 }
1542 }
1543 }
1544
1545 saBounds = sSpellMgr->GetSpellAreaForQuestEndMapBounds(questId);
1546
1547 // xinef: fixup
1548 uint32 skipSpellId = 0;
1549 oldSpellId = 0;
1550 if (saBounds.first != saBounds.second)
1551 {
1552 if (!zone || !area)
1553 GetZoneAndAreaId(zone, area);
1554
1555 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1556 {
1557 // xinef: skip spell for which condition is already fulfilled
1558 if (itr->second->spellId == skipSpellId)
1559 continue;
1560 skipSpellId = 0;
1561
1562 // xinef: spells are sorted, if no condition is fulfilled remove aura
1563 if (oldSpellId && oldSpellId != itr->second->spellId)
1564 {
1565 RemoveAurasDueToSpell(oldSpellId);
1566 oldSpellId = 0;
1567 }
1568
1569 if (!itr->second->IsFitToRequirements(this, zone, area))
1570 {
1571 //RemoveAurasDueToSpell(itr->second->spellId);
1572 oldSpellId = itr->second->spellId;
1573 }
1574 else
1575 {
1576 skipSpellId = itr->second->spellId;
1577 oldSpellId = 0;
1578 }
1579 }
1580
1581 // xinef: check if we have something to remove yet
1582 if (oldSpellId)
1583 RemoveAurasDueToSpell(oldSpellId);
1584 }
1585
1587}
std::pair< SpellAreaForQuestMap::const_iterator, SpellAreaForQuestMap::const_iterator > SpellAreaForQuestMapBounds
Definition: SpellMgr.h:548

References Unit::CastSpell(), WorldObject::GetZoneAndAreaId(), Unit::HasAura(), Unit::RemoveAurasDueToSpell(), sSpellMgr, and UpdateForQuestWorldObjects().

Referenced by AddQuest(), RemoveActiveQuest(), RemoveRewardedQuest(), RewardQuest(), and SetQuestStatus().

◆ SendQuestUpdateAddCreatureOrGo()

void Player::SendQuestUpdateAddCreatureOrGo ( Quest const *  quest,
ObjectGuid  guid,
uint32  creatureOrGO_idx,
uint16  old_count,
uint16  add_count 
)
2451{
2452 ASSERT(old_count + add_count < 65536 && "mob/GO count store in 16 bits 2^16 = 65536 (0..65536)");
2453
2454 int32 entry = quest->RequiredNpcOrGo[ creatureOrGO_idx ];
2455 if (entry < 0)
2456 // client expected gameobject template id in form (id|0x80000000)
2457 entry = (-entry) | 0x80000000;
2458
2459 WorldPacket data(SMSG_QUESTUPDATE_ADD_KILL, (4 * 4 + 8));
2460 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_KILL");
2461 data << uint32(quest->GetQuestId());
2462 data << uint32(entry);
2463 data << uint32(old_count + add_count);
2464 data << uint32(quest->RequiredNpcOrGoCount[ creatureOrGO_idx ]);
2465 data << guid;
2466 GetSession()->SendPacket(&data);
2467
2468 uint16 log_slot = FindQuestSlot(quest->GetQuestId());
2469 if (log_slot < MAX_QUEST_LOG_SIZE)
2470 SetQuestSlotCounter(log_slot, creatureOrGO_idx, GetQuestSlotCounter(log_slot, creatureOrGO_idx) + add_count);
2471}
@ SMSG_QUESTUPDATE_ADD_KILL
Definition: Opcodes.h:439
uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const
Definition: Player.h:1476

References ASSERT, FindQuestSlot(), Quest::GetQuestId(), GetQuestSlotCounter(), GetSession(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, WorldSession::SendPacket(), SetQuestSlotCounter(), and SMSG_QUESTUPDATE_ADD_KILL.

Referenced by KillCreditGO(), KilledMonsterCredit(), and TalkedToCreature().

◆ SendQuestUpdateAddItem()

void Player::SendQuestUpdateAddItem ( Quest const *  quest,
uint32  item_idx,
uint16  count 
)
2442{
2444 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_ITEM");
2445 //data << quest->RequiredItemId[item_idx];
2446 //data << count;
2447 GetSession()->SendPacket(&data);
2448}
@ SMSG_QUESTUPDATE_ADD_ITEM
Definition: Opcodes.h:440

References GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_QUESTUPDATE_ADD_ITEM.

◆ SendQuestUpdateAddPlayer()

void Player::SendQuestUpdateAddPlayer ( Quest const *  quest,
uint16  old_count,
uint16  add_count 
)
2474{
2475 ASSERT(old_count + add_count < 65536 && "player count store in 16 bits");
2476
2478 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_PVP_KILL");
2479 data << uint32(quest->GetQuestId());
2480 data << uint32(old_count + add_count);
2481 data << uint32(quest->GetPlayersSlain());
2482 GetSession()->SendPacket(&data);
2483
2484 uint16 log_slot = FindQuestSlot(quest->GetQuestId());
2485 if (log_slot < MAX_QUEST_LOG_SIZE)
2487}
@ SMSG_QUESTUPDATE_ADD_PVP_KILL
Definition: Opcodes.h:1165

References ASSERT, FindQuestSlot(), Quest::GetPlayersSlain(), Quest::GetQuestId(), GetQuestSlotCounter(), GetSession(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, QUEST_PVP_KILL_SLOT, WorldSession::SendPacket(), SetQuestSlotCounter(), and SMSG_QUESTUPDATE_ADD_PVP_KILL.

Referenced by KilledPlayerCreditForQuest().

◆ SendRaidDifficulty()

void Player::SendRaidDifficulty ( bool  IsInGroup,
int32  forcedDifficulty = -1 
)
178{
179 uint8 val = 0x00000001;
181 data << uint32(forcedDifficulty == -1 ? GetRaidDifficulty() : forcedDifficulty);
182 data << uint32(val);
183 data << uint32(IsInGroup);
184 GetSession()->SendPacket(&data);
185}
@ MSG_SET_RAID_DIFFICULTY
Definition: Opcodes.h:1289

References GetRaidDifficulty(), GetSession(), MSG_SET_RAID_DIFFICULTY, and WorldSession::SendPacket().

Referenced by Group::AddMember(), WorldSession::HandleSetRaidDifficultyOpcode(), SendInitialPacketsAfterAddToMap(), and Group::SetRaidDifficulty().

◆ SendRaidInfo()

void Player::SendRaidInfo ( )
6535{
6536 uint32 counter = 0;
6537
6539
6540 std::size_t p_counter = data.wpos();
6541 data << uint32(counter); // placeholder
6542
6543 time_t now = GameTime::GetGameTime().count();
6544
6545 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6546 {
6547 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6548 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6549 {
6550 if (itr->second.perm)
6551 {
6552 InstanceSave* save = itr->second.save;
6553 time_t resetTime = itr->second.extended ? save->GetExtendedResetTime() : save->GetResetTime();
6554 data << uint32(save->GetMapId()); // map id
6555 data << uint32(save->GetDifficulty()); // difficulty
6556 data << ObjectGuid::Create<HighGuid::Instance>(save->GetInstanceId()); // instance id
6557 data << uint8(1); // expired = 0
6558 data << uint8(itr->second.extended ? 1 : 0);// extended = 1
6559 data << uint32(resetTime >= now ? resetTime - now : 0); // reset time
6560 ++counter;
6561 }
6562 }
6563 }
6564 data.put<uint32>(p_counter, counter);
6565 GetSession()->SendPacket(&data);
6566}
@ SMSG_RAID_INSTANCE_INFO
Definition: Opcodes.h:746
Difficulty GetDifficulty() const
Definition: InstanceSaveMgr.h:63

References InstanceSave::GetDifficulty(), InstanceSave::GetExtendedResetTime(), GameTime::GetGameTime(), Object::GetGUID(), InstanceSave::GetInstanceId(), InstanceSave::GetMapId(), InstanceSave::GetResetTime(), GetSession(), MAX_DIFFICULTY, ByteBuffer::put(), WorldSession::SendPacket(), sInstanceSaveMgr, SMSG_RAID_INSTANCE_INFO, and ByteBuffer::wpos().

Referenced by WorldSession::HandleRequestRaidInfoOpcode().

◆ SendRefundInfo()

void Player::SendRefundInfo ( Item item)
private
15471{
15472 // This function call unsets ITEM_FLAGS_REFUNDABLE if played time is over 2 hours.
15473 item->UpdatePlayedTime(this);
15474
15475 if (!item->IsRefundable())
15476 {
15477 LOG_DEBUG("entities.player.items", "Item refund: item not refundable!");
15478 return;
15479 }
15480
15481 if (GetGUID().GetCounter() != item->GetRefundRecipient()) // Formerly refundable item got traded
15482 {
15483 LOG_DEBUG("entities.player.items", "Item refund: item was traded!");
15484 item->SetNotRefundable(this);
15485 return;
15486 }
15487
15488 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(item->GetPaidExtendedCost());
15489 if (!iece)
15490 {
15491 LOG_DEBUG("entities.player.items", "Item refund: cannot find extendedcost data.");
15492 return;
15493 }
15494
15495 WorldPacket data(SMSG_ITEM_REFUND_INFO_RESPONSE, 8 + 4 + 4 + 4 + 4 * 4 + 4 * 4 + 4 + 4);
15496 data << item->GetGUID(); // item guid
15497 data << uint32(item->GetPaidMoney()); // money cost
15498 data << uint32(iece->reqhonorpoints); // honor point cost
15499 data << uint32(iece->reqarenapoints); // arena point cost
15500 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
15501 {
15502 data << uint32(iece->reqitem[i]);
15503 data << uint32(iece->reqitemcount[i]);
15504 }
15505 data << uint32(0);
15506 data << uint32(GetTotalPlayedTime() - item->GetPlayedTime());
15507 GetSession()->SendPacket(&data);
15508}
@ SMSG_ITEM_REFUND_INFO_RESPONSE
Definition: Opcodes.h:1232
uint32 GetTotalPlayedTime()
Definition: Player.h:1186

References Object::GetGUID(), Item::GetPaidExtendedCost(), Item::GetPaidMoney(), Item::GetPlayedTime(), Item::GetRefundRecipient(), GetSession(), GetTotalPlayedTime(), Item::IsRefundable(), LOG_DEBUG, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, WorldSession::SendPacket(), Item::SetNotRefundable(), sItemExtendedCostStore, SMSG_ITEM_REFUND_INFO_RESPONSE, and Item::UpdatePlayedTime().

Referenced by WorldSession::HandleItemRefundInfoRequest(), and SwapItem().

◆ SendRemoveControlBar()

void Player::SendRemoveControlBar ( )
9655{
9657 data << uint64(0);
9658 GetSession()->SendPacket(&data);
9659}

References GetSession(), WorldSession::SendPacket(), and SMSG_PET_SPELLS.

Referenced by Unit::RemoveCharmedBy(), and Unit::SetMinion().

◆ SendResetFailedNotify()

void Player::SendResetFailedNotify ( uint32  mapid)
188{
190 data << uint32(mapid);
191 GetSession()->SendPacket(&data);
192}
@ SMSG_RESET_FAILED_NOTIFY
Definition: Opcodes.h:948

References GetSession(), WorldSession::SendPacket(), and SMSG_RESET_FAILED_NOTIFY.

◆ SendResetInstanceFailed()

void Player::SendResetInstanceFailed ( uint32  reason,
uint32  MapId 
)
334{
335 /*reasons for instance reset failure:
336 // 0: There are players inside the instance.
337 // 1: There are players offline in your party.
338 // 2>: There are players in your party attempting to zone into an instance.
339 */
341 data << uint32(reason);
342 data << uint32(MapId);
343 GetSession()->SendPacket(&data);
344}
@ SMSG_INSTANCE_RESET_FAILED
Definition: Opcodes.h:829

References GetSession(), WorldSession::SendPacket(), and SMSG_INSTANCE_RESET_FAILED.

Referenced by ResetInstances(), and Group::ResetInstances().

◆ SendResetInstanceSuccess()

void Player::SendResetInstanceSuccess ( uint32  MapId)
327{
329 data << uint32(MapId);
330 GetSession()->SendPacket(&data);
331}
@ SMSG_INSTANCE_RESET
Definition: Opcodes.h:828

References GetSession(), WorldSession::SendPacket(), and SMSG_INSTANCE_RESET.

Referenced by ResetInstances(), and Group::ResetInstances().

◆ SendRespondInspectAchievements()

void Player::SendRespondInspectAchievements ( Player player) const
13860{
13862}
void SendRespondInspectAchievements(Player *player) const
Definition: AchievementMgr.cpp:2389

References m_achievementMgr, and AchievementMgr::SendRespondInspectAchievements().

Referenced by WorldSession::HandleQueryInspectAchievements().

◆ SendSavedInstances()

void Player::SendSavedInstances ( )
6572{
6573 bool hasBeenSaved = false;
6574 WorldPacket data;
6575
6576 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6577 {
6578 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6579 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6580 {
6581 if (itr->second.perm) // only permanent binds are sent
6582 {
6583 hasBeenSaved = true;
6584 break;
6585 }
6586 }
6587 }
6588
6589 //Send opcode 811. true or false means, whether you have current raid/heroic instances
6591 data << uint32(hasBeenSaved);
6592 GetSession()->SendPacket(&data);
6593
6594 if (!hasBeenSaved)
6595 return;
6596
6597 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6598 {
6599 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6600 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6601 {
6602 if (itr->second.perm)
6603 {
6605 data << uint32(itr->second.save->GetMapId());
6606 GetSession()->SendPacket(&data);
6607 }
6608 }
6609 }
6610}
@ SMSG_UPDATE_INSTANCE_OWNERSHIP
Definition: Opcodes.h:841
@ SMSG_UPDATE_LAST_INSTANCE
Definition: Opcodes.h:830
void Initialize(uint16 opcode, std::size_t newres=200)
Definition: WorldPacket.h:69

References Object::GetGUID(), GetSession(), WorldPacket::Initialize(), MAX_DIFFICULTY, WorldSession::SendPacket(), sInstanceSaveMgr, SMSG_UPDATE_INSTANCE_OWNERSHIP, and SMSG_UPDATE_LAST_INSTANCE.

Referenced by TeleportTo().

◆ SendSellError()

void Player::SendSellError ( SellResult  msg,
Creature creature,
ObjectGuid  guid,
uint32  param 
)
4092{
4093 LOG_DEBUG("network", "WORLD: Sent SMSG_SELL_ITEM");
4094 WorldPacket data(SMSG_SELL_ITEM, (8 + 8 + (param ? 4 : 0) + 1)); // last check 2.0.10
4095 data << (creature ? creature->GetGUID() : ObjectGuid::Empty);
4096 data << guid;
4097 if (param > 0)
4098 data << uint32(param);
4099 data << uint8(msg);
4100 GetSession()->SendPacket(&data);
4101}
@ SMSG_SELL_ITEM
Definition: Opcodes.h:447

References ObjectGuid::Empty, Object::GetGUID(), GetSession(), LOG_DEBUG, WorldSession::SendPacket(), and SMSG_SELL_ITEM.

Referenced by WorldSession::HandleBuybackItem(), debug_commandscript::HandleDebugSendSellErrorCommand(), WorldSession::HandleSellItemOpcode(), and WorldSession::SendListInventory().

◆ SendSystemMessage()

void Player::SendSystemMessage ( std::string_view  msg,
bool  escapeCharacters = false 
)
16309{
16310 ChatHandler(GetSession()).SendSysMessage(msg, escapeCharacters);
16311}

References GetSession(), and ChatHandler::SendSysMessage().

◆ SendTalentsInfoData()

◆ SendTalentWipeConfirm()

void Player::SendTalentWipeConfirm ( ObjectGuid  guid)
8836{
8837 WorldPacket data(MSG_TALENT_WIPE_CONFIRM, (8 + 4));
8838 data << guid;
8839 uint32 cost = sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST) ? 0 : resetTalentsCost();
8840 data << cost;
8841 GetSession()->SendPacket(&data);
8842}
@ MSG_TALENT_WIPE_CONFIRM
Definition: Opcodes.h:712

References CONFIG_NO_RESET_TALENT_COST, GetSession(), MSG_TALENT_WIPE_CONFIRM, resetTalentsCost(), WorldSession::SendPacket(), and sWorld.

Referenced by Spell::EffectUntrainTalents(), and OnGossipSelect().

◆ SendTaxiNodeStatusMultiple()

void Player::SendTaxiNodeStatusMultiple ( )
10461{
10462 for (auto itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
10463 {
10464 if (!itr->IsCreature())
10465 {
10466 continue;
10467 }
10468
10469 Creature* creature = ObjectAccessor::GetCreature(*this, *itr);
10470 if (!creature || creature->IsHostileTo(this))
10471 {
10472 continue;
10473 }
10474
10475 if (!creature->HasNpcFlag(UNIT_NPC_FLAG_FLIGHTMASTER))
10476 {
10477 continue;
10478 }
10479
10480 uint32 nearestNode = sObjectMgr->GetNearestTaxiNode(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetMapId(), GetTeamId());
10481 if (!nearestNode)
10482 {
10483 continue;
10484 }
10485
10487 data << *itr;
10488 data << uint8(m_taxi.IsTaximaskNodeKnown(nearestNode) ? 1 : 0);
10489 SendDirectMessage(&data);
10490 }
10491}
@ SMSG_TAXINODE_STATUS
Definition: Opcodes.h:457
bool IsTaximaskNodeKnown(uint32 nodeidx) const
Definition: PlayerTaxi.h:35

References ObjectAccessor::GetCreature(), WorldLocation::GetMapId(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTeamId(), Unit::HasNpcFlag(), Unit::IsHostileTo(), PlayerTaxi::IsTaximaskNodeKnown(), m_clientGUIDs, m_taxi, SendDirectMessage(), SMSG_TAXINODE_STATUS, sObjectMgr, and UNIT_NPC_FLAG_FLIGHTMASTER.

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendTeleportAckPacket()

void Player::SendTeleportAckPacket ( )
1322{
1324 data << GetPackGUID();
1325 data << uint32(0); // this value increments every time
1326 BuildMovementPacket(&data);
1327 GetSession()->SendPacket(&data);
1328}
@ MSG_MOVE_TELEPORT_ACK
Definition: Opcodes.h:229
void BuildMovementPacket(ByteBuffer *data) const
Definition: Unit.cpp:19830

References Unit::BuildMovementPacket(), Object::GetPackGUID(), GetSession(), MSG_MOVE_TELEPORT_ACK, and WorldSession::SendPacket().

Referenced by TeleportTo().

◆ SendTransferAborted()

void Player::SendTransferAborted ( uint32  mapid,
TransferAbortReason  reason,
uint8  arg = 0 
)
11671{
11673 data << uint32(mapid);
11674 data << uint8(reason); // transfer abort reason
11675 switch (reason)
11676 {
11680 // these are the ONLY cases that have an extra argument in the packet!!!
11681 data << uint8(arg);
11682 break;
11683 default:
11684 break;
11685 }
11686 GetSession()->SendPacket(&data);
11687}
@ TRANSFER_ABORT_UNIQUE_MESSAGE
Definition: Player.h:791
@ TRANSFER_ABORT_INSUF_EXPAN_LVL
Definition: Player.h:789
@ SMSG_TRANSFER_ABORTED
Definition: Opcodes.h:94

References GetSession(), WorldSession::SendPacket(), SMSG_TRANSFER_ABORTED, TRANSFER_ABORT_DIFFICULTY, TRANSFER_ABORT_INSUF_EXPAN_LVL, and TRANSFER_ABORT_UNIQUE_MESSAGE.

Referenced by InstanceMap::CannotEnter(), MapMgr::PlayerCannotEnter(), Satisfy(), and TeleportTo().

◆ SendUpdateToOutOfRangeGroupMembers()

void Player::SendUpdateToOutOfRangeGroupMembers ( )
11658{
11660 return;
11661 if (Group* group = GetGroup())
11662 group->UpdatePlayerOutOfRange(this);
11663
11666 if (Pet* pet = GetPet())
11667 pet->ResetAuraUpdateMaskForRaid();
11668}
@ GROUP_UPDATE_FLAG_NONE
Definition: Group.h:99

References GetGroup(), GetPet(), GROUP_UPDATE_FLAG_NONE, m_auraRaidUpdateMask, and m_groupUpdateMask.

Referenced by Update().

◆ SendUpdateWorldState()

void Player::SendUpdateWorldState ( uint32  variable,
uint32  value 
) const
2194{
2196 worldstate.VariableID = variable;
2197 worldstate.Value = value;
2198 SendDirectMessage(worldstate.Write());
2199}
Definition: WorldStatePackets.h:50
int32 Value
Definition: WorldStatePackets.h:57
WorldPacket const * Write() override
Definition: WorldStatePackets.cpp:40
int32 VariableID
Definition: WorldStatePackets.h:56

References SendDirectMessage(), WorldPackets::WorldState::UpdateWorldState::Value, WorldPackets::WorldState::UpdateWorldState::VariableID, and WorldPackets::WorldState::UpdateWorldState::Write().

Referenced by debug_commandscript::HandleDebugUpdateWorldStateCommand(), BfCapturePoint::HandlePlayerEnter(), OPvPCapturePoint::HandlePlayerEnter(), OPvPCapturePointEP_EWT::HandlePlayerEnter(), OPvPCapturePointEP_NPT::HandlePlayerEnter(), OPvPCapturePointEP_CGT::HandlePlayerEnter(), OPvPCapturePointEP_PWT::HandlePlayerEnter(), OPvPCapturePointGH::HandlePlayerEnter(), OPvPCapturePointHP::HandlePlayerEnter(), OPvPCapturePointNA::HandlePlayerEnter(), OPvPCapturePointTF::HandlePlayerEnter(), OPvPCapturePointZM_Beacon::HandlePlayerEnter(), BfCapturePoint::HandlePlayerLeave(), OPvPCapturePoint::HandlePlayerLeave(), OPvPCapturePointEP_EWT::HandlePlayerLeave(), OPvPCapturePointEP_NPT::HandlePlayerLeave(), OPvPCapturePointEP_CGT::HandlePlayerLeave(), OPvPCapturePointEP_PWT::HandlePlayerLeave(), OPvPCapturePointGH::HandlePlayerLeave(), OPvPCapturePointHP::HandlePlayerLeave(), OPvPCapturePointNA::HandlePlayerLeave(), OPvPCapturePointTF::HandlePlayerLeave(), OPvPCapturePointZM_Beacon::HandlePlayerLeave(), npc_wg_queue::OnGossipHello(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerAreaUpdate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnPlayerEnter(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::OnPlayerEnter(), instance_oculus::instance_oculus_InstanceMapScript::OnPlayerEnter(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::OnPlayerEnter(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), SendBattlefieldWorldStates(), SendBGWeekendWorldStates(), OutdoorPvPEP::SendRemoveWorldStates(), OutdoorPvPGH::SendRemoveWorldStates(), OutdoorPvPHP::SendRemoveWorldStates(), OutdoorPvPNA::SendRemoveWorldStates(), OutdoorPvPSI::SendRemoveWorldStates(), OutdoorPvPTF::SendRemoveWorldStates(), OutdoorPvPZM::SendRemoveWorldStates(), and GameEventMgr::SendWorldStateUpdate().

◆ SetAcceptWhispers()

void Player::SetAcceptWhispers ( bool  on)
inline

◆ SetActiveSpec()

void Player::SetActiveSpec ( uint8  spec)
inline
1723{ m_activeSpec = spec; }

References m_activeSpec.

Referenced by ActivateSpec().

◆ SetAmmo()

void Player::SetAmmo ( uint32  item)
2508{
2509 if (!item)
2510 return;
2511
2512 // already set
2513 if (GetUInt32Value(PLAYER_AMMO_ID) == item)
2514 return;
2515
2516 // check ammo
2517 InventoryResult msg = CanUseAmmo(item);
2518 if (msg != EQUIP_ERR_OK)
2519 {
2520 SendEquipError(msg, nullptr, nullptr, item);
2521 return;
2522 }
2523
2525
2527}

References _ApplyAmmoBonuses(), CanUseAmmo(), EQUIP_ERR_OK, Object::GetUInt32Value(), PLAYER_AMMO_ID, SendEquipError(), and Unit::SetUInt32Value().

Referenced by Create(), and WorldSession::HandleSetAmmoOpcode().

◆ SetArenaPoints()

void Player::SetArenaPoints ( uint32  value)
6220{
6221 if (value > sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS))
6222 value = sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS);
6224 if (value)
6226}
@ ITEM_ARENA_POINTS_ID
Definition: Player.h:961
@ CONFIG_MAX_ARENA_POINTS
Definition: IWorld.h:249

References AddKnownCurrency(), CONFIG_MAX_ARENA_POINTS, ITEM_ARENA_POINTS_ID, PLAYER_FIELD_ARENA_CURRENCY, Unit::SetUInt32Value(), and sWorld.

Referenced by Create(), LoadFromDB(), and ModifyArenaPoints().

◆ SetArenaTeamIdInvited()

void Player::SetArenaTeamIdInvited ( uint32  ArenaTeamId)
inline

◆ SetArenaTeamInfoField()

◆ SetAtLoginFlag()

void Player::SetAtLoginFlag ( AtLoginFlags  f)
inline

◆ SetAuraUpdateMaskForRaid()

void Player::SetAuraUpdateMaskForRaid ( uint8  slot)
inline
2453{ m_auraRaidUpdateMask |= (uint64(1) << slot); }

References m_auraRaidUpdateMask.

◆ SetBankBagSlotCount()

void Player::SetBankBagSlotCount ( uint8  count)
inline

◆ SetBaseModValue()

void Player::SetBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType,
float  value 
)
inline
2169{ m_auraBaseMod[modGroup][modType] = value; }

References m_auraBaseMod.

Referenced by UpdateAllCritPercentages().

◆ SetBaseRune()

void Player::SetBaseRune ( uint8  index,
RuneType  baseRune 
)
inline
2491{ m_runes->runes[index].BaseRune = baseRune; }

References RuneInfo::BaseRune, m_runes, and Runes::runes.

Referenced by InitRunes().

◆ SetBattlegroundId()

◆ SetBattlegroundOrBattlefieldRaid()

void Player::SetBattlegroundOrBattlefieldRaid ( Group group,
int8  subgroup = -1 
)
13033{
13034 //we must move references from m_group to m_originalGroup
13035 if (GetGroup() && (GetGroup()->isBGGroup() || GetGroup()->isBFGroup()))
13036 {
13037 LOG_INFO("misc", "Player::SetBattlegroundOrBattlefieldRaid - current group is {} group!", (GetGroup()->isBGGroup() ? "BG" : "BF"));
13038 //ABORT(); // pussywizard: origanal group can never be bf/bg group
13039 }
13040
13042
13043 m_group.unlink();
13044 m_group.link(group, this);
13045 m_group.setSubGroup((uint8)subgroup);
13046}
uint8 GetSubGroup() const
Definition: Player.h:2449

References GetGroup(), GetSubGroup(), Reference< TO, FROM >::link(), LOG_INFO, m_group, SetOriginalGroup(), GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::AddMember(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), and Battleground::AddOrSetPlayerToCorrectBgGroup().

◆ SetBGData()

void Player::SetBGData ( BGData bgdata)
inline
2237{ m_bgData = bgdata; }

References m_bgData.

◆ SetBindPoint()

void Player::SetBindPoint ( ObjectGuid  guid)
8829{
8831 data << guid;
8832 GetSession()->SendPacket(&data);
8833}
@ SMSG_BINDER_CONFIRM
Definition: Opcodes.h:777

References GetSession(), WorldSession::SendPacket(), and SMSG_BINDER_CONFIRM.

Referenced by npc_innkeeper::OnGossipSelect(), and OnGossipSelect().

◆ SetCanBlock()

void Player::SetCanBlock ( bool  value)
13083{
13084 if (m_canBlock == value)
13085 return;
13086
13087 m_canBlock = value;
13089}
void UpdateBlockPercentage()
Definition: StatSystem.cpp:616

References m_canBlock, and UpdateBlockPercentage().

Referenced by Spell::EffectBlock().

◆ SetCanFly()

bool Player::SetCanFly ( bool  enable,
bool  packetOnly = false 
)
overridevirtual

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

movement counter

Reimplemented from Unit.

15871{
15872 sScriptMgr->AnticheatSetCanFlybyServer(this, apply);
15873
15874 if (!packetOnly && !Unit::SetCanFly(apply))
15875 return false;
15876
15877 if (!apply)
15879
15881 data << GetPackGUID();
15882 data << uint32(0);
15883 SendDirectMessage(&data);
15884
15885 data.Initialize(MSG_MOVE_UPDATE_CAN_FLY, 64);
15886 data << GetPackGUID();
15887 BuildMovementPacket(&data);
15888 SendMessageToSet(&data, false);
15889 return true;
15890}
@ MSG_MOVE_UPDATE_CAN_FLY
Definition: Opcodes.h:971
@ SMSG_MOVE_SET_CAN_FLY
Definition: Opcodes.h:865
@ SMSG_MOVE_UNSET_CAN_FLY
Definition: Opcodes.h:866
virtual bool SetCanFly(bool enable, bool packetOnly=false)
Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pre...
Definition: Unit.cpp:20521

References Unit::BuildMovementPacket(), GameTime::GetGameTime(), Object::GetPackGUID(), Position::GetPositionZ(), WorldPacket::Initialize(), MSG_MOVE_UPDATE_CAN_FLY, SendDirectMessage(), SendMessageToSet(), Unit::SetCanFly(), SetFallInformation(), SMSG_MOVE_SET_CAN_FLY, SMSG_MOVE_UNSET_CAN_FLY, and sScriptMgr.

Referenced by Unit::KnockbackFrom().

◆ SetCanKnockback()

void Player::SetCanKnockback ( bool  value)
inline
2477{ m_canKnockback = value; }

References m_canKnockback.

Referenced by Unit::KnockbackFrom().

◆ SetCanParry()

void Player::SetCanParry ( bool  value)
13074{
13075 if (m_canParry == value)
13076 return;
13077
13078 m_canParry = value;
13080}
void UpdateParryPercentage()
Definition: StatSystem.cpp:735

References m_canParry, and UpdateParryPercentage().

Referenced by Spell::EffectParry(), and AuraEffect::HandleAuraModParryPercent().

◆ SetCanTeleport()

◆ SetCanTitanGrip()

void Player::SetCanTitanGrip ( bool  value)
13092{
13093 m_canTitanGrip = value;
13094}

References m_canTitanGrip.

Referenced by ActivateSpec(), Spell::EffectTitanGrip(), and resetTalents().

◆ SetChampioningFaction()

void Player::SetChampioningFaction ( uint32  faction)
inline
2528{ m_ChampioningFaction = faction; }

References m_ChampioningFaction.

Referenced by AuraEffect::HandleAuraDummy().

◆ setCinematic()

void Player::setCinematic ( uint8  cine)
inline
1813 {
1814 m_cinematic = cine;
1815 }

References m_cinematic.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ SetClientControl()

void Player::SetClientControl ( Unit target,
bool  allowMove,
bool  packetOnly = false 
)
12804{
12806 data << target->GetPackGUID();
12807 data << uint8((allowMove && !target->HasUnitState(UNIT_STATE_FLEEING | UNIT_STATE_CONFUSED)) ? 1 : 0);
12808 GetSession()->SendPacket(&data);
12809
12810 // We want to set the packet only
12811 if (packetOnly)
12812 return;
12813
12814 if (this != target)
12815 SetViewpoint(target, allowMove);
12816
12817 if (allowMove)
12818 SetMover(target);
12819
12820 // Xinef: disable moving if target has disable move flag
12821 if (!target->IsCreature())
12822 return;
12823
12824 if (allowMove && target->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE))
12825 {
12827 target->SetControlled(true, UNIT_STATE_ROOT);
12828 }
12829 else if (!allowMove && target->HasUnitState(UNIT_STATE_ROOT) && !target->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
12830 {
12832 {
12833 // Xinef: restore original orientation, important for shooting vehicles!
12835 target->SetOrientation(pos.GetOrientation());
12836 target->SetFacingTo(pos.GetOrientation());
12837 target->DisableSpline();
12838 }
12839 else
12840 target->SetControlled(false, UNIT_STATE_ROOT);
12841 }
12842}
@ UNIT_MASK_ACCESSORY
Definition: UnitDefines.h:144
@ UNIT_STATE_CONFUSED
Definition: UnitDefines.h:160
@ UNIT_STATE_FLEEING
Definition: UnitDefines.h:156
@ SMSG_CLIENT_CONTROL_UPDATE
Definition: Opcodes.h:375
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:339
void GetTransportHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:344
bool IsMOTransport() const
Definition: ObjectGuid.h:175
void SetOrientation(float orientation)
Definition: Position.h:112
void SetFacingTo(float ori)
Definition: Unit.cpp:20441
void DisableSpline()
Definition: Unit.cpp:637
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition: Unit.cpp:17962
ObjectGuid GetTransGUID() const override
Definition: Unit.cpp:18684
uint32 HasUnitTypeMask(uint32 mask) const
Definition: Unit.h:748

References Unit::ClearUnitState(), Unit::DisableSpline(), Creature::GetHomePosition(), Position::GetOrientation(), Object::GetPackGUID(), GetSession(), Unit::GetTransGUID(), Creature::GetTransportHomePosition(), Unit::HasUnitFlag(), Unit::HasUnitMovementFlag(), Unit::HasUnitState(), Unit::HasUnitTypeMask(), Object::IsCreature(), ObjectGuid::IsMOTransport(), MOVEMENTFLAG_ONTRANSPORT, WorldSession::SendPacket(), Unit::SetControlled(), Unit::SetFacingTo(), SetMover(), Position::SetOrientation(), SetViewpoint(), PackedGuid::size(), SMSG_CLIENT_CONTROL_UPDATE, Object::ToCreature(), UNIT_FLAG_DISABLE_MOVE, UNIT_MASK_ACCESSORY, UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, and UNIT_STATE_ROOT.

Referenced by Battleground::BlockMovement(), WorldSession::HandleMoveTeleportAck(), npc_pilgrims_bounty_chair::PassengerBoarded(), Unit::RemoveCharmedBy(), Unit::SetCharmedBy(), Unit::SetConfused(), and Unit::SetFeared().

◆ SetCommandStatusOff()

◆ SetCommandStatusOn()

◆ SetCommentator()

void Player::SetCommentator ( bool  on)
inline

◆ SetContestedPvPTimer()

void Player::SetContestedPvPTimer ( uint32  newTime)
inline
1846{m_contestedPvPTimer = newTime;}

References m_contestedPvPTimer.

Referenced by Unit::SetContestedPvP().

◆ SetCreationTime()

void Player::SetCreationTime ( Seconds  creationTime)
inline
2515{ m_creationTime = creationTime; }

References m_creationTime.

Referenced by LoadFromDB().

◆ SetCurrentRune()

void Player::SetCurrentRune ( uint8  index,
RuneType  currentRune 
)
inline
2492{ m_runes->runes[index].CurrentRune = currentRune; }

References RuneInfo::CurrentRune, m_runes, and Runes::runes.

Referenced by ConvertRune(), and InitRunes().

◆ SetCurrentTitle()

void Player::SetCurrentTitle ( CharTitlesEntry const *  title,
bool  clear = false 
)
inline
2521{ SetUInt32Value(PLAYER_CHOSEN_TITLE, clear ? 0 : title->bit_index); };

References CharTitlesEntry::bit_index, PLAYER_CHOSEN_TITLE, and Unit::SetUInt32Value().

Referenced by SetTitle().

◆ SetDailyQuestStatus()

void Player::SetDailyQuestStatus ( uint32  quest_id)
12044{
12045 if (Quest const* qQuest = sObjectMgr->GetQuestTemplate(quest_id))
12046 {
12047 if (!qQuest->IsDFQuest())
12048 {
12049 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12050 {
12051 if (!GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
12052 {
12053 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, quest_id);
12054 m_lastDailyQuestTime = GameTime::GetGameTime().count(); // last daily quest time
12055 m_DailyQuestChanged = true;
12056 break;
12057 }
12058 }
12059 }
12060 else
12061 {
12062 m_DFQuests.insert(quest_id);
12064 m_DailyQuestChanged = true;
12065 }
12066 }
12067}

References GameTime::GetGameTime(), Object::GetUInt32Value(), m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, Unit::SetUInt32Value(), and sObjectMgr.

Referenced by RewardQuest().

◆ setDeathState()

void Player::setDeathState ( DeathState  s,
bool  despawn = false 
)
overridevirtual

Reimplemented from Unit.

1015{
1016 uint32 ressSpellId = 0;
1017
1018 bool cur = IsAlive();
1019
1020 if (s == DeathState::JustDied)
1021 {
1022 if (!cur)
1023 {
1024 LOG_ERROR("entities.player", "setDeathState: attempt to kill a dead player {} ({})", GetName(), GetGUID().ToString());
1025 return;
1026 }
1027
1028 // drunken state is cleared on death
1029 SetDrunkValue(0);
1030 // lost combo points at any target (targeted combo points clear in Unit::setDeathState)
1032
1034
1035 //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DeathState::Dead) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD)
1036 RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
1037
1038 // save value before aura remove in Unit::setDeathState
1040
1041 // xinef: disable passive area auras!
1043
1044 // passive spell
1045 if (!ressSpellId)
1046 ressSpellId = GetResurrectionSpellId();
1050
1051 // Xinef: reset all death criterias
1053 }
1054 // xinef: enable passive area auras!
1055 else if (s == DeathState::Alive)
1057
1059
1062
1063 // restore resurrection spell id for player after aura remove
1064 if (s == DeathState::JustDied && cur && ressSpellId)
1066
1067 if (IsAlive() && !cur)
1068 //clear aura case after resurrection by another way (spells will be applied before next death)
1070}
@ PLAYER_SELF_RES_SPELL
Definition: UpdateFields.h:370
@ ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH
Definition: DBCEnums.h:88
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP
Definition: DBCEnums.h:133
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH
Definition: DBCEnums.h:134
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON
Definition: DBCEnums.h:135
uint32 GetResurrectionSpellId()
Definition: Player.cpp:12557
void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
Definition: Player.cpp:13879
virtual void setDeathState(DeathState s, bool despawn=false)
Definition: Unit.cpp:14490

References ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, Unit::AddUnitState(), Unit::ClearComboPoints(), clearResurrectRequestData(), Unit::ClearUnitState(), WorldObject::FindMap(), Object::GetGUID(), WorldObject::GetName(), GetResurrectionSpellId(), Object::GetUInt32Value(), Unit::IsAlive(), LOG_ERROR, NeedSendSpectatorData(), PET_SAVE_NOT_IN_SLOT, PLAYER_SELF_RES_SPELL, RemovePet(), ResetAchievementCriteria(), ArenaSpectator::SendCommand_UInt32Value(), Unit::setDeathState(), SetDrunkValue(), Unit::SetUInt32Value(), Position::ToString(), UNIT_STATE_ISOLATED, and UpdateAchievementCriteria().

Referenced by KillPlayer(), and ResurrectPlayer().

◆ SetDeveloper()

void Player::SetDeveloper ( bool  on)
inline

◆ SetDisableGravity()

bool Player::SetDisableGravity ( bool  disable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
overridevirtual

movement counter

Reimplemented from Unit.

15854{
15855 if (!packetOnly && !Unit::SetDisableGravity(disable))
15856 return false;
15857
15859 data << GetPackGUID();
15860 data << uint32(0);
15861 SendDirectMessage(&data);
15862
15863 data.Initialize(MSG_MOVE_GRAVITY_CHNG, 64);
15864 data << GetPackGUID();
15865 BuildMovementPacket(&data);
15866 SendMessageToSet(&data, false);
15867 return true;
15868}
@ SMSG_MOVE_GRAVITY_DISABLE
Definition: Opcodes.h:1260
@ SMSG_MOVE_GRAVITY_ENABLE
Definition: Opcodes.h:1262
@ MSG_MOVE_GRAVITY_CHNG
Definition: Opcodes.h:1264
virtual bool SetDisableGravity(bool disable, bool packetOnly=false, bool updateAnimationTier=true)
Definition: Unit.cpp:20478

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_GRAVITY_CHNG, SendDirectMessage(), SendMessageToSet(), Unit::SetDisableGravity(), SMSG_MOVE_GRAVITY_DISABLE, and SMSG_MOVE_GRAVITY_ENABLE.

Referenced by npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded().

◆ SetDivider()

◆ SetDrunkValue()

void Player::SetDrunkValue ( uint8  newDrunkValue,
uint32  itemId = 0 
)
972{
973 newDrunkValue = std::min<uint8>(newDrunkValue, 100);
974 if (newDrunkValue == GetDrunkValue())
975 return;
976
978 uint32 newDrunkenState = Player::GetDrunkenstateByValue(newDrunkValue);
979
982
983 m_drunkTimer = 0; // reset sobering timer
984
985 if (newDrunkenState == oldDrunkenState)
986 return;
987
989 data.Guid = GetGUID();
990 data.Threshold = newDrunkenState;
991 data.ItemID = itemId;
992
993 SendMessageToSet(data.Write(), true);
994}
@ PLAYER_BYTES_3_OFFSET_INEBRIATION
Definition: Player.h:529
void UpdateInvisibilityDrunkDetect()
Definition: Player.cpp:996
static DrunkenState GetDrunkenstateByValue(uint8 value)
Definition: Player.cpp:960
WorldPacket const * Write() override
Definition: MiscPackets.cpp:113
ObjectGuid Guid
Definition: MiscPackets.h:175
uint32 Threshold
Definition: MiscPackets.h:176
uint32 ItemID
Definition: MiscPackets.h:177

References GetDrunkenstateByValue(), GetDrunkValue(), Object::GetGUID(), WorldPackets::Misc::CrossedInebriationThreshold::Guid, WorldPackets::Misc::CrossedInebriationThreshold::ItemID, m_drunkTimer, PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_INEBRIATION, SendMessageToSet(), Object::SetByteValue(), WorldPackets::Misc::CrossedInebriationThreshold::Threshold, UpdateInvisibilityDrunkDetect(), and WorldPackets::Misc::CrossedInebriationThreshold::Write().

Referenced by Spell::EffectInebriate(), HandleSobering(), LoadFromDB(), and setDeathState().

◆ SetDungeonDifficulty()

void Player::SetDungeonDifficulty ( Difficulty  dungeon_difficulty)
inline

◆ SetEntryPoint()

void Player::SetEntryPoint ( )
11239{
11242
11243 if (!m_taxi.empty())
11244 {
11247
11250 }
11251 else
11252 {
11253 if (IsMounted())
11254 {
11256 if (!auras.empty())
11257 m_entryPointData.mountSpell = (*auras.begin())->GetId();
11258 }
11259 else
11261
11262 if (GetMap()->IsDungeon())
11263 {
11264 if (const GraveyardStruct* entry = sGraveyard->GetClosestGraveyard(this, GetTeamId()))
11265 m_entryPointData.joinPos = WorldLocation(entry->Map, entry->x, entry->y, entry->z, 0.0f);
11266 }
11267 else if (!GetMap()->IsBattlegroundOrArena())
11269 }
11270
11273}
uint32 m_mapId
Definition: Position.h:319
bool empty() const
Definition: PlayerTaxi.h:73
uint32 GetTaxiDestination() const
Definition: PlayerTaxi.h:64
bool IsDungeon() const
Definition: Map.h:448
bool IsBattlegroundOrArena() const
Definition: Map.h:456

References EntryPointData::ClearTaxiPath(), PlayerTaxi::empty(), Unit::GetAuraEffectsByType(), WorldObject::GetMap(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), PlayerTaxi::GetTaxiDestination(), PlayerTaxi::GetTaxiSource(), GetTeamId(), Map::IsBattlegroundOrArena(), Map::IsDungeon(), Unit::IsMounted(), EntryPointData::joinPos, m_entryPointData, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, WorldLocation::m_mapId, m_taxi, MAPID_INVALID, EntryPointData::mountSpell, sGraveyard, SPELL_AURA_MOUNTED, and EntryPointData::taxiPath.

Referenced by misc_commandscript::HandleAppearCommand(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), and lfg::LFGMgr::TeleportPlayer().

◆ SetEquipmentSet()

void Player::SetEquipmentSet ( uint32  index,
EquipmentSet  eqset 
)
14455{
14456 if (eqset.Guid != 0)
14457 {
14458 bool found = false;
14459
14460 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14461 {
14462 if ((itr->second.Guid == eqset.Guid) && (itr->first == index))
14463 {
14464 found = true;
14465 break;
14466 }
14467 }
14468
14469 if (!found) // something wrong...
14470 {
14471 LOG_ERROR("entities.player", "Player {} tried to save equipment set {} (index {}), but that equipment set not found!", GetName(), eqset.Guid, index);
14472 return;
14473 }
14474 }
14475
14476 EquipmentSet& eqslot = m_EquipmentSets[index];
14477
14478 EquipmentSetUpdateState old_state = eqslot.state;
14479
14480 eqslot = eqset;
14481
14482 if (eqset.Guid == 0)
14483 {
14484 eqslot.Guid = sObjectMgr->GenerateEquipmentSetGuid();
14485
14487 data << uint32(index);
14488 data.appendPackGUID(eqslot.Guid);
14489 GetSession()->SendPacket(&data);
14490 }
14491
14493}
EquipmentSetUpdateState
Definition: Player.h:741
@ SMSG_EQUIPMENT_SET_SAVED
Definition: Opcodes.h:341

References ByteBuffer::appendPackGUID(), EQUIPMENT_SET_CHANGED, EQUIPMENT_SET_NEW, WorldObject::GetName(), GetSession(), EquipmentSet::Guid, LOG_ERROR, m_EquipmentSets, WorldSession::SendPacket(), SMSG_EQUIPMENT_SET_SAVED, sObjectMgr, and EquipmentSet::state.

Referenced by WorldSession::HandleEquipmentSetSave().

◆ SetFactionForRace()

void Player::SetFactionForRace ( uint8  race)
5807{
5808 m_team = TeamIdForRace(race);
5809
5810 sScriptMgr->OnPlayerUpdateFaction(this);
5811
5812 if (GetTeamId(true) != GetTeamId())
5813 return;
5814
5815 ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race);
5816 SetFaction(rEntry ? rEntry->FactionID : 0);
5817}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
void SetFaction(uint32 faction)
Definition: Unit.cpp:10001
Definition: DBCStructure.h:679
uint32 FactionID
Definition: DBCStructure.h:682

References ChrRacesEntry::FactionID, GetTeamId(), m_team, sChrRacesStore, Unit::SetFaction(), sScriptMgr, and TeamIdForRace().

Referenced by Create(), reset_commandscript::HandleResetStatsOrLevelHelper(), LoadFromDB(), Unit::RestoreFaction(), and SetGameMaster().

◆ SetFallInformation()

◆ SetFarSightDistance()

void Player::SetFarSightDistance ( float  radius)
16221{
16222 _farSightDistance = radius;
16223}

References _farSightDistance.

Referenced by AuraEffect::HandleFarSight().

◆ SetFeatherFall()

bool Player::SetFeatherFall ( bool  apply,
bool  packetOnly = false 
)
overridevirtual

movement counter

Reimplemented from Unit.

15935{
15936 // Xinef: moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15937 if (!packetOnly/* && !Unit::SetFeatherFall(apply)*/)
15938 {
15939 Unit::SetFeatherFall(apply);
15940 //return false;
15941 }
15942
15944 data << GetPackGUID();
15945 data << uint32(0);
15946 SendDirectMessage(&data);
15947
15948 data.Initialize(MSG_MOVE_FEATHER_FALL, 64);
15949 data << GetPackGUID();
15950 BuildMovementPacket(&data);
15951 SendMessageToSet(&data, false);
15952 return true;
15953}
@ SMSG_MOVE_FEATHER_FALL
Definition: Opcodes.h:272
@ SMSG_MOVE_NORMAL_FALL
Definition: Opcodes.h:273
@ MSG_MOVE_FEATHER_FALL
Definition: Opcodes.h:718
virtual bool SetFeatherFall(bool enable, bool packetOnly=false)
Definition: Unit.cpp:20565

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_FEATHER_FALL, SendDirectMessage(), SendMessageToSet(), Unit::SetFeatherFall(), SMSG_MOVE_FEATHER_FALL, and SMSG_MOVE_NORMAL_FALL.

◆ SetFreePrimaryProfessions()

void Player::SetFreePrimaryProfessions ( uint16  profs)
inline

◆ SetFreeTalentPoints()

void Player::SetFreeTalentPoints ( uint32  points)

◆ SetGameMaster()

void Player::SetGameMaster ( bool  on)
2206{
2207 if (on)
2208 {
2210 if (GetSession()->IsGMAccount())
2214
2215 if (Pet* pet = GetPet())
2216 {
2217 if (GetSession()->IsGMAccount())
2218 pet->SetFaction(FACTION_FRIENDLY);
2219 pet->getHostileRefMgr().setOnlineOfflineState(false);
2220 }
2222 {
2224 sScriptMgr->OnFfaPvpStateUpdate(this, false);
2225 }
2227
2230
2231 SetPhaseMask(uint32(PHASEMASK_ANYWHERE), false); // see and visible in all phases
2233 }
2234 else
2235 {
2236 // restore phase
2237 uint32 newPhase = GetPhaseByAuras();
2238
2239 if (!newPhase)
2240 newPhase = PHASEMASK_NORMAL;
2241
2242 SetPhaseMask(newPhase, false);
2243
2244 m_ExtraFlags &= ~ PLAYER_EXTRA_GM_ON;
2248
2249 if (Pet* pet = GetPet())
2250 {
2251 pet->SetFaction(GetFaction());
2252 pet->getHostileRefMgr().setOnlineOfflineState(true);
2253 }
2254
2255 // restore FFA PvP Server state
2256 if (sWorld->IsFFAPvPRealm())
2257 {
2259 {
2261 sScriptMgr->OnFfaPvpStateUpdate(this, true);
2262 }
2263 }
2264 // restore FFA PvP area state, remove not allowed for GM mounts
2266
2269 }
2270
2272}
@ PHASEMASK_ANYWHERE
Definition: Object.h:60
@ UNIT_FLAG2_ALLOW_CHEAT_SPELLS
Definition: UnitDefines.h:285
@ SERVERSIDE_VISIBILITY_GM
Definition: SharedDefines.h:1273
@ FACTION_FRIENDLY
Definition: SharedDefines.h:201
@ SEC_PLAYER
Definition: Common.h:57
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition: Object.h:372
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibilityDetect
Definition: Object.h:524
void ResetContestedPvP()
Definition: Player.h:1847
void UpdateArea(uint32 newArea)
Definition: PlayerUpdates.cpp:1170
uint32 GetFaction() const
Definition: Unit.h:840
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition: Unit.cpp:18977
void CombatStopWithPets(bool includingCast=false)
Definition: Unit.cpp:10399

References Unit::CombatStopWithPets(), FACTION_FRIENDLY, Unit::GetFaction(), Unit::getHostileRefMgr(), GetPet(), Unit::GetPhaseByAuras(), Unit::getRace(), GetSession(), Object::HasByteFlag(), m_areaUpdateId, m_ExtraFlags, WorldObject::m_serverSideVisibilityDetect, PHASEMASK_ANYWHERE, PHASEMASK_NORMAL, PLAYER_EXTRA_GM_ON, PLAYER_FLAGS_GM, Object::RemoveByteFlag(), RemovePlayerFlag(), Unit::RemoveUnitFlag2(), ResetContestedPvP(), SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, Object::SetByteFlag(), Unit::SetFaction(), SetFactionForRace(), HostileRefMgr::setOnlineOfflineState(), Unit::SetPhaseMask(), SetPlayerFlag(), Unit::SetUnitFlag2(), FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_FIELD_BYTES_2, UNIT_FLAG2_ALLOW_CHEAT_SPELLS, UpdateArea(), and UpdateObjectVisibility().

Referenced by gm_commandscript::HandleGMOffCommand(), gm_commandscript::HandleGMOnCommand(), and LoadFromDB().

◆ SetGlyph()

void Player::SetGlyph ( uint8  slot,
uint32  glyph,
bool  save 
)
inline
1740 {
1741 m_Glyphs[m_activeSpec][slot] = glyph;
1743
1744 if (save)
1745 SetNeedToSaveGlyphs(true);
1746 }
@ PLAYER_FIELD_GLYPHS_1
Definition: UpdateFields.h:389

References m_activeSpec, m_Glyphs, PLAYER_FIELD_GLYPHS_1, SetNeedToSaveGlyphs(), and Unit::SetUInt32Value().

Referenced by _LoadGlyphAuras(), ActivateSpec(), Spell::EffectApplyGlyph(), and WorldSession::HandleRemoveGlyph().

◆ SetGlyphSlot()

void Player::SetGlyphSlot ( uint8  slot,
uint32  slottype 
)
inline

◆ SetGMChat()

void Player::SetGMChat ( bool  on)
inline
1161{ if (on) m_ExtraFlags |= PLAYER_EXTRA_GM_CHAT; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_CHAT; }

References m_ExtraFlags, and PLAYER_EXTRA_GM_CHAT.

Referenced by LoadFromDB().

◆ SetGMVisible()

void Player::SetGMVisible ( bool  on)
2275{
2276 const uint32 VISUAL_AURA = 37800;
2277
2278 if (on)
2279 {
2280 RemoveAurasDueToSpell(VISUAL_AURA);
2281 m_ExtraFlags &= ~PLAYER_EXTRA_GM_INVISIBLE;
2283
2286 }
2287 else
2288 {
2289 AddAura(VISUAL_AURA, this);
2292 }
2293}
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition: Object.h:523

References Unit::AddAura(), Unit::CombatStopWithPets(), Unit::getHostileRefMgr(), GetSession(), m_ExtraFlags, WorldObject::m_serverSideVisibility, PLAYER_EXTRA_GM_INVISIBLE, Unit::RemoveAurasDueToSpell(), SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, HostileRefMgr::setOnlineOfflineState(), and FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue().

Referenced by gm_commandscript::HandleGMVisibleCommand(), and LoadFromDB().

◆ SetGracePeriod()

void Player::SetGracePeriod ( uint8  index,
uint32  period 
)
inline

◆ SetGrantableLevels()

void Player::SetGrantableLevels ( uint8  val)
inline

◆ SetGroup()

void Player::SetGroup ( Group group,
int8  subgroup = -1 
)
11517{
11518 if (!group)
11519 m_group.unlink();
11520 else
11521 {
11522 // never use SetGroup without a subgroup unless you specify nullptr for group
11523 ASSERT(subgroup >= 0);
11524 m_group.link(group, this);
11525 m_group.setSubGroup((uint8)subgroup);
11526 }
11527
11529}

References ASSERT, Reference< TO, FROM >::link(), m_group, GroupReference::setSubGroup(), Reference< TO, FROM >::unlink(), and UpdateObjectVisibility().

Referenced by _LoadGroup(), Group::AddMember(), Group::Disband(), and Group::RemoveMember().

◆ SetGroupInvite()

void Player::SetGroupInvite ( Group group)
inline

◆ SetGroupUpdateFlag()

◆ SetGuildIdInvited()

void Player::SetGuildIdInvited ( uint32  GuildId)
inline

◆ SetHas310Flyer()

void Player::SetHas310Flyer ( bool  on)
inline
1167{ if (on) m_ExtraFlags |= PLAYER_EXTRA_HAS_310_FLYER; else m_ExtraFlags &= ~PLAYER_EXTRA_HAS_310_FLYER; }

References m_ExtraFlags, and PLAYER_EXTRA_HAS_310_FLYER.

Referenced by _addSpell(), and Has310Flyer().

◆ SetHasDelayedTeleport()

void Player::SetHasDelayedTeleport ( bool  setting)
inlineprivate
2911{ m_bHasDelayedTeleport = setting; }

References m_bHasDelayedTeleport.

Referenced by TeleportTo(), and Update().

◆ SetHomebind()

void Player::SetHomebind ( WorldLocation const &  loc,
uint32  areaId 
)
4912{
4913 loc.GetPosition(m_homebindX, m_homebindY, m_homebindZ);
4914 m_homebindMapId = loc.GetMapId();
4915 m_homebindAreaId = areaId;
4916
4917 // update sql homebind
4919 stmt->SetData(0, m_homebindMapId);
4920 stmt->SetData(1, m_homebindAreaId);
4921 stmt->SetData (2, m_homebindX);
4922 stmt->SetData (3, m_homebindY);
4923 stmt->SetData (4, m_homebindZ);
4924 stmt->SetData(5, GetGUID().GetCounter());
4925 CharacterDatabase.Execute(stmt);
4926}
@ CHAR_UPD_PLAYER_HOMEBIND
Definition: CharacterDatabase.h:241

References CHAR_UPD_PLAYER_HOMEBIND, CharacterDatabase, Object::GetGUID(), WorldLocation::GetMapId(), Position::GetPosition(), m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, and PreparedStatementBase::SetData().

Referenced by Spell::EffectBind().

◆ SetHonorPoints()

void Player::SetHonorPoints ( uint32  value)
6199{
6200 if (value > sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS))
6201 {
6202 if (int32 copperPerPoint = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT))
6203 {
6204 // Only convert points on login, not when awarded honor points.
6205 if (isBeingLoaded())
6206 {
6207 int32 excessPoints = value - sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS);
6208 ModifyMoney(excessPoints * copperPerPoint);
6209 }
6210 }
6211
6212 value = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS);
6213 }
6215 if (value)
6217}
@ ITEM_HONOR_POINTS_ID
Definition: Player.h:960
@ CONFIG_MAX_HONOR_POINTS
Definition: IWorld.h:246
@ CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT
Definition: IWorld.h:247

References AddKnownCurrency(), CONFIG_MAX_HONOR_POINTS, CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT, isBeingLoaded(), ITEM_HONOR_POINTS_ID, ModifyMoney(), PLAYER_FIELD_HONOR_CURRENCY, Unit::SetUInt32Value(), and sWorld.

Referenced by Create(), reset_commandscript::HandleResetHonorCommand(), LoadFromDB(), and ModifyHonorPoints().

◆ SetHover()

bool Player::SetHover ( bool  enable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
overridevirtual

movement counter

Reimplemented from Unit.

15893{
15894 // moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15895 if (!packetOnly /* && !Unit::SetHover(apply)*/)
15896 {
15897 Unit::SetHover(apply);
15898 // return false;
15899 }
15900
15902 data << GetPackGUID();
15903 data << uint32(0);
15904 SendDirectMessage(&data);
15905
15906 data.Initialize(MSG_MOVE_HOVER, 64);
15907 data << GetPackGUID();
15908 BuildMovementPacket(&data);
15909 SendMessageToSet(&data, false);
15910 return true;
15911}
@ MSG_MOVE_HOVER
Definition: Opcodes.h:277
@ SMSG_MOVE_SET_HOVER
Definition: Opcodes.h:274
@ SMSG_MOVE_UNSET_HOVER
Definition: Opcodes.h:275
virtual bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true)
Definition: Unit.cpp:20587

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_HOVER, SendDirectMessage(), SendMessageToSet(), Unit::SetHover(), SMSG_MOVE_SET_HOVER, and SMSG_MOVE_UNSET_HOVER.

◆ SetInArenaTeam()

void Player::SetInArenaTeam ( uint32  ArenaTeamId,
uint8  slot,
uint8  type 
)
inline
1885 {
1886 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, ArenaTeamId);
1888 }

References ARENA_TEAM_ID, ARENA_TEAM_TYPE, and SetArenaTeamInfoField().

Referenced by ArenaTeam::AddMember().

◆ SetInGameTime()

void Player::SetInGameTime ( uint32  time)
inline

◆ SetInGuild()

void Player::SetInGuild ( uint32  GuildId)
inline

◆ SetInviteForBattlegroundQueueType()

void Player::SetInviteForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId,
uint32  instanceId 
)
12235{
12236 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12237 if (_BgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
12238 _BgBattlegroundQueueID[i].invitedToInstance = instanceId;
12239}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by BattlegroundQueue::InviteGroupToBG().

◆ SetInWater()

void Player::SetInWater ( bool  apply)
2163{
2164 if (m_isInWater == apply)
2165 return;
2166
2167 //define player in water by opcodes
2168 //move player's guid into HateOfflineList of those mobs
2169 //which can't swim and move guid back into ThreatList when
2170 //on surface.
2171 //TODO: exist also swimming mobs, and function must be symmetric to enter/leave water
2173
2174 // remove auras that need water/land
2176
2178
2179 if (InstanceScript* instance = GetInstanceScript())
2180 instance->OnPlayerInWaterStateUpdate(this, apply);
2181}
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition: SpellDefines.h:51
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition: SpellDefines.h:52
void updateThreatTables()
Definition: HostileRefMgr.cpp:111

References AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, Unit::getHostileRefMgr(), WorldObject::GetInstanceScript(), m_isInWater, Unit::RemoveAurasWithInterruptFlags(), and HostileRefMgr::updateThreatTables().

Referenced by WorldSession::HandleMovementOpcodes().

◆ SetIsSpectator()

void Player::SetIsSpectator ( bool  on)
15307{
15308 if (on)
15309 {
15313 //SetFaction(1100);
15316 {
15318 sScriptMgr->OnFfaPvpStateUpdate(this, false);
15319 }
15321 SetDisplayId(23691);
15322 }
15323 else
15324 {
15326 if (IsSpectator())
15328 m_ExtraFlags &= ~PLAYER_EXTRA_SPECTATOR_ON;
15331
15332 if (!IsGameMaster())
15333 {
15334 //SetFactionForRace(getRace());
15335
15336 // restore FFA PvP Server state
15337 // Xinef: it will be removed if necessery in UpdateArea called in WorldPortOpcode
15338 if (sWorld->IsFFAPvPRealm())
15339 {
15341 {
15343 sScriptMgr->OnFfaPvpStateUpdate(this, true);
15344
15345 }
15346 }
15347 }
15348 }
15349}
#define SPECTATOR_SPELL_SPEED
Definition: ArenaSpectator.h:39
void RestoreDisplayId()
Definition: Unit.cpp:16714

References Unit::AddAura(), Unit::AddUnitState(), Unit::ClearUnitState(), Object::HasByteFlag(), IsGameMaster(), IsSpectator(), m_ExtraFlags, PLAYER_EXTRA_SPECTATOR_ON, Unit::RemoveAurasDueToSpell(), Object::RemoveByteFlag(), Unit::RemoveUnitFlag(), ResetContestedPvP(), Unit::RestoreDisplayId(), Object::SetByteFlag(), Unit::SetDisplayId(), Unit::SetUnitFlag(), SPECTATOR_SPELL_SPEED, sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, and UNIT_STATE_ISOLATED.

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetLastPetNumber()

void Player::SetLastPetNumber ( uint32  petnumber)
inline
2435{ m_lastpetnumber = petnumber; }

References m_lastpetnumber.

Referenced by Pet::LoadPetFromDB().

◆ SetLastPetSpell()

void Player::SetLastPetSpell ( uint32  petspell)
inline
2437{ m_oldpetspell = petspell; }

References m_oldpetspell.

Referenced by Pet::LoadPetFromDB(), and UnsummonPetTemporaryIfAny().

◆ SetLastPotionId()

void Player::SetLastPotionId ( uint32  item_id)
inline
1790{ m_lastPotionId = item_id; }

References m_lastPotionId.

Referenced by Spell::SendSpellCooldown(), and UpdatePotionCooldown().

◆ SetLastUsedRune()

void Player::SetLastUsedRune ( RuneType  type)
inline
2490{ m_runes->lastUsedRune = type; }

References Runes::lastUsedRune, and m_runes.

Referenced by Spell::TakeRunePower().

◆ SetLootGUID()

void Player::SetLootGUID ( ObjectGuid  guid)
inline
1971{ m_lootGuid = guid; }

References m_lootGuid.

Referenced by WorldSession::DoLootRelease(), and SendLoot().

◆ SetMap()

void Player::SetMap ( Map map)
overridevirtual

Reimplemented from WorldObject.

14624{
14625 Unit::SetMap(map);
14626 m_mapRef.link(map, this);
14627}
virtual void SetMap(Map *map)
Definition: Object.cpp:2105

References Reference< TO, FROM >::link(), m_mapRef, and WorldObject::SetMap().

Referenced by Map::AddPlayerToMap(), Create(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleSetRaidDifficultyOpcode(), and LoadFromDB().

◆ SetMoney()

void Player::SetMoney ( uint32  value)
inline

◆ SetMonthlyQuestStatus()

void Player::SetMonthlyQuestStatus ( uint32  quest_id)
12102{
12103 m_monthlyquests.insert(quest_id);
12104 m_MonthlyQuestChanged = true;
12105}

References m_MonthlyQuestChanged, and m_monthlyquests.

Referenced by RewardQuest().

◆ SetMountBlockId()

void Player::SetMountBlockId ( uint32  mount)
inline

◆ SetMovement()

void Player::SetMovement ( PlayerMovementType  pType)
4338{
4339 WorldPacket data;
4340 switch (pType)
4341 {
4342 case MOVE_ROOT:
4343 data.Initialize(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
4344 break;
4345 case MOVE_UNROOT:
4346 data.Initialize(SMSG_FORCE_MOVE_UNROOT, GetPackGUID().size() + 4);
4347 break;
4348 case MOVE_WATER_WALK:
4349 data.Initialize(SMSG_MOVE_WATER_WALK, GetPackGUID().size() + 4);
4350 break;
4351 case MOVE_LAND_WALK:
4352 data.Initialize(SMSG_MOVE_LAND_WALK, GetPackGUID().size() + 4);
4353 break;
4354 default:
4355 LOG_ERROR("entities.player", "Player::SetMovement: Unsupported move type ({}), data not sent to client.", pType);
4356 return;
4357 }
4358 data << GetPackGUID();
4359 data << uint32(0);
4360 GetSession()->SendPacket(&data);
4361}
@ SMSG_MOVE_LAND_WALK
Definition: Opcodes.h:253
@ SMSG_MOVE_WATER_WALK
Definition: Opcodes.h:252
@ SMSG_FORCE_MOVE_UNROOT
Definition: Opcodes.h:264

References Object::GetPackGUID(), GetSession(), WorldPacket::Initialize(), LOG_ERROR, MOVE_LAND_WALK, MOVE_ROOT, MOVE_UNROOT, MOVE_WATER_WALK, WorldSession::SendPacket(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_MOVE_LAND_WALK, and SMSG_MOVE_WATER_WALK.

Referenced by BuildPlayerRepop(), WorldSession::HandlePlayerLoginFromDB(), cheat_commandscript::HandleWaterWalkCheatCommand(), KillPlayer(), ResurrectPlayer(), and SendInitialPacketsAfterAddToMap().

◆ SetMover()

void Player::SetMover ( Unit target)
12845{
12846 if (this != target && target->m_movedByPlayer && target->m_movedByPlayer != target && target->m_movedByPlayer != this)
12847 {
12848 LOG_INFO("misc", "Player::SetMover (A1) - {}, {}, {}, {}, {}, {}, {}, {}", GetGUID().ToString(), GetMapId(), GetInstanceId(), FindMap()->GetId(), IsInWorld() ? 1 : 0, IsDuringRemoveFromWorld() ? 1 : 0, IsBeingTeleported() ? 1 : 0, isBeingLoaded() ? 1 : 0);
12849 LOG_INFO("misc", "Player::SetMover (A2) - {}, {}, {}, {}, {}, {}, {}, {}", target->GetGUID().ToString(), target->GetMapId(), target->GetInstanceId(), target->FindMap()->GetId(), target->IsInWorld() ? 1 : 0, target->IsDuringRemoveFromWorld() ? 1 : 0, (target->ToPlayer() && target->ToPlayer()->IsBeingTeleported() ? 1 : 0), target->isBeingLoaded() ? 1 : 0);
12850 LOG_INFO("misc", "Player::SetMover (A3) - {}, {}, {}, {}, {}, {}, {}, {}", target->m_movedByPlayer->GetGUID().ToString(), target->m_movedByPlayer->GetMapId(), target->m_movedByPlayer->GetInstanceId(), target->m_movedByPlayer->FindMap()->GetId(), target->m_movedByPlayer->IsInWorld() ? 1 : 0, target->m_movedByPlayer->IsDuringRemoveFromWorld() ? 1 : 0, target->m_movedByPlayer->ToPlayer()->IsBeingTeleported() ? 1 : 0, target->m_movedByPlayer->isBeingLoaded() ? 1 : 0);
12851 }
12852 if (this != target && (!target->IsInWorld() || target->IsDuringRemoveFromWorld() || GetMapId() != target->GetMapId() || GetInstanceId() != target->GetInstanceId()))
12853 {
12854 LOG_INFO("misc", "Player::SetMover (B1) - {}, {}, {}, {}, {}, {}, {}, {}", GetGUID().ToString(), GetMapId(), GetInstanceId(), FindMap()->GetId(), IsInWorld() ? 1 : 0, IsDuringRemoveFromWorld() ? 1 : 0, IsBeingTeleported() ? 1 : 0, isBeingLoaded() ? 1 : 0);
12855 LOG_INFO("misc", "Player::SetMover (B2) - {}, {}, {}, {}, {}, {}, {}, {}", target->GetGUID().ToString(), target->GetMapId(), target->GetInstanceId(), target->FindMap()->GetId(), target->IsInWorld() ? 1 : 0, target->IsDuringRemoveFromWorld() ? 1 : 0, (target->ToPlayer() && target->ToPlayer()->IsBeingTeleported() ? 1 : 0), target->isBeingLoaded() ? 1 : 0);
12856 }
12857 m_mover->m_movedByPlayer = nullptr;
12858 if (m_mover->IsCreature())
12860
12861 m_mover = target;
12862 m_mover->m_movedByPlayer = this;
12863 if (m_mover->IsCreature())
12865}
virtual bool isBeingLoaded() const
Definition: Unit.h:1738
bool IsDuringRemoveFromWorld() const
Definition: Unit.h:1739
void Initialize()
Definition: MotionMaster.cpp:73

References WorldObject::FindMap(), Object::GetGUID(), Map::GetId(), WorldObject::GetInstanceId(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), MotionMaster::Initialize(), Unit::isBeingLoaded(), isBeingLoaded(), IsBeingTeleported(), Object::IsCreature(), Unit::IsDuringRemoveFromWorld(), Object::IsInWorld(), LOG_INFO, Unit::m_movedByPlayer, m_mover, Object::ToPlayer(), ObjectGuid::ToString(), and Position::ToString().

Referenced by SendInitialPacketsBeforeAddToMap(), and SetClientControl().

◆ SetMustDelayTeleport()

void Player::SetMustDelayTeleport ( bool  setting)
inlineprivate
2909{ m_bMustDelayTeleport = setting; }

References m_bMustDelayTeleport.

Referenced by RewardQuest(), and Update().

◆ SetNeedToSaveGlyphs()

void Player::SetNeedToSaveGlyphs ( bool  val)
inline
2579{ m_NeedToSaveGlyphs = val; }

References m_NeedToSaveGlyphs.

Referenced by _SaveGlyphs(), and SetGlyph().

◆ SetNeedZoneUpdate()

void Player::SetNeedZoneUpdate ( bool  needUpdate)
inline
1837{ m_needZoneUpdate = needUpdate; }

References m_needZoneUpdate.

Referenced by WorldSession::HandleZoneUpdateOpcode().

◆ SetObjectScale()

void Player::SetObjectScale ( float  scale)
inlineoverridevirtual

Reimplemented from Object.

1079 {
1080 Unit::SetObjectScale(scale);
1083 }
#define DEFAULT_WORLD_OBJECT_SIZE
Definition: ObjectDefines.h:45
#define DEFAULT_COMBAT_REACH
Definition: ObjectDefines.h:46
@ UNIT_FIELD_COMBATREACH
Definition: UpdateFields.h:123
@ UNIT_FIELD_BOUNDINGRADIUS
Definition: UpdateFields.h:122
virtual void SetObjectScale(float scale)
Definition: Object.h:116

References DEFAULT_COMBAT_REACH, DEFAULT_WORLD_OBJECT_SIZE, Object::SetFloatValue(), Object::SetObjectScale(), UNIT_FIELD_BOUNDINGRADIUS, and UNIT_FIELD_COMBATREACH.

Referenced by Create(), InitStatsForLevel(), and LoadFromDB().

◆ SetOriginalGroup()

void Player::SetOriginalGroup ( Group group,
int8  subgroup = -1 
)
13061{
13062 if (!group)
13064 else
13065 {
13066 // never use SetOriginalGroup without a subgroup unless you specify nullptr for group
13067 ASSERT(subgroup >= 0);
13068 m_originalGroup.link(group, this);
13070 }
13071}

References ASSERT, Reference< TO, FROM >::link(), m_originalGroup, GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::AddMember(), Group::Disband(), RemoveFromBattlegroundOrBattlefieldRaid(), Group::RemoveMember(), and SetBattlegroundOrBattlefieldRaid().

◆ SetPassOnGroupLoot()

void Player::SetPassOnGroupLoot ( bool  bPassOnGroupLoot)
inline
2465{ m_bPassOnGroupLoot = bPassOnGroupLoot; }

References m_bPassOnGroupLoot.

Referenced by WorldSession::HandleOptOutOfLootOpcode().

◆ SetPendingBind()

void Player::SetPendingBind ( uint32  instanceId,
uint32  bindTimer 
)
inline

◆ SetPendingSpectatorForBG()

void Player::SetPendingSpectatorForBG ( uint32  bgInstanceId)
inline

◆ SetPendingSpectatorInviteInstanceId()

void Player::SetPendingSpectatorInviteInstanceId ( uint32  bgInstanceId)
inline

◆ SetPlayerFlag()

◆ SetPvP()

void Player::SetPvP ( bool  state)
inline
1828 {
1829 Unit::SetPvP(state);
1830 if (!m_Controlled.empty())
1831 for (auto& itr : m_Controlled)
1832 itr->SetPvP(state);
1833 }
ControlSet m_Controlled
Definition: Unit.h:1210
void SetPvP(bool state)
Definition: Unit.h:864

References Unit::m_Controlled, and Unit::SetPvP().

Referenced by UpdatePvP().

◆ SetPvPDeath()

void Player::SetPvPDeath ( bool  on)
inline
1168{ if (on) m_ExtraFlags |= PLAYER_EXTRA_PVP_DEATH; else m_ExtraFlags &= ~PLAYER_EXTRA_PVP_DEATH; }

References m_ExtraFlags, and PLAYER_EXTRA_PVP_DEATH.

Referenced by CreateCorpse().

◆ SetQuestSlot()

◆ SetQuestSlotCounter()

void Player::SetQuestSlotCounter ( uint16  slot,
uint8  counter,
uint16  count 
)
inline

◆ SetQuestSlotState()

void Player::SetQuestSlotState ( uint16  slot,
uint32  state 
)
inline

◆ SetQuestSlotTimer()

void Player::SetQuestSlotTimer ( uint16  slot,
uint32  timer 
)
inline

◆ SetQuestStatus()

void Player::SetQuestStatus ( uint32  questId,
QuestStatus  status,
bool  update = true 
)
1474{
1475 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
1476 {
1477 m_QuestStatus[questId].Status = status;
1478
1479 if (quest->GetQuestMethod() && !quest->IsAutoComplete())
1480 {
1481 m_QuestStatusSave[questId] = true;
1482 }
1483 }
1484
1485 if (update)
1486 SendQuestUpdate(questId);
1487}

References m_QuestStatus, m_QuestStatusSave, SendQuestUpdate(), and sObjectMgr.

Referenced by CompleteQuest(), FailQuest(), IncompleteQuest(), and npc_finklestein::npc_finklesteinAI::RightClickCauldron().

◆ SetRaidDifficulty()

void Player::SetRaidDifficulty ( Difficulty  raid_difficulty)
inline

◆ SetRandomWinner()

void Player::SetRandomWinner ( bool  isWinner)
15657{
15658 m_IsBGRandomWinner = isWinner;
15660 {
15662 stmt->SetData(0, GetGUID().GetCounter());
15663 CharacterDatabase.Execute(stmt);
15664 }
15665}
@ CHAR_INS_BATTLEGROUND_RANDOM
Definition: CharacterDatabase.h:64

References CHAR_INS_BATTLEGROUND_RANDOM, CharacterDatabase, Object::GetGUID(), m_IsBGRandomWinner, and PreparedStatementBase::SetData().

◆ SetRank()

void Player::SetRank ( uint8  rankId)
inline

◆ setRegenTimerCount()

void Player::setRegenTimerCount ( uint32  time)
inline
1590{m_regenTimerCount = time;}

References m_regenTimerCount.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetRegularAttackTime()

void Player::SetRegularAttackTime ( )
5238{
5239 for (uint8 i = 0; i < MAX_ATTACK; ++i)
5240 {
5241 Item* tmpitem = GetWeaponForAttack(WeaponAttackType(i), true);
5242 if (tmpitem && !tmpitem->IsBroken())
5243 {
5244 ItemTemplate const* proto = tmpitem->GetTemplate();
5245 if (proto->Delay)
5247 }
5248 else
5249 SetAttackTime(WeaponAttackType(i), BASE_ATTACK_TIME); // If there is no weapon reset attack time to base (might have been changed from forms)
5250 }
5251}

References BASE_ATTACK_TIME, ItemTemplate::Delay, Item::GetTemplate(), GetWeaponForAttack(), Item::IsBroken(), MAX_ATTACK, and Unit::SetAttackTime().

Referenced by InitDataForForm().

◆ SetReputation()

void Player::SetReputation ( uint32  factionentry,
float  value 
)
15285{
15286 GetReputationMgr().SetReputation(sFactionStore.LookupEntry(factionentry), value);
15287}
bool SetReputation(FactionEntry const *factionEntry, float standing)
Definition: ReputationMgr.h:114

References GetReputationMgr(), ReputationMgr::SetReputation(), and sFactionStore.

◆ SetRestBonus()

void Player::SetRestBonus ( float  rest_bonus_new)
10157{
10158 // Prevent resting on max level
10159 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
10160 rest_bonus_new = 0;
10161
10162 if (rest_bonus_new < 0)
10163 rest_bonus_new = 0;
10164
10165 float rest_bonus_max = (float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) * 1.5f / 2;
10166
10167 if (rest_bonus_new > rest_bonus_max)
10168 _restBonus = rest_bonus_max;
10169 else
10170 _restBonus = rest_bonus_new;
10171
10172 // update data for client
10173 if ((GetsRecruitAFriendBonus(true) && (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0)))
10175 else
10176 {
10177 if (_restBonus > 10)
10179 else if (_restBonus <= 1)
10181 }
10182
10183 //RestTickUpdate
10185}
@ PLAYER_REST_STATE_EXPERIENCE
Definition: UpdateFields.h:358
@ REST_STATE_RESTED
Definition: Player.h:984

References _restBonus, CONFIG_MAX_PLAYER_LEVEL, Unit::GetLevel(), GetSession(), GetsRecruitAFriendBonus(), Object::GetUInt32Value(), PLAYER_BYTES_2, PLAYER_NEXT_LEVEL_XP, PLAYER_REST_STATE_EXPERIENCE, REST_STATE_NOT_RAF_LINKED, REST_STATE_RAF_LINKED, REST_STATE_RESTED, Object::SetByteValue(), Unit::SetUInt32Value(), and sWorld.

Referenced by GetXPRestBonus(), LoadFromDB(), and Update().

◆ SetRestFlag()

void Player::SetRestFlag ( RestFlag  restFlag,
uint32  triggerId = 0 
)
16101{
16102 uint32 oldRestMask = _restFlagMask;
16103 _restFlagMask |= restFlag;
16104
16105 if (!oldRestMask && _restFlagMask) // only set flag/time on the first rest state
16106 {
16107 _restTime = GameTime::GetGameTime().count();
16109 }
16110
16111 if (triggerId)
16112 _innTriggerId = triggerId;
16113}

References _innTriggerId, _restFlagMask, _restTime, GameTime::GetGameTime(), PLAYER_FLAGS_RESTING, and SetPlayerFlag().

Referenced by WorldSession::HandleAreaTriggerOpcode(), LoadFromDB(), UpdateArea(), and UpdateZone().

◆ SetRestState()

void Player::SetRestState ( uint32  triggerId)

◆ setResurrectRequestData()

void Player::setResurrectRequestData ( ObjectGuid  guid,
uint32  mapId,
float  X,
float  Y,
float  Z,
uint32  health,
uint32  mana 
)
inline

◆ SetRuneConvertAura()

void Player::SetRuneConvertAura ( uint8  index,
AuraEffect const *  aura 
)
inline

◆ SetRuneCooldown()

void Player::SetRuneCooldown ( uint8  index,
uint32  cooldown 
)
inline

◆ setRuneWeaponGUID()

void Player::setRuneWeaponGUID ( ObjectGuid  guid)
inline
2569{ m_drwGUID = guid; };

References m_drwGUID.

◆ SetSaveTimer()

void Player::SetSaveTimer ( uint32  timer)
inline
2333{ m_nextSave = timer; }

References m_nextSave.

◆ SetSeasonalQuestStatus()

void Player::SetSeasonalQuestStatus ( uint32  quest_id)
12092{
12093 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
12094 if (!quest)
12095 return;
12096
12097 m_seasonalquests[quest->GetEventIdForQuest()].insert(quest_id);
12099}
uint16 GetEventIdForQuest() const
Definition: QuestDef.h:331

References Quest::GetEventIdForQuest(), m_SeasonalQuestChanged, m_seasonalquests, and sObjectMgr.

Referenced by RewardQuest().

◆ SetSeer()

void Player::SetSeer ( WorldObject target)
inline
2326{ m_seer = target; }

References m_seer.

Referenced by WorldSession::HandleFarSightOpcode(), and SetViewpoint().

◆ SetSelection()

void Player::SetSelection ( ObjectGuid  guid)

Used for serverside target changes, does not apply to players.

11509{
11511
11514}
void SendCommand_GUID(T *o, ObjectGuid targetGUID, const char *prefix, ObjectGuid t)
Definition: ArenaSpectator.h:71

References WorldObject::FindMap(), Object::GetGUID(), NeedSendSpectatorData(), ArenaSpectator::SendCommand_GUID(), Object::SetGuidValue(), and UNIT_FIELD_TARGET.

Referenced by WorldSession::HandleSetSelectionOpcode(), and TeleportTo().

◆ SetSemaphoreTeleportFar()

void Player::SetSemaphoreTeleportFar ( time_t  tm)
inline

◆ SetSemaphoreTeleportNear()

void Player::SetSemaphoreTeleportNear ( time_t  tm)
inline

◆ SetServerSideVisibility()

void Player::SetServerSideVisibility ( ServerSideVisibilityType  type,
AccountTypes  sec 
)
16207{
16208 sScriptMgr->OnSetServerSideVisibility(this, type, sec);
16209
16211}

References WorldObject::m_serverSideVisibility, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and sScriptMgr.

◆ SetServerSideVisibilityDetect()

void Player::SetServerSideVisibilityDetect ( ServerSideVisibilityType  type,
AccountTypes  sec 
)
16214{
16215 sScriptMgr->OnSetServerSideVisibilityDetect(this, type, sec);
16216
16218}

References WorldObject::m_serverSideVisibilityDetect, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and sScriptMgr.

◆ SetSession()

void Player::SetSession ( WorldSession sess)
inline
1976{ m_session = sess; }

References m_session.

Referenced by WorldSession::HandlePlayerLoginOpcode().

◆ SetSheath()

void Player::SetSheath ( SheathState  sheathed)
overridevirtual

Reimplemented from Unit.

104{
105 switch (sheathed)
106 {
107 case SHEATH_STATE_UNARMED: // no prepared weapon
108 SetVirtualItemSlot(0, nullptr);
109 SetVirtualItemSlot(1, nullptr);
110 SetVirtualItemSlot(2, nullptr);
111 break;
112 case SHEATH_STATE_MELEE: // prepared melee weapon
115 SetVirtualItemSlot(2, nullptr);
116 break;
117 case SHEATH_STATE_RANGED: // prepared ranged weapon
118 SetVirtualItemSlot(0, nullptr);
119 SetVirtualItemSlot(1, nullptr);
121 break;
122 default:
123 SetVirtualItemSlot(0, nullptr);
124 SetVirtualItemSlot(1, nullptr);
125 SetVirtualItemSlot(2, nullptr);
126 break;
127 }
128 Unit::SetSheath(sheathed); // this must visualize Sheath changing for other players...
129}
@ SHEATH_STATE_UNARMED
Definition: UnitDefines.h:105
@ SHEATH_STATE_MELEE
Definition: UnitDefines.h:106
@ SHEATH_STATE_RANGED
Definition: UnitDefines.h:107
void SetVirtualItemSlot(uint8 i, Item *item)
Definition: PlayerStorage.cpp:83
virtual void SetSheath(SheathState sheathed)
Definition: Unit.h:837

References BASE_ATTACK, GetWeaponForAttack(), OFF_ATTACK, RANGED_ATTACK, Unit::SetSheath(), SetVirtualItemSlot(), SHEATH_STATE_MELEE, SHEATH_STATE_RANGED, and SHEATH_STATE_UNARMED.

Referenced by WorldSession::HandleSetSheathedOpcode().

◆ SetShowDKPet()

void Player::SetShowDKPet ( bool  on)
inline

◆ SetSkill()

void Player::SetSkill ( uint16  id,
uint16  step,
uint16  currVal,
uint16  maxVal 
)
5274{
5275 if (!id)
5276 return;
5277
5278 uint16 currVal;
5279 SkillStatusMap::iterator itr = mSkillStatus.find(id);
5280
5281 //has skill
5282 if (itr != mSkillStatus.end() && itr->second.uState != SKILL_DELETED)
5283 {
5284 currVal = SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos)));
5285 if (newVal)
5286 {
5287 // if skill value is going down, update enchantments before setting the new value
5288 if (newVal < currVal)
5289 UpdateSkillEnchantments(id, currVal, newVal);
5290 // update step
5291 SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), MAKE_PAIR32(id, step));
5292 // update value
5293 SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos), MAKE_SKILL_VALUE(newVal, maxVal));
5294 if (itr->second.uState != SKILL_NEW)
5295 itr->second.uState = SKILL_CHANGED;
5296 learnSkillRewardedSpells(id, newVal);
5297 // if skill value is going up, update enchantments after setting the new value
5298 if (newVal > currVal)
5299 UpdateSkillEnchantments(id, currVal, newVal);
5302 }
5303 else //remove
5304 {
5305 //remove enchantments needing this skill
5306 UpdateSkillEnchantments(id, currVal, 0);
5307 // clear skill fields
5308 SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), 0);
5309 SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos), 0);
5310 SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos), 0);
5311
5312 // mark as deleted or simply remove from map if not saved yet
5313 if (itr->second.uState != SKILL_NEW)
5314 itr->second.uState = SKILL_DELETED;
5315 else
5316 mSkillStatus.erase(itr);
5317
5318 // remove all spells that related to this skill
5320 removeSpell(sSpellMgr->GetFirstSpellInChain(pAbility->Spell), SPEC_MASK_ALL, false);
5321 }
5322 }
5323 else if (newVal) //add
5324 {
5325 currVal = 0;
5326 for (int i = 0; i < PLAYER_MAX_SKILLS; ++i)
5328 {
5329 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(id);
5330 if (!pSkill)
5331 {
5332 LOG_ERROR("entities.player", "Skill not found in SkillLineStore: skill #{}", id);
5333 return;
5334 }
5335
5338 UpdateSkillEnchantments(id, currVal, newVal);
5339
5340 // insert new entry or update if not deleted old entry yet
5341 if (itr != mSkillStatus.end())
5342 {
5343 itr->second.pos = i;
5344 itr->second.uState = SKILL_CHANGED;
5345 }
5346 else
5347 mSkillStatus.insert(SkillStatusMap::value_type(id, SkillStatusData(i, SKILL_NEW)));
5348
5349 // apply skill bonuses
5351
5352 // temporary bonuses
5354 for (AuraEffectList::const_iterator j = mModSkill.begin(); j != mModSkill.end(); ++j)
5355 if ((*j)->GetMiscValue() == int32(id))
5356 (*j)->HandleEffect(this, AURA_EFFECT_HANDLE_SKILL, true);
5357
5358 // permanent bonuses
5360 for (AuraEffectList::const_iterator j = mModSkillTalent.begin(); j != mModSkillTalent.end(); ++j)
5361 if ((*j)->GetMiscValue() == int32(id))
5362 (*j)->HandleEffect(this, AURA_EFFECT_HANDLE_SKILL, true);
5363
5364 // Learn all spells for skill
5365 learnSkillRewardedSpells(id, newVal);
5368 return;
5369 }
5370 }
5371}
@ SPELL_AURA_MOD_SKILL
Definition: SpellAuraDefines.h:93
@ SPELL_AURA_MOD_SKILL_TALENT
Definition: SpellAuraDefines.h:161
@ AURA_EFFECT_HANDLE_SKILL
Definition: SpellAuraDefines.h:47
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL
Definition: DBCEnums.h:125
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL
Definition: DBCEnums.h:154
void UpdateSkillEnchantments(uint16 skill_id, uint16 curr_value, uint16 new_value)
Definition: PlayerStorage.cpp:4696

References ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, AURA_EFFECT_HANDLE_SKILL, Unit::GetAuraEffectsByType(), GetSkillLineAbilitiesBySkillLine(), Object::GetUInt32Value(), learnSkillRewardedSpells(), LOG_ERROR, MAKE_PAIR32(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_MAX_SKILLS, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_INDEX, PLAYER_SKILL_VALUE_INDEX, removeSpell(), Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_NEW, SKILL_VALUE, SPEC_MASK_ALL, SPELL_AURA_MOD_SKILL, SPELL_AURA_MOD_SKILL_TALENT, sSkillLineStore, sSpellMgr, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by _addSpell(), Spell::EffectLearnSkill(), learn_commandscript::HandleLearnAllLangCommand(), learn_commandscript::HandleLearnAllRecipesCommand(), misc_commandscript::HandleSetSkillCommand(), WorldSession::HandleUnlearnSkillOpcode(), LearnDefaultSkill(), and removeSpell().

◆ SetSpecsCount()

void Player::SetSpecsCount ( uint8  count)
inline
1725{ m_specsCount = count; }

References m_specsCount.

Referenced by UpdateSpecCount().

◆ SetSpellModTakingSpell()

void Player::SetSpellModTakingSpell ( Spell spell,
bool  apply 
)
10035{
10036 if (apply && m_spellModTakingSpell)
10037 {
10038 LOG_INFO("misc", "Player::SetSpellModTakingSpell (A1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id);
10039 return;
10040 //ASSERT(m_spellModTakingSpell == nullptr);
10041 }
10042 else if (!apply)
10043 {
10045 LOG_INFO("misc", "Player::SetSpellModTakingSpell (B1) - {}", spell->m_spellInfo->Id);
10046 else if (m_spellModTakingSpell != spell)
10047 {
10048 LOG_INFO("misc", "Player::SetSpellModTakingSpell (C1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id);
10049 return;
10050 }
10051 //ASSERT(m_spellModTakingSpell && m_spellModTakingSpell == spell);
10052 }
10053
10054 m_spellModTakingSpell = apply ? spell : nullptr;
10055}

References SpellInfo::Id, LOG_INFO, Spell::m_spellInfo, and m_spellModTakingSpell.

Referenced by Spell::_cast(), Spell::cast(), Spell::handle_delayed(), Unit::HandleDummyAuraProc(), and Aura::UpdateOwner().

◆ SetSummonAsSpectator()

void Player::SetSummonAsSpectator ( bool  on)
inline

◆ SetSummonPoint()

void Player::SetSummonPoint ( uint32  mapid,
float  x,
float  y,
float  z,
uint32  delay = 0,
bool  asSpectator = false 
)
16269{
16270 m_summon_expire = GameTime::GetGameTime().count() + (delay ? delay : MAX_PLAYER_SUMMON_DELAY);
16271 m_summon_mapid = mapid;
16272 m_summon_x = x;
16273 m_summon_y = y;
16274 m_summon_z = z;
16275 m_summon_asSpectator = asSpectator;
16276}
#define MAX_PLAYER_SUMMON_DELAY
Definition: Player.h:929

References GameTime::GetGameTime(), m_summon_asSpectator, m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, and MAX_PLAYER_SUMMON_DELAY.

Referenced by Spell::EffectSummonPlayer(), and Spell::EffectSummonRaFFriend().

◆ SetTarget()

void Player::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
inlineoverridevirtual

Implements Unit.

1623{ }

◆ SetTaxiCheater()

void Player::SetTaxiCheater ( bool  on)
inline

◆ setTeamId()

void Player::setTeamId ( TeamId  teamid)
inline
2087{ m_team = teamid; };

References m_team.

◆ SetTemporaryUnsummonedPetNumber()

void Player::SetTemporaryUnsummonedPetNumber ( uint32  petnumber)
inline

◆ SetTitle()

void Player::SetTitle ( CharTitlesEntry const *  title,
bool  lost = false 
)
13284{
13285 uint32 fieldIndexOffset = title->bit_index / 32;
13286 uint32 flag = 1 << (title->bit_index % 32);
13287
13288 if (lost)
13289 {
13290 if (!HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag))
13291 return;
13292
13293 // Clear the current title if it is the one being removed.
13294 if (title->bit_index == GetUInt32Value(PLAYER_CHOSEN_TITLE))
13295 {
13296 SetCurrentTitle(nullptr, true);
13297 }
13298
13299 RemoveFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13300 }
13301 else
13302 {
13303 if (HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag))
13304 return;
13305
13306 SetFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13307 }
13308
13309 WorldPacket data(SMSG_TITLE_EARNED, 4 + 4);
13310 data << uint32(title->bit_index);
13311 data << uint32(lost ? 0 : 1); // 1 - earned, 0 - lost
13312 GetSession()->SendPacket(&data);
13313
13315}
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK
Definition: DBCEnums.h:158
@ SMSG_TITLE_EARNED
Definition: Opcodes.h:913
void SetCurrentTitle(CharTitlesEntry const *title, bool clear=false)
Definition: Player.h:2521

References ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK, CharTitlesEntry::bit_index, GetSession(), Object::GetUInt32Value(), Object::HasFlag(), PLAYER__FIELD_KNOWN_TITLES, PLAYER_CHOSEN_TITLE, Object::RemoveFlag(), WorldSession::SendPacket(), SetCurrentTitle(), Object::SetFlag(), SMSG_TITLE_EARNED, and UpdateAchievementCriteria().

Referenced by _LoadQuestStatusRewarded(), AchievementMgr::CompletedAchievement(), titles_commandscript::HandleTitlesAddCommand(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), AchievementMgr::LoadFromDB(), and RewardQuest().

◆ SetViewpoint()

void Player::SetViewpoint ( WorldObject target,
bool  apply 
)
13118{
13119 if (apply)
13120 {
13121 LOG_DEBUG("maps", "Player::CreateViewpoint: Player {} create seer {} (TypeId: {}).", GetName(), target->GetEntry(), target->GetTypeId());
13122
13123 if (!AddGuidValue(PLAYER_FARSIGHT, target->GetGUID()))
13124 {
13125 LOG_DEBUG("entities.player", "Player::CreateViewpoint: Player {} cannot add new viewpoint!", GetName());
13126 return;
13127 }
13128
13129 // farsight dynobj or puppet may be very far away
13130 UpdateVisibilityOf(target);
13131
13132 if (target->IsUnit() && !GetVehicle())
13133 ((Unit*)target)->AddPlayerToVision(this);
13134 SetSeer(target);
13135 }
13136 else
13137 {
13138 //must immediately set seer back otherwise may crash
13139 m_seer = this;
13140
13141 LOG_DEBUG("maps", "Player::CreateViewpoint: Player {} remove seer", GetName());
13142
13143 if (!RemoveGuidValue(PLAYER_FARSIGHT, target->GetGUID()))
13144 {
13145 LOG_DEBUG("entities.player", "Player::CreateViewpoint: Player {} cannot remove current viewpoint!", GetName());
13146 return;
13147 }
13148
13149 if (target->IsUnit() && !GetVehicle())
13150 static_cast<Unit*>(target)->RemovePlayerFromVision(this);
13151
13152 // must immediately set seer back otherwise may crash
13153 SetSeer(this);
13154
13155 //WorldPacket data(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, 0);
13156 //GetSession()->SendPacket(&data);
13157 }
13158}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:686
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:704
void SetSeer(WorldObject *target)
Definition: Player.h:2326
void UpdateVisibilityOf(WorldObject *target)
Definition: PlayerUpdates.cpp:1667

References Object::AddGuidValue(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), Unit::GetVehicle(), Object::IsUnit(), LOG_DEBUG, m_seer, PLAYER_FARSIGHT, Object::RemoveGuidValue(), Unit::RemovePlayerFromVision(), SetSeer(), and UpdateVisibilityOf().

Referenced by CinematicMgr::BeginCinematic(), CinematicMgr::EndCinematic(), AuraEffect::HandleBindSight(), WorldSession::HandleFarSightOpcode(), RemoveFromWorld(), and SetClientControl().

◆ SetVirtualItemSlot()

void Player::SetVirtualItemSlot ( uint8  i,
Item item 
)
Todo:
: this import is not necessary for compilation and marked as unused by the IDE
84{
85 ASSERT(i < 3);
86 if (i < 2 && item)
87 {
89 return;
91 if (charges == 0)
92 return;
93 if (charges > 1)
95 else if (charges <= 1)
96 {
99 }
100 }
101}

References ApplyEnchantment(), ASSERT, Item::ClearEnchantment(), Item::GetEnchantmentCharges(), Item::GetEnchantmentId(), Item::SetEnchantmentCharges(), and TEMP_ENCHANTMENT_SLOT.

Referenced by SetSheath().

◆ SetVisibleItemSlot()

void Player::SetVisibleItemSlot ( uint8  slot,
Item pItem 
)

◆ SetWaterWalking()

bool Player::SetWaterWalking ( bool  enable,
bool  packetOnly = false 
)
overridevirtual

Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.

movement counter

Reimplemented from Unit.

15914{
15915 // moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15916 if (!packetOnly /* && !Unit::SetWaterWalking(apply)*/)
15917 {
15918 Unit::SetWaterWalking(apply);
15919 // return false;
15920 }
15921
15923 data << GetPackGUID();
15924 data << uint32(0);
15925 SendDirectMessage(&data);
15926
15927 data.Initialize(MSG_MOVE_WATER_WALK, 64);
15928 data << GetPackGUID();
15929 BuildMovementPacket(&data);
15930 SendMessageToSet(&data, false);
15931 return true;
15932}
@ MSG_MOVE_WATER_WALK
Definition: Opcodes.h:719
virtual bool SetWaterWalking(bool enable, bool packetOnly=false)
Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for...
Definition: Unit.cpp:20543

References Unit::BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), MSG_MOVE_WATER_WALK, SendDirectMessage(), SendMessageToSet(), Unit::SetWaterWalking(), SMSG_MOVE_LAND_WALK, and SMSG_MOVE_WATER_WALK.

Referenced by BuildPlayerRepop(), and ResurrectPlayer().

◆ setWeaponChangeTimer()

void Player::setWeaponChangeTimer ( uint32  time)
inline
1591{m_weaponChangeTimer = time;}

References m_weaponChangeTimer.

◆ SetWeeklyQuestStatus()

void Player::SetWeeklyQuestStatus ( uint32  quest_id)
12086{
12087 m_weeklyquests.insert(quest_id);
12088 m_WeeklyQuestChanged = true;
12089}

References m_WeeklyQuestChanged, and m_weeklyquests.

Referenced by RewardQuest().

◆ SpawnCorpseBones()

void Player::SpawnCorpseBones ( bool  triggerSave = true)
4630{
4632 if (GetMap()->ConvertCorpseToBones(GetGUID()))
4633 if (triggerSave && !GetSession()->PlayerLogoutWithSave()) // at logout we will already store the player
4634 {
4635 // prevent loading as ghost without corpse
4636 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4637
4638 // pussywizard: update only ghost flag instead of whole character table entry! data integrity is crucial
4640 stmt->SetData(0, GetGUID().GetCounter());
4641 trans->Append(stmt);
4642
4643 _SaveAuras(trans, false);
4644
4645 CharacterDatabase.CommitTransaction(trans);
4646 }
4647}
@ CHAR_UPD_CHAR_REMOVE_GHOST
Definition: CharacterDatabase.h:429

References _corpseLocation, _SaveAuras(), CHAR_UPD_CHAR_REMOVE_GHOST, CharacterDatabase, Object::GetGUID(), WorldObject::GetMap(), GetSession(), PreparedStatementBase::SetData(), and WorldLocation::WorldRelocate().

Referenced by Battleground::_ProcessResurrect(), CreateCorpse(), Spell::EffectSelfResurrect(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleReclaimCorpseOpcode(), LoadCorpse(), ProcessDelayedOperations(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), ResurectUsingRequestData(), BfGraveyard::Resurrect(), and WorldSession::SendSpiritResurrect().

◆ SplitItem()

void Player::SplitItem ( uint16  src,
uint16  dst,
uint32  count 
)

If trading

If current item is in trade window (only possible with packet spoofing - silent return)

3437{
3438 uint8 srcbag = src >> 8;
3439 uint8 srcslot = src & 255;
3440
3441 uint8 dstbag = dst >> 8;
3442 uint8 dstslot = dst & 255;
3443
3444 Item* pSrcItem = GetItemByPos(srcbag, srcslot);
3445 if (!pSrcItem)
3446 {
3447 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr);
3448 return;
3449 }
3450
3451 if (pSrcItem->m_lootGenerated) // prevent split looting item (item
3452 {
3453 //best error message found for attempting to split while looting
3455 return;
3456 }
3457
3458 // not let split all items (can be only at cheating)
3459 if (pSrcItem->GetCount() == count)
3460 {
3462 return;
3463 }
3464
3465 // not let split more existed items (can be only at cheating)
3466 if (pSrcItem->GetCount() < count)
3467 {
3469 return;
3470 }
3471
3473 if (TradeData* tradeData = GetTradeData())
3474 {
3476 if (tradeData->GetTradeSlotForItem(pSrcItem->GetGUID()) != TRADE_SLOT_INVALID)
3477 return;
3478 }
3479
3480 LOG_DEBUG("entities.player.items", "STORAGE: SplitItem bag = {}, slot = {}, item = {}, count = {}", dstbag, dstslot, pSrcItem->GetEntry(), count);
3481 Item* pNewItem = pSrcItem->CloneItem(count, this);
3482 if (!pNewItem)
3483 {
3484 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr);
3485 return;
3486 }
3487
3488 if (IsInventoryPos(dst))
3489 {
3490 // change item amount before check (for unique max count check)
3491 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3492
3493 ItemPosCountVec dest;
3494 InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pNewItem, false);
3495 if (msg != EQUIP_ERR_OK)
3496 {
3497 delete pNewItem;
3498 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3499 SendEquipError(msg, pSrcItem, nullptr);
3500 return;
3501 }
3502
3503 if (IsInWorld())
3504 pSrcItem->SendUpdateToPlayer(this);
3505 pSrcItem->SetState(ITEM_CHANGED, this);
3506 StoreItem(dest, pNewItem, true);
3507 }
3508 else if (IsBankPos(dst))
3509 {
3510 // change item amount before check (for unique max count check)
3511 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3512
3513 ItemPosCountVec dest;
3514 InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pNewItem, false);
3515 if (msg != EQUIP_ERR_OK)
3516 {
3517 delete pNewItem;
3518 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3519 SendEquipError(msg, pSrcItem, nullptr);
3520 return;
3521 }
3522
3523 if (IsInWorld())
3524 pSrcItem->SendUpdateToPlayer(this);
3525 pSrcItem->SetState(ITEM_CHANGED, this);
3526 BankItem(dest, pNewItem, true);
3527 }
3528 else if (IsEquipmentPos(dst))
3529 {
3530 // change item amount before check (for unique max count check), provide space for splitted items
3531 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3532
3533 uint16 dest;
3534 InventoryResult msg = CanEquipItem(dstslot, dest, pNewItem, false);
3535 if (msg != EQUIP_ERR_OK)
3536 {
3537 delete pNewItem;
3538 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3539 SendEquipError(msg, pSrcItem, nullptr);
3540 return;
3541 }
3542
3543 if (IsInWorld())
3544 pSrcItem->SendUpdateToPlayer(this);
3545 pSrcItem->SetState(ITEM_CHANGED, this);
3546 EquipItem(dest, pNewItem, true);
3548 }
3549}
@ EQUIP_ERR_COULDNT_SPLIT_ITEMS
Definition: Item.h:74
@ EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT
Definition: Item.h:73
@ TRADE_SLOT_INVALID
Definition: TradeData.h:32
TradeData * GetTradeData() const
Definition: Player.h:1368
Definition: TradeData.h:36

References AutoUnequipOffhandIfNeed(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), Item::CloneItem(), EQUIP_ERR_COULDNT_SPLIT_ITEMS, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT, EquipItem(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), GetTradeData(), IsBankPos(), IsEquipmentPos(), IsInventoryPos(), Object::IsInWorld(), ITEM_CHANGED, LOG_DEBUG, Item::m_lootGenerated, SendEquipError(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), StoreItem(), and TRADE_SLOT_INVALID.

Referenced by WorldSession::HandleSplitItemOpcode().

◆ StartTimedAchievement()

void Player::StartTimedAchievement ( AchievementCriteriaTimedTypes  type,
uint32  entry,
uint32  timeLost = 0 
)
13870{
13871 m_achievementMgr->StartTimedAchievement(type, entry, timeLost);
13872}
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
Definition: AchievementMgr.cpp:2226

References m_achievementMgr, and AchievementMgr::StartTimedAchievement().

Referenced by Spell::_cast(), AddQuest(), Spell::DoSpellHitOnUnit(), InstanceScript::DoStartTimedAchievement(), BattlegroundWS::EventPlayerClickedOnFlag(), and KilledMonsterCredit().

◆ StopCastingBindSight()

void Player::StopCastingBindSight ( Aura except = nullptr)
13105{
13106 if (WorldObject* target = GetViewpoint())
13107 {
13108 if (target->IsUnit())
13109 {
13110 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID(), except);
13111 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID(), except);
13112 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, GetGUID(), except);
13113 }
13114 }
13115}
@ SPELL_AURA_MOD_POSSESS_PET
Definition: SpellAuraDefines.h:191
@ SPELL_AURA_MOD_POSSESS
Definition: SpellAuraDefines.h:65
@ SPELL_AURA_BIND_SIGHT
Definition: SpellAuraDefines.h:64

References Object::GetGUID(), GetViewpoint(), SPELL_AURA_BIND_SIGHT, SPELL_AURA_MOD_POSSESS, and SPELL_AURA_MOD_POSSESS_PET.

Referenced by ActivateTaxiPathTo(), misc_commandscript::HandleUnbindSightCommand(), RemoveFromWorld(), and Unit::SetCharmedBy().

◆ StopCastingCharm()

void Player::StopCastingCharm ( Aura except = nullptr)
9252{
9253 Unit* charm = GetCharm();
9254 if (!charm)
9255 {
9256 return;
9257 }
9258
9259 if (charm->IsCreature())
9260 {
9262 {
9263 ((Puppet*)charm)->UnSummon();
9264 }
9265 else if (charm->IsVehicle())
9266 {
9267 ExitVehicle();
9268 }
9269 }
9270
9271 if (GetCharmGUID())
9272 {
9277 }
9278
9279 if (GetCharmGUID())
9280 {
9281 LOG_FATAL("entities.player", "Player {} ({} is not able to uncharm unit ({})", GetName(), GetGUID().ToString(), GetCharmGUID().ToString());
9282
9283 if (charm->GetCharmerGUID())
9284 {
9285 LOG_FATAL("entities.player", "Charmed unit has charmer {}", charm->GetCharmerGUID().ToString());
9286 ABORT();
9287 }
9288 else
9289 {
9290 SetCharm(charm, false);
9291 }
9292 }
9293}
@ SPELL_AURA_MOD_CHARM
Definition: SpellAuraDefines.h:69
@ SPELL_AURA_AOE_CHARM
Definition: SpellAuraDefines.h:240
@ UNIT_MASK_PUPPET
Definition: UnitDefines.h:141
#define ABORT
Definition: Errors.h:76
Definition: TemporarySummon.h:114
bool IsVehicle() const
Definition: Unit.h:757
void SetCharm(Unit *target, bool apply)
Definition: Unit.cpp:10816
ObjectGuid GetCharmGUID() const
Definition: Unit.h:1165

References ABORT, ObjectGuid::Empty, Unit::ExitVehicle(), Unit::GetCharm(), Unit::GetCharmerGUID(), Unit::GetCharmGUID(), Object::GetGUID(), WorldObject::GetName(), Unit::HasUnitTypeMask(), Object::IsCreature(), Unit::IsVehicle(), LOG_FATAL, Unit::RemoveAurasByType(), Unit::SetCharm(), SPELL_AURA_AOE_CHARM, SPELL_AURA_MOD_CHARM, SPELL_AURA_MOD_POSSESS, SPELL_AURA_MOD_POSSESS_PET, Object::ToCreature(), ObjectGuid::ToString(), Position::ToString(), and UNIT_MASK_PUPPET.

Referenced by ActivateTaxiPathTo(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), Unit::RemoveAllControlled(), RemoveFromWorld(), Unit::SetCharmedBy(), and npc_chesspiece::sGossipSelect().

◆ StopMirrorTimer()

void Player::StopMirrorTimer ( MirrorTimerType  Type)
protected

◆ StopMirrorTimers()

◆ StoreItem()

Item * Player::StoreItem ( ItemPosCountVec const &  pos,
Item pItem,
bool  update 
)
2590{
2591 if (!pItem)
2592 return nullptr;
2593
2594 Item* lastItem = pItem;
2595 ItemTemplate const* proto = pItem->GetTemplate();
2596
2597 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end();)
2598 {
2599 uint16 pos = itr->pos;
2600 uint32 count = itr->count;
2601
2602 ++itr;
2603
2604 if (itr == dest.end())
2605 {
2606 lastItem = _StoreItem(pos, pItem, count, false, update);
2607 break;
2608 }
2609
2610 lastItem = _StoreItem(pos, pItem, count, true, update);
2611 }
2612
2613 // cast after item storing - some checks in checkcast requires item to be present!!
2614 if (lastItem)
2615 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
2616 if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
2617 if (!HasAura(proto->Spells[i].SpellId))
2618 CastSpell(this, proto->Spells[i].SpellId, true, lastItem);
2619
2620 return lastItem;
2621}
Item * _StoreItem(uint16 pos, Item *pItem, uint32 count, bool clone, bool update)
Definition: PlayerStorage.cpp:2624

References _StoreItem(), Unit::CastSpell(), Item::GetTemplate(), Unit::HasAura(), ITEM_SPELLTRIGGER_ON_NO_DELAY_USE, MAX_ITEM_PROTO_SPELLS, _Spell::SpellId, ItemTemplate::Spells, and _Spell::SpellTrigger.

Referenced by _LoadInventory(), AutoUnequipOffhandIfNeed(), BankItem(), Create(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleMailCreateTextItem(), MoveItemToInventory(), SplitItem(), StoreNewItem(), and SwapItem().

◆ StoreLootItem()

LootItem * Player::StoreLootItem ( uint8  lootSlot,
Loot loot,
InventoryResult msg 
)
13465{
13466 QuestItem* qitem = nullptr;
13467 QuestItem* ffaitem = nullptr;
13468 QuestItem* conditem = nullptr;
13469
13470 msg = EQUIP_ERR_OK;
13471
13472 LootItem* item = loot->LootItemInSlot(lootSlot, this, &qitem, &ffaitem, &conditem);
13473 if (!item || item->is_looted)
13474 {
13475 if (!sScriptMgr->CanSendErrorAlreadyLooted(this))
13476 {
13477 SendEquipError(EQUIP_ERR_ALREADY_LOOTED, nullptr, nullptr);
13478 }
13479 return nullptr;
13480 }
13481
13482 // Xinef: exploit protection, dont allow to loot normal items if player is not master loot and not below loot threshold
13483 // Xinef: only quest, ffa and conditioned items
13484 if (!item->is_underthreshold && loot->roundRobinPlayer && !GetLootGUID().IsItem() && GetGroup() && GetGroup()->GetLootMethod() == MASTER_LOOT && GetGUID() != GetGroup()->GetMasterLooterGuid())
13485 if (!qitem && !ffaitem && !conditem)
13486 {
13488 return nullptr;
13489 }
13490
13491 if (!item->AllowedForPlayer(this, loot->sourceWorldObjectGUID))
13492 {
13494 return nullptr;
13495 }
13496
13497 // questitems use the blocked field for other purposes
13498 if (!qitem && item->is_blocked)
13499 {
13501 return nullptr;
13502 }
13503
13504 // xinef: dont allow protected item to be looted by someone else
13505 if (item->rollWinnerGUID && item->rollWinnerGUID != GetGUID())
13506 {
13508 return nullptr;
13509 }
13510
13511 ItemPosCountVec dest;
13512 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count);
13513 if (msg == EQUIP_ERR_OK)
13514 {
13515 AllowedLooterSet looters = item->GetAllowedLooters();
13516 Item* newitem = StoreNewItem(dest, item->itemid, true, item->randomPropertyId, looters);
13517
13518 if (qitem)
13519 {
13520 qitem->is_looted = true;
13521 //freeforall is 1 if everyone's supposed to get the quest item.
13522 if (item->freeforall || loot->GetPlayerQuestItems().size() == 1)
13523 SendNotifyLootItemRemoved(lootSlot);
13524 else
13525 loot->NotifyQuestItemRemoved(qitem->index);
13526 }
13527 else
13528 {
13529 if (ffaitem)
13530 {
13531 //freeforall case, notify only one player of the removal
13532 ffaitem->is_looted = true;
13533 SendNotifyLootItemRemoved(lootSlot);
13534 }
13535 else
13536 {
13537 //not freeforall, notify everyone
13538 if (conditem)
13539 conditem->is_looted = true;
13540 loot->NotifyItemRemoved(lootSlot);
13541 }
13542 }
13543
13544 //if only one person is supposed to loot the item, then set it to looted
13545 if (!item->freeforall)
13546 item->is_looted = true;
13547
13548 --loot->unlootedCount;
13549
13550 SendNewItem(newitem, uint32(item->count), false, false, true);
13551 UpdateLootAchievements(item, loot);
13552
13553 // LootItem is being removed (looted) from the container, delete it from the DB.
13554 if (loot->containerGUID)
13555 sLootItemStorage->RemoveStoredLootItem(loot->containerGUID, item->itemid, item->count, loot, item->itemIndex);
13556
13557 sScriptMgr->OnLootItem(this, newitem, item->count, this->GetLootGUID());
13558 }
13559 else
13560 {
13561 SendEquipError(msg, nullptr, nullptr, item->itemid);
13562 }
13563
13564 return item;
13565}
bool IsItem() const
Definition: Object.h:221
void UpdateLootAchievements(LootItem *item, Loot *loot)
Definition: PlayerUpdates.cpp:2117
void SendNotifyLootItemRemoved(uint8 lootSlot)
Definition: Player.cpp:8136
bool is_blocked
Definition: LootMgr.h:165
ObjectGuid rollWinnerGUID
Definition: LootMgr.h:162
bool is_underthreshold
Definition: LootMgr.h:167
bool AllowedForPlayer(Player const *player, ObjectGuid source) const
Definition: LootMgr.cpp:410
uint32 itemIndex
Definition: LootMgr.h:157
bool is_looted
Definition: LootMgr.h:164
const AllowedLooterSet & GetAllowedLooters() const
Definition: LootMgr.h:182
bool freeforall
Definition: LootMgr.h:166
Definition: LootMgr.h:186
uint8 index
Definition: LootMgr.h:187
bool is_looted
Definition: LootMgr.h:188
ObjectGuid sourceWorldObjectGUID
Definition: LootMgr.h:330
void NotifyQuestItemRemoved(uint8 questIndex)
Definition: LootMgr.cpp:795
QuestItemMap const & GetPlayerQuestItems() const
Definition: LootMgr.h:316
void NotifyItemRemoved(uint8 lootIndex)
Definition: LootMgr.cpp:764

References LootItem::AllowedForPlayer(), CanStoreNewItem(), Loot::containerGUID, LootItem::count, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_OK, LootItem::freeforall, LootItem::GetAllowedLooters(), GetGroup(), Object::GetGUID(), GetLootGUID(), Loot::GetPlayerQuestItems(), QuestItem::index, LootItem::is_blocked, LootItem::is_looted, QuestItem::is_looted, LootItem::is_underthreshold, Object::IsItem(), LootItem::itemid, LootItem::itemIndex, Loot::LootItemInSlot(), MASTER_LOOT, Loot::NotifyItemRemoved(), Loot::NotifyQuestItemRemoved(), NULL_BAG, NULL_SLOT, LootItem::randomPropertyId, LootItem::rollWinnerGUID, Loot::roundRobinPlayer, SendEquipError(), SendLootRelease(), SendNewItem(), SendNotifyLootItemRemoved(), sLootItemStorage, Loot::sourceWorldObjectGUID, sScriptMgr, StoreNewItem(), Loot::unlootedCount, and UpdateLootAchievements().

Referenced by Loot::FillNotNormalLootFor(), and WorldSession::HandleAutostoreLootItemOpcode().

◆ StoreNewItem() [1/2]

Item * Player::StoreNewItem ( ItemPosCountVec const &  pos,
uint32  item,
bool  update,
int32  randomPropertyId,
AllowedLooterSet allowedLooters 
)
2547{
2548 uint32 count = 0;
2549 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr)
2550 count += itr->count;
2551
2552 Item* pItem = Item::CreateItem(item, count, this, false, randomPropertyId);
2553 if (pItem)
2554 {
2555 // pussywizard: obtaining blue or better items saves to db
2556 if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item))
2557 if (pProto->Quality >= ITEM_QUALITY_RARE)
2559
2560 ItemAddedQuestCheck(item, count);
2563 pItem = StoreItem(dest, pItem, update);
2564
2565 if (allowedLooters.size() > 1 && pItem->GetTemplate()->GetMaxStackSize() == 1 && pItem->IsSoulBound() && sWorld->getBoolConfig(CONFIG_SET_BOP_ITEM_TRADEABLE))
2566 {
2567 pItem->SetSoulboundTradeable(allowedLooters);
2569 AddTradeableItem(pItem);
2570
2571 // save data
2572 std::ostringstream ss;
2573 AllowedLooterSet::const_iterator itr = allowedLooters.begin();
2574 ss << (*itr).GetCounter();
2575 for (++itr; itr != allowedLooters.end(); ++itr)
2576 ss << ' ' << (*itr).GetCounter();
2577
2579 stmt->SetData(0, pItem->GetGUID().GetCounter());
2580 stmt->SetData(1, ss.str());
2581 CharacterDatabase.Execute(stmt);
2582 }
2583
2584 sScriptMgr->OnStoreNewItem(this, pItem, count);
2585 }
2586 return pItem;
2587}
@ ITEM_FIELD_CREATE_PLAYED_TIME
Definition: UpdateFields.h:71
@ CONFIG_SET_BOP_ITEM_TRADEABLE
Definition: IWorld.h:173
@ CHAR_INS_ITEM_BOP_TRADE
Definition: CharacterDatabase.h:122
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM
Definition: DBCEnums.h:150

References ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, ADDITIONAL_SAVING_INVENTORY_AND_GOLD, AdditionalSavingAddMask(), AddTradeableItem(), CHAR_INS_ITEM_BOP_TRADE, CharacterDatabase, CONFIG_SET_BOP_ITEM_TRADEABLE, Item::CreateItem(), ObjectGuid::GetCounter(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), GetTotalPlayedTime(), Item::IsSoulBound(), ITEM_FIELD_CREATE_PLAYED_TIME, ITEM_QUALITY_RARE, ItemAddedQuestCheck(), PreparedStatementBase::SetData(), Item::SetSoulboundTradeable(), Object::SetUInt32Value(), sObjectMgr, sScriptMgr, StoreItem(), sWorld, and UpdateAchievementCriteria().

◆ StoreNewItem() [2/2]

◆ StoreNewItemInBestSlots()

bool Player::StoreNewItemInBestSlots ( uint32  item_id,
uint32  item_count 
)
697{
698 LOG_DEBUG("entities.player.items", "STORAGE: Creating initial item, itemId = {}, count = {}", titem_id, titem_amount);
699
700 // attempt equip by one
701 while (titem_amount > 0)
702 {
703 uint16 eDest;
704 InventoryResult msg = CanEquipNewItem(NULL_SLOT, eDest, titem_id, false);
705 if (msg != EQUIP_ERR_OK)
706 break;
707
708 EquipNewItem(eDest, titem_id, true);
710 --titem_amount;
711 }
712
713 if (titem_amount == 0)
714 return true; // equipped
715
716 // attempt store
717 ItemPosCountVec sDest;
718 // store in main bag to simplify second pass (special bags can be not equipped yet at this moment)
719 InventoryResult msg = CanStoreNewItem(INVENTORY_SLOT_BAG_0, NULL_SLOT, sDest, titem_id, titem_amount);
720 if (msg == EQUIP_ERR_OK)
721 {
722 StoreNewItem(sDest, titem_id, true);
723 return true; // stored
724 }
725
726 // item can't be added
727 LOG_ERROR("entities.player", "STORAGE: Can't equip or store initial item {} for race {} class {}, error msg = {}", titem_id, getRace(true), getClass(), msg);
728 return false;
729}

References AutoUnequipOffhandIfNeed(), CanEquipNewItem(), CanStoreNewItem(), EQUIP_ERR_OK, EquipNewItem(), Unit::getClass(), Unit::getRace(), INVENTORY_SLOT_BAG_0, LOG_DEBUG, LOG_ERROR, NULL_SLOT, and StoreNewItem().

Referenced by Create().

◆ StoreRaidMapDifficulty()

void Player::StoreRaidMapDifficulty ( )
inline

◆ SummonIfPossible()

void Player::SummonIfPossible ( bool  agree,
ObjectGuid  summoner_guid 
)
12372{
12373 if (!agree)
12374 {
12375 m_summon_expire = 0;
12376 return;
12377 }
12378
12379 // expire and auto declined
12380 if (m_summon_expire < GameTime::GetGameTime().count())
12381 return;
12382
12383 // drop flag at summon
12384 // this code can be reached only when GM is summoning player who carries flag, because player should be immune to summoning spells when he carries flag
12385 if (Battleground* bg = GetBattleground())
12386 bg->EventPlayerDroppedFlag(this);
12387
12388 m_summon_expire = 0;
12389
12391
12393}
@ ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS
Definition: DBCEnums.h:220
Player * FindPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:248

References ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS, ObjectAccessor::FindPlayer(), GetBattleground(), GameTime::GetGameTime(), Position::GetOrientation(), m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, TeleportTo(), and UpdateAchievementCriteria().

Referenced by WorldSession::HandleSummonResponseOpcode().

◆ SummonPet()

Pet * Player::SummonPet ( uint32  entry,
float  x,
float  y,
float  z,
float  ang,
PetType  petType,
Milliseconds  duration = 0s,
uint32  healthPct = 0 
)
8887{
8888 PetStable& petStable = GetOrInitPetStable();
8889
8890 Pet* pet = new Pet(this, petType);
8891
8892 if (petType == SUMMON_PET && pet->LoadPetFromDB(this, entry, 0, false, healthPct))
8893 {
8894 // Remove Demonic Sacrifice auras (known pet)
8896 for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
8897 {
8898 if ((*itr)->GetMiscValue() == 2228)
8899 {
8900 RemoveAurasDueToSpell((*itr)->GetId());
8901 itr = auraClassScripts.begin();
8902 }
8903 else
8904 ++itr;
8905 }
8906
8907 if (duration > 0s)
8908 pet->SetDuration(duration);
8909
8910 // Generate a new name for the newly summoned ghoul
8911 if (pet->IsPetGhoul())
8912 {
8913 std::string new_name = sObjectMgr->GeneratePetNameLocale(entry, GetSession()->GetSessionDbLocaleIndex());
8914 if (!new_name.empty())
8915 pet->SetName(new_name);
8916 }
8917
8918 return nullptr;
8919 }
8920
8921 // petentry == 0 for hunter "call pet" (current pet summoned if any)
8922 if (!entry)
8923 {
8924 delete pet;
8925 return nullptr;
8926 }
8927
8928 pet->Relocate(x, y, z, ang);
8929 if (!pet->IsPositionValid())
8930 {
8931 LOG_ERROR("misc", "Player::SummonPet: Pet ({}, Entry: {}) not summoned. Suggested coordinates aren't valid (X: {} Y: {})", pet->GetGUID().ToString(), pet->GetEntry(), pet->GetPositionX(), pet->GetPositionY());
8932 delete pet;
8933 return nullptr;
8934 }
8935
8936 Map* map = GetMap();
8937 uint32 pet_number = sObjectMgr->GeneratePetNumber();
8938 if (!pet->Create(map->GenerateLowGuid<HighGuid::Pet>(), map, GetPhaseMask(), entry, pet_number))
8939 {
8940 LOG_ERROR("misc", "Player::SummonPet: No such creature entry {}", entry);
8941 delete pet;
8942 return nullptr;
8943 }
8944
8945 if (petType == SUMMON_PET && petStable.CurrentPet)
8947
8948 pet->SetCreatorGUID(GetGUID());
8949 pet->SetFaction(GetFaction());
8954
8955 SetMinion(pet, true);
8956
8957 if (petType == SUMMON_PET)
8958 {
8960 {
8961 pet->GetCharmInfo()->SetPetNumber(pet_number, true); // Show pet details tab (Shift+P) only for demons & undead
8962 }
8963 else
8964 {
8965 pet->GetCharmInfo()->SetPetNumber(pet_number, false);
8966 }
8967
8971 pet->SetFullHealth();
8973 pet->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped in this case
8974 }
8975
8976 map->AddToMap(pet->ToCreature(), true);
8977
8978 ASSERT(!petStable.CurrentPet && (petType != HUNTER_PET || !petStable.GetUnslottedHunterPet()));
8979 pet->FillPetInfo(&petStable.CurrentPet.emplace());
8980
8981 if (petType == SUMMON_PET)
8982 {
8983 pet->InitPetCreateSpells();
8984 pet->InitTalentForLevel();
8987
8988 // Remove Demonic Sacrifice auras (known pet)
8990 for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
8991 {
8992 if ((*itr)->GetMiscValue() == 2228)
8993 {
8994 RemoveAurasDueToSpell((*itr)->GetId());
8995 itr = auraClassScripts.begin();
8996 }
8997 else
8998 ++itr;
8999 }
9000 }
9001
9002 if (duration > 0s)
9003 pet->SetDuration(duration);
9004
9006 {
9009 }
9010
9011 return pet;
9012}
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition: SpellAuraDefines.h:175
@ UNIT_FIELD_PETEXPERIENCE
Definition: UpdateFields.h:134
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition: UpdateFields.h:133
@ UNIT_FIELD_PETNEXTLEVELEXP
Definition: UpdateFields.h:135
@ SUMMON_PET
Definition: PetDefines.h:31
@ UNIT_NPC_FLAG_NONE
Definition: UnitDefines.h:293
@ CREATURE_TYPE_UNDEAD
Definition: SharedDefines.h:2633
@ CREATURE_TYPE_DEMON
Definition: SharedDefines.h:2630
uint32 type
Definition: CreatureData.h:225
bool IsPetGhoul() const
Definition: TemporarySummon.h:84
bool InitStatsForLevel(uint8 level)
Definition: Pet.cpp:1021
void SetName(std::string const &newname)
Definition: Object.h:459
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition: Pet.cpp:2474
bool Create(ObjectGuid::LowType guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 pet_number)
Definition: Pet.cpp:2318
void SetDuration(Milliseconds dur)
Definition: Pet.h:90
void InitPetCreateSpells()
Definition: Pet.cpp:2049
PetStable & GetOrInitPetStable()
Definition: Player.cpp:15533
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition: CharmInfo.cpp:247
float GetHealthPct() const
Definition: Unit.h:790
void ReplaceAllNpcFlags(NPCFlags flags)
Definition: Unit.h:994
ObjectGuid::LowType GenerateLowGuid()
Definition: Map.h:638

References Map::AddToMap(), ASSERT, Pet::Create(), CREATURE_TYPE_DEMON, CREATURE_TYPE_UNDEAD, PetStable::CurrentPet, CreatureTemplate::family, Pet::FillPetInfo(), WorldObject::FindMap(), Map::GenerateLowGuid(), Unit::GetAuraEffectsByType(), Unit::GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), Unit::GetFaction(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetHealthPct(), Unit::GetLevel(), WorldObject::GetMap(), Unit::GetMaxPower(), GetOrInitPetStable(), WorldObject::GetPhaseMask(), Position::GetPositionX(), Position::GetPositionY(), GetSession(), PetStable::GetUnslottedHunterPet(), HUNTER_PET, Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Pet::InitTalentForLevel(), Minion::IsPetGhoul(), Position::IsPositionValid(), Pet::LoadPetFromDB(), LOG_ERROR, NeedSendSpectatorData(), PET_SAVE_AS_CURRENT, PET_SAVE_NOT_IN_SLOT, PetSpellInitialize(), POWER_MANA, Position::Relocate(), Unit::RemoveAurasDueToSpell(), RemovePet(), Unit::ReplaceAllNpcFlags(), Pet::SavePetToDB(), ArenaSpectator::SendCommand_UInt32Value(), Unit::SetCreatorGUID(), Pet::SetDuration(), Unit::SetFaction(), Unit::SetFullHealth(), Unit::SetMinion(), WorldObject::SetName(), CharmInfo::SetPetNumber(), Unit::SetPower(), Unit::setPowerType(), Unit::SetUInt32Value(), sObjectMgr, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SUMMON_PET, Object::ToCreature(), ObjectGuid::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_0, UNIT_FIELD_BYTES_1, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FIELD_PETEXPERIENCE, UNIT_FIELD_PETNEXTLEVELEXP, and UNIT_NPC_FLAG_NONE.

Referenced by Spell::EffectResurrectPet(), and Spell::EffectSummonPet().

◆ SwapItem()

void Player::SwapItem ( uint16  src,
uint16  dst 
)
3552{
3553 uint8 srcbag = src >> 8;
3554 uint8 srcslot = src & 255;
3555
3556 uint8 dstbag = dst >> 8;
3557 uint8 dstslot = dst & 255;
3558
3559 Item* pSrcItem = GetItemByPos(srcbag, srcslot);
3560 Item* pDstItem = GetItemByPos(dstbag, dstslot);
3561
3562 if (!pSrcItem)
3563 return;
3564
3565 LOG_DEBUG("entities.player.items", "STORAGE: SwapItem bag = {}, slot = {}, item = {}", dstbag, dstslot, pSrcItem->GetEntry());
3566
3567 if (!IsAlive())
3568 {
3569 SendEquipError(EQUIP_ERR_YOU_ARE_DEAD, pSrcItem, pDstItem);
3570 return;
3571 }
3572
3573 // SRC checks
3574
3575 if (GetLootGUID() == pSrcItem->GetGUID()) // prevent swap looting item
3576 {
3577 //best error message found for attempting to swap while looting
3578 SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pSrcItem, nullptr);
3579 return;
3580 }
3581
3582 // check unequip potability for equipped items and bank bags
3583 if (IsEquipmentPos(src) || IsBagPos(src))
3584 {
3585 // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
3586 InventoryResult msg = CanUnequipItem(src, !IsBagPos(src) || IsBagPos(dst) || (pDstItem && pDstItem->ToBag() && pDstItem->ToBag()->IsEmpty()));
3587 if (msg != EQUIP_ERR_OK)
3588 {
3589 SendEquipError(msg, pSrcItem, pDstItem);
3590 return;
3591 }
3592 }
3593
3594 // anti-wpe
3595 if (pSrcItem->IsBag() && pSrcItem->IsNotEmptyBag() && !IsBagPos(dst))
3596 {
3598 return;
3599 }
3600
3601 // prevent put equipped/bank bag in self
3602 if (IsBagPos(src) && srcslot == dstbag)
3603 {
3605 return;
3606 }
3607
3608 // prevent equipping bag in the same slot from its inside
3609 if (IsBagPos(dst) && srcbag == dstslot)
3610 {
3612 return;
3613 }
3614
3615 // DST checks
3616
3617 if (pDstItem)
3618 {
3619 // Xinef: Removed next loot generated check
3620 if (pDstItem->GetGUID() == GetLootGUID()) // prevent swap looting item
3621 {
3622 //best error message found for attempting to swap while looting
3623 SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pDstItem, nullptr);
3624 return;
3625 }
3626
3627 // check unequip potability for equipped items and bank bags
3628 if (IsEquipmentPos(dst) || IsBagPos(dst))
3629 {
3630 // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
3631 InventoryResult msg = CanUnequipItem(dst, !IsBagPos(dst) || IsBagPos(src) || (pSrcItem->ToBag() && pSrcItem->ToBag()->IsEmpty()));
3632 if (msg != EQUIP_ERR_OK)
3633 {
3634 SendEquipError(msg, pSrcItem, pDstItem);
3635 return;
3636 }
3637 }
3638 }
3639
3640 // NOW this is or item move (swap with empty), or swap with another item (including bags in bag possitions)
3641 // or swap empty bag with another empty or not empty bag (with items exchange)
3642
3643 // Move case
3644 if (!pDstItem)
3645 {
3646 if (IsInventoryPos(dst))
3647 {
3648 ItemPosCountVec dest;
3649 InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pSrcItem, false);
3650 if (msg != EQUIP_ERR_OK)
3651 {
3652 SendEquipError(msg, pSrcItem, nullptr);
3653 return;
3654 }
3655
3656 RemoveItem(srcbag, srcslot, true);
3657 StoreItem(dest, pSrcItem, true);
3659 if (IsBankPos(src))
3660 ItemAddedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
3661 }
3662 else if (IsBankPos(dst))
3663 {
3664 ItemPosCountVec dest;
3665 InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pSrcItem, false);
3666 if (msg != EQUIP_ERR_OK)
3667 {
3668 SendEquipError(msg, pSrcItem, nullptr);
3669 return;
3670 }
3671
3672 RemoveItem(srcbag, srcslot, true);
3673 BankItem(dest, pSrcItem, true);
3675 ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
3676 }
3677 else if (IsEquipmentPos(dst))
3678 {
3679 uint16 dest;
3680 InventoryResult msg = CanEquipItem(dstslot, dest, pSrcItem, false);
3681 if (msg != EQUIP_ERR_OK)
3682 {
3683 SendEquipError(msg, pSrcItem, nullptr);
3684 return;
3685 }
3686
3687 RemoveItem(srcbag, srcslot, true);
3688 EquipItem(dest, pSrcItem, true);
3690 }
3691
3692 return;
3693 }
3694
3695 // attempt merge to / fill target item
3696 if (!pSrcItem->IsBag() && !pDstItem->IsBag())
3697 {
3698 InventoryResult msg;
3699 ItemPosCountVec sDest;
3700 uint16 eDest = 0;
3701 if (IsInventoryPos(dst))
3702 msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, false);
3703 else if (IsBankPos(dst))
3704 msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, false);
3705 else if (IsEquipmentPos(dst))
3706 msg = CanEquipItem(dstslot, eDest, pSrcItem, false);
3707 else
3708 return;
3709
3710 // can be merge/fill
3711 if (msg == EQUIP_ERR_OK)
3712 {
3713 if (pSrcItem->GetCount() + pDstItem->GetCount() <= pSrcItem->GetTemplate()->GetMaxStackSize())
3714 {
3715 RemoveItem(srcbag, srcslot, true);
3716
3717 if (IsInventoryPos(dst))
3718 StoreItem(sDest, pSrcItem, true);
3719 else if (IsBankPos(dst))
3720 BankItem(sDest, pSrcItem, true);
3721 else if (IsEquipmentPos(dst))
3722 {
3723 EquipItem(eDest, pSrcItem, true);
3725 }
3726 }
3727 else
3728 {
3729 pSrcItem->SetCount(pSrcItem->GetCount() + pDstItem->GetCount() - pSrcItem->GetTemplate()->GetMaxStackSize());
3730 pDstItem->SetCount(pSrcItem->GetTemplate()->GetMaxStackSize());
3731 pSrcItem->SetState(ITEM_CHANGED, this);
3732 pDstItem->SetState(ITEM_CHANGED, this);
3733 if (IsInWorld())
3734 {
3735 pSrcItem->SendUpdateToPlayer(this);
3736 pDstItem->SendUpdateToPlayer(this);
3737 }
3738 }
3739 SendRefundInfo(pDstItem);
3740 return;
3741 }
3742 }
3743
3744 // Remove item enchantments for now and restore it later
3745 // Needed for swap sanity checks
3746 ApplyEnchantment(pSrcItem, false);
3747 if (pDstItem)
3748 {
3749 ApplyEnchantment(pDstItem, false);
3750 }
3751
3752 // impossible merge/fill, do real swap
3754
3755 // check src->dest move possibility
3756 ItemPosCountVec sDest;
3757 uint16 eDest = 0;
3758 if (IsInventoryPos(dst))
3759 msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, true);
3760 else if (IsBankPos(dst))
3761 msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, true);
3762 else if (IsEquipmentPos(dst))
3763 {
3764 msg = CanEquipItem(dstslot, eDest, pSrcItem, true);
3765 if (msg == EQUIP_ERR_OK)
3766 msg = CanUnequipItem(eDest, true);
3767 }
3768
3769 if (msg != EQUIP_ERR_OK)
3770 {
3771 // Restore enchantments
3772 ApplyEnchantment(pSrcItem, true);
3773 if (pDstItem)
3774 {
3775 ApplyEnchantment(pDstItem, true);
3776 }
3777
3778 SendEquipError(msg, pSrcItem, pDstItem);
3779 return;
3780 }
3781
3782 // check dest->src move possibility
3783 ItemPosCountVec sDest2;
3784 uint16 eDest2 = 0;
3785 if (IsInventoryPos(src))
3786 msg = CanStoreItem(srcbag, srcslot, sDest2, pDstItem, true);
3787 else if (IsBankPos(src))
3788 msg = CanBankItem(srcbag, srcslot, sDest2, pDstItem, true);
3789 else if (IsEquipmentPos(src))
3790 {
3791 msg = CanEquipItem(srcslot, eDest2, pDstItem, true);
3792 if (msg == EQUIP_ERR_OK)
3793 msg = CanUnequipItem(eDest2, true);
3794 }
3795
3796 if (msg != EQUIP_ERR_OK)
3797 {
3798 // Restore enchantments
3799 ApplyEnchantment(pSrcItem, true);
3800 if (pDstItem)
3801 {
3802 ApplyEnchantment(pDstItem, true);
3803 }
3804
3805 SendEquipError(msg, pDstItem, pSrcItem);
3806 return;
3807 }
3808
3809 // Restore enchantments
3810 ApplyEnchantment(pSrcItem, true);
3811 if (pDstItem)
3812 {
3813 ApplyEnchantment(pDstItem, true);
3814 }
3815
3816 // Check bag swap with item exchange (one from empty in not bag possition (equipped (not possible in fact) or store)
3817 if (Bag* srcBag = pSrcItem->ToBag())
3818 {
3819 if (Bag* dstBag = pDstItem->ToBag())
3820 {
3821 Bag* emptyBag = nullptr;
3822 Bag* fullBag = nullptr;
3823 if (srcBag->IsEmpty() && !IsBagPos(src))
3824 {
3825 emptyBag = srcBag;
3826 fullBag = dstBag;
3827 }
3828 else if (dstBag->IsEmpty() && !IsBagPos(dst))
3829 {
3830 emptyBag = dstBag;
3831 fullBag = srcBag;
3832 }
3833
3834 // bag swap (with items exchange) case
3835 if (emptyBag && fullBag)
3836 {
3837 ItemTemplate const* emptyProto = emptyBag->GetTemplate();
3838
3839 uint32 count = 0;
3840
3841 for (uint32 i = 0; i < fullBag->GetBagSize(); ++i)
3842 {
3843 Item* bagItem = fullBag->GetItemByPos(i);
3844 if (!bagItem)
3845 continue;
3846
3847 ItemTemplate const* bagItemProto = bagItem->GetTemplate();
3848 if (!bagItemProto || !ItemCanGoIntoBag(bagItemProto, emptyProto))
3849 {
3850 // one from items not go to empty target bag
3852 return;
3853 }
3854
3855 ++count;
3856 }
3857
3858 if (count > emptyBag->GetBagSize())
3859 {
3860 // too small targeted bag
3862 return;
3863 }
3864
3865 // Items swap
3866 count = 0; // will pos in new bag
3867 for (uint32 i = 0; i < fullBag->GetBagSize(); ++i)
3868 {
3869 Item* bagItem = fullBag->GetItemByPos(i);
3870 if (!bagItem)
3871 continue;
3872
3873 fullBag->RemoveItem(i, true);
3874 emptyBag->StoreItem(count, bagItem, true);
3875 bagItem->SetState(ITEM_CHANGED, this);
3876
3877 ++count;
3878 }
3879 }
3880 }
3881 }
3882
3883 // now do moves, remove...
3884 RemoveItem(dstbag, dstslot, false, true);
3885 RemoveItem(srcbag, srcslot, false, true);
3886
3887 // add to dest
3888 if (IsInventoryPos(dst))
3889 StoreItem(sDest, pSrcItem, true);
3890 else if (IsBankPos(dst))
3891 BankItem(sDest, pSrcItem, true);
3892 else if (IsEquipmentPos(dst))
3893 EquipItem(eDest, pSrcItem, true);
3894
3895 // add to src
3896 if (IsInventoryPos(src))
3897 StoreItem(sDest2, pDstItem, true);
3898 else if (IsBankPos(src))
3899 BankItem(sDest2, pDstItem, true);
3900 else if (IsEquipmentPos(src))
3901 EquipItem(eDest2, pDstItem, true);
3902
3903 // Xinef: Call this here after all needed items are equipped
3905
3906 // if player is moving bags and is looting an item inside this bag
3907 // release the loot
3908 if (GetLootGUID())
3909 {
3910 bool released = false;
3911 if (IsBagPos(src))
3912 {
3913 Bag* bag = pSrcItem->ToBag();
3914 for (uint32 i = 0; i < bag->GetBagSize(); ++i)
3915 {
3916 if (Item* bagItem = bag->GetItemByPos(i))
3917 {
3918 // Xinef: Removed next loot generated check
3919 if (bagItem->GetGUID() == GetLootGUID())
3920 {
3922 released = true; // so we don't need to look at dstBag
3923 break;
3924 }
3925 }
3926 }
3927 }
3928
3929 if (!released && IsBagPos(dst))
3930 {
3931 Bag* bag = pDstItem->ToBag();
3932 for (uint32 i = 0; i < bag->GetBagSize(); ++i)
3933 {
3934 if (Item* bagItem = bag->GetItemByPos(i))
3935 {
3936 // Xinef: Removed next loot generated check
3937 if (bagItem->GetGUID() == GetLootGUID())
3938 {
3940 released = true; // not realy needed here
3941 break;
3942 }
3943 }
3944 }
3945 }
3946 }
3947
3949}
bool IsEmpty() const
Definition: Bag.cpp:179
Item * GetItemByPos(uint8 slot) const
Definition: Bag.cpp:235
void RemoveItem(uint8 slot, bool update)
Definition: Bag.cpp:143
void SendRefundInfo(Item *item)
Definition: Player.cpp:15470

References ApplyEnchantment(), AutoUnequipOffhandIfNeed(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), CanUnequipItem(), WorldSession::DoLootRelease(), EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_DEAD, EquipItem(), Bag::GetBagSize(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Bag::GetItemByPos(), GetLootGUID(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), Unit::IsAlive(), Item::IsBag(), IsBagPos(), IsBankPos(), Bag::IsEmpty(), IsEquipmentPos(), IsInventoryPos(), Object::IsInWorld(), Item::IsNotEmptyBag(), ITEM_CHANGED, ItemAddedQuestCheck(), ItemCanGoIntoBag(), ItemRemovedQuestCheck(), LOG_DEBUG, m_session, RemoveItem(), Bag::RemoveItem(), RemoveItemDependentAurasAndCasts(), SendEquipError(), SendRefundInfo(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), StoreItem(), Bag::StoreItem(), Item::ToBag(), and UpdateTitansGrip().

Referenced by WorldSession::HandleAutoEquipItemSlotOpcode(), WorldSession::HandleEquipmentSetUse(), item_commandscript::HandleItemMoveCommand(), WorldSession::HandleSwapInvItemOpcode(), and WorldSession::HandleSwapItem().

◆ SwapQuestSlot()

void Player::SwapQuestSlot ( uint16  slot1,
uint16  slot2 
)
inline
1497 {
1498 for (int i = 0; i < MAX_QUEST_OFFSET; ++i)
1499 {
1502
1505 }
1506 }

References Object::GetUInt32Value(), MAX_QUEST_OFFSET, PLAYER_QUEST_LOG_1_1, and Unit::SetUInt32Value().

Referenced by WorldSession::HandleQuestLogSwapQuest().

◆ TakeQuestSourceItem()

bool Player::TakeQuestSourceItem ( uint32  questId,
bool  msg 
)
1358{
1359 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1360 if (quest)
1361 {
1362 uint32 srcItemId = quest->GetSrcItemId();
1363 ItemTemplate const* item = sObjectMgr->GetItemTemplate(srcItemId);
1364
1365 if (srcItemId > 0)
1366 {
1367 uint32 count = quest->GetSrcItemCount();
1368 if (count <= 0)
1369 count = 1;
1370
1371 // exist two cases when destroy source quest item not possible:
1372 // a) non un-equippable item (equipped non-empty bag, for example)
1373 // b) when quest is started from an item and item also is needed in
1374 // the end as RequiredItemId
1375 InventoryResult res = CanUnequipItems(srcItemId, count);
1376 if (res != EQUIP_ERR_OK)
1377 {
1378 if (msg)
1379 SendEquipError(res, nullptr, nullptr, srcItemId);
1380 return false;
1381 }
1382
1383 bool destroyItem = true;
1384 for (uint8 n = 0; n < QUEST_ITEM_OBJECTIVES_COUNT; ++n)
1385 if (item->StartQuest == questId && srcItemId == quest->RequiredItemId[n])
1386 destroyItem = false;
1387
1388 if (destroyItem)
1389 DestroyItemCount(srcItemId, count, true, true);
1390 }
1391 }
1392
1393 return true;
1394}
uint32 StartQuest
Definition: ItemTemplate.h:668
InventoryResult CanUnequipItems(uint32 item, uint32 count) const
Definition: PlayerStorage.cpp:296
uint32 GetSrcItemCount() const
Definition: QuestDef.h:258
uint32 GetSrcItemId() const
Definition: QuestDef.h:257

References CanUnequipItems(), DestroyItemCount(), EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), QUEST_ITEM_OBJECTIVES_COUNT, Quest::RequiredItemId, SendEquipError(), sObjectMgr, and ItemTemplate::StartQuest.

Referenced by Spell::EffectQuestClear(), and WorldSession::HandleQuestLogRemoveQuest().

◆ TalkedToCreature()

void Player::TalkedToCreature ( uint32  entry,
ObjectGuid  guid 
)
2107{
2108 uint16 addTalkCount = 1;
2109 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2110 {
2111 uint32 questid = GetQuestSlotQuestId(i);
2112 if (!questid)
2113 continue;
2114
2115 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2116 if (!qInfo)
2117 continue;
2118
2119 QuestStatusData& q_status = m_QuestStatus[questid];
2120
2121 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2122 {
2124 {
2125 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
2126 {
2127 // skip Gameobject objectives
2128 if (qInfo->RequiredNpcOrGo[j] < 0)
2129 continue;
2130
2131 uint32 reqTarget = 0;
2132
2133 if (qInfo->RequiredNpcOrGo[j] > 0) // creature activate objectives
2134 // checked at quest_template loading
2135 reqTarget = qInfo->RequiredNpcOrGo[j];
2136 else
2137 continue;
2138
2139 if (reqTarget == entry)
2140 {
2141 uint32 reqTalkCount = qInfo->RequiredNpcOrGoCount[j];
2142 uint16 curTalkCount = q_status.CreatureOrGOCount[j];
2143 if (curTalkCount < reqTalkCount)
2144 {
2145 q_status.CreatureOrGOCount[j] = curTalkCount + addTalkCount;
2146
2147 m_QuestStatusSave[questid] = true;
2148
2149 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curTalkCount, addTalkCount);
2150 }
2151 if (CanCompleteQuest(questid))
2152 CompleteQuest(questid);
2153 else
2155
2156 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
2157 continue;
2158 }
2159 }
2160 }
2161 }
2162 }
2163}

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, GetQuestSlotQuestId(), Quest::HasSpecialFlag(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, and QuestStatusData::Status.

Referenced by npc_aged_dying_ancient_kodo::OnGossipHello(), brann_bronzebeard::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_razael_and_lyana::OnGossipSelect(), and npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI().

◆ TeamIdForRace()

TeamId Player::TeamIdForRace ( uint8  race)
static
5788{
5789 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race))
5790 {
5791 switch (rEntry->TeamID)
5792 {
5793 case 1:
5794 return TEAM_HORDE;
5795 case 7:
5796 return TEAM_ALLIANCE;
5797 }
5798 LOG_ERROR("entities.player", "Race ({}) has wrong teamid ({}) in DBC: wrong DBC files?", uint32(race), rEntry->TeamID);
5799 }
5800 else
5801 LOG_ERROR("entities.player", "Race ({}) not found in DBC: wrong DBC files?", uint32(race));
5802
5803 return TEAM_ALLIANCE;
5804}

References LOG_ERROR, sChrRacesStore, TEAM_ALLIANCE, and TEAM_HORDE.

Referenced by CharacterCache::GetCharacterTeamByGuid(), Unit::GetModelForForm(), GetTeamId(), WorldSession::HandleAddFriendOpcode(), WorldSession::HandleCalendarEventInvite(), WorldSession::HandleCharCreateOpcode(), WorldSession::HandleCharFactionOrRaceChangeCallback(), WorldSession::HandleSendMail(), misc_commandscript::HandleSkirmishCommand(), PlayerTaxi::InitTaxiNodesForLevel(), Channel::KickOrBan(), AchievementMgr::LoadFromDB(), and SetFactionForRace().

◆ TeleportTo() [1/2]

bool Player::TeleportTo ( uint32  mapid,
float  x,
float  y,
float  z,
float  orientation,
uint32  options = 0,
Unit target = nullptr,
bool  newInstance = false 
)
1331{
1332 if (!MapMgr::IsValidMapCoord(mapid, x, y, z, orientation))
1333 {
1334 LOG_ERROR("entities.player", "TeleportTo: invalid map ({}) or invalid coordinates (X: {}, Y: {}, Z: {}, O: {}) given when teleporting player ({}, name: {}, map: {}, X: {}, Y: {}, Z: {}, O: {}).",
1335 mapid, x, y, z, orientation, GetGUID().ToString(), GetName(), GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
1336 return false;
1337 }
1338
1340 {
1341 LOG_ERROR("entities.player", "Player ({}, name: {}) tried to enter a forbidden map {}", GetGUID().ToString(), GetName(), mapid);
1343 return false;
1344 }
1345
1346 // preparing unsummon pet if lost (we must get pet before teleportation or will not find it later)
1347 Pet* pet = GetPet();
1348
1349 MapEntry const* mEntry = sMapStore.LookupEntry(mapid);
1350
1351 // don't let enter battlegrounds without assigned battleground id (for example through areatrigger)...
1352 if (!InBattleground() && mEntry->IsBattlegroundOrArena())
1353 return false;
1354
1355 // pussywizard: arena spectator, prevent teleporting from arena to instance/etc
1356 if (GetMapId() != mapid && IsSpectator() && mEntry->Instanceable())
1357 {
1359 return false;
1360 }
1361
1362 // client without expansion support
1363 if (GetSession()->Expansion() < mEntry->Expansion())
1364 {
1365 LOG_DEBUG("maps", "Player {} using client without required expansion tried teleport to non accessible map {}", GetName(), mapid);
1366
1367 if (GetTransport())
1368 {
1370 m_transport = nullptr;
1373 RepopAtGraveyard(); // teleport to near graveyard if on transport, looks blizz like :)
1374 }
1375
1377
1378 return false; // normal client can't teleport to this map...
1379 }
1380 else
1381 LOG_DEBUG("maps", "Player {} is being teleported to map {}", GetName(), mapid);
1382
1383 // xinef: do this here in case teleport failed in above checks
1384 if (!(options & TELE_TO_NOT_LEAVE_TAXI) && IsInFlight())
1385 {
1388 }
1389
1390 if (!(options & TELE_TO_NOT_LEAVE_VEHICLE) && m_vehicle)
1391 ExitVehicle();
1392
1393 // reset movement flags at teleport, because player will continue move with these flags after teleport
1395 DisableSpline();
1396
1397 // Xinef: Remove all movement imparing effects auras, skip small teleport like blink
1398 if (mapid != GetMapId() || GetDistance2d(x, y) > 100)
1399 {
1404 // remove auras that should be removed when being teleported
1406 }
1407
1408 if (m_transport)
1409 {
1410 if (options & TELE_TO_NOT_LEAVE_TRANSPORT)
1412 else
1413 {
1415 m_transport = nullptr;
1418 }
1419 }
1420
1421 // The player was ported to another map and loses the duel immediately.
1422 // We have to perform this check before the teleport, otherwise the
1423 // ObjectAccessor won't find the flag.
1426
1427 if (!sScriptMgr->OnBeforePlayerTeleport(this, mapid, x, y, z, orientation, options, target))
1428 return false;
1429
1430 if (GetMapId() == mapid && !newInstance)
1431 {
1432 //lets reset far teleport flag if it wasn't reset during chained teleports
1434
1435 SetHasDelayedTeleport(false); // pussywizard: current teleport cancels stored one
1436 //if teleport spell is casted in Unit::Update() func
1437 //then we need to delay it until update process will be finished
1438 if (MustDelayTeleport())
1439 {
1442 //lets save teleport destination for player
1443 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1444 teleportStore_options = options;
1445 return true;
1446 }
1447
1448 if (options & TELE_TO_WITH_PET)
1450
1451 if (!(options & TELE_TO_NOT_UNSUMMON_PET))
1452 {
1453 //same map, only remove pet if out of range for new position
1454 if (pet && !pet->IsWithinDist3d(x, y, z, GetMap()->GetVisibilityRange()))
1456 }
1457
1458 if (!(options & TELE_TO_NOT_LEAVE_COMBAT))
1459 CombatStop();
1460
1461 // this will be used instead of the current location in SaveToDB
1462 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1464
1465 // code for finish transfer called in WorldSession::HandleMovementOpcodes()
1466 // at client packet MSG_MOVE_TELEPORT_ACK
1468 // near teleport, triggering send MSG_MOVE_TELEPORT_ACK from client at landing
1469 if (!GetSession()->PlayerLogout())
1470 {
1471 SetCanTeleport(true);
1472 Position oldPos = GetPosition();
1473 Relocate(x, y, z, orientation);
1475 SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place
1476 }
1477 }
1478 else
1479 {
1481 {
1483 return false;
1484 }
1485
1486 // far teleport to another map
1487 Map* oldmap = IsInWorld() ? GetMap() : nullptr;
1488 // check if we can enter before stopping combat / removing pet / totems / interrupting spells
1489
1490 // Check enter rights before map getting to avoid creating instance copy for player
1491 // this check not dependent from map instance copy and same for all instance copies of selected map
1492 if (!(options & TELE_TO_GM_MODE) && sMapMgr->PlayerCannotEnter(mapid, this, false))
1493 return false;
1494
1495 // if PlayerCannotEnter -> CanEnter: checked above
1496 {
1497 //lets reset near teleport flag if it wasn't reset during chained teleports
1499
1500 SetHasDelayedTeleport(false); // pussywizard: current teleport cancels stored one
1501 //if teleport spell is casted in Unit::Update() func
1502 //then we need to delay it until update process will be finished
1503 if (MustDelayTeleport())
1504 {
1507 //lets save teleport destination for player
1508 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1509 teleportStore_options = options;
1510 return true;
1511 }
1512
1514
1515 CombatStop();
1516
1517 // remove arena spell coldowns/buffs now to also remove pet's cooldowns before it's temporarily unsummoned
1519 {
1520 // KEEP THIS ORDER!
1522 if (pet)
1523 pet->RemoveArenaAuras();
1524
1526 }
1527
1528 // remove pet on map change
1529 if (pet)
1531
1532 // remove all dyn objects
1534
1535 // stop spellcasting
1536 // not attempt interrupt teleportation spell at caster teleport
1537 if (!(options & TELE_TO_SPELL))
1538 if (IsNonMeleeSpellCast(true))
1540
1541 //remove auras before removing from map...
1543
1544 if (!GetSession()->PlayerLogout())
1545 {
1546 // send transfer packets
1547 WorldPacket data(SMSG_TRANSFER_PENDING, 4 + 4 + 4);
1548 data << uint32(mapid);
1549 if (m_transport)
1550 data << m_transport->GetEntry() << GetMapId();
1551
1552 GetSession()->SendPacket(&data);
1553 }
1554
1555 // remove from old map now
1556 if (oldmap)
1557 oldmap->RemovePlayerFromMap(this, false);
1558
1559 // xinef: do this before setting fall information!
1560 if (IsMounted() && (!GetMap()->GetEntry()->IsDungeon() && !GetMap()->GetEntry()->IsBattlegroundOrArena()) && !m_transport)
1561 {
1563 if (!auras.empty())
1564 {
1565 SetMountBlockId((*auras.begin())->GetId());
1567 }
1568 }
1569
1570 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1572 // if the player is saved before worldportack (at logout for example)
1573 // this will be used instead of the current location in SaveToDB
1574
1575 if (!GetSession()->PlayerLogout())
1576 {
1577 SetCanTeleport(true);
1578 WorldPacket data(SMSG_NEW_WORLD, 4 + 4 + 4 + 4 + 4);
1579 data << uint32(mapid);
1580 if (m_transport)
1582 else
1584
1585 GetSession()->SendPacket(&data);
1587 }
1588
1589 // move packet sent by client always after far teleport
1590 // code for finish transfer to new map called in WorldSession::HandleMoveWorldportAckOpcode at client packet
1592 }
1593 }
1594 return true;
1595}
@ AURA_INTERRUPT_FLAG_TELEPORTED
Definition: SpellDefines.h:66
@ AURA_INTERRUPT_FLAG_MOVE
Definition: SpellDefines.h:47
@ AURA_INTERRUPT_FLAG_TURNING
Definition: SpellDefines.h:48
@ SPELL_AURA_MOD_CONFUSE
Definition: SpellAuraDefines.h:68
@ TELE_TO_WITH_PET
Definition: Player.h:827
@ TELE_TO_NOT_LEAVE_TAXI
Definition: Player.h:828
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition: Player.h:826
@ TELE_TO_SPELL
Definition: Player.h:825
@ TELE_TO_NOT_LEAVE_COMBAT
Definition: Player.h:823
@ TELE_TO_NOT_UNSUMMON_PET
Definition: Player.h:824
@ TELE_TO_GM_MODE
Definition: Player.h:821
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition: Player.h:822
@ TRANSFER_ABORT_MAP_NOT_ALLOWED
Definition: Player.h:798
@ MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE
Movement flags that have change status opcodes associated for players.
Definition: UnitDefines.h:393
@ CLASS_CONTEXT_TELEPORT
Definition: UnitDefines.h:207
@ SMSG_NEW_WORLD
Definition: Opcodes.h:92
@ SMSG_TRANSFER_PENDING
Definition: Opcodes.h:93
bool IsWithinDist3d(float x, float y, float z, float dist) const
Definition: Object.cpp:1295
float GetDistance2d(WorldObject const *obj) const
Definition: Object.cpp:1263
Position GetPosition() const
Definition: Position.h:143
Position::PositionXYZOStreamer PositionXYZOStream()
Definition: Position.h:150
bool HasPendingSpectatorForBG(uint32 bgInstanceId) const
Definition: Player.h:2557
void SendTeleportAckPacket()
Definition: Player.cpp:1321
void SetSelection(ObjectGuid guid)
Used for serverside target changes, does not apply to players.
Definition: Player.cpp:11508
void SendSavedInstances()
Definition: PlayerStorage.cpp:6571
void SetSemaphoreTeleportNear(time_t tm)
Definition: Player.h:2070
void SetHasDelayedTeleport(bool setting)
Definition: Player.h:2911
void SetSemaphoreTeleportFar(time_t tm)
Definition: Player.h:2071
bool MustDelayTeleport() const
Definition: Player.h:2908
void CleanupAfterTaxiFlight()
Definition: Player.cpp:10384
void RemoveArenaSpellCooldowns(bool removeActivePetCooldowns=false)
Definition: Player.cpp:3519
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
uint32 GetUnitMovementFlags() const
Definition: Unit.h:1618
Vehicle * m_vehicle
Definition: Unit.h:1877
void SendTeleportPacket(Position &pos)
Definition: Unit.cpp:19936
void SetUnitMovementFlags(uint32 f)
Definition: Unit.h:1619
void RemoveAllDynObjects()
Definition: Unit.cpp:6117
void RemoveArenaAuras()
Definition: Unit.cpp:5289
virtual void RemovePlayerFromMap(Player *, bool)
Definition: Map.cpp:911
bool IsBattleArena() const
Definition: DBCStructure.h:1356

References Unit::AddUnitMovementFlag(), AURA_INTERRUPT_FLAG_CHANGE_MAP, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TELEPORTED, AURA_INTERRUPT_FLAG_TURNING, CLASS_CONTEXT_TELEPORT, CLASS_DEATH_KNIGHT, CleanupAfterTaxiFlight(), Unit::CombatStop(), DISABLE_TYPE_MAP, Unit::DisableSpline(), duel, DUEL_FLED, DuelComplete(), ObjectGuid::Empty, Unit::ExitVehicle(), MapEntry::Expansion(), Unit::GetAuraEffectsByType(), GetBattlegroundId(), WorldObject::GetDistance2d(), Object::GetEntry(), Unit::GetGameObject(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGuidValue(), WorldObject::GetMap(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), WorldObject::GetName(), Position::GetOrientation(), GetPet(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), WorldObject::GetTransport(), Unit::GetUnitMovementFlags(), WorldObject::GetVisibilityRange(), HasPendingSpectatorForBG(), HasSpell(), InBattleground(), MapEntry::Instanceable(), Unit::InterruptNonMeleeSpells(), MapEntry::IsBattleArena(), MapEntry::IsBattlegroundOrArena(), IsClass(), DisableMgr::IsDisabledFor(), IsGameMaster(), Unit::IsInFlight(), Object::IsInWorld(), Unit::IsMounted(), Unit::IsNonMeleeSpellCast(), AccountMgr::IsPlayerAccount(), IsSpectator(), MapMgr::IsValidMapCoord(), WorldObject::IsWithinDist3d(), LOG_DEBUG, LOG_ERROR, WorldObject::m_movementInfo, WorldObject::m_transport, Unit::m_vehicle, MotionMaster::MovementExpired(), MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE, MOVEMENTFLAG_ONTRANSPORT, MustDelayTeleport(), PLAYER_DUEL_ARBITER, MovementInfo::TransportInfo::pos, Position::PositionXYZOStream(), Position::Relocate(), Unit::RemoveAllDynObjects(), Unit::RemoveArenaAuras(), RemoveArenaSpellCooldowns(), Unit::RemoveAurasByType(), Unit::RemoveAurasWithInterruptFlags(), MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), Map::RemovePlayerFromMap(), RepopAtGraveyard(), MovementInfo::TransportInfo::Reset(), WorldSession::SendPacket(), SendSavedInstances(), SendTeleportAckPacket(), Unit::SendTeleportPacket(), SendTransferAborted(), SetCanTeleport(), SetFallInformation(), SetHasDelayedTeleport(), SetMountBlockId(), SetSelection(), SetSemaphoreTeleportFar(), SetSemaphoreTeleportNear(), Unit::SetUnitMovementFlags(), sMapMgr, sMapStore, SMSG_NEW_WORLD, SMSG_TRANSFER_PENDING, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_MOUNTED, sScriptMgr, TELE_TO_GM_MODE, TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TAXI, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, teleportStore_dest, teleportStore_options, Position::ToString(), TRANSFER_ABORT_INSUF_EXPAN_LVL, TRANSFER_ABORT_MAP_NOT_ALLOWED, TRANSFER_ABORT_UNIQUE_MESSAGE, MovementInfo::transport, and UnsummonPetTemporaryIfAny().

Referenced by ActivateTaxiPathTo(), BattlegroundSA::CaptureGraveyard(), BattlegroundSA::DefendersPortalTeleport(), MotionTransport::DelayedTeleportTransport(), BattlegroundIC::DoAction(), go_commandscript::DoTeleport(), Spell::EffectTeleportUnits(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleWorldTeleportOpcode(), Unit::NearTeleportTo(), npc_wg_spirit_guide::OnGossipSelect(), lfg::LFGPlayerScript::OnMapChanged(), BattlefieldWG::OnPlayerJoinWar(), at_orb_of_command::OnTrigger(), at_icc_saurfang_portal::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_last_rites::OnTrigger(), BfGraveyard::RelocateDeadPlayers(), Battleground::RelocateDeadPlayers(), Map::RemoveAllPlayers(), RepopAtGraveyard(), ResurectUsingRequestData(), WorldSession::SendSpiritResurrect(), BattlegroundMgr::SendToBattleground(), SummonIfPossible(), lfg::LFGMgr::TeleportPlayer(), GmTicket::TeleportTo(), TeleportTo(), BattlegroundSA::TeleportToEntrancePosition(), TeleportToEntryPoint(), Update(), and GameObject::Use().

◆ TeleportTo() [2/2]

bool Player::TeleportTo ( WorldLocation const &  loc,
uint32  options = 0,
Unit target = nullptr 
)
inline
1092 {
1093 return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options, target);
1094 }

References WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and TeleportTo().

◆ TeleportToEntryPoint()

◆ TextEmote() [1/2]

void Player::TextEmote ( std::string_view  text,
WorldObject const *  = nullptr,
bool  = false 
)
overridevirtual

Outputs an universal text which is supposed to be an action.

Reimplemented from Unit.

9337{
9338 std::string _text(text);
9339
9340 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text))
9341 {
9342 return;
9343 }
9344
9345 sScriptMgr->OnPlayerChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text);
9346
9347 WorldPacket data;
9349
9350 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, false, !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE), true);
9351}
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE
Definition: IWorld.h:164
@ CONFIG_LISTEN_RANGE_TEXTEMOTE
Definition: IWorld.h:200
@ CHAT_MSG_EMOTE
Definition: SharedDefines.h:3162
@ LANG_UNIVERSAL
Definition: SharedDefines.h:735

References ChatHandler::BuildChatPacket(), CHAT_MSG_EMOTE, CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, LANG_UNIVERSAL, SendMessageToSetInRange(), sScriptMgr, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ TextEmote() [2/2]

void Player::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
overridevirtual

Reimplemented from Unit.

9354{
9355 Talk(textId, CHAT_MSG_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
9356}

References CHAT_MSG_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToggleAFK()

void Player::ToggleAFK ( )
1290{
1292
1293 // afk player not allowed in battleground
1294 if (!IsGameMaster() && isAFK() && InBattleground())
1296}
void ToggleFlag(uint16 index, uint32 flag)
Definition: Object.cpp:877
void LeaveBattleground(Battleground *bg=nullptr)
Definition: Player.cpp:11275

References InBattleground(), isAFK(), IsGameMaster(), LeaveBattleground(), PLAYER_FLAGS, PLAYER_FLAGS_AFK, and Object::ToggleFlag().

Referenced by Battleground::AddPlayer(), WorldSession::HandleMessagechatOpcode(), Battlefield::PlayerAcceptInviteToWar(), and Unit::SetCharmedBy().

◆ ToggleDND()

void Player::ToggleDND ( )

◆ ToggleInstantFlight()

void Player::ToggleInstantFlight ( )

References m_isInstantFlightOn.

Referenced by OnGossipSelect().

◆ ToggleMetaGemsActive()

void Player::ToggleMetaGemsActive ( uint8  exceptslot,
bool  apply 
)
11206{
11207 //cycle all equipped items
11208 for (int slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
11209 {
11210 //enchants for the slot being socketed are handled by WorldSession::HandleSocketOpcode(WorldPacket& recvData)
11211 if (slot == exceptslot)
11212 continue;
11213
11214 Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
11215
11216 if (!pItem || !pItem->GetTemplate()->Socket[0].Color) //if item has no sockets or no item is equipped go to next item
11217 continue;
11218
11219 //cycle all (gem)enchants
11220 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
11221 {
11222 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11223 if (!enchant_id) //if no enchant go to next enchant(slot)
11224 continue;
11225
11226 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11227 if (!enchantEntry)
11228 continue;
11229
11230 //only metagems to be (de)activated, so only enchants with condition
11231 uint32 condition = enchantEntry->EnchantmentCondition;
11232 if (condition)
11233 ApplyEnchantment(pItem, EnchantmentSlot(enchant_slot), apply);
11234 }
11235 }
11236}

References ApplyEnchantment(), _Socket::Color, SpellItemEnchantmentEntry::EnchantmentCondition, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetEnchantmentId(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, SOCK_ENCHANTMENT_SLOT, ItemTemplate::Socket, and sSpellItemEnchantmentStore.

Referenced by WorldSession::HandleSocketOpcode().

◆ TradeCancel()

void Player::TradeCancel ( bool  sendback)
4104{
4105 if (m_trade)
4106 {
4107 Player* trader = m_trade->GetTrader();
4108
4109 // send yellow "Trade canceled" message to both traders
4110 if (sendback)
4112
4113 trader->GetSession()->SendCancelTrade();
4114
4115 // cleanup
4116 delete m_trade;
4117 m_trade = nullptr;
4118 delete trader->m_trade;
4119 trader->m_trade = nullptr;
4120 }
4121}
void SendCancelTrade()
Definition: TradeHandler.cpp:529

References GetSession(), TradeData::GetTrader(), m_trade, and WorldSession::SendCancelTrade().

Referenced by ActivateTaxiPathTo(), CleanupsBeforeDelete(), WorldSession::HandleCancelTradeOpcode(), and WorldSession::HandleSocketClosed().

◆ UninviteFromGroup()

void Player::UninviteFromGroup ( )
  • If the player is invited, remove him. If the group if then only 1 person, disband the group.
2317{
2318 Group* group = GetGroupInvite();
2319 if (!group)
2320 return;
2321
2322 group->RemoveInvite(this);
2323
2324 if (group->IsCreated())
2325 {
2326 if (group->GetMembersCount() <= 1) // group has just 1 member => disband
2327 {
2328 group->Disband(true);
2329 group = nullptr; // gets deleted in disband
2330 }
2331 }
2332 else
2333 {
2334 if (group->GetInviteeCount() <= 1)
2335 {
2336 group->RemoveAllInvites();
2337 delete group;
2338 group = nullptr;
2339 }
2340 }
2341}
Group * GetGroupInvite()
Definition: Player.h:2443
bool IsCreated() const
Definition: Group.cpp:2286
void RemoveAllInvites()
Definition: Group.cpp:363
void Disband(bool hideDestroy=false)
Definition: Group.cpp:755
void RemoveInvite(Player *player)
Definition: Group.cpp:353
uint32 GetInviteeCount() const
Definition: Group.h:246

References Group::Disband(), GetGroupInvite(), Group::GetInviteeCount(), Group::GetMembersCount(), Group::IsCreated(), Group::RemoveAllInvites(), and Group::RemoveInvite().

Referenced by WorldSession::HandleGroupDeclineOpcode(), and WorldSession::LogoutPlayer().

◆ UnsummonPetTemporaryIfAny()

void Player::UnsummonPetTemporaryIfAny ( )

◆ Update()

void Player::Update ( uint32  time)
overridevirtual
Todo:
add weapon, skill check

Reimplemented from WorldObject.

53{
54 if (!IsInWorld())
55 return;
56
57 sScriptMgr->OnBeforePlayerUpdate(this, p_time);
58
59 // undelivered mail
61 {
64
65 // It will be recalculate at mailbox open (for unReadMails important
66 // non-0 until mailbox open, it also will be recalculated)
67 m_nextMailDelivereTime = time_t(0);
68 }
69
70 // Update cinematic location, if 500ms have passed and we're doing a
71 // cinematic now.
74 {
77 }
78
79 // used to implement delayed far teleports
81 Unit::Update(p_time);
83
84 time_t now = GameTime::GetGameTime().count();
85
86 UpdatePvPFlag(now);
88
89 UpdateContestedPvP(p_time);
90
91 UpdateDuelFlag(now);
92
94
95 UpdateAfkReport(now);
96
97 // Xinef: update charm AI only if we are controlled by creature or
98 // non-posses player charm
100 {
101 m_charmUpdateTimer += p_time;
102 if (m_charmUpdateTimer >= 1000)
103 {
105 if (Unit* charmer = GetCharmer())
106 if (charmer->IsAlive())
108 }
109 }
110
111 time_t lastTick = m_Last_tick;
112 if (now > m_Last_tick)
113 {
114 // Update items that have just a limited lifetime
116
117 // check every minute, less chance to crash and wont break anything.
119
120 // Played time
121 uint32 elapsed = uint32(now - m_Last_tick);
122 m_Played_time[PLAYED_TIME_TOTAL] += elapsed; // Total played time
123 m_Played_time[PLAYED_TIME_LEVEL] += elapsed; // Level played time
124 GetSession()->SetTotalTime(GetSession()->GetTotalTime() + elapsed);
125 m_Last_tick = now;
126 }
127
128 // If mute expired, remove it from the DB
129 if (GetSession()->m_muteTime && GetSession()->m_muteTime < now)
130 {
131 GetSession()->m_muteTime = 0;
133 LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
134 stmt->SetData(0, 0); // Set the mute time to 0
135 stmt->SetData(1, "");
136 stmt->SetData(2, "");
137 stmt->SetData(3, GetSession()->GetAccountId());
138 LoginDatabase.Execute(stmt);
139 }
140
141 if (!m_timedquests.empty())
142 {
143 QuestSet::iterator iter = m_timedquests.begin();
144 while (iter != m_timedquests.end())
145 {
146 QuestStatusData& q_status = m_QuestStatus[*iter];
147 if (q_status.Timer <= p_time)
148 {
149 uint32 quest_id = *iter;
150 ++iter; // current iter will be removed in FailQuest
151 FailQuest(quest_id);
152 }
153 else
154 {
155 q_status.Timer -= p_time;
156 m_QuestStatusSave[*iter] = true;
157 ++iter;
158 }
159 }
160 }
161
162 m_achievementMgr->Update(p_time);
163
165 {
166 if (Unit* victim = GetVictim())
167 {
168 // default combat reach 10
170
172 {
173 if (!IsWithinMeleeRange(victim))
174 {
176 if (m_swingErrorMsg != 1) // send single time (client auto repeat)
177 {
179 m_swingErrorMsg = 1;
180 }
181 }
182 // 120 degrees of radiant range
183 else if (!HasInArc(2 * M_PI / 3, victim))
184 {
186 if (m_swingErrorMsg != 2) // send single time (client auto repeat)
187 {
189 m_swingErrorMsg = 2;
190 }
191 }
192 else
193 {
194 m_swingErrorMsg = 0; // reset swing error state
195
196 // prevent base and off attack in same time, delay attack at
197 // 0.2 sec
198 if (haveOffhandWeapon())
201
202 // do attack
205 }
206 }
207
209 {
210 if (!IsWithinMeleeRange(victim))
212 else if (!HasInArc(2 * M_PI / 3, victim))
214 else
215 {
216 // prevent base and off attack in same time, delay attack at
217 // 0.2 sec
220
221 // do attack
224 }
225 }
226
227 /*Unit* owner = victim->GetOwner();
228 Unit* u = owner ? owner : victim;
229 if (u->IsPvP() && (!duel || duel->opponent != u))
230 {
231 UpdatePvP(true);
232 RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
233 }*/
234 }
235 }
236
238 {
239 if (now > lastTick && _restTime > 0) // freeze update
240 {
241 time_t currTime = GameTime::GetGameTime().count();
242 time_t timeDiff = currTime - _restTime;
243 if (timeDiff >= 10) // freeze update
244 {
245 _restTime = currTime;
246
247 float bubble = 0.125f * sWorld->getRate(RATE_REST_INGAME);
248 float extraPerSec =
249 ((float) GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 72000.0f) *
250 bubble;
251
252 // speed collect rest bonus (section/in hour)
253 SetRestBonus(GetRestBonus() + timeDiff * extraPerSec);
254 }
255 }
256 }
257
258 if (m_weaponChangeTimer > 0)
259 {
260 if (p_time >= m_weaponChangeTimer)
262 else
263 m_weaponChangeTimer -= p_time;
264 }
265
266 if (!IsPositionValid()) // pussywizard: will crash below at eg. GetZoneAndAreaId
267 {
268 LOG_INFO("misc", "Player::Update - invalid position ({:0.1f}, {:0.1f}, {:0.1f})! Map: {}, MapId: {}, {}",
270 GetSession()->KickPlayer("Invalid position");
271 return;
272 }
273
274 if (m_zoneUpdateTimer > 0)
275 {
276 if (p_time >= m_zoneUpdateTimer)
277 {
278 // On zone update tick check if we are still in an inn if we are
279 // supposed to be in one
281 {
282 AreaTrigger const* atEntry = sObjectMgr->GetAreaTrigger(GetInnTriggerId());
283 if (!atEntry || !IsInAreaTriggerRadius(atEntry, 5.f))
284 {
286 }
287 }
288
289 uint32 newzone, newarea;
290 GetZoneAndAreaId(newzone, newarea);
291
292 if (m_zoneUpdateId != newzone)
293 UpdateZone(newzone, newarea); // also update area
294 else
295 {
296 // use area updates as well
297 // needed for free far all arenas for example
298 if (m_areaUpdateId != newarea)
299 UpdateArea(newarea);
300 }
301
303 }
304 else
305 m_zoneUpdateTimer -= p_time;
306 }
307
308 sScriptMgr->OnPlayerUpdate(this, p_time);
309
310 if (IsAlive())
311 {
312 m_regenTimer += p_time;
314 }
315
316 if (m_deathState == DeathState::JustDied)
317 KillPlayer();
318
319 if (m_nextSave)
320 {
321 if (p_time >= m_nextSave)
322 {
323 // m_nextSave reset in SaveToDB call
324 SaveToDB(false, false);
325 LOG_DEBUG("entities.player", "Player::Update: Player '{}' ({}) saved", GetName(), GetGUID().ToString());
326 }
327 else
328 {
329 m_nextSave -= p_time;
330 }
331 }
332
333 // Handle Water/drowning
334 HandleDrowning(p_time);
335
336 if (GetDrunkValue())
337 {
338 m_drunkTimer += p_time;
341 }
342
343 if (HasPendingBind())
344 {
345 if (_pendingBindTimer <= p_time)
346 {
347 // Player left the instance
350 SetPendingBind(0, 0);
351 }
352 else
353 _pendingBindTimer -= p_time;
354 }
355
356 // not auto-free ghost from body in instances
357 if (m_deathTimer > 0 && !GetMap()->Instanceable() &&
359 {
360 if (p_time >= m_deathTimer)
361 {
362 m_deathTimer = 0;
365 }
366 else
367 m_deathTimer -= p_time;
368 }
369
370 UpdateEnchantTime(p_time);
371 UpdateHomebindTime(p_time);
372
373 if (!_instanceResetTimes.empty())
374 {
375 for (InstanceTimeMap::iterator itr = _instanceResetTimes.begin();
376 itr != _instanceResetTimes.end();)
377 {
378 if (itr->second < now)
379 _instanceResetTimes.erase(itr++);
380 else
381 ++itr;
382 }
383 }
384
385 // group update
387
388 Pet* pet = GetPet();
389 if (pet && !pet->IsWithinDistInMap(this, GetMap()->GetVisibilityRange()) &&
390 !pet->isPossessed())
391 // if (pet && !pet->IsWithinDistInMap(this,
392 // GetMap()->GetVisibilityDistance()) && (GetCharmGUID() &&
393 // (pet->GetGUID()
394 // != GetCharmGUID())))
396
397 // pussywizard:
398 if (m_hostileReferenceCheckTimer <= p_time)
399 {
401 if (!GetMap()->IsDungeon())
404 }
405 else
407
408 // we should execute delayed teleports only for alive(!) players
409 // because we don't want player's ghost teleported from graveyard
410 // xinef: so we store it to the end of the world and teleport out of the ass
411 // after resurrection?
412 if (HasDelayedTeleport() /* && IsAlive()*/)
413 {
416 }
417
419 {
421 UpdateObjectVisibility(true, true);
424 }
425}
@ NOTIFY_VISIBILITY_CHANGED
Definition: Object.h:67
constexpr auto CINEMATIC_UPDATEDIFF
Definition: CinematicMgr.h:24
constexpr auto ZONE_UPDATE_INTERVAL
Definition: PlayerUpdates.cpp:50
#define ATTACK_DISPLAY_DELAY
Definition: Unit.h:624
@ UNIT_STATE_CHARGING
Definition: UnitDefines.h:166
@ UNIT_STATE_CASTING
Definition: UnitDefines.h:164
@ UNIT_FLAG_POSSESSED
Definition: UnitDefines.h:253
@ RATE_REST_INGAME
Definition: IWorld.h:502
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
Definition: DatabaseEnv.cpp:22
@ LOGIN_UPD_MUTE_TIME
Definition: LoginDatabase.h:72
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition: Timer.h:131
void Update(uint32 timeDiff)
Definition: AchievementMgr.cpp:2188
void deleteReferencesOutOfRange(float range)
Definition: HostileRefMgr.cpp:199
void RemoveFromNotify(uint16 f)
Definition: Object.h:567
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition: Position.cpp:140
std::vector< FlyByCamera > const * m_cinematicCamera
Definition: CinematicMgr.h:54
uint32 m_cinematicDiff
Definition: CinematicMgr.h:50
uint32 m_lastCinematicCheck
Definition: CinematicMgr.h:51
uint32 m_activeCinematicCameraId
Definition: CinematicMgr.h:52
void UpdateCinematicLocation(uint32 diff)
Definition: CinematicMgr.cpp:92
void UpdateEnchantTime(uint32 time)
Definition: PlayerStorage.cpp:4177
uint32 GetInnTriggerId() const
Definition: Player.h:1200
void UpdateContestedPvP(uint32 currTime)
Definition: PlayerMisc.cpp:360
void SendAttackSwingBadFacingAttack()
Definition: PlayerMisc.cpp:146
void SendUpdateToOutOfRangeGroupMembers()
Definition: Player.cpp:11657
void KillPlayer()
Definition: Player.cpp:4493
void UpdateDuelFlag(time_t currTime)
Definition: PlayerMisc.cpp:423
bool HasRestFlag(RestFlag restFlag) const
Definition: Player.h:1197
bool HasDelayedTeleport() const
Definition: Player.h:2910
void SendAttackSwingNotInRange()
Definition: PlayerMisc.cpp:78
void UpdateSoulboundTradeItems()
Definition: PlayerStorage.cpp:4123
void RemoveRestFlag(RestFlag restFlag)
Definition: Player.cpp:16115
void CheckDuelDistance(time_t currTime)
Definition: Player.cpp:6326
void UpdatePvPFlag(time_t currTime)
Definition: PlayerMisc.cpp:372
void HandleSobering()
The player sobers by 1% every 9 seconds.
Definition: Player.cpp:951
void UpdateFFAPvPFlag(time_t currTime)
Definition: PlayerMisc.cpp:391
void BindToInstance()
Definition: PlayerStorage.cpp:6522
void FailQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:880
void HandleDrowning(uint32 time_diff)
Definition: Player.cpp:834
void UpdateCharmedAI()
Definition: PlayerUpdates.cpp:1904
void UpdateHomebindTime(uint32 time)
Definition: PlayerUpdates.cpp:1347
bool IsInAreaTriggerRadius(AreaTrigger const *trigger, float delta=0.f) const
Definition: Player.cpp:2183
void RegenerateAll()
Definition: Player.cpp:1752
void UpdateAfkReport(time_t currTime)
checks the 15 afk reports per 5 minutes limit
Definition: PlayerMisc.cpp:351
bool IsCharmed() const
Definition: Unit.h:1214
Unit * GetCharmer() const
Definition: Unit.cpp:10553
bool haveOffhandWeapon() const
Definition: Unit.cpp:522
void setAttackTimer(WeaponAttackType type, int32 time)
Definition: Unit.h:680
bool IsWithinMeleeRange(Unit const *obj, float dist=0.f) const
Definition: Unit.cpp:665
bool bRequestForcedVisibilityUpdate
Definition: Unit.h:1756
bool isPossessed() const
Definition: Unit.h:1215
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition: Unit.cpp:2532
void Update(uint32 time) override
Definition: Unit.cpp:383
int32 getAttackTimer(WeaponAttackType type) const
Definition: Unit.h:682
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition: Unit.h:683
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition: Unit.cpp:643
uint16 m_delayed_unit_relocation_timer
Definition: Unit.h:1754
Definition: ObjectMgr.h:421
void SetTotalTime(uint32 TotalTime)
Definition: WorldSession.h:375
void KickPlayer(bool setKicked=true)
Definition: WorldSession.h:400

References _cinematicMgr, _instanceResetTimes, _pendingBindId, _pendingBindTimer, _restTime, ATTACK_DISPLAY_DELAY, Unit::AttackerStateUpdate(), BASE_ATTACK, BindToInstance(), Unit::bRequestForcedVisibilityUpdate, BuildPlayerRepop(), CheckDuelDistance(), CINEMATIC_UPDATEDIFF, HostileRefMgr::deleteReferencesOutOfRange(), FailQuest(), WorldObject::FindMap(), Unit::getAttackTimer(), Unit::GetCharmer(), GetDrunkValue(), GameTime::GetGameTime(), Object::GetGUID(), Unit::getHostileRefMgr(), GetInnTriggerId(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), getMSTime(), GetMSTimeDiffToNow(), WorldObject::GetName(), GetPet(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetRestBonus(), GetSession(), Object::GetUInt32Value(), Unit::GetVictim(), WorldObject::GetVisibilityRange(), WorldObject::GetZoneAndAreaId(), HandleDrowning(), HandleSobering(), Unit::HasAuraType(), HasDelayedTeleport(), Position::HasInArc(), HasPendingBind(), HasPlayerFlag(), HasRestFlag(), Unit::HasUnitFlag(), Unit::HasUnitState(), Unit::haveOffhandWeapon(), IN_MILLISECONDS, Unit::IsAlive(), Unit::isAttackReady(), IsBeingTeleported(), Unit::IsCharmed(), IsInAreaTriggerRadius(), Object::IsInWorld(), Position::IsPositionValid(), Unit::isPossessed(), WorldObject::IsWithinDistInMap(), Unit::IsWithinMeleeRange(), WorldSession::KickPlayer(), KillPlayer(), LOG_DEBUG, LOG_INFO, LOGIN_UPD_MUTE_TIME, LoginDatabase, m_achievementMgr, CinematicMgr::m_activeCinematicCameraId, m_areaUpdateId, m_charmUpdateTimer, CinematicMgr::m_cinematicCamera, CinematicMgr::m_cinematicDiff, Unit::m_deathState, m_deathTimer, Unit::m_delayed_unit_relocation_timer, m_drunkTimer, m_hostileReferenceCheckTimer, m_Last_tick, CinematicMgr::m_lastCinematicCheck, WorldSession::m_muteTime, m_nextMailDelivereTime, m_nextSave, m_Played_time, m_QuestStatus, m_QuestStatusSave, Unit::m_regenTimer, m_swingErrorMsg, m_timedquests, m_weaponChangeTimer, m_zoneUpdateId, m_zoneUpdateTimer, NOTIFY_VISIBILITY_CHANGED, OFF_ATTACK, PET_SAVE_NOT_IN_SLOT, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER_FLAGS_RESTING, PLAYER_NEXT_LEVEL_XP, RATE_REST_INGAME, RegenerateAll(), WorldObject::RemoveFromNotify(), RemovePet(), RemoveRestFlag(), RepopAtGraveyard(), Unit::resetAttackTimer(), REST_FLAG_IN_TAVERN, SaveToDB(), SendAttackSwingBadFacingAttack(), SendAttackSwingNotInRange(), SendNewMail(), SendUpdateToOutOfRangeGroupMembers(), Unit::setAttackTimer(), PreparedStatementBase::SetData(), SetHasDelayedTeleport(), SetMustDelayTeleport(), SetPendingBind(), SetRestBonus(), WorldSession::SetTotalTime(), sObjectMgr, SPELL_AURA_PREVENT_RESURRECTION, sScriptMgr, sWorld, teleportStore_dest, teleportStore_options, TeleportTo(), QuestStatusData::Timer, Position::ToString(), UNIT_FLAG_POSSESSED, UNIT_STATE_CASTING, UNIT_STATE_CHARGING, UNIT_STATE_MELEE_ATTACKING, unReadMails, Unit::Update(), AchievementMgr::Update(), UpdateAfkReport(), UpdateArea(), UpdateCharmedAI(), CinematicMgr::UpdateCinematicLocation(), UpdateContestedPvP(), UpdateDuelFlag(), UpdateEnchantTime(), UpdateFFAPvPFlag(), UpdateHomebindTime(), UpdateItemDuration(), UpdateObjectVisibility(), UpdatePvPFlag(), UpdateSoulboundTradeItems(), UpdateZone(), and ZONE_UPDATE_INTERVAL.

Referenced by Map::Update().

◆ UpdateAchievementCriteria()

void Player::UpdateAchievementCriteria ( AchievementCriteriaTypes  type,
uint32  miscValue1 = 0,
uint32  miscValue2 = 0,
Unit unit = nullptr 
)
2131{
2132 m_achievementMgr->UpdateAchievementCriteria(type, miscValue1, miscValue2,
2133 unit);
2134}
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: AchievementMgr.cpp:822

References m_achievementMgr, and AchievementMgr::UpdateAchievementCriteria().

Referenced by _addSpell(), Spell::_cast(), KillRewarder::_RewardKillCredit(), ActivateTaxiPathTo(), CheckAreaExploreAndOutdoor(), Group::CountTheRoll(), Unit::DealDamage(), Spell::DoSpellHitOnUnit(), FlightPathMovementGenerator::DoUpdate(), InstanceScript::DoUpdateAchievementCriteria(), DuelComplete(), EnvironmentalDamage(), EquipItem(), EquipNewItem(), lfg::LFGMgr::FinishDungeon(), GiveLevel(), WorldSession::HandleAlterAppearance(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBuyBankSlotOpcode(), HandleFall(), WorldSession::HandleGameobjectReportUse(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleLootRoll(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleQuestLogRemoveQuest(), reset_commandscript::HandleResetHonorCommand(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), WorldSession::HandleTextEmoteOpcode(), Unit::Kill(), KilledMonsterCredit(), ArenaTeamMember::ModifyPersonalRating(), MoveItemToInventory(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), InstanceSaveMgr::PlayerBindToInstance(), QuickEquipItem(), resetTalents(), RewardHonor(), RewardQuest(), AuctionHouseMgr::SendAuctionSuccessfulMail(), AuctionHouseMgr::SendAuctionWonMail(), setDeathState(), SetMoney(), ReputationMgr::SetOneFactionReputation(), SetSkill(), SetTitle(), StoreNewItem(), SummonIfPossible(), UpdateLootAchievements(), BattlegroundAB::UpdatePlayerScore(), BattlegroundAV::UpdatePlayerScore(), BattlegroundEY::UpdatePlayerScore(), BattlegroundIC::UpdatePlayerScore(), BattlegroundWS::UpdatePlayerScore(), UpdateSkill(), UpdateSkillPro(), and GameObject::Use().

◆ UpdateAfkReport()

void Player::UpdateAfkReport ( time_t  currTime)

checks the 15 afk reports per 5 minutes limit

352{
353 if (m_bgData.bgAfkReportedTimer <= currTime)
354 {
356 m_bgData.bgAfkReportedTimer = currTime + 5 * MINUTE;
357 }
358}
time_t bgAfkReportedTimer
Definition: Player.h:1044

References BGData::bgAfkReportedCount, BGData::bgAfkReportedTimer, m_bgData, and MINUTE.

Referenced by Update().

◆ UpdateAllCritPercentages()

void Player::UpdateAllCritPercentages ( )

◆ UpdateAllRatings()

void Player::UpdateAllRatings ( )
664{
665 for (int cr = 0; cr < MAX_COMBAT_RATING; ++cr)
667}
CombatRating
Definition: Unit.h:216

References MAX_COMBAT_RATING, and UpdateRating().

Referenced by UpdateAllStats().

◆ UpdateAllSpellCritChances()

void Player::UpdateAllSpellCritChances ( )
872{
873 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
875}
@ SPELL_SCHOOL_NORMAL
Definition: SharedDefines.h:283
void UpdateSpellCritChance(uint32 school)
Definition: StatSystem.cpp:822

References MAX_SPELL_SCHOOL, SPELL_SCHOOL_NORMAL, and UpdateSpellCritChance().

Referenced by AuraEffect::HandleAuraModCritPct(), AuraEffect::HandleModSpellCritChance(), UpdateAllStats(), UpdateRating(), and UpdateStats().

◆ UpdateAllStats()

bool Player::UpdateAllStats ( )
overridevirtual

Implements Unit.

189{
190 for (int8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
191 {
192 float value = GetTotalStatValue(Stats(i));
193 SetStat(Stats(i), int32(value));
194 }
195
196 UpdateArmor();
197 // calls UpdateAttackPowerAndDamage() in UpdateArmor for SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
200
201 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
203
215
216 return true;
217}
void UpdateAllSpellCritChances()
Definition: StatSystem.cpp:871
void UpdateArmor() override
Definition: StatSystem.cpp:252
void UpdateSpellDamageAndHealingBonus()
Definition: StatSystem.cpp:177
void UpdateMaxHealth() override
Definition: StatSystem.cpp:296
void UpdateAllRatings()
Definition: PlayerUpdates.cpp:663
void UpdateAllCritPercentages()
Definition: StatSystem.cpp:680
void UpdateDefenseBonusesMod()
Definition: StatSystem.cpp:609
virtual void UpdateAllResistances()
Definition: StatSystem.cpp:54
float GetTotalStatValue(Stats stat, float additionalValue=0.0f) const
Definition: Unit.cpp:15240

References BASE_ATTACK, CR_ARMOR_PENETRATION, Unit::GetTotalStatValue(), MAX_POWERS, MAX_STATS, OFF_ATTACK, POWER_MANA, RecalculateRating(), Unit::SetStat(), STAT_STRENGTH, UpdateAllCritPercentages(), UpdateAllRatings(), Unit::UpdateAllResistances(), UpdateAllSpellCritChances(), UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDefenseBonusesMod(), UpdateExpertise(), UpdateManaRegen(), UpdateMaxHealth(), UpdateMaxPower(), UpdateShieldBlockValue(), and UpdateSpellDamageAndHealingBonus().

Referenced by _ApplyAllStatBonuses(), _RemoveAllStatBonuses(), Create(), GiveLevel(), and LoadFromDB().

◆ UpdateArea()

void Player::UpdateArea ( uint32  newArea)
1171{
1172 // pussywizard: inform instance, needed for Icecrown Citadel
1173 if (InstanceScript* instance = GetInstanceScript())
1174 instance->OnPlayerAreaUpdate(this, m_areaUpdateId, newArea);
1175
1176 sScriptMgr->OnPlayerUpdateArea(this, m_areaUpdateId, newArea);
1177
1178 // FFA_PVP flags are area and not zone id dependent
1179 // so apply them accordingly
1180 m_areaUpdateId = newArea;
1181
1182 AreaTableEntry const* area = sAreaTableStore.LookupEntry(newArea);
1183 pvpInfo.IsInFFAPvPArea = area && (area->flags & AREA_FLAG_ARENA);
1184 UpdateFFAPvPState(false);
1185
1186 UpdateAreaDependentAuras(newArea);
1187
1188 pvpInfo.IsInNoPvPArea = false;
1189 if (area && area->IsSanctuary())
1190 {
1192 pvpInfo.IsInNoPvPArea = true;
1194 }
1195 else
1197
1198 uint32 const areaRestFlag = (GetTeamId(true) == TEAM_ALLIANCE)
1201 if (area && area->flags & areaRestFlag)
1203 else
1205}
@ REST_FLAG_IN_FACTION_AREA
Definition: Player.h:816
@ AREA_FLAG_ARENA
Definition: DBCEnums.h:241
@ AREA_FLAG_REST_ZONE_HORDE
Definition: DBCEnums.h:256
@ AREA_FLAG_REST_ZONE_ALLIANCE
Definition: DBCEnums.h:257
bool IsInNoPvPArea
‍Marks if player is in an area which forces PvP flag
Definition: Player.h:362
bool IsInFFAPvPArea
‍Marks if player is in a sanctuary or friendly capital city
Definition: Player.h:363
void UpdateFFAPvPState(bool reset=true)
Definition: PlayerUpdates.cpp:1407
bool IsSanctuary() const
Definition: DBCStructure.h:533

References AREA_FLAG_ARENA, AREA_FLAG_REST_ZONE_ALLIANCE, AREA_FLAG_REST_ZONE_HORDE, Unit::CombatStopWithPets(), AreaTableEntry::flags, WorldObject::GetInstanceScript(), GetTeamId(), PvPInfo::IsInFFAPvPArea, PvPInfo::IsInNoPvPArea, AreaTableEntry::IsSanctuary(), m_areaUpdateId, pvpInfo, Object::RemoveByteFlag(), RemoveRestFlag(), REST_FLAG_IN_FACTION_AREA, sAreaTableStore, Object::SetByteFlag(), SetRestFlag(), sScriptMgr, TEAM_ALLIANCE, UNIT_BYTE2_FLAG_SANCTUARY, UNIT_FIELD_BYTES_2, UpdateAreaDependentAuras(), and UpdateFFAPvPState().

Referenced by SetGameMaster(), Update(), and UpdateZone().

◆ UpdateAreaDependentAuras()

void Player::UpdateAreaDependentAuras ( uint32  area_id)
1818{
1819 // remove auras from spells with area limitations
1820 for (AuraMap::iterator iter = m_ownedAuras.begin();
1821 iter != m_ownedAuras.end();)
1822 {
1823 // use m_zoneUpdateId for speed: UpdateArea called from UpdateZone or
1824 // instead UpdateZone in both cases m_zoneUpdateId up-to-date
1825 if (iter->second->GetSpellInfo()->CheckLocation(
1826 GetMapId(), m_zoneUpdateId, newArea, this, false) !=
1828 RemoveOwnedAura(iter);
1829 else
1830 ++iter;
1831 }
1832
1833 // Xinef: check controlled auras
1834 if (!m_Controlled.empty())
1835 for (ControlSet::iterator itr = m_Controlled.begin();
1836 itr != m_Controlled.end();)
1837 {
1838 Unit* controlled = *itr;
1839 ++itr;
1840 if (controlled && !controlled->IsPet())
1841 {
1842 Unit::AuraMap& tAuras = controlled->GetOwnedAuras();
1843 for (Unit::AuraMap::iterator auraIter = tAuras.begin();
1844 auraIter != tAuras.end();)
1845 {
1846 if (auraIter->second->GetSpellInfo()->CheckLocation(
1847 GetMapId(), m_zoneUpdateId, newArea, nullptr) !=
1849 controlled->RemoveOwnedAura(auraIter);
1850 else
1851 ++auraIter;
1852 }
1853 }
1854 }
1855
1856 // some auras applied at subzone enter
1857 SpellAreaForAreaMapBounds saBounds =
1858 sSpellMgr->GetSpellAreaForAreaMapBounds(newArea);
1859 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first;
1860 itr != saBounds.second; ++itr)
1861 if (itr->second->autocast &&
1862 itr->second->IsFitToRequirements(this, m_zoneUpdateId, newArea))
1863 if (!HasAura(itr->second->spellId))
1864 CastSpell(this, itr->second->spellId, true);
1865
1866 if (newArea == 4273 && GetVehicle() && GetPositionX() > 400) // Ulduar
1867 {
1868 switch (GetVehicleBase()->GetEntry())
1869 {
1870 case 33062:
1871 case 33109:
1872 case 33060:
1873 GetVehicle()->Dismiss();
1874 break;
1875 }
1876 }
1877}
std::pair< SpellAreaForAreaMap::const_iterator, SpellAreaForAreaMap::const_iterator > SpellAreaForAreaMapBounds
Definition: SpellMgr.h:550
Unit * GetVehicleBase() const
Definition: Unit.cpp:18670
std::multimap< uint32, Aura * > AuraMap
Definition: Unit.h:635
AuraMap & GetOwnedAuras()
Definition: Unit.h:1257
void Dismiss()
Definition: Vehicle.cpp:521

References Unit::CastSpell(), Vehicle::Dismiss(), Object::GetEntry(), WorldLocation::GetMapId(), Unit::GetOwnedAuras(), Position::GetPositionX(), Unit::GetVehicle(), Unit::GetVehicleBase(), Unit::HasAura(), Unit::IsPet(), Unit::m_Controlled, Unit::m_ownedAuras, m_zoneUpdateId, Unit::RemoveOwnedAura(), SPELL_CAST_OK, and sSpellMgr.

Referenced by AddQuest(), CompleteQuest(), WorldSession::HandlePlayerLoginFromDB(), IncompleteQuest(), RemoveActiveQuest(), RewardQuest(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetData(), and UpdateArea().

◆ UpdateArmor()

void Player::UpdateArmor ( )
overridevirtual

Implements Unit.

253{
254 UnitMods unitMod = UNIT_MOD_ARMOR;
255
256 float value = GetModifierValue(unitMod, BASE_VALUE); // base armor (from items)
257 value *= GetModifierValue(unitMod, BASE_PCT); // armor percent from items
258 value += GetStat(STAT_AGILITY) * 2.0f; // armor bonus from stats
259 value += GetModifierValue(unitMod, TOTAL_VALUE);
260
261 //add dynamic flat mods
263 for (AuraEffectList::const_iterator i = mResbyIntellect.begin(); i != mResbyIntellect.end(); ++i)
264 {
265 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
266 value += CalculatePct(GetStat(Stats((*i)->GetMiscValueB())), (*i)->GetAmount());
267 }
268
269 value *= GetModifierValue(unitMod, TOTAL_PCT);
270
271 SetArmor(int32(value));
272
273 UpdateAttackPowerAndDamage(); // armor dependent auras update for SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
274}
@ SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:245

References BASE_PCT, BASE_VALUE, CalculatePct(), Unit::GetAuraEffectsByType(), Unit::GetModifierValue(), Unit::GetStat(), Unit::SetArmor(), SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT, SPELL_SCHOOL_MASK_NORMAL, STAT_AGILITY, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, and UpdateAttackPowerAndDamage().

Referenced by UpdateAllStats(), UpdateResistances(), and UpdateStats().

◆ UpdateArmorPenetration()

void Player::UpdateArmorPenetration ( int32  amount)
848{
849 // Store Rating Value
851}

References CR_ARMOR_PENETRATION, PLAYER_FIELD_COMBAT_RATING_1, and Unit::SetUInt32Value().

Referenced by UpdateRating().

◆ UpdateAttackPowerAndDamage()

void Player::UpdateAttackPowerAndDamage ( bool  ranged = false)
overridevirtual

Implements Unit.

331{
332 float val2 = 0.0f;
333 float level = float(GetLevel());
334
335 sScriptMgr->OnBeforeUpdateAttackPowerAndDamage(this, level, val2, ranged);
336
338
342
343 if (ranged)
344 {
348
350 {
351 val2 = level * 2.0f + GetStat(STAT_AGILITY) - 10.0f;
352 }
354 {
355 val2 = level + GetStat(STAT_AGILITY) - 10.0f;
356 }
358 {
359 switch (GetShapeshiftForm())
360 {
361 case FORM_CAT:
362 case FORM_BEAR:
363 case FORM_DIREBEAR:
364 val2 = 0.0f;
365 break;
366 default:
367 val2 = GetStat(STAT_AGILITY) - 10.0f;
368 break;
369 }
370 }
371 else
372 {
373 val2 = GetStat(STAT_AGILITY) - 10.0f;
374 }
375 }
376 else
377 {
379 {
380 val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
381 }
383 {
384 val2 = level * 2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f;
385 }
387 {
388 // Check if Predatory Strikes is skilled
389 float mLevelMult = 0.0f;
390 float weapon_bonus = 0.0f;
391 if (IsInFeralForm())
392 {
394 for (Unit::AuraEffectList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
395 {
396 AuraEffect* aurEff = *itr;
397 if (aurEff->GetSpellInfo()->SpellIconID == 1563)
398 {
399 switch (aurEff->GetEffIndex())
400 {
401 case 0: // Predatory Strikes (effect 0)
402 mLevelMult = CalculatePct(1.0f, aurEff->GetAmount());
403 break;
404 case 1: // Predatory Strikes (effect 1)
405 if (Item* mainHand = m_items[EQUIPMENT_SLOT_MAINHAND])
406 {
407 // also gains % attack power from equipped weapon
408 ItemTemplate const* proto = mainHand->GetTemplate();
409 if (!proto)
410 continue;
411
412 uint32 ap = proto->getFeralBonus();
413 // Get AP Bonuses from weapon
414 for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
415 {
416 if (i >= proto->StatsCount)
417 break;
418
420 ap += proto->ItemStat[i].ItemStatValue;
421 }
422
423 // Get AP Bonuses from weapon spells
424 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
425 {
426 // no spell
427 if (!proto->Spells[i].SpellId || proto->Spells[i].SpellTrigger != ITEM_SPELLTRIGGER_ON_EQUIP)
428 continue;
429
430 // check if it is valid spell
431 SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(proto->Spells[i].SpellId);
432 if (!spellproto)
433 continue;
434
435 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
436 if (spellproto->Effects[j].ApplyAuraName == SPELL_AURA_MOD_ATTACK_POWER)
437 ap += spellproto->Effects[j].CalcValue();
438 }
439
440 weapon_bonus = CalculatePct(float(ap), aurEff->GetAmount());
441 }
442 break;
443 default:
444 break;
445 }
446 }
447 }
448 }
449
450 switch (GetShapeshiftForm())
451 {
452 case FORM_CAT:
453 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f + GetStat(STAT_AGILITY) - 20.0f + weapon_bonus + m_baseFeralAP;
454 break;
455 case FORM_BEAR:
456 case FORM_DIREBEAR:
457 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + weapon_bonus + m_baseFeralAP;
458 break;
459 case FORM_MOONKIN:
460 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + m_baseFeralAP;
461 break;
462 default:
463 val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
464 break;
465 }
466 }
468 {
469 val2 = GetStat(STAT_STRENGTH) - 10.0f;
470 }
471 }
472
473 SetModifierValue(unitMod, BASE_VALUE, val2);
474
475 float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT);
476 float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
477
478 //add dynamic flat mods
479 if (ranged)
480 {
481 if ((getClassMask() & CLASSMASK_WAND_USERS) == 0)
482 {
484 for (AuraEffectList::const_iterator i = mRAPbyStat.begin(); i != mRAPbyStat.end(); ++i)
485 attPowerMod += CalculatePct(GetStat(Stats((*i)->GetMiscValue())), (*i)->GetAmount());
486 }
487 }
488 else
489 {
491 for (AuraEffectList::const_iterator i = mAPbyStat.begin(); i != mAPbyStat.end(); ++i)
492 attPowerMod += CalculatePct(GetStat(Stats((*i)->GetMiscValue())), (*i)->GetAmount());
493
495 for (AuraEffectList::const_iterator iter = mAPbyArmor.begin(); iter != mAPbyArmor.end(); ++iter)
496 // always: ((*i)->GetModifier()->m_miscvalue == 1 == SPELL_SCHOOL_MASK_NORMAL)
497 attPowerMod += int32(GetArmor() / (*iter)->GetAmount());
498 }
499
500 float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
501
502 sScriptMgr->OnAfterUpdateAttackPowerAndDamage(this, level, base_attPower, attPowerMod, attPowerMultiplier, ranged);
503 SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field
504 SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field
505 SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
506
507 //automatically update weapon damage after attack power modification
508 if (ranged)
509 {
511 }
512 else
513 {
515 if (CanDualWield() && haveOffhandWeapon()) //allow update offhand damage only if player knows DualWield Spec and has equipped offhand weapon
519 }
520}
@ SPELL_AURA_MOD_ATTACK_POWER
Definition: SpellAuraDefines.h:162
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:275
@ SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
Definition: SpellAuraDefines.h:348
@ SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:331
@ FORM_MOONKIN
Definition: UnitDefines.h:98
int32 ItemStatValue
Definition: ItemTemplate.h:587
uint32 ItemStatType
Definition: ItemTemplate.h:586
_ItemStat ItemStat[MAX_ITEM_PROTO_STATS]
Definition: ItemTemplate.h:648
int32 getFeralBonus(int32 extraDPS=0) const
Definition: ItemTemplate.h:744
uint32 StatsCount
Definition: ItemTemplate.h:647
void SetModifierValue(UnitMods unitMod, UnitModifierType modifierType, float value)
Definition: Unit.h:1441
uint32 GetEffIndex() const
Definition: SpellAuraEffects.h:56
int32 GetAmount() const
Definition: SpellAuraEffects.h:64

References BASE_ATTACK, BASE_PCT, BASE_VALUE, CalculatePct(), Unit::CanDualWield(), CLASS_CONTEXT_STATS, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CLASSMASK_WAND_USERS, SpellInfo::Effects, EQUIPMENT_SLOT_MAINHAND, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, AuraEffect::GetAmount(), Unit::GetArmor(), Unit::GetAuraEffectsByType(), Unit::getClassMask(), AuraEffect::GetEffIndex(), ItemTemplate::getFeralBonus(), Unit::GetLevel(), Unit::GetModifierValue(), Unit::GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Unit::GetStat(), Unit::haveOffhandWeapon(), IsClass(), Unit::IsInFeralForm(), ITEM_MOD_ATTACK_POWER, ITEM_SPELLTRIGGER_ON_EQUIP, ItemTemplate::ItemStat, _ItemStat::ItemStatType, _ItemStat::ItemStatValue, m_baseFeralAP, m_items, MAX_ITEM_PROTO_SPELLS, MAX_ITEM_PROTO_STATS, MAX_SPELL_EFFECTS, OFF_ATTACK, RANGED_ATTACK, Object::SetFloatValue(), Object::SetInt32Value(), Unit::SetModifierValue(), SPELL_AURA_DUMMY, SPELL_AURA_MOD_ATTACK_POWER, SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR, SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, SpellInfo::SpellIconID, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, sSpellMgr, STAT_AGILITY, STAT_STRENGTH, ItemTemplate::StatsCount, TOTAL_PCT, TOTAL_VALUE, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, Unit::UpdateDamagePhysical(), and UpdateSpellDamageAndHealingBonus().

Referenced by ApplyFeralAPBonus(), AuraEffect::HandleAuraModAttackPowerOfArmor(), AuraEffect::HandleAuraModRangedAttackPowerOfStatPercent(), InitDataForForm(), UpdateAllStats(), UpdateArmor(), and UpdateStats().

◆ UpdateBlockPercentage()

void Player::UpdateBlockPercentage ( )
617{
618 // No block
619 float value = 0.0f;
620 if (CanBlock())
621 {
622 // Base value
623 value = 5.0f;
624 // Modify value from defense skill
625 value += (int32(GetDefenseSkillValue()) - int32(GetMaxSkillValueForLevel())) * 0.04f;
626 // Increase from SPELL_AURA_MOD_BLOCK_PERCENT aura
628 // Increase from rating
630
631 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
632 {
633 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Block", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Block", 95.0f) : value;
634 }
635
636 value = value < 0.0f ? 0.0f : value;
637 }
639}
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition: SpellAuraDefines.h:114
#define sConfigMgr
Definition: Config.h:74
void SetStatFloatValue(uint16 index, float value)
Definition: Object.cpp:790
bool CanBlock() const
Definition: Player.h:2162
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition: Unit.cpp:3592

References CanBlock(), CR_BLOCK, Unit::GetDefenseSkillValue(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), Unit::GetTotalAuraModifier(), PLAYER_BLOCK_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), and SPELL_AURA_MOD_BLOCK_PERCENT.

Referenced by AuraEffect::HandleAuraModBlockPercent(), SetCanBlock(), UpdateDefenseBonusesMod(), and UpdateRating().

◆ UpdateCharmedAI()

void Player::UpdateCharmedAI ( )
private
1905{
1906 // Xinef: maybe passed as argument?
1907 Unit* charmer = GetCharmer();
1908 CharmInfo* charmInfo = GetCharmInfo();
1909
1910 // Xinef: needs more thinking, maybe kill player?
1911 if (!charmer || !charmInfo)
1912 return;
1913
1914 // Xinef: we should be killed if caster enters evade mode and charm is
1915 // infinite
1916 if (charmer->IsCreature() &&
1917 charmer->ToCreature()->IsInEvadeMode())
1918 {
1919 AuraEffectList const& auras =
1921 for (AuraEffectList::const_iterator iter = auras.begin();
1922 iter != auras.end(); ++iter)
1923 if ((*iter)->GetCasterGUID() == charmer->GetGUID() &&
1924 (*iter)->GetBase()->IsPermanent())
1925 {
1926 Unit::DealDamage(charmer, this, GetHealth(), nullptr,
1928 nullptr, false);
1929 return;
1930 }
1931 }
1932
1933 Unit* target = GetVictim();
1934 if (target)
1935 {
1936 SetInFront(target);
1938 }
1939
1941 return;
1942
1943 bool Mages =
1944 getClassMask() & (1 << (CLASS_MAGE - 1) | 1 << (CLASS_WARLOCK - 1) |
1945 1 << (CLASS_DRUID - 1) | 1 << (CLASS_HUNTER - 1) |
1946 1 << (CLASS_PRIEST - 1));
1947
1948 // Xinef: charmer type specific actions
1949 if (charmer->IsPlayer())
1950 {
1951 bool follow = false;
1952 if (!target)
1953 {
1954 if (charmInfo->GetPlayerReactState() == REACT_PASSIVE)
1955 follow = true;
1956 else if (charmInfo->GetPlayerReactState() == REACT_DEFENSIVE)
1957 {
1958 if (charmer->GetVictim())
1959 target = charmer->GetVictim();
1960 else
1961 follow = true;
1962 }
1963
1964 if (follow)
1965 {
1969 return;
1970 }
1971 }
1972 else if (target &&
1975 GetMotionMaster()->MoveChase(target, Mages ? 15 : 4);
1976 }
1977
1978 if (!target || !IsValidAttackTarget(target))
1979 {
1980 target = SelectNearbyTarget(nullptr, GetMap()->IsDungeon() ? 100.f : 30.f);
1981 if (!target)
1982 {
1986
1987 return;
1988 }
1989
1990 GetMotionMaster()->MoveChase(target, Mages ? 15 : 4);
1991 Attack(target, true);
1992 }
1993 else
1994 {
1995 float Distance = GetDistance(target);
1996 uint8 rnd = urand(0, 1);
1997
1998 if (Mages)
1999 {
2000 if ((GetPower(POWER_MANA) * 100 / GetMaxPower(POWER_MANA)) < 10)
2001 {
2002 GetMotionMaster()->MoveChase(target, 4);
2003 return;
2004 }
2005
2006 if (Distance <= 3)
2007 {
2008 if (urand(0, 1))
2009 {
2012 CastSpell(target, m_charmAISpells[SPELL_T_STUN], false);
2017 false);
2018 else if (m_charmAISpells[SPELL_IMMUNITY] &&
2021 }
2022 else
2023 {
2024 switch (urand(0, 1))
2025 {
2026 case 0:
2030 CastSpell(
2031 target,
2033 false);
2034 break;
2035 case 1:
2040 false);
2041 break;
2042 }
2043 }
2044 }
2045 else
2046 {
2047 switch (urand(0, 2))
2048 {
2049 case 0:
2053 CastSpell(target,
2055 false);
2056 break;
2057 case 1:
2061 CastSpell(target,
2063 false);
2064 break;
2065 case 2:
2069 false);
2070 break;
2071 }
2072 }
2073 }
2074 else
2075 {
2076 if (Distance > 10)
2077 {
2078 GetMotionMaster()->MoveChase(target, 2.0f);
2081 CastSpell(target, m_charmAISpells[SPELL_T_CHARGE], false);
2082 else if (m_charmAISpells[SPELL_FAST_RUN] &&
2085 }
2086
2088 return;
2089
2090 switch (urand(0, 2))
2091 {
2092 case 0:
2096 CastSpell(target,
2098 false);
2099 break;
2100 case 1:
2105 false);
2106 break;
2107 case 2:
2111 break;
2112 }
2113 }
2114 }
2115}
#define PET_FOLLOW_ANGLE
Definition: PetDefines.h:199
#define PET_FOLLOW_DIST
Definition: PetDefines.h:198
@ SPELL_HIGH_DAMAGE1
Definition: Player.h:919
@ REACT_DEFENSIVE
Definition: Unit.h:549
@ REACT_PASSIVE
Definition: Unit.h:548
@ UNIT_STATE_FOLLOW
Definition: UnitDefines.h:158
@ CHASE_MOTION_TYPE
Definition: MotionMaster.h:43
bool IsInEvadeMode() const
Definition: Creature.h:137
ReactStates GetPlayerReactState() const
Definition: CharmInfo.h:182
Unit * SelectNearbyTarget(Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
Definition: Unit.cpp:16923
bool Attack(Unit *victim, bool meleeAttack)
Definition: Unit.cpp:10217
void SendMovementFlagUpdate(bool self=false)
Definition: Unit.cpp:16643
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition: Unit.cpp:13811
void SetInFront(WorldObject const *target)
Definition: Unit.cpp:20435
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:313
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition: MotionMaster.cpp:910
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition: MotionMaster.cpp:409

References Unit::Attack(), Unit::CastSpell(), CHASE_MOTION_TYPE, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PRIEST, CLASS_WARLOCK, Unit::DealDamage(), DIRECT_DAMAGE, Unit::GetAuraEffectsByType(), Unit::GetCharmer(), Unit::GetCharmInfo(), Unit::getClassMask(), MotionMaster::GetCurrentMovementGeneratorType(), WorldObject::GetDistance(), Object::GetGUID(), Unit::GetHealth(), WorldObject::GetMap(), Unit::GetMaxPower(), Unit::GetMotionMaster(), CharmInfo::GetPlayerReactState(), Unit::GetPower(), Unit::GetVictim(), HasSpellCooldown(), Unit::HasUnitState(), Object::IsCreature(), Creature::IsInEvadeMode(), Object::IsPlayer(), Unit::IsValidAttackTarget(), m_charmAISpells, MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_ANGLE, PET_FOLLOW_DIST, POWER_MANA, REACT_DEFENSIVE, REACT_PASSIVE, Unit::SelectNearbyTarget(), Unit::SendMovementFlagUpdate(), Unit::SetInFront(), SPELL_AURA_MOD_CHARM, SPELL_DOT_DAMAGE, SPELL_FAST_RUN, SPELL_HIGH_DAMAGE1, SPELL_IMMUNITY, SPELL_INSTANT_DAMAGE, SPELL_ROOT_OR_FEAR, SPELL_SCHOOL_MASK_NORMAL, SPELL_T_CHARGE, SPELL_T_STUN, Object::ToCreature(), UNIT_STATE_CASTING, UNIT_STATE_FOLLOW, and urand().

Referenced by Update().

◆ UpdateCombatSkills()

void Player::UpdateCombatSkills ( Unit victim,
WeaponAttackType  attType,
bool  defence,
Item item = nullptr 
)
981{
982 uint8 playerLevel = GetLevel();
983 uint16 currentSkillValue = defence ? GetBaseDefenseSkillValue() : GetBaseWeaponSkillValue(attType);
984 uint16 currentSkillMax = 5 * playerLevel;
985 int32 skillDiff = currentSkillMax - currentSkillValue;
986
987 // Max skill reached for level.
988 // Can in some cases be less than 0: having max skill and then .level -1 as example.
989 if (skillDiff <= 0)
990 {
991 return;
992 }
993
994 uint8 greylevel = Acore::XP::GetGrayLevel(playerLevel);
995 uint8 moblevel = defence ? victim->getLevelForTarget(this) : victim->GetLevel(); // if defense than victim == attacker
996 /*if (moblevel < greylevel)
997 return;*/
998 // Patch 3.0.8 (2009-01-20): You can no longer skill up weapons on mobs that are immune to damage.
999
1000 if (moblevel > playerLevel + 5)
1001 {
1002 moblevel = playerLevel + 5;
1003 }
1004
1005 int16 lvldif = moblevel - greylevel;
1006 if (lvldif < 3)
1007 {
1008 lvldif = 3;
1009 }
1010
1011 float chance = float(3 * lvldif * skillDiff) / playerLevel;
1012 if (!defence)
1013 {
1014 chance += chance * 0.02f * GetStat(STAT_INTELLECT);
1015 }
1016
1017 chance = chance < 1.0f ? 1.0f : chance; // minimum chance to increase skill is 1%
1018
1019 LOG_DEBUG("entities.player", "Player::UpdateCombatSkills(defence:{}, playerLevel:{}, moblevel:{}) -> ({}/{}) chance to increase skill is {}%", defence, playerLevel, moblevel, currentSkillValue, currentSkillMax, chance);
1020
1021 if (roll_chance_f(chance))
1022 {
1023 if (defence)
1024 {
1025 UpdateDefense();
1026 }
1027 else
1028 {
1029 UpdateWeaponSkill(victim, attType, item);
1030 }
1031 }
1032}
uint32 GetBaseDefenseSkillValue() const
Definition: Player.h:1912
uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const
Definition: Player.cpp:12760
void UpdateDefense()
Definition: PlayerUpdates.cpp:564
void UpdateWeaponSkill(Unit *victim, WeaponAttackType attType, Item *item=nullptr)
Definition: PlayerUpdates.cpp:934
uint8 getLevelForTarget(WorldObject const *) const override
Definition: Unit.h:760

References GetBaseDefenseSkillValue(), GetBaseWeaponSkillValue(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), Unit::getLevelForTarget(), Unit::GetStat(), LOG_DEBUG, roll_chance_f(), STAT_INTELLECT, UpdateDefense(), and UpdateWeaponSkill().

Referenced by Unit::ProcDamageAndSpellFor().

◆ UpdateContestedPvP()

void Player::UpdateContestedPvP ( uint32  currTime)
361{
363 return;
364 if (m_contestedPvPTimer <= diff)
365 {
367 }
368 else
369 m_contestedPvPTimer -= diff;
370}

References Unit::IsInCombat(), m_contestedPvPTimer, and ResetContestedPvP().

Referenced by Update().

◆ UpdateCorpseReclaimDelay()

void Player::UpdateCorpseReclaimDelay ( )
1880{
1882
1883 if ((pvp &&
1885 (!pvp && !sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)))
1886 return;
1887
1888 time_t now = GameTime::GetGameTime().count();
1889
1890 if (now < m_deathExpireTime)
1891 {
1892 // full and partly periods 1..3
1893 uint64 count = (m_deathExpireTime - now) / DEATH_EXPIRE_STEP + 1;
1894
1895 if (count < MAX_DEATH_COUNT)
1896 m_deathExpireTime = now + (count + 1) * DEATH_EXPIRE_STEP;
1897 else
1899 }
1900 else
1902}

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, DEATH_EXPIRE_STEP, GameTime::GetGameTime(), m_deathExpireTime, m_ExtraFlags, MAX_DEATH_COUNT, PLAYER_EXTRA_PVP_DEATH, and sWorld.

Referenced by KillPlayer().

◆ UpdateCraftSkill()

bool Player::UpdateCraftSkill ( uint32  spellid)
782{
783 LOG_DEBUG("entities.player.skills", "UpdateCraftSkill spellid {}", spellid);
784
785 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellid);
786
787 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first;
788 _spell_idx != bounds.second; ++_spell_idx)
789 {
790 if (_spell_idx->second->SkillLine)
791 {
792 uint32 SkillValue =
793 GetPureSkillValue(_spell_idx->second->SkillLine);
794
795 // Alchemy Discoveries here
796 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
797 if (spellInfo && spellInfo->Mechanic == MECHANIC_DISCOVERY)
798 {
799 if (uint32 discoveredSpell = GetSkillDiscoverySpell(
800 _spell_idx->second->SkillLine, spellid, this))
801 learnSpell(discoveredSpell);
802 }
803
804 uint32 craft_skill_gain =
805 sWorld->getIntConfig(CONFIG_SKILL_GAIN_CRAFTING);
806 sScriptMgr->OnUpdateCraftingSkill(this, _spell_idx->second, SkillValue, craft_skill_gain);
807
808 return UpdateSkillPro(
809 _spell_idx->second->SkillLine,
810 SkillGainChance(SkillValue,
811 _spell_idx->second->TrivialSkillLineRankHigh,
812 (_spell_idx->second->TrivialSkillLineRankHigh +
813 _spell_idx->second->TrivialSkillLineRankLow) /
814 2,
815 _spell_idx->second->TrivialSkillLineRankLow),
816 craft_skill_gain);
817 }
818 }
819 return false;
820}
uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player *player)
Definition: SkillDiscovery.cpp:213
int SkillGainChance(uint32 SkillValue, uint32 GrayLevel, uint32 GreenLevel, uint32 YellowLevel)
Definition: PlayerUpdates.cpp:707
@ CONFIG_SKILL_GAIN_CRAFTING
Definition: IWorld.h:275
@ MECHANIC_DISCOVERY
Definition: SharedDefines.h:1353
bool UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step)
Definition: PlayerUpdates.cpp:870
uint32 Mechanic
Definition: SpellInfo.h:323

References CONFIG_SKILL_GAIN_CRAFTING, GetPureSkillValue(), GetSkillDiscoverySpell(), learnSpell(), LOG_DEBUG, SpellInfo::Mechanic, MECHANIC_DISCOVERY, SkillGainChance(), sScriptMgr, sSpellMgr, sWorld, and UpdateSkillPro().

Referenced by Spell::DoCreateItem(), Spell::EffectEnchantItemPerm(), and spell_gen_profession_research::HandleScript().

◆ UpdateCritPercentage()

void Player::UpdateCritPercentage ( WeaponAttackType  attType)
642{
643 BaseModGroup modGroup;
644 uint16 index;
645 CombatRating cr;
646
647 switch (attType)
648 {
649 case OFF_ATTACK:
650 modGroup = OFFHAND_CRIT_PERCENTAGE;
652 cr = CR_CRIT_MELEE;
653 break;
654 case RANGED_ATTACK:
655 modGroup = RANGED_CRIT_PERCENTAGE;
657 cr = CR_CRIT_RANGED;
658 break;
659 case BASE_ATTACK:
660 default:
661 modGroup = CRIT_PERCENTAGE;
663 cr = CR_CRIT_MELEE;
664 break;
665 }
666
667 float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr);
668 // Modify crit from weapon skill and maximized defense skill of same level victim difference
669 value += (int32(GetWeaponSkillValue(attType)) - int32(GetMaxSkillValueForLevel())) * 0.04f;
670
671 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
672 {
673 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Crit", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Crit", 95.0f) : value;
674 }
675
676 value = value < 0.0f ? 0.0f : value;
677 SetStatFloatValue(index, value);
678}
float GetTotalPercentageModValue(BaseModGroup modGroup) const
Definition: Player.h:2173
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition: Unit.cpp:3757

References BASE_ATTACK, CR_CRIT_MELEE, CR_CRIT_RANGED, CRIT_PERCENTAGE, GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetTotalPercentageModValue(), Unit::GetWeaponSkillValue(), OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, sConfigMgr, and Object::SetStatFloatValue().

Referenced by HandleBaseModValue(), UpdateAllCritPercentages(), and UpdateRating().

◆ UpdateDefense()

void Player::UpdateDefense ( )
565{
567 sWorld->getIntConfig(CONFIG_SKILL_GAIN_DEFENSE)))
568 UpdateDefenseBonusesMod(); // update dependent from defense skill part
569}
@ CONFIG_SKILL_GAIN_DEFENSE
Definition: IWorld.h:276
bool UpdateSkill(uint32 skill_id, uint32 step)
Definition: PlayerUpdates.cpp:670

References CONFIG_SKILL_GAIN_DEFENSE, SKILL_DEFENSE, sWorld, UpdateDefenseBonusesMod(), and UpdateSkill().

Referenced by UpdateCombatSkills().

◆ UpdateDefenseBonusesMod()

void Player::UpdateDefenseBonusesMod ( )

◆ UpdateDodgePercentage()

void Player::UpdateDodgePercentage ( )
782{
783 const float dodge_cap[MAX_CLASSES] =
784 {
785 88.129021f, // Warrior
786 88.129021f, // Paladin
787 145.560408f, // Hunter
788 145.560408f, // Rogue
789 150.375940f, // Priest
790 88.129021f, // DK
791 145.560408f, // Shaman
792 150.375940f, // Mage
793 150.375940f, // Warlock
794 0.0f, // ??
795 116.890707f // Druid
796 };
797
798 float diminishing = 0.0f, nondiminishing = 0.0f;
799 GetDodgeFromAgility(diminishing, nondiminishing);
800 // Modify value from defense skill (only bonus from defense rating diminishes)
801 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
802 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
803 // Dodge from SPELL_AURA_MOD_DODGE_PERCENT aura
805 // Dodge from rating
806 diminishing += GetRatingBonusValue(CR_DODGE);
807 // apply diminishing formula to diminishing dodge chance
808 uint32 pclass = getClass() - 1;
809 m_realDodge = nondiminishing + (diminishing * dodge_cap[pclass] / (diminishing + dodge_cap[pclass] * m_diminishing_k[pclass]));
810
811 m_realDodge = m_realDodge < 0.0f ? 0.0f : m_realDodge;
812 float value = std::max(diminishing + nondiminishing, 0.0f);
813
814 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
815 {
816 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Dodge", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Dodge", 95.0f) : value;
817 }
818
820}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition: SpellAuraDefines.h:112
void GetDodgeFromAgility(float &diminishing, float &nondiminishing)
Definition: Player.cpp:5056

References CR_DEFENSE_SKILL, CR_DODGE, Unit::getClass(), GetDodgeFromAgility(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), Unit::GetTotalAuraModifier(), m_diminishing_k, m_realDodge, MAX_CLASSES, PLAYER_DODGE_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), SKILL_DEFENSE, and SPELL_AURA_MOD_DODGE_PERCENT.

Referenced by AuraEffect::HandleAuraModDodgePercent(), UpdateDefenseBonusesMod(), UpdateRating(), and UpdateStats().

◆ UpdateDuelFlag()

void Player::UpdateDuelFlag ( time_t  currTime)
424{
425 if (duel && duel->State == DUEL_STATE_COUNTDOWN && duel->StartTime <= currTime)
426 {
427 sScriptMgr->OnPlayerDuelStart(this, duel->Opponent);
428
430 duel->Opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 2);
431
433 duel->Opponent->duel->State = DUEL_STATE_IN_PROGRESS;
434 }
435}
@ DUEL_STATE_COUNTDOWN
Definition: Player.h:371
@ DUEL_STATE_IN_PROGRESS
Definition: Player.h:372

References duel, DUEL_STATE_COUNTDOWN, DUEL_STATE_IN_PROGRESS, PLAYER_DUEL_TEAM, Unit::SetUInt32Value(), and sScriptMgr.

Referenced by Update().

◆ UpdateEnchantmentDurations()

void Player::UpdateEnchantmentDurations ( )
4750{
4751 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4752 {
4753 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
4754 }
4755}

References m_enchantDuration.

Referenced by Spell::EffectSummonChangeItem().

◆ UpdateEnchantTime()

void Player::UpdateEnchantTime ( uint32  time)
4178{
4179 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(), next; itr != m_enchantDuration.end(); itr = next)
4180 {
4181 ASSERT(itr->item);
4182 next = itr;
4183 if (!itr->item->GetEnchantmentId(itr->slot))
4184 {
4185 next = m_enchantDuration.erase(itr);
4186 }
4187 else if (itr->leftduration <= time)
4188 {
4189 ApplyEnchantment(itr->item, itr->slot, false, false);
4190 itr->item->ClearEnchantment(itr->slot);
4191 next = m_enchantDuration.erase(itr);
4192 }
4193 else if (itr->leftduration > time)
4194 {
4195 itr->leftduration -= time;
4196 ++next;
4197 }
4198 }
4199}

References ApplyEnchantment(), ASSERT, and m_enchantDuration.

Referenced by Update().

◆ UpdateEquipSpellsAtFormChange()

void Player::UpdateEquipSpellsAtFormChange ( )
1310{
1311 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
1312 {
1313 if (m_items[i] && !m_items[i]->IsBroken() &&
1315 {
1316 ApplyItemEquipSpell(m_items[i], false,
1317 true); // remove spells that not fit to form
1319 m_items[i], true,
1320 true); // add spells that fit form but not active
1321 }
1322 }
1323
1324 // item set bonuses not dependent from item broken state
1325 for (std::size_t setindex = 0; setindex < ItemSetEff.size(); ++setindex)
1326 {
1327 ItemSetEffect* eff = ItemSetEff[setindex];
1328 if (!eff)
1329 continue;
1330
1331 for (uint32 y = 0; y < MAX_ITEM_SET_SPELLS; ++y)
1332 {
1333 SpellInfo const* spellInfo = eff->spells[y];
1334 if (!spellInfo)
1335 continue;
1336
1337 ApplyEquipSpell(spellInfo, nullptr, false,
1338 true); // remove spells that not fit to form
1339 if (!sScriptMgr->CanApplyEquipSpellsItemSet(this, eff))
1340 break;
1341 ApplyEquipSpell(spellInfo, nullptr, true,
1342 true); // add spells that fit form but not active
1343 }
1344 }
1345}
#define MAX_ITEM_SET_SPELLS
Definition: DBCStructure.h:1229
Definition: Item.h:32
SpellInfo const * spells[8]
Definition: Item.h:35

References ApplyEquipSpell(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), GetAttackBySlot(), INVENTORY_SLOT_BAG_END, ItemSetEff, m_items, MAX_ITEM_SET_SPELLS, ItemSetEffect::spells, and sScriptMgr.

Referenced by InitDataForForm().

◆ UpdateExpertise()

void Player::UpdateExpertise ( WeaponAttackType  attType)
878{
879 if (attack == RANGED_ATTACK)
880 return;
881
883
884 Item* weapon = GetWeaponForAttack(attack, true);
885
887 for (AuraEffectList::const_iterator itr = expAuras.begin(); itr != expAuras.end(); ++itr)
888 {
889 // item neutral spell
890 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
891 expertise += (*itr)->GetAmount();
892 // item dependent spell
893 else if (weapon && weapon->IsFitToSpellRequirements((*itr)->GetSpellInfo()))
894 expertise += (*itr)->GetAmount();
895 }
896
897 if (expertise < 0)
898 expertise = 0;
899
900 switch (attack)
901 {
902 case BASE_ATTACK:
904 break;
905 case OFF_ATTACK:
907 break;
908 default:
909 break;
910 }
911}
@ SPELL_AURA_MOD_EXPERTISE
Definition: SpellAuraDefines.h:303

References BASE_ATTACK, CR_EXPERTISE, Unit::GetAuraEffectsByType(), GetRatingBonusValue(), GetWeaponForAttack(), Item::IsFitToSpellRequirements(), OFF_ATTACK, PLAYER_EXPERTISE, PLAYER_OFFHAND_EXPERTISE, RANGED_ATTACK, Unit::SetUInt32Value(), and SPELL_AURA_MOD_EXPERTISE.

Referenced by DestroyItem(), EquipItem(), AuraEffect::HandleAuraModExpertise(), RemoveItem(), UpdateAllStats(), and UpdateRating().

◆ UpdateFallInformationIfNeed()

void Player::UpdateFallInformationIfNeed ( MovementInfo const &  minfo,
uint16  opcode 
)
2138{
2139 if (m_lastFallTime >= minfo.fallTime ||
2140 m_lastFallZ <= minfo.pos.GetPositionZ() || opcode == MSG_MOVE_FALL_LAND)
2141 SetFallInformation(minfo.fallTime, minfo.pos.GetPositionZ());
2142}
@ MSG_MOVE_FALL_LAND
Definition: Opcodes.h:231

References MovementInfo::fallTime, Position::GetPositionZ(), m_lastFallTime, m_lastFallZ, MSG_MOVE_FALL_LAND, MovementInfo::pos, and SetFallInformation().

Referenced by WorldSession::HandleMovementOpcodes().

◆ UpdateFFAPvPFlag()

void Player::UpdateFFAPvPFlag ( time_t  currTime)
392{
393 if (!IsFFAPvP() || sWorld->IsFFAPvPRealm() || !pvpInfo.FFAPvPEndTimer || currTime < pvpInfo.FFAPvPEndTimer + 30)
394 {
395 return;
396 }
397
398 pvpInfo.FFAPvPEndTimer = time_t(0);
400 {
402 sScriptMgr->OnFfaPvpStateUpdate(this, false);
403 }
404 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
405 (*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
406
407 // xinef: iterate attackers
408 AttackerSet toRemove;
409 AttackerSet const& attackers = getAttackers();
410 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end(); ++itr)
411 if (!(*itr)->IsValidAttackTarget(this))
412 toRemove.insert(*itr);
413
414 for (AttackerSet::const_iterator itr = toRemove.begin(); itr != toRemove.end(); ++itr)
415 (*itr)->AttackStop();
416
417 // xinef: remove our own victim
418 if (Unit* victim = GetVictim())
419 if (!IsValidAttackTarget(victim))
420 AttackStop();
421}
time_t FFAPvPEndTimer
‍Time when player unflags himself for PvP (flag removed after 5 minutes)
Definition: Player.h:365
std::unordered_set< Unit * > AttackerSet
Definition: Unit.h:632
AttackerSet const & getAttackers() const
Definition: Unit.h:724

References Unit::AttackStop(), PvPInfo::FFAPvPEndTimer, Unit::getAttackers(), Unit::GetVictim(), Object::HasByteFlag(), IsFFAPvP(), Unit::IsValidAttackTarget(), Unit::m_Controlled, pvpInfo, Object::RemoveByteFlag(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, and UNIT_FIELD_BYTES_2.

Referenced by Update().

◆ UpdateFFAPvPState()

void Player::UpdateFFAPvPState ( bool  reset = true)
Todo:
: should we always synchronize UNIT_FIELD_BYTES_2, 1 of controller
1408{
1410 // and controlled? no, we shouldn't, those are checked for affecting player
1411 // by client
1412 if (!pvpInfo.IsInNoPvPArea && !IsGameMaster() &&
1413 (pvpInfo.IsInFFAPvPArea || sWorld->IsFFAPvPRealm()))
1414 {
1415 if (!IsFFAPvP())
1416 {
1417 sScriptMgr->OnFfaPvpStateUpdate(this, true);
1419 for (ControlSet::iterator itr = m_Controlled.begin();
1420 itr != m_Controlled.end(); ++itr)
1421 (*itr)->SetByteValue(UNIT_FIELD_BYTES_2, 1,
1423 }
1424
1426 {
1427 pvpInfo.FFAPvPEndTimer = time_t(0);
1428 }
1429 }
1430 else if (IsFFAPvP())
1431 {
1432 if ((pvpInfo.IsInNoPvPArea || IsGameMaster()) || reset ||
1434 {
1435 pvpInfo.FFAPvPEndTimer = time_t(0);
1437 {
1439 sScriptMgr->OnFfaPvpStateUpdate(this, false);
1440 }
1441 for (ControlSet::iterator itr = m_Controlled.begin();
1442 itr != m_Controlled.end(); ++itr)
1443 (*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1,
1445
1446 // xinef: iterate attackers
1447 AttackerSet toRemove;
1448 AttackerSet const& attackers = getAttackers();
1449 for (AttackerSet::const_iterator itr = attackers.begin();
1450 itr != attackers.end(); ++itr)
1451 if (!(*itr)->IsValidAttackTarget(this))
1452 toRemove.insert(*itr);
1453
1454 for (AttackerSet::const_iterator itr = toRemove.begin();
1455 itr != toRemove.end(); ++itr)
1456 (*itr)->AttackStop();
1457
1458 // xinef: remove our own victim
1459 if (Unit* victim = GetVictim())
1460 if (!IsValidAttackTarget(victim))
1461 AttackStop();
1462 }
1463 else
1464 {
1465 // Not in FFA PvP Area
1466 // Not FFA PvP realm
1467 // Not FFA PvP timer already set
1468 // Being recently in PvP combat
1469 if (!pvpInfo.IsInFFAPvPArea && !sWorld->IsFFAPvPRealm() &&
1471 {
1473 GameTime::GetGameTime().count() +
1474 sWorld->getIntConfig(CONFIG_FFA_PVP_TIMER);
1475 }
1476 }
1477 }
1478}
@ CONFIG_FFA_PVP_TIMER
Definition: IWorld.h:417
time_t EndTimer
‍Marks if player is in an FFAPvP area (such as Gurubashi Arena)
Definition: Player.h:364

References Unit::AttackStop(), CONFIG_FFA_PVP_TIMER, PvPInfo::EndTimer, PvPInfo::FFAPvPEndTimer, Unit::getAttackers(), GameTime::GetGameTime(), Unit::GetVictim(), Object::HasByteFlag(), IsFFAPvP(), IsGameMaster(), PvPInfo::IsInFFAPvPArea, PvPInfo::IsInNoPvPArea, Unit::IsValidAttackTarget(), Unit::m_Controlled, pvpInfo, Object::RemoveByteFlag(), Object::SetByteFlag(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, and UNIT_FIELD_BYTES_2.

Referenced by UpdateArea(), and UpdatePvPState().

◆ UpdateFishingSkill()

bool Player::UpdateFishingSkill ( )
844{
845 LOG_DEBUG("entities.player.skills", "UpdateFishingSkill");
846
848
849 if (SkillValue >= GetMaxSkillValue(SKILL_FISHING))
850 {
851 return false;
852 }
853
854 /* Whenever the player clicks on the fishing gameobject the
855 * core will decide based on a probability if the skill raises or not.
856 */
857 return UpdateSkillPro(
859 static_cast<int32>(getProbabilityOfLevelUp(SkillValue)) * 10,
860 sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING));
861}
float getProbabilityOfLevelUp(uint32 SkillValue)
Definition: PlayerUpdates.cpp:822
@ CONFIG_SKILL_GAIN_GATHERING
Definition: IWorld.h:277
uint16 GetMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5411

References CONFIG_SKILL_GAIN_GATHERING, GetMaxSkillValue(), getProbabilityOfLevelUp(), GetPureSkillValue(), LOG_DEBUG, SKILL_FISHING, sWorld, and UpdateSkillPro().

Referenced by GameObject::Use().

◆ UpdateForQuestWorldObjects()

void Player::UpdateForQuestWorldObjects ( )

This code doesn't look right, but it was logically converted to condition system to do the exact same thing it did before. It definitely needs to be overlooked for intended functionality.

1743{
1744 if (m_clientGUIDs.empty())
1745 return;
1746
1747 UpdateData udata;
1748 WorldPacket packet;
1749 for (GuidUnorderedSet::iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
1750 {
1751 if ((*itr).IsGameObject())
1752 {
1753 if (GameObject* obj = ObjectAccessor::GetGameObject(*this, *itr))
1754 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1755 }
1756 else if ((*itr).IsCreatureOrVehicle())
1757 {
1759 if (!obj)
1760 continue;
1761
1762 // check if this unit requires quest specific flags
1764 {
1765 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(obj->GetEntry());
1766 for (SpellClickInfoContainer::const_iterator _itr = clickPair.first; _itr != clickPair.second; ++_itr)
1767 {
1770 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(obj->GetEntry(), _itr->second.spellId);
1771 bool buildUpdateBlock = false;
1772 for (ConditionList::const_iterator jtr = conds.begin(); jtr != conds.end() && !buildUpdateBlock; ++jtr)
1773 if ((*jtr)->ConditionType == CONDITION_QUESTREWARDED || (*jtr)->ConditionType == CONDITION_QUESTTAKEN)
1774 buildUpdateBlock = true;
1775
1776 if (buildUpdateBlock)
1777 {
1778 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1779 break;
1780 }
1781 }
1782 }
1784 {
1785 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1786 }
1787 }
1788 }
1789
1790 udata.BuildPacket(packet);
1791 GetSession()->SendPacket(&packet);
1792}
@ UNIT_NPC_FLAG_VENDOR_MASK
Definition: UnitDefines.h:322
@ CONDITION_QUESTREWARDED
Definition: ConditionMgr.h:43
@ CONDITION_QUESTTAKEN
Definition: ConditionMgr.h:44
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:187
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition: Object.cpp:257
Definition: UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition: UpdateData.cpp:48

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), CONDITION_QUESTREWARDED, CONDITION_QUESTTAKEN, ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), ObjectAccessor::GetGameObject(), GetSession(), Unit::HasNpcFlag(), m_clientGUIDs, sConditionMgr, WorldSession::SendPacket(), sObjectMgr, UNIT_NPC_FLAG_SPELLCLICK, UNIT_NPC_FLAG_TRAINER, and UNIT_NPC_FLAG_VENDOR_MASK.

Referenced by Group::AddMember(), Group::Disband(), EquipItem(), ItemAddedQuestCheck(), ItemRemovedQuestCheck(), Group::RemoveMember(), and SendQuestUpdate().

◆ UpdateGatherSkill()

bool Player::UpdateGatherSkill ( uint32  SkillId,
uint32  SkillValue,
uint32  RedLevel,
uint32  Multiplicator = 1 
)
721{
722 LOG_DEBUG("entities.player.skills",
723 "UpdateGatherSkill(SkillId {} SkillLevel {} RedLevel {})",
724 SkillId, SkillValue, RedLevel);
725
726 uint32 gathering_skill_gain =
727 sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING);
728 sScriptMgr->OnUpdateGatheringSkill(this, SkillId, SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25, gathering_skill_gain);
729
730 // For skinning and Mining chance decrease with level. 1-74 - no decrease,
731 // 75-149 - 2 times, 225-299 - 8 times
732 switch (SkillId)
733 {
734 case SKILL_HERBALISM:
738 return UpdateSkillPro(SkillId,
739 SkillGainChance(SkillValue, RedLevel + 100,
740 RedLevel + 50, RedLevel + 25) *
741 Multiplicator,
742 gathering_skill_gain);
743 case SKILL_SKINNING:
744 if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS) == 0)
745 return UpdateSkillPro(SkillId,
746 SkillGainChance(SkillValue, RedLevel + 100,
747 RedLevel + 50,
748 RedLevel + 25) *
749 Multiplicator,
750 gathering_skill_gain);
751 else
752 return UpdateSkillPro(
753 SkillId,
754 (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50,
755 RedLevel + 25) *
756 Multiplicator) >>
757 (SkillValue /
759 gathering_skill_gain);
760 case SKILL_MINING:
761 if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS) == 0)
762 return UpdateSkillPro(SkillId,
763 SkillGainChance(SkillValue, RedLevel + 100,
764 RedLevel + 50,
765 RedLevel + 25) *
766 Multiplicator,
767 gathering_skill_gain);
768 else
769 return UpdateSkillPro(
770 SkillId,
771 (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50,
772 RedLevel + 25) *
773 Multiplicator) >>
774 (SkillValue /
776 gathering_skill_gain);
777 }
778 return false;
779}
@ CONFIG_SKILL_CHANCE_SKINNING_STEPS
Definition: IWorld.h:274
@ CONFIG_SKILL_CHANCE_MINING_STEPS
Definition: IWorld.h:273
@ SKILL_INSCRIPTION
Definition: SharedDefines.h:3002
@ SKILL_MINING
Definition: SharedDefines.h:2919
@ SKILL_SKINNING
Definition: SharedDefines.h:2961
@ SKILL_JEWELCRAFTING
Definition: SharedDefines.h:2985
@ SKILL_HERBALISM
Definition: SharedDefines.h:2915

References CONFIG_SKILL_CHANCE_MINING_STEPS, CONFIG_SKILL_CHANCE_SKINNING_STEPS, CONFIG_SKILL_GAIN_GATHERING, LOG_DEBUG, SKILL_HERBALISM, SKILL_INSCRIPTION, SKILL_JEWELCRAFTING, SKILL_LOCKPICKING, SKILL_MINING, SKILL_SKINNING, SkillGainChance(), sScriptMgr, sWorld, and UpdateSkillPro().

Referenced by Spell::EffectMilling(), Spell::EffectOpenLock(), Spell::EffectProspecting(), Spell::EffectSkinning(), and GetExplicitDiscoverySpell().

◆ UpdateHomebindTime()

void Player::UpdateHomebindTime ( uint32  time)
1348{
1349 // GMs never get homebind timer online
1351 {
1352 if (m_HomebindTimer) // instance valid, but timer not reset
1353 {
1354 // hide reminder
1355 WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4);
1356 data << uint32(0);
1357 data << uint32(0);
1358 GetSession()->SendPacket(&data);
1359 }
1360 // instance is valid, reset homebind timer
1361 m_HomebindTimer = 0;
1362 }
1363 else if (m_HomebindTimer > 0)
1364 {
1365 if (time >= m_HomebindTimer)
1366 {
1367 // teleport to nearest graveyard
1369 }
1370 else
1371 m_HomebindTimer -= time;
1372 }
1373 else
1374 {
1375 // instance is invalid, start homebind timer
1376 m_HomebindTimer = 60000;
1377 // send message to player
1378 WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4);
1379 data << uint32(m_HomebindTimer);
1380 data << uint32(1);
1381 GetSession()->SendPacket(&data);
1382 LOG_DEBUG(
1383 "maps",
1384 "PLAYER: Player '{}' ({}) will be teleported to homebind in 60 "
1385 "seconds",
1386 GetName(), GetGUID().ToString());
1387 }
1388}
@ SMSG_RAID_GROUP_ONLY
Definition: Opcodes.h:676

References Object::GetGUID(), WorldObject::GetName(), GetSession(), IsGameMaster(), LOG_DEBUG, m_HomebindTimer, m_InstanceValid, RepopAtGraveyard(), WorldSession::SendPacket(), SMSG_RAID_GROUP_ONLY, and Position::ToString().

Referenced by Update().

◆ UpdateHonorFields()

void Player::UpdateHonorFields ( )

called when rewarding honor and at each save

1138{
1140 time_t now = time_t(GameTime::GetGameTime().count());
1141 time_t today = time_t(GameTime::GetGameTime().count() / DAY) * DAY;
1142
1143 if (m_lastHonorUpdateTime < today)
1144 {
1145 time_t yesterday = today - DAY;
1146
1148
1149 // update yesterday's contribution
1150 if (m_lastHonorUpdateTime >= yesterday)
1151 {
1154
1155 // this is the first update today, reset today's contribution
1158 }
1159 else
1160 {
1161 // no honor/kills yesterday or today, reset
1164 }
1165 }
1166
1168}
uint16 PAIR32_LOPART(uint32 x)
Definition: ObjectDefines.h:97

References DAY, GameTime::GetGameTime(), Object::GetUInt32Value(), m_lastHonorUpdateTime, MAKE_PAIR32(), PAIR32_LOPART(), PLAYER_FIELD_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, and Unit::SetUInt32Value().

Referenced by honor_commandscript::HandleHonorUpdateCommand(), LoadFromDB(), RewardHonor(), and SaveToDB().

◆ UpdateInvisibilityDrunkDetect()

void Player::UpdateInvisibilityDrunkDetect ( )
997{
998 // select drunk percent or total SPELL_AURA_MOD_FAKE_INEBRIATE amount, whichever is higher for visibility updates
999 uint8 drunkValue = GetDrunkValue();
1000 int32 fakeDrunkValue = GetFakeDrunkValue();
1001 int32 maxDrunkValue = std::max<int32>(drunkValue, fakeDrunkValue);
1002
1003 if (maxDrunkValue != 0)
1004 {
1007 }
1008 else
1010
1012}
@ INVISIBILITY_DRUNK
Definition: SharedDefines.h:1261
void AddFlag(FLAG_TYPE flag)
Definition: Object.h:368
void DelFlag(FLAG_TYPE flag)
Definition: Object.h:369
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPES > m_invisibilityDetect
Definition: Object.h:521
int32 GetFakeDrunkValue() const
Definition: Player.h:2149

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::AddFlag(), FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::DelFlag(), GetDrunkValue(), GetFakeDrunkValue(), INVISIBILITY_DRUNK, WorldObject::m_invisibilityDetect, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by AuraEffect::HandleAuraModFakeInebriation(), and SetDrunkValue().

◆ UpdateItemDuration()

void Player::UpdateItemDuration ( uint32  time,
bool  realtimeonly = false 
)
4161{
4162 if (m_itemDuration.empty())
4163 return;
4164
4165 LOG_DEBUG("entities.player.items", "Player::UpdateItemDuration({}, {})", time, realtimeonly);
4166
4167 for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end();)
4168 {
4169 Item* item = *itr;
4170 ++itr; // current element can be erased in UpdateDuration
4171
4172 if (!realtimeonly || item->GetTemplate()->HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME))
4173 item->UpdateDuration(this, time);
4174 }
4175}
@ ITEM_FLAGS_CU_DURATION_REAL_TIME
Definition: ItemTemplate.h:219
void UpdateDuration(Player *owner, uint32 diff)
Definition: Item.cpp:319
bool HasFlagCu(ItemFlagsCustom flag) const
Definition: ItemTemplate.h:829

References Item::GetTemplate(), ItemTemplate::HasFlagCu(), ITEM_FLAGS_CU_DURATION_REAL_TIME, LOG_DEBUG, m_itemDuration, and Item::UpdateDuration().

Referenced by LoadFromDB(), and Update().

◆ UpdateLocalChannels()

void Player::UpdateLocalChannels ( uint32  newZone)
463{
464 // pussywizard: mutex needed (tc changed opcode to THREAD UNSAFE)
465 static std::mutex channelsLock;
466 std::lock_guard<std::mutex> guard(channelsLock);
467
468 if (GetSession()->PlayerLoading() && !IsBeingTeleportedFar())
469 return; // The client handles it automatically after loading, but not
470 // after teleporting
471
472 AreaTableEntry const* current_zone = sAreaTableStore.LookupEntry(newZone);
473 if (!current_zone)
474 return;
475
477 if (!cMgr)
478 return;
479
480 std::string current_zone_name =
481 current_zone->area_name[GetSession()->GetSessionDbcLocale()];
482
483 for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i)
484 {
485 if (ChatChannelsEntry const* channel =
486 sChatChannelsStore.LookupEntry(i))
487 {
488 Channel* usedChannel = nullptr;
489
490 for (Channel* channel : m_channels)
491 {
492 if (channel && channel->GetChannelId() == i)
493 {
494 usedChannel = channel;
495 break;
496 }
497 }
498
499 Channel* removeChannel = nullptr;
500 Channel* joinChannel = nullptr;
501 bool sendRemove = true;
502
503 if (CanJoinConstantChannelInZone(channel, current_zone))
504 {
505 if (!(channel->flags & CHANNEL_DBC_FLAG_GLOBAL))
506 {
507 if (channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY &&
508 usedChannel)
509 continue; // Already on the channel, as city channel
510 // names are not changing
511
512 char new_channel_name_buf[100];
513 char const* currentNameExt;
514
515 if (channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY)
516 currentNameExt = sObjectMgr->GetAcoreStringForDBCLocale(
518 else
519 currentNameExt = current_zone_name.c_str();
520
521 snprintf(new_channel_name_buf, 100,
522 channel->pattern[m_session->GetSessionDbcLocale()],
523 currentNameExt);
524
525 joinChannel = cMgr->GetJoinChannel(new_channel_name_buf,
526 channel->ChannelID);
527 if (usedChannel)
528 {
529 if (joinChannel != usedChannel)
530 {
531 removeChannel = usedChannel;
532 sendRemove = false; // Do not send leave channel, it
533 // already replaced at client
534 }
535 else
536 joinChannel = nullptr;
537 }
538 }
539 else
540 joinChannel = cMgr->GetJoinChannel(
541 channel->pattern[m_session->GetSessionDbcLocale()],
542 channel->ChannelID);
543 }
544 else
545 removeChannel = usedChannel;
546
547 if (joinChannel)
548 joinChannel->JoinChannel(
549 this, ""); // Changed Channel: ... or Joined Channel: ...
550
551 if (removeChannel)
552 {
553 removeChannel->LeaveChannel(this,
554 sendRemove); // Leave old channel
555 std::string name =
556 removeChannel
557 ->GetName(); // Store name, (*i)erase in LeftChannel
558 LeftChannel(removeChannel); // Remove from player's channel list
559 }
560 }
561 }
562}
DBCStorage< ChatChannelsEntry > sChatChannelsStore(ChatChannelsEntryfmt)
@ CHANNEL_DBC_FLAG_GLOBAL
Definition: Channel.h:99
@ LANG_CHANNEL_CITY
Definition: Language.h:758
void JoinChannel(Player *player, std::string const &pass)
Definition: Channel.cpp:157
std::string const & GetName() const
Definition: Channel.h:183
Definition: ChannelMgr.h:30
static ChannelMgr * forTeam(TeamId teamId)
Definition: ChannelMgr.cpp:33
Channel * GetJoinChannel(std::string const &name, uint32 channel_id)
Definition: ChannelMgr.cpp:121
void LeftChannel(Channel *c)
Definition: Player.cpp:4941
bool CanJoinConstantChannelInZone(ChatChannelsEntry const *channel, AreaTableEntry const *zone)
Definition: Player.cpp:4918
LocaleConstant GetSessionDbcLocale() const
Definition: WorldSession.h:497
char const * area_name[16]
Definition: DBCStructure.h:527
Definition: DBCStructure.h:643

References AreaTableEntry::area_name, CanJoinConstantChannelInZone(), CHANNEL_DBC_FLAG_CITY_ONLY, CHANNEL_DBC_FLAG_GLOBAL, ChannelMgr::forTeam(), ChannelMgr::GetJoinChannel(), Channel::GetName(), GetSession(), WorldSession::GetSessionDbcLocale(), GetTeamId(), IsBeingTeleportedFar(), Channel::JoinChannel(), LANG_CHANNEL_CITY, Channel::LeaveChannel(), LeftChannel(), m_channels, m_session, sAreaTableStore, sChatChannelsStore, and sObjectMgr.

Referenced by UpdateZone().

◆ UpdateLootAchievements()

void Player::UpdateLootAchievements ( LootItem item,
Loot loot 
)

◆ UpdateManaRegen()

void Player::UpdateManaRegen ( )
925{
927 {
930 return;
931 }
932
933 float Intellect = GetStat(STAT_INTELLECT);
934 // Mana regen from spirit and intellect
935 float power_regen = std::sqrt(Intellect) * OCTRegenMPPerSpirit();
936 // Apply PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen
938
939 // Mana regen from SPELL_AURA_MOD_POWER_REGEN aura
941
942 // Get bonus from SPELL_AURA_MOD_MANA_REGEN_FROM_STAT aura
944 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
945 {
946 power_regen_mp5 += GetStat(Stats((*i)->GetMiscValue())) * (*i)->GetAmount() / 500.0f;
947 }
948
949 // Set regen rate in cast state apply only on spirit based regen
951 if (modManaRegenInterrupt > 100)
952 modManaRegenInterrupt = 100;
953 SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, power_regen_mp5 + CalculatePct(power_regen, modManaRegenInterrupt));
954
955 SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, power_regen_mp5 + power_regen);
956}
@ SPELL_AURA_MOD_MANA_REGEN_INTERRUPT
Definition: SpellAuraDefines.h:197
@ SPELL_AURA_MOD_MANA_REGEN_FROM_STAT
Definition: SpellAuraDefines.h:282
float OCTRegenMPPerSpirit()
Definition: Player.cpp:5184
float GetTotalAuraMultiplierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:5980

References CalculatePct(), Unit::GetAuraEffectsByType(), Unit::GetStat(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierByMiscValue(), Unit::GetTotalAuraMultiplierByMiscValue(), Unit::HasAuraTypeWithMiscvalue(), m_baseManaRegen, OCTRegenMPPerSpirit(), POWER_MANA, Object::SetStatFloatValue(), SPELL_AURA_MOD_MANA_REGEN_FROM_STAT, SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELL_AURA_PREVENT_REGENERATE_POWER, STAT_INTELLECT, UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, and UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER.

Referenced by ApplyManaRegenBonus(), AuraEffect::HandleModManaRegen(), AuraEffect::HandleModPowerRegen(), UpdateAllStats(), and UpdateStats().

◆ UpdateMaxHealth()

void Player::UpdateMaxHealth ( )
overridevirtual

Implements Unit.

297{
298 UnitMods unitMod = UNIT_MOD_HEALTH;
299
300 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreateHealth();
301 value *= GetModifierValue(unitMod, BASE_PCT);
303 value *= GetModifierValue(unitMod, TOTAL_PCT);
304
305 sScriptMgr->OnAfterUpdateMaxHealth(this, value);
306 SetMaxHealth((uint32)value);
307}
float GetHealthBonusFromStamina()
Definition: StatSystem.cpp:276

References BASE_PCT, BASE_VALUE, Unit::GetCreateHealth(), GetHealthBonusFromStamina(), Unit::GetModifierValue(), Unit::SetMaxHealth(), sScriptMgr, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_HEALTH.

Referenced by UpdateAllStats(), and UpdateStats().

◆ UpdateMaxPower()

void Player::UpdateMaxPower ( Powers  power)
overridevirtual

Implements Unit.

310{
311 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_POWER_START) + power);
312
313 float bonusPower = (power == POWER_MANA && GetCreatePowers(power) > 0) ? GetManaBonusFromIntellect() : 0;
314
315 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreatePowers(power);
316 value *= GetModifierValue(unitMod, BASE_PCT);
317 value += GetModifierValue(unitMod, TOTAL_VALUE) + bonusPower;
318 value *= GetModifierValue(unitMod, TOTAL_PCT);
319
320 sScriptMgr->OnAfterUpdateMaxPower(this, power, value);
321 SetMaxPower(power, uint32(value));
322}
@ UNIT_MOD_POWER_START
Definition: Unit.h:174
float GetManaBonusFromIntellect()
Definition: StatSystem.cpp:286

References BASE_PCT, BASE_VALUE, Unit::GetCreatePowers(), GetManaBonusFromIntellect(), Unit::GetModifierValue(), POWER_MANA, Unit::SetMaxPower(), sScriptMgr, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_POWER_START.

Referenced by Create(), UpdateAllStats(), and UpdateStats().

◆ UpdateMeleeHitChances()

void Player::UpdateMeleeHitChances ( )

◆ UpdateMirrorTimers()

void Player::UpdateMirrorTimers ( )
428{
429 // Desync flags for update on next HandleDrowning
431 m_MirrorTimerFlagsLast = ~m_MirrorTimerFlags;
432}

References m_MirrorTimerFlags, and m_MirrorTimerFlagsLast.

Referenced by AuraEffect::HandleWaterBreathing().

◆ UpdateNextMailTimeAndUnreads()

void Player::UpdateNextMailTimeAndUnreads ( )
435{
436 // Update the next delivery time and unread mails
437 time_t cTime = GameTime::GetGameTime().count();
438
440 unReadMails = 0;
441
442 for (Mail const* mail : GetMails())
443 {
444 if (mail->deliver_time > cTime)
445 {
446 if (!m_nextMailDelivereTime || m_nextMailDelivereTime > mail->deliver_time)
447 m_nextMailDelivereTime = mail->deliver_time;
448 }
449
450 // must be not checked yet
451 if (mail->checked & MAIL_CHECK_MASK_READ)
452 continue;
453
454 // and already delivered or expired
455 if (cTime < mail->deliver_time || cTime > mail->expire_time)
456 continue;
457
458 unReadMails++;
459 }
460}
@ MAIL_CHECK_MASK_READ
Definition: Mail.h:48
PlayerMails const & GetMails() const
Definition: Player.h:1637

References GameTime::GetGameTime(), GetMails(), m_nextMailDelivereTime, MAIL_CHECK_MASK_READ, and unReadMails.

Referenced by _LoadMail(), and WorldSession::HandleGetMailList().

◆ UpdateObjectVisibility()

void Player::UpdateObjectVisibility ( bool  forced = true,
bool  fromUpdate = false 
)
overridevirtual

Reimplemented from WorldObject.

1568{
1569 // Prevent updating visibility if player is not in world (example: LoadFromDB sets drunkstate which updates invisibility while player is not in map)
1570 if (!IsInWorld())
1571 return;
1572
1573 if (!forced)
1575 else if (!isBeingLoaded())
1576 {
1577 if (!fromUpdate) // pussywizard:
1578 {
1580 return;
1581 }
1584 }
1585}
void AddToNotify(uint16 f)
Definition: Object.cpp:2973
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: Unit.cpp:19058

References WorldObject::AddToNotify(), Unit::bRequestForcedVisibilityUpdate, isBeingLoaded(), Object::IsInWorld(), NOTIFY_VISIBILITY_CHANGED, Unit::UpdateObjectVisibility(), and UpdateVisibilityForPlayer().

Referenced by Map::AddPlayerToMap(), gm_commandscript::HandleGMVisibleCommand(), WorldSession::HandlePlayerLoginToCharInWorld(), Map::PlayerRelocation(), ResurrectPlayer(), SetGameMaster(), SetGroup(), Update(), and UpdateInvisibilityDrunkDetect().

◆ UpdateParryPercentage()

void Player::UpdateParryPercentage ( )
736{
737 const float parry_cap[MAX_CLASSES] =
738 {
739 47.003525f, // Warrior
740 47.003525f, // Paladin
741 145.560408f, // Hunter
742 145.560408f, // Rogue
743 0.0f, // Priest
744 47.003525f, // DK
745 145.560408f, // Shaman
746 0.0f, // Mage
747 0.0f, // Warlock
748 0.0f, // ??
749 0.0f // Druid
750 };
751
752 // No parry
753 float value = 0.0f;
754 m_realParry = 0.0f;
755 uint32 pclass = getClass() - 1;
756 if (CanParry() && parry_cap[pclass] > 0.0f)
757 {
758 float nondiminishing = 5.0f;
759 // Parry from rating
760 float diminishing = GetRatingBonusValue(CR_PARRY);
761 // Modify value from defense skill (only bonus from defense rating diminishes)
762 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
763 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
764 // Parry from SPELL_AURA_MOD_PARRY_PERCENT aura
766 // apply diminishing formula to diminishing parry chance
767 m_realParry = nondiminishing + diminishing * parry_cap[pclass] / (diminishing + parry_cap[pclass] * m_diminishing_k[pclass]);
768 m_realParry = m_realParry < 0.0f ? 0.0f : m_realParry;
769
770 value = std::max(diminishing + nondiminishing, 0.0f);
771
772 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
773 {
774 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Parry", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Parry", 95.0f) : value;
775 }
776 }
777
779}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition: SpellAuraDefines.h:110
bool CanParry() const
Definition: Player.h:2160

References CanParry(), CR_DEFENSE_SKILL, CR_PARRY, Unit::getClass(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), Unit::GetTotalAuraModifier(), m_diminishing_k, m_realParry, MAX_CLASSES, PLAYER_PARRY_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), SKILL_DEFENSE, and SPELL_AURA_MOD_PARRY_PERCENT.

Referenced by AuraEffect::HandleAuraModParryPercent(), SetCanParry(), UpdateDefenseBonusesMod(), and UpdateRating().

◆ UpdatePlayerSetting()

void Player::UpdatePlayerSetting ( std::string  source,
uint8  index,
uint32  value 
)
116{
117 auto itr = m_charSettingsMap.find(source);
118 uint8 size = index + 1;
119
120 if (itr == m_charSettingsMap.end())
121 {
122 // Settings not found, initialize a new entry.
123 PlayerSettingVector setting;
124 setting.resize(size);
125
126 for (uint32 itr = 0; itr <= index; ++itr)
127 {
128 PlayerSetting set;
129 set.value = itr == index ? value : 0;
130
131 setting[itr] = set;
132 }
133
134 m_charSettingsMap[source] = setting;
135 }
136 else
137 {
138 if (size > itr->second.size())
139 {
140 itr->second.resize(size);
141 }
142 itr->second[index].value = value;
143 }
144}

References m_charSettingsMap, and PlayerSetting::value.

Referenced by GetPlayerSetting(), and player_settings_commandscript::HandleSettingsAnnouncerFlags().

◆ UpdatePosition() [1/2]

bool Player::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline
1999{ return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); }
bool UpdatePosition(float x, float y, float z, float orientation, bool teleport=false) override
Definition: PlayerUpdates.cpp:1111

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and UpdatePosition().

Referenced by UpdatePosition().

◆ UpdatePosition() [2/2]

bool Player::UpdatePosition ( float  x,
float  y,
float  z,
float  orientation,
bool  teleport = false 
)
overridevirtual

Reimplemented from Unit.

1113{
1114 if (!Unit::UpdatePosition(x, y, z, orientation, teleport))
1115 return false;
1116
1117 // Update player zone if needed
1118 if (m_needZoneUpdate)
1119 {
1120 uint32 newZone, newArea;
1121 GetZoneAndAreaId(newZone, newArea);
1122 UpdateZone(newZone, newArea);
1123 m_needZoneUpdate = false;
1124 }
1125
1126 if (GetGroup())
1128
1131
1133
1134 return true;
1135}
@ GROUP_UPDATE_FLAG_POSITION
Definition: Group.h:108
void CheckAreaExploreAndOutdoor()
Definition: Player.cpp:5672
Player * GetTrader() const
Definition: Player.h:1367
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition: Unit.cpp:19955

References CheckAreaExploreAndOutdoor(), GetGroup(), GetSession(), GetTrader(), WorldObject::GetZoneAndAreaId(), GROUP_UPDATE_FLAG_POSITION, INTERACTION_DISTANCE, WorldObject::IsWithinDistInMap(), m_needZoneUpdate, WorldSession::SendCancelTrade(), SetGroupUpdateFlag(), Unit::UpdatePosition(), and UpdateZone().

Referenced by spell_rog_killing_spree_aura::HandleEffectPeriodic(), and WorldSession::HandleMoveTeleportAck().

◆ UpdatePotionCooldown()

void Player::UpdatePotionCooldown ( Spell spell = nullptr)
1498{
1499 // no potion used i combat or still in combat
1500 if (!GetLastPotionId() || IsInCombat())
1501 return;
1502
1503 // Call not from spell cast, send cooldown event for item spells if no in
1504 // combat
1505 if (!spell)
1506 {
1507 // spell/item pair let set proper cooldown (except not existed charged
1508 // spell cooldown spellmods for potions)
1509 if (ItemTemplate const* proto =
1510 sObjectMgr->GetItemTemplate(GetLastPotionId()))
1511 for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
1512 if (proto->Spells[idx].SpellId &&
1513 proto->Spells[idx].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)
1514 if (SpellInfo const* spellInfo =
1515 sSpellMgr->GetSpellInfo(proto->Spells[idx].SpellId))
1516 SendCooldownEvent(spellInfo, GetLastPotionId());
1517 }
1518 // from spell cases (m_lastPotionId set in Spell::SendSpellCooldown)
1519 else
1520 {
1521 if (spell->IsIgnoringCooldowns())
1522 return;
1523
1525 }
1526
1527 SetLastPotionId(0);
1528}
void SetLastPotionId(uint32 item_id)
Definition: Player.h:1790
uint32 GetLastPotionId()
Definition: Player.h:1789
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition: Player.cpp:11062
bool IsIgnoringCooldowns() const
Definition: Spell.cpp:8061

References GetLastPotionId(), Spell::IsIgnoringCooldowns(), Unit::IsInCombat(), ITEM_SPELLTRIGGER_ON_USE, m_lastPotionId, Spell::m_spellInfo, MAX_ITEM_SPELLS, SendCooldownEvent(), SetLastPotionId(), sObjectMgr, and sSpellMgr.

Referenced by Spell::finish().

◆ UpdatePvP()

void Player::UpdatePvP ( bool  state,
bool  _override = false 
)
1481{
1482 if (!state || _override)
1483 {
1484 SetPvP(state);
1485 pvpInfo.EndTimer = 0;
1486 }
1487 else
1488 {
1490 SetPvP(state);
1491 }
1492
1494 sScriptMgr->OnPlayerPVPFlagChange(this, state);
1495}
@ PLAYER_FLAGS_PVP_TIMER
Definition: Player.h:492
void SetPvP(bool state)
Definition: Player.h:1827

References PvPInfo::EndTimer, GameTime::GetGameTime(), PLAYER_FLAGS_PVP_TIMER, pvpInfo, RemovePlayerFlag(), SetPvP(), and sScriptMgr.

Referenced by Unit::CombatStart(), Unit::CombatStartOnCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), FlagPlayerPvP(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleTogglePvP(), UpdatePvPFlag(), and UpdatePvPState().

◆ UpdatePvPFlag()

void Player::UpdatePvPFlag ( time_t  currTime)
373{
374 if (!IsPvP())
375 return;
376
377 if (pvpInfo.EndTimer == 0 || pvpInfo.IsHostile)
378 return;
379
380 if (currTime < (pvpInfo.EndTimer + 300 + 5))
381 {
382 if (currTime > (pvpInfo.EndTimer + 4) && !HasPlayerFlag(PLAYER_FLAGS_PVP_TIMER))
384
385 return;
386 }
387
388 UpdatePvP(false);
389}
void UpdatePvP(bool state, bool _override=false)
Definition: PlayerUpdates.cpp:1480

References PvPInfo::EndTimer, HasPlayerFlag(), PvPInfo::IsHostile, IsPvP(), PLAYER_FLAGS_PVP_TIMER, pvpInfo, SetPlayerFlag(), and UpdatePvP().

Referenced by Update().

◆ UpdatePvPState()

void Player::UpdatePvPState ( )
1391{
1393
1394 if (pvpInfo.IsHostile) // in hostile area
1395 {
1396 if (!IsPvP() || pvpInfo.EndTimer != 0)
1397 UpdatePvP(true, true);
1398 }
1399 else // in friendly area
1400 {
1402 pvpInfo.EndTimer == 0)
1403 pvpInfo.EndTimer = GameTime::GetGameTime().count(); // start toggle-off
1404 }
1405}
@ PLAYER_FLAGS_IN_PVP
Definition: Player.h:483

References PvPInfo::EndTimer, GameTime::GetGameTime(), HasPlayerFlag(), PvPInfo::IsHostile, IsPvP(), PLAYER_FLAGS_IN_PVP, pvpInfo, UpdateFFAPvPState(), and UpdatePvP().

Referenced by AddQuest(), Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), RewardQuest(), Unit::SetCharm(), and UpdateZone().

◆ UpdateRangedHitChances()

◆ UpdateRating()

void Player::UpdateRating ( CombatRating  cr)
572{
573 int32 amount = m_baseRatingValue[cr];
574 // Apply bonus from SPELL_AURA_MOD_RATING_FROM_STAT
575 // stat used stored in miscValueB for this aura
576 AuraEffectList const& modRatingFromStat =
578 for (AuraEffectList::const_iterator i = modRatingFromStat.begin();
579 i != modRatingFromStat.end(); ++i)
580 if ((*i)->GetMiscValue() & (1 << cr))
581 amount += int32(CalculatePct(GetStat(Stats((*i)->GetMiscValueB())),
582 (*i)->GetAmount()));
583 if (amount < 0)
584 amount = 0;
585 SetUInt32Value(static_cast<uint16>(PLAYER_FIELD_COMBAT_RATING_1) + static_cast<uint16>(cr), uint32(amount));
586
587 bool affectStats = CanModifyStats();
588
589 switch (cr)
590 {
591 case CR_WEAPON_SKILL: // Implemented in Unit::RollMeleeOutcomeAgainst
592 case CR_DEFENSE_SKILL:
594 break;
595 case CR_DODGE:
597 break;
598 case CR_PARRY:
600 break;
601 case CR_BLOCK:
603 break;
604 case CR_HIT_MELEE:
606 break;
607 case CR_HIT_RANGED:
609 break;
610 case CR_HIT_SPELL:
612 break;
613 case CR_CRIT_MELEE:
614 if (affectStats)
615 {
618 }
619 break;
620 case CR_CRIT_RANGED:
621 if (affectStats)
623 break;
624 case CR_CRIT_SPELL:
625 if (affectStats)
627 break;
628 case CR_HIT_TAKEN_MELEE: // Implemented in Unit::MeleeMissChanceCalc
630 break;
631 case CR_HIT_TAKEN_SPELL: // Implemented in Unit::MagicSpellHitResult
632 break;
633 case CR_CRIT_TAKEN_MELEE: // Implemented in Unit::RollMeleeOutcomeAgainst
634 // (only for chance to crit)
636 break;
637 case CR_CRIT_TAKEN_SPELL: // Implemented in Unit::SpellCriticalBonus (only
638 // for chance to crit)
639 break;
640 case CR_HASTE_MELEE: // Implemented in Player::ApplyRatingMod
641 case CR_HASTE_RANGED:
642 case CR_HASTE_SPELL:
643 break;
644 case CR_WEAPON_SKILL_MAINHAND: // Implemented in
645 // Unit::RollMeleeOutcomeAgainst
648 break;
649 case CR_EXPERTISE:
650 if (affectStats)
651 {
654 }
655 break;
657 if (affectStats)
659 break;
660 }
661}
@ SPELL_AURA_MOD_RATING_FROM_STAT
Definition: SpellAuraDefines.h:283
@ CR_WEAPON_SKILL_RANGED
Definition: Unit.h:239
@ CR_WEAPON_SKILL
Definition: Unit.h:217
@ CR_WEAPON_SKILL_OFFHAND
Definition: Unit.h:238
@ CR_WEAPON_SKILL_MAINHAND
Definition: Unit.h:237
void UpdateArmorPenetration(int32 amount)
Definition: StatSystem.cpp:847
void UpdateSpellHitChances()
Definition: StatSystem.cpp:865
void UpdateMeleeHitChances()
Definition: StatSystem.cpp:853
void UpdateRangedHitChances()
Definition: StatSystem.cpp:859

References BASE_ATTACK, CalculatePct(), Unit::CanModifyStats(), CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_HIT_TAKEN_MELEE, CR_HIT_TAKEN_RANGED, CR_HIT_TAKEN_SPELL, CR_PARRY, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, Unit::GetAuraEffectsByType(), Unit::GetStat(), m_baseRatingValue, OFF_ATTACK, PLAYER_FIELD_COMBAT_RATING_1, RANGED_ATTACK, Unit::SetUInt32Value(), SPELL_AURA_MOD_RATING_FROM_STAT, UpdateAllSpellCritChances(), UpdateArmorPenetration(), UpdateBlockPercentage(), UpdateCritPercentage(), UpdateDefenseBonusesMod(), UpdateDodgePercentage(), UpdateExpertise(), UpdateMeleeHitChances(), UpdateParryPercentage(), UpdateRangedHitChances(), and UpdateSpellHitChances().

Referenced by ApplyRatingMod(), and UpdateAllRatings().

◆ UpdateResistances()

void Player::UpdateResistances ( uint32  school)
overridevirtual

Implements Unit.

226{
227 if (school > SPELL_SCHOOL_NORMAL)
228 {
229 // cant use GetTotalAuraModValue because of total pct multiplier :P
230 float value = 0.0f;
231 UnitMods unitMod = UnitMods(UNIT_MOD_RESISTANCE_START + school);
232
233 value = GetModifierValue(unitMod, BASE_VALUE);
234 value *= GetModifierValue(unitMod, BASE_PCT);
235 value += GetModifierValue(unitMod, TOTAL_VALUE);
236
238 for(AuraEffectList::const_iterator i = mResbyIntellect.begin(); i != mResbyIntellect.end(); ++i)
239 {
240 if((*i)->GetMiscValue() & (1 << (school - 1)) )
241 value += int32(GetStat(Stats((*i)->GetMiscValueB())) * (*i)->GetAmount() / 100.0f);
242 }
243
244 value *= GetModifierValue(unitMod, TOTAL_PCT);
245
246 SetResistance(SpellSchools(school), int32(value));
247 }
248 else
249 UpdateArmor();
250}

References BASE_PCT, BASE_VALUE, Unit::GetAuraEffectsByType(), Unit::GetModifierValue(), Unit::GetStat(), Unit::SetResistance(), SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT, SPELL_SCHOOL_NORMAL, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_RESISTANCE_START, and UpdateArmor().

◆ UpdateRuneRegen()

void Player::UpdateRuneRegen ( RuneType  rune)
959{
960 if (rune >= NUM_RUNE_TYPES)
961 return;
962
963 uint32 cooldown = 0;
964
965 for (uint32 i = 0; i < MAX_RUNES; ++i)
966 if (GetBaseRune(i) == rune)
967 {
968 cooldown = GetRuneBaseCooldown(i, true);
969 break;
970 }
971
972 if (cooldown <= 0)
973 return;
974
975 float regen = float(1 * IN_MILLISECONDS) / float(cooldown);
977}
uint32 GetRuneBaseCooldown(uint8 index, bool skipGrace)
Definition: Player.cpp:13317

References GetBaseRune(), GetRuneBaseCooldown(), IN_MILLISECONDS, MAX_RUNES, NUM_RUNE_TYPES, PLAYER_RUNE_REGEN_1, and Object::SetFloatValue().

Referenced by AuraEffect::HandleModPowerRegen().

◆ UpdateShieldBlockValue()

void Player::UpdateShieldBlockValue ( )
523{
525}
uint32 GetShieldBlockValue() const override
Definition: Player.cpp:5030

References GetShieldBlockValue(), PLAYER_SHIELD_BLOCK, and Unit::SetUInt32Value().

Referenced by HandleBaseModValue(), UpdateAllStats(), and UpdateStats().

◆ UpdateSkill()

bool Player::UpdateSkill ( uint32  skill_id,
uint32  step 
)
671{
672 if (!skill_id)
673 return false;
674
675 SkillStatusMap::iterator itr = mSkillStatus.find(skill_id);
676 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
677 return false;
678
679 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
680 uint32 data = GetUInt32Value(valueIndex);
681 uint32 value = SKILL_VALUE(data);
682 uint32 max = SKILL_MAX(data);
683
684 if ((!max) || (!value) || (value >= max))
685 return false;
686
687 if (value < max)
688 {
689 uint32 new_value = value + step;
690 if (new_value > max)
691 new_value = max;
692
693 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, max));
694 if (itr->second.uState != SKILL_NEW)
695 itr->second.uState = SKILL_CHANGED;
696
697 UpdateSkillEnchantments(skill_id, value, new_value);
699 skill_id);
700 return true;
701 }
702
703 return false;
704}

References ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, Object::GetUInt32Value(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_VALUE, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by UpdateDefense(), and UpdateWeaponSkill().

◆ UpdateSkillEnchantments()

void Player::UpdateSkillEnchantments ( uint16  skill_id,
uint16  curr_value,
uint16  new_value 
)
4697{
4698 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
4699 {
4700 if (m_items[i])
4701 {
4702 for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
4703 {
4704 uint32 ench_id = m_items[i]->GetEnchantmentId(EnchantmentSlot(slot));
4705 if (!ench_id)
4706 continue;
4707
4708 SpellItemEnchantmentEntry const* Enchant = sSpellItemEnchantmentStore.LookupEntry(ench_id);
4709 if (!Enchant)
4710 return;
4711
4712 if (Enchant->requiredSkill == skill_id)
4713 {
4714 // Checks if the enchantment needs to be applied or removed
4715 if (curr_value < Enchant->requiredSkillValue && new_value >= Enchant->requiredSkillValue)
4716 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), true);
4717 else if (new_value < Enchant->requiredSkillValue && curr_value >= Enchant->requiredSkillValue)
4718 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), false);
4719 }
4720
4721 // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements
4722 // rather than the gem requirements itself. If the socket has no color it is a prismatic socket.
4724 && !m_items[i]->GetTemplate()->Socket[slot - SOCK_ENCHANTMENT_SLOT].Color)
4725 {
4726 SpellItemEnchantmentEntry const* pPrismaticEnchant = sSpellItemEnchantmentStore.LookupEntry(m_items[i]->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT));
4727
4728 if (pPrismaticEnchant && pPrismaticEnchant->requiredSkill == skill_id)
4729 {
4730 if (curr_value < pPrismaticEnchant->requiredSkillValue && new_value >= pPrismaticEnchant->requiredSkillValue)
4731 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), true);
4732 else if (new_value < pPrismaticEnchant->requiredSkillValue && curr_value >= pPrismaticEnchant->requiredSkillValue)
4733 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), false);
4734 }
4735 }
4736 }
4737 }
4738 }
4739}
Definition: Socket.h:52

References ApplyEnchantment(), Item::GetEnchantmentId(), INVENTORY_SLOT_BAG_END, m_items, MAX_ENCHANTMENT_SLOT, PRISMATIC_ENCHANTMENT_SLOT, SpellItemEnchantmentEntry::requiredSkill, SpellItemEnchantmentEntry::requiredSkillValue, SOCK_ENCHANTMENT_SLOT, SOCK_ENCHANTMENT_SLOT_2, SOCK_ENCHANTMENT_SLOT_3, and sSpellItemEnchantmentStore.

Referenced by SetSkill(), UpdateSkill(), and UpdateSkillPro().

◆ UpdateSkillPro()

bool Player::UpdateSkillPro ( uint16  SkillId,
int32  Chance,
uint32  step 
)
871{
872 LOG_DEBUG("entities.player.skills",
873 "UpdateSkillPro(SkillId {}, Chance {:3.1f}%)", SkillId,
874 Chance / 10.0f);
875 if (!SkillId)
876 return false;
877
878 if (Chance <= 0) // speedup in 0 chance case
879 {
880 LOG_DEBUG("entities.player.skills",
881 "Player::UpdateSkillPro Chance={:3.1f}% missed",
882 Chance / 10.0f);
883 return false;
884 }
885
886 SkillStatusMap::iterator itr = mSkillStatus.find(SkillId);
887 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
888 return false;
889
890 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
891
892 uint32 data = GetUInt32Value(valueIndex);
893 uint16 SkillValue = SKILL_VALUE(data);
894 uint16 MaxValue = SKILL_MAX(data);
895
896 if (!MaxValue || !SkillValue || SkillValue >= MaxValue)
897 return false;
898
899 int32 Roll = irand(1, 1000);
900
901 if (Roll <= Chance)
902 {
903 uint32 new_value = SkillValue + step;
904 if (new_value > MaxValue)
905 new_value = MaxValue;
906
907 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, MaxValue));
908 if (itr->second.uState != SKILL_NEW)
909 itr->second.uState = SKILL_CHANGED;
910
911 for (std::size_t i = 0; i < bonusSkillLevelsSize; ++i)
912 {
913 uint32 bsl = bonusSkillLevels[i];
914 if (SkillValue < bsl && new_value >= bsl)
915 {
916 learnSkillRewardedSpells(SkillId, new_value);
917 break;
918 }
919 }
920 UpdateSkillEnchantments(SkillId, SkillValue, new_value);
922 SkillId);
923 LOG_DEBUG("entities.player.skills",
924 "Player::UpdateSkillPro Chance={:3.1f}% taken",
925 Chance / 10.0f);
926 return true;
927 }
928
929 LOG_DEBUG("entities.player.skills",
930 "Player::UpdateSkillPro Chance={:3.1f}% missed", Chance / 10.0f);
931 return false;
932}
static uint32 bonusSkillLevels[]
Definition: PlayerUpdates.cpp:866
static const std::size_t bonusSkillLevelsSize
Definition: PlayerUpdates.cpp:867
int32 irand(int32 min, int32 max)
Definition: Random.cpp:37
Definition: Group.h:143

References ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, bonusSkillLevels, bonusSkillLevelsSize, Object::GetUInt32Value(), irand(), learnSkillRewardedSpells(), LOG_DEBUG, MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_VALUE, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by UpdateCraftSkill(), UpdateFishingSkill(), and UpdateGatherSkill().

◆ UpdateSkillsForLevel()

void Player::UpdateSkillsForLevel ( )

update only level dependent max skill values

maximize skill always

update max skill value if current max skill not maximized

1035{
1036 uint16 maxconfskill = sWorld->GetConfigMaxSkillValue();
1037 uint32 maxSkill = GetMaxSkillValueForLevel();
1038
1039 bool alwaysMaxSkill =
1041
1042 for (SkillStatusMap::iterator itr = mSkillStatus.begin();
1043 itr != mSkillStatus.end(); ++itr)
1044 {
1045 if (itr->second.uState == SKILL_DELETED)
1046 continue;
1047
1048 uint32 pskill = itr->first;
1049 SkillRaceClassInfoEntry const* rcEntry =
1051 if (!rcEntry)
1052 continue;
1053
1054 if (GetSkillRangeType(rcEntry) != SKILL_RANGE_LEVEL)
1055 continue;
1056
1057 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
1058 uint32 data = GetUInt32Value(valueIndex);
1059 uint32 max = SKILL_MAX(data);
1060 uint32 val = SKILL_VALUE(data);
1061
1063 if (max != 1)
1064 {
1066 if (alwaysMaxSkill ||
1068 {
1069 SetUInt32Value(valueIndex,
1070 MAKE_SKILL_VALUE(maxSkill, maxSkill));
1071 if (itr->second.uState != SKILL_NEW)
1072 itr->second.uState = SKILL_CHANGED;
1073 }
1074 else if (max != maxconfskill)
1076 {
1077 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(val, maxSkill));
1078 if (itr->second.uState != SKILL_NEW)
1079 itr->second.uState = SKILL_CHANGED;
1080 }
1081 }
1082 }
1083}
@ CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL
Definition: IWorld.h:100

References CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL, SkillRaceClassInfoEntry::Flags, Unit::getClass(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), Object::GetUInt32Value(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_FLAG_ALWAYS_MAX_VALUE, SKILL_MAX, SKILL_NEW, SKILL_RANGE_LEVEL, SKILL_VALUE, and sWorld.

Referenced by GiveLevel(), InitStatsForLevel(), and LoadFromDB().

◆ UpdateSkillsToMaxSkillsForLevel()

void Player::UpdateSkillsToMaxSkillsForLevel ( )
1086{
1087 for (SkillStatusMap::iterator itr = mSkillStatus.begin();
1088 itr != mSkillStatus.end(); ++itr)
1089 {
1090 if (itr->second.uState == SKILL_DELETED)
1091 continue;
1092
1093 uint32 pskill = itr->first;
1094 if (IsProfessionOrRidingSkill(pskill))
1095 continue;
1096 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
1097 uint32 data = GetUInt32Value(valueIndex);
1098 uint32 max = SKILL_MAX(data);
1099
1100 if (max > 1)
1101 {
1102 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(max, max));
1103 if (itr->second.uState != SKILL_NEW)
1104 itr->second.uState = SKILL_CHANGED;
1105 }
1106 if (pskill == SKILL_DEFENSE)
1108 }
1109}

References Object::GetUInt32Value(), IsProfessionOrRidingSkill(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DEFENSE, SKILL_DELETED, SKILL_MAX, SKILL_NEW, and UpdateDefenseBonusesMod().

Referenced by GiveLevel(), and misc_commandscript::HandleMaxSkillCommand().

◆ UpdateSoulboundTradeItems()

void Player::UpdateSoulboundTradeItems ( )
4124{
4125 std::lock_guard<std::mutex> guard(m_soulboundTradableLock);
4126 if (m_itemSoulboundTradeable.empty())
4127 return;
4128
4129 // also checks for garbage data
4130 for (ItemDurationList::iterator itr = m_itemSoulboundTradeable.begin(); itr != m_itemSoulboundTradeable.end();)
4131 {
4132 ASSERT(*itr);
4133 if ((*itr)->GetOwnerGUID() != GetGUID())
4134 {
4135 m_itemSoulboundTradeable.erase(itr++);
4136 continue;
4137 }
4138 if ((*itr)->CheckSoulboundTradeExpire())
4139 {
4140 m_itemSoulboundTradeable.erase(itr++);
4141 continue;
4142 }
4143 ++itr;
4144 }
4145}

References ASSERT, Object::GetGUID(), m_itemSoulboundTradeable, and m_soulboundTradableLock.

Referenced by Update().

◆ UpdateSpeakTime()

void Player::UpdateSpeakTime ( ChatFloodThrottle::Index  index)
30{
31 // ignore chat spam protection for GMs in any mode
33 return;
34
35 uint32 limit, delay;
36 switch (index)
37 {
39 limit = sWorld->getIntConfig(CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT);
40 delay = sWorld->getIntConfig(CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY);
41 break;
43 limit = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_COUNT);
44 delay = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_DELAY);
45 [[fallthrough]];
46 default:
47 return;
48 }
49 time_t current = GameTime::GetGameTime().count();
50 if (m_chatFloodData[index].Time > current)
51 {
52 ++m_chatFloodData[index].Count;
53 if (m_chatFloodData[index].Count >= limit)
54 {
55 // prevent overwrite mute time, if message send just before mutes set, for example.
56 time_t new_mute = current + sWorld->getIntConfig(CONFIG_CHATFLOOD_MUTE_TIME);
57 if (GetSession()->m_muteTime < new_mute)
58 GetSession()->m_muteTime = new_mute;
59
60 m_chatFloodData[index].Count = 0;
61 }
62 }
63 else
64 m_chatFloodData[index].Count = 1;
65
66 m_chatFloodData[index].Time = current + delay;
67}
@ CONFIG_CHATFLOOD_MUTE_TIME
Definition: IWorld.h:285
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT
Definition: IWorld.h:283
@ CONFIG_CHATFLOOD_MESSAGE_DELAY
Definition: IWorld.h:282
@ CONFIG_CHATFLOOD_MESSAGE_COUNT
Definition: IWorld.h:281
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY
Definition: IWorld.h:284
std::array< ChatFloodThrottle, ChatFloodThrottle::MAX > m_chatFloodData
Definition: Player.h:2746
@ ADDON
Definition: Player.h:2295
@ REGULAR
Definition: Player.h:2294

References Player::ChatFloodThrottle::ADDON, CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT, CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY, CONFIG_CHATFLOOD_MESSAGE_COUNT, CONFIG_CHATFLOOD_MESSAGE_DELAY, CONFIG_CHATFLOOD_MUTE_TIME, GameTime::GetGameTime(), GetSession(), AccountMgr::IsPlayerAccount(), m_chatFloodData, WorldSession::m_muteTime, Player::ChatFloodThrottle::REGULAR, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode(), and WorldSession::HandleTextEmoteOpcode().

◆ UpdateSpecCount()

void Player::UpdateSpecCount ( uint8  count)
2145{
2146 uint32 curCount = GetSpecsCount();
2147 if (curCount == count)
2148 return;
2149
2150 if (m_activeSpec >= count)
2151 ActivateSpec(0);
2152
2153 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2154 CharacterDatabasePreparedStatement* stmt = nullptr;
2155
2156 // Copy spec data
2157 if (count > curCount)
2158 {
2159 _SaveActions(trans); // make sure the button list is cleaned up
2160 for (ActionButtonList::iterator itr = m_actionButtons.begin();
2161 itr != m_actionButtons.end(); ++itr)
2162 {
2163 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
2164 stmt->SetData(0, GetGUID().GetCounter());
2165 stmt->SetData(1, 1);
2166 stmt->SetData(2, itr->first);
2167 stmt->SetData(3, itr->second.GetAction());
2168 stmt->SetData(4, uint8(itr->second.GetType()));
2169 trans->Append(stmt);
2170 }
2171 }
2172 // Delete spec data for removed spec.
2173 else if (count < curCount)
2174 {
2175 _SaveActions(trans);
2176
2177 stmt = CharacterDatabase.GetPreparedStatement(
2179 stmt->SetData(0, m_activeSpec);
2180 stmt->SetData(1, GetGUID().GetCounter());
2181 trans->Append(stmt);
2182
2183 m_activeSpec = 0;
2184 }
2185
2186 CharacterDatabase.CommitTransaction(trans);
2187
2188 SetSpecsCount(count);
2189
2190 SendTalentsInfoData(false);
2191}
@ CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC
Definition: CharacterDatabase.h:457
void ActivateSpec(uint8 spec)
Definition: Player.cpp:15020
void SetSpecsCount(uint8 count)
Definition: Player.h:1725

References _SaveActions(), ActivateSpec(), CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, CHAR_INS_CHAR_ACTION, CharacterDatabase, Object::GetGUID(), GetSpecsCount(), m_actionButtons, m_activeSpec, SendTalentsInfoData(), PreparedStatementBase::SetData(), and SetSpecsCount().

◆ UpdateSpellCritChance()

void Player::UpdateSpellCritChance ( uint32  school)
823{
824 // For normal school set zero crit chance
825 if (school == SPELL_SCHOOL_NORMAL)
826 {
828 return;
829 }
830 // For others recalculate it from:
831 float crit = 0.0f;
832 // Crit from Intellect
834 // Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE
836 // Increase crit from SPELL_AURA_MOD_CRIT_PCT
838 // Increase crit by school from SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
840 // Increase crit from spell crit ratings
842
843 // Store crit value
845}
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition: SpellAuraDefines.h:134
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:120
@ SPELL_AURA_MOD_CRIT_PCT
Definition: SpellAuraDefines.h:353
float GetSpellCritFromIntellect()
Definition: Player.cpp:5109
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5915
int32 GetTotalAuraModifierAreaExclusive(AuraType auratype) const
Definition: Unit.cpp:5844

References CR_CRIT_SPELL, GetRatingBonusValue(), GetSpellCritFromIntellect(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierAreaExclusive(), Unit::GetTotalAuraModifierByMiscMask(), PLAYER_SPELL_CRIT_PERCENTAGE1, Object::SetFloatValue(), SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, and SPELL_SCHOOL_NORMAL.

Referenced by AuraEffect::HandleModSpellCritChanceShool(), and UpdateAllSpellCritChances().

◆ UpdateSpellDamageAndHealingBonus()

void Player::UpdateSpellDamageAndHealingBonus ( )
178{
179 // Magic damage modifiers implemented in Unit::SpellDamageBonusDone
180 // This information for client side use only
181 // Get healing bonus for all schools
183 // Get damage bonus for all schools
184 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
186}
void SetStatInt32Value(uint16 index, int32 value)
Definition: Object.cpp:798
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12642
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:11877

References MAX_SPELL_SCHOOL, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, Object::SetStatInt32Value(), SPELL_SCHOOL_HOLY, SPELL_SCHOOL_MASK_ALL, Unit::SpellBaseDamageBonusDone(), and Unit::SpellBaseHealingBonusDone().

Referenced by AuraEffect::HandleModHealingDone(), AuraEffect::HandleModSpellDamagePercentFromAttackPower(), AuraEffect::HandleModSpellDamagePercentFromStat(), AuraEffect::HandleModSpellHealingPercentFromAttackPower(), AuraEffect::HandleModSpellHealingPercentFromStat(), UpdateAllStats(), UpdateAttackPowerAndDamage(), and UpdateStats().

◆ UpdateSpellHitChances()

void Player::UpdateSpellHitChances ( )

◆ UpdateStats()

bool Player::UpdateStats ( Stats  stat)
overridevirtual

Implements Unit.

98{
99 if (stat > STAT_SPIRIT)
100 return false;
101
102 // value = ((base_value * base_pct) + total_value) * total_pct
103 float value = GetTotalStatValue(stat);
104
105 SetStat(stat, int32(value));
106
107 switch (stat)
108 {
109 case STAT_STRENGTH:
111 break;
112 case STAT_AGILITY:
113 UpdateArmor();
116 break;
117 case STAT_STAMINA:
119 break;
120 case STAT_INTELLECT:
123 UpdateArmor(); //SPELL_AURA_MOD_RESISTANCE_OF_INTELLECT_PERCENT, only armor currently
124 break;
125 default:
126 break;
127 }
128
129 if (stat == STAT_STRENGTH)
130 {
134 }
135 else if (stat == STAT_AGILITY)
136 {
139 }
140 else
141 {
142 // Need update (exist AP from stat auras)
147 }
148
151
152 // Update ratings in exist SPELL_AURA_MOD_RATING_FROM_STAT and only depends from stat
153 uint32 mask = 0;
155 for (AuraEffectList::const_iterator i = modRatingFromStat.begin(); i != modRatingFromStat.end(); ++i)
156 if (Stats((*i)->GetMiscValueB()) == stat)
157 mask |= (*i)->GetMiscValue();
158 if (mask)
159 {
160 for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating)
161 if (mask & (1 << rating))
162 ApplyRatingMod(CombatRating(rating), 0, true);
163 }
164 return true;
165}

References ApplyRatingMod(), Unit::GetAuraEffectsByType(), Unit::GetTotalStatValue(), Unit::HasAuraTypeWithMiscvalue(), MAX_COMBAT_RATING, POWER_MANA, Unit::SetStat(), SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RATING_FROM_STAT, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UpdateAllCritPercentages(), UpdateAllSpellCritChances(), UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDodgePercentage(), UpdateManaRegen(), UpdateMaxHealth(), UpdateMaxPower(), UpdateShieldBlockValue(), and UpdateSpellDamageAndHealingBonus().

◆ UpdateTitansGrip()

void Player::UpdateTitansGrip ( )

◆ UpdateTriggerVisibility()

void Player::UpdateTriggerVisibility ( )
1697{
1698 if (m_clientGUIDs.empty())
1699 return;
1700
1701 if (!IsInWorld())
1702 return;
1703
1704 UpdateData udata;
1705 WorldPacket packet;
1706 for (GuidUnorderedSet::iterator itr = m_clientGUIDs.begin();
1707 itr != m_clientGUIDs.end(); ++itr)
1708 {
1709 if ((*itr).IsCreatureOrVehicle())
1710 {
1711 Creature* creature = GetMap()->GetCreature(*itr);
1712 // Update fields of triggers, transformed units or unselectable
1713 // units (values dependent on GM state)
1714 if (!creature || (!creature->IsTrigger() &&
1715 !creature->HasAuraType(SPELL_AURA_TRANSFORM) &&
1717 continue;
1718
1720 creature->BuildValuesUpdateBlockForPlayer(&udata, this);
1722 }
1723 else if ((*itr).IsGameObject())
1724 {
1725 GameObject* go = GetMap()->GetGameObject(*itr);
1726 if (!go)
1727 continue;
1728
1730 go->BuildValuesUpdateBlockForPlayer(&udata, this);
1732 }
1733 }
1734
1735 if (!udata.HasData())
1736 return;
1737
1738 udata.BuildPacket(packet);
1739 GetSession()->SendPacket(&packet);
1740}
@ UF_FLAG_PUBLIC
Definition: UpdateFieldFlags.h:27
bool IsTrigger() const
Definition: Creature.h:78
void RemoveFieldNotifyFlag(uint16 flag)
Definition: Object.h:192
void SetFieldNotifyFlag(uint16 flag)
Definition: Object.h:191
bool HasData() const
Definition: UpdateData.h:60

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), Map::GetCreature(), Map::GetGameObject(), WorldObject::GetMap(), GetSession(), Unit::HasAuraType(), UpdateData::HasData(), Unit::HasUnitFlag(), Object::IsInWorld(), Creature::IsTrigger(), m_clientGUIDs, Object::RemoveFieldNotifyFlag(), WorldSession::SendPacket(), Object::SetFieldNotifyFlag(), SPELL_AURA_TRANSFORM, UF_FLAG_PUBLIC, and UNIT_FLAG_NOT_SELECTABLE.

Referenced by gm_commandscript::HandleGMOffCommand(), and gm_commandscript::HandleGMOnCommand().

◆ UpdateVisibilityForPlayer()

void Player::UpdateVisibilityForPlayer ( bool  mapChange = false)
1543{
1544 // After added to map seer must be a player - there is no possibility to
1545 // still have different seer (all charm auras must be already removed)
1546 if (mapChange && m_seer != this)
1547 {
1548 m_seer = this;
1549 }
1550
1551 Acore::VisibleNotifier notifierNoLarge(
1552 *this, mapChange,
1553 false); // visit only objects which are not large; default distance
1554 Cell::VisitAllObjects(m_seer, notifierNoLarge,
1556 notifierNoLarge.SendToSelf();
1557
1558 Acore::VisibleNotifier notifierLarge(
1559 *this, mapChange, true); // visit only large objects; maximum distance
1560 Cell::VisitAllObjects(m_seer, notifierLarge, GetSightRange());
1561 notifierLarge.SendToSelf();
1562
1563 if (mapChange)
1564 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
1565}
#define VISIBILITY_INC_FOR_GOBJECTS
Definition: ObjectDefines.h:28
float GetSightRange(WorldObject const *target=nullptr) const override
Definition: Player.cpp:16235
Position m_last_notify_position
Definition: Unit.h:1752
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:207
Definition: GridNotifiers.h:44

References GetSightRange(), Unit::m_last_notify_position, m_seer, Position::Relocate(), Acore::VisibleNotifier::SendToSelf(), VISIBILITY_INC_FOR_GOBJECTS, and Cell::VisitAllObjects().

Referenced by WorldSession::HandleFarSightOpcode(), SendInitialPacketsAfterAddToMap(), and UpdateObjectVisibility().

◆ UpdateVisibilityOf() [1/2]

template<class T >
void Player::UpdateVisibilityOf ( T *  target,
UpdateData data,
std::vector< Unit * > &  visibleNow 
)
1635{
1636 if (HaveAtClient(target))
1637 {
1638 if (!CanSeeOrDetect(target, false, true))
1639 {
1640 BeforeVisibilityDestroy<T>(target, this);
1641
1642 target->BuildOutOfRangeUpdateBlock(&data);
1643 m_clientGUIDs.erase(target->GetGUID());
1644 }
1645 }
1646 else
1647 {
1648 if (CanSeeOrDetect(target, false, true))
1649 {
1650 target->BuildCreateUpdateBlockForPlayer(&data, this);
1651 UpdateVisibilityOf_helper(m_clientGUIDs, target, visibleNow);
1652 }
1653 }
1654}
void UpdateVisibilityOf_helper(GuidUnorderedSet &s64, T *target, std::vector< Unit * > &)
Definition: PlayerUpdates.cpp:1588
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition: Object.cpp:1726
bool HaveAtClient(WorldObject const *u) const
Definition: Player.cpp:11365

References WorldObject::CanSeeOrDetect(), HaveAtClient(), m_clientGUIDs, and UpdateVisibilityOf_helper().

◆ UpdateVisibilityOf() [2/2]

void Player::UpdateVisibilityOf ( WorldObject target)
1668{
1669 if (HaveAtClient(target))
1670 {
1671 if (!CanSeeOrDetect(target, false, true))
1672 {
1673 if (target->IsCreature())
1675
1676 target->DestroyForPlayer(this);
1677 m_clientGUIDs.erase(target->GetGUID());
1678 }
1679 }
1680 else
1681 {
1682 if (CanSeeOrDetect(target, false, true))
1683 {
1684 target->SendUpdateToPlayer(this);
1685 m_clientGUIDs.insert(target->GetGUID());
1686
1687 // target aura duration for caster show only if target exist at
1688 // caster client send data at target visibility change (adding to
1689 // client)
1690 if (target->IsUnit())
1691 GetInitialVisiblePackets((Unit*) target);
1692 }
1693 }
1694}
void BeforeVisibilityDestroy< Creature >(Creature *t, Player *p)
Definition: PlayerUpdates.cpp:1626
void GetInitialVisiblePackets(Unit *target)
Definition: PlayerUpdates.cpp:1656

References BeforeVisibilityDestroy< Creature >(), WorldObject::CanSeeOrDetect(), Object::DestroyForPlayer(), Object::GetGUID(), GetInitialVisiblePackets(), HaveAtClient(), Object::IsCreature(), Object::IsUnit(), m_clientGUIDs, Object::SendUpdateToPlayer(), and Object::ToCreature().

Referenced by instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), Acore::VisibleNotifier::SendToSelf(), SetViewpoint(), Acore::VisibleNotifier::Visit(), Acore::PlayerRelocationNotifier::Visit(), and Acore::CreatureRelocationNotifier::Visit().

◆ UpdateWeaponSkill()

void Player::UpdateWeaponSkill ( Unit victim,
WeaponAttackType  attType,
Item item = nullptr 
)
935{
936 if (IsInFeralForm())
937 return; // always maximized SKILL_FERAL_COMBAT in fact
938
940 return; // use weapon but not skill up
941
942 if (victim->IsCreature() &&
945 return;
946
947 uint32 weapon_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_WEAPON);
948
949 Item* tmpitem = GetWeaponForAttack(attType, true);
950 if (item && item != tmpitem && !item->IsBroken())
951 {
952 tmpitem = item;
953 }
954
955 if (!tmpitem && attType == BASE_ATTACK)
956 {
957 // Keep unarmed & fist weapon skills in sync
958 UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
959 UpdateSkill(SKILL_FIST_WEAPONS, weapon_skill_gain);
960 }
961 else if (tmpitem && tmpitem->GetTemplate()->SubClass !=
963 {
964 switch (tmpitem->GetTemplate()->SubClass)
965 {
967 break;
969 UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
970 [[fallthrough]];
971 default:
972 UpdateSkill(tmpitem->GetSkill(), weapon_skill_gain);
973 break;
974 }
975 }
976
978}
@ ITEM_SUBCLASS_WEAPON_FIST
Definition: ItemTemplate.h:357
@ CREATURE_FLAG_EXTRA_NO_SKILL_GAINS
Definition: CreatureData.h:64
@ FORM_TREE
Definition: UnitDefines.h:71
@ CONFIG_SKILL_GAIN_WEAPON
Definition: IWorld.h:278

References BASE_ATTACK, CONFIG_SKILL_GAIN_WEAPON, CREATURE_FLAG_EXTRA_NO_SKILL_GAINS, CreatureTemplate::flags_extra, FORM_TREE, Creature::GetCreatureTemplate(), Unit::GetShapeshiftForm(), Item::GetSkill(), Item::GetTemplate(), GetWeaponForAttack(), Item::IsBroken(), Object::IsCreature(), Unit::IsInFeralForm(), ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_FIST, SKILL_FIST_WEAPONS, SKILL_UNARMED, ItemTemplate::SubClass, sWorld, Object::ToCreature(), UpdateAllCritPercentages(), and UpdateSkill().

Referenced by UpdateCombatSkills().

◆ UpdateZone()

void Player::UpdateZone ( uint32  newZone,
uint32  newArea 
)
1208{
1209 if (!newZone)
1210 {
1211 return;
1212 }
1213
1214 if (m_zoneUpdateId != newZone)
1215 {
1216 sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1217 sOutdoorPvPMgr->HandlePlayerEnterZone(this, newZone);
1218 sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1219 sBattlefieldMgr->HandlePlayerEnterZone(this, newZone);
1220 SendInitWorldStates(newZone,
1221 newArea); // only if really enters to new zone, not
1222 // just area change, works strange...
1223 if (Guild* guild = GetGuild())
1224 guild->UpdateMemberData(this, GUILD_MEMBER_DATA_ZONEID, newZone);
1225 }
1226
1227 // group update
1228 if (GetGroup())
1230
1231 m_zoneUpdateId = newZone;
1233
1234 // zone changed, so area changed as well, update it
1235 UpdateArea(newArea);
1236
1237 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(newZone);
1238 if (!zone)
1239 return;
1240
1241 if (sWorld->getBoolConfig(CONFIG_WEATHER))
1242 {
1243 if (Weather* weather = WeatherMgr::FindWeather(zone->ID))
1244 weather->SendWeatherUpdateToPlayer(this);
1245 else if (!WeatherMgr::AddWeather(zone->ID))
1246 // send fine weather packet to remove old zone's weather
1248 }
1249
1250 sScriptMgr->OnPlayerUpdateZone(this, newZone, newArea);
1251
1252 // in PvP, any not controlled zone (except zone->team == 6, default case)
1253 // in PvE, only opposition team capital
1254 switch (zone->team)
1255 {
1256 case AREATEAM_ALLY:
1258 GetTeamId(true) != TEAM_ALLIANCE &&
1259 (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL);
1260 break;
1261 case AREATEAM_HORDE:
1263 GetTeamId(true) != TEAM_HORDE &&
1264 (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL);
1265 break;
1266 case AREATEAM_NONE:
1267 // overwrite for battlegrounds, maybe batter some zone flags but current
1268 // known not 100% fit to this
1269 pvpInfo.IsInHostileArea = sWorld->IsPvPRealm() || InBattleground() ||
1271 break;
1272 default: // 6 in fact
1273 pvpInfo.IsInHostileArea = false;
1274 break;
1275 }
1276
1277 // Treat players having a quest flagging for PvP as always in hostile area
1279
1280 if (zone->flags & AREA_FLAG_CAPITAL) // Is in a capital city
1281 {
1282 if (!pvpInfo.IsHostile || zone->IsSanctuary())
1284
1285 pvpInfo.IsInNoPvPArea = true;
1286 }
1287 else
1288 RemoveRestFlag(REST_FLAG_IN_CITY); // Recently left a capital city
1289
1291
1292 // remove items with area/map limitations (delete only for alive player to
1293 // allow back in ghost mode) if player resurrected at teleport this will be
1294 // applied in resurrect code
1295 if (IsAlive())
1296 DestroyZoneLimitedItem(true, newZone);
1297
1298 // check some item equip limitations (in result lost CanTitanGrip at talent
1299 // reset, for example)
1301
1302 // recent client version not send leave/join channel packets for built-in
1303 // local channels
1304 UpdateLocalChannels(newZone);
1305
1306 UpdateZoneDependentAuras(newZone);
1307}
@ GROUP_UPDATE_FULL
Definition: Group.h:121
@ GUILD_MEMBER_DATA_ZONEID
Definition: Guild.h:61
@ REST_FLAG_IN_CITY
Definition: Player.h:815
@ CONFIG_WEATHER
Definition: IWorld.h:99
@ AREATEAM_HORDE
Definition: DBCEnums.h:58
@ AREATEAM_NONE
Definition: DBCEnums.h:56
@ AREATEAM_ALLY
Definition: DBCEnums.h:57
@ AREA_FLAG_CAPITAL
Definition: DBCEnums.h:242
@ AREA_FLAG_WINTERGRASP
Definition: DBCEnums.h:258
Weather * AddWeather(uint32 zone_id)
Add a Weather object to the list.
Definition: WeatherMgr.cpp:67
void SendFineWeatherUpdateToPlayer(Player *player)
Definition: WeatherMgr.cpp:145
Weather * FindWeather(uint32 id)
Find a Weather object by the given zoneid.
Definition: WeatherMgr.cpp:50
void UpdateLocalChannels(uint32 newZone)
Definition: PlayerUpdates.cpp:462
void SendInitWorldStates(uint32 zone, uint32 area)
Definition: Player.cpp:8143
void DestroyZoneLimitedItem(bool update, uint32 new_zone)
Definition: PlayerStorage.cpp:3327
Weather for one zone.
Definition: Weather.h:65
uint32 ID
Definition: DBCStructure.h:520
uint32 team
Definition: DBCStructure.h:529

References WeatherMgr::AddWeather(), AREA_FLAG_CAPITAL, AREA_FLAG_WINTERGRASP, AREATEAM_ALLY, AREATEAM_HORDE, AREATEAM_NONE, AutoUnequipOffhandIfNeed(), CONFIG_WEATHER, DestroyZoneLimitedItem(), WeatherMgr::FindWeather(), AreaTableEntry::flags, GetGroup(), GetGuild(), GetTeamId(), GROUP_UPDATE_FULL, GUILD_MEMBER_DATA_ZONEID, HasPvPForcingQuest(), AreaTableEntry::ID, InBattleground(), Unit::IsAlive(), PvPInfo::IsHostile, PvPInfo::IsInHostileArea, PvPInfo::IsInNoPvPArea, AreaTableEntry::IsSanctuary(), m_zoneUpdateId, m_zoneUpdateTimer, pvpInfo, RemoveRestFlag(), REST_FLAG_IN_CITY, sAreaTableStore, sBattlefieldMgr, WeatherMgr::SendFineWeatherUpdateToPlayer(), SendInitWorldStates(), SetGroupUpdateFlag(), SetRestFlag(), sOutdoorPvPMgr, sScriptMgr, sWorld, AreaTableEntry::team, TEAM_ALLIANCE, TEAM_HORDE, UpdateArea(), UpdateLocalChannels(), UpdatePvPState(), UpdateZoneDependentAuras(), and ZONE_UPDATE_INTERVAL.

Referenced by WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), ResurrectPlayer(), SendInitialPacketsAfterAddToMap(), Update(), and UpdatePosition().

◆ UpdateZoneDependentAuras()

void Player::UpdateZoneDependentAuras ( uint32  zone_id)
1804{
1805 // Some spells applied at enter into zone (with subzones), aura removed in
1806 // UpdateAreaDependentAuras that called always at zone->area update
1807 SpellAreaForAreaMapBounds saBounds =
1808 sSpellMgr->GetSpellAreaForAreaMapBounds(newZone);
1809 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first;
1810 itr != saBounds.second; ++itr)
1811 if (itr->second->autocast &&
1812 itr->second->IsFitToRequirements(this, newZone, 0))
1813 if (!HasAura(itr->second->spellId))
1814 CastSpell(this, itr->second->spellId, true);
1815}

References Unit::CastSpell(), Unit::HasAura(), and sSpellMgr.

Referenced by AddQuest(), CompleteQuest(), WorldSession::HandlePlayerLoginFromDB(), IncompleteQuest(), RemoveActiveQuest(), RewardQuest(), and UpdateZone().

◆ VehicleSpellInitialize()

void Player::VehicleSpellInitialize ( )
9526{
9527 Creature* vehicle = GetVehicleCreatureBase();
9528 if (!vehicle)
9529 return;
9530
9531 uint8 cooldownCount = vehicle->m_CreatureSpellCooldowns.size();
9532
9533 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * 10 + 1 + 1 + cooldownCount * (4 + 2 + 4 + 4));
9534 data << vehicle->GetGUID(); // Guid
9535 data << uint16(0); // Pet Family (0 for all vehicles)
9536 data << uint32(vehicle->IsSummon() ? vehicle->ToTempSummon()->GetTimer() : 0); // Duration
9537 // The following three segments are read by the client as one uint32
9538 data << uint8(vehicle->GetReactState()); // React State
9539 data << uint8(0); // Command State
9540 data << uint16(0x800); // DisableActions (set for all vehicles)
9541
9542 for (uint32 i = 0; i < MAX_CREATURE_SPELLS; ++i)
9543 {
9544 uint32 spellId = vehicle->m_spells[i];
9545 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9546 if (!spellInfo)
9547 {
9548 data << uint16(0) << uint8(0) << uint8(i + 8);
9549 continue;
9550 }
9551
9552 ConditionList conditions = sConditionMgr->GetConditionsForVehicleSpell(vehicle->GetEntry(), spellId);
9553 if (!sConditionMgr->IsObjectMeetToConditions(this, vehicle, conditions))
9554 {
9555 LOG_DEBUG("condition", "VehicleSpellInitialize: conditions not met for Vehicle entry {} spell {}", vehicle->ToCreature()->GetEntry(), spellId);
9556 data << uint16(0) << uint8(0) << uint8(i + 8);
9557 continue;
9558 }
9559
9560 if (spellInfo->IsPassive())
9561 vehicle->CastSpell(vehicle, spellId, true);
9562
9563 data << uint32(MAKE_UNIT_ACTION_BUTTON(spellId, i + 8));
9564 }
9565
9567 data << uint32(0);
9568
9569 data << uint8(0); // Auras?
9570
9571 // Cooldowns
9572 data << uint8(cooldownCount);
9573
9574 uint32 curTime = GameTime::GetGameTimeMS().count();
9576
9577 for (CreatureSpellCooldowns::const_iterator itr = vehicle->m_CreatureSpellCooldowns.begin(); itr != vehicle->m_CreatureSpellCooldowns.end(); ++itr)
9578 {
9579 uint16 category = itr->second.category;
9580 uint32 cooldown = (itr->second.end > curTime) ? itr->second.end - curTime : 0;
9581
9582 data << uint32(itr->first); // spellid
9583 data << uint16(itr->second.category); // spell category
9584
9585 // send infinity cooldown in special format
9586 if (itr->second.end >= infTime)
9587 {
9588 data << uint32(1); // cooldown
9589 data << uint32(0x80000000); // category cooldown
9590 continue;
9591 }
9592
9593 data << uint32(category ? 0 : cooldown); // cooldown
9594 data << uint32(category ? cooldown : 0); // category cooldown
9595 }
9596
9597 GetSession()->SendPacket(&data);
9598}
static constexpr uint32 MAX_CREATURE_SPELLS
Definition: Unit.h:45
#define MAX_SPELL_CONTROL_BAR
Definition: CharmInfo.h:26
uint32 m_spells[MAX_CREATURE_SPELLS]
Definition: Creature.h:251
uint32 GetTimer()
Definition: TemporarySummon.h:57
Creature * GetVehicleCreatureBase() const
Definition: Unit.cpp:18675
TempSummon * ToTempSummon()
Definition: Unit.h:1743
bool IsSummon() const
Definition: Unit.h:751

References Unit::CastSpell(), Object::GetEntry(), GameTime::GetGameTimeMS(), Object::GetGUID(), Creature::GetReactState(), GetSession(), TempSummon::GetTimer(), Unit::GetVehicleCreatureBase(), infinityCooldownDelayCheck, SpellInfo::IsPassive(), Unit::IsSummon(), LOG_DEBUG, Creature::m_CreatureSpellCooldowns, Creature::m_spells, MAKE_UNIT_ACTION_BUTTON, MAX_CREATURE_SPELLS, MAX_SPELL_CONTROL_BAR, sConditionMgr, WorldSession::SendPacket(), SMSG_PET_SPELLS, sSpellMgr, Object::ToCreature(), and Unit::ToTempSummon().

Referenced by Unit::SetCharmedBy().

◆ VisualizeItem()

void Player::VisualizeItem ( uint8  slot,
Item pItem 
)
2891{
2892 if (!pItem)
2893 return;
2894
2895 // check also BIND_WHEN_PICKED_UP and BIND_QUEST_ITEM for .additem or .additemset case by GM (not binded at adding to inventory)
2897 pItem->SetBinding(true);
2898
2899 LOG_DEBUG("entities.player.items", "STORAGE: EquipItem slot = {}, item = {}", slot, pItem->GetEntry());
2900
2901 m_items[slot] = pItem;
2902 SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID());
2905 pItem->SetSlot(slot);
2906 pItem->SetContainer(nullptr);
2907
2908 if (slot < EQUIPMENT_SLOT_END)
2909 SetVisibleItemSlot(slot, pItem);
2910
2911 pItem->SetState(ITEM_CHANGED, this);
2912}

References BIND_QUEST_ITEM, BIND_WHEN_EQUIPPED, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, EQUIPMENT_SLOT_END, Object::GetEntry(), Object::GetGUID(), Item::GetTemplate(), ITEM_CHANGED, ITEM_FIELD_CONTAINED, ITEM_FIELD_OWNER, LOG_DEBUG, m_items, PLAYER_FIELD_INV_SLOT_HEAD, Item::SetBinding(), Item::SetContainer(), Object::SetGuidValue(), Item::SetSlot(), Item::SetState(), and SetVisibleItemSlot().

Referenced by EquipItem(), and QuickEquipItem().

◆ Whisper() [1/2]

void Player::Whisper ( std::string_view  text,
Language  language,
Player receiver,
bool  = false 
)
overridevirtual

Handles whispers from Addons and players based on sender, receiver's guid and language.

Reimplemented from Unit.

9359{
9360 ASSERT(target);
9361
9362 bool isAddonMessage = language == LANG_ADDON;
9363
9364 if (!isAddonMessage) // if not addon data
9365 language = LANG_UNIVERSAL; // whispers should always be readable
9366
9367 std::string _text(text);
9368
9369 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_WHISPER, language, _text, target))
9370 {
9371 return;
9372 }
9373
9374 sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, target);
9375
9376 WorldPacket data;
9377 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, language, this, this, _text);
9378 target->GetSession()->SendPacket(&data);
9379
9380 // rest stuff shouldn't happen in case of addon message
9381 if (isAddonMessage)
9382 return;
9383
9384 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text);
9385 GetSession()->SendPacket(&data);
9386
9387 if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster())
9388 {
9389 SetAcceptWhispers(true);
9391 }
9392
9393 // announce afk or dnd message
9394 if (target->isAFK())
9395 {
9396 ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_AFK, target->GetName(), target->autoReplyMsg);
9397 }
9398 else if (target->isDND())
9399 {
9400 ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_DND, target->GetName(), target->autoReplyMsg);
9401 }
9402}
@ LANG_PLAYER_DND
Definition: Language.h:672
@ LANG_PLAYER_AFK
Definition: Language.h:673
@ LANG_COMMAND_WHISPERON
Definition: Language.h:330
@ CHAT_MSG_WHISPER_INFORM
Definition: SharedDefines.h:3161
@ CHAT_MSG_WHISPER
Definition: SharedDefines.h:3159
Language
Definition: SharedDefines.h:734
@ LANG_ADDON
Definition: SharedDefines.h:753
bool isAcceptWhispers() const
Definition: Player.h:1156

References ASSERT, autoReplyMsg, ChatHandler::BuildChatPacket(), CHAT_MSG_WHISPER, CHAT_MSG_WHISPER_INFORM, WorldObject::GetName(), GetSession(), isAcceptWhispers(), isAFK(), isDND(), IsGameMaster(), LANG_ADDON, LANG_COMMAND_WHISPERON, LANG_PLAYER_AFK, LANG_PLAYER_DND, LANG_UNIVERSAL, ChatHandler::PSendSysMessage(), WorldSession::SendPacket(), ChatHandler::SendSysMessage(), SetAcceptWhispers(), and sScriptMgr.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ Whisper() [2/2]

void Player::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
overridevirtual

Reimplemented from Unit.

9405{
9406 if (!target)
9407 return;
9408
9409 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
9410 if (!bct)
9411 {
9412 LOG_ERROR("entities.unit", "Player::Whisper: `broadcast_text` was not {} found", textId);
9413 return;
9414 }
9415
9417 WorldPacket data;
9418 if (isBossWhisper)
9419 ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_BOSS_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
9420 else
9421 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
9422 target->SendDirectMessage(&data);
9423}
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition: SharedDefines.h:3194
std::string const & GetText(LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false) const
Definition: ObjectMgr.h:457

References ChatHandler::BuildChatPacket(), CHAT_MSG_RAID_BOSS_WHISPER, CHAT_MSG_WHISPER, Unit::getGender(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Player::Yell ( std::string_view  text,
Language  language,
WorldObject const *  = nullptr 
)
overridevirtual

Handles yelled message in regular chat based on declared language and in config pre-defined Range.

Reimplemented from Unit.

9316{
9317 std::string _text(text);
9318
9319 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_YELL, language, _text))
9320 {
9321 return;
9322 }
9323
9324 sScriptMgr->OnPlayerChat(this, CHAT_MSG_YELL, language, _text);
9325
9326 WorldPacket data;
9327 ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, language, this, this, _text);
9328 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true, false, false, true);
9329}
@ CONFIG_LISTEN_RANGE_YELL
Definition: IWorld.h:201
@ CHAT_MSG_YELL
Definition: SharedDefines.h:3158

References ChatHandler::BuildChatPacket(), CHAT_MSG_YELL, CONFIG_LISTEN_RANGE_YELL, SendMessageToSetInRange(), sScriptMgr, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ Yell() [2/2]

void Player::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
overridevirtual

Reimplemented from Unit.

9332{
9333 Talk(textId, CHAT_MSG_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
9334}

References CHAT_MSG_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Friends And Related Function Documentation

◆ CinematicMgr

friend class CinematicMgr
friend

Referenced by Player().

◆ Item::AddToUpdateQueueOf

void Item::AddToUpdateQueueOf ( Player player)
friend

◆ Item::RemoveFromUpdateQueueOf

void Item::RemoveFromUpdateQueueOf ( Player player)
friend

◆ WorldSession

friend class WorldSession
friend

Member Data Documentation

◆ _activeCheats

uint32 Player::_activeCheats
private

◆ _BgBattlegroundQueueID

◆ _cinematicMgr

CinematicMgr* Player::_cinematicMgr
private

◆ _corpseLocation

◆ _farSightDistance

Optional<float> Player::_farSightDistance = { }
private

◆ _innTriggerId

uint32 Player::_innTriggerId
protected

◆ _instanceResetTimes

◆ _pendingBindId

uint32 Player::_pendingBindId
private

◆ _pendingBindTimer

uint32 Player::_pendingBindTimer
private

Referenced by SetPendingBind(), and Update().

◆ _restBonus

float Player::_restBonus
protected

◆ _restFlagMask

uint32 Player::_restFlagMask
protected

◆ _restTime

time_t Player::_restTime
protected

◆ _wasOutdoor

bool Player::_wasOutdoor
private

◆ autoReplyMsg

std::string Player::autoReplyMsg

◆ bgZoneIdToFillWorldStates

std::unordered_map< int, bgZoneRef > Player::bgZoneIdToFillWorldStates = {}
static

Referenced by SendInitWorldStates().

◆ duel

◆ healthBeforeDuel

uint32 Player::healthBeforeDuel
private

◆ isDebugAreaTriggers

◆ ItemSetEff

std::vector<ItemSetEffect*> Player::ItemSetEff

◆ m_achievementMgr

◆ m_actionButtons

◆ m_activeSpec

◆ m_additionalSaveMask

uint8 Player::m_additionalSaveMask
protected

◆ m_additionalSaveTimer

uint16 Player::m_additionalSaveTimer
protected

◆ m_ammoDPS

float Player::m_ammoDPS
protected

◆ m_AreaID

uint32 Player::m_AreaID
protected

◆ m_areaUpdateId

uint32 Player::m_areaUpdateId
protected

◆ m_ArenaTeamIdInvited

uint32 Player::m_ArenaTeamIdInvited
protected

◆ m_ArmorProficiency

uint32 Player::m_ArmorProficiency
protected

◆ m_atLoginFlags

uint32 Player::m_atLoginFlags
protected

◆ m_auraBaseMod

◆ m_auraRaidUpdateMask

◆ m_baseFeralAP

uint32 Player::m_baseFeralAP
protected

◆ m_baseHealthRegen

uint32 Player::m_baseHealthRegen
protected

◆ m_baseManaRegen

uint32 Player::m_baseManaRegen
protected

◆ m_baseRatingValue

int32 Player::m_baseRatingValue[MAX_COMBAT_RATING]
protected

◆ m_baseSpellPower

uint32 Player::m_baseSpellPower
protected

◆ m_bgData

◆ m_bHasDelayedTeleport

bool Player::m_bHasDelayedTeleport
private

◆ m_bMustDelayTeleport

bool Player::m_bMustDelayTeleport
private

◆ m_bPassOnGroupLoot

bool Player::m_bPassOnGroupLoot
protected

◆ m_canBlock

bool Player::m_canBlock
protected

Referenced by CanBlock(), Player(), and SetCanBlock().

◆ m_canKnockback

bool Player::m_canKnockback
private

◆ m_canParry

bool Player::m_canParry
protected

Referenced by CanParry(), Player(), and SetCanParry().

◆ m_canTeleport

bool Player::m_canTeleport
private

Referenced by CanTeleport(), Player(), and SetCanTeleport().

◆ m_canTitanGrip

bool Player::m_canTitanGrip
protected

◆ m_ChampioningFaction

uint32 Player::m_ChampioningFaction
private

◆ m_channels

◆ m_charmAISpells

uint32 Player::m_charmAISpells[NUM_CAI_SPELLS]
protected

◆ m_charmUpdateTimer

uint32 Player::m_charmUpdateTimer

Referenced by Player(), and Update().

◆ m_charSettingsMap

◆ m_chatFloodData

std::array<ChatFloodThrottle, ChatFloodThrottle::MAX> Player::m_chatFloodData
protected

Referenced by UpdateSpeakTime().

◆ m_cinematic

uint8 Player::m_cinematic
protected

◆ m_clientGUIDs

◆ m_contestedPvPTimer

uint32 Player::m_contestedPvPTimer
protected

◆ m_creationTime

Seconds Player::m_creationTime
private

◆ m_currentBuybackSlot

uint32 Player::m_currentBuybackSlot
protected

◆ m_DailyQuestChanged

bool Player::m_DailyQuestChanged
protected

◆ m_deathExpireTime

◆ m_deathTimer

◆ m_declinedname

DeclinedName* Player::m_declinedname
protected

◆ m_DelayedOperations

uint32 Player::m_DelayedOperations
private

◆ m_DFQuests

◆ m_divider

ObjectGuid Player::m_divider
protected

Referenced by GetDivider(), and SetDivider().

◆ m_drunkTimer

uint32 Player::m_drunkTimer
protected

◆ m_drwGUID

ObjectGuid Player::m_drwGUID

◆ m_dungeonDifficulty

Difficulty Player::m_dungeonDifficulty
protected

◆ m_enchantDuration

◆ m_entryPointData

◆ m_EquipmentSets

◆ m_extraBonusTalentCount

uint32 Player::m_extraBonusTalentCount
protected

◆ m_ExtraFlags

◆ m_flightSpellActivated

uint32 Player::m_flightSpellActivated
private

◆ m_foodEmoteTimerCount

uint32 Player::m_foodEmoteTimerCount
protected

Referenced by Player(), and RegenerateAll().

◆ m_forced_speed_changes

uint8 Player::m_forced_speed_changes[MAX_MOVE_TYPE]

◆ m_GlobalCooldownMgr

GlobalCooldownMgr Player::m_GlobalCooldownMgr
protected

Referenced by GetGlobalCooldownMgr().

◆ m_Glyphs

◆ m_grantableLevels

uint8 Player::m_grantableLevels
protected

◆ m_group

◆ m_groupInvite

Group* Player::m_groupInvite
protected

Referenced by GetGroupInvite(), and SetGroupInvite().

◆ m_groupUpdateMask

uint32 Player::m_groupUpdateMask
protected

◆ m_GuildIdInvited

uint32 Player::m_GuildIdInvited
protected

◆ m_homebindAreaId

uint16 Player::m_homebindAreaId

◆ m_homebindMapId

◆ m_HomebindTimer

uint32 Player::m_HomebindTimer

Referenced by Player(), and UpdateHomebindTime().

◆ m_homebindX

◆ m_homebindY

◆ m_homebindZ

◆ m_hostileReferenceCheckTimer

uint16 Player::m_hostileReferenceCheckTimer
protected

Referenced by Player(), and Update().

◆ m_ingametime

uint32 Player::m_ingametime
protected

◆ m_InstanceValid

◆ m_IsBGRandomWinner

bool Player::m_IsBGRandomWinner
protected

◆ m_isInSharedVisionOf

std::set<Unit*> Player::m_isInSharedVisionOf

◆ m_isInstantFlightOn

bool Player::m_isInstantFlightOn
private

◆ m_isInWater

bool Player::m_isInWater
private

Referenced by IsInWater(), Player(), and SetInWater().

◆ m_itemDuration

◆ m_items

◆ m_itemSoulboundTradeable

ItemDurationList Player::m_itemSoulboundTradeable
protected

◆ m_itemUpdateQueue

std::vector<Item*> Player::m_itemUpdateQueue
protected

◆ m_itemUpdateQueueBlocked

bool Player::m_itemUpdateQueueBlocked
protected

◆ m_Last_tick

time_t Player::m_Last_tick

Referenced by Create(), Player(), and Update().

◆ m_lastDailyQuestTime

time_t Player::m_lastDailyQuestTime
protected

◆ m_lastFallTime

uint32 Player::m_lastFallTime
private

◆ m_lastFallZ

float Player::m_lastFallZ
private

◆ m_lastHonorUpdateTime

time_t Player::m_lastHonorUpdateTime
protected

◆ m_lastpetnumber

uint32 Player::m_lastpetnumber
protected

◆ m_lastPotionId

uint32 Player::m_lastPotionId
protected

◆ m_logintime

time_t Player::m_logintime

Referenced by AddItemToBuyBackSlot(), and Player().

◆ m_lootGuid

ObjectGuid Player::m_lootGuid
protected

Referenced by GetLootGUID(), and SetLootGUID().

◆ m_mail

◆ m_mailsUpdated

◆ m_mapRef

MapReference Player::m_mapRef
private

Referenced by GetMapRef(), and SetMap().

◆ m_MirrorTimer

int32 Player::m_MirrorTimer[MAX_TIMERS]
private

◆ m_MirrorTimerFlags

uint8 Player::m_MirrorTimerFlags
private

◆ m_MirrorTimerFlagsLast

uint8 Player::m_MirrorTimerFlagsLast
private

◆ m_MonthlyQuestChanged

bool Player::m_MonthlyQuestChanged
protected

◆ m_monthlyquests

◆ m_MountBlockId

uint32 Player::m_MountBlockId
protected

◆ m_mover

◆ m_NeedToSaveGlyphs

bool Player::m_NeedToSaveGlyphs
protected

◆ m_needZoneUpdate

bool Player::m_needZoneUpdate
protected

◆ m_newVisible

std::vector<Unit*> Player::m_newVisible

◆ m_nextMailDelivereTime

time_t Player::m_nextMailDelivereTime

◆ m_nextSave

uint32 Player::m_nextSave
protected

◆ m_oldpetspell

uint32 Player::m_oldpetspell
private

◆ m_originalGroup

GroupReference Player::m_originalGroup
protected

◆ m_pendingSpectatorForBG

uint32 Player::m_pendingSpectatorForBG

◆ m_pendingSpectatorInviteInstanceId

uint32 Player::m_pendingSpectatorInviteInstanceId

◆ m_petStable

std::unique_ptr<PetStable> Player::m_petStable
private

◆ m_Played_time

◆ m_powerFraction

float Player::m_powerFraction[MAX_POWERS]
protected

Referenced by Player(), and Regenerate().

◆ m_questRewardTalentCount

uint32 Player::m_questRewardTalentCount
protected

◆ m_QuestStatus

◆ m_QuestStatusSave

◆ m_raidDifficulty

Difficulty Player::m_raidDifficulty
protected

◆ m_raidMapDifficulty

Difficulty Player::m_raidMapDifficulty
protected

◆ m_realDodge

float Player::m_realDodge
protected

◆ m_realParry

float Player::m_realParry
protected

◆ m_recallMap

uint32 Player::m_recallMap

Referenced by Player(), and SaveRecallPosition().

◆ m_recallO

float Player::m_recallO

Referenced by Player(), and SaveRecallPosition().

◆ m_recallX

float Player::m_recallX

Referenced by Player(), and SaveRecallPosition().

◆ m_recallY

float Player::m_recallY

Referenced by Player(), and SaveRecallPosition().

◆ m_recallZ

float Player::m_recallZ

Referenced by Player(), and SaveRecallPosition().

◆ m_receivedSpectatorResetFor

◆ m_refundableItems

RefundableItemsSet Player::m_refundableItems
private

◆ m_regenTimerCount

uint32 Player::m_regenTimerCount
protected

◆ m_reputationMgr

◆ m_resetTalentsCost

uint32 Player::m_resetTalentsCost
protected

◆ m_resetTalentsTime

time_t Player::m_resetTalentsTime
protected

◆ m_resurrectGUID

ObjectGuid Player::m_resurrectGUID
protected

◆ m_resurrectHealth

uint32 Player::m_resurrectHealth
protected

◆ m_resurrectMana

uint32 Player::m_resurrectMana
protected

◆ m_resurrectMap

uint32 Player::m_resurrectMap
protected

◆ m_resurrectX

float Player::m_resurrectX
protected

◆ m_resurrectY

float Player::m_resurrectY
protected

◆ m_resurrectZ

float Player::m_resurrectZ
protected

◆ m_RewardedQuests

◆ m_RewardedQuestsSave

QuestStatusSaveMap Player::m_RewardedQuestsSave
protected

◆ m_runes

◆ m_SeasonalQuestChanged

bool Player::m_SeasonalQuestChanged
protected

◆ m_seasonalquests

◆ m_seer

◆ m_session

◆ m_social

PlayerSocial* Player::m_social
protected

Referenced by GetSocial(), LoadFromDB(), and Player().

◆ m_soulboundTradableLock

std::mutex Player::m_soulboundTradableLock
protected

◆ m_specsCount

◆ m_spellCooldowns

◆ m_spellMods

◆ m_spellModTakingSpell

◆ m_spellPenetrationItemMod

int32 Player::m_spellPenetrationItemMod
protected

◆ m_spells

◆ m_summon_asSpectator

bool Player::m_summon_asSpectator
protected

◆ m_summon_expire

time_t Player::m_summon_expire
protected

◆ m_summon_mapid

uint32 Player::m_summon_mapid
protected

◆ m_summon_x

float Player::m_summon_x
protected

◆ m_summon_y

float Player::m_summon_y
protected

◆ m_summon_z

float Player::m_summon_z
protected

◆ m_swingErrorMsg

uint8 Player::m_swingErrorMsg
protected

Referenced by Player(), and Update().

◆ m_talents

◆ m_taxi

◆ m_team

TeamId Player::m_team
protected

◆ m_temporaryUnsummonedPetNumber

◆ m_timedquests

QuestSet Player::m_timedquests
protected

◆ m_trade

◆ m_usedTalentCount

uint32 Player::m_usedTalentCount
protected

◆ m_weaponChangeTimer

uint32 Player::m_weaponChangeTimer
protected

◆ m_WeaponProficiency

uint32 Player::m_WeaponProficiency
protected

◆ m_WeeklyQuestChanged

bool Player::m_WeeklyQuestChanged
protected

◆ m_weeklyquests

◆ m_zoneUpdateId

uint32 Player::m_zoneUpdateId
protected

◆ m_zoneUpdateTimer

uint32 Player::m_zoneUpdateTimer
protected

Referenced by Player(), Update(), and UpdateZone().

◆ manaBeforeDuel

uint32 Player::manaBeforeDuel
private

◆ mMitems

ItemMap Player::mMitems

◆ mSemaphoreTeleport_Far

time_t Player::mSemaphoreTeleport_Far
private

◆ mSemaphoreTeleport_Near

time_t Player::mSemaphoreTeleport_Near
private

◆ mSkillStatus

◆ PlayerTalkClass

PlayerMenu* Player::PlayerTalkClass

Referenced by AddGossipItemFor(), ClearGossipMenuFor(), CloseGossipMenuFor(), Spell::EffectQuestStart(), go_wind_stone::go_wind_stoneAI::GossipSelect(), OPvPCapturePointZM_GraveYard::HandleGossipOption(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandlePlayerLoginOpcode(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverCancel(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), WorldSession::HandleQuestgiverQueryQuestOpcode(), WorldSession::HandleQuestgiverRequestRewardOpcode(), WorldSession::HandleQuestgiverStatusQueryOpcode(), WorldSession::HandleQuestQueryOpcode(), npc_wg_quest_giver::OnGossipHello(), npc_elder_clearwater::OnGossipHello(), npc_experience::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), npc_cos_chromie_middle::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_icc_buff_switcher::OnGossipSelect(), OnGossipSelect(), Player(), PrepareGossipMenu(), PrepareQuestMenu(), WorldSession::SendBindPoint(), SendGossipMenuFor(), SendPreparedGossip(), SendPreparedQuest(), npc_costumed_orphan_matron::sGossipHello(), npc_pet_trainer::npc_pet_trainerAI::sGossipSelect(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_echo_of_medivh::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_sergeant_bly::npc_sergeant_blyAI::sGossipSelect(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), and ~Player().

◆ pvpInfo

◆ teleportStore_dest

WorldLocation Player::teleportStore_dest
private

Referenced by GetTeleportDest(), TeleportTo(), and Update().

◆ teleportStore_options

uint32 Player::teleportStore_options
private

Referenced by Player(), TeleportTo(), and Update().

◆ unReadMails

◆ WhisperList