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)
 
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 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 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.
 
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.
 
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.
 
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.
 
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)
 
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 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 ()
 
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.
 
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
 
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
 
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) const 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, bool includeMargin=false, Player const *skipped_rcvr=nullptr) const override
 
void SendMessageToSetInRange_OwnTeam (WorldPacket const *data, float dist, bool self) 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, float rate)
 
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.
 
uint32 GetMaxPersonalArenaRatingRequirement (uint32 minarenaslot) const
 If trans is specified, arena point save query will be added to trans.
 
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
 
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)
 
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.
 
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) const
 
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
 
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
 
bool SetWaterWalking (bool apply, bool packetOnly=false) override
 
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)
 
bool AttackStop ()
 
void RemoveAllAttackers ()
 
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)
 
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 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
 
uint32 getClassMask () const
 
uint8 getGender () 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)
 
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)
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 
void RemoveUnitFlag (UnitFlags flags)
 
void ReplaceAllUnitFlags (UnitFlags flags)
 
UnitFlags2 GetUnitFlags2 () const
 
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 (Unit *victim, uint32 SpellID, uint32 Damage, uint32 OverHeal, uint32 Absorb, 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.
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client.
 
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)
 
virtual bool SetWaterWalking (bool enable, bool packetOnly=false)
 
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)
 
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)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 modelId)
 
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-------—
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 
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----------------—
 
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--------------—
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void propagateSpeedChange ()
 -------—End of Pet responses methods-------—
 
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)
 
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
 
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.
 
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
 
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
 
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, bool includeMargin=false, Player const *skipped_rcvr=nullptr) 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 PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
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.
 
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
 
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) const
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target) const
 
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 &) const
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () 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.
 
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
 
float m_homebindO
 
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 _SaveSkills (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.
 
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) const 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) const
 
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
 

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
150 : Unit(true), m_mover(this)
151{
152#ifdef _MSC_VER
153#pragma warning(default:4355)
154#endif
155
158
160
161 m_session = session;
162
163 m_ingametime = 0;
164
165 m_ExtraFlags = 0;
166
167 m_spellModTakingSpell = nullptr;
168 //m_pad = 0;
169
170 // players always accept
172 SetAcceptWhispers(true);
173
177
178 m_regenTimer = 0;
182
185
186 m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
187
188 m_areaUpdateId = 0;
190
191 m_needZoneUpdate = false;
192
196
198
199 memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT);
200
201 m_social = nullptr;
202
203 // group is initialized in the reference constructor
204 SetGroupInvite(nullptr);
207 m_bPassOnGroupLoot = false;
208
211
213
216
218 m_bMustDelayTeleport = false;
219 m_bHasDelayedTeleport = false;
221 m_canTeleport = false;
222 m_canKnockback = false;
223
224 m_trade = nullptr;
225
226 m_cinematic = 0;
227
230
231 m_DailyQuestChanged = false;
233
234 for (uint8 i = 0; i < MAX_TIMERS; i++)
236
239 m_isInWater = false;
240 m_drunkTimer = 0;
241 m_deathTimer = 0;
243
245
246 m_swingErrorMsg = 0;
247
248 for (uint8 j = 0; j < PLAYER_MAX_BATTLEGROUND_QUEUES; ++j)
249 {
251 _BgBattlegroundQueueID[j].invitedToInstance = 0;
252 }
253
260 m_canParry = false;
261 m_canBlock = false;
262 m_canTitanGrip = false;
263 m_ammoDPS = 0.0f;
264
266 //cache for UNIT_CREATED_BY_SPELL to allow
267 //returning reagents for temporarily removed pets
268 //when dying/logging out
269 m_oldpetspell = 0;
270 m_lastpetnumber = 0;
271
273 _restTime = 0;
274 _innTriggerId = 0;
275 _restBonus = 0;
276 _restFlagMask = 0;
278
279 m_mailsUpdated = false;
280 unReadMails = 0;
281 m_nextMailDelivereTime = time_t(0);
282
286
287 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
289
291
292 m_HomebindTimer = 0;
293 m_InstanceValid = true;
297
298 m_lastPotionId = 0;
299
300 m_activeSpec = 0;
301 m_specsCount = 1;
302
303 for (uint8 i = 0; i < MAX_TALENT_SPECS; ++i)
304 {
305 for (uint8 g = 0; g < MAX_GLYPH_SLOT_INDEX; ++g)
306 m_Glyphs[i][g] = 0;
307 }
308
309 for (uint8 i = 0; i < BASEMOD_END; ++i)
310 {
311 m_auraBaseMod[i][FLAT_MOD] = 0.0f;
312 m_auraBaseMod[i][PCT_MOD] = 1.0f;
313 }
314
315 for (uint8 i = 0; i < MAX_COMBAT_RATING; i++)
316 m_baseRatingValue[i] = 0;
317
319 m_baseFeralAP = 0;
320 m_baseManaRegen = 0;
323
324 // Honor System
326
327 m_IsBGRandomWinner = false;
328
329 // Player summoning
330 m_summon_expire = 0;
331 m_summon_mapid = 0;
332 m_summon_x = 0.0f;
333 m_summon_y = 0.0f;
334 m_summon_z = 0.0f;
335 m_summon_asSpectator = false;
336
337 //m_mover = this;
339 m_seer = this;
340
341 m_recallMap = 0;
342 m_recallX = 0;
343 m_recallY = 0;
344 m_recallZ = 0;
345 m_recallO = 0;
346
347 m_homebindMapId = 0;
349 m_homebindX = 0;
350 m_homebindY = 0;
351 m_homebindZ = 0;
352 m_homebindO = 0;
353
355
356 m_declinedname = nullptr;
357
358 m_isActive = true;
359
360 m_runes = nullptr;
361
362 m_lastFallTime = 0;
363 m_lastFallZ = 0;
364
366
368
369 sWorld->IncreasePlayerCount();
370
372
373 for (uint8 i = 0; i < MAX_POWERS; ++i)
374 m_powerFraction[i] = 0;
375
376 isDebugAreaTriggers = false;
377
378 m_WeeklyQuestChanged = false;
379
380 m_MonthlyQuestChanged = false;
381
383
384 SetPendingBind(0, 0);
385
387
388 _cinematicMgr = new CinematicMgr(this);
389
391 m_reputationMgr = new ReputationMgr(this);
392
393 // Ours
394 m_NeedToSaveGlyphs = false;
395 m_MountBlockId = 0;
396 m_realDodge = 0.0f;
397 m_realParry = 0.0f;
400
402
403 for( int i = 0; i < NUM_CAI_SPELLS; ++i )
404 m_charmAISpells[i] = 0;
405
406 m_applyResilience = true;
407
408 m_isInstantFlightOn = true;
409
410 _wasOutdoor = true;
411 sScriptMgr->OnConstructPlayer(this);
412}
std::uint8_t uint8
Definition: Define.h:110
std::uint32_t uint32
Definition: Define.h:108
@ TYPEID_PLAYER
Definition: ObjectGuid.h:38
@ TYPEMASK_PLAYER
Definition: ObjectGuid.h:52
@ PLAYER_END
Definition: UpdateFields.h:392
@ NUM_CAI_SPELLS
Definition: Player.h:917
@ CHEAT_NONE
Definition: Player.h:990
@ BUYBACK_SLOT_START
Definition: Player.h:725
#define MAX_TIMERS
Definition: Player.h:579
#define DISABLED_MIRROR_TIMER
Definition: Player.h:580
@ PLAYED_TIME_TOTAL
Definition: Player.h:848
@ PLAYED_TIME_LEVEL
Definition: Player.h:849
@ UNDERWATER_NONE
Definition: Player.h:101
@ AT_LOGIN_NONE
Definition: Player.h:600
@ PLAYER_SLOTS_COUNT
Definition: Player.h:668
@ FLAT_MOD
Definition: Unit.h:308
@ PCT_MOD
Definition: Unit.h:309
#define MAX_MOVE_TYPE
Definition: Unit.h:389
#define MAX_COMBAT_RATING
Definition: Unit.h:431
@ BASEMOD_END
Definition: Unit.h:303
#define sScriptMgr
Definition: ScriptMgr.h:2702
@ CONFIG_INTERVAL_SAVE
Definition: IWorld.h:212
@ RAID_DIFFICULTY_10MAN_NORMAL
Definition: DBCEnums.h:278
@ DUNGEON_DIFFICULTY_NORMAL
Definition: DBCEnums.h:274
@ MAX_POWERS
Definition: SharedDefines.h:248
#define MAX_TALENT_SPECS
Definition: SharedDefines.h:647
@ TEAM_NEUTRAL
Definition: SharedDefines.h:734
#define MAX_GLYPH_SLOT_INDEX
Definition: SharedDefines.h:648
@ BATTLEGROUND_QUEUE_NONE
Definition: SharedDefines.h:3592
#define PLAYER_MAX_BATTLEGROUND_QUEUES
Definition: SharedDefines.h:148
#define sWorld
Definition: World.h:451
bool IsPlayerAccount(uint32 gmlevel)
Definition: AccountMgr.cpp:276
uint32 GetSecurity(uint32 accountId)
Definition: AccountMgr.cpp:209
Seconds GetGameTime()
Definition: GameTime.cpp:38
Definition: AchievementMgr.h:280
Definition: GossipDef.h:258
Definition: Item.h:214
uint16 m_objectType
Definition: Object.h:228
uint16 m_valuesCount
Definition: Object.h:242
TypeID m_objectTypeId
Definition: Object.h:230
bool m_isActive
Definition: Object.h:624
bool m_canParry
Definition: Player.h:2807
time_t m_summon_expire
Definition: Player.h:2840
bool m_needZoneUpdate
Definition: Player.h:2857
uint16 m_additionalSaveTimer
Definition: Player.h:2714
float m_ammoDPS
Definition: Player.h:2811
uint32 m_temporaryUnsummonedPetNumber
Definition: Player.h:2911
uint32 m_ChampioningFaction
Definition: Player.h:2919
bool m_bHasDelayedTeleport
Definition: Player.h:2904
bool m_InstanceValid
Definition: Player.h:2386
time_t m_deathExpireTime
Definition: Player.h:2803
ReputationMgr * m_reputationMgr
Definition: Player.h:2915
float m_auraBaseMod[BASEMOD_END][MOD_END]
Definition: Player.h:2758
float m_homebindZ
Definition: Player.h:2322
uint32 m_lastFallTime
Definition: Player.h:2888
uint32 m_lastPotionId
Definition: Player.h:2747
CinematicMgr * _cinematicMgr
Definition: Player.h:2867
bool m_canTeleport
Definition: Player.h:2905
uint32 m_usedTalentCount
Definition: Player.h:2821
friend class CinematicMgr
Definition: Player.h:1048
bool m_MonthlyQuestChanged
Definition: Player.h:2791
PlayerSocial * m_social
Definition: Player.h:2826
uint32 m_homebindMapId
Definition: Player.h:2318
void SetAcceptWhispers(bool on)
Definition: Player.h:1135
float m_summon_z
Definition: Player.h:2844
time_t m_lastHonorUpdateTime
Definition: Player.h:2707
time_t _restTime
Definition: Player.h:2814
SafeUnitPointer m_mover
Definition: Player.h:2282
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition: Player.h:2350
uint32 _activeCheats
Definition: Player.h:2925
uint32 m_resetTalentsCost
Definition: Player.h:2819
uint8 m_MirrorTimerFlags
Definition: Player.h:2892
uint32 m_atLoginFlags
Definition: Player.h:2722
uint32 m_ExtraFlags
Definition: Player.h:2730
float m_recallX
Definition: Player.h:2309
uint32 m_ingametime
Definition: Player.h:2636
float m_recallO
Definition: Player.h:2312
bool m_WeeklyQuestChanged
Definition: Player.h:2790
uint8 unReadMails
Definition: Player.h:1619
uint32 m_pendingSpectatorInviteInstanceId
Definition: Player.h:2535
void SetGroupInvite(Group *group)
Definition: Player.h:2417
uint32 m_DelayedOperations
Definition: Player.h:2902
TradeData * m_trade
Definition: Player.h:2787
float m_realParry
Definition: Player.h:2592
uint32 m_nextSave
Definition: Player.h:2713
uint32 m_zoneUpdateTimer
Definition: Player.h:2799
bool m_mailsUpdated
Definition: Player.h:1555
time_t mSemaphoreTeleport_Far
Definition: Player.h:2900
float _restBonus
Definition: Player.h:2816
uint32 m_foodEmoteTimerCount
Definition: Player.h:2598
uint32 m_baseFeralAP
Definition: Player.h:2761
float m_summon_y
Definition: Player.h:2843
WorldObject * m_seer
Definition: Player.h:2283
float m_summon_x
Definition: Player.h:2842
uint32 m_charmAISpells[NUM_CAI_SPELLS]
Definition: Player.h:2594
uint8 m_additionalSaveMask
Definition: Player.h:2715
bool m_bMustDelayTeleport
Definition: Player.h:2903
bool m_SeasonalQuestChanged
Definition: Player.h:2792
TeamId m_team
Definition: Player.h:2712
uint32 m_areaUpdateId
Definition: Player.h:2800
uint8 m_specsCount
Definition: Player.h:2752
uint32 m_extraBonusTalentCount
Definition: Player.h:2823
WorldSession * GetSession() const
Definition: Player.h:1948
float m_powerFraction[MAX_POWERS]
Definition: Player.h:2599
uint32 m_oldpetspell
Definition: Player.h:2912
Runes * m_runes
Definition: Player.h:2848
uint32 m_currentBuybackSlot
Definition: Player.h:2725
uint32 m_deathTimer
Definition: Player.h:2802
uint32 m_regenTimerCount
Definition: Player.h:2597
AchievementMgr * m_achievementMgr
Definition: Player.h:2914
uint8 m_swingErrorMsg
Definition: Player.h:2810
time_t m_nextMailDelivereTime
Definition: Player.h:1620
std::array< BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES > _BgBattlegroundQueueID
Definition: Player.h:2612
void clearResurrectRequestData()
Definition: Player.h:1776
bool m_bPassOnGroupLoot
Definition: Player.h:2834
float m_recallZ
Definition: Player.h:2311
uint32 m_pendingSpectatorForBG
Definition: Player.h:2534
bool m_DailyQuestChanged
Definition: Player.h:2789
uint32 m_Glyphs[MAX_TALENT_SPECS][MAX_GLYPH_SLOT_INDEX]
Definition: Player.h:2754
Difficulty m_dungeonDifficulty
Definition: Player.h:2718
uint32 m_weaponChangeTimer
Definition: Player.h:2796
uint32 m_WeaponProficiency
Definition: Player.h:2805
float m_realDodge
Definition: Player.h:2591
bool m_canKnockback
Definition: Player.h:2906
bool m_isInstantFlightOn
Definition: Player.h:2931
time_t mSemaphoreTeleport_Near
Definition: Player.h:2899
DeclinedName * m_declinedname
Definition: Player.h:2847
bool m_IsBGRandomWinner
Definition: Player.h:2614
uint32 m_drunkTimer
Definition: Player.h:2795
uint32 m_contestedPvPTimer
Definition: Player.h:2600
float m_homebindY
Definition: Player.h:2321
float m_homebindO
Definition: Player.h:2323
uint32 m_Played_time[MAX_PLAYED_TIME_INDEX]
Definition: Player.h:1161
uint32 m_baseSpellPower
Definition: Player.h:2760
bool _wasOutdoor
Definition: Player.h:2939
void SetPendingBind(uint32 instanceId, uint32 bindTimer)
Definition: Player.h:2388
uint32 _restFlagMask
Definition: Player.h:2817
uint8 m_grantableLevels
Definition: Player.h:2855
Item * m_items[PLAYER_SLOTS_COUNT]
Definition: Player.h:2724
uint16 m_homebindAreaId
Definition: Player.h:2319
Difficulty m_raidMapDifficulty
Definition: Player.h:2720
uint32 m_zoneUpdateId
Definition: Player.h:2798
bool m_isInWater
Definition: Player.h:2894
uint8 m_MirrorTimerFlagsLast
Definition: Player.h:2893
time_t m_lastDailyQuestTime
Definition: Player.h:2793
time_t m_resetTalentsTime
Definition: Player.h:2820
uint32 m_baseHealthRegen
Definition: Player.h:2763
uint32 m_charmUpdateTimer
Definition: Player.h:2546
uint32 m_summon_mapid
Definition: Player.h:2841
Difficulty m_raidDifficulty
Definition: Player.h:2719
float m_lastFallZ
Definition: Player.h:2889
bool m_summon_asSpectator
Definition: Player.h:2845
uint32 m_baseManaRegen
Definition: Player.h:2762
time_t m_logintime
Definition: Player.h:1159
int32 m_MirrorTimer[MAX_TIMERS]
Definition: Player.h:2891
uint32 _innTriggerId
Definition: Player.h:2815
uint32 m_ArenaTeamIdInvited
Definition: Player.h:2742
uint32 m_recallMap
Definition: Player.h:2308
float m_recallY
Definition: Player.h:2310
uint32 m_questRewardTalentCount
Definition: Player.h:2822
bool m_NeedToSaveGlyphs
Definition: Player.h:2587
uint32 m_HomebindTimer
Definition: Player.h:2385
uint64 m_auraRaidUpdateMask
Definition: Player.h:2833
bool m_canTitanGrip
Definition: Player.h:2809
bool m_canBlock
Definition: Player.h:2808
uint8 m_cinematic
Definition: Player.h:2785
int32 m_spellPenetrationItemMod
Definition: Player.h:2764
uint8 m_activeSpec
Definition: Player.h:2751
WorldSession * m_session
Definition: Player.h:2780
uint32 m_flightSpellActivated
Definition: Player.h:2933
uint32 teleportStore_options
Definition: Player.h:2898
int32 m_baseRatingValue[MAX_COMBAT_RATING]
Definition: Player.h:2759
uint32 m_ArmorProficiency
Definition: Player.h:2806
bool isDebugAreaTriggers
Definition: Player.h:2503
uint32 m_groupUpdateMask
Definition: Player.h:2832
Spell * m_spellModTakingSpell
Definition: Player.h:2499
uint32 m_lastpetnumber
Definition: Player.h:2837
time_t m_Last_tick
Definition: Player.h:1160
PlayerMenu * PlayerTalkClass
Definition: Player.h:2188
uint32 m_GuildIdInvited
Definition: Player.h:2741
float m_homebindX
Definition: Player.h:2320
uint16 m_hostileReferenceCheckTimer
Definition: Player.h:2716
bool m_itemUpdateQueueBlocked
Definition: Player.h:2728
uint32 m_MountBlockId
Definition: Player.h:2589
void Initialize(Unit *defVal)
Definition: Unit.h:1277
Definition: Unit.h:1290
int32 m_regenTimer
Definition: Unit.h:2528
bool m_ControlledByPlayer
Definition: Unit.h:2362
SafeUnitPointer m_movedByPlayer
Definition: Unit.h:1888
bool m_applyResilience
Definition: Unit.h:2541
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_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_homebindO, 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
415{
416 sScriptMgr->OnDestructPlayer(this);
417
418 // it must be unloaded already in PlayerLogout and accessed only for loggined player
419 //m_social = nullptr;
420
421 // Note: buy back item already deleted from DB when player was saved
422 for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; ++i)
423 delete m_items[i];
424
425 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
426 delete itr->second;
427
428 for (PlayerTalentMap::const_iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
429 delete itr->second;
430
431 //all mailed items should be deleted, also all mail should be deallocated
432 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
433 {
434 delete *itr;
435 }
436
437 for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
438 delete iter->second; //if item is duplicated... then server may crash ... but that item should be deallocated
439
440 delete PlayerTalkClass;
441
442 for (size_t x = 0; x < ItemSetEff.size(); x++)
443 delete ItemSetEff[x];
444
445 delete m_declinedname;
446 delete m_runes;
447 delete m_achievementMgr;
448 delete m_reputationMgr;
449
450 sWorld->DecreasePlayerCount();
451
452 if (!m_isInSharedVisionOf.empty())
453 {
454 do
455 {
456 Unit* u = *(m_isInSharedVisionOf.begin());
457 u->RemovePlayerFromVision(this);
458 } while (!m_isInSharedVisionOf.empty());
459 }
460}
ItemMap mMitems
Definition: Player.h:1624
PlayerSpellMap m_spells
Definition: Player.h:2745
std::vector< ItemSetEffect * > ItemSetEff
Definition: Player.h:2189
PlayerMails m_mail
Definition: Player.h:2744
PlayerTalentMap m_talents
Definition: Player.h:2746
std::set< Unit * > m_isInSharedVisionOf
Definition: Player.h:2284
void RemovePlayerFromVision(Player *player)
Definition: Unit.cpp:11136

References 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
3043{
3044 // pussywizard: this can be called to OVERWRITE currently existing spell params! usually to set active = false for lower ranks of a spell
3045
3046 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3047 if (!SpellMgr::CheckSpellValid(spellInfo, spellId, false))
3048 return false;
3049
3050 // pussywizard: already found and temporary, nothing to do
3051 PlayerSpellMap::iterator itr = m_spells.find(spellId);
3052 if (itr != m_spells.end() && itr->second->State == PLAYERSPELL_TEMPORARY)
3053 return false;
3054
3055 // xinef: send packet so client can properly recognize this new spell
3056 // xinef: ignore passive spells and spells with learn effect
3057 // xinef: send spells with no aura effects (ie dual wield)
3058 if (IsInWorld() && !isBeingLoaded() && temporary && !learnFromSkill && (!spellInfo->HasAttribute(SpellAttr0(SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) || !spellInfo->HasAnyAura()) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3059 SendLearnPacket(spellInfo->Id, true);
3060
3061 // xinef: DO NOT allow to learn spell with effect learn spell!
3062 // xinef: if spell possess spell learn effects only, learn those spells as temporary (eg. Metamorphosis, Tree of Life)
3063 if (temporary && spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3064 {
3065 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3066 if (spellInfo->Effects[i].IsEffect())
3067 {
3068 if (spellInfo->Effects[i].Effect != SPELL_EFFECT_LEARN_SPELL)
3069 {
3070 LOG_INFO("entities.player", "TRYING TO LEARN SPELL WITH EFFECT LEARN: {}, PLAYER: {}", spellId, GetGUID().ToString());
3071 return false;
3072 //ABORT();
3073 }
3074 else if (SpellInfo const* learnSpell = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
3076 }
3077
3078 return false;
3079 }
3080
3081 if (itr != m_spells.end()) // pussywizard: already know this spell, so update information
3082 {
3083 // pussywizard: do nothing if already set as wanted
3084 if (itr->second->State != PLAYERSPELL_REMOVED && (itr->second->specMask & addSpecMask) == addSpecMask)
3085 return false;
3086
3087 // pussywizard: need cast auras, learn linked spells, do professions stuff, etc.
3088 // pussywizard: but only for spells that are really added (inactive -> active OR added to current spec)
3089 bool spellIsNew = true;
3090
3091 // pussywizard: present in m_spells, not removed, already in current spec, already active
3092 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec))
3093 spellIsNew = false;
3094
3095 // pussywizard: update info in m_spells
3096 if (itr->second->State != PLAYERSPELL_NEW && (itr->second->specMask & addSpecMask) != addSpecMask)
3097 itr->second->State = PLAYERSPELL_CHANGED;
3098 itr->second->Active = true;
3099 itr->second->specMask |= addSpecMask;
3100
3101 if (!spellIsNew)
3102 return true;
3103 }
3104 else // pussywizard: not found in m_spells
3105 {
3106 PlayerSpell* newspell = new PlayerSpell;
3107 newspell->Active = true;
3109 newspell->specMask = addSpecMask;
3110
3111 m_spells[spellId] = newspell;
3112 }
3113
3114 // pussywizard: return if spell not in current spec
3115 // pussywizard: return true to fix active for ranks, this condition is true only at loading, so no problems with learning packets
3116 if (!((1 << GetActiveSpec()) & addSpecMask))
3117 return true;
3118
3119 // xinef: do not add spells with effect learn spell
3120 if (spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3121 {
3122 LOG_INFO("entities.player", "TRYING TO LEARN SPELL WITH EFFECT LEARN 2: {}, PLAYER: {}", spellId, GetGUID().ToString());
3123 m_spells.erase(spellInfo->Id); // mem leak, but should never happen
3124 return false;
3125 //ABORT();
3126 }
3127 // pussywizard: cast passive spells (including all talents without SPELL_EFFECT_LEARN_SPELL) with additional checks
3128 else if (spellInfo->IsPassive() || (spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY) && spellInfo->Stances))
3129 {
3130 if (IsNeedCastPassiveSpellAtLearn(spellInfo))
3131 CastSpell(this, spellId, true);
3132 }
3133 // pussywizard: cast and return, learnt spells will update profession count, etc.
3134 else if (spellInfo->HasEffect(SPELL_EFFECT_SKILL_STEP))
3135 {
3136 CastSpell(this, spellId, true);
3137 return false;
3138 }
3139
3140 // xinef: unapply aura stats if dont meet requirements
3141 // xinef: handle only if player is not loaded, loading is handled in loadfromdb
3142 if (!isBeingLoaded())
3143 if (Aura* aura = GetAura(spellId))
3144 {
3145 if (aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTHLESS_35_PERCENT ||
3146 aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTH_ABOVE_75_PERCENT ||
3147 aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTHLESS_20_PERCENT )
3148 if (!HasAuraState((AuraStateType)aura->GetSpellInfo()->CasterAuraState))
3149 aura->HandleAllEffects(aura->GetApplicationOfTarget(GetGUID()), AURA_EFFECT_HANDLE_REAL, false);
3150 }
3151
3152 // pussywizard: update free primary prof points
3153 if (uint32 freeProfs = GetFreePrimaryProfessionPoints())
3154 {
3155 if (spellInfo->IsPrimaryProfessionFirstRank())
3156 SetFreePrimaryProfessions(freeProfs - 1);
3157 }
3158
3159 uint16 maxskill = GetMaxSkillValueForLevel();
3160 SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spellId);
3161 SkillLineAbilityMapBounds skill_bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellId);
3162 // xinef: set appropriate skill value
3163 if (spellLearnSkill)
3164 {
3165 uint32 skill_value = GetPureSkillValue(spellLearnSkill->skill);
3166 uint32 skill_max_value = GetPureMaxSkillValue(spellLearnSkill->skill);
3167 uint32 new_skill_max_value = spellLearnSkill->maxvalue == 0 ? maxskill : spellLearnSkill->maxvalue;
3168
3169 if (skill_value < spellLearnSkill->value)
3170 skill_value = spellLearnSkill->value;
3171 if (skill_max_value < new_skill_max_value)
3172 skill_max_value = new_skill_max_value;
3173
3174 SetSkill(spellLearnSkill->skill, spellLearnSkill->step, skill_value, skill_max_value);
3175 }
3176 else
3177 {
3178 // not ranked skills
3179 for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
3180 {
3181 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine);
3182 if (!pSkill)
3183 {
3184 continue;
3185 }
3186
3188 // Added for runeforging, it is confirmed via sniff that this happens when death knights learn the spell, not on character creation.
3189 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))
3190 {
3191 LearnDefaultSkill(pSkill->id, 0);
3192 }
3193
3194 if (pSkill->id == SKILL_MOUNTS && !Has310Flyer(false))
3195 {
3196 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3197 {
3198 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && spellInfo->Effects[i].CalcValue() == 310)
3199 {
3200 SetHas310Flyer(true);
3201 }
3202 }
3203 }
3204 }
3205 }
3206
3207 // xinef: update achievement criteria
3208 if (!GetSession()->PlayerLoading())
3209 {
3210 for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
3211 {
3214 }
3216 }
3217
3218 return true;
3219}
std::uint16_t uint16
Definition: Define.h:109
#define LOG_INFO(filterType__,...)
Definition: Log.h:167
DBCStorage< SkillLineEntry > sSkillLineStore(SkillLinefmt)
#define SPEC_MASK_ALL
Definition: Player.h:178
@ PLAYERSPELL_REMOVED
Definition: Player.h:123
@ PLAYERSPELL_UNCHANGED
Definition: Player.h:120
@ PLAYERSPELL_CHANGED
Definition: Player.h:121
@ PLAYERSPELL_NEW
Definition: Player.h:122
@ PLAYERSPELL_TEMPORARY
Definition: Player.h:124
@ SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
Definition: SpellAuraDefines.h:270
@ AURA_EFFECT_HANDLE_REAL
Definition: SpellAuraDefines.h:42
#define sSpellMgr
Definition: SpellMgr.h:818
std::pair< SkillLineAbilityMap::const_iterator, SkillLineAbilityMap::const_iterator > SkillLineAbilityMapBounds
Definition: SpellMgr.h:577
@ SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN
Definition: DBCEnums.h:366
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL
Definition: DBCEnums.h:154
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS
Definition: DBCEnums.h:191
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE
Definition: DBCEnums.h:224
#define MAX_SPELL_EFFECTS
Definition: DBCStructure.h:1610
@ SPELL_EFFECT_LEARN_SPELL
Definition: SharedDefines.h:786
@ SPELL_EFFECT_SKILL_STEP
Definition: SharedDefines.h:794
SpellAttr0
Definition: SharedDefines.h:353
@ SPELL_ATTR0_PASSIVE
Definition: SharedDefines.h:360
@ SPELL_ATTR0_DO_NOT_DISPLAY
Definition: SharedDefines.h:361
AuraStateType
Definition: SharedDefines.h:1260
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition: SharedDefines.h:1277
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition: SharedDefines.h:1287
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition: SharedDefines.h:1265
@ SKILL_RUNEFORGING
Definition: SharedDefines.h:2976
@ SKILL_LOCKPICKING
Definition: SharedDefines.h:2947
@ SKILL_MOUNTS
Definition: SharedDefines.h:2977
bool IsInWorld() const
Definition: Object.h:101
ObjectGuid GetGUID() const
Definition: Object.h:107
std::string ToString() const
Definition: Position.cpp:51
Definition: Player.h:128
PlayerSpellState State
Definition: Player.h:129
bool Active
Definition: Player.h:130
uint8 specMask
Definition: Player.h:131
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: PlayerUpdates.cpp:2128
bool _addSpell(uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill=false)
Definition: Player.cpp:3042
void learnSpell(uint32 spellId, bool temporary=false, bool learnFromSkill=false)
Definition: Player.cpp:3230
void LearnDefaultSkill(uint32 skillId, uint16 rank)
Definition: Player.cpp:11772
bool isBeingLoaded() const override
Definition: PlayerStorage.cpp:4940
void SendLearnPacket(uint32 spellId, bool learn)
Definition: Player.cpp:2978
uint16 GetMaxSkillValueForLevel() const
Definition: Player.cpp:16119
bool IsNeedCastPassiveSpellAtLearn(SpellInfo const *spellInfo) const
Definition: Player.cpp:3221
uint16 GetPureSkillValue(uint32 skill) const
Definition: Player.cpp:5419
bool HasSkill(uint32 skill) const
Definition: Player.cpp:5333
uint16 GetPureMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5389
void SetSkill(uint16 id, uint16 step, uint16 currVal, uint16 maxVal)
Definition: Player.cpp:5231
bool Has310Flyer(bool checkAllSpells, uint32 excludeSpellId=0)
Definition: Player.cpp:3424
uint8 GetActiveSpec() const
Definition: Player.h:1694
void SetHas310Flyer(bool on)
Definition: Player.h:1145
void SetFreePrimaryProfessions(uint16 profs)
Definition: Player.h:1723
uint32 GetFreePrimaryProfessionPoints() const
Definition: Player.h:1722
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5499
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition: Unit.cpp:10507
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:1169
Definition: SpellAuras.h:87
Definition: SpellInfo.h:314
uint32 Stances
Definition: SpellInfo.h:331
bool IsPassive() const
Definition: SpellInfo.cpp:1082
uint32 Id
Definition: SpellInfo.h:318
bool HasAnyAura() const
Definition: SpellInfo.cpp:885
bool HasAttribute(SpellAttr0 attribute) const
Definition: SpellInfo.h:412
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition: SpellInfo.h:391
bool IsPrimaryProfessionFirstRank() const
Definition: SpellInfo.cpp:967
bool HasEffect(SpellEffects effect) const
Definition: SpellInfo.cpp:869
Definition: SpellMgr.h:567
uint16 value
Definition: SpellMgr.h:570
uint16 step
Definition: SpellMgr.h:569
uint16 maxvalue
Definition: SpellMgr.h:571
uint16 skill
Definition: SpellMgr.h:568
static bool CheckSpellValid(SpellInfo const *spellInfo, uint32 spellId, bool isTalent)
Definition: SpellMgr.cpp:460
Definition: DBCStructure.h:1556
uint32 id
Definition: DBCStructure.h:1557

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 
)
10962{
10963 SpellCooldown sc;
10964 sc.end = GameTime::GetGameTimeMS().count() + end_time;
10965 sc.category = categoryId;
10966 sc.itemid = itemid;
10967 sc.maxduration = end_time;
10968 sc.sendToSpectator = false;
10969 sc.needSendToClient = needSendToClient;
10970
10972 {
10973 if (NeedSendSpectatorData() && forceSendToSpectator && (itemid || HasActiveSpell(spellid)))
10974 {
10975 sc.sendToSpectator = true;
10976 ArenaSpectator::SendCommand_Cooldown(FindMap(), GetGUID(), "ACD", spellid, end_time / IN_MILLISECONDS, end_time / IN_MILLISECONDS);
10977 }
10978 }
10979
10980 m_spellCooldowns[spellid] = std::move(sc);
10981}
constexpr auto IN_MILLISECONDS
Definition: Common.h:62
#define SPECTATOR_COOLDOWN_MAX
Definition: ArenaSpectator.h:37
#define SPECTATOR_COOLDOWN_MIN
Definition: ArenaSpectator.h:36
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:518
Definition: Player.h:200
uint32 itemid
Definition: Player.h:203
bool sendToSpectator
Definition: Player.h:205
bool needSendToClient
Definition: Player.h:206
uint32 end
Definition: Player.h:201
uint32 maxduration
Definition: Player.h:204
uint16 category
Definition: Player.h:202
bool NeedSendSpectatorData() const
Definition: Player.cpp:15282
bool HasActiveSpell(uint32 spell) const
Definition: Player.cpp:3830
SpellCooldowns m_spellCooldowns
Definition: Player.h:2917

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)
2962{
2963 // pussywizard: spells learnt from talents are added as TEMPORARY, so not saved to db (only the talent itself is saved)
2964 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
2965 if (spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
2966 {
2967 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
2968 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && !sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
2969 _addSpell(spellInfo->Effects[i].TriggerSpell, SPEC_MASK_ALL, true);
2970 }
2971 else if (spellInfo->IsPassive() || (spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY) && spellInfo->Stances))
2972 {
2973 if (IsNeedCastPassiveSpellAtLearn(spellInfo))
2974 CastSpell(this, spellId, true);
2975 }
2976}

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 ( )
7447{
7448 LOG_DEBUG("entities.player.items", "_ApplyAllItemMods start.");
7449
7450 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7451 {
7452 if (m_items[i])
7453 {
7454 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7455 continue;
7456
7457 ItemTemplate const* proto = m_items[i]->GetTemplate();
7458 if (!proto)
7459 continue;
7460
7461 uint32 attacktype = Player::GetAttackBySlot(i);
7462 if (attacktype < MAX_ATTACK)
7464
7465 _ApplyItemBonuses(proto, i, true);
7466
7467 if (i == EQUIPMENT_SLOT_RANGED)
7469 }
7470 }
7471
7472 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7473 {
7474 if (m_items[i])
7475 {
7476 ItemTemplate const* proto = m_items[i]->GetTemplate();
7477 if (!proto)
7478 continue;
7479
7480 // item set bonuses not dependent from item broken state
7481 if (proto->ItemSet)
7482 AddItemsSetItem(this, m_items[i]);
7483
7484 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7485 continue;
7486
7487 ApplyItemEquipSpell(m_items[i], true);
7488 ApplyEnchantment(m_items[i], true);
7489 }
7490 }
7491
7492 LOG_DEBUG("entities.player.items", "_ApplyAllItemMods complete.");
7493}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:171
void AddItemsSetItem(Player *player, Item *item)
Definition: Item.cpp:34
@ INVENTORY_SLOT_BAG_END
Definition: Player.h:701
@ EQUIPMENT_SLOT_RANGED
Definition: Player.h:693
WeaponAttackType
Definition: Unit.h:395
@ MAX_ATTACK
Definition: Unit.h:399
ItemTemplate const * GetTemplate() const
Definition: Item.cpp:546
Definition: ItemTemplate.h:628
uint32 ItemSet
Definition: ItemTemplate.h:684
void _ApplyAmmoBonuses()
Definition: Player.cpp:7513
void ApplyItemEquipSpell(Item *item, bool apply, bool form_change=false)
Definition: Player.cpp:6991
void ApplyEnchantment(Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
Definition: PlayerStorage.cpp:4332
void _ApplyItemBonuses(ItemTemplate const *proto, uint8 slot, bool apply, bool only_level_scale=false)
Definition: Player.cpp:6491
void _ApplyWeaponDependentAuraMods(Item *item, WeaponAttackType attackType, bool apply)
Definition: Player.cpp:6887
static uint8 GetAttackBySlot(uint8 slot)
Definition: PlayerStorage.cpp:573
bool CanUseAttackType(uint8 attacktype) const
Definition: Unit.h:1607

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)
7496{
7497 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7498 {
7499 if (m_items[i])
7500 {
7501 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7502 continue;
7503
7504 ItemTemplate const* proto = m_items[i]->GetTemplate();
7505 if (!proto)
7506 continue;
7507
7508 _ApplyItemMods(m_items[i], i, apply);
7509 }
7510 }
7511}
void _ApplyItemMods(Item *item, uint8 slot, bool apply)
Definition: Player.cpp:6456

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 ( )
987{
988 SetCanModifyStats(false);
989
992
993 SetCanModifyStats(true);
994
996}
void _ApplyAllItemMods()
Definition: Player.cpp:7446
bool UpdateAllStats() override
Definition: StatSystem.cpp:188
void _ApplyAllAuraStatMods()
Definition: Unit.cpp:5406
void SetCanModifyStats(bool modifyStats)
Definition: Unit.h:2106

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

Referenced by InitStatsForLevel().

◆ _ApplyAmmoBonuses()

void Player::_ApplyAmmoBonuses ( )
7514{
7515 // check ammo
7517 if (!ammo_id)
7518 return;
7519
7520 float currentAmmoDPS;
7521
7522 ItemTemplate const* ammo_proto = sObjectMgr->GetItemTemplate(ammo_id);
7523 if (!ammo_proto || ammo_proto->Class != ITEM_CLASS_PROJECTILE || !CheckAmmoCompatibility(ammo_proto))
7524 currentAmmoDPS = 0.0f;
7525 else
7526 currentAmmoDPS = (ammo_proto->Damage[0].DamageMin + ammo_proto->Damage[0].DamageMax) / 2;
7527
7528 sScriptMgr->OnApplyAmmoBonuses(this, ammo_proto, currentAmmoDPS);
7529
7530 if (currentAmmoDPS == GetAmmoDPS())
7531 return;
7532
7533 m_ammoDPS = currentAmmoDPS;
7534
7535 if (CanModifyStats())
7537}
@ ITEM_CLASS_PROJECTILE
Definition: ItemTemplate.h:306
@ PLAYER_AMMO_ID
Definition: UpdateFields.h:369
@ RANGED_ATTACK
Definition: Unit.h:398
#define sObjectMgr
Definition: ObjectMgr.h:1640
float DamageMin
Definition: ItemTemplate.h:588
float DamageMax
Definition: ItemTemplate.h:589
_Damage Damage[MAX_ITEM_PROTO_DAMAGES]
Definition: ItemTemplate.h:660
uint32 Class
Definition: ItemTemplate.h:630
uint32 GetUInt32Value(uint16 index) const
Definition: Object.cpp:305
bool CheckAmmoCompatibility(ItemTemplate const *ammo_proto) const
Definition: Player.cpp:7539
float GetAmmoDPS() const
Definition: Player.h:1296
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition: StatSystem.cpp:60
bool CanModifyStats() const
Definition: Unit.h:2105

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
6492{
6493 if (slot >= INVENTORY_SLOT_BAG_END || !proto)
6494 return;
6495
6496 ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
6497 if (only_level_scale && !ssd)
6498 return;
6499
6500 // req. check at equip, but allow use for extended range if range limit max level, set proper level
6501 uint32 ssd_level = GetLevel();
6502 uint32 CustomScalingStatValue = 0;
6503
6504 sScriptMgr->OnCustomScalingStatValueBefore(this, proto, slot, apply, CustomScalingStatValue);
6505
6506 uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
6507
6508 if (ssd && ssd_level > ssd->MaxLevel)
6509 ssd_level = ssd->MaxLevel;
6510
6511 ScalingStatValuesEntry const* ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
6512 if (only_level_scale && !ssv)
6513 return;
6514
6515 for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
6516 {
6517 uint32 statType = 0;
6518 int32 val = 0;
6519 // If set ScalingStatDistribution need get stats and values from it
6520 if (ssv)
6521 {
6522 if (ssd)
6523 {
6524 if (ssd->StatMod[i] < 0)
6525 continue;
6526
6527 statType = ssd->StatMod[i];
6528 val = (ssv->getssdMultiplier(ScalingStatValue) * ssd->Modifier[i]) / 10000;
6529 }
6530 else
6531 {
6532 if (i >= proto->StatsCount)
6533 continue;
6534
6535 // OnCustomScalingStatValue(Player* player, ItemTemplate const* proto, uint32& statType, int32& val, uint8 itemProtoStatNumber, uint32 ScalingStatValue, ScalingStatValuesEntry const* ssv)
6536 sScriptMgr->OnCustomScalingStatValue(this, proto, statType, val, i, ScalingStatValue, ssv);
6537 }
6538 }
6539 else
6540 {
6541 if (i >= proto->StatsCount)
6542 continue;
6543
6544 statType = proto->ItemStat[i].ItemStatType;
6545 val = proto->ItemStat[i].ItemStatValue;
6546 }
6547
6548 if (val == 0)
6549 continue;
6550
6551 switch (statType)
6552 {
6553 case ITEM_MOD_MANA:
6554 HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(val), apply);
6555 break;
6556 case ITEM_MOD_HEALTH: // modify HP
6557 HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(val), apply);
6558 break;
6559 case ITEM_MOD_AGILITY: // modify agility
6561 ApplyStatBuffMod(STAT_AGILITY, float(val), apply);
6562 break;
6563 case ITEM_MOD_STRENGTH: //modify strength
6565 ApplyStatBuffMod(STAT_STRENGTH, float(val), apply);
6566 break;
6567 case ITEM_MOD_INTELLECT: //modify intellect
6569 ApplyStatBuffMod(STAT_INTELLECT, float(val), apply);
6570 break;
6571 case ITEM_MOD_SPIRIT: //modify spirit
6573 ApplyStatBuffMod(STAT_SPIRIT, float(val), apply);
6574 break;
6575 case ITEM_MOD_STAMINA: //modify stamina
6577 ApplyStatBuffMod(STAT_STAMINA, float(val), apply);
6578 break;
6581 break;
6583 ApplyRatingMod(CR_DODGE, int32(val), apply);
6584 break;
6586 ApplyRatingMod(CR_PARRY, int32(val), apply);
6587 break;
6589 ApplyRatingMod(CR_BLOCK, int32(val), apply);
6590 break;
6592 ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
6593 break;
6595 ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
6596 break;
6598 ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
6599 break;
6601 ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
6602 break;
6604 ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
6605 break;
6607 ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
6608 break;
6611 break;
6614 break;
6617 break;
6620 break;
6623 break;
6626 break;
6628 ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
6629 break;
6631 ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
6632 break;
6634 ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
6635 break;
6637 ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
6638 ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
6639 ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
6640 break;
6642 ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
6643 ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
6644 ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
6645 break;
6650 break;
6656 break;
6658 ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
6659 ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
6660 ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
6661 break;
6663 ApplyRatingMod(CR_EXPERTISE, int32(val), apply);
6664 break;
6668 break;
6671 break;
6672 // case ITEM_MOD_FERAL_ATTACK_POWER:
6673 // ApplyFeralAPBonus(int32(val), apply);
6674 // break;
6676 ApplyManaRegenBonus(int32(val), apply);
6677 break;
6680 break;
6682 ApplySpellPowerBonus(int32(val), apply);
6683 break;
6685 ApplyHealthRegenBonus(int32(val), apply);
6686 break;
6688 ApplySpellPenetrationBonus(val, apply);
6689 break;
6691 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(val), apply);
6692 break;
6696 break;
6697 }
6698 }
6699
6700 // Apply Spell Power from ScalingStatValue if set
6701 if (ssv)
6702 if (int32 spellbonus = ssv->getSpellBonus(ScalingStatValue))
6703 ApplySpellPowerBonus(spellbonus, apply);
6704
6705 // If set ScalingStatValue armor get it or use item armor
6706 uint32 armor = proto->Armor;
6707 if (ssv)
6708 {
6709 if (uint32 ssvarmor = ssv->getArmorMod(ScalingStatValue))
6710 if (proto->ScalingStatValue > 0 || ssvarmor < proto->Armor) //Check to avoid higher values than stat itself (heirloom OR items with correct armor value)
6711 armor = ssvarmor;
6712 }
6713 else if (armor && proto->ArmorDamageModifier)
6714 armor -= uint32(proto->ArmorDamageModifier);
6715
6716 if (armor)
6717 {
6718 UnitModifierType modType = TOTAL_VALUE;
6719 if (proto->Class == ITEM_CLASS_ARMOR)
6720 {
6721 switch (proto->SubClass)
6722 {
6728 modType = BASE_VALUE;
6729 break;
6730 }
6731 }
6732 HandleStatModifier(UNIT_MOD_ARMOR, modType, float(armor), apply);
6733 }
6734
6735 // Add armor bonus from ArmorDamageModifier if > 0
6736 if (proto->ArmorDamageModifier > 0 && sScriptMgr->CanArmorDamageModifier(this))
6737 HandleStatModifier(UNIT_MOD_ARMOR, TOTAL_VALUE, float(proto->ArmorDamageModifier), apply);
6738
6739 if (proto->Block)
6740 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(proto->Block), apply);
6741
6742 if (proto->HolyRes)
6743 HandleStatModifier(UNIT_MOD_RESISTANCE_HOLY, BASE_VALUE, float(proto->HolyRes), apply);
6744
6745 if (proto->FireRes)
6746 HandleStatModifier(UNIT_MOD_RESISTANCE_FIRE, BASE_VALUE, float(proto->FireRes), apply);
6747
6748 if (proto->NatureRes)
6749 HandleStatModifier(UNIT_MOD_RESISTANCE_NATURE, BASE_VALUE, float(proto->NatureRes), apply);
6750
6751 if (proto->FrostRes)
6752 HandleStatModifier(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, float(proto->FrostRes), apply);
6753
6754 if (proto->ShadowRes)
6755 HandleStatModifier(UNIT_MOD_RESISTANCE_SHADOW, BASE_VALUE, float(proto->ShadowRes), apply);
6756
6757 if (proto->ArcaneRes)
6758 HandleStatModifier(UNIT_MOD_RESISTANCE_ARCANE, BASE_VALUE, float(proto->ArcaneRes), apply);
6759
6760 uint8 attType = Player::GetAttackBySlot(slot);
6761 if (attType != MAX_ATTACK)
6762 {
6763 _ApplyWeaponDamage(slot, proto, ssv, apply);
6764 }
6765
6766 // Druids get feral AP bonus from weapon dps (also use DPS from ScalingStatValue)
6767 if (getClass() == CLASS_DRUID)
6768 {
6769 int32 dpsMod = 0;
6770 int32 feral_bonus = 0;
6771 if (ssv)
6772 {
6773 dpsMod = ssv->getDPSMod(ScalingStatValue);
6774 feral_bonus += ssv->getFeralBonus(ScalingStatValue);
6775 }
6776
6777 feral_bonus += proto->getFeralBonus(dpsMod);
6778 sScriptMgr->OnGetFeralApBonus(this, feral_bonus, dpsMod, proto, ssv);
6779 if (feral_bonus)
6780 ApplyFeralAPBonus(feral_bonus, apply);
6781 }
6782}
std::int32_t int32
Definition: Define.h:104
DBCStorage< ScalingStatDistributionEntry > sScalingStatDistributionStore(ScalingStatDistributionfmt)
DBCStorage< ScalingStatValuesEntry > sScalingStatValuesStore(ScalingStatValuesfmt)
@ ITEM_MOD_CRIT_TAKEN_RANGED_RATING
Definition: ItemTemplate.h:49
@ ITEM_MOD_HIT_MELEE_RATING
Definition: ItemTemplate.h:39
@ ITEM_MOD_HIT_TAKEN_MELEE_RATING
Definition: ItemTemplate.h:45
@ ITEM_MOD_STAMINA
Definition: ItemTemplate.h:34
@ ITEM_MOD_HIT_SPELL_RATING
Definition: ItemTemplate.h:41
@ ITEM_MOD_SPELL_PENETRATION
Definition: ItemTemplate.h:70
@ ITEM_MOD_PARRY_RATING
Definition: ItemTemplate.h:37
@ ITEM_MOD_DEFENSE_SKILL_RATING
Definition: ItemTemplate.h:35
@ ITEM_MOD_HASTE_RANGED_RATING
Definition: ItemTemplate.h:52
@ ITEM_MOD_CRIT_TAKEN_RATING
Definition: ItemTemplate.h:57
@ ITEM_MOD_EXPERTISE_RATING
Definition: ItemTemplate.h:60
@ ITEM_MOD_MANA
Definition: ItemTemplate.h:28
@ ITEM_MOD_RANGED_ATTACK_POWER
Definition: ItemTemplate.h:62
@ ITEM_MOD_HEALTH
Definition: ItemTemplate.h:29
@ ITEM_MOD_CRIT_TAKEN_SPELL_RATING
Definition: ItemTemplate.h:50
@ ITEM_MOD_HIT_TAKEN_SPELL_RATING
Definition: ItemTemplate.h:47
@ ITEM_MOD_SPIRIT
Definition: ItemTemplate.h:33
@ ITEM_MOD_SPELL_POWER
Definition: ItemTemplate.h:68
@ ITEM_MOD_HASTE_SPELL_RATING
Definition: ItemTemplate.h:53
@ ITEM_MOD_ATTACK_POWER
Definition: ItemTemplate.h:61
@ ITEM_MOD_HASTE_RATING
Definition: ItemTemplate.h:59
@ ITEM_MOD_HIT_RANGED_RATING
Definition: ItemTemplate.h:40
@ ITEM_MOD_CRIT_SPELL_RATING
Definition: ItemTemplate.h:44
@ ITEM_MOD_BLOCK_VALUE
Definition: ItemTemplate.h:71
@ ITEM_MOD_CRIT_RANGED_RATING
Definition: ItemTemplate.h:43
@ ITEM_MOD_CRIT_MELEE_RATING
Definition: ItemTemplate.h:42
@ ITEM_MOD_STRENGTH
Definition: ItemTemplate.h:31
@ ITEM_MOD_HEALTH_REGEN
Definition: ItemTemplate.h:69
@ ITEM_MOD_BLOCK_RATING
Definition: ItemTemplate.h:38
@ ITEM_MOD_ARMOR_PENETRATION_RATING
Definition: ItemTemplate.h:67
@ ITEM_MOD_SPELL_HEALING_DONE
Definition: ItemTemplate.h:64
@ ITEM_MOD_CRIT_TAKEN_MELEE_RATING
Definition: ItemTemplate.h:48
@ ITEM_MOD_HIT_TAKEN_RATING
Definition: ItemTemplate.h:56
@ ITEM_MOD_HASTE_MELEE_RATING
Definition: ItemTemplate.h:51
@ ITEM_MOD_MANA_REGENERATION
Definition: ItemTemplate.h:66
@ ITEM_MOD_HIT_RATING
Definition: ItemTemplate.h:54
@ ITEM_MOD_INTELLECT
Definition: ItemTemplate.h:32
@ ITEM_MOD_RESILIENCE_RATING
Definition: ItemTemplate.h:58
@ ITEM_MOD_AGILITY
Definition: ItemTemplate.h:30
@ ITEM_MOD_DODGE_RATING
Definition: ItemTemplate.h:36
@ ITEM_MOD_CRIT_RATING
Definition: ItemTemplate.h:55
@ ITEM_MOD_SPELL_DAMAGE_DONE
Definition: ItemTemplate.h:65
@ ITEM_MOD_HIT_TAKEN_RANGED_RATING
Definition: ItemTemplate.h:46
@ ITEM_SUBCLASS_ARMOR_MAIL
Definition: ItemTemplate.h:402
@ ITEM_SUBCLASS_ARMOR_CLOTH
Definition: ItemTemplate.h:400
@ ITEM_SUBCLASS_ARMOR_LEATHER
Definition: ItemTemplate.h:401
@ ITEM_SUBCLASS_ARMOR_SHIELD
Definition: ItemTemplate.h:405
@ ITEM_SUBCLASS_ARMOR_PLATE
Definition: ItemTemplate.h:403
@ ITEM_CLASS_ARMOR
Definition: ItemTemplate.h:304
#define MAX_ITEM_PROTO_STATS
Definition: ItemTemplate.h:625
@ UNIT_MOD_STAT_INTELLECT
Definition: Unit.h:265
@ UNIT_MOD_STAT_SPIRIT
Definition: Unit.h:266
@ UNIT_MOD_ARMOR
Definition: Unit.h:275
@ UNIT_MOD_RESISTANCE_SHADOW
Definition: Unit.h:280
@ UNIT_MOD_RESISTANCE_FROST
Definition: Unit.h:279
@ UNIT_MOD_ATTACK_POWER
Definition: Unit.h:282
@ UNIT_MOD_RESISTANCE_HOLY
Definition: Unit.h:276
@ UNIT_MOD_RESISTANCE_ARCANE
Definition: Unit.h:281
@ UNIT_MOD_HEALTH
Definition: Unit.h:267
@ UNIT_MOD_RESISTANCE_FIRE
Definition: Unit.h:277
@ UNIT_MOD_STAT_STRENGTH
Definition: Unit.h:262
@ UNIT_MOD_RESISTANCE_NATURE
Definition: Unit.h:278
@ UNIT_MOD_STAT_AGILITY
Definition: Unit.h:263
@ UNIT_MOD_MANA
Definition: Unit.h:268
@ UNIT_MOD_STAT_STAMINA
Definition: Unit.h:264
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition: Unit.h:283
@ SHIELD_BLOCK_VALUE
Definition: Unit.h:302
UnitModifierType
Definition: Unit.h:244
@ BASE_VALUE
Definition: Unit.h:245
@ TOTAL_VALUE
Definition: Unit.h:247
@ CR_EXPERTISE
Definition: Unit.h:427
@ CR_HIT_TAKEN_MELEE
Definition: Unit.h:415
@ CR_HASTE_RANGED
Definition: Unit.h:422
@ CR_HIT_MELEE
Definition: Unit.h:409
@ CR_CRIT_TAKEN_RANGED
Definition: Unit.h:419
@ CR_CRIT_TAKEN_SPELL
Definition: Unit.h:420
@ CR_ARMOR_PENETRATION
Definition: Unit.h:428
@ CR_CRIT_MELEE
Definition: Unit.h:412
@ CR_CRIT_RANGED
Definition: Unit.h:413
@ CR_HIT_TAKEN_SPELL
Definition: Unit.h:417
@ CR_PARRY
Definition: Unit.h:407
@ CR_DODGE
Definition: Unit.h:406
@ CR_DEFENSE_SKILL
Definition: Unit.h:405
@ CR_HASTE_MELEE
Definition: Unit.h:421
@ CR_BLOCK
Definition: Unit.h:408
@ CR_HASTE_SPELL
Definition: Unit.h:423
@ CR_HIT_SPELL
Definition: Unit.h:411
@ CR_HIT_TAKEN_RANGED
Definition: Unit.h:416
@ CR_CRIT_SPELL
Definition: Unit.h:414
@ CR_HIT_RANGED
Definition: Unit.h:410
@ CR_CRIT_TAKEN_MELEE
Definition: Unit.h:418
@ CLASS_DRUID
Definition: SharedDefines.h:123
@ STAT_SPIRIT
Definition: SharedDefines.h:234
@ STAT_INTELLECT
Definition: SharedDefines.h:233
@ STAT_AGILITY
Definition: SharedDefines.h:231
@ STAT_STRENGTH
Definition: SharedDefines.h:230
@ STAT_STAMINA
Definition: SharedDefines.h:232
void ApplyRatingMod(CombatRating cr, int32 value, bool apply)
Definition: Player.cpp:5161
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:6784
void ApplyManaRegenBonus(int32 amount, bool apply)
Definition: StatSystem.cpp:920
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:926
void HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
Definition: Player.cpp:4920
void ApplyStatBuffMod(Stats stat, float val, bool apply)
Definition: Unit.h:2034
uint8 getClass() const
Definition: Unit.h:1426
bool HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
Definition: Unit.cpp:15095
uint8 GetLevel() const
Definition: Unit.h:1420
Definition: DBCStructure.h:1456
uint32 MaxLevel
Definition: DBCStructure.h:1460
uint32 Modifier[10]
Definition: DBCStructure.h:1459
int32 StatMod[10]
Definition: DBCStructure.h:1458
Definition: DBCStructure.h:1464
uint32 getArmorMod(uint32 mask) const
Definition: DBCStructure.h:1489
uint32 getDPSMod(uint32 mask) const
Definition: DBCStructure.h:1507
uint32 getFeralBonus(uint32 mask) const
Definition: DBCStructure.h:1527
uint32 getssdMultiplier(uint32 mask) const
Definition: DBCStructure.h:1475
uint32 getSpellBonus(uint32 mask) const
Definition: DBCStructure.h:1521

References _ApplyWeaponDamage(), ApplyFeralAPBonus(), ApplyHealthRegenBonus(), ApplyManaRegenBonus(), ApplyRatingMod(), ApplySpellPenetrationBonus(), ApplySpellPowerBonus(), Unit::ApplyStatBuffMod(), ItemTemplate::ArcaneRes, ItemTemplate::Armor, ItemTemplate::ArmorDamageModifier, BASE_VALUE, ItemTemplate::Block, ItemTemplate::Class, 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(), Unit::getClass(), ScalingStatValuesEntry::getDPSMod(), ItemTemplate::getFeralBonus(), ScalingStatValuesEntry::getFeralBonus(), Unit::GetLevel(), ScalingStatValuesEntry::getSpellBonus(), ScalingStatValuesEntry::getssdMultiplier(), HandleBaseModValue(), Unit::HandleStatModifier(), ItemTemplate::HolyRes, INVENTORY_SLOT_BAG_END, 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 
)
6457{
6458 if (slot >= INVENTORY_SLOT_BAG_END || !item)
6459 return;
6460
6461 ItemTemplate const* proto = item->GetTemplate();
6462
6463 if (!proto)
6464 return;
6465
6466 // not apply/remove mods for broken item
6467 if (item->IsBroken())
6468 return;
6469
6470 LOG_DEBUG("entities.player", "applying mods for item {} ", item->GetGUID().ToString());
6471
6472 uint8 attacktype = Player::GetAttackBySlot(slot);
6473
6474 if (item->HasSocket()) //only (un)equipping of items with sockets can influence metagems, so no need to waste time with normal items
6475 CorrectMetaGemEnchants(slot, apply);
6476
6477 if (attacktype < MAX_ATTACK)
6478 _ApplyWeaponDependentAuraMods(item, WeaponAttackType(attacktype), apply);
6479
6480 _ApplyItemBonuses(proto, slot, apply);
6481
6482 if (slot == EQUIPMENT_SLOT_RANGED)
6484
6485 ApplyItemEquipSpell(item, apply);
6486 ApplyEnchantment(item, apply);
6487
6488 LOG_DEBUG("entities.player.items", "_ApplyItemMods complete.");
6489}
bool HasSocket() const
Definition: Item.cpp:1009
bool IsBroken() const
Definition: Item.h:251
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:106
std::string ToString() const
Definition: ObjectGuid.cpp:47
void CorrectMetaGemEnchants(uint8 slot, bool apply)
Definition: Player.cpp:11104

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 
)
6785{
6786 uint32 CustomScalingStatValue = 0;
6787
6788 sScriptMgr->OnCustomScalingStatValueBefore(this, proto, slot, apply, CustomScalingStatValue);
6789
6790 uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
6791
6792 // following part fix disarm issue
6793 // that doesn't apply the scaling after disarmed
6794 if (!ssv)
6795 {
6796 ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
6797
6798 // req. check at equip, but allow use for extended range if range limit max level, set proper level
6799 uint32 ssd_level = GetLevel();
6800
6801 if (ssd && ssd_level > ssd->MaxLevel)
6802 ssd_level = ssd->MaxLevel;
6803
6804 ssv = ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
6805 }
6806
6807 uint8 attType = Player::GetAttackBySlot(slot);
6808 if (!IsInFeralForm() && apply && !CanUseAttackType(attType))
6809 {
6810 return;
6811 }
6812
6813 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6814 {
6815 float minDamage = proto->Damage[i].DamageMin;
6816 float maxDamage = proto->Damage[i].DamageMax;
6817
6818 // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage
6819 if (ssv)
6820 {
6821 int32 extraDPS = ssv->getDPSMod(ScalingStatValue);
6822 if (extraDPS)
6823 {
6824 float average = extraDPS * proto->Delay / 1000.0f;
6825 minDamage = 0.7f * average;
6826 maxDamage = 1.3f * average;
6827 }
6828 }
6829
6830 if (apply)
6831 {
6832 if (minDamage > 0.f)
6833 {
6834 SetBaseWeaponDamage(WeaponAttackType(attType), MINDAMAGE, minDamage, i);
6835 }
6836
6837 if (maxDamage > 0.f)
6838 {
6839 SetBaseWeaponDamage(WeaponAttackType(attType), MAXDAMAGE, maxDamage, i);
6840 }
6841 }
6842 }
6843
6844 if (!apply)
6845 {
6846 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6847 {
6850 }
6851
6852 if (attType == BASE_ATTACK)
6853 {
6856 }
6857 }
6858
6859 if (proto->Delay && !IsInFeralForm())
6860 {
6861 if (slot == EQUIPMENT_SLOT_RANGED)
6862 SetAttackTime(RANGED_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6863 else if (slot == EQUIPMENT_SLOT_MAINHAND)
6864 SetAttackTime(BASE_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6865 else if (slot == EQUIPMENT_SLOT_OFFHAND)
6866 SetAttackTime(OFF_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6867 }
6868
6869 // No need to modify any physical damage for ferals as it is calculated from stats only
6870 if (IsInFeralForm())
6871 return;
6872
6873 if (CanModifyStats() && (GetWeaponDamageRange(WeaponAttackType(attType), MAXDAMAGE) || proto->Delay))
6875}
#define MAX_ITEM_PROTO_DAMAGES
Definition: ItemTemplate.h:622
@ EQUIPMENT_SLOT_MAINHAND
Definition: Player.h:691
@ EQUIPMENT_SLOT_OFFHAND
Definition: Player.h:692
@ OFF_ATTACK
Definition: Unit.h:397
@ BASE_ATTACK
Definition: Unit.h:396
@ MINDAMAGE
Definition: Unit.h:254
@ MAXDAMAGE
Definition: Unit.h:255
#define BASE_ATTACK_TIME
Definition: Unit.h:40
#define BASE_MAXDAMAGE
Definition: Unit.h:39
#define BASE_MINDAMAGE
Definition: Unit.h:38
float GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
Definition: Unit.cpp:15344
void SetBaseWeaponDamage(WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
Definition: Unit.h:2118
bool IsInFeralForm() const
Definition: Unit.h:2077
void SetAttackTime(WeaponAttackType att, uint32 val)
Definition: Unit.h:1475

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(), 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 
)
6903{
6904 // don't apply mod if item is broken or cannot be used
6905 if (item->IsBroken() || !CanUseAttackType(attackType))
6906 return;
6907
6908 // generic not weapon specific case processes in aura code
6909 if (aura->GetSpellInfo()->EquippedItemClass == -1)
6910 return;
6911
6912 if (!sScriptMgr->CanApplyWeaponDependentAuraDamageMod(this, item, attackType, aura, apply))
6913 return;
6914
6916 switch (attackType)
6917 {
6918 case BASE_ATTACK:
6919 mod = CRIT_PERCENTAGE;
6920 break;
6921 case OFF_ATTACK:
6923 break;
6924 case RANGED_ATTACK:
6926 break;
6927 default:
6928 return;
6929 }
6930
6931 if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
6932 HandleBaseModValue(mod, FLAT_MOD, float (aura->GetAmount()), apply);
6933}
BaseModGroup
Definition: Unit.h:298
@ OFFHAND_CRIT_PERCENTAGE
Definition: Unit.h:301
@ CRIT_PERCENTAGE
Definition: Unit.h:299
@ RANGED_CRIT_PERCENTAGE
Definition: Unit.h:300
bool IsFitToSpellRequirements(SpellInfo const *spellInfo) const
Definition: Item.cpp:886

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 
)
6936{
6937 // don't apply mod if item is broken or cannot be used
6938 if (item->IsBroken() || !CanUseAttackType(attackType))
6939 return;
6940
6941 // ignore spell mods for not wands
6942 if ((aura->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) == 0 && (getClassMask() & CLASSMASK_WAND_USERS) == 0)
6943 return;
6944
6945 // generic not weapon specific case processes in aura code
6946 if (aura->GetSpellInfo()->EquippedItemClass == -1)
6947 return;
6948
6949 UnitMods unitMod = UNIT_MOD_END;
6950 switch (attackType)
6951 {
6952 case BASE_ATTACK:
6953 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
6954 break;
6955 case OFF_ATTACK:
6956 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
6957 break;
6958 case RANGED_ATTACK:
6959 unitMod = UNIT_MOD_DAMAGE_RANGED;
6960 break;
6961 default:
6962 return;
6963 }
6964
6965 UnitModifierType unitModType = TOTAL_VALUE;
6966 switch (aura->GetAuraType())
6967 {
6969 unitModType = TOTAL_VALUE;
6970 break;
6972 unitModType = TOTAL_PCT;
6973 break;
6974 default:
6975 return;
6976 }
6977
6978 if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
6979 {
6980 HandleStatModifier(unitMod, unitModType, float(aura->GetAmount()), apply);
6981 if (unitModType == TOTAL_VALUE)
6982 {
6983 if (aura->GetAmount() > 0)
6984 ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS, aura->GetAmount(), apply);
6985 else
6986 ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, aura->GetAmount(), apply);
6987 }
6988 }
6989}
@ PLAYER_FIELD_MOD_DAMAGE_DONE_POS
Definition: UpdateFields.h:360
@ PLAYER_FIELD_MOD_DAMAGE_DONE_NEG
Definition: UpdateFields.h:361
UnitMods
Definition: Unit.h:261
@ UNIT_MOD_DAMAGE_OFFHAND
Definition: Unit.h:285
@ UNIT_MOD_END
Definition: Unit.h:287
@ UNIT_MOD_DAMAGE_RANGED
Definition: Unit.h:286
@ UNIT_MOD_DAMAGE_MAINHAND
Definition: Unit.h:284
@ TOTAL_PCT
Definition: Unit.h:248
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition: SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition: SpellAuraDefines.h:76
#define CLASSMASK_WAND_USERS
Definition: SharedDefines.h:146
@ SPELL_SCHOOL_MASK_NORMAL
Definition: SharedDefines.h:269
void ApplyModUInt32Value(uint16 index, int32 val, bool apply)
Definition: Object.cpp:806
uint32 getClassMask() const
Definition: Unit.h:1427

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 
)
6888{
6890 for (AuraEffectList::const_iterator itr = auraCritList.begin(); itr != auraCritList.end(); ++itr)
6891 _ApplyWeaponDependentAuraCritMod(item, attackType, *itr, apply);
6892
6894 for (AuraEffectList::const_iterator itr = auraDamageFlatList.begin(); itr != auraDamageFlatList.end(); ++itr)
6895 _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
6896
6898 for (AuraEffectList::const_iterator itr = auraDamagePctList.begin(); itr != auraDamagePctList.end(); ++itr)
6899 _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
6900}
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition: SpellAuraDefines.h:115
void _ApplyWeaponDependentAuraDamageMod(Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
Definition: Player.cpp:6935
void _ApplyWeaponDependentAuraCritMod(Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
Definition: Player.cpp:6902
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition: Unit.h:1967
std::list< AuraEffect * > AuraEffectList
Definition: Unit.h:1306

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
5696{
5697 m_actionButtons.clear();
5698
5699 if (result)
5700 {
5701 do
5702 {
5703 Field* fields = result->Fetch();
5704 uint8 button = fields[0].Get<uint8>();
5705 uint32 action = fields[1].Get<uint32>();
5706 uint8 type = fields[2].Get<uint8>();
5707
5708 if (ActionButton* ab = addActionButton(button, action, type))
5709 ab->uState = ACTIONBUTTON_UNCHANGED;
5710 else
5711 {
5712 LOG_ERROR("entities.player", "ActionButton loading problem, will be deleted from db...");
5713
5714 // Will deleted in DB at next save (it can create data until save but marked as deleted)
5715 m_actionButtons[button].uState = ACTIONBUTTON_DELETED;
5716 }
5717 } while (result->NextRow());
5718 }
5719}
#define LOG_ERROR(filterType__,...)
Definition: Log.h:159
@ ACTIONBUTTON_UNCHANGED
Definition: Player.h:222
@ ACTIONBUTTON_DELETED
Definition: Player.h:225
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:254
ActionButton * addActionButton(uint8 button, uint32 action, uint8 type)
Definition: Player.cpp:5526
ActionButtonList m_actionButtons
Definition: Player.h:2756

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
4823{
4825
4826 for (auto const& itr : ArenaTeam::ArenaSlotByType)
4827 if (uint32 arenaTeamId = sCharacterCache->GetCharacterArenaTeamIdByGuid(GetGUID(), itr.second))
4828 {
4829 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
4830 if (!arenaTeam)
4831 {
4832 LOG_ERROR("bg.arena", "Player::_LoadArenaTeamInfo: No arena team was found.");
4833 continue;
4834 }
4835 ArenaTeamMember const* member = arenaTeam->GetMember(GetGUID());
4836 if (!member)
4837 {
4838 LOG_ERROR("bg.arena", "Player::_LoadArenaTeamInfo: No members in the arena team ({}) was found.", arenaTeamId);
4839 continue;
4840 }
4841 uint8 slot = itr.second;
4842
4843 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, arenaTeamId);
4844 SetArenaTeamInfoField(slot, ARENA_TEAM_TYPE, arenaTeam->GetType());
4845 SetArenaTeamInfoField(slot, ARENA_TEAM_MEMBER, (arenaTeam->GetCaptain() == GetGUID()) ? 0 : 1);
4850 }
4851}
#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
#define sCharacterCache
Definition: CharacterCache.h:83
@ 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:1002
uint32 GetType() const
Definition: ArenaTeam.h:150
static std::unordered_map< uint32, uint8 > ArenaSlotByType
Definition: ArenaTeam.h:218
uint32 * m_uint32Values
Definition: Object.h:236
void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value)
Definition: Player.cpp:16077

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
5722{
5723 LOG_DEBUG("entities.player.loading", "Loading auras for player {}", GetGUID().ToString());
5724
5725 /* 0 1 2 3 4 5 6 7 8 9 10 11
5726 QueryResult* result = CharacterDatabase.Query("SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2,
5727 12 13 14
5728 maxDuration, remainTime, remainCharges FROM character_aura WHERE guid = '{}'", GetGUID().GetCounter());
5729 */
5730
5731 if (result)
5732 {
5733 do
5734 {
5735 Field* fields = result->Fetch();
5736 int32 damage[3];
5737 int32 baseDamage[3];
5738 ObjectGuid caster_guid = ObjectGuid(fields[0].Get<uint64>());
5739 ObjectGuid itemGuid = ObjectGuid(fields[1].Get<uint64>());
5740 uint32 spellid = fields[2].Get<uint32>();
5741 uint8 effmask = fields[3].Get<uint8>();
5742 uint8 recalculatemask = fields[4].Get<uint8>();
5743 uint8 stackcount = fields[5].Get<uint8>();
5744 damage[0] = fields[6].Get<int32>();
5745 damage[1] = fields[7].Get<int32>();
5746 damage[2] = fields[8].Get<int32>();
5747 baseDamage[0] = fields[9].Get<int32>();
5748 baseDamage[1] = fields[10].Get<int32>();
5749 baseDamage[2] = fields[11].Get<int32>();
5750 int32 maxduration = fields[12].Get<int32>();
5751 int32 remaintime = fields[13].Get<int32>();
5752 uint8 remaincharges = fields[14].Get<uint8>();
5753
5754 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
5755 if (!spellInfo)
5756 {
5757 LOG_ERROR("entities.player", "Unknown aura (spellid {}), ignore.", spellid);
5758 continue;
5759 }
5760
5761 // Xinef: leave this
5762 if (spellInfo->HasAura(SPELL_AURA_MOUNTED))
5763 {
5764 SetMountBlockId(spellInfo->Id);
5765 continue;
5766 }
5767
5768 // negative effects should continue counting down after logout
5769 if (remaintime != -1 && ((!spellInfo->IsPositive() && spellInfo->Id != 15007) || spellInfo->HasAttribute(SPELL_ATTR4_AURA_EXPIRES_OFFLINE))) // Xinef: resurrection sickness should not tick when logged off
5770 {
5771 if (remaintime / IN_MILLISECONDS <= int32(timediff))
5772 continue;
5773
5774 remaintime -= timediff * IN_MILLISECONDS;
5775 }
5776
5777 // prevent wrong values of remaincharges
5778 if (spellInfo->ProcCharges)
5779 {
5780 // we have no control over the order of applying auras and modifiers allow auras
5781 // to have more charges than value in SpellInfo
5782 if (remaincharges <= 0/* || remaincharges > spellproto->procCharges*/)
5783 remaincharges = spellInfo->ProcCharges;
5784 }
5785 else
5786 remaincharges = 0;
5787
5788 if (Aura* aura = Aura::TryCreate(spellInfo, effmask, this, nullptr, &baseDamage[0], nullptr, caster_guid, itemGuid))
5789 {
5790 if (!aura->CanBeSaved())
5791 {
5792 aura->Remove();
5793 continue;
5794 }
5795
5796 aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]);
5797 aura->ApplyForTargets();
5798 LOG_DEBUG("entities.player", "Added aura spellid {}, effectmask {}", spellInfo->Id, effmask);
5799 }
5800 } while (result->NextRow());
5801 }
5802}
@ SPELL_AURA_MOUNTED
Definition: SpellAuraDefines.h:141
@ SPELL_ATTR4_AURA_EXPIRES_OFFLINE
Definition: SharedDefines.h:504
Definition: ObjectGuid.h:120
void SetMountBlockId(uint32 mount)
Definition: Player.h:2552
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
15664{
15665 uint32 lastEventId = 0;
15666 if (result)
15667 {
15668 Field* fields = result->Fetch();
15669 lastEventId = fields[0].Get<uint32>();
15670 }
15671
15672 uint16 month = static_cast<uint16>(Acore::Time::GetMonth());
15673 uint16 eventId = month;
15674 if (eventId < 9)
15675 eventId += 3;
15676 else
15677 eventId -= 9;
15678
15679 // Brew of the Month October (first in list)
15680 eventId += 34;
15681
15682 if (lastEventId != eventId && IsEventActive(eventId) && HasAchieved(2796 /* Brew of the Month*/))
15683 {
15684 // Send Mail
15685 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15686 MailSender sender(MAIL_CREATURE, 27487 /*NPC_BREW_OF_THE_MONTH_CLUB*/);
15687 MailDraft draft(uint16(212 + month)); // 212 is starting template id
15688 draft.SendMailTo(trans, MailReceiver(this, GetGUID().GetCounter()), sender);
15689
15690 // Update Event Id
15692 stmt->SetData(0, GetGUID().GetCounter());
15693 stmt->SetData(1, uint32(eventId));
15694 trans->Append(stmt);
15695
15696 CharacterDatabase.CommitTransaction(trans);
15697 }
15698}
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition: DatabaseEnvFwd.h:70
@ CHAR_REP_BREW_OF_THE_MONTH
Definition: CharacterDatabase.h:103
bool IsEventActive(uint16 event_id)
Definition: GameEventMgr.cpp:1925
@ MAIL_CREATURE
Definition: Mail.h:40
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:13798
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:173
std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
Definition: Tokenize.cpp:20
PlayerSettingMap m_charSettingsMap
Definition: Player.h:2941
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
6372{
6373 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
6374 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, 0);
6375
6376 m_DFQuests.clear();
6377
6378 //QueryResult* result = CharacterDatabase.Query("SELECT quest, time FROM character_queststatus_daily WHERE guid = '{}'", GetGUID().GetCounter());
6379
6380 if (result)
6381 {
6382 uint32 quest_daily_idx = 0;
6383
6384 do
6385 {
6386 Field* fields = result->Fetch();
6387 if (Quest const* qQuest = sObjectMgr->GetQuestTemplate(fields[0].Get<uint32>()))
6388 {
6389 if (qQuest->IsDFQuest())
6390 {
6391 m_DFQuests.insert(qQuest->GetQuestId());
6392 m_lastDailyQuestTime = time_t(fields[1].Get<uint32>());
6393 continue;
6394 }
6395 }
6396
6397 if (quest_daily_idx >= PLAYER_MAX_DAILY_QUESTS) // max amount with exist data in query
6398 {
6399 LOG_ERROR("entities.player", "Player ({}) have more 25 daily quest records in `charcter_queststatus_daily`", GetGUID().ToString());
6400 break;
6401 }
6402
6403 uint32 quest_id = fields[0].Get<uint32>();
6404
6405 // save _any_ from daily quest times (it must be after last reset anyway)
6406 m_lastDailyQuestTime = time_t(fields[1].Get<uint32>());
6407
6408 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6409 if (!quest)
6410 continue;
6411
6412 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, quest_id);
6413 ++quest_daily_idx;
6414
6415 LOG_DEBUG("entities.player.loading", "Daily quest ({}) cooldown for player ({})", quest_id, GetGUID().ToString());
6416 } while (result->NextRow());
6417 }
6418
6419 m_DailyQuestChanged = false;
6420}
@ PLAYER_FIELD_DAILY_QUESTS_1
Definition: UpdateFields.h:385
#define PLAYER_MAX_DAILY_QUESTS
Definition: Player.h:72
void SetUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:650
DFQuestsDoneList m_DFQuests
Definition: Player.h:2360
Definition: QuestDef.h:207

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

Referenced by LoadFromDB().

◆ _LoadDeclinedNames()

void Player::_LoadDeclinedNames ( PreparedQueryResult  result)
protected
4812{
4813 if (!result)
4814 return;
4815
4816 delete m_declinedname;
4818 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
4819 m_declinedname->name[i] = (*result)[i].Get<std::string>();
4820}
#define MAX_DECLINED_NAME_CASES
Definition: Unit.h:969
Definition: Unit.h:972
std::string name[MAX_DECLINED_NAME_CASES]
Definition: Unit.h:973

References m_declinedname, MAX_DECLINED_NAME_CASES, and DeclinedName::name.

Referenced by LoadFromDB().

◆ _LoadEntryPointData()

void Player::_LoadEntryPointData ( PreparedQueryResult  result)
protected
4885{
4886 if (!result)
4887 return;
4888
4889 Field* fields = result->Fetch();
4890 m_entryPointData.joinPos = WorldLocation(fields[4].Get<uint32>(), // Map
4891 fields[0].Get<float>(), // X
4892 fields[1].Get<float>(), // Y
4893 fields[2].Get<float>(), // Z
4894 fields[3].Get<float>()); // Orientation
4895
4896 m_entryPointData.taxiPath[0] = fields[5].Get<uint32>();
4897 m_entryPointData.taxiPath[1] = fields[6].Get<uint32>();
4898 m_entryPointData.mountSpell = fields[7].Get<uint32>();
4899}
Definition: Position.h:251
uint32 mountSpell
Definition: Player.h:1037
std::array< uint32, 2 > taxiPath
Definition: Player.h:1038
WorldLocation joinPos
Definition: Player.h:1039
EntryPointData m_entryPointData
Definition: Player.h:2620

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

Referenced by LoadFromDB().

◆ _LoadEquipmentSets()

void Player::_LoadEquipmentSets ( PreparedQueryResult  result)
protected
4854{
4855 // 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());
4856 if (!result)
4857 return;
4858
4859 uint32 count = 0;
4860 do
4861 {
4862 Field* fields = result->Fetch();
4863 EquipmentSet eqSet;
4864
4865 eqSet.Guid = fields[0].Get<uint64>();
4866 uint8 index = fields[1].Get<uint8>();
4867 eqSet.Name = fields[2].Get<std::string>();
4868 eqSet.IconName = fields[3].Get<std::string>();
4869 eqSet.IgnoreMask = fields[4].Get<uint32>();
4871
4872 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
4873 eqSet.Items[i] = ObjectGuid::Create<HighGuid::Item>(fields[5 + i].Get<uint32>());
4874
4875 m_EquipmentSets[index] = eqSet;
4876
4877 ++count;
4878
4879 if (count >= MAX_EQUIPMENT_SET_INDEX) // client limit
4880 break;
4881 } while (result->NextRow());
4882}
std::uint64_t uint64
Definition: Define.h:107
@ EQUIPMENT_SET_UNCHANGED
Definition: Player.h:743
#define MAX_EQUIPMENT_SET_INDEX
Definition: Player.h:761
@ EQUIPMENT_SLOT_END
Definition: Player.h:695
Definition: Player.h:750
ObjectGuid Items[EQUIPMENT_SLOT_END]
Definition: Player.h:757
std::string Name
Definition: Player.h:754
std::string IconName
Definition: Player.h:755
EquipmentSetUpdateState state
Definition: Player.h:758
uint64 Guid
Definition: Player.h:753
uint32 IgnoreMask
Definition: Player.h:756
EquipmentSets m_EquipmentSets
Definition: Player.h:2849

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
5805{
5806 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
5807 {
5808 if (uint32 glyph = GetGlyph(i))
5809 {
5810 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyph))
5811 {
5812 if (GlyphSlotEntry const* glyphSlotEntry = sGlyphSlotStore.LookupEntry(GetGlyphSlot(i)))
5813 {
5814 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(glyphEntry->SpellId);
5815 if (glyphEntry->TypeFlags == glyphSlotEntry->TypeFlags)
5816 {
5817 if (!spellInfo->Stances)
5819 continue;
5820 }
5821 else
5822 LOG_ERROR("entities.player", "Player {} has glyph with typeflags {} in slot with typeflags {}, removing.", m_name, glyphEntry->TypeFlags, glyphSlotEntry->TypeFlags);
5823 }
5824 else
5825 LOG_ERROR("entities.player", "Player {} has not existing glyph slot entry {} on index {}", m_name, GetGlyphSlot(i), i);
5826 }
5827 else
5828 LOG_ERROR("entities.player", "Player {} has not existing glyph entry {} on index {}", m_name, glyph, i);
5829
5830 // On any error remove glyph
5831 SetGlyph(i, 0, true);
5832 }
5833 }
5834}
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:623
uint32 GetGlyph(uint8 slot) const
Definition: Player.h:1720
uint32 GetGlyphSlot(uint8 slot) const
Definition: Player.h:1711
void SetGlyph(uint8 slot, uint32 glyph, bool save)
Definition: Player.h:1712
Definition: DBCStructure.h:1012
Definition: DBCStructure.h:1020

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
14839{
14840 // SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 from character_glyphs WHERE guid = '%u'
14841 if (!result)
14842 return;
14843
14844 do
14845 {
14846 Field* fields = result->Fetch();
14847
14848 uint8 spec = fields[0].Get<uint8>();
14849 if (spec >= m_specsCount)
14850 continue;
14851
14852 m_Glyphs[spec][0] = fields[1].Get<uint16>();
14853 m_Glyphs[spec][1] = fields[2].Get<uint16>();
14854 m_Glyphs[spec][2] = fields[3].Get<uint16>();
14855 m_Glyphs[spec][3] = fields[4].Get<uint16>();
14856 m_Glyphs[spec][4] = fields[5].Get<uint16>();
14857 m_Glyphs[spec][5] = fields[6].Get<uint16>();
14858 } while (result->NextRow());
14859}

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

Referenced by LoadFromDB().

◆ _LoadGroup()

void Player::_LoadGroup ( )
protected
6503{
6504 if (ObjectGuid groupId = sCharacterCache->GetCharacterGroupGuidByGuid(GetGUID()))
6505 {
6506 if (Group* group = sGroupMgr->GetGroupByGUID(groupId.GetCounter()))
6507 {
6508 if (group->GetMemberGroup(GetGUID()) <= MAX_RAID_SUBGROUPS)
6509 {
6510 if (group->IsLeader(GetGUID()))
6511 {
6513 }
6514
6515 uint8 subgroup = group->GetMemberGroup(GetGUID());
6516 SetGroup(group, subgroup);
6517
6518 // the group leader may change the instance difficulty while the player is offline
6519 SetDungeonDifficulty(group->GetDungeonDifficulty());
6520 SetRaidDifficulty(group->GetRaidDifficulty());
6521 }
6522 }
6523 }
6524
6525 if (!GetGroup() || !GetGroup()->IsLeader(GetGUID()))
6527}
@ PLAYER_FLAGS_GROUP_LEADER
Definition: Player.h:475
#define MAX_RAID_SUBGROUPS
Definition: Group.h:44
#define sGroupMgr
Definition: GroupMgr.h:51
void SetPlayerFlag(PlayerFlags flags)
Definition: Player.h:1091
void RemovePlayerFlag(PlayerFlags flags)
Definition: Player.h:1092
void SetDungeonDifficulty(Difficulty dungeon_difficulty)
Definition: Player.h:1874
void SetGroup(Group *group, int8 subgroup=-1)
Definition: Player.cpp:11457
void SetRaidDifficulty(Difficulty raid_difficulty)
Definition: Player.h:1875
Group * GetGroup()
Definition: Player.h:2418
Definition: Group.h:168

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

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_homebindO, m_homebindX, m_homebindY, m_homebindZ, PlayerInfo::mapId, PlayerInfo::orientation, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, PreparedStatementBase::SetData(), sMapStore, and sObjectMgr.

Referenced by LoadFromDB().

◆ _LoadInstanceTimeRestrictions()

void Player::_LoadInstanceTimeRestrictions ( PreparedQueryResult  result)
protected
15652{
15653 if (!result)
15654 return;
15655
15656 do
15657 {
15658 Field* fields = result->Fetch();
15659 _instanceResetTimes.insert(InstanceTimeMap::value_type(fields[0].Get<uint32>(), fields[1].Get<uint64>()));
15660 } while (result->NextRow());
15661}
InstanceTimeMap _instanceResetTimes
Definition: Player.h:2921

References _instanceResetTimes.

Referenced by LoadFromDB().

◆ _LoadInventory()

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

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
5989{
5990 Item* item = nullptr;
5991 ObjectGuid::LowType itemGuid = fields[13].Get<uint32>();
5992 uint32 itemEntry = fields[14].Get<uint32>();
5993 if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry))
5994 {
5995 bool remove = false;
5996 item = NewItemOrBag(proto);
5997 if (item->LoadFromDB(itemGuid, GetGUID(), fields, itemEntry))
5998 {
5999 CharacterDatabasePreparedStatement* stmt = nullptr;
6000
6001 // Do not allow to have item limited to another map/zone in alive state
6002 if (IsAlive() && item->IsLimitedToAnotherMapOrZone(GetMapId(), zoneId))
6003 {
6004 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', map: {}) has item ({}, entry: {}) limited to another map ({}). Deleting item.",
6005 GetGUID().ToString(), GetName(), GetMapId(), item->GetGUID().ToString(), item->GetEntry(), zoneId);
6006 remove = true;
6007 }
6008 // "Conjured items disappear if you are logged out for more than 15 minutes"
6009 else if (timeDiff > 15 * MINUTE && proto->Flags & ITEM_FLAG_CONJURED)
6010 {
6011 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', diff: {}) has conjured item ({}, entry: {}) with expired lifetime (15 minutes). Deleting item.",
6012 GetGUID().ToString(), GetName(), timeDiff, item->GetGUID().ToString(), item->GetEntry());
6013 remove = true;
6014 }
6016 {
6017 if (item->GetPlayedTime() > (2 * HOUR))
6018 {
6019 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with expired refund time ({}). Deleting refund data and removing refundable flag.",
6020 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), item->GetPlayedTime());
6021 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_REFUND_INSTANCE);
6022 stmt->SetData(0, item->GetGUID().GetCounter());
6023 trans->Append(stmt);
6024
6026 }
6027 else
6028 {
6029 // xinef: sync query
6030 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_REFUNDS);
6031 stmt->SetData(0, item->GetGUID().GetCounter());
6032 stmt->SetData(1, GetGUID().GetCounter());
6033 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
6034 {
6035 item->SetRefundRecipient((*result)[0].Get<uint32>());
6036 item->SetPaidMoney((*result)[1].Get<uint32>());
6037 item->SetPaidExtendedCost((*result)[2].Get<uint16>());
6038 AddRefundReference(item->GetGUID());
6039 }
6040 else
6041 {
6042 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with refundable flags, but without data in item_refund_instance. Removing flag.",
6043 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry());
6045 }
6046 }
6047 }
6049 {
6050 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_BOP_TRADE);
6051 stmt->SetData(0, item->GetGUID().GetCounter());
6052
6053 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
6054 {
6055 AllowedLooterSet looters;
6056 for (std::string_view guidStr : Acore::Tokenize((*result)[0].Get<std::string_view>(), ' ', false))
6057 {
6058 if (Optional<ObjectGuid::LowType> guid = Acore::StringTo<ObjectGuid::LowType>(guidStr))
6059 {
6060 looters.insert(ObjectGuid::Create<HighGuid::Player>(*guid));
6061 }
6062 else
6063 {
6064 LOG_WARN("entities.player.loading", "Player::_LoadInventory: invalid item_soulbound_trade_data GUID '{}' for item {}. Skipped.", guidStr, item->GetGUID().ToString());
6065 }
6066 }
6067
6068 if (looters.size() > 1 && item->GetTemplate()->GetMaxStackSize() == 1 && item->IsSoulBound())
6069 {
6070 item->SetSoulboundTradeable(looters);
6071 AddTradeableItem(item);
6072 }
6073 else
6074 item->ClearSoulboundTradeable(this);
6075 }
6076 else
6077 {
6078 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.",
6079 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry());
6081 }
6082 }
6083 else if (proto->HolidayId)
6084 {
6085 remove = true;
6086 GameEventMgr::GameEventDataMap const& events = sGameEventMgr->GetEventMap();
6087 GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();
6088 for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
6089 {
6090 if (uint32(events[*itr].holiday_id) == proto->HolidayId)
6091 {
6092 remove = false;
6093 break;
6094 }
6095 }
6096 }
6097 }
6098 else
6099 {
6100 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has broken item (GUID: {}, entry: {}) in inventory. Deleting item.",
6101 GetGUID().ToString(), GetName(), itemGuid, itemEntry);
6102 remove = true;
6103 }
6104 // Remove item from inventory if necessary
6105 if (remove)
6106 {
6107 Item::DeleteFromInventoryDB(trans, itemGuid);
6108 item->FSetState(ITEM_REMOVED);
6109 item->SaveToDB(trans); // it also deletes item object!
6110 item = nullptr;
6111 }
6112 }
6113 else
6114 {
6115 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has unknown item (entry: {}) in inventory. Deleting item.",
6116 GetGUID().ToString(), GetName(), itemEntry);
6117 Item::DeleteFromInventoryDB(trans, itemGuid);
6118 Item::DeleteFromDB(trans, itemGuid);
6119 }
6120 return item;
6121}
constexpr auto HOUR
Definition: Common.h:57
constexpr auto MINUTE
Definition: Common.h:56
#define LOG_WARN(filterType__,...)
Definition: Log.h:163
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:24
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition: DatabaseEnvFwd.h:46
@ CHAR_DEL_ITEM_REFUND_INSTANCE
Definition: CharacterDatabase.h:371
@ CHAR_SEL_ITEM_BOP_TRADE
Definition: CharacterDatabase.h:120
@ CHAR_SEL_ITEM_REFUNDS
Definition: CharacterDatabase.h:119
Item * NewItemOrBag(ItemTemplate const *proto)
Definition: Bag.h:67
@ ITEM_REMOVED
Definition: Item.h:206
@ ITEM_FIELD_FLAG_REFUNDABLE
Definition: ItemTemplate.h:122
@ ITEM_FIELD_FLAG_BOP_TRADEABLE
Definition: ItemTemplate.h:118
@ ITEM_FLAG_CONJURED
Definition: ItemTemplate.h:149
@ ITEM_FIELD_FLAGS
Definition: UpdateFields.h:42
#define sGameEventMgr
Definition: GameEventMgr.h:186
GuidSet AllowedLooterSet
Definition: LootMgr.h:152
events
Definition: boss_sartura.cpp:43
uint32 GetPlayedTime()
Definition: Item.cpp:1248
static void DeleteFromInventoryDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition: Item.cpp:534
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field *fields, uint32 entry)
Definition: Item.cpp:421
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition: Item.cpp:338
bool IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) const
Definition: Item.cpp:1058
void SetSoulboundTradeable(AllowedLooterSet &allowedLooters)
Definition: Item.cpp:1260
void SetPaidMoney(uint32 money)
Definition: Item.h:336
bool IsSoulBound() const
Definition: Item.h:230
void SetRefundRecipient(ObjectGuid::LowType pGuidLow)
Definition: Item.h:335
void FSetState(ItemUpdateState state)
Definition: Item.h:321
void SetPaidExtendedCost(uint32 iece)
Definition: Item.h:337
void ClearSoulboundTradeable(Player *currentOwner)
Definition: Item.cpp:1266
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition: Item.cpp:520
uint32 GetMaxStackSize() const
Definition: ItemTemplate.h:738
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:860
uint32 GetEntry() const
Definition: Object.h:109
bool HasFlag(uint16 index, uint32 flag) const
Definition: Object.cpp:889
uint32 GetMapId() const
Definition: Position.h:276
void AddRefundReference(ObjectGuid itemGUID)
Definition: Player.cpp:15389
void AddTradeableItem(Item *item)
Definition: PlayerStorage.cpp:4160
bool IsAlive() const
Definition: Unit.h:1808
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(), Object::HasFlag(), HOUR, Unit::IsAlive(), Item::IsLimitedToAnotherMapOrZone(), 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
6177{
6178 time_t cur_time = GameTime::GetGameTime().count();
6179
6180 m_mail.clear();
6181
6182 std::unordered_map<uint32, Mail*> mailById;
6183
6184 if (mailsResult)
6185 {
6186 do
6187 {
6188 Field* fields = mailsResult->Fetch();
6189 Mail* m = new Mail;
6190
6191 m->messageID = fields[0].Get<uint32>();
6192 m->messageType = fields[1].Get<uint8>();
6193 m->sender = fields[2].Get<uint32>();
6194 m->receiver = fields[3].Get<uint32>();
6195 m->subject = fields[4].Get<std::string>();
6196 m->body = fields[5].Get<std::string>();
6197 m->expire_time = time_t(fields[6].Get<uint32>());
6198 m->deliver_time = time_t(fields[7].Get<uint32>());
6199 m->money = fields[8].Get<uint32>();
6200 m->COD = fields[9].Get<uint32>();
6201 m->checked = fields[10].Get<uint8>();
6202 m->stationery = fields[11].Get<uint8>();
6203 m->mailTemplateId = fields[12].Get<int16>();
6204
6205 if (cur_time > m->expire_time)
6206 {
6207 LOG_DEBUG("entities.player", "Player::_LoadMail: Mail ({}) has expired - ignored.", m->messageID);
6208 continue;
6209 }
6210
6211 if (m->mailTemplateId && !sMailTemplateStore.LookupEntry(m->mailTemplateId))
6212 {
6213 LOG_ERROR("entities.player", "Player::_LoadMail: Mail ({}) has nonexistent MailTemplateId ({}), remove at load", m->messageID, m->mailTemplateId);
6214 m->mailTemplateId = 0;
6215 }
6216
6218
6219 m_mail.push_back(m);
6220 mailById[m->messageID] = m;
6221 } while (mailsResult->NextRow());
6222 }
6223
6224 if (mailItemsResult)
6225 {
6226 do
6227 {
6228 Field* fields = mailItemsResult->Fetch();
6229 uint32 mailId = fields[14].Get<uint32>();
6230 _LoadMailedItem(GetGUID(), this, mailId, mailById[mailId], fields);
6231 } while (mailItemsResult->NextRow());
6232 }
6233
6235}
std::int16_t int16
Definition: Define.h:105
DBCStorage< MailTemplateEntry > sMailTemplateStore(MailTemplateEntryfmt)
@ MAIL_STATE_UNCHANGED
Definition: Mail.h:69
void UpdateNextMailTimeAndUnreads()
Definition: PlayerUpdates.cpp:432
static Item * _LoadMailedItem(ObjectGuid const &playerGuid, Player *player, uint32 mailId, Mail *mail, Field *fields)
Definition: PlayerStorage.cpp:6124
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
6125{
6126 ObjectGuid::LowType itemGuid = fields[11].Get<uint32>();
6127 uint32 itemEntry = fields[12].Get<uint32>();
6128
6129 ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry);
6130 if (!proto)
6131 {
6132 LOG_ERROR("entities.player", "Player {} ({}) has unknown item in mailed items (GUID: {}, Entry: {}) in mail ({}), deleted.",
6133 player ? player->GetName() : "<unknown>", playerGuid.ToString(), itemGuid, itemEntry, mailId);
6134
6135 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
6136
6138 stmt->SetData(0, itemGuid);
6139 trans->Append(stmt);
6140
6141 CharacterDatabase.CommitTransaction(trans);
6142 return nullptr;
6143 }
6144
6145 Item* item = NewItemOrBag(proto);
6146
6147 ObjectGuid ownerGuid = fields[13].Get<uint32>() ? ObjectGuid::Create<HighGuid::Player>(fields[13].Get<uint32>()) : ObjectGuid::Empty;
6148 if (!item->LoadFromDB(itemGuid, ownerGuid, fields, itemEntry))
6149 {
6150 LOG_ERROR("entities.player", "Player::_LoadMailedItems: Item (GUID: {}) in mail ({}) doesn't exist, deleted from mail.", itemGuid, mailId);
6151
6153 stmt->SetData(0, itemGuid);
6154 CharacterDatabase.Execute(stmt);
6155
6156 item->FSetState(ITEM_REMOVED);
6157
6159 item->SaveToDB(temp);
6160 return nullptr;
6161 }
6162
6163 if (mail)
6164 {
6165 mail->AddItem(itemGuid, itemEntry);
6166 }
6167
6168 if (player)
6169 {
6170 player->AddMItem(item);
6171 }
6172
6173 return item;
6174}
@ CHAR_DEL_INVALID_MAIL_ITEM
Definition: CharacterDatabase.h:113
@ CHAR_DEL_MAIL_ITEM
Definition: CharacterDatabase.h:112
static ObjectGuid const Empty
Definition: ObjectGuid.h:122
void AddMItem(Item *it)
Definition: Player.h:1632
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
6468{
6469 m_monthlyquests.clear();
6470
6471 if (result)
6472 {
6473 do
6474 {
6475 Field* fields = result->Fetch();
6476 uint32 quest_id = fields[0].Get<uint32>();
6477 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6478 if (!quest)
6479 continue;
6480
6481 m_monthlyquests.insert(quest_id);
6482 LOG_DEBUG("entities.player.loading", "Monthly quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6483 } while (result->NextRow());
6484 }
6485
6486 m_MonthlyQuestChanged = false;
6487}
QuestSet m_monthlyquests
Definition: Player.h:2632

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
15701{
15702 if (!petStableSlots && !result)
15703 return;
15704
15705 m_petStable = std::make_unique<PetStable>();
15706 m_petStable->MaxStabledPets = petStableSlots;
15707
15708 if (m_petStable->MaxStabledPets > MAX_PET_STABLES)
15709 {
15710 LOG_ERROR("entities.player", "Player::LoadFromDB: Player ({}) can't have more stable slots than {}, but has {} in DB",
15711 GetGUID().ToString(), MAX_PET_STABLES, m_petStable->MaxStabledPets);
15712
15713 m_petStable->MaxStabledPets = MAX_PET_STABLES;
15714 }
15715
15716 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
15717 // SELECT id, entry, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ?
15718 if (result)
15719 {
15720 do
15721 {
15722 Field* fields = result->Fetch();
15723 PetStable::PetInfo petInfo;
15724 petInfo.PetNumber = fields[0].Get<uint32>();
15725 petInfo.CreatureId = fields[1].Get<uint32>();
15726 petInfo.DisplayId = fields[2].Get<uint32>();
15727 petInfo.Level = fields[3].Get<uint16>();
15728 petInfo.Experience = fields[4].Get<uint32>();
15729 petInfo.ReactState = ReactStates(fields[5].Get<uint8>());
15730 PetSaveMode slot = PetSaveMode(fields[6].Get<uint8>());
15731 petInfo.Name = fields[7].Get<std::string>();
15732 petInfo.WasRenamed = fields[8].Get<bool>();
15733 petInfo.Health = fields[9].Get<uint32>();
15734 petInfo.Mana = fields[10].Get<uint32>();
15735 petInfo.Happiness = fields[11].Get<uint32>();
15736 petInfo.ActionBar = fields[12].Get<std::string>();
15737 petInfo.LastSaveTime = fields[13].Get<uint32>();
15738 petInfo.CreatedBySpellId = fields[14].Get<uint32>();
15739 petInfo.Type = PetType(fields[15].Get<uint8>());
15740
15741 if (slot == PET_SAVE_AS_CURRENT)
15742 m_petStable->CurrentPet = std::move(petInfo);
15743 else if (slot >= PET_SAVE_FIRST_STABLE_SLOT && slot <= PET_SAVE_LAST_STABLE_SLOT)
15744 m_petStable->StabledPets[slot - 1] = std::move(petInfo);
15745 else if (slot == PET_SAVE_NOT_IN_SLOT)
15746 m_petStable->UnslottedPets.push_back(std::move(petInfo));
15747
15748 } while (result->NextRow());
15749 }
15750}
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:1022
Definition: PetDefines.h:200
uint32 Mana
Definition: PetDefines.h:210
uint32 Happiness
Definition: PetDefines.h:211
uint32 CreatedBySpellId
Definition: PetDefines.h:213
uint32 Health
Definition: PetDefines.h:209
uint32 CreatureId
Definition: PetDefines.h:206
bool WasRenamed
Definition: PetDefines.h:217
uint8 Level
Definition: PetDefines.h:214
uint32 DisplayId
Definition: PetDefines.h:207
ReactStates ReactState
Definition: PetDefines.h:215
std::string Name
Definition: PetDefines.h:203
PetType Type
Definition: PetDefines.h:216
uint32 Experience
Definition: PetDefines.h:208
uint32 PetNumber
Definition: PetDefines.h:205
uint32 LastSaveTime
Definition: PetDefines.h:212
std::string ActionBar
Definition: PetDefines.h:204
std::unique_ptr< PetStable > m_petStable
Definition: Player.h:2908

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

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
6337{
6338 // SELECT quest FROM character_queststatus_rewarded WHERE guid = ?
6339
6340 if (result)
6341 {
6342 m_RewardedQuests.rehash(result->GetRowCount());
6343 do
6344 {
6345 Field* fields = result->Fetch();
6346
6347 uint32 quest_id = fields[0].Get<uint32>();
6348 // used to be new, no delete?
6349 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6350 if (quest)
6351 {
6352 // learn rewarded spell if unknown
6354
6355 // set rewarded title if any
6356 if (quest->GetCharTitleId())
6357 {
6358 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(quest->GetCharTitleId()))
6359 SetTitle(titleEntry);
6360 }
6361
6362 if (quest->GetBonusTalents())
6363 m_questRewardTalentCount += quest->GetBonusTalents();
6364 }
6365
6366 m_RewardedQuests.insert(quest_id);
6367 } while (result->NextRow());
6368 }
6369}
DBCStorage< CharTitlesEntry > sCharTitlesStore(CharTitlesEntryfmt)
RewardedQuestSet m_RewardedQuests
Definition: Player.h:2735
void SetTitle(CharTitlesEntry const *title, bool lost=false)
Definition: Player.cpp:13228
void learnQuestRewardedSpells()
Definition: Player.cpp:11874
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
15599{
15600 if (result)
15601 m_IsBGRandomWinner = true;
15602}

References m_IsBGRandomWinner.

Referenced by LoadFromDB().

◆ _LoadSeasonalQuestStatus()

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

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
13555{
13556 // 0 1 2
13557 // SetQuery(PLAYER_LOGIN_QUERY_LOADSKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = '{}'", m_guid.GetCounter());
13558
13559 uint32 count = 0;
13560 std::unordered_map<uint32, uint32> loadedSkillValues;
13561 if (result)
13562 {
13563 do
13564 {
13565 Field* fields = result->Fetch();
13566 uint16 skill = fields[0].Get<uint16>();
13567 uint16 value = fields[1].Get<uint16>();
13568 uint16 max = fields[2].Get<uint16>();
13569
13570 SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skill, getRace(), getClass());
13571 if (!rcEntry)
13572 {
13573 LOG_ERROR("entities.player", "Character {} has skill {} that does not exist.", GetGUID().ToString(), skill);
13574 continue;
13575 }
13576
13577 // set fixed skill ranges
13578 switch (GetSkillRangeType(rcEntry))
13579 {
13580 case SKILL_RANGE_LANGUAGE: // 300..300
13581 value = max = 300;
13582 break;
13583 case SKILL_RANGE_MONO: // 1..1, grey monolite bar
13584 value = max = 1;
13585 break;
13586 case SKILL_RANGE_LEVEL:
13588 default:
13589 break;
13590 }
13591
13592 if (value == 0)
13593 {
13594 LOG_ERROR("entities.player", "Character {} has skill {} with value 0. Will be deleted.", GetGUID().ToString(), skill);
13595
13597
13598 stmt->SetData(0, GetGUID().GetCounter());
13599 stmt->SetData(1, skill);
13600
13601 CharacterDatabase.Execute(stmt);
13602
13603 continue;
13604 }
13605
13606 uint16 skillStep = 0;
13607 if (SkillTiersEntry const* skillTier = sSkillTiersStore.LookupEntry(rcEntry->SkillTierID))
13608 {
13609 for (uint32 i = 0; i < MAX_SKILL_STEP; ++i)
13610 {
13611 if (skillTier->Value[skillStep] == max)
13612 {
13613 skillStep = i + 1;
13614 break;
13615 }
13616 }
13617 }
13618
13619 SetUInt32Value(PLAYER_SKILL_INDEX(count), MAKE_PAIR32(skill, skillStep));
13620
13623
13624 mSkillStatus.insert(SkillStatusMap::value_type(skill, SkillStatusData(count, SKILL_UNCHANGED)));
13625
13626 loadedSkillValues[skill] = value;
13627
13628 ++count;
13629
13630 if (count >= PLAYER_MAX_SKILLS) // client limit
13631 {
13632 LOG_ERROR("entities.player", "Character {} has more than {} skills.", GetGUID().ToString(), PLAYER_MAX_SKILLS);
13633 break;
13634 }
13635 } while (result->NextRow());
13636 }
13637
13638 // 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
13639 for (auto& skill : loadedSkillValues)
13640 {
13641 learnSkillRewardedSpells(skill.first, skill.second);
13642 }
13643
13644 for (; count < PLAYER_MAX_SKILLS; ++count)
13645 {
13649 }
13650}
@ CHAR_DEL_CHARACTER_SKILL
Definition: CharacterDatabase.h:316
SkillRaceClassInfoEntry const * GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_)
Definition: DBCStores.cpp:882
DBCStorage< SkillTiersEntry > sSkillTiersStore(SkillTiersfmt)
uint32 MAKE_PAIR32(uint16 l, uint16 h)
Definition: ObjectDefines.h:87
#define PLAYER_SKILL_BONUS_INDEX(x)
Definition: Player.h:81
#define PLAYER_SKILL_VALUE_INDEX(x)
Definition: Player.h:80
#define PLAYER_SKILL_INDEX(x)
Definition: Player.h:79
#define PLAYER_MAX_SKILLS
Definition: Player.h:71
@ SKILL_UNCHANGED
Definition: Player.h:640
#define MAKE_SKILL_VALUE(v, m)
Definition: Player.h:85
SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const *rcEntry)
Definition: ObjectMgr.cpp:8735
@ SKILL_RANGE_MONO
Definition: ObjectMgr.h:681
@ SKILL_RANGE_LANGUAGE
Definition: ObjectMgr.h:679
@ SKILL_RANGE_LEVEL
Definition: ObjectMgr.h:680
#define MAX_SKILL_STEP
Definition: DBCStructure.h:1553
Definition: Player.h:647
SkillStatusMap mSkillStatus
Definition: Player.h:2739
void learnSkillRewardedSpells(uint32 id, uint32 value)
Definition: Player.cpp:11887
Definition: DBCStructure.h:1542
Definition: DBCStructure.h:1588

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(), Object::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)
3527{
3528 // some cooldowns can be already set at aura loading...
3529
3530 //QueryResult* result = CharacterDatabase.Query("SELECT spell, category, item, time FROM character_spell_cooldown WHERE guid = '{}'", GetGUID().GetCounter()());
3531
3532 if (result)
3533 {
3534 time_t curTime = GameTime::GetGameTime().count();
3535
3536 do
3537 {
3538 Field* fields = result->Fetch();
3539 uint32 spell_id = fields[0].Get<uint32>();
3540 uint16 category = fields[1].Get<uint16>();
3541 uint32 item_id = fields[2].Get<uint32>();
3542 uint32 db_time = fields[3].Get<uint32>();
3543 bool needSend = fields[4].Get<bool>();
3544
3545 if (!sSpellMgr->GetSpellInfo(spell_id))
3546 {
3547 LOG_ERROR("entities.player", "Player {} has unknown spell {} in `character_spell_cooldown`, skipping.", GetGUID().ToString(), spell_id);
3548 continue;
3549 }
3550
3551 // skip outdated cooldown
3552 if (db_time <= curTime)
3553 continue;
3554
3555 _AddSpellCooldown(spell_id, category, item_id, (db_time - curTime) * IN_MILLISECONDS, needSend);
3556
3557 LOG_DEBUG("entities.player.loading", "Player ({}) spell {}, item {} cooldown loaded ({} secs).", GetGUID().ToString(), spell_id, item_id, uint32(db_time - curTime));
3558 } while (result->NextRow());
3559 }
3560}
void _AddSpellCooldown(uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition: Player.cpp:10961

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
6490{
6491 //QueryResult* result = CharacterDatabase.Query("SELECT spell, specMask FROM character_spell WHERE guid = '{}'", GetGUID().GetCounter());
6492
6493 if (result)
6494 {
6495 do
6496 // xinef: checked
6497 addSpell((*result)[0].Get<uint32>(), (*result)[1].Get<uint8>(), true);
6498 while (result->NextRow());
6499 }
6500}
bool addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary=false, bool learnFromSkill=false)
Definition: Player.cpp:2995

References addSpell().

Referenced by LoadFromDB().

◆ _LoadTalents()

void Player::_LoadTalents ( PreparedQueryResult  result)
protected
14888{
14889 // SetQuery(PLAYER_LOGIN_QUERY_LOADTALENTS, "SELECT spell, specMask FROM character_talent WHERE guid = '{}'", m_guid.GetCounter());
14890 if (result)
14891 {
14892 do
14893 {
14894 // xinef: checked
14895 uint32 spellId = (*result)[0].Get<uint32>();
14896 uint8 specMask = (*result)[1].Get<uint8>();
14897 addTalent(spellId, specMask, 0);
14898 TalentSpellPos const* talentPos = GetTalentSpellPos(spellId);
14899 ASSERT(talentPos);
14900
14901 // xinef: increase used talent points count
14902 if (GetActiveSpecMask() & specMask)
14903 m_usedTalentCount += talentPos->rank + 1;
14904 } while (result->NextRow());
14905 }
14906}
#define ASSERT
Definition: Errors.h:68
TalentSpellPos const * GetTalentSpellPos(uint32 spellId)
Definition: DBCStores.cpp:670
bool addTalent(uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank)
Definition: Player.cpp:2850
uint8 GetActiveSpecMask() const
Definition: Player.h:1695
Definition: DBCStructure.h:2205
uint8 rank
Definition: DBCStructure.h:2210

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

Referenced by LoadFromDB().

◆ _LoadWeeklyQuestStatus()

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

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

Referenced by LoadFromDB().

◆ _RemoveAllItemMods()

void Player::_RemoveAllItemMods ( )
7399{
7400 LOG_DEBUG("entities.player.items", "_RemoveAllItemMods start.");
7401
7402 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7403 {
7404 if (m_items[i])
7405 {
7406 ItemTemplate const* proto = m_items[i]->GetTemplate();
7407 if (!proto)
7408 continue;
7409
7410 // item set bonuses not dependent from item broken state
7411 if (proto->ItemSet)
7412 RemoveItemsSetItem(this, proto);
7413
7414 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7415 continue;
7416
7417 ApplyItemEquipSpell(m_items[i], false);
7418 ApplyEnchantment(m_items[i], false);
7419 }
7420 }
7421
7422 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7423 {
7424 if (m_items[i])
7425 {
7426 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7427 continue;
7428 ItemTemplate const* proto = m_items[i]->GetTemplate();
7429 if (!proto)
7430 continue;
7431
7432 uint32 attacktype = Player::GetAttackBySlot(i);
7433 if (attacktype < MAX_ATTACK)
7435
7436 _ApplyItemBonuses(proto, i, false);
7437
7438 if (i == EQUIPMENT_SLOT_RANGED)
7440 }
7441 }
7442
7443 LOG_DEBUG("entities.player.items", "_RemoveAllItemMods complete.");
7444}
void RemoveItemsSetItem(Player *player, ItemTemplate const *proto)
Definition: Item.cpp:120

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 ( )
999{
1000 SetCanModifyStats(false);
1001
1004
1005 SetCanModifyStats(true);
1006
1008}
void _RemoveAllItemMods()
Definition: Player.cpp:7398
void _RemoveAllAuraStatMods()
Definition: Unit.cpp:5400

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

Referenced by InitStatsForLevel().

◆ _removeTalent() [1/2]

void Player::_removeTalent ( PlayerTalentMap::iterator &  itr,
uint8  specMask 
)
2915{
2916 // xinef: remove spec mask from iterator
2917 itr->second->specMask &= ~specMask;
2918
2919 // xinef: if talent is not present in any spec - remove
2920 if (itr->second->specMask == 0)
2921 {
2922 if (itr->second->State == PLAYERSPELL_NEW)
2923 {
2924 delete itr->second;
2925 m_talents.erase(itr);
2926 return;
2927 }
2928 else
2929 itr->second->State = PLAYERSPELL_REMOVED;
2930 }
2931 // xinef: otherwise save changes to DB
2932 else if (itr->second->State != PLAYERSPELL_NEW)
2933 itr->second->State = PLAYERSPELL_CHANGED;
2934}

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 
)
2906{
2907 PlayerTalentMap::iterator itr = m_talents.find(spellId);
2908 if (itr == m_talents.end() || itr->second->State == PLAYERSPELL_REMOVED)
2909 return;
2910
2911 _removeTalent(itr, specMask);
2912}
void _removeTalent(PlayerTalentMap::iterator &itr, uint8 specMask)
Definition: Player.cpp:2914

References _removeTalent(), m_talents, and PLAYERSPELL_REMOVED.

◆ _removeTalentAurasAndSpells()

void Player::_removeTalentAurasAndSpells ( uint32  spellId)
2937{
2938 RemoveOwnedAura(spellId);
2939
2940 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
2941 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
2942 {
2943 // pussywizard: remove pet auras
2944 if (PetAura const* petSpell = sSpellMgr->GetPetAura(spellId, i))
2945 RemovePetAura(petSpell);
2946
2947 // pussywizard: remove all triggered auras
2948 if (spellInfo->Effects[i].TriggerSpell > 0)
2949 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
2950
2951 // xinef: remove temporary spells added by talent
2952 // xinef: recursively remove all learnt spells
2953 if (spellInfo->Effects[i].TriggerSpell > 0 && spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
2954 {
2955 removeSpell(spellInfo->Effects[i].TriggerSpell, SPEC_MASK_ALL, true);
2956 _removeTalentAurasAndSpells(spellInfo->Effects[i].TriggerSpell);
2957 }
2958 }
2959}
void removeSpell(uint32 spellId, uint8 removeSpecMask, bool onlyTemporary)
Definition: Player.cpp:3271
void _removeTalentAurasAndSpells(uint32 spellId)
Definition: Player.cpp:2936
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4637
void RemovePetAura(PetAura const *petSpell)
Definition: Unit.cpp:17469
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4835
Definition: SpellMgr.h:463

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
7153{
7154 CharacterDatabasePreparedStatement* stmt = nullptr;
7155
7156 for (ActionButtonList::iterator itr = m_actionButtons.begin(); itr != m_actionButtons.end();)
7157 {
7158 switch (itr->second.uState)
7159 {
7160 case ACTIONBUTTON_NEW:
7161 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
7162 stmt->SetData(0, GetGUID().GetCounter());
7163 stmt->SetData(1, m_activeSpec);
7164 stmt->SetData(2, itr->first);
7165 stmt->SetData(3, itr->second.GetAction());
7166 stmt->SetData(4, uint8(itr->second.GetType()));
7167 trans->Append(stmt);
7168
7169 itr->second.uState = ACTIONBUTTON_UNCHANGED;
7170 ++itr;
7171 break;
7173 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ACTION);
7174 stmt->SetData(0, itr->second.GetAction());
7175 stmt->SetData(1, uint8(itr->second.GetType()));
7176 stmt->SetData(2, GetGUID().GetCounter());
7177 stmt->SetData(3, itr->first);
7178 stmt->SetData(4, m_activeSpec);
7179 trans->Append(stmt);
7180
7181 itr->second.uState = ACTIONBUTTON_UNCHANGED;
7182 ++itr;
7183 break;
7185 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC);
7186 stmt->SetData(0, GetGUID().GetCounter());
7187 stmt->SetData(1, itr->first);
7188 stmt->SetData(2, m_activeSpec);
7189 trans->Append(stmt);
7190
7191 m_actionButtons.erase(itr++);
7192 break;
7193 default:
7194 ++itr;
7195 break;
7196 }
7197 }
7198}
@ CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC
Definition: CharacterDatabase.h:429
@ CHAR_UPD_CHAR_ACTION
Definition: CharacterDatabase.h:428
@ CHAR_INS_CHAR_ACTION
Definition: CharacterDatabase.h:427
@ ACTIONBUTTON_NEW
Definition: Player.h:224
@ ACTIONBUTTON_CHANGED
Definition: Player.h:223

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

14565{
14566 CharacterDatabasePreparedStatement* stmt = nullptr;
14567 uint8 index = 0;
14568
14569 auto finiteAlways = [](float f) { return std::isfinite(f) ? f : 0.0f; };
14570
14571 if (create)
14572 {
14575 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER);
14576 stmt->SetData(index++, GetGUID().GetCounter());
14577 stmt->SetData(index++, GetSession()->GetAccountId());
14578 stmt->SetData(index++, GetName());
14579 stmt->SetData(index++, getRace(true));
14580 stmt->SetData(index++, getClass());
14581 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
14582 stmt->SetData(index++, GetLevel());
14583 stmt->SetData(index++, GetUInt32Value(PLAYER_XP));
14584 stmt->SetData(index++, GetMoney());
14585 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 0));
14586 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 1));
14587 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 2));
14588 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 3));
14589 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 0));
14590 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 2));
14591 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 3));
14592 stmt->SetData(index++, (uint32)GetPlayerFlags());
14593 stmt->SetData(index++, (uint16)GetMapId());
14594 stmt->SetData(index++, (uint32)GetInstanceId());
14595 stmt->SetData(index++, (uint8(GetDungeonDifficulty()) | uint8(GetRaidDifficulty()) << 4));
14596 stmt->SetData(index++, finiteAlways(GetPositionX()));
14597 stmt->SetData(index++, finiteAlways(GetPositionY()));
14598 stmt->SetData(index++, finiteAlways(GetPositionZ()));
14599 stmt->SetData(index++, finiteAlways(GetOrientation()));
14600 stmt->SetData(index++, finiteAlways(GetTransOffsetX()));
14601 stmt->SetData(index++, finiteAlways(GetTransOffsetY()));
14602 stmt->SetData(index++, finiteAlways(GetTransOffsetZ()));
14603 stmt->SetData(index++, finiteAlways(GetTransOffsetO()));
14604
14605 int32 lowGuidOrSpawnId = 0;
14606 if (Transport* transport = GetTransport())
14607 {
14608 if (transport->IsMotionTransport())
14609 lowGuidOrSpawnId = static_cast<int32>(transport->GetGUID().GetCounter());
14610 else if (transport->IsStaticTransport())
14611 lowGuidOrSpawnId = -static_cast<int32>(transport->GetSpawnId());
14612 }
14613 stmt->SetData(index++, lowGuidOrSpawnId);
14614
14615 std::ostringstream ss;
14616 ss << m_taxi;
14617 stmt->SetData(index++, ss.str());
14618 stmt->SetData(index++, m_cinematic);
14619 stmt->SetData(index++, m_Played_time[PLAYED_TIME_TOTAL]);
14620 stmt->SetData(index++, m_Played_time[PLAYED_TIME_LEVEL]);
14621 stmt->SetData(index++, finiteAlways(_restBonus));
14622 stmt->SetData(index++, uint32(GameTime::GetGameTime().count()));
14623 stmt->SetData(index++, (HasPlayerFlag(PLAYER_FLAGS_RESTING) ? 1 : 0));
14624 //save, far from tavern/city
14625 //save, but in tavern/city
14626 stmt->SetData(index++, m_resetTalentsCost);
14627 stmt->SetData(index++, uint32(m_resetTalentsTime));
14628 stmt->SetData(index++, (uint16)m_ExtraFlags);
14629 stmt->SetData(index++, m_petStable ? m_petStable->MaxStabledPets : 0);
14630 stmt->SetData(index++, (uint16)m_atLoginFlags);
14631 stmt->SetData(index++, GetZoneId());
14632 stmt->SetData(index++, uint32(m_deathExpireTime));
14633
14634 ss.str("");
14636
14637 stmt->SetData(index++, ss.str());
14638 stmt->SetData(index++, GetArenaPoints());
14639 stmt->SetData(index++, GetHonorPoints());
14643 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0));
14644 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1));
14648 stmt->SetData(index++, GetDrunkValue());
14649 stmt->SetData(index++, GetHealth());
14650
14651 for (uint32 i = 0; i < MAX_POWERS; ++i)
14652 stmt->SetData(index++, GetPower(Powers(i)));
14653
14654 stmt->SetData(index++, GetSession()->GetLatency());
14655
14656 stmt->SetData(index++, m_specsCount);
14657 stmt->SetData(index++, m_activeSpec);
14658
14659 ss.str("");
14660 for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
14661 ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' ';
14662 stmt->SetData(index++, ss.str());
14663
14664 ss.str("");
14665 // cache equipment...
14666 for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i)
14668
14669 // ...and bags for enum opcode
14671 {
14672 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
14673 ss << item->GetEntry();
14674 else
14675 ss << '0';
14676 ss << " 0 ";
14677 }
14678
14679 stmt->SetData(index++, ss.str());
14680 stmt->SetData(index++, GetUInt32Value(PLAYER_AMMO_ID));
14681
14682 ss.str("");
14683 for (uint32 i = 0; i < KNOWN_TITLES_SIZE * 2; ++i)
14685
14686 stmt->SetData(index++, ss.str());
14687 stmt->SetData(index++, GetByteValue(PLAYER_FIELD_BYTES, 2));
14688 stmt->SetData(index++, m_grantableLevels);
14689 stmt->SetData(index++, _innTriggerId);
14690 }
14691 else
14692 {
14693 // Update query
14694 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER);
14695 stmt->SetData(index++, GetName());
14696 stmt->SetData(index++, getRace(true));
14697 stmt->SetData(index++, getClass());
14698 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
14699 stmt->SetData(index++, GetLevel());
14700 stmt->SetData(index++, GetUInt32Value(PLAYER_XP));
14701 stmt->SetData(index++, GetMoney());
14702 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 0));
14703 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 1));
14704 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 2));
14705 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 3));
14706 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 0));
14707 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 2));
14708 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 3));
14709 stmt->SetData(index++, GetPlayerFlags());
14710
14711 if (!IsBeingTeleported())
14712 {
14714 if (Map* m = FindMap())
14715 if (m->IsDungeon())
14716 {
14717 if (m->IsNonRaidDungeon()) dd = m->GetDifficulty();
14718 else rd = m->GetDifficulty();
14719 }
14720 stmt->SetData(index++, (uint16)GetMapId());
14721 stmt->SetData(index++, (uint32)GetInstanceId());
14722 stmt->SetData(index++, (uint8(dd) | uint8(rd) << 4));
14723 stmt->SetData(index++, finiteAlways(GetPositionX()));
14724 stmt->SetData(index++, finiteAlways(GetPositionY()));
14725 stmt->SetData(index++, finiteAlways(GetPositionZ()));
14726 stmt->SetData(index++, finiteAlways(GetOrientation()));
14727 }
14728 else
14729 {
14730 stmt->SetData(index++, (uint16)GetTeleportDest().GetMapId());
14731 stmt->SetData(index++, (uint32)0);
14732 stmt->SetData(index++, (uint8(GetDungeonDifficulty()) | uint8(GetRaidDifficulty()) << 4));
14733 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionX()));
14734 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionY()));
14735 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionZ()));
14736 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetOrientation()));
14737 }
14738
14739 stmt->SetData(index++, finiteAlways(GetTransOffsetX()));
14740 stmt->SetData(index++, finiteAlways(GetTransOffsetY()));
14741 stmt->SetData(index++, finiteAlways(GetTransOffsetZ()));
14742 stmt->SetData(index++, finiteAlways(GetTransOffsetO()));
14743
14744 int32 lowGuidOrSpawnId = 0;
14745 if (Transport* transport = GetTransport())
14746 {
14747 if (transport->IsMotionTransport())
14748 lowGuidOrSpawnId = static_cast<int32>(transport->GetGUID().GetCounter());
14749 else if (transport->IsStaticTransport())
14750 lowGuidOrSpawnId = -static_cast<int32>(transport->GetSpawnId());
14751 }
14752 stmt->SetData(index++, lowGuidOrSpawnId);
14753
14754 std::ostringstream ss;
14755 ss << m_taxi;
14756 stmt->SetData(index++, ss.str());
14757 stmt->SetData(index++, m_cinematic);
14758 stmt->SetData(index++, m_Played_time[PLAYED_TIME_TOTAL]);
14759 stmt->SetData(index++, m_Played_time[PLAYED_TIME_LEVEL]);
14760 stmt->SetData(index++, finiteAlways(_restBonus));
14761 stmt->SetData(index++, uint32(GameTime::GetGameTime().count()));
14762 stmt->SetData(index++, (HasPlayerFlag(PLAYER_FLAGS_RESTING) ? 1 : 0));
14763 //save, far from tavern/city
14764 //save, but in tavern/city
14765 stmt->SetData(index++, m_resetTalentsCost);
14766 stmt->SetData(index++, uint32(m_resetTalentsTime));
14767 stmt->SetData(index++, (uint16)m_ExtraFlags);
14768 stmt->SetData(index++, m_petStable ? m_petStable->MaxStabledPets : 0);
14769 stmt->SetData(index++, (uint16)m_atLoginFlags);
14770 stmt->SetData(index++, GetZoneId());
14771 stmt->SetData(index++, uint32(m_deathExpireTime));
14772
14773 ss.str("");
14775
14776 stmt->SetData(index++, ss.str());
14777 stmt->SetData(index++, GetArenaPoints());
14778 stmt->SetData(index++, GetHonorPoints());
14782 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0));
14783 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1));
14787 stmt->SetData(index++, GetDrunkValue());
14788 stmt->SetData(index++, GetHealth());
14789
14790 for (uint32 i = 0; i < MAX_POWERS; ++i)
14791 stmt->SetData(index++, GetPower(Powers(i)));
14792
14793 stmt->SetData(index++, GetSession()->GetLatency());
14794
14795 stmt->SetData(index++, m_specsCount);
14796 stmt->SetData(index++, m_activeSpec);
14797
14798 ss.str("");
14799 for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
14800 ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' ';
14801 stmt->SetData(index++, ss.str());
14802
14803 ss.str("");
14804 // cache equipment...
14805 for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i)
14807
14808 // ...and bags for enum opcode
14810 {
14811 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
14812 ss << item->GetEntry();
14813 else
14814 ss << '0';
14815 ss << " 0 ";
14816 }
14817
14818 stmt->SetData(index++, ss.str());
14819 stmt->SetData(index++, GetUInt32Value(PLAYER_AMMO_ID));
14820
14821 ss.str("");
14822 for (uint32 i = 0; i < KNOWN_TITLES_SIZE * 2; ++i)
14824
14825 stmt->SetData(index++, ss.str());
14826 stmt->SetData(index++, GetByteValue(PLAYER_FIELD_BYTES, 2));
14827 stmt->SetData(index++, m_grantableLevels);
14828 stmt->SetData(index++, _innTriggerId);
14829
14830 stmt->SetData(index++, IsInWorld() && !GetSession()->PlayerLogout() ? 1 : 0);
14831 // Index
14832 stmt->SetData(index++, GetGUID().GetCounter());
14833 }
14834
14835 trans->Append(stmt);
14836}
@ CHAR_INS_CHARACTER
Definition: CharacterDatabase.h:271
@ CHAR_UPD_CHARACTER
Definition: CharacterDatabase.h:272
@ 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:554
@ PLAYER_FLAGS_RESTING
Definition: Player.h:480
@ INVENTORY_SLOT_BAG_START
Definition: Player.h:700
#define PLAYER_EXPLORED_ZONES_SIZE
Definition: Player.h:73
Difficulty
Definition: DBCEnums.h:271
Powers
Definition: SharedDefines.h:240
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:586
uint32 GetInstanceId() const
Definition: Object.h:431
float GetTransOffsetY() const
Definition: Object.h:587
float GetTransOffsetZ() const
Definition: Object.h:588
Transport * GetTransport() const
Definition: Object.h:585
float GetTransOffsetO() const
Definition: Object.h:589
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:1872
WorldLocation & GetTeleportDest()
Definition: Player.h:2040
uint32 GetArenaPoints() const
Definition: Player.h:2104
uint8 GetDrunkValue() const
Definition: Player.h:2122
Item * GetItemByPos(uint16 pos) const
Definition: PlayerStorage.cpp:472
uint32 GetHonorPoints() const
Definition: Player.h:2103
PlayerFlags GetPlayerFlags() const
Definition: Player.h:1089
uint32 GetMoney() const
Definition: Player.h:1567
PlayerTaxi m_taxi
Definition: Player.h:1123
bool HasPlayerFlag(PlayerFlags flags) const
Definition: Player.h:1090
Difficulty GetDungeonDifficulty() const
Definition: Player.h:1871
bool IsBeingTeleported() const
Definition: Player.h:2041
std::string SaveTaxiDestinationsToString()
Definition: PlayerTaxi.cpp:193
Definition: Transport.h:29
uint32 GetHealth() const
Definition: Unit.h:1440
uint32 GetPower(Powers power) const
Definition: Unit.h:1461
Definition: Map.h:312
bool PlayerLogout() const
Definition: WorldSession.h:336
uint32 GetLatency() const
Definition: WorldSession.h:500

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_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
7539{
7541 return;
7542
7543 m_DailyQuestChanged = false;
7544
7545 // save last daily quest time for all quests: we need only mostly reset time for reset check anyway
7546
7547 // we don't need transactions here.
7549 stmt->SetData(0, GetGUID().GetCounter());
7550 trans->Append(stmt);
7551 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
7552 {
7553 if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
7554 {
7555 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
7556 stmt->SetData(0, GetGUID().GetCounter());
7557 stmt->SetData(1, GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx));
7559 trans->Append(stmt);
7560 }
7561 }
7562
7563 if (!m_DFQuests.empty())
7564 {
7565 for (DFQuestsDoneList::iterator itr = m_DFQuests.begin(); itr != m_DFQuests.end(); ++itr)
7566 {
7567 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
7568 stmt->SetData(0, GetGUID().GetCounter());
7569 stmt->SetData(1, (*itr));
7571 trans->Append(stmt);
7572 }
7573 }
7574}
@ 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
14482{
14483 // xinef: dont save joinpos with invalid mapid
14484 MapEntry const* mEntry = sMapStore.LookupEntry(m_entryPointData.joinPos.GetMapId());
14485 if (!mEntry)
14486 return;
14487
14489 stmt->SetData(0, GetGUID().GetCounter());
14490 trans->Append(stmt);
14491
14492 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PLAYER_ENTRY_POINT);
14493 stmt->SetData(0, GetGUID().GetCounter());
14499 stmt->SetData(6, m_entryPointData.taxiPath[0]);
14500 stmt->SetData(7, m_entryPointData.taxiPath[1]);
14502 trans->Append(stmt);
14503}
@ 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
14431{
14432 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end();)
14433 {
14434 uint32 index = itr->first;
14435 EquipmentSet& eqset = itr->second;
14436 CharacterDatabasePreparedStatement* stmt = nullptr;
14437 uint8 j = 0;
14438 switch (eqset.state)
14439 {
14441 ++itr;
14442 break; // nothing do
14444 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_EQUIP_SET);
14445 stmt->SetData(j++, eqset.Name.c_str());
14446 stmt->SetData(j++, eqset.IconName.c_str());
14447 stmt->SetData(j++, eqset.IgnoreMask);
14448 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14449 stmt->SetData(j++, eqset.Items[i].GetCounter());
14450 stmt->SetData(j++, GetGUID().GetCounter());
14451 stmt->SetData(j++, eqset.Guid);
14452 stmt->SetData(j, index);
14453 trans->Append(stmt);
14455 ++itr;
14456 break;
14457 case EQUIPMENT_SET_NEW:
14458 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_EQUIP_SET);
14459 stmt->SetData(j++, GetGUID().GetCounter());
14460 stmt->SetData(j++, eqset.Guid);
14461 stmt->SetData(j++, index);
14462 stmt->SetData(j++, eqset.Name.c_str());
14463 stmt->SetData(j++, eqset.IconName.c_str());
14464 stmt->SetData(j++, eqset.IgnoreMask);
14465 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14466 stmt->SetData(j++, eqset.Items[i].GetCounter());
14467 trans->Append(stmt);
14469 ++itr;
14470 break;
14472 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EQUIP_SET);
14473 stmt->SetData(0, eqset.Guid);
14474 trans->Append(stmt);
14475 m_EquipmentSets.erase(itr++);
14476 break;
14477 }
14478 }
14479}
@ CHAR_UPD_EQUIP_SET
Definition: CharacterDatabase.h:192
@ CHAR_INS_EQUIP_SET
Definition: CharacterDatabase.h:193
@ CHAR_DEL_EQUIP_SET
Definition: CharacterDatabase.h:194
@ EQUIPMENT_SET_CHANGED
Definition: Player.h:744
@ EQUIPMENT_SET_DELETED
Definition: Player.h:746
@ EQUIPMENT_SET_NEW
Definition: Player.h:745

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
14862{
14863 if (!NeedToSaveGlyphs())
14864 return;
14865
14867 stmt->SetData(0, GetGUID().GetCounter());
14868 trans->Append(stmt);
14869
14870 for (uint8 spec = 0; spec < m_specsCount; ++spec)
14871 {
14872 uint8 index = 0;
14873
14874 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_GLYPHS);
14875 stmt->SetData(index++, GetGUID().GetCounter());
14876 stmt->SetData(index++, spec);
14877
14878 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
14879 stmt->SetData(index++, uint16(m_Glyphs[spec][i]));
14880
14881 trans->Append(stmt);
14882 }
14883
14884 SetNeedToSaveGlyphs(false);
14885}
@ CHAR_DEL_CHAR_GLYPHS
Definition: CharacterDatabase.h:417
@ CHAR_INS_CHAR_GLYPHS
Definition: CharacterDatabase.h:451
void SetNeedToSaveGlyphs(bool val)
Definition: Player.h:2549
bool NeedToSaveGlyphs()
Definition: Player.h:2548

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
15753{
15754 if (_instanceResetTimes.empty())
15755 return;
15756
15758 stmt->SetData(0, GetSession()->GetAccountId());
15759 trans->Append(stmt);
15760
15761 for (InstanceTimeMap::const_iterator itr = _instanceResetTimes.begin(); itr != _instanceResetTimes.end(); ++itr)
15762 {
15763 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES);
15764 stmt->SetData(0, GetSession()->GetAccountId());
15765 stmt->SetData(1, itr->first);
15766 stmt->SetData(2, (int64)itr->second);
15767 trans->Append(stmt);
15768 }
15769}
std::int64_t int64
Definition: Define.h:103
@ CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES
Definition: CharacterDatabase.h:133
@ CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES
Definition: CharacterDatabase.h:134

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

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(), ItemTemplate::Flags, Item::FSetState(), Item::GetBagSlot(), Item::GetContainer(), ObjectGuid::GetCounter(), Object::GetGUID(), GetItemByGuid(), GetItemByPos(), WorldObject::GetName(), Item::GetSlot(), Item::GetState(), Item::GetTemplate(), 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
7397{
7398 if (!GetMailSize() || !m_mailsUpdated)
7399 {
7400 return;
7401 }
7402
7403 CharacterDatabasePreparedStatement* stmt = nullptr;
7404
7405 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
7406 {
7407 Mail* m = (*itr);
7408 if (m->state == MAIL_STATE_CHANGED)
7409 {
7410 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL);
7411 stmt->SetData(0, uint8(m->HasItems() ? 1 : 0));
7412 stmt->SetData(1, uint32(m->expire_time));
7413 stmt->SetData(2, uint32(m->deliver_time));
7414 stmt->SetData(3, m->money);
7415 stmt->SetData(4, m->COD);
7416 stmt->SetData(5, uint8(m->checked));
7417 stmt->SetData(6, m->messageID);
7418
7419 trans->Append(stmt);
7420
7421 if (!m->removedItems.empty())
7422 {
7423 for (std::vector<uint32>::iterator itr2 = m->removedItems.begin(); itr2 != m->removedItems.end(); ++itr2)
7424 {
7425 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM);
7426 stmt->SetData(0, *itr2);
7427 trans->Append(stmt);
7428 }
7429 m->removedItems.clear();
7430 }
7432 }
7433 else if (m->state == MAIL_STATE_DELETED)
7434 {
7435 if (m->HasItems())
7436 {
7437 for (MailItemInfoVec::iterator itr2 = m->items.begin(); itr2 != m->items.end(); ++itr2)
7438 {
7439 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
7440 stmt->SetData(0, itr2->item_guid);
7441 trans->Append(stmt);
7442 }
7443 }
7444 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
7445 stmt->SetData(0, m->messageID);
7446 trans->Append(stmt);
7447
7448 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
7449 stmt->SetData(0, m->messageID);
7450 trans->Append(stmt);
7451 }
7452 }
7453
7454 //deallocate deleted mails...
7455 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end();)
7456 {
7457 if ((*itr)->state == MAIL_STATE_DELETED)
7458 {
7459 Mail* m = *itr;
7460 m_mail.erase(itr);
7461 delete m;
7462 itr = m_mail.begin();
7463 }
7464 else
7465 ++itr;
7466 }
7467
7468 m_mailsUpdated = false;
7469}
@ CHAR_UPD_MAIL
Definition: CharacterDatabase.h:432
@ CHAR_DEL_MAIL_BY_ID
Definition: CharacterDatabase.h:110
@ CHAR_DEL_MAIL_ITEM_BY_ID
Definition: CharacterDatabase.h:377
@ MAIL_STATE_DELETED
Definition: Mail.h:71
@ MAIL_STATE_CHANGED
Definition: Mail.h:70
uint32 GetMailSize()
Definition: Player.h:1608
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
7634{
7635 if (!m_MonthlyQuestChanged || m_monthlyquests.empty())
7636 return;
7637
7638 // we don't need transactions here.
7640 stmt->SetData(0, GetGUID().GetCounter());
7641 trans->Append(stmt);
7642
7643 for (QuestSet::const_iterator iter = m_monthlyquests.begin(); iter != m_monthlyquests.end(); ++iter)
7644 {
7645 uint32 quest_id = *iter;
7646 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS);
7647 stmt->SetData(0, GetGUID().GetCounter());
7648 stmt->SetData(1, quest_id);
7649 trans->Append(stmt);
7650 }
7651
7652 m_MonthlyQuestChanged = false;
7653}
@ 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:516

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

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
7600{
7602 {
7603 return;
7604 }
7605
7606 // we don't need transactions here.
7608 stmt->SetData(0, GetGUID().GetCounter());
7609 trans->Append(stmt);
7610
7611 m_SeasonalQuestChanged = false;
7612
7613 if (m_seasonalquests.empty())
7614 {
7615 return;
7616 }
7617
7618 for (SeasonalEventQuestMap::const_iterator iter = m_seasonalquests.begin(); iter != m_seasonalquests.end(); ++iter)
7619 {
7620 uint16 eventId = iter->first;
7621
7622 for (SeasonalQuestSet::const_iterator itr = iter->second.begin(); itr != iter->second.end(); ++itr)
7623 {
7624 uint32 questId = *itr;
7625
7626 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS);
7627 stmt->SetArguments(GetGUID().GetCounter(), questId, eventId);
7628 trans->Append(stmt);
7629 }
7630 }
7631}
@ 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)
protected
7656{
7657 CharacterDatabasePreparedStatement* stmt = nullptr;
7658 // we don't need transactions here.
7659 for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end();)
7660 {
7661 if (itr->second.uState == SKILL_UNCHANGED)
7662 {
7663 ++itr;
7664 continue;
7665 }
7666
7667 if (itr->second.uState == SKILL_DELETED)
7668 {
7669 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILL_BY_SKILL);
7670 stmt->SetData(0, GetGUID().GetCounter());
7671 stmt->SetData(1, itr->first);
7672 trans->Append(stmt);
7673
7674 mSkillStatus.erase(itr++);
7675 continue;
7676 }
7677
7678 uint32 valueData = GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos));
7679 uint16 value = SKILL_VALUE(valueData);
7680 uint16 max = SKILL_MAX(valueData);
7681
7682 switch (itr->second.uState)
7683 {
7684 case SKILL_NEW:
7685 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILLS);
7686 stmt->SetData(0, GetGUID().GetCounter());
7687 stmt->SetData(1, uint16(itr->first));
7688 stmt->SetData(2, value);
7689 stmt->SetData(3, max);
7690 trans->Append(stmt);
7691
7692 break;
7693 case SKILL_CHANGED:
7694 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_SKILLS);
7695 stmt->SetData(0, value);
7696 stmt->SetData(1, max);
7697 stmt->SetData(2, GetGUID().GetCounter());
7698 stmt->SetData(3, uint16(itr->first));
7699 trans->Append(stmt);
7700
7701 break;
7702 default:
7703 break;
7704 }
7705 itr->second.uState = SKILL_UNCHANGED;
7706
7707 ++itr;
7708 }
7709}
@ CHAR_INS_CHAR_SKILLS
Definition: CharacterDatabase.h:441
@ CHAR_UDP_CHAR_SKILLS
Definition: CharacterDatabase.h:442
@ CHAR_DEL_CHAR_SKILL_BY_SKILL
Definition: CharacterDatabase.h:440
#define SKILL_MAX(x)
Definition: Player.h:84
#define SKILL_VALUE(x)
Definition: Player.h:83
@ SKILL_DELETED
Definition: Player.h:643
@ SKILL_CHANGED
Definition: Player.h:641
@ SKILL_NEW
Definition: Player.h:642

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 
)
3563{
3565 stmt->SetData(0, GetGUID().GetCounter());
3566 trans->Append(stmt);
3567
3568 time_t curTime = GameTime::GetGameTime().count();
3569 uint32 curMSTime = GameTime::GetGameTimeMS().count();
3570 uint32 infTime = curMSTime + infinityCooldownDelayCheck;
3571
3572 bool first_round = true;
3573 std::ostringstream ss;
3574
3575 // remove outdated and save active
3576 for (SpellCooldowns::iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end();)
3577 {
3578 // Xinef: dummy cooldown for procs
3579 if (itr->first == uint32(-1))
3580 {
3581 ++itr;
3582 continue;
3583 }
3584
3585 if (itr->second.end <= curMSTime + 1000)
3586 m_spellCooldowns.erase(itr++);
3587 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
3588 {
3589 if (first_round)
3590 {
3591 ss << "INSERT INTO character_spell_cooldown (guid, spell, category, item, time, needSend) VALUES ";
3592 first_round = false;
3593 }
3594 // next new/changed record prefix
3595 else
3596 ss << ',';
3597
3598 uint64 cooldown = uint64(((itr->second.end - curMSTime) / IN_MILLISECONDS) + curTime);
3599 ss << '(' << GetGUID().GetCounter() << ',' << itr->first << ',' << itr->second.category << "," << itr->second.itemid << ',' << cooldown << ',' << (itr->second.needSendToClient ? '1' : '0') << ')';
3600 ++itr;
3601 }
3602 else
3603 ++itr;
3604 }
3605 // if something changed execute
3606 if (!first_round)
3607 trans->Append(ss.str().c_str());
3608}
@ CHAR_DEL_CHAR_SPELL_COOLDOWN
Definition: CharacterDatabase.h:401
static constexpr uint32 infinityCooldownDelayCheck
Definition: Unit.h:155

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

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
7759{
7760 // check if stat saving is enabled and if char level is high enough
7761 if (!sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE) || GetLevel() < sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE))
7762 return;
7763
7764 CharacterDatabasePreparedStatement* stmt = nullptr;
7765
7766 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_STATS);
7767 stmt->SetData(0, GetGUID().GetCounter());
7768 trans->Append(stmt);
7769
7770 uint8 index = 0;
7771
7772 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_STATS);
7773 stmt->SetData(index++, GetGUID().GetCounter());
7774 stmt->SetData(index++, GetMaxHealth());
7775
7776 for (uint8 i = 0; i < MAX_POWERS; ++i)
7777 stmt->SetData(index++, GetMaxPower(Powers(i)));
7778
7779 for (uint8 i = 0; i < MAX_STATS; ++i)
7780 stmt->SetData(index++, GetStat(Stats(i)));
7781
7782 for (int i = 0; i < MAX_SPELL_SCHOOL; ++i)
7783 stmt->SetData(index++, GetResistance(SpellSchools(i)));
7784
7793 stmt->SetData(index++, GetBaseSpellPowerBonus());
7795
7796 trans->Append(stmt);
7797}
@ CHAR_DEL_CHAR_STATS
Definition: CharacterDatabase.h:444
@ CHAR_INS_CHAR_STATS
Definition: CharacterDatabase.h:445
@ 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:344
#define MAX_STATS
Definition: SharedDefines.h:237
SpellSchools
Definition: SharedDefines.h:254
constexpr auto MAX_SPELL_SCHOOL
Definition: SharedDefines.h:264
Stats
Definition: SharedDefines.h:229
float GetFloatValue(uint16 index) const
Definition: Object.cpp:317
uint32 GetBaseSpellPowerBonus()
Definition: Player.h:1921
uint32 GetResistance(SpellSchools school) const
Definition: Unit.h:1435
uint32 GetMaxHealth() const
Definition: Unit.h:1441
uint32 GetMaxPower(Powers power) const
Definition: Unit.h:1462
float GetStat(Stats stat) const
Definition: Unit.h:1430

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
14909{
14910 CharacterDatabasePreparedStatement* stmt = nullptr;
14911
14912 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end();)
14913 {
14914 // xinef: skip temporary spells
14915 if (itr->second->State == PLAYERSPELL_TEMPORARY)
14916 {
14917 ++itr;
14918 continue;
14919 }
14920
14921 // xinef: delete statement for removed / updated talent
14922 if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
14923 {
14924 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL);
14925 stmt->SetData(0, GetGUID().GetCounter());
14926 stmt->SetData(1, itr->first);
14927 trans->Append(stmt);
14928 }
14929
14930 // xinef: insert statement for new / updated spell
14931 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
14932 {
14933 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_TALENT);
14934 stmt->SetData(0, GetGUID().GetCounter());
14935 stmt->SetData(1, itr->first);
14936 stmt->SetData(2, itr->second->specMask);
14937 trans->Append(stmt);
14938 }
14939
14940 if (itr->second->State == PLAYERSPELL_REMOVED)
14941 {
14942 delete itr->second;
14943 m_talents.erase(itr++);
14944 }
14945 else
14946 {
14947 itr->second->State = PLAYERSPELL_UNCHANGED;
14948 ++itr;
14949 }
14950 }
14951}
@ CHAR_INS_CHAR_TALENT
Definition: CharacterDatabase.h:453
@ CHAR_DEL_CHAR_TALENT_BY_SPELL
Definition: CharacterDatabase.h:452

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
7577{
7578 if (!m_WeeklyQuestChanged || m_weeklyquests.empty())
7579 return;
7580
7581 // we don't need transactions here.
7583 stmt->SetData(0, GetGUID().GetCounter());
7584 trans->Append(stmt);
7585
7586 for (QuestSet::const_iterator iter = m_weeklyquests.begin(); iter != m_weeklyquests.end(); ++iter)
7587 {
7588 uint32 quest_id = *iter;
7589
7590 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS);
7591 stmt->SetData(0, GetGUID().GetCounter());
7592 stmt->SetData(1, quest_id);
7593 trans->Append(stmt);
7594 }
7595
7596 m_WeeklyQuestChanged = false;
7597}
@ 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
2638{
2639 if (!pItem)
2640 return nullptr;
2641
2642 uint8 bag = pos >> 8;
2643 uint8 slot = pos & 255;
2644
2645 LOG_DEBUG("entities.player.items", "STORAGE: StoreItem bag = {}, slot = {}, item = {}, count = {}, {}", bag, slot, pItem->GetEntry(), count, pItem->GetGUID().ToString());
2646
2647 Item* pItem2 = GetItemByPos(bag, slot);
2648
2649 if (!pItem2)
2650 {
2651 if (clone)
2652 pItem = pItem->CloneItem(count, this);
2653 else
2654 pItem->SetCount(count);
2655
2656 if (!pItem)
2657 return nullptr;
2658
2659 if (pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP ||
2660 pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM ||
2661 (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPED && IsBagPos(pos)))
2662 pItem->SetBinding(true);
2663
2664 Bag* pBag = (bag == INVENTORY_SLOT_BAG_0) ? nullptr : GetBagByPos(bag);
2665 if (!pBag)
2666 {
2667 m_items[slot] = pItem;
2668 SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID());
2671
2672 pItem->SetSlot(slot);
2673 pItem->SetContainer(nullptr);
2674
2675 // need update known currency
2677 AddKnownCurrency(pItem->GetEntry());
2678 }
2679 else
2680 pBag->StoreItem(slot, pItem, update);
2681
2682 if (IsInWorld() && update)
2683 {
2684 pItem->AddToWorld();
2685 pItem->SendUpdateToPlayer(this);
2686 }
2687
2688 pItem->SetState(ITEM_CHANGED, this);
2689 if (pBag)
2690 pBag->SetState(ITEM_CHANGED, this);
2691
2693 AddItemDurations(pItem);
2694
2695 return pItem;
2696 }
2697 else
2698 {
2699 if (pItem2->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP ||
2700 pItem2->GetTemplate()->Bonding == BIND_QUEST_ITEM ||
2701 (pItem2->GetTemplate()->Bonding == BIND_WHEN_EQUIPED && IsBagPos(pos)))
2702 pItem2->SetBinding(true);
2703
2704 pItem2->SetCount(pItem2->GetCount() + count);
2705 if (IsInWorld() && update)
2706 pItem2->SendUpdateToPlayer(this);
2707
2708 if (!clone)
2709 {
2710 // delete item (it not in any slot currently)
2711 if (IsInWorld() && update)
2712 {
2713 pItem->RemoveFromWorld();
2714 pItem->DestroyForPlayer(this);
2715 }
2716
2718 RemoveItemDurations(pItem);
2719
2720 pItem->SetOwnerGUID(GetGUID()); // prevent error at next SetState in case trade/mail/buy from vendor
2721 pItem->SetNotRefundable(this);
2722 pItem->ClearSoulboundTradeable(this);
2723 RemoveTradeableItem(pItem);
2724 pItem->SetState(ITEM_REMOVED, this);
2725 }
2726
2728
2729 pItem2->SetState(ITEM_CHANGED, this);
2730
2731 return pItem2;
2732 }
2733}
@ BIND_WHEN_EQUIPED
Definition: ItemTemplate.h:98
@ BIND_QUEST_ITEM
Definition: ItemTemplate.h:100
@ BIND_WHEN_PICKED_UP
Definition: ItemTemplate.h:97
@ PLAYER_FIELD_INV_SLOT_HEAD
Definition: UpdateFields.h:327
@ ITEM_FIELD_OWNER
Definition: UpdateFields.h:35
@ ITEM_FIELD_CONTAINED
Definition: UpdateFields.h:36
@ CURRENCYTOKEN_SLOT_END
Definition: Player.h:738
@ CURRENCYTOKEN_SLOT_START
Definition: Player.h:737
void StoreItem(uint8 slot, Item *pItem, bool update)
Definition: Bag.cpp:154
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
Definition: Item.cpp:716
void SetBinding(bool val)
Definition: Item.h:229
Item * CloneItem(uint32 count, Player const *player=nullptr) const
Definition: Item.cpp:1120
void SetCount(uint32 value)
Definition: Item.h:264
void SetNotRefundable(Player *owner, bool changestate=true, CharacterDatabaseTransaction *trans=nullptr)
Definition: Item.cpp:1202
void SetSlot(uint8 slot)
Definition: Item.h:275
uint32 GetCount() const
Definition: Item.h:263
void SetOwnerGUID(ObjectGuid guid)
Definition: Item.h:226
void SetContainer(Bag *container)
Definition: Item.h:277
uint32 Bonding
Definition: ItemTemplate.h:672
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:488
void AddEnchantmentDurations(Item *item)
Definition: PlayerStorage.cpp:4214
void RemoveEnchantmentDurations(Item *item)
Definition: PlayerStorage.cpp:4227
void AddItemDurations(Item *item)
Definition: Player.cpp:12355
void AddKnownCurrency(uint32 itemId)
Definition: Player.cpp:14094

References AddEnchantmentDurations(), AddItemDurations(), AddKnownCurrency(), Object::AddToWorld(), BIND_QUEST_ITEM, BIND_WHEN_EQUIPED, 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
10541{
10542 ItemPosCountVec vDest;
10543 uint16 uiDest = 0;
10544 InventoryResult msg = bStore ?
10545 CanStoreNewItem(bag, slot, vDest, item, pProto->BuyCount * count) :
10546 CanEquipNewItem(slot, uiDest, item, false);
10547 if (msg != EQUIP_ERR_OK)
10548 {
10549 SendEquipError(msg, nullptr, nullptr, item);
10550 return false;
10551 }
10552
10553 ModifyMoney(-price);
10554
10555 if (crItem->ExtendedCost) // case for new honor system
10556 {
10557 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost);
10558 if (iece->reqhonorpoints)
10559 ModifyHonorPoints(- int32(iece->reqhonorpoints * count));
10560
10561 if (iece->reqarenapoints)
10562 ModifyArenaPoints(- int32(iece->reqarenapoints * count));
10563
10564 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
10565 {
10566 if (iece->reqitem[i])
10567 DestroyItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count), true);
10568 }
10569 }
10570
10571 sScriptMgr->OnBeforeStoreOrEquipNewItem(this, vendorslot, item, count, bag, slot, pProto, pVendor, crItem, bStore);
10572
10573 Item* it = bStore ? StoreNewItem(vDest, item, true) : EquipNewItem(uiDest, item, true);
10574 if (it)
10575 {
10576 uint32 new_count = pVendor->UpdateVendorItemCurrentCount(crItem, pProto->BuyCount * count);
10577
10578 WorldPacket data(SMSG_BUY_ITEM, (8 + 4 + 4 + 4));
10579 data << pVendor->GetGUID();
10580 data << uint32(vendorslot + 1); // numbered from 1 at client
10581 data << int32(crItem->maxcount > 0 ? new_count : 0xFFFFFFFF);
10582 data << uint32(count);
10583 GetSession()->SendPacket(&data);
10584 SendNewItem(it, pProto->BuyCount * count, true, false, false);
10585
10586 if (!bStore)
10588
10589 if (pProto->Flags & ITEM_FLAG_ITEM_PURCHASE_RECORD && crItem->ExtendedCost && pProto->GetMaxStackSize() == 1)
10590 {
10592 it->SetRefundRecipient(GetGUID().GetCounter());
10593 it->SetPaidMoney(price);
10594 it->SetPaidExtendedCost(crItem->ExtendedCost);
10595 it->SaveRefundDataToDB();
10597 }
10598 }
10599
10600 sScriptMgr->OnAfterStoreOrEquipNewItem(this, vendorslot, it, count, bag, slot, pProto, pVendor, crItem, bStore);
10601
10602 return true;
10603}
DBCStorage< ItemExtendedCostEntry > sItemExtendedCostStore(ItemExtendedCostEntryfmt)
InventoryResult
Definition: Item.h:40
@ ITEM_FLAG_ITEM_PURCHASE_RECORD
Definition: ItemTemplate.h:160
#define MAX_ITEM_EXTENDED_COST_REQUIREMENTS
Definition: DBCStructure.h:1161
@ SMSG_BUY_ITEM
Definition: Opcodes.h:450
uint32 UpdateVendorItemCurrentCount(VendorItem const *vItem, uint32 used_count)
Definition: Creature.cpp:2996
void SaveRefundDataToDB()
Definition: Item.cpp:1174
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:845
InventoryResult CanEquipNewItem(uint8 slot, uint16 &dest, uint32 item, bool swap) const
Definition: PlayerStorage.cpp:1825
bool ModifyMoney(int32 amount, bool sendError=true)
Definition: Player.cpp:11409
Item * EquipNewItem(uint16 pos, uint32 item, bool update)
Definition: PlayerStorage.cpp:2735
void SendNewItem(Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
Definition: PlayerStorage.cpp:4776
void AutoUnequipOffhandIfNeed(bool force=false)
Definition: Player.cpp:12364
void DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
Definition: PlayerStorage.cpp:3149
void ModifyHonorPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
Definition: Player.cpp:6170
void ModifyArenaPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
If trans is specified, honor save query will be added to trans.
Definition: Player.cpp:6186
Item * StoreNewItem(ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0)
Definition: PlayerStorage.cpp:2552
void SendEquipError(InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0)
Definition: PlayerStorage.cpp:4049
InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
Definition: Player.h:1248
Definition: WorldPacket.h:27
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition: WorldSession.cpp:207
Definition: DBCStructure.h:1164
uint32 reqarenapoints
Definition: DBCStructure.h:1167
uint32 reqitemcount[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition: DBCStructure.h:1170
uint32 reqitem[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition: DBCStructure.h:1169
uint32 reqhonorpoints
Definition: DBCStructure.h:1166

References AddRefundReference(), AutoUnequipOffhandIfNeed(), ItemTemplate::BuyCount, CanEquipNewItem(), CanStoreNewItem(), DestroyItemCount(), EQUIP_ERR_OK, EquipNewItem(), VendorItem::ExtendedCost, ItemTemplate::Flags, Object::GetGUID(), ItemTemplate::GetMaxStackSize(), GetSession(), 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)
928{
929 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
930 {
931 // It will Destroy quest items on quests abandons.
932 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
933 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
934 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
935 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
936
937 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
938 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
939 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
940 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
941 }
942}
#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)
14954{
14955 // xinef: some basic checks
14956 if (GetActiveSpec() == spec)
14957 return;
14958
14959 if (spec > GetSpecsCount())
14960 return;
14961
14962 // xinef: interrupt currently casted spell just in case
14963 if (IsNonMeleeSpellCast(false))
14965
14966 // xinef: save current actions order
14967 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
14968 _SaveActions(trans);
14969 CharacterDatabase.CommitTransaction(trans);
14970
14971 // xinef: remove pet, it will be resummoned later
14972 if (Pet* pet = GetPet())
14974
14975 // xinef: remove other summoned units and clear reactives
14979
14980 // xinef: let client clear his current Actions
14982 uint8 oldSpec = GetActiveSpec();
14983
14984 std::unordered_set<uint32> removedSpecAuras;
14985
14986 // xinef: reset talent auras
14987 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
14988 {
14989 if (itr->second->State == PLAYERSPELL_REMOVED)
14990 continue;
14991
14992 // xinef: remove all active talent auras
14993 if (!(itr->second->specMask & GetActiveSpecMask()))
14994 continue;
14995
14996 _removeTalentAurasAndSpells(itr->first);
14997
14998 // pussywizard: was => isn't
14999 if (!itr->second->IsInSpec(spec) && !itr->second->inSpellBook)
15000 SendLearnPacket(itr->first, false);
15001
15002 removedSpecAuras.insert(itr->first);
15003 }
15004
15005 // xinef: remove glyph auras
15006 for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
15007 if (uint32 glyphId = m_Glyphs[GetActiveSpec()][slot])
15008 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyphId))
15009 {
15010 RemoveAurasDueToSpell(glyphEntry->SpellId);
15011 removedSpecAuras.insert(glyphEntry->SpellId);
15012 }
15013
15014 // xinef: set active spec as new one
15015 SetActiveSpec(spec);
15016 uint32 spentTalents = 0;
15017
15018 // xinef: add talent auras
15019 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
15020 {
15021 if (itr->second->State == PLAYERSPELL_REMOVED)
15022 continue;
15023
15024 // xinef: talent not in new spec
15025 if (!(itr->second->specMask & GetActiveSpecMask()))
15026 continue;
15027
15028 // pussywizard: wasn't => is
15029 if (!itr->second->IsInSpec(oldSpec) && !itr->second->inSpellBook)
15030 SendLearnPacket(itr->first, true);
15031
15032 _addTalentAurasAndSpells(itr->first);
15033 TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first);
15034 spentTalents += talentPos->rank + 1;
15035
15036 removedSpecAuras.erase(itr->first);
15037 }
15038
15039 // 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)
15040 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
15041 {
15042 if (!itr->second->Active || itr->second->State == PLAYERSPELL_REMOVED)
15043 continue;
15044
15045 // pussywizard: was => isn't
15046 if (itr->second->IsInSpec(oldSpec) && !itr->second->IsInSpec(spec))
15047 {
15048 SendLearnPacket(itr->first, false);
15049 // We want to remove all auras of the unlearned spell
15050 _removeTalentAurasAndSpells(itr->first);
15051
15052 removedSpecAuras.insert(itr->first);
15053 }
15054 // pussywizard: wasn't => is
15055 else if (!itr->second->IsInSpec(oldSpec) && itr->second->IsInSpec(spec))
15056 {
15057 SendLearnPacket(itr->first, true);
15058
15059 removedSpecAuras.erase(itr->first);
15060 }
15061 }
15062
15063 // xinef: apply glyphs from second spec
15064 if (GetActiveSpec() != oldSpec)
15065 {
15066 for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
15067 {
15068 uint32 glyphId = m_Glyphs[GetActiveSpec()][slot];
15069 if (glyphId)
15070 {
15071 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyphId))
15072 {
15074 removedSpecAuras.erase(glyphEntry->SpellId);
15075 }
15076 }
15077
15078 SetGlyph(slot, glyphId, true);
15079 }
15080 }
15081
15082 // Remove auras triggered/activated by talents/glyphs
15083 // Mostly explicit casts in dummy aura scripts
15084 if (!removedSpecAuras.empty())
15085 {
15086 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
15087 {
15088 Aura* aura = iter->second;
15089 if (SpellInfo const* triggeredByAuraSpellInfo = aura->GetTriggeredByAuraSpellInfo())
15090 {
15091 if (removedSpecAuras.find(triggeredByAuraSpellInfo->Id) != removedSpecAuras.end())
15092 {
15093 RemoveOwnedAura(iter);
15094 continue;
15095 }
15096 }
15097 ++iter;
15098 }
15099 }
15100
15101 m_usedTalentCount = spentTalents;
15103
15104 // load them asynchronously
15105 {
15107 stmt->SetData(0, GetGUID().GetCounter());
15108 stmt->SetData(1, m_activeSpec);
15109
15110 WorldSession* mySess = GetSession();
15111 mySess->GetQueryProcessor().AddCallback(CharacterDatabase.AsyncQuery(stmt)
15112 .WithPreparedCallback([mySess](PreparedQueryResult result)
15113 {
15114 // safe callback, we can't pass this pointer directly
15115 // in case player logs out before db response (player would be deleted in that case)
15116 if (Player* thisPlayer = mySess->GetPlayer())
15117 thisPlayer->LoadActions(result);
15118 }));
15119 }
15120
15121 // xinef: reset power
15122 Powers pw = getPowerType();
15123 if (pw != POWER_MANA)
15124 SetPower(POWER_MANA, 0); // Mana must be 0 even if it isn't the active power type.
15125 SetPower(pw, 0);
15126
15127 // xinef: remove titan grip if player had it set and does not have appropriate talent
15128 if (!HasTalent(46917, GetActiveSpec()) && m_canTitanGrip)
15129 SetCanTitanGrip(false);
15130 // xinef: remove dual wield if player does not have dual wield spell (shamans)
15131 if (!HasSpell(674) && m_canDualWield)
15132 SetCanDualWield(false);
15133
15135
15136 // Xinef: Patch 3.2.0: Switching spec removes paladins spell Righteous Fury (25780)
15137 if (getClass() == CLASS_PALADIN)
15138 RemoveAurasDueToSpell(25780);
15139
15140 // Xinef: Remove talented single target auras at other targets
15141 AuraList& scAuras = GetSingleCastAuras();
15142 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
15143 {
15144 Aura* aura = *iter;
15145 if (!HasActiveSpell(aura->GetId()) && !HasTalent(aura->GetId(), GetActiveSpec()) && !aura->GetCastItemGUID())
15146 {
15147 aura->Remove();
15148 iter = scAuras.begin();
15149 }
15150 else
15151 ++iter;
15152 }
15153}
@ CHAR_SEL_CHARACTER_ACTIONS_SPEC
Definition: CharacterDatabase.h:81
@ POWER_MANA
Definition: SharedDefines.h:241
@ CLASS_PALADIN
Definition: SharedDefines.h:114
T & AddCallback(T &&query)
Definition: AsyncCallbackProcessor.h:35
Definition: Pet.h:40
void InitTalentForLevel()
Definition: Player.cpp:2520
void SetCanTitanGrip(bool value)
Definition: Player.cpp:13036
void SetActiveSpec(uint8 spec)
Definition: Player.h:1696
Pet * GetPet() const
Definition: Player.cpp:8784
bool HasTalent(uint32 spell_id, uint8 spec) const
Definition: Player.cpp:3824
void RemovePet(Pet *pet, PetSaveMode mode, bool returnreagent=false)
Definition: Player.cpp:8935
void _SaveActions(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7152
uint8 GetSpecsCount() const
Definition: Player.h:1697
bool HasSpell(uint32 spell) const override
Definition: Player.cpp:3818
void SendActionButtons(uint32 state) const
Definition: Player.cpp:5455
void _addTalentAurasAndSpells(uint32 spellId)
Definition: Player.cpp:2961
virtual void SetCanDualWield(bool value)
Definition: Unit.h:1346
std::list< Aura * > AuraList
Definition: Unit.h:1307
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4069
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition: Unit.cpp:15458
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition: Unit.cpp:4039
void ClearAllReactives()
Definition: Unit.cpp:17098
void UnsummonAllTotems(bool onDeath=false)
Definition: Unit.cpp:11160
bool m_canDualWield
Definition: Unit.h:1356
Powers getPowerType() const
Definition: Unit.h:1459
AuraList & GetSingleCastAuras()
Definition: Unit.h:1968
void RemoveAllControlled(bool onDeath=false)
Definition: Unit.cpp:11041
Player session in the World.
Definition: WorldSession.h:330
QueryCallbackProcessor & GetQueryProcessor()
Definition: WorldSession.h:1075
uint32 GetId() const
Definition: SpellAuras.cpp:466
ObjectGuid GetCastItemGUID() const
Definition: SpellAuras.h:103
SpellInfo const * GetTriggeredByAuraSpellInfo() const
Definition: SpellAuras.cpp:2765
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_PALADIN, Unit::ClearAllReactives(), GetActiveSpec(), GetActiveSpecMask(), Aura::GetCastItemGUID(), Unit::getClass(), Object::GetGUID(), Aura::GetId(), GetPet(), Unit::getPowerType(), WorldSession::GetQueryProcessor(), GetSession(), Unit::GetSingleCastAuras(), GetSpecsCount(), GetTalentSpellPos(), Aura::GetTriggeredByAuraSpellInfo(), HasActiveSpell(), HasSpell(), HasTalent(), InitTalentForLevel(), Unit::InterruptNonMeleeSpells(), 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, TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_CASTER_AURASTATE, TRIGGERED_IGNORE_SHAPESHIFT, and Unit::UnsummonAllTotems().

Referenced by Spell::EffectActivateSpec(), and UpdateSpecCount().

◆ ActivateTaxiPathTo() [1/2]

bool Player::ActivateTaxiPathTo ( std::vector< uint32 > const &  nodes,
Creature npc = nullptr,
uint32  spellid = 1 
)
10129{
10130 if (nodes.size() < 2)
10131 return false;
10132
10133 // not let cheating with start flight in time of logout process || while in combat || has type state: stunned || has type state: root
10135 {
10137 return false;
10138 }
10139
10141 return false;
10142
10143 // taximaster case
10144 if (npc)
10145 {
10146 // not let cheating with start flight mounted
10147 if (IsMounted())
10148 {
10150 return false;
10151 }
10152
10154 {
10156 return false;
10157 }
10158
10159 // 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
10160 if (IsNonMeleeSpellCast(false))
10161 {
10163 return false;
10164 }
10165 }
10166 // cast case or scripted call case
10167 else
10168 {
10170
10173
10175 if (spell->m_spellInfo->Id != spellid)
10177
10179
10181 if (spell->m_spellInfo->Id != spellid)
10183 }
10184
10185 uint32 sourcenode = nodes[0];
10186
10187 // starting node too far away (cheat?)
10188 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(sourcenode);
10189 if (!node)
10190 {
10192 return false;
10193 }
10194
10195 // Prepare to flight start now
10196
10197 // stop combat at start taxi flight if any
10198 CombatStop();
10199
10202 ExitVehicle();
10203
10204 // stop trade (client cancel trade at taxi map open but cheating tools can be used for reopen it)
10205 TradeCancel(true);
10206
10207 // clean not finished taxi path if any
10209
10210 // 0 element current node
10211 m_taxi.AddTaxiDestination(sourcenode);
10212
10213 // fill destinations path tail
10214 uint32 sourcepath = 0;
10215 uint32 totalcost = 0;
10216 uint32 firstcost = 0;
10217
10218 uint32 prevnode = sourcenode;
10219 uint32 lastnode = 0;
10220
10221 for (uint32 i = 1; i < nodes.size(); ++i)
10222 {
10223 uint32 path, cost;
10224
10225 lastnode = nodes[i];
10226 sObjectMgr->GetTaxiPath(prevnode, lastnode, path, cost);
10227
10228 if (!path)
10229 {
10231 return false;
10232 }
10233
10234 totalcost += cost;
10235 if (i == 1)
10236 firstcost = cost;
10237
10238 if (prevnode == sourcenode)
10239 sourcepath = path;
10240
10241 m_taxi.AddTaxiDestination(lastnode);
10242
10243 prevnode = lastnode;
10244 }
10245
10246 // get mount model (in case non taximaster (npc == nullptr) allow more wide lookup)
10247 //
10248 // Hack-Fix for Alliance not being able to use Acherus taxi. There is
10249 // only one mount ID for both sides. Probably not good to use 315 in case DBC nodes
10250 // change but I couldn't find a suitable alternative. OK to use class because only DK
10251 // can use this taxi.
10252 uint32 mount_display_id = sObjectMgr->GetTaxiMountDisplayId(sourcenode, GetTeamId(true), npc == nullptr || (sourcenode == 315 && getClass() == CLASS_DEATH_KNIGHT));
10253
10254 // in spell case allow 0 model
10255 if ((mount_display_id == 0 && spellid == 0) || sourcepath == 0)
10256 {
10259 return false;
10260 }
10261
10262 uint32 money = GetMoney();
10263
10264 if (npc)
10265 {
10266 float discount = GetReputationPriceDiscount(npc);
10267 totalcost = uint32(ceil(totalcost * discount));
10268 firstcost = uint32(ceil(firstcost * discount));
10270 }
10271 else
10272 {
10274 }
10275
10276 if (money < totalcost)
10277 {
10280 return false;
10281 }
10282
10283 //Checks and preparations done, DO FLIGHT
10285
10286 // prevent stealth flight
10287 //RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK);
10288
10289 // Xinef: dont use instant flight paths if spellid is present (custom calls use spellid = 1)
10290 if ((sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 1 || (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && m_isInstantFlightOn)) && !spellid)
10291 {
10292 TaxiNodesEntry const* lastPathNode = sTaxiNodesStore.LookupEntry(nodes[nodes.size() - 1]);
10294 ModifyMoney(-(int32)totalcost);
10296 TeleportTo(lastPathNode->map_id, lastPathNode->x, lastPathNode->y, lastPathNode->z, GetOrientation());
10297 return false;
10298 }
10299 else
10300 {
10301 m_flightSpellActivated = spellid;
10302 ModifyMoney(-(int32)firstcost);
10305 GetSession()->SendDoFlight(mount_display_id, sourcepath);
10306 }
10307 return true;
10308}
npc
Definition: BattlegroundSA.h:75
DBCStorage< TaxiNodesEntry > sTaxiNodesStore(TaxiNodesEntryfmt)
@ CURRENT_CHANNELED_SPELL
Definition: Unit.h:980
@ CURRENT_GENERIC_SPELL
Definition: Unit.h:979
@ CURRENT_AUTOREPEAT_SPELL
Definition: Unit.h:981
@ UNIT_STATE_ROOT
Definition: Unit.h:335
@ UNIT_STATE_STUNNED
Definition: Unit.h:328
@ UNIT_FLAG_DISABLE_MOVE
Definition: Unit.h:450
@ SPELL_AURA_MOD_SHAPESHIFT
Definition: SpellAuraDefines.h:99
@ CONFIG_INSTANT_TAXI
Definition: IWorld.h:378
@ ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN
Definition: DBCEnums.h:221
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING
Definition: DBCEnums.h:182
@ CLASS_DEATH_KNIGHT
Definition: SharedDefines.h:118
@ ERR_TAXIPLAYERBUSY
Definition: SharedDefines.h:3574
@ ERR_TAXIOK
Definition: SharedDefines.h:3567
@ ERR_TAXINOSUCHPATH
Definition: SharedDefines.h:3569
@ ERR_TAXIUNSPECIFIEDSERVERERROR
Definition: SharedDefines.h:3568
@ ERR_TAXIPLAYERSHAPESHIFTED
Definition: SharedDefines.h:3576
@ ERR_TAXIPLAYERALREADYMOUNTED
Definition: SharedDefines.h:3575
@ ERR_TAXINOTENOUGHMONEY
Definition: SharedDefines.h:3570
TeamId GetTeamId(bool original=false) const
Definition: Player.h:2059
float GetReputationPriceDiscount(Creature const *creature) const
Definition: Player.cpp:12237
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition: Player.cpp:1311
void TradeCancel(bool sendback)
Definition: PlayerStorage.cpp:4116
void StopCastingCharm(Aura *except=nullptr)
Definition: Player.cpp:9186
void StopCastingBindSight(Aura *except=nullptr)
Definition: Player.cpp:13049
void AddTaxiDestination(uint32 dest)
Definition: PlayerTaxi.h:63
void SetFlightMasterFactionTemplateId(uint32 factionTemplateId)
Definition: PlayerTaxi.h:76
void ClearTaxiDestinations()
Definition: PlayerTaxi.h:62
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4002
void CombatStop(bool includingCast=false)
Definition: Unit.cpp:10401
bool IsInDisallowedMountForm() const
Definition: Unit.cpp:21407
bool HasUnitFlag(UnitFlags flags) const
Definition: Unit.h:1480
bool IsMounted() const
Definition: Unit.h:1542
bool HasUnitState(const uint32 f) const
Definition: Unit.h:1398
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition: Unit.cpp:5025
bool IsInCombat() const
Definition: Unit.h:1688
void ExitVehicle(Position const *exitPosition=nullptr)
Definition: Unit.cpp:19896
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition: Unit.h:2061
void SendActivateTaxiReply(ActivateTaxiReply reply)
Definition: TaxiHandler.cpp:294
void SendDoFlight(uint32 mountDisplayId, uint32 path, uint32 pathNode=0)
Definition: TaxiHandler.cpp:114
Definition: Spell.h:284
Definition: DBCStructure.h:1929
float z
Definition: DBCStructure.h:1934
uint32 map_id
Definition: DBCStructure.h:1931
float x
Definition: DBCStructure.h:1932
float y
Definition: DBCStructure.h:1933

References ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, PlayerTaxi::AddTaxiDestination(), 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::getClass(), Unit::GetCurrentSpell(), GetMoney(), Position::GetOrientation(), GetReputationPriceDiscount(), GetSession(), GetTeamId(), Unit::HasUnitFlag(), Unit::HasUnitState(), Unit::InterruptSpell(), 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(), Spell::EffectSendTaxi(), 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 
)
10311{
10312 TaxiPathEntry const* entry = sTaxiPathStore.LookupEntry(taxi_path_id);
10313 if (!entry)
10314 return false;
10315
10316 std::vector<uint32> nodes;
10317
10318 nodes.resize(2);
10319 nodes[0] = entry->from;
10320 nodes[1] = entry->to;
10321
10322 return ActivateTaxiPathTo(nodes, nullptr, spellid);
10323}
DBCStorage< TaxiPathEntry > sTaxiPathStore(TaxiPathEntryfmt)
bool ActivateTaxiPathTo(std::vector< uint32 > const &nodes, Creature *npc=nullptr, uint32 spellid=1)
Definition: Player.cpp:10128
Definition: DBCStructure.h:1941
uint32 to
Definition: DBCStructure.h:1944
uint32 from
Definition: DBCStructure.h:1943

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

◆ addActionButton()

ActionButton * Player::addActionButton ( uint8  button,
uint32  action,
uint8  type 
)
5527{
5528 if (!IsActionButtonDataValid(button, action, type))
5529 return nullptr;
5530
5531 // it create new button (NEW state) if need or return existed
5532 ActionButton& ab = m_actionButtons[button];
5533
5534 // set data and update to CHANGED if not NEW
5535 ab.SetActionAndType(action, ActionButtonType(type));
5536
5537 LOG_DEBUG("entities.player", "Player {} Added Action {} (type {}) to Button {}", GetGUID().ToString(), action, type, button);
5538 return &ab;
5539}
ActionButtonType
Definition: Player.h:229
void SetActionAndType(uint32 action, ActionButtonType type)
Definition: Player.h:263
bool IsActionButtonDataValid(uint8 button, uint32 action, uint8 type)
Definition: Player.cpp:5483

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
1327{ m_ArmorProficiency |= newflag; }

References m_ArmorProficiency.

Referenced by Spell::EffectProficiency().

◆ AddBattlegroundQueueId()

uint32 Player::AddBattlegroundQueueId ( BattlegroundQueueTypeId  val)
12146{
12147 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12148 {
12149 if (_BgBattlegroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE || _BgBattlegroundQueueID[i].bgQueueTypeId == val)
12150 {
12151 _BgBattlegroundQueueID[i].bgQueueTypeId = val;
12152 _BgBattlegroundQueueID[i].invitedToInstance = 0;
12153 return i;
12154 }
12155 }
12156
12158}

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 
)
4303{
4304 if (!item)
4305 return;
4306
4307 if (slot >= MAX_ENCHANTMENT_SLOT)
4308 return;
4309
4310 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4311 {
4312 if (itr->item == item && itr->slot == slot)
4313 {
4314 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
4315 m_enchantDuration.erase(itr);
4316 break;
4317 }
4318 }
4319 if (item && duration > 0)
4320 {
4321 GetSession()->SendItemEnchantTimeUpdate(GetGUID(), item->GetGUID(), slot, uint32(duration / 1000));
4322 m_enchantDuration.push_back(EnchantDuration(item, slot, duration));
4323 }
4324}
@ MAX_ENCHANTMENT_SLOT
Definition: Item.h:177
Definition: Player.h:442
void SendItemEnchantTimeUpdate(ObjectGuid Playerguid, ObjectGuid Itemguid, uint32 slot, uint32 Duration)
Definition: ItemHandler.cpp:1236

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

Referenced by AddEnchantmentDurations(), and ApplyEnchantment().

◆ AddEnchantmentDurations()

void Player::AddEnchantmentDurations ( Item item)
4215{
4216 for (int x = 0; x < MAX_ENCHANTMENT_SLOT; ++x)
4217 {
4218 if (!item->GetEnchantmentId(EnchantmentSlot(x)))
4219 continue;
4220
4221 uint32 duration = item->GetEnchantmentDuration(EnchantmentSlot(x));
4222 if (duration > 0)
4223 AddEnchantmentDuration(item, EnchantmentSlot(x), duration);
4224 }
4225}
EnchantmentSlot
Definition: Item.h:162
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition: Item.h:295
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
Definition: Item.h:296
void AddEnchantmentDuration(Item *item, EnchantmentSlot slot, uint32 duration)
Definition: PlayerStorage.cpp:4302

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
2401 {
2402 if (_instanceResetTimes.find(instanceId) == _instanceResetTimes.end())
2403 _instanceResetTimes.insert(InstanceTimeMap::value_type(instanceId, enterTime + HOUR));
2404 }

References _instanceResetTimes, and HOUR.

Referenced by InstanceMap::AddPlayerToMap().

◆ AddItem()

bool Player::AddItem ( uint32  itemId,
uint32  count 
)
15442{
15443 uint32 noSpaceForCount = 0;
15444 ItemPosCountVec dest;
15445 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount);
15446 if (msg != EQUIP_ERR_OK)
15447 count -= noSpaceForCount;
15448
15449 if (count == 0 || dest.empty())
15450 {
15451 // -- TODO: Send to mailbox if no space
15452 ChatHandler(GetSession()).PSendSysMessage("You don't have any space in your bags.");
15453 return false;
15454 }
15455
15456 Item* item = StoreNewItem(dest, itemId, true);
15457 if (item)
15458 SendNewItem(item, count, true, false);
15459 else
15460 return false;
15461 return true;
15462}
@ NULL_BAG
Definition: Unit.h:210
Definition: Chat.h:38
void PSendSysMessage(char const *fmt, Args &&... args)
Definition: Chat.h:60

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_q11117_catch_the_wild_wolpertinger::HandleDummyEffect(), RewardHonor(), and npc_tharnarian::npc_tharnarianAI::sGossipSelect().

◆ AddItemDurations()

void Player::AddItemDurations ( Item item)
12356{
12358 {
12359 m_itemDuration.push_back(item);
12360 item->SendTimeUpdate(this);
12361 }
12362}
@ ITEM_FIELD_DURATION
Definition: UpdateFields.h:40
void SendTimeUpdate(Player *owner)
Definition: Item.cpp:1077
ItemDurationList m_itemDuration
Definition: Player.h:2771

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 
)
3965{
3966 if (pItem)
3967 {
3969 // if current back slot non-empty search oldest or free
3970 if (m_items[slot])
3971 {
3973 uint32 oldest_slot = BUYBACK_SLOT_START;
3974
3975 for (uint32 i = BUYBACK_SLOT_START + 1; i < BUYBACK_SLOT_END; ++i)
3976 {
3977 // found empty
3978 if (!m_items[i])
3979 {
3980 slot = i;
3981 break;
3982 }
3983
3985
3986 if (oldest_time > i_time)
3987 {
3988 oldest_time = i_time;
3989 oldest_slot = i;
3990 }
3991 }
3992
3993 // find oldest
3994 slot = oldest_slot;
3995 }
3996
3997 RemoveItemFromBuyBackSlot(slot, true);
3998 LOG_DEBUG("entities.player.items", "STORAGE: AddItemToBuyBackSlot item = {}, slot = {}", pItem->GetEntry(), slot);
3999
4000 m_items[slot] = pItem;
4001 time_t base = GameTime::GetGameTime().count();
4002 uint32 etime = uint32(base - m_logintime + (30 * 3600));
4003 uint32 eslot = slot - BUYBACK_SLOT_START;
4004
4008
4009 // move to next (for non filled list is move most optimized choice)
4012 }
4013}
@ 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:4023

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 Object::SetUInt32Value().

Referenced by WorldSession::HandleSellItemOpcode().

◆ AdditionalSavingAddMask()

◆ AddKnownCurrency()

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

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

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

◆ AddMail()

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

References m_mail.

Referenced by MailDraft::SendMailTo().

◆ AddMItem()

void Player::AddMItem ( Item it)
inline
1633 {
1634 ASSERT(it);
1635 //ASSERT deleted, because items can be added before loading
1636 mMitems[it->GetGUID().GetCounter()] = it;
1637 }

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

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

◆ AddNewMailDeliverTime()

void Player::AddNewMailDeliverTime ( time_t  deliver_time)
2837{
2838 if (deliver_time <= GameTime::GetGameTime().count()) // ready now
2839 {
2840 ++unReadMails;
2841 SendNewMail();
2842 }
2843 else // not ready and no have ready mails
2844 {
2845 if (!m_nextMailDelivereTime || m_nextMailDelivereTime > deliver_time)
2846 m_nextMailDelivereTime = deliver_time;
2847 }
2848}
void SendNewMail()
Definition: Player.cpp:2828

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

Referenced by MailDraft::SendMailTo().

◆ AddQuest()

void Player::AddQuest ( Quest const *  quest,
Object questGiver 
)
506{
507 uint16 log_slot = FindQuestSlot(0);
508
509 if (log_slot >= MAX_QUEST_LOG_SIZE) // Player does not have any free slot in the quest log
510 return;
511
512 uint32 quest_id = quest->GetQuestId();
513
514 // if not exist then created with set uState == NEW and rewarded=false
515 QuestStatusData& questStatusData = m_QuestStatus[quest_id];
516
517 // check for repeatable quests status reset
518 questStatusData.Status = QUEST_STATUS_INCOMPLETE;
519 questStatusData.Explored = false;
520
521 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
522 {
523 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
524 questStatusData.ItemCount[i] = 0;
525 }
526
528 {
529 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
530 questStatusData.CreatureOrGOCount[i] = 0;
531 }
532
533 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL))
534 questStatusData.PlayerCount = 0;
535
536 GiveQuestSourceItem(quest);
537 AdjustQuestReqItemCount(quest, questStatusData);
538
539 if (quest->GetRepObjectiveFaction())
540 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->GetRepObjectiveFaction()))
541 GetReputationMgr().SetVisible(factionEntry);
542
543 if (quest->GetRepObjectiveFaction2())
544 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->GetRepObjectiveFaction2()))
545 GetReputationMgr().SetVisible(factionEntry);
546
547 uint32 qtime = 0;
548 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
549 {
550 uint32 timeAllowed = quest->GetTimeAllowed();
551
552 // shared timed quest
553 if (questGiver && questGiver->GetTypeId() == TYPEID_PLAYER)
554 timeAllowed = questGiver->ToPlayer()->getQuestStatusMap()[quest_id].Timer / IN_MILLISECONDS;
555
556 AddTimedQuest(quest_id);
557 questStatusData.Timer = timeAllowed * IN_MILLISECONDS;
558 qtime = static_cast<uint32>(GameTime::GetGameTime().count()) + timeAllowed;
559 }
560 else
561 questStatusData.Timer = 0;
562
563 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
564 {
565 pvpInfo.IsHostile = true;
567 }
568
569 SetQuestSlot(log_slot, quest_id, qtime);
570
571 m_QuestStatusSave[quest_id] = true;
572
574
575 SendQuestUpdate(quest_id);
576
577 // check if Quest Tracker is enabled
578 if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
579 {
580 // prepare Quest Tracker datas
581 auto stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_QUEST_TRACK);
582 stmt->SetData(0, quest_id);
583 stmt->SetData(1, GetGUID().GetCounter());
584 stmt->SetData(2, GitRevision::GetHash());
585 stmt->SetData(3, GitRevision::GetDate());
586
587 // add to Quest Tracker
588 CharacterDatabase.Execute(stmt);
589 }
590
591 // Xinef: area auras may change on quest accept!
594}
@ CHAR_INS_QUEST_TRACK
Definition: CharacterDatabase.h:498
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:172
@ QUEST_SPECIAL_FLAGS_KILL
Definition: QuestDef.h:174
@ QUEST_SPECIAL_FLAGS_SPEAKTO
Definition: QuestDef.h:173
@ QUEST_SPECIAL_FLAGS_PLAYER_KILL
Definition: QuestDef.h:176
@ CONFIG_QUEST_ENABLE_QUEST_TRACKER
Definition: IWorld.h:149
@ ACHIEVEMENT_TIMED_TYPE_QUEST
Definition: DBCEnums.h:117
AC_COMMON_API char const * GetDate()
Definition: GitRevision.cpp:14
AC_COMMON_API char const * GetHash()
Definition: GitRevision.cpp:9
Player * ToPlayer()
Definition: Object.h:195
TypeID GetTypeId() const
Definition: Object.h:121
uint32 GetAreaId() const
Definition: Object.cpp:3083
bool IsHostile
Definition: Player.h:361
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
Definition: Player.cpp:13803
QuestStatusMap & getQuestStatusMap()
Definition: Player.h:1585
uint16 FindQuestSlot(uint32 quest_id) const
Definition: PlayerQuest.cpp:1766
void UpdatePvPState()
Definition: PlayerUpdates.cpp:1391
void UpdateAreaDependentAuras(uint32 area_id)
Definition: PlayerUpdates.cpp:1818
void SendQuestUpdate(uint32 questId)
Definition: PlayerQuest.cpp:1510
void AdjustQuestReqItemCount(Quest const *quest, QuestStatusData &questStatusData)
Definition: PlayerQuest.cpp:1748
PvPInfo pvpInfo
Definition: Player.h:1797
void UpdateZoneDependentAuras(uint32 zone_id)
Definition: PlayerUpdates.cpp:1804
bool GiveQuestSourceItem(Quest const *quest)
Definition: PlayerQuest.cpp:1332
ReputationMgr & GetReputationMgr()
Definition: Player.h:2076
void SetVisible(FactionTemplateEntry const *factionTemplateEntry)
Definition: ReputationMgr.cpp:458
Definition: DBCStructure.h:898

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(), Object::GetTypeId(), WorldObject::GetZoneId(), GiveQuestSourceItem(), Quest::HasFlag(), Quest::HasSpecialFlag(), IN_MILLISECONDS, PvPInfo::IsHostile, 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(), TYPEID_PLAYER, UpdateAreaDependentAuras(), UpdatePvPState(), and UpdateZoneDependentAuras().

Referenced by AddQuestAndCheckCompletion().

◆ AddQuestAndCheckCompletion()

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

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
2532{ m_receivedSpectatorResetFor.insert(guid); }
GuidSet m_receivedSpectatorResetFor
Definition: Player.h:2536

References m_receivedSpectatorResetFor.

Referenced by ArenaSpectator::HandleResetCommand().

◆ AddRefundReference()

void Player::AddRefundReference ( ObjectGuid  itemGUID)
15390{
15391 m_refundableItems.insert(itemGUID);
15392}

References m_refundableItems.

Referenced by _LoadItem(), and _StoreOrEquipNewItem().

◆ AddRuneByAuraEffect()

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

References ConvertRune(), and SetRuneConvertAura().

Referenced by AuraEffect::HandleAuraConvertRune().

◆ AddRunePower()

void Player::AddRunePower ( uint8  index)
13331{
13333 data << uint32(1 << index); // mask (0x00-0x3F probably)
13334 GetSession()->SendPacket(&data);
13335}
@ 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 
)
2996{
2997 if (!_addSpell(spellId, addSpecMask, temporary, learnFromSkill))
2998 return false;
2999
3000 if (!updateActive)
3001 return true;
3002
3003 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); // must exist, checked in _addSpell
3004
3005 // pussywizard: now update active state for all ranks of this spell! and send packet to swap on action bar
3006 // pussywizard: assumption - it's in all specs, can't be a talent
3007 if (!spellInfo->IsStackableWithRanks() && spellInfo->IsRanked())
3008 {
3009 SpellInfo const* nextSpellInfo = sSpellMgr->GetSpellInfo(sSpellMgr->GetFirstSpellInChain(spellInfo->Id));
3010 while (nextSpellInfo)
3011 {
3012 PlayerSpellMap::iterator itr = m_spells.find(nextSpellInfo->Id);
3013 if (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->Active)
3014 {
3015 if (nextSpellInfo->GetRank() < spellInfo->GetRank())
3016 {
3017 itr->second->Active = false;
3018 if (IsInWorld())
3019 {
3021 data << uint32(nextSpellInfo->Id);
3022 data << uint32(spellInfo->Id);
3023 GetSession()->SendPacket(&data);
3024 }
3025 return false;
3026 }
3027 else if (nextSpellInfo->GetRank() > spellInfo->GetRank())
3028 {
3029 PlayerSpellMap::iterator itr2 = m_spells.find(spellInfo->Id);
3030 if (itr2 != m_spells.end())
3031 itr2->second->Active = false;
3032 return false;
3033 }
3034 }
3035 nextSpellInfo = nextSpellInfo->GetNextRankSpell();
3036 }
3037 }
3038
3039 return true;
3040}
@ SMSG_SUPERCEDED_SPELL
Definition: Opcodes.h:330
uint8 GetRank() const
Definition: SpellInfo.cpp:2477
bool IsRanked() const
Definition: SpellInfo.cpp:2472
bool IsStackableWithRanks() const
Definition: SpellInfo.cpp:1129
SpellInfo const * GetNextRankSpell() const
Definition: SpellInfo.cpp:2496

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 
)
10806{
10807 // init cooldown values
10808 uint32 cat = 0;
10809 int32 rec = -1;
10810 int32 catrec = -1;
10811
10812 // some special item spells without correct cooldown in SpellInfo
10813 // cooldown information stored in item prototype
10814 // This used in same way in WorldSession::HandleItemQuerySingleOpcode data sending to client.
10815
10816 if (itemId)
10817 {
10818 if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))
10819 {
10820 for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
10821 {
10822 if (uint32(proto->Spells[idx].SpellId) == spellInfo->Id)
10823 {
10824 cat = proto->Spells[idx].SpellCategory;
10825 rec = proto->Spells[idx].SpellCooldown;
10826 catrec = proto->Spells[idx].SpellCategoryCooldown;
10827 break;
10828 }
10829 }
10830 }
10831 }
10832
10833 // if no cooldown found above then base at DBC data
10834 if (rec < 0 && catrec < 0)
10835 {
10836 cat = spellInfo->GetCategory();
10837 rec = spellInfo->RecoveryTime;
10838 catrec = spellInfo->CategoryRecoveryTime;
10839 }
10840
10841 time_t catrecTime;
10842 time_t recTime;
10843
10844 bool needsCooldownPacket = false;
10845
10846 // overwrite time for selected category
10847 if (infinityCooldown)
10848 {
10849 // use +MONTH as infinity mark for spell cooldown (will checked as MONTH/2 at save ans skipped)
10850 // but not allow ignore until reset or re-login
10851 catrecTime = catrec > 0 ? infinityCooldownDelay : 0;
10852 recTime = rec > 0 ? infinityCooldownDelay : catrecTime;
10853 }
10854 else
10855 {
10856 // shoot spells used equipped item cooldown values already assigned in GetAttackTime(RANGED_ATTACK)
10857 // prevent 0 cooldowns set by another way
10858 if (rec <= 0 && catrec <= 0 && (cat == 76 || (spellInfo->IsAutoRepeatRangedSpell() && spellInfo->Id != 75)))
10860
10861 // Now we have cooldown data (if found any), time to apply mods
10862 if (rec > 0)
10863 ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, rec, spell);
10864
10865 if (catrec > 0 && !spellInfo->HasAttribute(SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS))
10866 {
10867 ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, catrec, spell);
10868 }
10869
10871 {
10872 // Apply SPELL_AURA_MOD_COOLDOWN only to own spells
10873 if (HasSpell(spellInfo->Id))
10874 {
10875 needsCooldownPacket = true;
10876 rec += cooldownMod * IN_MILLISECONDS; // SPELL_AURA_MOD_COOLDOWN does not affect category cooldows, verified with shaman shocks
10877 }
10878 }
10879
10880 // replace negative cooldowns by 0
10881 if (rec < 0) rec = 0;
10882 if (catrec < 0) catrec = 0;
10883
10884 // no cooldown after applying spell mods
10885 if (rec == 0 && catrec == 0)
10886 return;
10887
10888 catrecTime = catrec ? catrec : 0;
10889 recTime = rec ? rec : catrecTime;
10890 }
10891
10892 // category spells
10893 if (cat && catrec > 0)
10894 {
10895 _AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
10896 if (needsCooldownPacket)
10897 {
10898 WorldPacket data;
10899 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, recTime);
10900 SendDirectMessage(&data);
10901 }
10902
10903 PacketCooldowns forcedCategoryCooldowns;
10904
10905 SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat);
10906 if (i_scstore != sSpellsByCategoryStore.end())
10907 {
10908 for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset)
10909 {
10910 if (i_scset->second == spellInfo->Id) // skip main spell, already handled above
10911 {
10912 continue;
10913 }
10914
10915 // If spell category is applied by item, then other spells should be exists in item templates
10916 if ((itemId > 0) != i_scset->first)
10917 {
10918 continue;
10919 }
10920
10921 // Only within the same spellfamily
10922 SpellInfo const* categorySpellInfo = sSpellMgr->GetSpellInfo(i_scset->second);
10923 if (!categorySpellInfo || categorySpellInfo->SpellFamilyName != spellInfo->SpellFamilyName)
10924 {
10925 continue;
10926 }
10927
10928 _AddSpellCooldown(i_scset->second, cat, itemId, catrecTime, !spellInfo->IsCooldownStartedOnEvent() && catrec && rec && catrec != rec);
10929
10930 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS))
10931 {
10932 forcedCategoryCooldowns[i_scset->second] = catrecTime;
10933 }
10934 }
10935 }
10936
10937 if (!forcedCategoryCooldowns.empty())
10938 {
10939 WorldPacket data;
10940 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, forcedCategoryCooldowns);
10941 SendDirectMessage(&data);
10942 }
10943 }
10944 else
10945 {
10946 // self spell cooldown
10947 if (recTime > 0)
10948 {
10949 _AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
10950
10951 if (needsCooldownPacket)
10952 {
10953 WorldPacket data;
10954 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, rec);
10955 SendDirectMessage(&data);
10956 }
10957 }
10958 }
10959}
SpellCategoryStore sSpellsByCategoryStore
Definition: DBCStores.cpp:150
#define MAX_ITEM_SPELLS
Definition: Item.h:209
static constexpr uint32 infinityCooldownDelay
Definition: Unit.h:154
@ SPELL_COOLDOWN_FLAG_NONE
Definition: Unit.h:1230
std::unordered_map< uint32, uint32 > PacketCooldowns
Definition: Unit.h:1235
@ SPELL_AURA_MOD_COOLDOWN
Definition: SpellAuraDefines.h:259
@ SPELLMOD_COOLDOWN
Definition: SpellDefines.h:88
@ SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS
Definition: SpellInfo.h:204
@ SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS
Definition: SharedDefines.h:607
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:5594
void ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell *spell=nullptr, bool temporaryPet=false)
Definition: Player.cpp:9627
void BuildCooldownPacket(WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
Definition: Unit.cpp:21164
uint32 GetAttackTime(WeaponAttackType att) const
Definition: Unit.h:1469
int32 GetTotalAuraModifier(AuraType auratype) const
Definition: Unit.cpp:5822
uint32 SpellFamilyName
Definition: SpellInfo.h:385

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 
)
9786{
9787 LOG_DEBUG("spells.aura", "Player::AddSpellMod {}", mod->spellId);
9789
9790 int i = 0;
9791 flag96 _mask = 0;
9792 for (int eff = 0; eff < 96; ++eff)
9793 {
9794 if (eff != 0 && eff % 32 == 0)
9795 _mask[i++] = 0;
9796
9797 _mask[i] = uint32(1) << (eff - (32 * i));
9798 if (mod->mask & _mask)
9799 {
9800 int32 val = 0;
9801 for (SpellModList::iterator itr = m_spellMods[mod->op].begin(); itr != m_spellMods[mod->op].end(); ++itr)
9802 {
9803 if ((*itr)->type == mod->type && (*itr)->mask & _mask)
9804 val += (*itr)->value;
9805 }
9806 val += apply ? mod->value : -(mod->value);
9807 WorldPacket data(Opcode, (1 + 1 + 4));
9808 data << uint8(eff);
9809 data << uint8(mod->op);
9810 data << int32(val);
9811 SendDirectMessage(&data);
9812 }
9813 }
9814
9815 if (apply)
9816 {
9817 m_spellMods[mod->op].push_back(mod);
9818 if (getClass() == CLASS_MAGE)
9819 m_spellMods[mod->op].sort(MageSpellModPred());
9820 else
9821 m_spellMods[mod->op].sort(SpellModPred());
9822 }
9823 else
9824 {
9825 m_spellMods[mod->op].remove(mod);
9826 // mods bound to aura will be removed in AuraEffect::~AuraEffect
9827 if (!mod->ownerAura)
9828 delete mod;
9829 }
9830}
@ SPELLMOD_FLAT
Definition: Player.h:94
@ CLASS_MAGE
Definition: SharedDefines.h:120
@ 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:446
Definition: Player.cpp:9759
Definition: Player.cpp:9770
SpellModOp op
Definition: Player.h:184
SpellModType type
Definition: Player.h:185
int32 value
Definition: Player.h:187
uint32 spellId
Definition: Player.h:189
Aura *const ownerAura
Definition: Player.h:190
flag96 mask
Definition: Player.h:188
SpellModList m_spellMods[MAX_SPELLMOD]
Definition: Player.h:2766

References CLASS_MAGE, Unit::getClass(), 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 
)
2851{
2852 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
2853 if (!SpellMgr::CheckSpellValid(spellInfo, spellId, true))
2854 return false;
2855
2856 TalentSpellPos const* talentPos = GetTalentSpellPos(spellId);
2857 if (!talentPos)
2858 return false;
2859
2860 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentPos->talent_id);
2861 if (!talentInfo)
2862 return false;
2863
2864 // xinef: remove old talent rank if any
2865 if (oldTalentRank)
2866 {
2867 _removeTalent(talentInfo->RankID[oldTalentRank - 1], addSpecMask);
2868 _removeTalentAurasAndSpells(talentInfo->RankID[oldTalentRank - 1]);
2869 SendLearnPacket(talentInfo->RankID[oldTalentRank - 1], false);
2870 }
2871
2872 // xinef: add talent auras and spells
2873 if (GetActiveSpecMask() & addSpecMask)
2874 _addTalentAurasAndSpells(spellId);
2875
2876 // xinef: find the spell on our talent map
2877 PlayerTalentMap::iterator itr = m_talents.find(spellId);
2878
2879 // xinef: we do not have such a spell on our talent map
2880 if (itr == m_talents.end())
2881 {
2883 PlayerTalent* newTalent = new PlayerTalent();
2884 newTalent->State = state;
2885 newTalent->specMask = addSpecMask;
2886 newTalent->talentID = talentInfo->TalentID;
2887 newTalent->inSpellBook = talentInfo->addToSpellBook && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL);
2888
2889 m_talents[spellId] = newTalent;
2890 return true;
2891 }
2892 // xinef: if current mask does not cover addMask, add it to iterator and save changes to DB
2893 else if (!(itr->second->specMask & addSpecMask))
2894 {
2895 itr->second->specMask |= addSpecMask;
2896 if (itr->second->State != PLAYERSPELL_NEW)
2897 itr->second->State = PLAYERSPELL_CHANGED;
2898
2899 return true;
2900 }
2901
2902 return false;
2903}
DBCStorage< TalentEntry > sTalentStore(TalentEntryfmt)
PlayerSpellState
Definition: Player.h:119
Definition: Player.h:136
PlayerSpellState State
Definition: Player.h:137
bool inSpellBook
Definition: Player.h:140
uint32 talentID
Definition: Player.h:139
uint8 specMask
Definition: Player.h:138
Definition: DBCStructure.h:1899
std::array< uint32, MAX_TALENT_RANK > RankID
Definition: DBCStructure.h:1904
uint32 TalentID
Definition: DBCStructure.h:1900
uint32 addToSpellBook
Definition: DBCStructure.h:1910
uint16 talent_id
Definition: DBCStructure.h:2209

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
1520{ m_timedquests.insert(quest_id); }
QuestSet m_timedquests
Definition: Player.h:2630

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.

1680{
1685
1686 for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
1687 if (m_items[i])
1688 m_items[i]->AddToWorld();
1689}
@ PLAYER_SLOT_START
Definition: Player.h:665
@ PLAYER_SLOT_END
Definition: Player.h:667
void AddToWorld() override
Definition: Unit.cpp:15580

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

Referenced by Map::AddPlayerToMap().

◆ AddTradeableItem()

void Player::AddTradeableItem ( Item item)
4161{
4162 std::lock_guard<std::mutex> guard(m_soulboundTradableLock);
4163 m_itemSoulboundTradeable.push_back(item);
4164}
std::mutex m_soulboundTradableLock
Definition: Player.h:2773
ItemDurationList m_itemSoulboundTradeable
Definition: Player.h:2772

References m_itemSoulboundTradeable, and m_soulboundTradableLock.

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

◆ AddWeaponProficiency()

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

References m_WeaponProficiency.

Referenced by Spell::EffectProficiency().

◆ AddWhisperWhiteList()

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

References WhisperList.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ AdjustQuestReqItemCount()

void Player::AdjustQuestReqItemCount ( Quest const *  quest,
QuestStatusData questStatusData 
)
private
1749{
1750 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
1751 {
1752 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
1753 {
1754 uint32 reqitemcount = quest->RequiredItemCount[i];
1755 if (reqitemcount != 0)
1756 {
1757 uint32 curitemcount = GetItemCount(quest->RequiredItemId[i], true);
1758
1759 questStatusData.ItemCount[i] = std::min(curitemcount, reqitemcount);
1760 m_QuestStatusSave[quest->GetQuestId()] = true;
1761 }
1762 }
1763 }
1764}
uint32 GetItemCount(uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
Definition: PlayerStorage.cpp:358

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 
)
4327{
4328 for (uint32 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
4329 ApplyEnchantment(item, EnchantmentSlot(slot), apply);
4330}

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 
)
4333{
4334 if (!item || !item->IsEquipped())
4335 return;
4336
4337 if (slot >= MAX_ENCHANTMENT_SLOT)
4338 return;
4339
4340 uint32 enchant_id = item->GetEnchantmentId(slot);
4341 if (!enchant_id)
4342 return;
4343
4344 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
4345 if (!pEnchant)
4346 return;
4347
4348 if (!ignore_condition && pEnchant->EnchantmentCondition && !EnchantmentFitsRequirements(pEnchant->EnchantmentCondition, -1))
4349 return;
4350
4351 if (pEnchant->requiredLevel > GetLevel())
4352 return;
4353
4354 if (pEnchant->requiredSkill > 0 && pEnchant->requiredSkillValue > GetSkillValue(pEnchant->requiredSkill))
4355 return;
4356
4357 if (!sScriptMgr->CanApplyEnchantment(this, item, slot, apply, apply_dur, ignore_condition))
4358 return;
4359
4360 // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements
4361 // rather than the gem requirements itself. If the socket has no color it is a prismatic socket.
4363 && !item->GetTemplate()->Socket[slot - SOCK_ENCHANTMENT_SLOT].Color)
4364 {
4365 // Check if the requirements for the prismatic socket are met before applying the gem stats
4367 if (!pPrismaticEnchant || (pPrismaticEnchant->requiredSkill > 0 && pPrismaticEnchant->requiredSkillValue > GetSkillValue(pPrismaticEnchant->requiredSkill)))
4368 return;
4369 }
4370
4371 if (!item->IsBroken())
4372 {
4373 for (int s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
4374 {
4375 uint32 enchant_display_type = pEnchant->type[s];
4376 uint32 enchant_amount = pEnchant->amount[s];
4377 uint32 enchant_spell_id = pEnchant->spellid[s];
4378
4379 switch (enchant_display_type)
4380 {
4382 break;
4384 // processed in Player::CastItemCombatSpell
4385 break;
4387 if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
4388 HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, float(enchant_amount), apply);
4389 else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
4390 HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, float(enchant_amount), apply);
4391 else if (item->GetSlot() == EQUIPMENT_SLOT_RANGED)
4392 HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4393 break;
4395 if (enchant_spell_id)
4396 {
4397 if (apply)
4398 {
4399 int32 basepoints = 0;
4400 // Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor)
4401 if (item->GetItemRandomPropertyId())
4402 {
4403 ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4404 if (item_rand)
4405 {
4406 // Search enchant_amount
4407 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4408 {
4409 if (item_rand->Enchantment[k] == enchant_id)
4410 {
4411 basepoints = int32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4412 break;
4413 }
4414 }
4415 }
4416 }
4417 // Cast custom spell vs all equal basepoints got from enchant_amount
4418 if (basepoints)
4419 CastCustomSpell(this, enchant_spell_id, &basepoints, &basepoints, &basepoints, true, item);
4420 else
4421 CastSpell(this, enchant_spell_id, true, item);
4422 }
4423 else
4424 RemoveAurasDueToItemSpell(enchant_spell_id, item->GetGUID());
4425 }
4426 break;
4428 if (!enchant_amount)
4429 {
4430 ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4431 if (item_rand)
4432 {
4433 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4434 {
4435 if (item_rand->Enchantment[k] == enchant_id)
4436 {
4437 enchant_amount = uint32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4438 break;
4439 }
4440 }
4441 }
4442 }
4443
4444 HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + enchant_spell_id), TOTAL_VALUE, float(enchant_amount), apply);
4445 break;
4447 {
4448 if (!enchant_amount)
4449 {
4450 ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4451 if (item_rand_suffix)
4452 {
4453 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4454 {
4455 if (item_rand_suffix->Enchantment[k] == enchant_id)
4456 {
4457 enchant_amount = uint32((item_rand_suffix->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4458 break;
4459 }
4460 }
4461 }
4462 }
4463
4464 LOG_DEBUG("entities.player.items", "Adding {} to stat nb {}", enchant_amount, enchant_spell_id);
4465 switch (enchant_spell_id)
4466 {
4467 case ITEM_MOD_MANA:
4468 LOG_DEBUG("entities.player.items", "+ {} MANA", enchant_amount);
4469 HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(enchant_amount), apply);
4470 break;
4471 case ITEM_MOD_HEALTH:
4472 LOG_DEBUG("entities.player.items", "+ {} HEALTH", enchant_amount);
4473 HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(enchant_amount), apply);
4474 break;
4475 case ITEM_MOD_AGILITY:
4476 LOG_DEBUG("entities.player.items", "+ {} AGILITY", enchant_amount);
4477 HandleStatModifier(UNIT_MOD_STAT_AGILITY, TOTAL_VALUE, float(enchant_amount), apply);
4478 ApplyStatBuffMod(STAT_AGILITY, (float)enchant_amount, apply);
4479 break;
4480 case ITEM_MOD_STRENGTH:
4481 LOG_DEBUG("entities.player.items", "+ {} STRENGTH", enchant_amount);
4482 HandleStatModifier(UNIT_MOD_STAT_STRENGTH, TOTAL_VALUE, float(enchant_amount), apply);
4483 ApplyStatBuffMod(STAT_STRENGTH, (float)enchant_amount, apply);
4484 break;
4485 case ITEM_MOD_INTELLECT:
4486 LOG_DEBUG("entities.player.items", "+ {} INTELLECT", enchant_amount);
4487 HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, float(enchant_amount), apply);
4488 ApplyStatBuffMod(STAT_INTELLECT, (float)enchant_amount, apply);
4489 break;
4490 case ITEM_MOD_SPIRIT:
4491 LOG_DEBUG("entities.player.items", "+ {} SPIRIT", enchant_amount);
4492 HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, float(enchant_amount), apply);
4493 ApplyStatBuffMod(STAT_SPIRIT, (float)enchant_amount, apply);
4494 break;
4495 case ITEM_MOD_STAMINA:
4496 LOG_DEBUG("entities.player.items", "+ {} STAMINA", enchant_amount);
4497 HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, float(enchant_amount), apply);
4498 ApplyStatBuffMod(STAT_STAMINA, (float)enchant_amount, apply);
4499 break;
4501 ApplyRatingMod(CR_DEFENSE_SKILL, enchant_amount, apply);
4502 LOG_DEBUG("entities.player.items", "+ {} DEFENCE", enchant_amount);
4503 break;
4505 ApplyRatingMod(CR_DODGE, enchant_amount, apply);
4506 LOG_DEBUG("entities.player.items", "+ {} DODGE", enchant_amount);
4507 break;
4509 ApplyRatingMod(CR_PARRY, enchant_amount, apply);
4510 LOG_DEBUG("entities.player.items", "+ {} PARRY", enchant_amount);
4511 break;
4513 ApplyRatingMod(CR_BLOCK, enchant_amount, apply);
4514 LOG_DEBUG("entities.player.items", "+ {} SHIELD_BLOCK", enchant_amount);
4515 break;
4517 ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
4518 LOG_DEBUG("entities.player.items", "+ {} MELEE_HIT", enchant_amount);
4519 break;
4521 ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
4522 LOG_DEBUG("entities.player.items", "+ {} RANGED_HIT", enchant_amount);
4523 break;
4525 ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
4526 LOG_DEBUG("entities.player.items", "+ {} SPELL_HIT", enchant_amount);
4527 break;
4529 ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
4530 LOG_DEBUG("entities.player.items", "+ {} MELEE_CRIT", enchant_amount);
4531 break;
4533 ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
4534 LOG_DEBUG("entities.player.items", "+ {} RANGED_CRIT", enchant_amount);
4535 break;
4537 ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
4538 LOG_DEBUG("entities.player.items", "+ {} SPELL_CRIT", enchant_amount);
4539 break;
4540 // Values from ITEM_STAT_MELEE_HA_RATING to ITEM_MOD_HASTE_RANGED_RATING are never used
4541 // in Enchantments
4542 // case ITEM_MOD_HIT_TAKEN_MELEE_RATING:
4543 // ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
4544 // break;
4545 // case ITEM_MOD_HIT_TAKEN_RANGED_RATING:
4546 // ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
4547 // break;
4548 // case ITEM_MOD_HIT_TAKEN_SPELL_RATING:
4549 // ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
4550 // break;
4551 // case ITEM_MOD_CRIT_TAKEN_MELEE_RATING:
4552 // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4553 // break;
4554 // case ITEM_MOD_CRIT_TAKEN_RANGED_RATING:
4555 // ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4556 // break;
4557 // case ITEM_MOD_CRIT_TAKEN_SPELL_RATING:
4558 // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4559 // break;
4560 // case ITEM_MOD_HASTE_MELEE_RATING:
4561 // ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
4562 // break;
4564 ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
4565 break;
4567 ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
4568 break;
4570 ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
4571 ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
4572 ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
4573 LOG_DEBUG("entities.player.items", "+ {} HIT", enchant_amount);
4574 break;
4576 ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
4577 ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
4578 ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
4579 LOG_DEBUG("entities.player.items", "+ {} CRITICAL", enchant_amount);
4580 break;
4581 // Values ITEM_MOD_HIT_TAKEN_RATING and ITEM_MOD_CRIT_TAKEN_RATING are never used in Enchantment
4582 // case ITEM_MOD_HIT_TAKEN_RATING:
4583 // ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
4584 // ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
4585 // ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
4586 // break;
4587 // case ITEM_MOD_CRIT_TAKEN_RATING:
4588 // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4589 // ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4590 // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4591 // break;
4593 ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4594 ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4595 ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4596 LOG_DEBUG("entities.player.items", "+ {} RESILIENCE", enchant_amount);
4597 break;
4599 ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
4600 ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
4601 ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
4602 LOG_DEBUG("entities.player.items", "+ {} HASTE", enchant_amount);
4603 break;
4605 ApplyRatingMod(CR_EXPERTISE, enchant_amount, apply);
4606 LOG_DEBUG("entities.player.items", "+ {} EXPERTISE", enchant_amount);
4607 break;
4609 HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(enchant_amount), apply);
4610 HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4611 LOG_DEBUG("entities.player.items", "+ {} ATTACK_POWER", enchant_amount);
4612 break;
4614 HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4615 LOG_DEBUG("entities.player.items", "+ {} RANGED_ATTACK_POWER", enchant_amount);
4616 break;
4617 // case ITEM_MOD_FERAL_ATTACK_POWER:
4618 // ApplyFeralAPBonus(enchant_amount, apply);
4619 // LOG_DEBUG("entities.player.items", "+ {} FERAL_ATTACK_POWER", enchant_amount);
4620 // break;
4622 ApplyManaRegenBonus(enchant_amount, apply);
4623 LOG_DEBUG("entities.player.items", "+ {} MANA_REGENERATION", enchant_amount);
4624 break;
4626 ApplyRatingMod(CR_ARMOR_PENETRATION, enchant_amount, apply);
4627 LOG_DEBUG("entities.player.items", "+ {} ARMOR PENETRATION", enchant_amount);
4628 break;
4630 ApplySpellPowerBonus(enchant_amount, apply);
4631 LOG_DEBUG("entities.player.items", "+ {} SPELL_POWER", enchant_amount);
4632 break;
4634 ApplyHealthRegenBonus(enchant_amount, apply);
4635 LOG_DEBUG("entities.player.items", "+ {} HEALTH_REGENERATION", enchant_amount);
4636 break;
4638 ApplySpellPenetrationBonus(enchant_amount, apply);
4639 LOG_DEBUG("entities.player.items", "+ {} SPELL_PENETRATION", enchant_amount);
4640 break;
4642 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(enchant_amount), apply);
4643 LOG_DEBUG("entities.player.items", "+ {} BLOCK_VALUE", enchant_amount);
4644 break;
4645 case ITEM_MOD_SPELL_HEALING_DONE: // deprecated
4646 case ITEM_MOD_SPELL_DAMAGE_DONE: // deprecated
4647 default:
4648 break;
4649 }
4650 break;
4651 }
4652 case ITEM_ENCHANTMENT_TYPE_TOTEM: // Shaman Rockbiter Weapon
4653 {
4654 if (getClass() == CLASS_SHAMAN)
4655 {
4656 float addValue = 0.0f;
4657 if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
4658 {
4659 addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f);
4661 }
4662 else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
4663 {
4664 addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f);
4666 }
4667 }
4668 break;
4669 }
4671 // processed in Player::CastItemUseSpell
4672 break;
4674 // nothing do..
4675 break;
4676 default:
4677 LOG_ERROR("entities.player", "Unknown item enchantment (id = {}) display type: {}", enchant_id, enchant_display_type);
4678 break;
4679 } /*switch (enchant_display_type)*/
4680 } /*for*/
4681 }
4682
4683 // visualize enchantment at player and equipped items
4684 if (slot == PERM_ENCHANTMENT_SLOT)
4685 SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 0, apply ? item->GetEnchantmentId(slot) : 0);
4686
4687 if (slot == TEMP_ENCHANTMENT_SLOT)
4688 SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 1, apply ? item->GetEnchantmentId(slot) : 0);
4689
4690 if (apply_dur)
4691 {
4692 if (apply)
4693 {
4694 // set duration
4695 uint32 duration = item->GetEnchantmentDuration(slot);
4696 if (duration > 0)
4697 AddEnchantmentDuration(item, slot, duration);
4698 }
4699 else
4700 {
4701 // duration == 0 will remove EnchantDuration
4702 AddEnchantmentDuration(item, slot, 0);
4703 }
4704 }
4705}
DBCStorage< SpellItemEnchantmentEntry > sSpellItemEnchantmentStore(SpellItemEnchantmentfmt)
DBCStorage< ItemRandomSuffixEntry > sItemRandomSuffixStore(ItemRandomSuffixfmt)
@ PERM_ENCHANTMENT_SLOT
Definition: Item.h:163
@ SOCK_ENCHANTMENT_SLOT_3
Definition: Item.h:167
@ TEMP_ENCHANTMENT_SLOT
Definition: Item.h:164
@ SOCK_ENCHANTMENT_SLOT_2
Definition: Item.h:166
@ PRISMATIC_ENCHANTMENT_SLOT
Definition: Item.h:169
@ SOCK_ENCHANTMENT_SLOT
Definition: Item.h:165
@ PLAYER_VISIBLE_ITEM_1_ENCHANTMENT
Definition: UpdateFields.h:287
@ UNIT_MOD_RESISTANCE_START
Definition: Unit.h:291
@ ITEM_ENCHANTMENT_TYPE_DAMAGE
Definition: DBCEnums.h:373
@ ITEM_ENCHANTMENT_TYPE_USE_SPELL
Definition: DBCEnums.h:378
@ ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL
Definition: DBCEnums.h:372
@ ITEM_ENCHANTMENT_TYPE_STAT
Definition: DBCEnums.h:376
@ ITEM_ENCHANTMENT_TYPE_RESISTANCE
Definition: DBCEnums.h:375
@ ITEM_ENCHANTMENT_TYPE_NONE
Definition: DBCEnums.h:371
@ ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL
Definition: DBCEnums.h:374
@ ITEM_ENCHANTMENT_TYPE_TOTEM
Definition: DBCEnums.h:377
@ ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET
Definition: DBCEnums.h:379
#define MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS
Definition: DBCStructure.h:1814
#define MAX_ITEM_ENCHANTMENT_EFFECTS
Definition: DBCStructure.h:1183
@ CLASS_SHAMAN
Definition: SharedDefines.h:119
int32 GetItemRandomPropertyId() const
Definition: Item.h:286
uint32 GetItemSuffixFactor() const
Definition: Item.h:287
bool IsEquipped() const
Definition: Item.cpp:791
uint32 Color
Definition: ItemTemplate.h:611
uint32 Delay
Definition: ItemTemplate.h:668
_Socket Socket[MAX_ITEM_PROTO_SOCKETS]
Definition: ItemTemplate.h:690
void SetUInt16Value(uint16 index, uint8 offset, uint16 value)
Definition: Object.cpp:770
uint16 GetSkillValue(uint32 skill) const
Definition: Player.cpp:5354
bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot)
Definition: Player.cpp:11017
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:1226
void RemoveAurasDueToItemSpell(uint32 spellId, ObjectGuid castItemGuid)
Definition: Unit.cpp:5011
Definition: DBCStructure.h:1196
std::array< uint32, MAX_ITEM_ENCHANTMENT_EFFECTS > AllocationPct
Definition: DBCStructure.h:1203
std::array< uint32, MAX_ITEM_ENCHANTMENT_EFFECTS > Enchantment
Definition: DBCStructure.h:1201
Definition: DBCStructure.h:1817
uint32 EnchantmentCondition
Definition: DBCStructure.h:1829
uint32 amount[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition: DBCStructure.h:1821
uint32 requiredLevel
Definition: DBCStructure.h:1832
uint32 spellid[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition: DBCStructure.h:1823
uint32 requiredSkill
Definition: DBCStructure.h:1830
uint32 requiredSkillValue
Definition: DBCStructure.h:1831
uint32 type[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition: DBCStructure.h:1820

References AddEnchantmentDuration(), ItemRandomSuffixEntry::AllocationPct, SpellItemEnchantmentEntry::amount, ApplyHealthRegenBonus(), ApplyManaRegenBonus(), ApplyRatingMod(), ApplySpellPenetrationBonus(), ApplySpellPowerBonus(), Unit::ApplyStatBuffMod(), BASE_VALUE, Unit::CastCustomSpell(), Unit::CastSpell(), 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, Unit::getClass(), Item::GetEnchantmentDuration(), Item::GetEnchantmentId(), Object::GetGUID(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), Unit::GetLevel(), GetSkillValue(), Item::GetSlot(), Item::GetTemplate(), HandleBaseModValue(), Unit::HandleStatModifier(), Item::IsBroken(), 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)
11667{
11669 return;
11670
11671 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
11672 {
11673 _Spell const& spellData = pItem->GetTemplate()->Spells[i];
11674
11675 // no spell
11676 if (!spellData.SpellId)
11677 continue;
11678
11679 // xinef: apply hidden cooldown for procs
11681 {
11682 // xinef: uint32(-1) special marker for proc cooldowns
11683 AddSpellCooldown(spellData.SpellId, uint32(-1), 30 * IN_MILLISECONDS);
11684 continue;
11685 }
11686
11687 // wrong triggering type (note: ITEM_SPELLTRIGGER_ON_NO_DELAY_USE not have cooldown)
11688 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
11689 continue;
11690
11691 // xinef: dont apply equip cooldown if spell on item has insignificant cooldown
11692 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
11693 if (spellData.SpellCooldown <= 3000 && spellData.SpellCategoryCooldown <= 3000 && (!spellInfo || (spellInfo->RecoveryTime <= 3000 && spellInfo->CategoryRecoveryTime <= 3000)))
11694 continue;
11695
11696 // Don't replace longer cooldowns by equip cooldown if we have any.
11697 SpellCooldowns::iterator itr = m_spellCooldowns.find(spellData.SpellId);
11698 if (itr != m_spellCooldowns.end() && itr->second.itemid == pItem->GetEntry() && itr->second.end > GameTime::GetGameTimeMS().count() + 30 * IN_MILLISECONDS)
11699 continue;
11700
11701 // xinef: dont apply eqiup cooldown for spells with this attribute
11702 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL))
11703 continue;
11704
11705 AddSpellCooldown(spellData.SpellId, pItem->GetEntry(), 30 * IN_MILLISECONDS, true, true);
11706
11708 data << pItem->GetGUID();
11709 data << uint32(spellData.SpellId);
11710 GetSession()->SendPacket(&data);
11711 }
11712}
@ ITEM_SPELLTRIGGER_ON_USE
Definition: ItemTemplate.h:78
@ ITEM_SPELLTRIGGER_ON_EQUIP
Definition: ItemTemplate.h:79
@ ITEM_FLAG_NO_EQUIP_COOLDOWN
Definition: ItemTemplate.h:155
#define MAX_ITEM_PROTO_SPELLS
Definition: ItemTemplate.h:624
@ SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL
Definition: SharedDefines.h:382
@ SMSG_ITEM_COOLDOWN
Definition: Opcodes.h:206
Definition: ItemTemplate.h:599
uint32 SpellTrigger
Definition: ItemTemplate.h:601
int32 SpellCategoryCooldown
Definition: ItemTemplate.h:606
int32 SpellCooldown
Definition: ItemTemplate.h:604
int32 SpellId
Definition: ItemTemplate.h:600
_Spell Spells[MAX_ITEM_PROTO_SPELLS]
Definition: ItemTemplate.h:671
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition: Player.cpp:10983
uint32 RecoveryTime
Definition: SpellInfo.h:346
uint32 CategoryRecoveryTime
Definition: SpellInfo.h:347

References AddSpellCooldown(), SpellInfo::CategoryRecoveryTime, Object::GetEntry(), GameTime::GetGameTimeMS(), Object::GetGUID(), GetSession(), Item::GetTemplate(), SpellInfo::HasAttribute(), Object::HasFlag(), IN_MILLISECONDS, ITEM_FIELD_FLAGS, 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 
)
7043{
7044 if (apply)
7045 {
7046 if (!sScriptMgr->CanApplyEquipSpell(this, spellInfo, item, apply, form_change))
7047 return;
7048
7049 // Cannot be used in this stance/form
7050 if (spellInfo->CheckShapeshift(GetShapeshiftForm()) != SPELL_CAST_OK)
7051 return;
7052
7053 if (form_change) // check aura active state from other form
7054 {
7055 AuraApplicationMapBounds range = GetAppliedAuras().equal_range(spellInfo->Id);
7056 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
7057 if (!item || itr->second->GetBase()->GetCastItemGUID() == item->GetGUID())
7058 return;
7059 }
7060
7061 LOG_DEBUG("entities.player", "WORLD: cast {} Equip spellId - {}", (item ? "item" : "itemset"), spellInfo->Id);
7062
7063 CastSpell(this, spellInfo, true, item);
7064 }
7065 else
7066 {
7067 if (form_change) // check aura compatibility
7068 {
7069 // Cannot be used in this stance/form
7070 if (spellInfo->CheckShapeshift(GetShapeshiftForm()) == SPELL_CAST_OK)
7071 return; // and remove only not compatible at form change
7072 }
7073
7074 if (item)
7075 RemoveAurasDueToItemSpell(spellInfo->Id, item->GetGUID()); // un-apply all spells, not only at-equipped
7076 else
7077 RemoveAurasDueToSpell(spellInfo->Id); // un-apply spell (item set case)
7078
7079 // Xinef: Remove Proc Spells and Summons
7080 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
7081 {
7082 // Xinef: Remove procs
7083 if (spellInfo->Effects[i].TriggerSpell)
7084 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
7085
7086 // Xinef: remove minions summoned by item
7087 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_SUMMON)
7088 RemoveAllMinionsByEntry(spellInfo->Effects[i].MiscValue);
7089 }
7090 }
7091}
@ EFFECT_0
Definition: SharedDefines.h:30
@ SPELL_EFFECT_SUMMON
Definition: SharedDefines.h:778
@ SPELL_CAST_OK
Definition: SharedDefines.h:1110
ShapeshiftForm GetShapeshiftForm() const
Definition: Unit.h:2071
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition: Unit.h:1300
AuraApplicationMap & GetAppliedAuras()
Definition: Unit.h:1924
void RemoveAllMinionsByEntry(uint32 entry)
Definition: Unit.cpp:10818

References Unit::CastSpell(), 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, 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 
)
927{
928 _ModifyUInt32(apply, m_baseHealthRegen, amount);
929}

References _ModifyUInt32(), and m_baseHealthRegen.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplyItemEquipSpell()

void Player::ApplyItemEquipSpell ( Item item,
bool  apply,
bool  form_change = false 
)
6992{
6993 if (!item)
6994 return;
6995
6996 ItemTemplate const* proto = item->GetTemplate();
6997 if (!proto)
6998 return;
6999
7000 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
7001 {
7002 _Spell const& spellData = proto->Spells[i];
7003
7004 // no spell
7005 if (!spellData.SpellId)
7006 continue;
7007
7008 // Spells that should stay on the caster after removing the item.
7009 constexpr std::array<int32, 2> spellExceptions =
7010 {
7011 11826, //Electromagnetic Gigaflux Reactivator
7012 17490 //Book of the Dead - Summon Skeleton
7013 };
7014 const auto found = std::find(std::begin(spellExceptions), std::end(spellExceptions), spellData.SpellId);
7015
7016 // wrong triggering type
7017 if (apply)
7018 {
7020 {
7021 continue;
7022 }
7023 }
7024 else
7025 {
7026 // If the spell is an exception do not remove it.
7027 if (found != std::end(spellExceptions))
7028 {
7029 continue;
7030 }
7031 }
7032
7033 // check if it is valid spell
7034 SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(spellData.SpellId);
7035 if (!spellproto)
7036 continue;
7037
7038 ApplyEquipSpell(spellproto, item, apply, form_change);
7039 }
7040}
void ApplyEquipSpell(SpellInfo const *spellInfo, Item *item, bool apply, bool form_change=false)
Definition: Player.cpp:7042

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 
)
921{
922 _ModifyUInt32(apply, m_baseManaRegen, amount);
924}
void UpdateManaRegen()
Definition: StatSystem.cpp:931

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

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplyRatingMod()

void Player::ApplyRatingMod ( CombatRating  cr,
int32  value,
bool  apply 
)
5162{
5163 float oldRating = m_baseRatingValue[cr];
5164 m_baseRatingValue[cr] += (apply ? value : -value);
5165 // explicit affected values
5166 if (cr == CR_HASTE_MELEE || cr == CR_HASTE_RANGED || cr == CR_HASTE_SPELL)
5167 {
5168 float const mult = GetRatingMultiplier(cr);
5169 float const oldVal = oldRating * mult;
5170 float const newVal = m_baseRatingValue[cr] * mult;
5171 switch (cr)
5172 {
5173 case CR_HASTE_MELEE:
5174 ApplyAttackTimePercentMod(BASE_ATTACK, oldVal, false);
5175 ApplyAttackTimePercentMod(OFF_ATTACK, oldVal, false);
5178 break;
5179 case CR_HASTE_RANGED:
5182 break;
5183 case CR_HASTE_SPELL:
5184 ApplyCastTimePercentMod(oldVal, false);
5185 ApplyCastTimePercentMod(newVal, true);
5186 break;
5187 default:
5188 break;
5189 }
5190 }
5191
5192 UpdateRating(cr);
5193}
float GetRatingMultiplier(CombatRating cr) const
Definition: Player.cpp:5084
void UpdateRating(CombatRating cr)
Definition: PlayerUpdates.cpp:574
void ApplyAttackTimePercentMod(WeaponAttackType att, float val, bool apply)
Definition: Unit.cpp:17225
void ApplyCastTimePercentMod(float val, bool apply)
Definition: Unit.cpp:17241

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 
)
9628{
9629 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9630 if (!spellInfo)
9631 {
9632 return;
9633 }
9634
9635 float totalmul = 1.0f;
9636 int32 totalflat = 0;
9637
9638 auto calculateSpellMod = [&](SpellModifier* mod)
9639 {
9640 // xinef: temporary pets cannot use charged mods of owner, needed for mirror image QQ they should use their own auras
9641 if (temporaryPet && mod->charges != 0)
9642 {
9643 return;
9644 }
9645
9646 if (mod->type == SPELLMOD_FLAT)
9647 {
9648 // xinef: do not allow to consume more than one 100% crit increasing spell
9649 if (mod->op == SPELLMOD_CRITICAL_CHANCE && totalflat >= 100)
9650 {
9651 return;
9652 }
9653
9654 int32 flatValue = mod->value;
9655
9656 // SPELL_MOD_THREAT - divide by 100 (in packets we send threat * 100)
9657 if (mod->op == SPELLMOD_THREAT)
9658 {
9659 flatValue /= 100;
9660 }
9661
9662 totalflat += flatValue;
9663 }
9664 else if (mod->type == SPELLMOD_PCT)
9665 {
9666 // skip percent mods for null basevalue (most important for spell mods with charges)
9667 if (basevalue == T(0) || totalmul == 0.0f)
9668 {
9669 return;
9670 }
9671
9672 // special case (skip > 10sec spell casts for instant cast setting)
9673 if (mod->op == SPELLMOD_CASTING_TIME && basevalue >= T(10000) && mod->value <= -100)
9674 {
9675 return;
9676 }
9677 // xinef: special exception for surge of light, dont affect crit chance if previous mods were not applied
9678 else if (mod->op == SPELLMOD_CRITICAL_CHANCE && spell && !HasSpellMod(mod, spell))
9679 {
9680 return;
9681 }
9682 // xinef: special case for backdraft gcd reduce with backlast time reduction, dont affect gcd if cast time was not applied
9683 else if (mod->op == SPELLMOD_GLOBAL_COOLDOWN && spell && !HasSpellMod(mod, spell))
9684 {
9685 return;
9686 }
9687
9688 // xinef: those two mods should be multiplicative (Glyph of Renew)
9689 if (mod->op == SPELLMOD_DAMAGE || mod->op == SPELLMOD_DOT)
9690 {
9691 totalmul *= CalculatePct(1.0f, 100.0f + mod->value);
9692 }
9693 else
9694 {
9695 totalmul += CalculatePct(1.0f, mod->value);
9696 }
9697 }
9698
9699 DropModCharge(mod, spell);
9700 };
9701
9702 // Drop charges for triggering spells instead of triggered ones
9704 {
9705 spell = m_spellModTakingSpell;
9706 }
9707
9708 SpellModifier* chargedMod = nullptr;
9709 for (auto mod : m_spellMods[op])
9710 {
9711 // Charges can be set only for mods with auras
9712 if (!mod->ownerAura)
9713 {
9714 ASSERT(!mod->charges);
9715 }
9716
9717 if (!IsAffectedBySpellmod(spellInfo, mod, spell))
9718 {
9719 continue;
9720 }
9721
9722 if (mod->ownerAura->IsUsingCharges())
9723 {
9724 if (!chargedMod || (chargedMod->ownerAura->GetSpellInfo()->SpellPriority < mod->ownerAura->GetSpellInfo()->SpellPriority))
9725 {
9726 chargedMod = mod;
9727 }
9728
9729 continue;
9730 }
9731
9732 calculateSpellMod(mod);
9733 }
9734
9735 if (chargedMod)
9736 {
9737 calculateSpellMod(chargedMod);
9738 }
9739
9740 float diff = 0.0f;
9741 if (op == SPELLMOD_CASTING_TIME || op == SPELLMOD_DURATION)
9742 {
9743 diff = ((float)basevalue + totalflat) * (totalmul - 1.0f) + (float)totalflat;
9744 }
9745 else
9746 {
9747 diff = (float)basevalue * (totalmul - 1.0f) + (float)totalflat;
9748 }
9749
9750 basevalue = T((float)basevalue + diff);
9751}
T CalculatePct(T base, U pct)
Definition: Util.h:61
@ SPELLMOD_PCT
Definition: Player.h:95
@ 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
Definition: Player.h:182
void DropModCharge(SpellModifier *mod, Spell *spell)
Definition: Player.cpp:9964
bool HasSpellMod(SpellModifier *mod, Spell *spell)
Definition: Player.cpp:9602
bool IsAffectedBySpellmod(SpellInfo const *spellInfo, SpellModifier *mod, Spell *spell=nullptr)
Definition: Player.cpp:9610
SpellInfo const * GetSpellInfo() const
Definition: SpellAuras.h:100
uint32 SpellPriority
Definition: SpellInfo.h:380

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:256

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)
1776{
1777 if (questId)
1778 {
1779 uint16 log_slot = FindQuestSlot(questId);
1780 QuestStatusData* q_status = nullptr;
1781 if (log_slot < MAX_QUEST_LOG_SIZE)
1782 {
1783 q_status = &m_QuestStatus[questId];
1784
1785 // xinef: added failed check
1786 if (!q_status->Explored && q_status->Status != QUEST_STATUS_FAILED)
1787 {
1788 q_status->Explored = true;
1789 m_QuestStatusSave[questId] = true;
1790
1791 SendQuestComplete(questId);
1792 }
1793 }
1794 if (CanCompleteQuest(questId, q_status))
1795 CompleteQuest(questId);
1796 else
1798 }
1799}
@ ADDITIONAL_SAVING_QUEST_STATUS
Definition: Player.h:985
void SendQuestComplete(uint32 quest_id)
Definition: PlayerQuest.cpp:2330
void AdditionalSavingAddMask(uint8 mask)
Definition: Player.h:2521

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(), GroupEventHappens(), WorldSession::HandleAreaTriggerOpcode(), boss_alar::boss_alarAI::JustDied(), 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(), go_ahune_ice_stone::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
1282{ 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:13380

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 
)
13381{
13382 Loot loot;
13383 loot.FillLoot (loot_id, store, this, true);
13384
13385 uint32 max_slot = loot.GetMaxSlotInLootFor(this);
13386 for (uint32 i = 0; i < max_slot; ++i)
13387 {
13388 LootItem* lootItem = loot.LootItemInSlot(i, this);
13389
13390 ItemPosCountVec dest;
13391 InventoryResult msg = CanStoreNewItem(bag, slot, dest, lootItem->itemid, lootItem->count);
13392 if (msg != EQUIP_ERR_OK && slot != NULL_SLOT)
13393 msg = CanStoreNewItem(bag, NULL_SLOT, dest, lootItem->itemid, lootItem->count);
13394 if (msg != EQUIP_ERR_OK && bag != NULL_BAG)
13395 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, lootItem->itemid, lootItem->count);
13396 if (msg != EQUIP_ERR_OK)
13397 {
13398 SendEquipError(msg, nullptr, nullptr, lootItem->itemid);
13399 continue;
13400 }
13401
13402 Item* pItem = StoreNewItem(dest, lootItem->itemid, true, lootItem->randomPropertyId);
13403 SendNewItem(pItem, lootItem->count, false, false, broadcast);
13404 }
13405}
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:893
LootItem * LootItemInSlot(uint32 lootslot, Player *player, QuestItem **qitem=nullptr, QuestItem **ffaitem=nullptr, QuestItem **conditem=nullptr)
Definition: LootMgr.cpp:828
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:553

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)
12365{
12367 if (!offItem)
12368 {
12370 return;
12371 }
12372
12373 // unequip offhand weapon if player doesn't have dual wield anymore
12375 force = true;
12376
12377 // need unequip offhand for 2h-weapon without TitanGrip (in any from hands)
12378 if (!force && (CanTitanGrip() || (offItem->GetTemplate()->InventoryType != INVTYPE_2HWEAPON && !IsTwoHandUsed())))
12379 {
12381 return;
12382 }
12383
12384 ItemPosCountVec off_dest;
12385 uint8 off_msg = CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false);
12386 if (off_msg == EQUIP_ERR_OK)
12387 {
12389 StoreItem(off_dest, offItem, true);
12390 }
12391 else
12392 {
12394 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
12395 offItem->DeleteFromInventoryDB(trans); // deletes item from character's inventory
12396 offItem->SaveToDB(trans); // recursive and not have transaction guard into self, item not in inventory and can be save standalone
12397
12398 std::string subject = GetSession()->GetAcoreString(LANG_NOT_EQUIPPED_ITEM);
12399 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);
12400
12401 CharacterDatabase.CommitTransaction(trans);
12402 }
12404}
@ INVTYPE_WEAPON
Definition: ItemTemplate.h:278
@ INVTYPE_WEAPONOFFHAND
Definition: ItemTemplate.h:287
@ INVTYPE_2HWEAPON
Definition: ItemTemplate.h:282
uint32 InventoryType
Definition: ItemTemplate.h:641
bool CanTitanGrip() const
Definition: Player.h:2136
bool IsTwoHandUsed() const
Definition: Player.h:1331
void MoveItemFromInventory(uint8 bag, uint8 slot, bool update)
Definition: PlayerStorage.cpp:3006
void RemoveItem(uint8 bag, uint8 slot, bool update, bool swap=false)
Definition: PlayerStorage.cpp:2927
void UpdateTitansGrip()
Definition: PlayerUpdates.cpp:1795
bool CanDualWield() const
Definition: Unit.h:1345
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 ( )
6530{
6531 InstanceSave* mapSave = sInstanceSaveMgr->GetInstanceSave(_pendingBindId);
6532 if (!mapSave) //it seems sometimes mapSave is nullptr, but I did not check why
6533 return;
6534
6536 data << uint32(0);
6537 GetSession()->SendPacket(&data);
6538 sInstanceSaveMgr->PlayerBindToInstance(this->GetGUID(), mapSave, true, this);
6539}
#define sInstanceSaveMgr
Definition: InstanceSaveMgr.h:202
@ SMSG_INSTANCE_SAVE_CREATED
Definition: Opcodes.h:745
uint32 _pendingBindId
Definition: Player.h:2922
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 
) const
overridevirtual

Reimplemented from Object.

3757{
3758 if (target == this)
3759 {
3760 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
3761 {
3762 if (!m_items[i])
3763 continue;
3764
3765 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3766 }
3767
3769 {
3770 if (!m_items[i])
3771 continue;
3772
3773 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3774 }
3776 {
3777 if (!m_items[i])
3778 continue;
3779
3780 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3781 }
3782 }
3783
3785}
@ KEYRING_SLOT_START
Definition: Player.h:731
@ BANK_SLOT_BAG_END
Definition: Player.h:719
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) const
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)
14317{
14318 uint32 slotUsedMask = 0;
14319 size_t slotUsedMaskPos = data->wpos();
14320 *data << uint32(slotUsedMask); // slotUsedMask < 0x80000
14321
14322 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14323 {
14325
14326 if (!item)
14327 continue;
14328
14329 slotUsedMask |= (1 << i);
14330
14331 *data << uint32(item->GetEntry()); // item entry
14332
14333 uint16 enchantmentMask = 0;
14334 size_t enchantmentMaskPos = data->wpos();
14335 *data << uint16(enchantmentMask); // enchantmentMask < 0x1000
14336
14337 for (uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
14338 {
14339 uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(j));
14340
14341 if (!enchId)
14342 continue;
14343
14344 enchantmentMask |= (1 << j);
14345
14346 *data << uint16(enchId); // enchantmentId?
14347 }
14348
14349 data->put<uint16>(enchantmentMaskPos, enchantmentMask);
14350
14351 *data << int16(item->GetItemRandomPropertyId()); // item random property id
14352 *data << item->GetGuidValue(ITEM_FIELD_CREATOR).WriteAsPacked(); // item creator
14353 *data << uint32(item->GetItemSuffixFactor()); // item suffix factor
14354 }
14355
14356 data->put<uint32>(slotUsedMaskPos, slotUsedMask);
14357}
@ ITEM_FIELD_CREATOR
Definition: UpdateFields.h:37
ObjectGuid GetGuidValue(uint16 index) const
Definition: Object.cpp:337
PackedGuid WriteAsPacked() const
Definition: ObjectGuid.h:318
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
1079{
1080 // 0 1 2 3 4 5 6 7
1081 // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.skin, characters.face, characters.hairStyle,
1082 // 8 9 10 11 12 13 14 15
1083 // characters.hairColor, characters.facialStyle, character.level, characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z,
1084 // 16 17 18 19 20 21 22 23
1085 // guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, character_banned.guid,
1086 // 24 25
1087 // characters.extra_flags, character_declinedname.genitive
1088
1089 Field* fields = result->Fetch();
1090
1091 ObjectGuid::LowType guidLow = fields[0].Get<uint32>();
1092 uint8 plrRace = fields[2].Get<uint8>();
1093 uint8 plrClass = fields[3].Get<uint8>();
1094 uint8 gender = fields[4].Get<uint8>();
1095
1096 ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>(guidLow);
1097
1098 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(plrRace, plrClass);
1099 if (!info)
1100 {
1101 LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Don't build enum.", guid.ToString());
1102 return false;
1103 }
1104 else if (!IsValidGender(gender))
1105 {
1106 LOG_ERROR("entities.player", "Player ({}) has incorrect gender ({}), don't build enum.", guid.ToString(), gender);
1107 return false;
1108 }
1109
1110 *data << guid;
1111 *data << fields[1].Get<std::string>(); // name
1112 *data << uint8(plrRace); // race
1113 *data << uint8(plrClass); // class
1114 *data << uint8(gender); // gender
1115
1116 uint8 skin = fields[5].Get<uint8>();
1117 uint8 face = fields[6].Get<uint8>();
1118 uint8 hairStyle = fields[7].Get<uint8>();
1119 uint8 hairColor = fields[8].Get<uint8>();
1120 uint8 facialStyle = fields[9].Get<uint8>();
1121
1122 uint32 charFlags = 0;
1123 uint32 playerFlags = fields[17].Get<uint32>();
1124 uint16 atLoginFlags = fields[18].Get<uint16>();
1125 uint32 zone = (atLoginFlags & AT_LOGIN_FIRST) != 0 ? 0 : fields[11].Get<uint16>(); // if first login do not show the zone
1126
1127 *data << uint8(skin);
1128 *data << uint8(face);
1129 *data << uint8(hairStyle);
1130 *data << uint8(hairColor);
1131 *data << uint8(facialStyle);
1132
1133 *data << uint8(fields[10].Get<uint8>()); // level
1134 *data << uint32(zone); // zone
1135 *data << uint32(fields[12].Get<uint16>()); // map
1136
1137 *data << fields[13].Get<float>(); // x
1138 *data << fields[14].Get<float>(); // y
1139 *data << fields[15].Get<float>(); // z
1140
1141 *data << uint32(fields[16].Get<uint32>()); // guild id
1142
1143 if (atLoginFlags & AT_LOGIN_RESURRECT)
1144 playerFlags &= ~PLAYER_FLAGS_GHOST;
1145 if (playerFlags & PLAYER_FLAGS_HIDE_HELM)
1146 charFlags |= CHARACTER_FLAG_HIDE_HELM;
1147 if (playerFlags & PLAYER_FLAGS_HIDE_CLOAK)
1148 charFlags |= CHARACTER_FLAG_HIDE_CLOAK;
1149 if (playerFlags & PLAYER_FLAGS_GHOST)
1150 charFlags |= CHARACTER_FLAG_GHOST;
1151 if (atLoginFlags & AT_LOGIN_RENAME)
1152 charFlags |= CHARACTER_FLAG_RENAME;
1153 if (fields[23].Get<uint32>())
1155 if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED))
1156 {
1157 if (!fields[25].Get<std::string>().empty())
1158 charFlags |= CHARACTER_FLAG_DECLINED;
1159 }
1160 else
1161 charFlags |= CHARACTER_FLAG_DECLINED;
1162
1163 *data << uint32(charFlags); // character flags
1164
1165 // character customize flags
1166 if (atLoginFlags & AT_LOGIN_CUSTOMIZE)
1168 else if (atLoginFlags & AT_LOGIN_CHANGE_FACTION)
1170 else if (atLoginFlags & AT_LOGIN_CHANGE_RACE)
1172 else
1174
1175 // First login
1176 *data << uint8(atLoginFlags & AT_LOGIN_FIRST ? 1 : 0);
1177
1178 // Pets info
1179 uint32 petDisplayId = 0;
1180 uint32 petLevel = 0;
1181 uint32 petFamily = 0;
1182
1183 // show pet at selection character in character list only for non-ghost character
1184 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))))
1185 {
1186 uint32 entry = fields[19].Get<uint32>();
1187 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(entry);
1188 if (creatureInfo)
1189 {
1190 petDisplayId = fields[20].Get<uint32>();
1191 petLevel = fields[21].Get<uint16>();
1192 petFamily = creatureInfo->family;
1193 }
1194 }
1195
1196 *data << uint32(petDisplayId);
1197 *data << uint32(petLevel);
1198 *data << uint32(petFamily);
1199
1200 std::vector<std::string_view> equipment = Acore::Tokenize(fields[22].Get<std::string_view>(), ' ', false);
1201 for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot)
1202 {
1203 uint32 const visualBase = slot * 2;
1204 Optional<uint32> itemId;
1205
1206 if (visualBase < equipment.size())
1207 {
1208 itemId = Acore::StringTo<uint32>(equipment[visualBase]);
1209 }
1210
1211 ItemTemplate const* proto = nullptr;
1212 if (itemId)
1213 {
1214 proto = sObjectMgr->GetItemTemplate(*itemId);
1215 }
1216
1217 if (!proto)
1218 {
1219 if (!itemId || *itemId)
1220 {
1221 LOG_WARN("entities.player.loading", "Player {} has invalid equipment '{}' in `equipmentcache` at index {}. Skipped.",
1222 guid.ToString(), (visualBase < equipment.size()) ? equipment[visualBase] : "<none>", visualBase);
1223 }
1224
1225 *data << uint32(0);
1226 *data << uint8(0);
1227 *data << uint32(0);
1228
1229 continue;
1230 }
1231
1232 SpellItemEnchantmentEntry const* enchant = nullptr;
1233
1234 Optional<uint32> enchants = {};
1235 if ((visualBase + 1) < equipment.size())
1236 {
1237 enchants = Acore::StringTo<uint32>(equipment[visualBase + 1]);
1238 }
1239
1240 if (!enchants)
1241 {
1242 LOG_WARN("entities.player.loading", "Player {} has invalid enchantment info '{}' in `equipmentcache` at index {}. Skipped.",
1243 guid.ToString(), ((visualBase + 1) < equipment.size()) ? equipment[visualBase + 1] : "<none>", visualBase + 1);
1244
1245 enchants = 0;
1246 }
1247
1248 for (uint8 enchantSlot = PERM_ENCHANTMENT_SLOT; enchantSlot <= TEMP_ENCHANTMENT_SLOT; ++enchantSlot)
1249 {
1250 // values stored in 2 uint16
1251 uint32 enchantId = 0x0000FFFF & ((*enchants) >> enchantSlot * 16);
1252 if (!enchantId)
1253 {
1254 continue;
1255 }
1256
1257 enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId);
1258 if (enchant)
1259 {
1260 break;
1261 }
1262 }
1263
1264 *data << uint32(proto->DisplayInfoID);
1265 *data << uint8(proto->InventoryType);
1266 *data << uint32(enchant ? enchant->aura_id : 0);
1267 }
1268
1269 return true;
1270}
@ CHAR_CUSTOMIZE_FLAG_RACE
Definition: Player.cpp:140
@ CHAR_CUSTOMIZE_FLAG_NONE
Definition: Player.cpp:137
@ CHAR_CUSTOMIZE_FLAG_FACTION
Definition: Player.cpp:139
@ CHAR_CUSTOMIZE_FLAG_CUSTOMIZE
Definition: Player.cpp:138
@ CHARACTER_FLAG_GHOST
Definition: Player.cpp:114
@ CHARACTER_FLAG_DECLINED
Definition: Player.cpp:126
@ CHARACTER_FLAG_HIDE_HELM
Definition: Player.cpp:111
@ CHARACTER_FLAG_HIDE_CLOAK
Definition: Player.cpp:112
@ CHARACTER_FLAG_LOCKED_BY_BILLING
Definition: Player.cpp:125
@ CHARACTER_FLAG_RENAME
Definition: Player.cpp:115
@ PLAYER_EXTRA_SHOW_DK_PET
Definition: Player.h:594
@ PLAYER_FLAGS_HIDE_CLOAK
Definition: Player.h:486
@ PLAYER_FLAGS_GHOST
Definition: Player.h:479
@ PLAYER_FLAGS_HIDE_HELM
Definition: Player.h:485
@ AT_LOGIN_FIRST
Definition: Player.h:606
@ AT_LOGIN_RESURRECT
Definition: Player.h:612
@ AT_LOGIN_CUSTOMIZE
Definition: Player.h:604
@ AT_LOGIN_RENAME
Definition: Player.h:601
@ AT_LOGIN_CHANGE_RACE
Definition: Player.h:608
@ AT_LOGIN_CHANGE_FACTION
Definition: Player.h:607
@ CONFIG_DECLINED_NAMES_USED
Definition: IWorld.h:112
@ CLASS_HUNTER
Definition: SharedDefines.h:115
@ CLASS_WARLOCK
Definition: SharedDefines.h:121
Definition: CreatureData.h:176
uint32 DisplayInfoID
Definition: ItemTemplate.h:634
static bool IsValidGender(uint8 Gender)
Definition: Player.h:1536
uint32 aura_id
Definition: DBCStructure.h:1826

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)
14234{
14235 uint32 unspentTalentPoints = 0;
14236 size_t pointsPos = data->wpos();
14237 *data << uint32(unspentTalentPoints); // [PH], unspentTalentPoints
14238
14239 uint8 talentIdCount = 0;
14240 size_t countPos = data->wpos();
14241 *data << uint8(talentIdCount); // [PH], talentIdCount
14242
14243 Pet* pet = GetPet();
14244 if (!pet)
14245 return;
14246
14247 unspentTalentPoints = pet->GetFreeTalentPoints();
14248
14249 data->put<uint32>(pointsPos, unspentTalentPoints); // put real points
14250
14251 CreatureTemplate const* ci = pet->GetCreatureTemplate();
14252 if (!ci)
14253 return;
14254
14255 CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
14256 if (!pet_family || pet_family->petTalentType < 0)
14257 return;
14258
14259 for (uint32 talentTabId = 1; talentTabId < sTalentTabStore.GetNumRows(); ++talentTabId)
14260 {
14261 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentTabId);
14262 if (!talentTabInfo)
14263 continue;
14264
14265 if (!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
14266 continue;
14267
14268 for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
14269 {
14270 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14271 if (!talentInfo)
14272 continue;
14273
14274 // skip another tab talents
14275 if (talentInfo->TalentTab != talentTabId)
14276 continue;
14277
14278 // find max talent rank (0~4)
14279 int8 curtalent_maxrank = -1;
14280 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
14281 {
14282 if (talentInfo->RankID[rank] && pet->HasSpell(talentInfo->RankID[rank]))
14283 {
14284 curtalent_maxrank = rank;
14285 break;
14286 }
14287 }
14288
14289 // not learned talent
14290 if (curtalent_maxrank < 0)
14291 continue;
14292
14293 *data << uint32(talentInfo->TalentID); // Talent.dbc
14294 *data << uint8(curtalent_maxrank); // talentMaxRank (0-4)
14295
14296 ++talentIdCount;
14297 }
14298
14299 data->put<uint8>(countPos, talentIdCount); // put real count
14300
14301 break;
14302 }
14303}
std::int8_t int8
Definition: Define.h:106
DBCStorage< TalentTabEntry > sTalentTabStore(TalentTabEntryfmt)
DBCStorage< CreatureFamilyEntry > sCreatureFamilyStore(CreatureFamilyfmt)
#define MAX_TALENT_RANK
Definition: DBCStructure.h:1894
CreatureTemplate const * GetCreatureTemplate() const
Definition: Creature.h:197
uint8 GetFreeTalentPoints()
Definition: Pet.h:130
bool HasSpell(uint32 spell) const override
Definition: Pet.cpp:2283
Definition: DBCStructure.h:754
int32 petTalentType
Definition: DBCStructure.h:762
uint32 TalentTab
Definition: DBCStructure.h:1901
Definition: DBCStructure.h:1916
uint32 petTalentMask
Definition: DBCStructure.h:1923

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 ( )
4327{
4329 data << GetPackGUID();
4330 GetSession()->SendPacket(&data);
4331 if (getRace(true) == RACE_NIGHTELF)
4332 {
4333 CastSpell(this, 20584, true);
4334 }
4335 CastSpell(this, 8326, true);
4336
4337 // there must be SMSG.FORCE_RUN_SPEED_CHANGE, SMSG.FORCE_SWIM_SPEED_CHANGE, SMSG.MOVE_WATER_WALK
4338 // there must be SMSG.STOP_MIRROR_TIMER
4339
4340 // the player cannot have a corpse already on current map, only bones which are not returned by GetCorpse
4341 WorldLocation corpseLocation = GetCorpseLocation();
4342 if (GetCorpse() && corpseLocation.GetMapId() == GetMapId())
4343 {
4344 LOG_ERROR("entities.player", "BuildPlayerRepop: player {} ({}) already has a corpse", GetName(), GetGUID().ToString());
4345 return;
4346 }
4347
4348 // create a corpse and place it at the player's location
4349 Corpse* corpse = CreateCorpse();
4350 if (!corpse)
4351 {
4352 LOG_ERROR("entities.player", "Error creating corpse for Player {} [{}]", GetName(), GetGUID().ToString());
4353 return;
4354 }
4355 GetMap()->AddToMap(corpse);
4356 SetHealth(1); // convert player body to ghost
4358 SetWaterWalking(true);
4359 if (!GetSession()->isLogingOut())
4360 {
4362 }
4363 RemoveUnitFlag(UNIT_FLAG_SKINNABLE); // BG - remove insignia related
4364 int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
4365 if (corpseReclaimDelay >= 0)
4366 {
4367 SendCorpseReclaimDelay(corpseReclaimDelay);
4368 }
4369 corpse->ResetGhostTime(); // to prevent cheating
4370 StopMirrorTimers(); // disable timers on bars
4372 sScriptMgr->OnPlayerReleasedGhost(this);
4373}
@ UNIT_FIELD_BYTES_1
Definition: UpdateFields.h:131
@ MOVE_UNROOT
Definition: Player.h:458
@ MOVE_WATER_WALK
Definition: Player.h:459
@ UNIT_BYTE1_FLAG_ALWAYS_STAND
Definition: Unit.h:80
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition: Unit.h:47
@ UNIT_FLAG_SKINNABLE
Definition: Unit.h:474
@ RACE_NIGHTELF
Definition: SharedDefines.h:73
@ SMSG_PRE_RESURRECT
Definition: Opcodes.h:1202
Definition: Corpse.h:49
void ResetGhostTime()
Definition: Corpse.cpp:196
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:750
PackedGuid const & GetPackGUID() const
Definition: Object.h:108
Map * GetMap() const
Definition: Object.h:517
void SendCorpseReclaimDelay(uint32 delay)
Definition: Player.cpp:12870
void StopMirrorTimers()
Definition: Player.h:2006
WorldLocation GetCorpseLocation() const
Definition: Player.h:1990
Corpse * GetCorpse() const
Definition: Player.cpp:4607
bool SetWaterWalking(bool apply, bool packetOnly=false) override
Definition: Player.cpp:15844
int32 CalculateCorpseReclaimDelay(bool load=false)
Definition: Player.cpp:12829
Corpse * CreateCorpse()
Definition: Player.cpp:4492
void SetMovement(PlayerMovementType pType)
Definition: Player.cpp:4296
void SetHealth(uint32 val)
Definition: Unit.cpp:15370
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:1482
bool AddToMap(T *, bool checkTransport=false)
Definition: Map.cpp:557

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)
14200{
14201 *data << uint32(GetFreeTalentPoints()); // unspentTalentPoints
14202 *data << uint8(m_specsCount); // talent group count (0, 1 or 2)
14203 *data << uint8(m_activeSpec); // talent group index (0 or 1)
14204
14207
14208 for (uint32 specIdx = 0; specIdx < m_specsCount; ++specIdx)
14209 {
14210 uint8 talentIdCount = 0;
14211 size_t pos = data->wpos();
14212 *data << uint8(talentIdCount); // [PH], talentIdCount
14213
14214 const PlayerTalentMap& talentMap = GetTalentMap();
14215 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
14216 if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first))
14217 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(specIdx)) // pussywizard
14218 {
14219 *data << uint32(talentPos->talent_id); // Talent.dbc
14220 *data << uint8(talentPos->rank); // talentMaxRank (0-4)
14221 ++talentIdCount;
14222 }
14223
14224 data->put<uint8>(pos, talentIdCount); // put real count
14225
14226 *data << uint8(MAX_GLYPH_SLOT_INDEX); // glyphs count
14227
14228 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
14229 *data << uint16(m_Glyphs[specIdx][i]); // GlyphProperties.dbc
14230 }
14231}
std::unordered_map< uint32, PlayerTalent * > PlayerTalentMap
Definition: Player.h:193
uint32 GetFreeTalentPoints() const
Definition: Player.h:1672
const PlayerTalentMap & GetTalentMap() const
Definition: Player.h:2557

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 
)
10607{
10608 sScriptMgr->OnBeforeBuyItemFromVendor(this, vendorguid, vendorslot, item, count, bag, slot);
10609
10610 // this check can be used from the hook to implement a custom vendor process
10611 if (item == 0)
10612 return true;
10613
10614 // cheating attempt
10615 if (count < 1) count = 1;
10616
10617 // cheating attempt
10618 if (slot > MAX_BAG_SIZE && slot != NULL_SLOT)
10619 return false;
10620
10621 if (!IsAlive())
10622 return false;
10623
10624 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
10625 if (!pProto)
10626 {
10627 SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);
10628 return false;
10629 }
10630
10631 if (!(pProto->AllowableClass & getClassMask()) && pProto->Bonding == BIND_WHEN_PICKED_UP && !IsGameMaster())
10632 {
10633 SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);
10634 return false;
10635 }
10636
10638 {
10639 return false;
10640 }
10641
10642 Creature* creature = GetNPCIfCanInteractWith(vendorguid, UNIT_NPC_FLAG_VENDOR);
10643 if (!creature)
10644 {
10645 LOG_DEBUG("network", "WORLD: BuyItemFromVendor - Unit ({}) not found or you can't interact with him.", vendorguid.ToString());
10646 SendBuyError(BUY_ERR_DISTANCE_TOO_FAR, nullptr, item, 0);
10647 return false;
10648 }
10649
10650 ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), item);
10651 if (!sConditionMgr->IsObjectMeetToConditions(this, creature, conditions))
10652 {
10653 //LOG_DEBUG("condition", "BuyItemFromVendor: conditions not met for creature entry {} item {}", creature->GetEntry(), item);
10654 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10655 return false;
10656 }
10657
10658 VendorItemData const* vItems = GetSession()->GetCurrentVendor() ? sObjectMgr->GetNpcVendorItemList(GetSession()->GetCurrentVendor()) : creature->GetVendorItems();
10659 if (!vItems || vItems->Empty())
10660 {
10661 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10662 return false;
10663 }
10664
10665 if (vendorslot >= vItems->GetItemCount())
10666 {
10667 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10668 return false;
10669 }
10670
10671 VendorItem const* crItem = vItems->GetItem(vendorslot);
10672 // store diff item (cheating)
10673 if (!crItem || crItem->item != item)
10674 {
10675 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10676 return false;
10677 }
10678
10679 // check current item amount if it limited
10680 if (crItem->maxcount != 0)
10681 {
10682 if (creature->GetVendorItemCurrentCount(crItem) < pProto->BuyCount * count)
10683 {
10684 SendBuyError(BUY_ERR_ITEM_ALREADY_SOLD, creature, item, 0);
10685 return false;
10686 }
10687 }
10688
10690 {
10691 SendBuyError(BUY_ERR_REPUTATION_REQUIRE, creature, item, 0);
10692 return false;
10693 }
10694
10695 if (crItem->ExtendedCost)
10696 {
10697 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost);
10698 if (!iece)
10699 {
10700 LOG_ERROR("entities.player", "Item {} have wrong ExtendedCost field value {}", pProto->ItemId, crItem->ExtendedCost);
10701 return false;
10702 }
10703
10704 // honor points price
10705 if (GetHonorPoints() < (iece->reqhonorpoints * count))
10706 {
10708 return false;
10709 }
10710
10711 // arena points price
10712 if (GetArenaPoints() < (iece->reqarenapoints * count))
10713 {
10715 return false;
10716 }
10717
10718 // item base price
10719 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
10720 {
10721 if (iece->reqitem[i] && !HasItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count)))
10722 {
10724 return false;
10725 }
10726 }
10727
10728 // check for personal arena rating requirement
10730 {
10731 // probably not the proper equip err
10732 SendEquipError(EQUIP_ERR_CANT_EQUIP_RANK, nullptr, nullptr);
10733 return false;
10734 }
10735 }
10736
10737 uint32 price = 0;
10738 if (crItem->IsGoldRequired(pProto) && pProto->BuyPrice > 0) //Assume price cannot be negative (do not know why it is int32)
10739 {
10740 uint32 maxCount = MAX_MONEY_AMOUNT / pProto->BuyPrice;
10741 if ((uint32)count > maxCount)
10742 {
10743 LOG_ERROR("entities.player", "Player {} tried to buy {} item id {}, causing overflow", GetName(), (uint32)count, pProto->ItemId);
10744 count = (uint8)maxCount;
10745 }
10746 price = pProto->BuyPrice * count; //it should not exceed MAX_MONEY_AMOUNT
10747
10748 // reputation discount
10749 price = uint32(floor(price * GetReputationPriceDiscount(creature)));
10750
10751 if (!HasEnoughMoney(price))
10752 {
10753 SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, item, 0);
10754 return false;
10755 }
10756 }
10757
10758 if ((bag == NULL_BAG && slot == NULL_SLOT) || IsInventoryPos(bag, slot))
10759 {
10760 if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, true))
10761 return false;
10762 }
10763 else if (IsEquipmentPos(bag, slot))
10764 {
10765 if (pProto->BuyCount * count != 1)
10766 {
10768 return false;
10769 }
10770 if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, false))
10771 return false;
10772 }
10773 else
10774 {
10776 return false;
10777 }
10778
10779 return crItem->maxcount != 0;
10780}
#define sConditionMgr
Definition: ConditionMgr.h:289
std::list< Condition * > ConditionList
Definition: ConditionMgr.h:236
#define MAX_BAG_SIZE
Definition: Bag.h:22
@ BUY_ERR_CANT_FIND_ITEM
Definition: Item.h:135
@ BUY_ERR_DISTANCE_TOO_FAR
Definition: Item.h:139
@ BUY_ERR_NOT_ENOUGHT_MONEY
Definition: Item.h:137
@ BUY_ERR_REPUTATION_REQUIRE
Definition: Item.h:143
@ BUY_ERR_ITEM_ALREADY_SOLD
Definition: Item.h:136
@ EQUIP_ERR_CANT_EQUIP_RANK
Definition: Item.h:104
@ EQUIP_ERR_ITEM_CANT_BE_EQUIPPED
Definition: Item.h:61
@ EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS
Definition: Item.h:110
@ EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT
Definition: Item.h:44
@ EQUIP_ERR_VENDOR_MISSING_TURNINS
Definition: Item.h:109
@ EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS
Definition: Item.h:111
@ ITEM_FLAGS_EXTRA_ALLIANCE_ONLY
Definition: ItemTemplate.h:221
@ ITEM_FLAGS_EXTRA_HORDE_ONLY
Definition: ItemTemplate.h:220
#define MAX_MONEY_AMOUNT
Definition: Player.h:922
@ UNIT_NPC_FLAG_VENDOR
Definition: Unit.h:523
@ TEAM_ALLIANCE
Definition: SharedDefines.h:732
@ TEAM_HORDE
Definition: SharedDefines.h:733
Definition: Creature.h:46
VendorItemData const * GetVendorItems() const
Definition: Creature.cpp:2956
uint32 GetVendorItemCurrentCount(VendorItem const *vItem)
Definition: Creature.cpp:2961
Definition: CreatureData.h:443
uint32 ExtendedCost
Definition: CreatureData.h:450
bool IsGoldRequired(ItemTemplate const *pProto) const
Definition: CreatureData.h:453
uint32 item
Definition: CreatureData.h:447
uint32 maxcount
Definition: CreatureData.h:448
Definition: CreatureData.h:458
VendorItem * GetItem(uint32 slot) const
Definition: CreatureData.h:461
bool Empty() const
Definition: CreatureData.h:468
uint8 GetItemCount() const
Definition: CreatureData.h:469
uint32 BuyCount
Definition: ItemTemplate.h:638
uint32 AllowableClass
Definition: ItemTemplate.h:642
int32 BuyPrice
Definition: ItemTemplate.h:639
uint32 RequiredReputationRank
Definition: ItemTemplate.h:652
uint32 RequiredReputationFaction
Definition: ItemTemplate.h:651
uint32 Flags2
Definition: ItemTemplate.h:637
uint32 ItemId
Definition: ItemTemplate.h:629
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:10540
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition: PlayerStorage.cpp:686
bool HasEnoughMoney(uint32 amount) const
Definition: Player.h:1569
Creature * GetNPCIfCanInteractWith(ObjectGuid guid, uint32 npcflagmask)
Definition: Player.cpp:2050
bool IsGameMaster() const
Definition: Player.h:1136
ReputationRank GetReputationRank(uint32 faction_id) const
Definition: Player.cpp:5763
void SendBuyError(BuyResult msg, Creature *creature, uint32 item, uint32 param)
Definition: PlayerStorage.cpp:4092
uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const
If trans is specified, arena point save query will be added to trans.
Definition: Player.cpp:10782
uint32 GetCurrentVendor() const
Definition: WorldSession.h:365
uint32 reqarenaslot
Definition: DBCStructure.h:1168
uint32 reqpersonalarenarating
Definition: DBCStructure.h:1171

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, ItemTemplate::Flags2, 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(), HasItemCount(), Unit::IsAlive(), IsEquipmentPos(), IsGameMaster(), VendorItem::IsGoldRequired(), IsInventoryPos(), VendorItem::item, ITEM_FLAGS_EXTRA_ALLIANCE_ONLY, ITEM_FLAGS_EXTRA_HORDE_ONLY, 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)
12830{
12831 Corpse* corpse = GetCorpse();
12832
12833 if (load && !corpse)
12834 return -1;
12835
12836 bool pvp = corpse ? corpse->GetType() == CORPSE_RESURRECTABLE_PVP : m_ExtraFlags & PLAYER_EXTRA_PVP_DEATH;
12837
12838 uint32 delay;
12839
12840 if (load)
12841 {
12842 if (corpse->GetGhostTime() > m_deathExpireTime)
12843 return -1;
12844
12845 uint64 count = 0;
12846
12847 if ((pvp && sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP)) ||
12848 (!pvp && sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)))
12849 {
12850 count = (m_deathExpireTime - corpse->GetGhostTime()) / DEATH_EXPIRE_STEP;
12851
12852 if (count >= MAX_DEATH_COUNT)
12853 count = MAX_DEATH_COUNT - 1;
12854 }
12855
12856 time_t expected_time = corpse->GetGhostTime() + copseReclaimDelay[count];
12857 time_t now = GameTime::GetGameTime().count();
12858
12859 if (now >= expected_time)
12860 return -1;
12861
12862 delay = expected_time - now;
12863 }
12864 else
12865 delay = GetCorpseReclaimDelay(pvp);
12866
12867 return delay * IN_MILLISECONDS;
12868}
@ CORPSE_RESURRECTABLE_PVP
Definition: Corpse.h:30
static uint32 copseReclaimDelay[MAX_DEATH_COUNT]
Definition: Player.cpp:143
@ PLAYER_EXTRA_PVP_DEATH
Definition: Player.h:593
#define DEATH_EXPIRE_STEP
Definition: Player.h:76
#define MAX_DEATH_COUNT
Definition: Player.h:77
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP
Definition: IWorld.h:107
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE
Definition: IWorld.h:108
time_t const & GetGhostTime() const
Definition: Corpse.h:70
CorpseType GetType() const
Definition: Corpse.h:72
uint32 GetCorpseReclaimDelay(bool pvp) const
Definition: Player.cpp:12812

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.

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

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.

◆ CalculateReputationGain()

float Player::CalculateReputationGain ( ReputationSource  source,
uint32  creatureOrQuestLevel,
float  rep,
int32  faction,
bool  noQuestBonus = false 
)
5771{
5772 float percent = 100.0f;
5773
5774 float repMod = noQuestBonus ? 0.0f : float(GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN));
5775
5776 // faction specific auras only seem to apply to kills
5777 if (source == REPUTATION_SOURCE_KILL)
5779
5780 percent += rep > 0.f ? repMod : -repMod;
5781
5782 float rate;
5783 switch (source)
5784 {
5786 rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_KILL);
5787 break;
5793 rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_QUEST);
5794 break;
5796 default:
5797 rate = 1.0f;
5798 break;
5799 }
5800
5801 if (rate != 1.0f && creatureOrQuestLevel <= Acore::XP::GetGrayLevel(GetLevel()))
5802 percent *= rate;
5803
5804 if (percent <= 0.0f)
5805 return 0;
5806
5807 // Multiply result with the faction specific rate
5808 if (RepRewardRate const* repData = sObjectMgr->GetRepRewardRate(faction))
5809 {
5810 float repRate = 0.0f;
5811 switch (source)
5812 {
5814 repRate = repData->creatureRate;
5815 break;
5817 repRate = repData->questRate;
5818 break;
5820 repRate = repData->questDailyRate;
5821 break;
5823 repRate = repData->questWeeklyRate;
5824 break;
5826 repRate = repData->questMonthlyRate;
5827 break;
5829 repRate = repData->questRepeatableRate;
5830 break;
5832 repRate = repData->spellRate;
5833 break;
5834 }
5835
5836 // for custom, a rate of 0.0 will totally disable reputation gain for this faction/type
5837 if (repRate <= 0.0f)
5838 return 0;
5839
5840 percent *= repRate;
5841 }
5842
5843 if (source != REPUTATION_SOURCE_SPELL && GetsRecruitAFriendBonus(false))
5844 percent *= 1.0f + sWorld->getRate(RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS);
5845
5846 return CalculatePct(rep, percent);
5847}
@ REPUTATION_SOURCE_KILL
Definition: Player.h:240
@ REPUTATION_SOURCE_SPELL
Definition: Player.h:246
@ REPUTATION_SOURCE_QUEST
Definition: Player.h:241
@ REPUTATION_SOURCE_MONTHLY_QUEST
Definition: Player.h:244
@ REPUTATION_SOURCE_REPEATABLE_QUEST
Definition: Player.h:245
@ REPUTATION_SOURCE_WEEKLY_QUEST
Definition: Player.h:243
@ REPUTATION_SOURCE_DAILY_QUEST
Definition: Player.h:242
@ SPELL_AURA_MOD_REPUTATION_GAIN
Definition: SpellAuraDefines.h:219
@ SPELL_AURA_MOD_FACTION_REPUTATION_GAIN
Definition: SpellAuraDefines.h:253
@ RATE_REPUTATION_LOWLEVEL_QUEST
Definition: IWorld.h:473
@ RATE_REPUTATION_LOWLEVEL_KILL
Definition: IWorld.h:472
@ RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS
Definition: IWorld.h:474
uint8 GetGrayLevel(uint8 pl_level)
Definition: Formulas.h:41
bool GetsRecruitAFriendBonus(bool forXP)
Definition: Player.cpp:12581
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:5926
Definition: ObjectMgr.h:551

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
13508{
13509 uint32 base_talent = GetLevel() < 10 ? 0 : GetLevel() - 9;
13510
13511 uint32 talentPointsForLevel = 0;
13512 if (getClass() != CLASS_DEATH_KNIGHT || GetMapId() != 609)
13513 {
13514 talentPointsForLevel = base_talent;
13515 }
13516 else
13517 {
13518 talentPointsForLevel = GetLevel() < 56 ? 0 : GetLevel() - 55;
13519 talentPointsForLevel += m_questRewardTalentCount;
13520
13521 if (talentPointsForLevel > base_talent)
13522 {
13523 talentPointsForLevel = base_talent;
13524 }
13525 }
13526
13527 talentPointsForLevel += m_extraBonusTalentCount;
13528 return uint32(talentPointsForLevel * sWorld->getRate(RATE_TALENT));
13529}
@ RATE_TALENT
Definition: IWorld.h:500

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

Referenced by InitTalentForLevel(), and resetTalents().

◆ CanAddQuest()

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

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.

11347{
11348 // Always can see self
11349 if (m_mover == obj)
11350 return true;
11351
11353 if (obj->GetGUID() == guid)
11354 return true;
11355
11356 return false;
11357}
@ 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
2059{
2060 if (!pItem)
2062
2063 uint32 count = pItem->GetCount();
2064
2065 LOG_DEBUG("entities.player.items", "STORAGE: CanBankItem bag = {}, slot = {}, item = {}, count = {}", bag, slot, pItem->GetEntry(), pItem->GetCount());
2066 ItemTemplate const* pProto = pItem->GetTemplate();
2067 if (!pProto)
2069
2070 // Xinef: Removed next loot generated check
2071 if (pItem->GetGUID() == GetLootGUID())
2073
2074 if (pItem->IsBindedNotWith(this))
2076
2077 // Currency tokens are not supposed to be swapped out of their hidden bag
2078 uint8 pItemslot = pItem->GetSlot();
2079 if (pItemslot >= CURRENCYTOKEN_SLOT_START && pItemslot < CURRENCYTOKEN_SLOT_END)
2080 {
2081 LOG_ERROR("entities.player", "Possible hacking attempt: Player {} [{}] tried to move token [{}, entry: {}] out of the currency bag!",
2082 GetName(), GetGUID().ToString(), pItem->GetGUID().ToString(), pProto->ItemId);
2084 }
2085
2086 // check count of items (skip for auto move for same player from bank)
2088 if (res != EQUIP_ERR_OK)
2089 return res;
2090
2091 // in specific slot
2092 if (bag != NULL_BAG && slot != NULL_SLOT)
2093 {
2094 if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
2095 {
2096 if (!pItem->IsBag())
2098
2101
2102 res = CanUseItem(pItem, not_loading);
2103 if (res != EQUIP_ERR_OK)
2104 return res;
2105 }
2106
2107 res = CanStoreItem_InSpecificSlot(bag, slot, dest, pProto, count, swap, pItem);
2108 if (res != EQUIP_ERR_OK)
2109 return res;
2110
2111 if (count == 0)
2112 return EQUIP_ERR_OK;
2113 }
2114
2115 // not specific slot or have space for partly store only in specific slot
2116
2117 // in specific bag
2118 if (bag != NULL_BAG)
2119 {
2120 if (pItem->IsNotEmptyBag())
2122
2123 // search stack in bag for merge to
2124 if (pProto->Stackable != 1)
2125 {
2126 if (bag == INVENTORY_SLOT_BAG_0)
2127 {
2128 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
2129 if (res != EQUIP_ERR_OK)
2130 return res;
2131
2132 if (count == 0)
2133 return EQUIP_ERR_OK;
2134 }
2135 else
2136 {
2137 res = CanStoreItem_InBag(bag, dest, pProto, count, true, false, pItem, NULL_BAG, slot);
2138 if (res != EQUIP_ERR_OK)
2139 res = CanStoreItem_InBag(bag, dest, pProto, count, true, true, pItem, NULL_BAG, slot);
2140
2141 if (res != EQUIP_ERR_OK)
2142 return res;
2143
2144 if (count == 0)
2145 return EQUIP_ERR_OK;
2146 }
2147 }
2148
2149 // search free slot in bag
2150 if (bag == INVENTORY_SLOT_BAG_0)
2151 {
2152 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
2153 if (res != EQUIP_ERR_OK)
2154 return res;
2155
2156 if (count == 0)
2157 return EQUIP_ERR_OK;
2158 }
2159 else
2160 {
2161 res = CanStoreItem_InBag(bag, dest, pProto, count, false, false, pItem, NULL_BAG, slot);
2162 if (res != EQUIP_ERR_OK)
2163 res = CanStoreItem_InBag(bag, dest, pProto, count, false, true, pItem, NULL_BAG, slot);
2164
2165 if (res != EQUIP_ERR_OK)
2166 return res;
2167
2168 if (count == 0)
2169 return EQUIP_ERR_OK;
2170 }
2171 }
2172
2173 // not specific bag or have space for partly store only in specific bag
2174
2175 // search stack for merge to
2176 if (pProto->Stackable != 1)
2177 {
2178 // in slots
2179 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
2180 if (res != EQUIP_ERR_OK)
2181 return res;
2182
2183 if (count == 0)
2184 return EQUIP_ERR_OK;
2185
2186 // in special bags
2187 if (pProto->BagFamily)
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, false, 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 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2201 {
2202 res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
2203 if (res != EQUIP_ERR_OK)
2204 continue;
2205
2206 if (count == 0)
2207 return EQUIP_ERR_OK;
2208 }
2209 }
2210
2211 // search free place in special bag
2212 if (pProto->BagFamily)
2213 {
2214 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2215 {
2216 res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot);
2217 if (res != EQUIP_ERR_OK)
2218 continue;
2219
2220 if (count == 0)
2221 return EQUIP_ERR_OK;
2222 }
2223 }
2224
2225 // search free space
2226 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
2227 if (res != EQUIP_ERR_OK)
2228 return res;
2229
2230 if (count == 0)
2231 return EQUIP_ERR_OK;
2232
2233 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2234 {
2235 res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
2236 if (res != EQUIP_ERR_OK)
2237 continue;
2238
2239 if (count == 0)
2240 return EQUIP_ERR_OK;
2241 }
2242 return EQUIP_ERR_BANK_FULL;
2243}
@ EQUIP_ERR_ALREADY_LOOTED
Definition: Item.h:90
@ EQUIP_ERR_DONT_OWN_THAT_ITEM
Definition: Item.h:73
@ EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT
Definition: Item.h:75
@ EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG
Definition: Item.h:46
@ EQUIP_ERR_BANK_FULL
Definition: Item.h:92
@ EQUIP_ERR_ITEM_NOT_FOUND
Definition: Item.h:64
@ EQUIP_ERR_ITEMS_CANT_BE_SWAPPED
Definition: Item.h:62
@ BANK_SLOT_BAG_START
Definition: Player.h:718
@ BANK_SLOT_ITEM_START
Definition: Player.h:712
@ BANK_SLOT_ITEM_END
Definition: Player.h:713
bool IsBindedNotWith(Player const *player) const
Definition: Item.cpp:1134
bool IsBag() const
Definition: Item.h:248
bool IsNotEmptyBag() const
Definition: Item.cpp:313
uint32 BagFamily
Definition: ItemTemplate.h:688
int32 Stackable
Definition: ItemTemplate.h:654
uint8 GetBankBagSlotCount() const
Definition: Player.h:1239
ObjectGuid GetLootGUID() const
Definition: Player.h:1943
InventoryResult CanTakeMoreSimilarItems(Item *pItem) const
Definition: Player.h:1246
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:1084
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:1014
InventoryResult CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool swap, Item *pSrcItem) const
Definition: PlayerStorage.cpp:940
InventoryResult CanUseItem(Item *pItem, bool not_loading=true) const
Definition: PlayerStorage.cpp:2245

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
2134{ return m_canBlock; }

References m_canBlock.

Referenced by UpdateBlockPercentage().

◆ CanCaptureTowerPoint()

bool Player::CanCaptureTowerPoint ( ) const
13135{
13136 return (!HasStealthAura() && // not stealthed
13137 !HasInvisibilityAura() && // not invisible
13138 IsAlive() // live player
13139 );
13140}
bool HasStealthAura() const
Definition: Unit.h:1706
bool HasInvisibilityAura() const
Definition: Unit.h:1707

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

◆ CanCompleteQuest()

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

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

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.

2517{ return true; }

◆ CanEquipItem()

InventoryResult Player::CanEquipItem ( uint8  slot,
uint16 dest,
Item pItem,
bool  swap,
bool  not_loading = true 
) const
1840{
1841 dest = 0;
1842 if (pItem)
1843 {
1844 LOG_DEBUG("entities.player.items", "STORAGE: CanEquipItem slot = {}, item = {}, count = {}", slot, pItem->GetEntry(), pItem->GetCount());
1845 ItemTemplate const* pProto = pItem->GetTemplate();
1846 if (pProto)
1847 {
1848 if (!sScriptMgr->CanEquipItem(const_cast<Player*>(this), slot, dest, pItem, swap, not_loading))
1850
1851 // item used
1852 if (pItem->m_lootGenerated)
1854
1855 if (pItem->IsBindedNotWith(this))
1857
1858 // check count of items (skip for auto move for same player from bank)
1860 if (res != EQUIP_ERR_OK)
1861 return res;
1862
1863 // check this only in game
1864 if (not_loading)
1865 {
1866 // May be here should be more stronger checks; STUNNED checked
1867 // ROOT, CONFUSED, DISTRACTED, FLEEING this needs to be checked.
1870
1871 // do not allow equipping gear except weapons, offhands, projectiles, relics in
1872 // - combat
1873 // - in-progress arenas
1874 if (!pProto->CanChangeEquipStateInCombat())
1875 {
1876 if (IsInCombat())
1878
1879 if (Battleground* bg = GetBattleground())
1880 if (bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS)
1882 }
1883
1884 if (IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer != 0)
1885 return EQUIP_ERR_CANT_DO_RIGHT_NOW; // maybe exist better err
1886
1887 if (IsNonMeleeSpellCast(false))
1889 }
1890
1892 // 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)
1893 if (ssd && ssd->MaxLevel < DEFAULT_MAX_LEVEL && ssd->MaxLevel < GetLevel())
1895
1896 uint8 eslot = FindEquipSlot(pProto, slot, swap);
1897 if (eslot == NULL_SLOT)
1899
1900 // Xinef: dont allow to equip items on disarmed slot
1901 if (!CanUseAttackType(GetAttackBySlot(eslot)))
1903
1904 res = CanUseItem(pItem, not_loading);
1905 if (res != EQUIP_ERR_OK)
1906 return res;
1907
1908 if (!swap && GetItemByPos(INVENTORY_SLOT_BAG_0, eslot))
1910
1911 // if we are swapping 2 equiped items, CanEquipUniqueItem check
1912 // should ignore the item we are trying to swap, and not the
1913 // destination item. CanEquipUniqueItem should ignore destination
1914 // item only when we are swapping weapon from bag
1915 uint8 ignore = uint8(NULL_SLOT);
1916 switch (eslot)
1917 {
1919 ignore = EQUIPMENT_SLOT_OFFHAND;
1920 break;
1922 ignore = EQUIPMENT_SLOT_MAINHAND;
1923 break;
1925 ignore = EQUIPMENT_SLOT_FINGER2;
1926 break;
1928 ignore = EQUIPMENT_SLOT_FINGER1;
1929 break;
1931 ignore = EQUIPMENT_SLOT_TRINKET2;
1932 break;
1934 ignore = EQUIPMENT_SLOT_TRINKET1;
1935 break;
1936 }
1937
1938 if (ignore == uint8(NULL_SLOT) || pItem != GetItemByPos(INVENTORY_SLOT_BAG_0, ignore))
1939 ignore = eslot;
1940
1941 InventoryResult res2 = CanEquipUniqueItem(pItem, swap ? ignore : uint8(NULL_SLOT));
1942 if (res2 != EQUIP_ERR_OK)
1943 return res2;
1944
1945 // check unique-equipped special item classes
1946 if (pProto->Class == ITEM_CLASS_QUIVER)
1948 if (Item* pBag = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
1949 if (pBag != pItem)
1950 if (ItemTemplate const* pBagProto = pBag->GetTemplate())
1951 if (pBagProto->Class == pProto->Class && (!swap || pBag->GetSlot() != eslot))
1952 return (pBagProto->SubClass == ITEM_SUBCLASS_AMMO_POUCH)
1955
1956 uint32 type = pProto->InventoryType;
1957
1958 if (eslot == EQUIPMENT_SLOT_OFFHAND)
1959 {
1960 // Do not allow polearm to be equipped in the offhand (rare case for the only 1h polearm 41750)
1961 // xinef: same for fishing poles
1964
1965 else if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND)
1966 {
1967 if (!CanDualWield())
1969 }
1970 else if (type == INVTYPE_2HWEAPON)
1971 {
1972 if (!CanDualWield() || !CanTitanGrip())
1974 }
1975
1976 if (IsTwoHandUsed())
1978 }
1979
1980 // equip two-hand weapon case (with possible unequip 2 items)
1981 if (type == INVTYPE_2HWEAPON)
1982 {
1983 if (eslot == EQUIPMENT_SLOT_OFFHAND)
1984 {
1985 if (!CanTitanGrip())
1987 }
1988 else if (eslot != EQUIPMENT_SLOT_MAINHAND)
1990
1991 if (!CanTitanGrip())
1992 {
1993 // offhand item must can be stored in inventory for offhand item and it also must be unequipped
1995 ItemPosCountVec off_dest;
1996 if (offItem && (!not_loading ||
1998 CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false) != EQUIP_ERR_OK))
2000 }
2001 }
2002 dest = ((INVENTORY_SLOT_BAG_0 << 8) | eslot);
2003 return EQUIP_ERR_OK;
2004 }
2005 }
2006
2008}
@ STATUS_IN_PROGRESS
Definition: Battleground.h:197
@ EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH
Definition: Item.h:83
@ EQUIP_ERR_CANT_DUAL_WIELD
Definition: Item.h:55
@ EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE
Definition: Item.h:50
@ EQUIP_ERR_NOT_DURING_ARENA_MATCH
Definition: Item.h:118
@ EQUIP_ERR_NOT_IN_COMBAT
Definition: Item.h:101
@ EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED
Definition: Item.h:54
@ EQUIP_ERR_NOT_WHILE_DISARMED
Definition: Item.h:102
@ EQUIP_ERR_CANT_DO_RIGHT_NOW
Definition: Item.h:80
@ EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER
Definition: Item.h:74
@ EQUIP_ERR_YOU_ARE_STUNNED
Definition: Item.h:78
@ EQUIP_ERR_INVENTORY_FULL
Definition: Item.h:91
@ ITEM_SUBCLASS_WEAPON_FISHING_POLE
Definition: ItemTemplate.h:373
@ ITEM_SUBCLASS_WEAPON_POLEARM
Definition: ItemTemplate.h:359
@ INVTYPE_RELIC
Definition: ItemTemplate.h:293
@ ITEM_SUBCLASS_AMMO_POUCH
Definition: ItemTemplate.h:490
@ ITEM_CLASS_QUIVER
Definition: ItemTemplate.h:311
@ ITEM_CLASS_WEAPON
Definition: ItemTemplate.h:302
@ EQUIPMENT_SLOT_FINGER1
Definition: Player.h:686
@ EQUIPMENT_SLOT_FINGER2
Definition: Player.h:687
@ EQUIPMENT_SLOT_TRINKET1
Definition: Player.h:688
@ EQUIPMENT_SLOT_TRINKET2
Definition: Player.h:689
#define DEFAULT_MAX_LEVEL
Definition: DBCEnums.h:41
Definition: Battleground.h:293
bool m_lootGenerated
Definition: Item.h:312
bool CanChangeEquipStateInCombat() const
Definition: ItemTemplate.h:716
uint32 ScalingStatDistribution
Definition: ItemTemplate.h:658
uint32 SubClass
Definition: ItemTemplate.h:631
Definition: Player.h:1046
InventoryResult CanUnequipItem(uint16 src, bool swap) const
Definition: PlayerStorage.cpp:2010
InventoryResult CanEquipUniqueItem(Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
Definition: Player.cpp:13667
Battleground * GetBattleground(bool create=false) const
Definition: Player.cpp:12097
uint8 FindEquipSlot(ItemTemplate const *proto, uint32 slot, bool swap) const
Definition: PlayerStorage.cpp:137

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
1826{
1827 dest = 0;
1828 Item* pItem = Item::CreateItem(item, 1, this);
1829 if (pItem)
1830 {
1831 InventoryResult result = CanEquipItem(slot, dest, pItem, swap);
1832 delete pItem;
1833 return result;
1834 }
1835
1837}
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition: Item.cpp:1089

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
13668{
13669 ItemTemplate const* pProto = pItem->GetTemplate();
13670
13671 // proto based limitations
13672 if (InventoryResult res = CanEquipUniqueItem(pProto, eslot, limit_count))
13673 return res;
13674
13675 // check unique-equipped on gems
13676 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
13677 {
13678 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
13679 if (!enchant_id)
13680 continue;
13681 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
13682 if (!enchantEntry)
13683 continue;
13684
13685 ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(enchantEntry->GemID);
13686 if (!pGem)
13687 continue;
13688
13689 // include for check equip another gems with same limit category for not equipped item (and then not counted)
13690 uint32 gem_limit_count = !pItem->IsEquipped() && pGem->ItemLimitCategory
13692
13693 if (InventoryResult res = CanEquipUniqueItem(pGem, eslot, gem_limit_count))
13694 return res;
13695 }
13696
13697 return EQUIP_ERR_OK;
13698}
uint8 GetGemCountWithLimitCategory(uint32 limitCategory) const
Definition: Item.cpp:1035
uint32 ItemLimitCategory
Definition: ItemTemplate.h:696
uint32 GemID
Definition: DBCStructure.h:1828

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(), and WorldSession::HandleSocketOpcode().

◆ CanEquipUniqueItem() [2/2]

InventoryResult Player::CanEquipUniqueItem ( ItemTemplate const *  itemProto,
uint8  except_slot = NULL_SLOT,
uint32  limit_count = 1 
) const
13701{
13702 // check unique-equipped on item
13703 if (itemProto->Flags & ITEM_FLAG_UNIQUE_EQUIPPABLE)
13704 {
13705 // there is an equip limit on this item
13706 if (HasItemOrGemWithIdEquipped(itemProto->ItemId, 1, except_slot))
13708 }
13709
13710 // check unique-equipped limit
13711 if (itemProto->ItemLimitCategory)
13712 {
13713 ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(itemProto->ItemLimitCategory);
13714 if (!limitEntry)
13716
13717 // NOTE: limitEntry->mode not checked because if item have have-limit then it applied and to equip case
13718
13719 if (limit_count > limitEntry->maxCount)
13721
13722 // there is an equip limit on this item
13723 if (HasItemOrGemWithLimitCategoryEquipped(itemProto->ItemLimitCategory, limitEntry->maxCount - limit_count + 1, except_slot))
13725 }
13726
13727 return EQUIP_ERR_OK;
13728}
DBCStorage< ItemLimitCategoryEntry > sItemLimitCategoryStore(ItemLimitCategoryEntryfmt)
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED
Definition: Item.h:129
@ EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE
Definition: Item.h:108
@ EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED
Definition: Item.h:115
@ ITEM_FLAG_UNIQUE_EQUIPPABLE
Definition: ItemTemplate.h:167
bool HasItemOrGemWithIdEquipped(uint32 item, uint32 count, uint8 except_slot=NULL_SLOT) const
Definition: PlayerStorage.cpp:759
bool HasItemOrGemWithLimitCategoryEquipped(uint32 limitCategory, uint32 count, uint8 except_slot=NULL_SLOT) const
Definition: PlayerStorage.cpp:797
Definition: DBCStructure.h:1175
uint32 maxCount
Definition: DBCStructure.h:1179

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::Flags, 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: Unit.h:576
bool HasMovementFlag(uint32 flag) const
Definition: Object.h:322
MovementInfo m_movementInfo
Definition: Object.h:595

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

◆ canFlyInZone()

bool Player::canFlyInZone ( uint32  mapid,
uint32  zone,
SpellInfo const *  bySpell 
) const
13532{
13533 // continent checked in SpellInfo::CheckLocation at cast and area update
13534 uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone);
13535 if (v_map == 571 && !bySpell->HasAttribute(SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT))
13536 {
13537 if (!HasSpell(54197)) // 54197 = Cold Weather Flying
13538 {
13539 return false;
13540 }
13541 }
13542
13543 return true;
13544}
uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId)
Definition: DBCStores.cpp:696
@ SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT
Definition: SharedDefines.h:635

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

Referenced by SpellInfo::CheckLocation().

◆ CanInteractWithQuestGiver()

bool Player::CanInteractWithQuestGiver ( Object questGiver)
2033{
2034 switch (questGiver->GetTypeId())
2035 {
2036 case TYPEID_UNIT:
2037 return GetNPCIfCanInteractWith(questGiver->GetGUID(), UNIT_NPC_FLAG_QUESTGIVER) != nullptr;
2038 case TYPEID_GAMEOBJECT:
2039 return GetGameObjectIfCanInteractWith(questGiver->GetGUID(), GAMEOBJECT_TYPE_QUESTGIVER) != nullptr;
2040 case TYPEID_PLAYER:
2041 return IsAlive() && questGiver->ToPlayer()->IsAlive();
2042 case TYPEID_ITEM:
2043 return IsAlive();
2044 default:
2045 break;
2046 }
2047 return false;
2048}
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: Unit.h:517
@ GAMEOBJECT_TYPE_QUESTGIVER
Definition: SharedDefines.h:1534
GameObject * GetGameObjectIfCanInteractWith(ObjectGuid guid, GameobjectTypes type) const
Definition: Player.cpp:2107

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 
)
4877{
4878 // Player can join LFG anywhere
4879 if (channel->flags & CHANNEL_DBC_FLAG_LFG && sWorld->getBoolConfig(CONFIG_LFG_LOCATION_ALL))
4880 return true;
4881
4882 if (channel->flags & CHANNEL_DBC_FLAG_ZONE_DEP && zone->flags & AREA_FLAG_ARENA_INSTANCE)
4883 return false;
4884
4885 if ((channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY) && (!(zone->flags & AREA_FLAG_SLAVE_CAPITAL)))
4886 return false;
4887
4888 if ((channel->flags & CHANNEL_DBC_FLAG_GUILD_REQ) && GetGuildId())
4889 return false;
4890
4891 return true;
4892}
@ 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:159
@ AREA_FLAG_ARENA_INSTANCE
Definition: DBCEnums.h:255
@ AREA_FLAG_SLAVE_CAPITAL
Definition: DBCEnums.h:242
uint32 GetGuildId() const
Definition: Player.h:1851

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
11254{
11255 // check Deserter debuff
11256 if (HasAura(26013))
11257 return false;
11258
11259 return true;
11260}
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5610

References Unit::HasAura().

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

◆ CanKnockback()

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

References m_canKnockback.

◆ CanNoReagentCast()

bool Player::CanNoReagentCast ( SpellInfo const *  spellInfo) const
12457{
12458 // don't take reagents for spells with SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA
12460 return true;
12461
12462 // Check no reagent use mask
12463 flag96 noReagentMask;
12464 noReagentMask[0] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1);
12465 noReagentMask[1] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1 + 1);
12466 noReagentMask[2] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1 + 2);
12467 if (spellInfo->SpellFamilyFlags & noReagentMask)
12468 return true;
12469
12470 return false;
12471}
@ PLAYER_NO_REAGENT_COST_1
Definition: UpdateFields.h:387
@ UNIT_FLAG_PREPARATION
Definition: Unit.h:453
@ SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA
Definition: SharedDefines.h:540

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 ( )
9055{
9056 PetStable* const petStable = GetPetStable();
9057 if (!petStable)
9058 {
9059 // No pets
9060 return false;
9061 }
9062
9063 auto const& currectPet = petStable->CurrentPet;
9064 auto const& unslottedHunterPet = petStable->GetUnslottedHunterPet();
9065
9066 if (!currectPet && !unslottedHunterPet)
9067 {
9068 // No pets
9069 return false;
9070 }
9071
9072 // Check current pet
9073 if (currectPet && !currectPet->Health)
9074 {
9075 return true;
9076 }
9077
9078 // Check dismiss/unslotted hunter pet
9079 if (unslottedHunterPet && !unslottedHunterPet->Health)
9080 {
9081 return true;
9082 }
9083
9084 return false;
9085}
Definition: PetDefines.h:197
PetInfo const * GetUnslottedHunterPet() const
Definition: PetDefines.h:225
Optional< PetInfo > CurrentPet
Definition: PetDefines.h:220
PetStable * GetPetStable()
Definition: Player.h:1178

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

◆ CanReportAfkDueToLimit()

bool Player::CanReportAfkDueToLimit ( )
11263{
11264 // a player can complain about 15 people per 5 minutes
11265 if (m_bgData.bgAfkReportedCount++ >= 15)
11266 return false;
11267
11268 return true;
11269}
uint8 bgAfkReportedCount
Definition: Player.h:1025
BGData m_bgData
Definition: Player.h:2613

References BGData::bgAfkReportedCount, and m_bgData.

Referenced by ReportedAfkBy().

◆ CanResummonPet()

bool Player::CanResummonPet ( uint32  spellid)
14138{
14139 switch (getClass())
14140 {
14141 case CLASS_DEATH_KNIGHT:
14142 if (CanSeeDKPet())
14143 return true;
14144 else if (spellid == 52150) //Raise Dead
14145 return false;
14146 break;
14147 case CLASS_MAGE:
14148 if (HasSpell(31687) && HasAura(70937)) //Has [Summon Water Elemental] spell and [Glyph of Eternal Water].
14149 return true;
14150 break;
14151 case CLASS_HUNTER:
14152 case CLASS_WARLOCK:
14153 return true;
14154 break;
14155 default:
14156 break;
14157 }
14158
14159 return HasSpell(spellid);
14160}
bool CanSeeDKPet() const
Definition: Player.h:2543

References CanSeeDKPet(), CLASS_DEATH_KNIGHT, CLASS_HUNTER, CLASS_MAGE, CLASS_WARLOCK, Unit::getClass(), Unit::HasAura(), and HasSpell().

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

◆ CanRewardQuest() [1/2]

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

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

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
2367{
2368 if (!GetGroup() || !GetGroup()->isLFGGroup(true))
2369 return EQUIP_ERR_OK; // not in LFG group
2370
2371 // check if looted object is inside the lfg dungeon
2372 Map const* map = lootedObject->GetMap();
2373 if (!sLFGMgr->inLfgDungeonMap(GetGroup()->GetGUID(), map->GetId(), map->GetDifficulty()))
2374 return EQUIP_ERR_OK;
2375
2376 if (!proto)
2378 // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
2379
2380 const static uint32 item_weapon_skills[MAX_ITEM_SUBCLASS_WEAPON] =
2381 {
2387 }; //Copy from function Item::GetSkill()
2388
2389 if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
2391
2392 if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
2394
2395 if (proto->RequiredSkill != 0)
2396 {
2397 if (!GetSkillValue(proto->RequiredSkill))
2399 else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
2401 }
2402
2403 uint8 _class = getClass();
2404
2405 if (proto->Class == ITEM_CLASS_WEAPON && GetSkillValue(item_weapon_skills[proto->SubClass]) == 0)
2407
2408 if (proto->Class == ITEM_CLASS_ARMOR)
2409 {
2410 // Check for shields
2411 if (proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD && !(_class == CLASS_PALADIN || _class == CLASS_WARRIOR || _class == CLASS_SHAMAN))
2412 {
2414 }
2415
2416 // Check for librams.
2417 if (proto->SubClass == ITEM_SUBCLASS_ARMOR_LIBRAM && _class != CLASS_PALADIN)
2418 {
2420 }
2421
2422 // CHeck for idols.
2423 if (proto->SubClass == ITEM_SUBCLASS_ARMOR_IDOL && _class != CLASS_DRUID)
2424 {
2426 }
2427
2428 // Check for totems.
2429 if (proto->SubClass == ITEM_SUBCLASS_ARMOR_TOTEM && _class != CLASS_SHAMAN)
2430 {
2432 }
2433
2434 // Check for sigils.
2435 if (proto->SubClass == ITEM_SUBCLASS_ARMOR_SIGIL && _class != CLASS_DEATH_KNIGHT)
2436 {
2438 }
2439 }
2440
2441 if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass > ITEM_SUBCLASS_ARMOR_MISC && proto->SubClass < ITEM_SUBCLASS_ARMOR_BUCKLER &&
2442 proto->InventoryType != INVTYPE_CLOAK)
2443 {
2444 uint32 subclassToCompare = ITEM_SUBCLASS_ARMOR_CLOTH;
2445 switch (_class)
2446 {
2447 case CLASS_WARRIOR:
2448 if (proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat())
2449 {
2451 }
2452 [[fallthrough]];
2453 case CLASS_DEATH_KNIGHT:
2454 case CLASS_PALADIN:
2455 subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
2456 break;
2457 case CLASS_HUNTER:
2458 case CLASS_SHAMAN:
2459 subclassToCompare = ITEM_SUBCLASS_ARMOR_MAIL;
2460 break;
2461 case CLASS_ROGUE:
2462 if (proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat())
2463 {
2465 }
2466 [[fallthrough]];
2467 case CLASS_DRUID:
2468 subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
2469 break;
2470 default:
2471 break;
2472 }
2473
2474 if (proto->SubClass > subclassToCompare)
2475 {
2477 }
2478 else if (sWorld->getIntConfig(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION) && proto->ItemLevel > sWorld->getIntConfig(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION))
2479 {
2480 if (proto->SubClass < subclassToCompare)
2481 {
2483 }
2484 }
2485 }
2486
2487 return EQUIP_ERR_OK;
2488}
#define sLFGMgr
Definition: LFGMgr.h:638
@ EQUIP_ERR_CANT_EQUIP_SKILL
Definition: Item.h:43
@ EQUIP_ERR_NO_REQUIRED_PROFICIENCY
Definition: Item.h:49
@ EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM
Definition: Item.h:51
@ INVTYPE_CLOAK
Definition: ItemTemplate.h:281
@ ITEM_SUBCLASS_ARMOR_BUCKLER
Definition: ItemTemplate.h:404
@ ITEM_SUBCLASS_ARMOR_LIBRAM
Definition: ItemTemplate.h:406
@ ITEM_SUBCLASS_ARMOR_MISC
Definition: ItemTemplate.h:399
@ ITEM_SUBCLASS_ARMOR_SIGIL
Definition: ItemTemplate.h:409
@ ITEM_SUBCLASS_ARMOR_TOTEM
Definition: ItemTemplate.h:408
@ ITEM_SUBCLASS_ARMOR_IDOL
Definition: ItemTemplate.h:407
#define MAX_ITEM_SUBCLASS_WEAPON
Definition: ItemTemplate.h:380
@ CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION
Definition: IWorld.h:410
@ CLASS_WARRIOR
Definition: SharedDefines.h:113
@ CLASS_ROGUE
Definition: SharedDefines.h:116
@ SKILL_BOWS
Definition: SharedDefines.h:2845
@ SKILL_MACES
Definition: SharedDefines.h:2849
@ SKILL_WANDS
Definition: SharedDefines.h:2913
@ SKILL_GUNS
Definition: SharedDefines.h:2846
@ SKILL_CROSSBOWS
Definition: SharedDefines.h:2912
@ SKILL_THROWN
Definition: SharedDefines.h:2886
@ SKILL_FISHING
Definition: SharedDefines.h:2929
@ SKILL_SWORDS
Definition: SharedDefines.h:2843
@ SKILL_DAGGERS
Definition: SharedDefines.h:2885
@ SKILL_2H_AXES
Definition: SharedDefines.h:2884
@ SKILL_POLEARMS
Definition: SharedDefines.h:2914
@ SKILL_2H_SWORDS
Definition: SharedDefines.h:2850
@ SKILL_FIST_WEAPONS
Definition: SharedDefines.h:2938
@ SKILL_2H_MACES
Definition: SharedDefines.h:2878
@ SKILL_AXES
Definition: SharedDefines.h:2844
@ SKILL_STAVES
Definition: SharedDefines.h:2866
@ SKILL_ASSASSINATION
Definition: SharedDefines.h:2918
uint32 getRaceMask() const
Definition: Unit.h:1425
uint32 GetId() const
Definition: Map.h:378
Difficulty GetDifficulty() const
Definition: Map.h:442

References ItemTemplate::AllowableClass, ItemTemplate::AllowableRace, ItemTemplate::Class, 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::getClass(), Unit::getClassMask(), Map::GetDifficulty(), GetGroup(), Object::GetGUID(), Map::GetId(), WorldObject::GetMap(), Unit::getRaceMask(), GetSkillValue(), HasSpell(), ItemTemplate::HasSpellPowerStat(), ItemTemplate::HasStat(), ItemTemplate::InventoryType, INVTYPE_CLOAK, 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
14163{
14164 if (!c->HasNpcFlag(UNIT_NPC_FLAG_SPELLCLICK))
14165 return false;
14166
14167 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(c->GetEntry());
14168 if (clickPair.first == clickPair.second)
14169 return true;
14170
14171 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
14172 {
14173 if (!itr->second.IsFitToRequirements(this, c))
14174 return false;
14175
14176 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(c->GetEntry(), itr->second.spellId);
14177 ConditionSourceInfo info = ConditionSourceInfo(const_cast<Player*>(this), const_cast<Creature*>(c));
14178 if (sConditionMgr->IsObjectMeetToConditions(info, conds))
14179 return true;
14180 }
14181
14182 return false;
14183}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition: Unit.h:540
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition: ObjectMgr.h:409
Definition: ConditionMgr.h:181

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

Referenced by Unit::BuildValuesUpdate().

◆ CanSeeStartQuest()

bool Player::CanSeeStartQuest ( Quest const *  quest)
237{
238 if (!DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this) && SatisfyQuestClass(quest, false) && SatisfyQuestRace(quest, false) &&
239 SatisfyQuestSkill(quest, false) && SatisfyQuestExclusiveGroup(quest, false) && SatisfyQuestReputation(quest, false) &&
240 SatisfyQuestPreviousQuest(quest, false) && SatisfyQuestNextChain(quest, false) &&
241 SatisfyQuestPrevChain(quest, false) && SatisfyQuestDay(quest, false) && SatisfyQuestWeek(quest, false) &&
242 SatisfyQuestMonth(quest, false) && SatisfyQuestSeasonal(quest, false))
243 {
244 return GetLevel() + sWorld->getIntConfig(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF) >= quest->GetMinLevel();
245 }
246
247 return false;
248}
@ DISABLE_TYPE_QUEST
Definition: DisableMgr.h:30
@ CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF
Definition: IWorld.h:286
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:1217
bool SatisfyQuestExclusiveGroup(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1180
bool SatisfyQuestRace(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1100
bool SatisfyQuestClass(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1082
bool SatisfyQuestReputation(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1114
bool SatisfyQuestPreviousQuest(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:996
bool SatisfyQuestSkill(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:944
bool SatisfyQuestPrevChain(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1237

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
14186{
14187 if (!creature->HasNpcFlag(UNIT_NPC_FLAG_VENDOR))
14188 return true;
14189
14190 ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), 0);
14191 if (!sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(this), const_cast<Creature*>(creature), conditions))
14192 {
14193 return false;
14194 }
14195
14196 return true;
14197}

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

Referenced by Unit::BuildValuesUpdate().

◆ CanShareQuest()

bool Player::CanShareQuest ( uint32  quest_id) const
1443{
1444 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
1445 if (qInfo && qInfo->HasFlag(QUEST_FLAGS_SHARABLE))
1446 {
1447 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
1448 if (itr != m_QuestStatus.end())
1449 {
1450 // in pool and not currently available (wintergrasp weekly, dalaran weekly) - can't share
1451 if (sPoolMgr->IsPartOfAPool<Quest>(quest_id) && !sPoolMgr->IsSpawnedObject<Quest>(quest_id))
1452 {
1454 return false;
1455 }
1456
1457 return true;
1458 }
1459 }
1460 return false;
1461}
#define sPoolMgr
Definition: PoolMgr.h:163
@ QUEST_FLAGS_SHARABLE
Definition: QuestDef.h:135
@ QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY
Definition: QuestDef.h:74
void SendPushToPartyResponse(Player const *player, uint8 msg) const
Definition: PlayerQuest.cpp:2419
bool HasFlag(uint32 flag) const
Definition: QuestDef.h:218

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:493

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

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
1015{
1016 // skip specific bag already processed in first called CanStoreItem_InBag
1017 if (bag == skip_bag)
1019
1020 // skip not existed bag or self targeted bag
1021 Bag* pBag = GetBagByPos(bag);
1022 if (!pBag || pBag == pSrcItem || (pSrcItem && (pSrcItem->GetGUID() == pBag->GetGUID())) )
1024
1025 if (pSrcItem && pSrcItem->IsNotEmptyBag())
1027
1028 ItemTemplate const* pBagProto = pBag->GetTemplate();
1029 if (!pBagProto)
1031
1032 // specialized bag mode or non-specilized
1033 if (non_specialized != (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER))
1035
1036 if (!ItemCanGoIntoBag(pProto, pBagProto))
1038
1039 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
1040 {
1041 // skip specific slot already processed in first called CanStoreItem_InSpecificSlot
1042 if (j == skip_slot)
1043 continue;
1044
1045 Item* pItem2 = GetItemByPos(bag, j);
1046
1047 // ignore move item (this slot will be empty at move)
1048 if (pItem2 == pSrcItem)
1049 pItem2 = nullptr;
1050
1051 // if merge skip empty, if !merge skip non-empty
1052 if ((pItem2 != nullptr) != merge)
1053 continue;
1054
1055 uint32 need_space = pProto->GetMaxStackSize();
1056
1057 if (pItem2)
1058 {
1059 // can be merged at least partly
1060 uint8 res = pItem2->CanBeMergedPartlyWith(pProto);
1061 if (res != EQUIP_ERR_OK)
1062 continue;
1063
1064 // descrease at current stacksize
1065 need_space -= pItem2->GetCount();
1066 }
1067
1068 if (need_space > count)
1069 need_space = count;
1070
1071 ItemPosCount newPosition = ItemPosCount((bag << 8) | j, need_space);
1072 if (!newPosition.isContainedIn(dest))
1073 {
1074 dest.push_back(newPosition);
1075 count -= need_space;
1076
1077 if (count == 0)
1078 return EQUIP_ERR_OK;
1079 }
1080 }
1081 return EQUIP_ERR_OK;
1082}
bool ItemCanGoIntoBag(ItemTemplate const *pProto, ItemTemplate const *pBagProto)
Definition: Item.cpp:178
@ EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG
Definition: Item.h:56
@ ITEM_SUBCLASS_CONTAINER
Definition: ItemTemplate.h:338
@ ITEM_CLASS_CONTAINER
Definition: ItemTemplate.h:301
uint32 GetBagSize() const
Definition: Bag.h:48
InventoryResult CanBeMergedPartlyWith(ItemTemplate const *proto) const
Definition: Item.cpp:869
Definition: Player.h:766
bool isContainedIn(std::vector< ItemPosCount > const &vec) const
Definition: Player.cpp:13041

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
1085{
1086 //this is never called for non-bag slots so we can do this
1087 if (pSrcItem && pSrcItem->IsNotEmptyBag())
1089
1090 for (uint32 j = slot_begin; j < slot_end; j++)
1091 {
1092 // skip specific slot already processed in first called CanStoreItem_InSpecificSlot
1093 if (INVENTORY_SLOT_BAG_0 == skip_bag && j == skip_slot)
1094 continue;
1095
1097
1098 // ignore move item (this slot will be empty at move)
1099 if (pItem2 == pSrcItem)
1100 pItem2 = nullptr;
1101
1102 // if merge skip empty, if !merge skip non-empty
1103 if ((pItem2 != nullptr) != merge)
1104 continue;
1105
1106 uint32 need_space = pProto->GetMaxStackSize();
1107
1108 if (pItem2)
1109 {
1110 // can be merged at least partly
1111 uint8 res = pItem2->CanBeMergedPartlyWith(pProto);
1112 if (res != EQUIP_ERR_OK)
1113 continue;
1114
1115 // descrease at current stacksize
1116 need_space -= pItem2->GetCount();
1117 }
1118
1119 if (need_space > count)
1120 need_space = count;
1121
1122 ItemPosCount newPosition = ItemPosCount((INVENTORY_SLOT_BAG_0 << 8) | j, need_space);
1123 if (!newPosition.isContainedIn(dest))
1124 {
1125 dest.push_back(newPosition);
1126 count -= need_space;
1127
1128 if (count == 0)
1129 return EQUIP_ERR_OK;
1130 }
1131 }
1132 return EQUIP_ERR_OK;
1133}

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
941{
942 Item* pItem2 = GetItemByPos(bag, slot);
943
944 // ignore move item (this slot will be empty at move)
945 if (pItem2 == pSrcItem)
946 pItem2 = nullptr;
947
948 uint32 need_space;
949
950 if (pSrcItem && pSrcItem->IsNotEmptyBag() && !IsBagPos(uint16(bag) << 8 | slot))
952
953 // empty specific slot - check item fit to slot
954 if (!pItem2 || swap)
955 {
956 if (bag == INVENTORY_SLOT_BAG_0)
957 {
958 // keyring case
959 if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START + GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS))
961
962 // currencytoken case
963 if (slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(pProto->IsCurrencyToken()))
965
966 // prevent cheating
967 if ((slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) || slot >= PLAYER_SLOT_END)
969 }
970 else
971 {
972 Bag* pBag = GetBagByPos(bag);
973 if (!pBag)
975
976 ItemTemplate const* pBagProto = pBag->GetTemplate();
977 if (!pBagProto)
979
980 if (slot >= pBagProto->ContainerSlots)
982
983 if (!ItemCanGoIntoBag(pProto, pBagProto))
985 }
986
987 // non empty stack with space
988 need_space = pProto->GetMaxStackSize();
989 }
990 // non empty slot, check item type
991 else
992 {
993 // can be merged at least partly
994 InventoryResult res = pItem2->CanBeMergedPartlyWith(pProto);
995 if (res != EQUIP_ERR_OK)
996 return res;
997
998 // free stack space or infinity
999 need_space = pProto->GetMaxStackSize() - pItem2->GetCount();
1000 }
1001
1002 if (need_space > count)
1003 need_space = count;
1004
1005 ItemPosCount newPosition = ItemPosCount((bag << 8) | slot, need_space);
1006 if (!newPosition.isContainedIn(dest))
1007 {
1008 dest.push_back(newPosition);
1009 count -= need_space;
1010 }
1011 return EQUIP_ERR_OK;
1012}
uint32 ContainerSlots
Definition: ItemTemplate.h:655

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_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG, EQUIP_ERR_OK, GetBagByPos(), Item::GetCount(), GetItemByPos(), GetMaxKeyringSize(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, IsBagPos(), ItemPosCount::isContainedIn(), ItemTemplate::IsCurrencyToken(), Item::IsNotEmptyBag(), ItemCanGoIntoBag(), KEYRING_SLOT_START, and PLAYER_SLOT_END.

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItems()

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

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
1247{ 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
832{
833 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(entry);
834 if (!pProto)
835 {
836 if (no_space_count)
837 *no_space_count = count;
839 }
840
841 // no maximum
842 if ((pProto->MaxCount <= 0 && pProto->ItemLimitCategory == 0) || pProto->MaxCount == 2147483647)
843 return EQUIP_ERR_OK;
844
845 if (pProto->MaxCount > 0)
846 {
847 uint32 curcount = GetItemCount(pProto->ItemId, true, pItem);
848 if (curcount + count > uint32(pProto->MaxCount))
849 {
850 if (no_space_count)
851 *no_space_count = count + curcount - pProto->MaxCount;
853 }
854 }
855
856 // check unique-equipped limit
857 if (pProto->ItemLimitCategory)
858 {
859 ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(pProto->ItemLimitCategory);
860 if (!limitEntry)
861 {
862 if (no_space_count)
863 *no_space_count = count;
865 }
866
867 if (limitEntry->mode == ITEM_LIMIT_CATEGORY_MODE_HAVE)
868 {
869 uint32 curcount = GetItemCountWithLimitCategory(pProto->ItemLimitCategory, pItem);
870 if (curcount + count > uint32(limitEntry->maxCount))
871 {
872 if (no_space_count)
873 *no_space_count = count + curcount - limitEntry->maxCount;
875 }
876 }
877 }
878
879 return EQUIP_ERR_OK;
880}
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED
Definition: Item.h:124
@ ITEM_LIMIT_CATEGORY_MODE_HAVE
Definition: DBCEnums.h:384
uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item *skipItem=nullptr) const
Definition: PlayerStorage.cpp:403
uint32 mode
Definition: DBCStructure.h:1180

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 
)
251{
252 return !DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this)
253 && SatisfyQuestStatus(quest, msg) && SatisfyQuestExclusiveGroup(quest, msg)
254 && SatisfyQuestClass(quest, msg) && SatisfyQuestRace(quest, msg) && SatisfyQuestLevel(quest, msg)
255 && SatisfyQuestSkill(quest, msg) && SatisfyQuestReputation(quest, msg)
256 && SatisfyQuestPreviousQuest(quest, msg) && SatisfyQuestTimed(quest, msg)
257 && SatisfyQuestNextChain(quest, msg) && SatisfyQuestPrevChain(quest, msg)
258 && SatisfyQuestDay(quest, msg) && SatisfyQuestWeek(quest, msg)
259 && SatisfyQuestMonth(quest, msg) && SatisfyQuestSeasonal(quest, msg)
260 && SatisfyQuestConditions(quest, msg);
261}
bool SatisfyQuestConditions(Quest const *qInfo, bool msg)
Definition: PlayerQuest.cpp:1156
bool SatisfyQuestTimed(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1169
bool SatisfyQuestLevel(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:964
bool SatisfyQuestStatus(Quest const *qInfo, bool msg) const
Definition: PlayerQuest.cpp:1145

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
2447{ return m_canTeleport; }

References m_canTeleport.

◆ CanTitanGrip()

bool Player::CanTitanGrip ( ) const
inline

◆ CanUnequipItem()

InventoryResult Player::CanUnequipItem ( uint16  src,
bool  swap 
) const
2011{
2012 if (!sScriptMgr->CanUnequipItem(const_cast<Player*>(this), pos, swap))
2014
2015 // Applied only to equipped items and bank bags
2016 if (!IsEquipmentPos(pos) && !IsBagPos(pos))
2017 return EQUIP_ERR_OK;
2018
2019 Item* pItem = GetItemByPos(pos);
2020
2021 // Applied only to existed equipped item
2022 if (!pItem)
2023 return EQUIP_ERR_OK;
2024
2025 LOG_DEBUG("entities.player.items", "STORAGE: CanUnequipItem slot = {}, item = {}, count = {}", pos, pItem->GetEntry(), pItem->GetCount());
2026
2027 ItemTemplate const* pProto = pItem->GetTemplate();
2028 if (!pProto)
2030
2031 // item used
2032 if (pItem->m_lootGenerated)
2034
2035 // do not allow unequipping gear except weapons, offhands, projectiles, relics in
2036 // - combat
2037 // - in-progress arenas
2038 if (!pProto->CanChangeEquipStateInCombat())
2039 {
2040 if (IsInCombat())
2042
2043 if (Battleground* bg = GetBattleground())
2044 if (bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS)
2046 }
2047
2048 // Xinef: dont allow to unequip items on disarmed slot
2051
2052 if (!swap && pItem->IsNotEmptyBag())
2054
2055 return EQUIP_ERR_OK;
2056}

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
305{
306 uint32 tempcount = 0;
307
309
311 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
312 if (pItem->GetEntry() == item)
313 {
315 if (ires == EQUIP_ERR_OK)
316 {
317 tempcount += pItem->GetCount();
318 if (tempcount >= count)
319 return EQUIP_ERR_OK;
320 }
321 else
322 res = ires;
323 }
324
326 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
327 if (pItem->GetEntry() == item)
328 {
329 tempcount += pItem->GetCount();
330 if (tempcount >= count)
331 return EQUIP_ERR_OK;
332 }
333
335 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
336 if (pItem->GetEntry() == item)
337 {
338 tempcount += pItem->GetCount();
339 if (tempcount >= count)
340 return EQUIP_ERR_OK;
341 }
342
344 if (Bag* pBag = GetBagByPos(i))
345 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
346 if (Item* pItem = GetItemByPos(i, j))
347 if (pItem->GetEntry() == item)
348 {
349 tempcount += pItem->GetCount();
350 if (tempcount >= count)
351 return EQUIP_ERR_OK;
352 }
353
354 // not found req. item count and have unequippable items
355 return res;
356}
@ EQUIPMENT_SLOT_START
Definition: Player.h:675

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.
12904{
12905 Group const* grp = GetGroup();
12906 if (!grp)
12907 return ERR_NOT_IN_GROUP;
12908
12909 if (grp->isLFGGroup(true))
12910 {
12911 ObjectGuid gguid = grp->GetGUID();
12912 if (!sLFGMgr->GetKicksLeft(gguid))
12914
12915 lfg::LfgState state = sLFGMgr->GetState(gguid);
12916 if (state == lfg::LFG_STATE_BOOT)
12918
12921
12924
12925 if (grp->isRollLootActive())
12927
12929 for (GroupReference const* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
12930 if (itr->GetSource() && itr->GetSource()->IsInMap(this) && itr->GetSource()->IsInCombat())
12932
12933 if (Player* target = ObjectAccessor::FindConnectedPlayer(targetPlayerGUID))
12934 {
12935 if (Aura* dungeonCooldownAura = target->GetAura(lfg::LFG_SPELL_DUNGEON_COOLDOWN))
12936 {
12937 int32 elapsedTime = dungeonCooldownAura->GetMaxDuration() - dungeonCooldownAura->GetDuration();
12938 if (static_cast<int32>(sWorld->getIntConfig(CONFIG_LFG_KICK_PREVENTION_TIMER)) > elapsedTime)
12939 {
12941 }
12942 }
12943 }
12944
12945 /* Missing support for these types
12946 return ERR_PARTY_LFG_BOOT_COOLDOWN_S;
12947 */
12948 }
12949 else
12950 {
12951 if (!grp->IsLeader(GetGUID()) && !grp->IsAssistant(GetGUID()))
12952 return ERR_NOT_LEADER;
12953
12954 if (InBattleground())
12955 return ERR_INVITE_RESTRICTED;
12956 }
12957
12958 return ERR_PARTY_RESULT_OK;
12959}
@ CONFIG_LFG_KICK_PREVENTION_TIMER
Definition: IWorld.h:412
@ ERR_PARTY_LFG_BOOT_LOOT_ROLLS
Definition: SharedDefines.h:3704
@ ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S
Definition: SharedDefines.h:3699
@ ERR_PARTY_LFG_BOOT_LIMIT
Definition: SharedDefines.h:3695
@ ERR_NOT_LEADER
Definition: SharedDefines.h:3684
@ ERR_NOT_IN_GROUP
Definition: SharedDefines.h:3683
@ ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE
Definition: SharedDefines.h:3703
@ ERR_PARTY_LFG_BOOT_IN_COMBAT
Definition: SharedDefines.h:3701
@ ERR_PARTY_LFG_BOOT_IN_PROGRESS
Definition: SharedDefines.h:3697
@ ERR_INVITE_RESTRICTED
Definition: SharedDefines.h:3688
@ ERR_PARTY_RESULT_OK
Definition: SharedDefines.h:3677
@ ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS
Definition: SharedDefines.h:3698
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:262
bool InBattleground() const
Definition: Player.h:2201
bool isLFGGroup(bool restricted=false) const
Definition: Group.cpp:2204
bool IsAssistant(ObjectGuid guid) const
Definition: Group.cpp:2294
bool isRollLootActive() const
Definition: Group.cpp:2397
bool IsLeader(ObjectGuid guid) const
Definition: Group.cpp:2280
ObjectGuid GetGUID() const
Definition: Group.cpp:2245
uint32 GetMembersCount() const
Definition: Group.h:244
GroupReference * GetFirstMember()
Definition: Group.h:242
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
2491{
2492 LOG_DEBUG("entities.player.items", "STORAGE: CanUseAmmo item = {}", item);
2493 if (!IsAlive())
2495 //if (isStunned())
2496 // return EQUIP_ERR_YOU_ARE_STUNNED;
2497 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
2498 if (pProto)
2499 {
2500 if (pProto->InventoryType != INVTYPE_AMMO)
2502
2503 InventoryResult res = CanUseItem(pProto);
2504 if (res != EQUIP_ERR_OK)
2505 return res;
2506
2507 /*if (GetReputationMgr().GetReputation() < pProto->RequiredReputation)
2508 return EQUIP_ERR_CANT_EQUIP_REPUTATION;
2509 */
2510
2511 // Requires No Ammo
2512 if (HasAura(46699))
2513 return EQUIP_ERR_BAG_FULL6;
2514
2515 return EQUIP_ERR_OK;
2516 }
2518}
@ EQUIP_ERR_YOU_ARE_DEAD
Definition: Item.h:79
@ EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE
Definition: Item.h:48
@ EQUIP_ERR_BAG_FULL6
Definition: Item.h:103
@ INVTYPE_AMMO
Definition: ItemTemplate.h:289

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
13113{
13114 // It is possible to call this method will a nullptr pointer, only skipping faction check.
13115 if (gameobject)
13116 {
13117 FactionTemplateEntry const* playerFaction = GetFactionTemplateEntry();
13118 FactionTemplateEntry const* faction = sFactionTemplateStore.LookupEntry(gameobject->GetUInt32Value(GAMEOBJECT_FACTION));
13119
13120 if (playerFaction && faction && !playerFaction->IsFriendlyTo(*faction))
13121 return false;
13122 }
13123
13129 return (!isTotalImmune() && // Damage immune
13130 !HasAura(SPELL_RECENTLY_DROPPED_FLAG) && // Still has recently held flag debuff
13131 IsAlive()); // Alive
13132}
@ SPELL_RECENTLY_DROPPED_FLAG
Definition: Battleground.h:139
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
@ GAMEOBJECT_FACTION
Definition: UpdateFields.h:402
bool isTotalImmune() const
Definition: Player.cpp:13204
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition: Unit.cpp:10007
Definition: DBCStructure.h:930
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition: DBCStructure.h:942

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.
2246{
2247 if (pItem)
2248 {
2249 LOG_DEBUG("entities.player.items", "STORAGE: CanUseItem item = {}", pItem->GetEntry());
2250
2251 if (!IsAlive() && not_loading)
2253
2254 //if (isStunned())
2255 // return EQUIP_ERR_YOU_ARE_STUNNED;
2256
2257 ItemTemplate const* pProto = pItem->GetTemplate();
2258 if (pProto)
2259 {
2260 if (pItem->IsBindedNotWith(this))
2262
2263 InventoryResult res = CanUseItem(pProto);
2264 if (res != EQUIP_ERR_OK)
2265 return res;
2266
2267 if (pItem->GetSkill() != 0)
2268 {
2269 bool allowEquip = false;
2270 uint32 itemSkill = pItem->GetSkill();
2271 // Armor that is binded to account can "morph" from plate to mail, etc. if skill is not learned yet.
2272 if (pProto->Quality == ITEM_QUALITY_HEIRLOOM && pProto->Class == ITEM_CLASS_ARMOR && !HasSkill(itemSkill))
2273 {
2275
2276 // In fact it's a visual bug, everything works properly... I need sniffs of operations with
2277 // binded to account items from off server.
2278
2279 switch (getClass())
2280 {
2281 case CLASS_HUNTER:
2282 case CLASS_SHAMAN:
2283 allowEquip = (itemSkill == SKILL_MAIL);
2284 break;
2285 case CLASS_PALADIN:
2286 case CLASS_WARRIOR:
2287 allowEquip = (itemSkill == SKILL_PLATE_MAIL);
2288 break;
2289 }
2290 }
2291 if (!allowEquip && GetSkillValue(itemSkill) == 0)
2293 }
2294
2297
2298 return EQUIP_ERR_OK;
2299 }
2300 }
2302}
@ EQUIP_ERR_CANT_EQUIP_REPUTATION
Definition: Item.h:105
@ ITEM_QUALITY_HEIRLOOM
Definition: SharedDefines.h:308
@ SKILL_PLATE_MAIL
Definition: SharedDefines.h:2923
@ SKILL_MAIL
Definition: SharedDefines.h:2934
uint32 GetSkill()
Definition: Item.cpp:557
uint32 Quality
Definition: ItemTemplate.h:635

References CanUseItem(), ItemTemplate::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, Unit::getClass(), Object::GetEntry(), GetReputationRank(), Item::GetSkill(), GetSkillValue(), Item::GetTemplate(), HasSkill(), Unit::IsAlive(), Item::IsBindedNotWith(), 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
2305{
2306 // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
2307
2308 if (!proto)
2309 {
2311 }
2312
2313 if ((proto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && GetTeamId(true) != TEAM_HORDE)
2314 {
2316 }
2317
2318 if ((proto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && GetTeamId(true) != TEAM_ALLIANCE)
2319 {
2321 }
2322
2323 if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
2324 {
2326 }
2327
2328 if (proto->RequiredSkill != 0)
2329 {
2330 if (GetSkillValue(proto->RequiredSkill) == 0)
2331 {
2333 }
2334 else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
2335 {
2337 }
2338 }
2339
2340 if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
2341 {
2343 }
2344
2345 if (GetLevel() < proto->RequiredLevel)
2346 {
2348 }
2349
2350 // If World Event is not active, prevent using event dependant items
2351 if (proto->HolidayId && !IsHolidayActive((HolidayIds)proto->HolidayId))
2352 {
2354 }
2355
2357
2358 if (!sScriptMgr->CanUseItem(const_cast<Player*>(this), proto, result))
2359 {
2360 return result;
2361 }
2362
2363 return EQUIP_ERR_OK;
2364}
@ EQUIP_ERR_CANT_EQUIP_LEVEL_I
Definition: Item.h:42
bool IsHolidayActive(HolidayIds id)
Definition: GameEventMgr.cpp:1910
HolidayIds
Definition: SharedDefines.h:2713

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, ItemTemplate::Flags2, Unit::getClassMask(), Unit::GetLevel(), Unit::getRaceMask(), GetSkillValue(), GetTeamId(), HasSpell(), ItemTemplate::HolidayId, IsHolidayActive(), ITEM_FLAGS_EXTRA_ALLIANCE_ONLY, ITEM_FLAGS_EXTRA_HORDE_ONLY, 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 
)
7094{
7095 if (!target || !target->IsAlive() || target == this)
7096 return;
7097
7098 // Xinef: do not use disarmed weapons, special exception - shaman ghost wolf form
7099 // Xinef: normal forms proc on hit enchants / built in item bonuses
7101 return;
7102
7104 {
7105 // If usable, try to cast item spell
7106 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
7107 if (!item->IsBroken())
7108 if (ItemTemplate const* proto = item->GetTemplate())
7109 {
7110 // Additional check for weapons
7111 if (proto->Class == ITEM_CLASS_WEAPON)
7112 {
7113 // offhand item cannot proc from main hand hit etc
7114 EquipmentSlots slot;
7115 switch (attType)
7116 {
7117 case BASE_ATTACK:
7119 break;
7120 case OFF_ATTACK:
7122 break;
7123 case RANGED_ATTACK:
7124 slot = EQUIPMENT_SLOT_RANGED;
7125 break;
7126 default:
7127 slot = EQUIPMENT_SLOT_END;
7128 break;
7129 }
7130 if (slot != i)
7131 continue;
7132 }
7133
7134 CastItemCombatSpell(target, attType, procVictim, procEx, item, proto);
7135 }
7136 }
7137}
EquipmentSlots
Definition: Player.h:674
@ FORM_GHOSTWOLF
Definition: Unit.h:106
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition: Player.cpp:7093

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 
)
7140{
7141 if (!sScriptMgr->CanCastItemCombatSpell(this, target, attType, procVictim, procEx, item, proto))
7142 return;
7143
7144 // Can do effect if any damage done to target
7145 if (procVictim & PROC_FLAG_TAKEN_DAMAGE)
7146 //if (damageInfo->procVictim & PROC_FLAG_TAKEN_ANY_DAMAGE)
7147 {
7148 for (uint8 i = 0; i < MAX_ITEM_SPELLS; ++i)
7149 {
7150 _Spell const& spellData = proto->Spells[i];
7151
7152 // no spell
7153 if (!spellData.SpellId)
7154 continue;
7155
7156 // wrong triggering type
7158 continue;
7159
7160 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
7161 if (!spellInfo)
7162 {
7163 LOG_ERROR("entities.player", "WORLD: unknown Item spellid {}", spellData.SpellId);
7164 continue;
7165 }
7166
7167 float chance = (float)spellInfo->ProcChance;
7168
7169 if (spellData.SpellPPMRate)
7170 {
7171 uint32 WeaponSpeed = GetAttackTime(attType);
7172 chance = GetPPMProcChance(WeaponSpeed, spellData.SpellPPMRate, spellInfo);
7173 }
7174 else if (chance > 100.0f)
7175 {
7176 chance = GetWeaponProcChance();
7177 }
7178
7179 if (roll_chance_f(chance) && sScriptMgr->OnCastItemCombatSpell(this, target, spellInfo, item))
7181 }
7182 }
7183
7184 // item combat enchantments
7185 for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
7186 {
7187 uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
7188 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
7189 if (!pEnchant)
7190 continue;
7191
7192 for (uint8 s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
7193 {
7194 if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)
7195 continue;
7196
7197 SpellEnchantProcEntry const* entry = sSpellMgr->GetSpellEnchantProcEvent(enchant_id);
7198
7199 if (entry && entry->procEx)
7200 {
7201 // Check hit/crit/dodge/parry requirement
7202 if ((entry->procEx & procEx) == 0)
7203 continue;
7204 }
7205 else
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 continue;
7211 }
7212
7213 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);
7214 if (!spellInfo)
7215 {
7216 LOG_ERROR("entities.player", "Player::CastItemCombatSpell({}, name: {}, enchant: {}): unknown spell {} is casted, ignoring...",
7217 GetGUID().ToString(), GetName(), pEnchant->ID, pEnchant->spellid[s]);
7218 continue;
7219 }
7220
7221 float chance = pEnchant->amount[s] != 0 ? float(pEnchant->amount[s]) : GetWeaponProcChance();
7222
7223 if (entry)
7224 {
7225 if (entry->PPMChance)
7226 chance = GetPPMProcChance(proto->Delay, entry->PPMChance, spellInfo);
7227 else if (entry->customChance)
7228 chance = (float)entry->customChance;
7229 }
7230
7231 // Apply spell mods
7232 ApplySpellMod(pEnchant->spellid[s], SPELLMOD_CHANCE_OF_SUCCESS, chance);
7233
7234 // Shiv has 100% chance to apply the poison
7235 if (FindCurrentSpellBySpellId(5938) && e_slot == TEMP_ENCHANTMENT_SLOT)
7236 chance = 100.0f;
7237
7238 if (roll_chance_f(chance))
7239 {
7240 // Xinef: implement enchant charges
7241 if (uint32 charges = item->GetEnchantmentCharges(EnchantmentSlot(e_slot)))
7242 {
7243 if (!--charges)
7244 {
7245 ApplyEnchantment(item, EnchantmentSlot(e_slot), false);
7246 item->ClearEnchantment(EnchantmentSlot(e_slot));
7247 }
7248 else
7249 item->SetEnchantmentCharges(EnchantmentSlot(e_slot), charges);
7250 }
7251
7252 if (spellInfo->IsPositive())
7254 else
7256 }
7257 }
7258 }
7259}
bool roll_chance_f(float chance)
Definition: Random.h:53
@ ITEM_SPELLTRIGGER_CHANCE_ON_HIT
Definition: ItemTemplate.h:80
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition: SpellDefines.h:95
@ TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD
Will ignore GCD.
Definition: SpellDefines.h:133
@ PROC_FLAG_TAKEN_DAMAGE
Definition: SpellMgr.h:137
void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
Definition: Item.cpp:953
void ClearEnchantment(EnchantmentSlot slot)
Definition: Item.cpp:962
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const
Definition: Item.h:297
float SpellPPMRate
Definition: ItemTemplate.h:603
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition: Unit.cpp:13362
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition: Unit.cpp:4084
float GetWeaponProcChance() const
Definition: Unit.cpp:13351
bool IsPositive() const
Definition: SpellInfo.cpp:1221
uint32 ProcChance
Definition: SpellInfo.h:354
Definition: SpellMgr.h:308
uint32 procEx
Definition: SpellMgr.h:311
uint32 customChance
Definition: SpellMgr.h:309
float PPMChance
Definition: SpellMgr.h:310
uint32 ID
Definition: DBCStructure.h:1818

References SpellItemEnchantmentEntry::amount, ApplyEnchantment(), ApplySpellMod(), Unit::CastSpell(), Item::ClearEnchantment(), SpellEnchantProcEntry::customChance, ItemTemplate::Delay, Unit::FindCurrentSpellBySpellId(), Unit::GetAttackTime(), Item::GetEnchantmentCharges(), Item::GetEnchantmentId(), Object::GetGUID(), WorldObject::GetName(), Unit::GetPPMProcChance(), Unit::GetWeaponProcChance(), 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::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 
)
7262{
7263 if (!sScriptMgr->CanCastItemUseSpell(this, item, targets, cast_count, glyphIndex))
7264 return;
7265
7266 ItemTemplate const* proto = item->GetTemplate();
7267 // special learning case
7268 if (proto->Spells[0].SpellId == 483 || proto->Spells[0].SpellId == 55884)
7269 {
7270 uint32 learn_spell_id = proto->Spells[0].SpellId;
7271 uint32 learning_spell_id = proto->Spells[1].SpellId;
7272
7273 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learn_spell_id);
7274 if (!spellInfo)
7275 {
7276 LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: {}) in have wrong spell id {}, ignoring ", proto->ItemId, learn_spell_id);
7277 SendEquipError(EQUIP_ERR_NONE, item, nullptr);
7278 return;
7279 }
7280
7281 Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE);
7282 spell->m_CastItem = item;
7283 spell->m_cast_count = cast_count; //set count of casts
7284 spell->SetSpellValue(SPELLVALUE_BASE_POINT0, learning_spell_id);
7285 spell->prepare(&targets);
7286 return;
7287 }
7288
7289 // use triggered flag only for items with many spell casts and for not first cast
7290 uint8 count = 0;
7291
7292 std::list<Spell*> pushSpells;
7293 // item spells casted at use
7294 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
7295 {
7296 _Spell const& spellData = proto->Spells[i];
7297
7298 // no spell
7299 if (!spellData.SpellId)
7300 continue;
7301
7302 // wrong triggering type
7303 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
7304 continue;
7305
7306 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
7307 if (!spellInfo)
7308 {
7309 LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: {}) in have wrong spell id {}, ignoring", proto->ItemId, spellData.SpellId);
7310 continue;
7311 }
7312
7313 if (HasSpellCooldown(spellInfo->Id))
7314 {
7315 continue;
7316 }
7317
7318 if (!spellInfo->CheckElixirStacking(this))
7319 {
7320 Spell::SendCastResult(this, spellInfo, cast_count, SPELL_FAILED_AURA_BOUNCED);
7321 continue;
7322 }
7323
7324 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
7325 spell->m_CastItem = item;
7326 spell->m_cast_count = cast_count; // set count of casts
7327 spell->m_glyphIndex = glyphIndex; // glyph index
7328 spell->InitExplicitTargets(targets);
7329
7330 // Xinef: dont allow to cast such spells, it may happen that spell possess 2 spells, one for players and one for items / gameobjects
7331 // 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
7332 // Xinef: there is one problem with scripts which wont be loaded at the moment of call
7333 SpellCastResult result = spell->CheckCast(true);
7334 if (result != SPELL_CAST_OK)
7335 {
7336 spell->SendCastResult(result);
7337 delete spell;
7338 continue;
7339 }
7340
7341 pushSpells.push_back(spell);
7342 //spell->prepare(&targets);
7343
7344 ++count;
7345 }
7346
7347 // Item enchantments spells casted at use
7348 for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
7349 {
7350 uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
7351 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
7352 if (!pEnchant)
7353 continue;
7354 for (uint8 s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
7355 {
7356 if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_USE_SPELL)
7357 continue;
7358
7359 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);
7360 if (!spellInfo)
7361 {
7362 LOG_ERROR("entities.player", "Player::CastItemUseSpell Enchant {}, cast unknown spell {}", pEnchant->ID, pEnchant->spellid[s]);
7363 continue;
7364 }
7365
7366 if (HasSpellCooldown(spellInfo->Id))
7367 continue;
7368
7369 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
7370 spell->m_CastItem = item;
7371 spell->m_cast_count = cast_count; // set count of casts
7372 spell->m_glyphIndex = glyphIndex; // glyph index
7373 spell->InitExplicitTargets(targets);
7374
7375 // Xinef: dont allow to cast such spells, it may happen that spell possess 2 spells, one for players and one for items / gameobjects
7376 // 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
7377 // Xinef: there is one problem with scripts which wont be loaded at the moment of call
7378 SpellCastResult result = spell->CheckCast(true);
7379 if (result != SPELL_CAST_OK)
7380 {
7381 spell->SendCastResult(result);
7382 delete spell;
7383 continue;
7384 }
7385
7386 pushSpells.push_back(spell);
7387 //spell->prepare(&targets);
7388
7389 ++count;
7390 }
7391 }
7392
7393 // xinef: send all spells in one go, prevents crash because container is not set
7394 for (std::list<Spell*>::const_iterator itr = pushSpells.begin(); itr != pushSpells.end(); ++itr)
7395 (*itr)->prepare(&targets);
7396}
@ EQUIP_ERR_NONE
Definition: Item.h:100
@ SPELLVALUE_BASE_POINT0
Definition: SpellDefines.h:114
@ TRIGGERED_NONE
Definition: SpellDefines.h:131
SpellCastResult
Definition: SharedDefines.h:920
@ SPELL_FAILED_AURA_BOUNCED
Definition: SharedDefines.h:930
bool HasSpellCooldown(uint32 spell_id) const override
Definition: Player.cpp:16214
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition: Spell.cpp:3450
void SetSpellValue(SpellValueMod mod, int32 value)
Definition: Spell.cpp:8392
uint8 m_cast_count
Definition: Spell.h:524
uint32 m_glyphIndex
Definition: Spell.h:525
SpellCastResult CheckCast(bool strict)
Definition: Spell.cpp:5612
void InitExplicitTargets(SpellCastTargets const &targets)
Definition: Spell.cpp:707
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition: Spell.cpp:4631
Item * m_CastItem
Definition: Spell.h:521
bool CheckElixirStacking(Unit const *caster) const
Definition: SpellInfo.cpp:2873

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 ( )
9542{
9543 Unit* charm = GetFirstControlled();
9544 if (!charm)
9545 return;
9546
9547 CharmInfo* charmInfo = charm->GetCharmInfo();
9548 if (!charmInfo)
9549 {
9550 LOG_ERROR("entities.player", "Player::CharmSpellInitialize(): the player's charm ({}) has no charminfo!", charm->GetGUID().ToString());
9551 return;
9552 }
9553
9554 uint8 addlist = 0;
9555 if (charm->GetTypeId() != TYPEID_PLAYER)
9556 {
9557 //CreatureInfo const* cinfo = charm->ToCreature()->GetCreatureTemplate();
9558 //if (cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK)
9559 {
9560 for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i)
9561 if (charmInfo->GetCharmSpell(i)->GetAction())
9562 ++addlist;
9563 }
9564 }
9565
9566 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 4 * addlist + 1);
9567 data << charm->GetGUID();
9568 data << uint16(0);
9569 data << uint32(0);
9570
9571 if (charm->GetTypeId() != TYPEID_PLAYER)
9572 data << uint8(charm->ToCreature()->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
9573 else
9574 data << uint32(0);
9575
9576 charmInfo->BuildActionBar(&data);
9577
9578 data << uint8(addlist);
9579
9580 if (addlist)
9581 {
9582 for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i)
9583 {
9584 CharmSpellInfo* cspell = charmInfo->GetCharmSpell(i);
9585 if (cspell->GetAction())
9586 data << uint32(cspell->packedData);
9587 }
9588 }
9589
9590 data << uint8(0); // cooldowns count
9591
9592 GetSession()->SendPacket(&data);
9593}
#define MAX_SPELL_CHARM
Definition: Unit.h:157
#define MAX_UNIT_ACTION_BAR_INDEX
Definition: Unit.h:1091
@ SMSG_PET_SPELLS
Definition: Opcodes.h:407
ReactStates GetReactState() const
Definition: Creature.h:90
Definition: Unit.h:1041
uint32 packedData
Definition: Unit.h:1044
uint32 GetAction() const
Definition: Unit.h:1048
Definition: Unit.h:1094
CharmSpellInfo * GetCharmSpell(uint8 index)
Definition: Unit.h:1125
CommandStates GetCommandState() const
Definition: Unit.h:1103
void BuildActionBar(WorldPacket *data)
Definition: Unit.cpp:15985
CharmInfo * GetCharmInfo()
Definition: Unit.h:1883
Unit * GetFirstControlled() const
Definition: Unit.cpp:11030

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

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

◆ CheckAllAchievementCriteria()

void Player::CheckAllAchievementCriteria ( )
13784{
13786}
void CheckAllAchievementCriteria()
Definition: AchievementMgr.cpp:767

References AchievementMgr::CheckAllAchievementCriteria(), and m_achievementMgr.

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

◆ CheckAmmoCompatibility()

bool Player::CheckAmmoCompatibility ( ItemTemplate const *  ammo_proto) const
7540{
7541 if (!ammo_proto)
7542 return false;
7543
7544 // check ranged weapon
7546 if (!weapon || weapon->IsBroken())
7547 return false;
7548
7549 ItemTemplate const* weapon_proto = weapon->GetTemplate();
7550 if (!weapon_proto || weapon_proto->Class != ITEM_CLASS_WEAPON)
7551 return false;
7552
7553 // check ammo ws. weapon compatibility
7554 switch (weapon_proto->SubClass)
7555 {
7558 if (ammo_proto->SubClass != ITEM_SUBCLASS_ARROW)
7559 return false;
7560 break;
7562 if (ammo_proto->SubClass != ITEM_SUBCLASS_BULLET)
7563 return false;
7564 break;
7565 default:
7566 return false;
7567 }
7568
7569 return true;
7570}
@ ITEM_SUBCLASS_WEAPON_CROSSBOW
Definition: ItemTemplate.h:371
@ ITEM_SUBCLASS_WEAPON_GUN
Definition: ItemTemplate.h:356
@ ITEM_SUBCLASS_WEAPON_BOW
Definition: ItemTemplate.h:355
@ ITEM_SUBCLASS_ARROW
Definition: ItemTemplate.h:425
@ ITEM_SUBCLASS_BULLET
Definition: ItemTemplate.h:426
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition: PlayerStorage.cpp:519

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 ( )
5618{
5619 if (!IsAlive())
5620 return;
5621
5622 if (IsInFlight())
5623 return;
5624
5625 bool isOutdoor = IsOutdoors();
5626 uint32 areaId = GetAreaId();
5627 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
5628
5629 if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && _wasOutdoor != isOutdoor)
5630 {
5631 _wasOutdoor = isOutdoor;
5632
5634 SpellAttr0 attrToRecalculate = isOutdoor ? SPELL_ATTR0_ONLY_OUTDOORS : SPELL_ATTR0_ONLY_INDOORS;
5635 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5636 {
5637 Aura* aura = iter->second->GetBase();
5638 SpellInfo const* spell = aura->GetSpellInfo();
5639 if (spell->Attributes & attrToRemove)
5640 {
5641 // if passive - do not remove and just turn off all effects
5642 if (aura->IsPassive())
5643 {
5644 aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, false);
5645 ++iter;
5646 continue;
5647 }
5648
5649 RemoveAura(iter);
5650 }
5651 else if ((spell->Attributes & attrToRecalculate) && aura->IsPassive())
5652 {
5653 // if passive - turn on all effects
5654 aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, true);
5655 ++iter;
5656 }
5657 else
5658 {
5659 ++iter;
5660 }
5661 }
5662 }
5663
5664 if (!sScriptMgr->CanAreaExploreAndOutdoor(this))
5665 return;
5666
5667 if (!areaId)
5668 return;
5669
5670 if (!areaEntry)
5671 {
5672 LOG_ERROR("entities.player", "Player '{}' ({}) discovered unknown area (x: {} y: {} z: {} map: {})",
5674 return;
5675 }
5676
5677 uint32 offset = areaEntry->exploreFlag / 32;
5678
5679 if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
5680 {
5681 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);
5682 return;
5683 }
5684
5685 uint32 val = (uint32)(1 << (areaEntry->exploreFlag % 32));
5686 uint32 currFields = GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset);
5687
5688 if (!(currFields & val))
5689 {
5690 SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields | val));
5691
5693
5694 if (areaEntry->area_level > 0)
5695 {
5696 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
5697 {
5698 SendExplorationExperience(areaId, 0);
5699 }
5700 else
5701 {
5702 int32 diff = int32(GetLevel()) - areaEntry->area_level;
5703 uint32 XP = 0;
5704 if (diff < -5)
5705 {
5706 XP = uint32(sObjectMgr->GetBaseXP(GetLevel() + 5) * sWorld->getRate(RATE_XP_EXPLORE));
5707 }
5708 else if (diff > 5)
5709 {
5710 int32 exploration_percent = (100 - ((diff - 5) * 5));
5711 if (exploration_percent > 100)
5712 exploration_percent = 100;
5713 else if (exploration_percent < 0)
5714 exploration_percent = 0;
5715
5716 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * exploration_percent / 100 * sWorld->getRate(RATE_XP_EXPLORE));
5717 }
5718 else
5719 {
5720 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * sWorld->getRate(RATE_XP_EXPLORE));
5721 }
5722
5723 GiveXP(XP, nullptr);
5724 SendExplorationExperience(areaId, XP);
5725 }
5726 LOG_DEBUG("entities.player", "Player {} discovered a new area: {}", GetGUID().ToString(), areaId);
5727 }
5728 }
5729}
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
@ CONFIG_MAX_PLAYER_LEVEL
Definition: IWorld.h:234
@ CONFIG_VMAP_INDOOR_CHECK
Definition: IWorld.h:127
@ RATE_XP_EXPLORE
Definition: IWorld.h:467
@ ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA
Definition: DBCEnums.h:163
@ SPELL_ATTR0_ONLY_INDOORS
Definition: SharedDefines.h:368
@ SPELL_ATTR0_ONLY_OUTDOORS
Definition: SharedDefines.h:369
bool IsOutdoors() const
Definition: Object.cpp:3100
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:2341
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4708
bool IsInFlight() const
Definition: Unit.h:1676
AuraApplicationMap m_appliedAuras
Definition: Unit.h:2504
void HandleAllEffects(AuraApplication *aurApp, uint8 mode, bool apply)
Definition: SpellAuras.cpp:1255
bool IsPassive() const
Definition: SpellAuras.cpp:1096
uint32 Attributes
Definition: SpellInfo.h:322
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(), Object::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)
6269{
6270 if (!duel)
6271 {
6272 return;
6273 }
6274
6276 GameObject* obj = GetMap()->GetGameObject(duelFlagGUID);
6277 if (!obj)
6278 return;
6279
6280 if (!duel->OutOfBoundsTime)
6281 {
6282 if (!IsWithinDistInMap(obj, 50))
6283 {
6284 duel->OutOfBoundsTime = currTime + 10;
6285
6287 GetSession()->SendPacket(&data);
6288 }
6289 }
6290 else
6291 {
6292 if (IsWithinDistInMap(obj, 40))
6293 {
6294 duel->OutOfBoundsTime = 0;
6295
6297 GetSession()->SendPacket(&data);
6298 }
6299 else if (currTime >= duel->OutOfBoundsTime)
6301 }
6302}
@ PLAYER_DUEL_ARBITER
Definition: UpdateFields.h:177
@ DUEL_FLED
Definition: SharedDefines.h:3586
@ SMSG_DUEL_INBOUNDS
Definition: Opcodes.h:391
@ SMSG_DUEL_OUTOFBOUNDS
Definition: Opcodes.h:390
Definition: GameObject.h:122
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:6309
std::unique_ptr< DuelInfo > duel
Definition: Player.h:1828
GameObject * GetGameObject(ObjectGuid const guid)
Definition: Map.cpp:3298

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
6997{
6998 if (_instanceResetTimes.size() < sWorld->getIntConfig(CONFIG_MAX_INSTANCES_PER_HOUR))
6999 return true;
7000 return _instanceResetTimes.find(instanceId) != _instanceResetTimes.end();
7001}
@ CONFIG_MAX_INSTANCES_PER_HOUR
Definition: IWorld.h:359

References _instanceResetTimes, CONFIG_MAX_INSTANCES_PER_HOUR, and sWorld.

Referenced by MapMgr::PlayerCannotEnter().

◆ CheckInstanceLoginValid()

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

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

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ CleanupAfterTaxiFlight()

void Player::CleanupAfterTaxiFlight ( )
10326{
10327 // For spells that trigger flying paths remove them at arrival
10329 {
10332 }
10333 m_taxi.ClearTaxiDestinations(); // not destinations, clear source node
10334 Dismount();
10337}
@ UNIT_FLAG_TAXI_FLIGHT
Definition: Unit.h:468
void setOnlineOfflineState(bool isOnline)
Definition: HostileRefMgr.cpp:98
void Dismount()
Definition: Unit.cpp:13435
HostileRefMgr & getHostileRefMgr()
Definition: Unit.h:2149

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 ( )
4905{
4906 while (!m_channels.empty())
4907 {
4908 Channel* ch = *m_channels.begin();
4909 m_channels.erase(m_channels.begin()); // remove from player's channel list
4910 ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list
4911 }
4912}
Definition: Channel.h:148
void LeaveChannel(Player *player, bool send=true)
Definition: Channel.cpp:253
JoinedChannelsList m_channels
Definition: Player.h:2783

References Channel::LeaveChannel(), and m_channels.

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

◆ CleanupsBeforeDelete()

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

Reimplemented from WorldObject.

463{
464 TradeCancel(false);
466
467 Unit::CleanupsBeforeDelete(finalCleanup);
468}
@ DUEL_INTERRUPTED
Definition: SharedDefines.h:3584
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition: Unit.cpp:15664

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

Referenced by WorldSession::LogoutPlayer().

◆ ClearAfkReports()

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

References BGData::bgAfkReporter, and m_bgData.

Referenced by Battleground::RemovePlayerAtLeave().

◆ ClearChannelWatch()

void Player::ClearChannelWatch ( )
4915{
4916 for (JoinedChannelsList::iterator itr = m_channels.begin(); itr != m_channels.end(); ++itr)
4917 (*itr)->RemoveWatching(this);
4918}

References m_channels.

Referenced by WorldSession::HandleSetChannelWatch().

◆ ClearReceivedSpectatorResetFor()

void Player::ClearReceivedSpectatorResetFor ( )
inline

◆ clearResurrectRequestData()

void Player::clearResurrectRequestData ( )
inline
1776{ 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:1766

References ObjectGuid::Empty, and setResurrectRequestData().

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

◆ ClearWhisperWhiteList()

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

References WhisperList.

Referenced by message_commandscript::HandleWhispersCommand().

◆ CompletedAchievement()

void Player::CompletedAchievement ( AchievementEntry const *  entry)
13819{
13821}
void CompletedAchievement(AchievementEntry const *entry)
Definition: AchievementMgr.cpp:2193

References AchievementMgr::CompletedAchievement(), and m_achievementMgr.

Referenced by achievement_commandscript::HandleAchievementAddCommand().

◆ CompleteQuest()

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

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 ( )
10340{
10341 uint32 sourceNode = m_taxi.GetTaxiSource();
10342 if (!sourceNode)
10343 return;
10344
10345 LOG_DEBUG("entities.unit", "WORLD: Restart character {} taxi flight", GetGUID().ToString());
10346
10347 uint32 mountDisplayId = sObjectMgr->GetTaxiMountDisplayId(sourceNode, GetTeamId(true), true);
10348 if (!mountDisplayId)
10349 return;
10350
10352
10353 // search appropriate start path node
10354 uint32 startNode = 0;
10355
10356 TaxiPathNodeList const& nodeList = sTaxiPathNodesByPath[path];
10357
10358 float bestDist = SIZE_OF_GRIDS * SIZE_OF_GRIDS; // xinef: large value
10359 float currDist = 0.0f;
10360
10361 // xinef: changed to -1, we dont want to catch last node
10362 for (uint32 i = 0; i < nodeList.size() - 1; ++i)
10363 {
10364 TaxiPathNodeEntry const* node = nodeList[i];
10365 TaxiPathNodeEntry const* nextNode = nodeList[i + 1];
10366
10367 // xinef: skip nodes at another map, get last valid node on current map
10368 if (nextNode->mapid != GetMapId() || node->mapid != GetMapId())
10369 continue;
10370
10371 currDist = (node->x - GetPositionX()) * (node->x - GetPositionX()) + (node->y - GetPositionY()) * (node->y - GetPositionY()) + (node->z - GetPositionZ()) * (node->z - GetPositionZ());
10372 if (currDist < bestDist)
10373 {
10374 startNode = i;
10375 bestDist = currDist;
10376 }
10377 }
10378
10379 // xinef: no proper node was found
10380 if (startNode == 0)
10381 {
10383 return;
10384 }
10385
10387 {
10389 }
10390
10391 if (IsMounted())
10392 {
10394 }
10395
10396 SetCanTeleport(true);
10397
10398 GetSession()->SendDoFlight(mountDisplayId, path, startNode);
10399}
#define SIZE_OF_GRIDS
Definition: MapDefines.h:13
TaxiPathNodesByPath sTaxiPathNodesByPath
Definition: DBCStores.cpp:185
std::vector< TaxiPathNodeEntry const * > TaxiPathNodeList
Definition: DBCStructure.h:2218
void SetCanTeleport(bool value)
Definition: Player.h:2448
uint32 GetTaxiSource() const
Definition: PlayerTaxi.h:64
uint32 GetCurrentTaxiPath() const
Definition: PlayerTaxi.cpp:213
Definition: DBCStructure.h:1949
float y
Definition: DBCStructure.h:1955
float x
Definition: DBCStructure.h:1954
uint32 mapid
Definition: DBCStructure.h:1953
float z
Definition: DBCStructure.h:1956

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 
)
13309{
13310 SetCurrentRune(index, newType);
13311
13313 data << uint8(index);
13314 data << uint8(newType);
13315 GetSession()->SendPacket(&data);
13316}
@ SMSG_CONVERT_RUNE
Definition: Opcodes.h:1188
void SetCurrentRune(uint8 index, RuneType currentRune)
Definition: Player.h:2465

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

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

◆ CorrectMetaGemEnchants()

void Player::CorrectMetaGemEnchants ( uint8  slot,
bool  apply 
)
11105{
11106 //cycle all equipped items
11107 for (uint32 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
11108 {
11109 //enchants for the slot being socketed are handled by Player::ApplyItemMods
11110 if (slot == exceptslot)
11111 continue;
11112
11113 Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
11114
11115 if (!pItem || !pItem->HasSocket())
11116 continue;
11117
11118 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
11119 {
11120 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11121 if (!enchant_id)
11122 continue;
11123
11124 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11125 if (!enchantEntry)
11126 continue;
11127
11128 uint32 condition = enchantEntry->EnchantmentCondition;
11129 if (condition)
11130 {
11131 //was enchant active with/without item?
11132 bool wasactive = EnchantmentFitsRequirements(condition, apply ? exceptslot : -1);
11133 //should it now be?
11134 if (wasactive ^ EnchantmentFitsRequirements(condition, apply ? -1 : exceptslot))
11135 {
11136 // ignore item gem conditions
11137 //if state changed, (dis)apply enchant
11138 ApplyEnchantment(pItem, EnchantmentSlot(enchant_slot), !wasactive, true, true);
11139 }
11140 }
11141 }
11142 }
11143}

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
471{
472 // FIXME: outfitId not used in player creating
474 // should check that skin, face, hair* are valid via DBC per race/class
475 // also do it in Player::BuildEnumData, Player::LoadFromDB
476
477 Object::_Create(guidlow, 0, HighGuid::Player);
478
479 m_name = createInfo->Name;
480
481 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(createInfo->Race, createInfo->Class);
482 if (!info)
483 {
484 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.",
485 GetSession()->GetAccountId(), m_name, createInfo->Race, createInfo->Class);
486 return false;
487 }
488
489 for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; i++)
490 m_items[i] = nullptr;
491
492 Relocate(info->positionX, info->positionY, info->positionZ, info->orientation);
493
494 ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(createInfo->Class);
495 if (!cEntry)
496 {
497 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?)",
498 GetSession()->GetAccountId(), m_name, createInfo->Class);
499 return false;
500 }
501
502 SetMap(sMapMgr->CreateMap(info->mapId, this));
503
504 uint8 powertype = cEntry->powerType;
505
506 SetObjectScale(1.0f);
507
508 m_realRace = createInfo->Race; // set real race flag
509 m_race = createInfo->Race; // set real race flag
510
511 SetFactionForRace(createInfo->Race);
512
513 if (!IsValidGender(createInfo->Gender))
514 {
515 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid gender ({}) - refusing to do so",
516 GetSession()->GetAccountId(), m_name, createInfo->Gender);
517 return false;
518 }
519
520 uint32 RaceClassGender = (createInfo->Race) | (createInfo->Class << 8) | (createInfo->Gender << 16);
521
522 SetUInt32Value(UNIT_FIELD_BYTES_0, (RaceClassGender | (powertype << 24)));
524 if (sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP)
525 {
528 }
530 SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); // fix cast time showed in spell tooltip on client
531 SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); // default for players in 3.0.3
532
533 // -1 is default value
535
536 SetUInt32Value(PLAYER_BYTES, (createInfo->Skin | (createInfo->Face << 8) | (createInfo->HairStyle << 16) | (createInfo->HairColor << 24)));
538 (0x00 << 8) |
539 (0x00 << 16) |
540 (((GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED) << 24)));
541 SetByteValue(PLAYER_BYTES_3, 0, createInfo->Gender);
542 SetByteValue(PLAYER_BYTES_3, 3, 0); // BattlefieldArenaFaction (0 or 1)
543
547
548 for (int i = 0; i < KNOWN_TITLES_SIZE; ++i)
549 SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES + i, 0); // 0=disabled
551
556
557 // set starting level
558 uint32 start_level = getClass() != CLASS_DEATH_KNIGHT
559 ? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL)
561
563 {
564 uint32 gm_level = sWorld->getIntConfig(CONFIG_START_GM_LEVEL);
565 if (gm_level > start_level)
566 start_level = gm_level;
567 }
568
569 SetUInt32Value(UNIT_FIELD_LEVEL, start_level);
570
571 InitRunes();
572
574 ? sWorld->getIntConfig(CONFIG_START_PLAYER_MONEY)
578
579 // Played time
583
584 // base stats and related field values
589 InitPrimaryProfessions(); // to max set before any spell added
590
591 // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
592 UpdateMaxHealth(); // Update max Health (for add bonus from stamina)
594 if (getPowerType() == POWER_MANA)
595 {
596 UpdateMaxPower(POWER_MANA); // Update max Mana (for add bonus from intellect)
598 }
599
601 {
606 }
607
608 // original spells
611
612 // original action bar
613 for (PlayerCreateInfoActions::const_iterator action_itr = info->action.begin(); action_itr != info->action.end(); ++action_itr)
614 addActionButton(action_itr->button, action_itr->action, action_itr->type);
615
616 // original items
617 if (CharStartOutfitEntry const* oEntry = GetCharStartOutfitEntry(createInfo->Race, createInfo->Class, createInfo->Gender))
618 {
619 for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j)
620 {
621 if (oEntry->ItemId[j] <= 0)
622 continue;
623
624 uint32 itemId = oEntry->ItemId[j];
625
626 // just skip, reported in ObjectMgr::LoadItemTemplates
627 ItemTemplate const* iProto = sObjectMgr->GetItemTemplate(itemId);
628 if (!iProto)
629 continue;
630
631 // BuyCount by default
632 uint32 count = iProto->BuyCount;
633
634 // special amount for food/drink
635 if (iProto->Class == ITEM_CLASS_CONSUMABLE && iProto->SubClass == ITEM_SUBCLASS_FOOD)
636 {
637 switch (iProto->Spells[0].SpellCategory)
638 {
639 case SPELL_CATEGORY_FOOD: // food
640 count = getClass() == CLASS_DEATH_KNIGHT ? 10 : 4;
641 break;
642 case SPELL_CATEGORY_DRINK: // drink
643 count = 2;
644 break;
645 }
646 if (iProto->GetMaxStackSize() < count)
647 count = iProto->GetMaxStackSize();
648 }
649 StoreNewItemInBestSlots(itemId, count);
650 }
651 }
652
653 for (PlayerCreateInfoItems::const_iterator item_id_itr = info->item.begin(); item_id_itr != info->item.end(); ++item_id_itr)
654 StoreNewItemInBestSlots(item_id_itr->item_id, item_id_itr->item_amount);
655
656 // bags and main-hand weapon must equipped at this moment
657 // now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon)
658 // or ammo not equipped in special bag
660 {
661 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
662 {
663 uint16 eDest;
664 // equip offhand weapon/shield if it attempt equipped before main-hand weapon
665 InventoryResult msg = CanEquipItem(NULL_SLOT, eDest, pItem, false);
666 if (msg == EQUIP_ERR_OK)
667 {
669 EquipItem(eDest, pItem, true);
670 }
671 // move other items to more appropriate slots (ammo not equipped in special bag)
672 else
673 {
674 ItemPosCountVec sDest;
675 msg = CanStoreItem(NULL_BAG, NULL_SLOT, sDest, pItem, false);
676 if (msg == EQUIP_ERR_OK)
677 {
679 pItem = StoreItem(sDest, pItem, true);
680 }
681
682 // if this is ammo then use it
683 msg = CanUseAmmo(pItem->GetEntry());
684 if (msg == EQUIP_ERR_OK)
685 SetAmmo(pItem->GetEntry());
686 }
687 }
688 }
689 // all item positions resolved
690
692
693 return true;
694}
CharStartOutfitEntry const * GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender)
Definition: DBCStores.cpp:835
DBCStorage< ChrClassesEntry > sChrClassesStore(ChrClassesEntryfmt)
@ ITEM_CLASS_CONSUMABLE
Definition: ItemTemplate.h:300
@ ITEM_SUBCLASS_FOOD
Definition: ItemTemplate.h:328
@ 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
@ REST_STATE_RAF_LINKED
Definition: Player.h:978
@ REST_STATE_NOT_RAF_LINKED
Definition: Player.h:977
@ UNIT_FLAG2_REGENERATE_POWER
Definition: Unit.h:498
@ UNIT_BYTE2_FLAG_PVP
Definition: Unit.h:136
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition: Unit.h:451
@ CONFIG_START_HEROIC_PLAYER_MONEY
Definition: IWorld.h:239
@ CONFIG_GAME_TYPE
Definition: IWorld.h:216
@ CONFIG_START_GM_LEVEL
Definition: IWorld.h:259
@ CONFIG_START_HEROIC_PLAYER_LEVEL
Definition: IWorld.h:237
@ CONFIG_START_ARENA_POINTS
Definition: IWorld.h:244
@ CONFIG_START_PLAYER_MONEY
Definition: IWorld.h:238
@ CONFIG_START_PLAYER_LEVEL
Definition: IWorld.h:236
@ CONFIG_START_HONOR_POINTS
Definition: IWorld.h:242
#define MAX_OUTFIT_ITEMS
Definition: DBCStructure.h:617
@ REALM_TYPE_RPPVP
Definition: Realm.h:57
@ REALM_TYPE_PVP
Definition: Realm.h:54
@ POWER_RUNIC_POWER
Definition: SharedDefines.h:247
@ POWER_RUNE
Definition: SharedDefines.h:246
@ SPELL_CATEGORY_DRINK
Definition: SharedDefines.h:316
@ SPELL_CATEGORY_FOOD
Definition: SharedDefines.h:315
uint32 SpellCategory
Definition: ItemTemplate.h:605
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
PlayerCreateInfoActions action
Definition: Player.h:351
PlayerCreateInfoItems item
Definition: Player.h:348
bool StoreNewItemInBestSlots(uint32 item_id, uint32 item_count)
Definition: Player.cpp:696
void InitPrimaryProfessions()
Definition: Player.cpp:11404
void InitGlyphsForLevel()
Definition: Player.cpp:13179
void UpdateMaxPower(Powers power) override
Definition: StatSystem.cpp:309
void LearnCustomSpells()
Definition: Player.cpp:11732
void SetArenaPoints(uint32 value)
Definition: Player.cpp:6161
void SetObjectScale(float scale) override
Definition: Player.h:1060
void InitDisplayIds()
Definition: Player.cpp:10514
InventoryResult CanUseAmmo(uint32 item) const
Definition: PlayerStorage.cpp:2490
void SetAmmo(uint32 item)
Definition: PlayerStorage.cpp:2520
void SetHonorPoints(uint32 value)
Definition: Player.cpp:6140
void InitTaxiNodesForLevel()
Definition: Player.h:1124
void InitStatsForLevel(bool reapplyMods=false)
Definition: Player.cpp:2535
void UpdateMaxHealth() override
Definition: StatSystem.cpp:296
Item * EquipItem(uint16 pos, Item *pItem, bool update)
Definition: PlayerStorage.cpp:2755
void InitRunes()
Definition: Player.cpp:13347
void SetMap(Map *map) override
Definition: Player.cpp:14558
void SetFactionForRace(uint8 race)
Definition: Player.cpp:5750
void CheckAllAchievementCriteria()
Definition: Player.cpp:13783
void LearnDefaultSkills()
Definition: Player.cpp:11758
void SetFullHealth()
Definition: Unit.h:1455
uint8 m_realRace
Definition: Unit.h:2478
uint8 m_race
Definition: Unit.h:2479
void SetUnitFlag2(UnitFlags2 flags)
Definition: Unit.h:1487
void SetMaxPower(Powers power, uint32 val)
Definition: Unit.cpp:15523
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:1481
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_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(), Unit::getClass(), GameTime::GetGameTime(), GetItemByPos(), Unit::GetMaxPower(), ItemTemplate::GetMaxStackSize(), Unit::getPowerType(), GetSession(), CharacterCreateInfo::HairColor, CharacterCreateInfo::HairStyle, InitDisplayIds(), InitGlyphsForLevel(), InitPrimaryProfessions(), InitRunes(), InitStatsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, 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(), Object::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, UpdateMaxHealth(), and UpdateMaxPower().

◆ CreateCorpse()

Corpse * Player::CreateCorpse ( )
4493{
4494 // prevent existence 2 corpse for player
4496
4497 uint32 _uf, _pb, _pb2, _cfb1, _cfb2;
4498
4500 SetPvPDeath(false);
4501
4502 if (!corpse->Create(GetMap()->GenerateLowGuid<HighGuid::Corpse>(), this))
4503 {
4504 delete corpse;
4505 return nullptr;
4506 }
4507
4509
4510 _uf = getRace();
4513
4514 uint8 race = (uint8)(_uf);
4515 uint8 skin = (uint8)(_pb);
4516 uint8 face = (uint8)(_pb >> 8);
4517 uint8 hairstyle = (uint8)(_pb >> 16);
4518 uint8 haircolor = (uint8)(_pb >> 24);
4519 uint8 facialhair = (uint8)(_pb2);
4520
4521 _cfb1 = ((0x00) | (race << 8) | (GetByteValue(PLAYER_BYTES_3, 0) << 16) | (skin << 24));
4522 _cfb2 = ((face) | (hairstyle << 8) | (haircolor << 16) | (facialhair << 24));
4523
4524 corpse->SetUInt32Value(CORPSE_FIELD_BYTES_1, _cfb1);
4525 corpse->SetUInt32Value(CORPSE_FIELD_BYTES_2, _cfb2);
4526
4527 uint32 flags = CORPSE_FLAG_UNK2;
4529 flags |= CORPSE_FLAG_HIDE_HELM;
4531 flags |= CORPSE_FLAG_HIDE_CLOAK;
4532
4533 // Xinef: Player can loop corpses while in BG or in WG
4534 if (InBattleground() && !InArena())
4535 flags |= CORPSE_FLAG_LOOTABLE;
4536 Battlefield* Bf = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
4537 if (Bf && Bf->IsWarTime())
4538 flags |= CORPSE_FLAG_LOOTABLE;
4539
4540 corpse->SetUInt32Value(CORPSE_FIELD_FLAGS, flags);
4541
4543
4545
4546 uint32 iDisplayID;
4547 uint32 iIventoryType;
4548 uint32 _cfi;
4549 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; i++)
4550 {
4551 if (m_items[i])
4552 {
4553 iDisplayID = m_items[i]->GetTemplate()->DisplayInfoID;
4554 iIventoryType = m_items[i]->GetTemplate()->InventoryType;
4555
4556 _cfi = iDisplayID | (iIventoryType << 24);
4557 corpse->SetUInt32Value(CORPSE_FIELD_ITEM + i, _cfi);
4558 }
4559 }
4560
4561 // register for player, but not show
4562 GetMap()->AddCorpse(corpse);
4563
4565
4566 // we do not need to save corpses for BG/arenas
4567 if (!GetMap()->IsBattlegroundOrArena())
4568 corpse->SaveToDB();
4569
4570 return corpse;
4571}
@ BATTLEFIELD_BATTLEID_WG
Definition: Battlefield.h:37
#define sBattlefieldMgr
Definition: BattlefieldMgr.h:77
@ 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
@ 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
Definition: Battlefield.h:205
bool IsWarTime()
Return true if battle is start, false if battle is not started.
Definition: Battlefield.h:248
void SaveToDB()
Definition: Corpse.cpp:91
bool Create(ObjectGuid::LowType guidlow)
Definition: Corpse.cpp:62
void UpdatePositionData()
Definition: Object.cpp:1154
void WorldRelocate(const WorldLocation &loc)
Definition: Position.h:259
WorldLocation _corpseLocation
Definition: Player.h:2935
void SpawnCorpseBones(bool triggerSave=true)
Definition: Player.cpp:4587
void SetPvPDeath(bool on)
Definition: Player.h:1146
bool InArena() const
Definition: Player.cpp:12198
uint32 GetNativeDisplayId() const
Definition: Unit.h:2170
void AddCorpse(Corpse *corpse)
Definition: Map.cpp:3576

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 
)
9094{
9095 if (IsExistPet())
9096 {
9097 return nullptr;
9098 }
9099
9100 if (!creatureTarget || creatureTarget->IsPet() || creatureTarget->GetTypeId() == TYPEID_PLAYER)
9101 {
9102 return nullptr;
9103 }
9104
9105 CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry());
9106 if (!creatrueTemplate->family)
9107 {
9108 // Creatures with family 0 crashes the server
9109 return nullptr;
9110 }
9111
9112 // Everything looks OK, create new pet
9113 Pet* pet = CreateTamedPetFrom(creatureTarget, spellID);
9114 if (!pet)
9115 {
9116 return nullptr;
9117 }
9118
9119 // "kill" original creature
9120 creatureTarget->DespawnOrUnsummon();
9121
9122 // calculate proper level
9123 uint8 level = (creatureTarget->GetLevel() < (GetLevel() - 5)) ? (GetLevel() - 5) : GetLevel();
9124
9125 // prepare visual effect for levelup
9126 pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
9127
9128 // add to world
9129 pet->GetMap()->AddToMap(pet->ToCreature());
9130
9131 // visual effect for levelup
9132 pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
9133
9134 // caster have pet now
9135 SetMinion(pet, true);
9136
9137 pet->InitTalentForLevel();
9138
9141
9142 return pet;
9143}
void DespawnOrUnsummon(Milliseconds msTimeToDespawn, Seconds forcedRespawnTimer)
Definition: Creature.cpp:2108
uint32 family
Definition: CreatureData.h:210
void InitTalentForLevel()
Definition: Pet.cpp:2165
void SavePetToDB(PetSaveMode mode)
Definition: Pet.cpp:494
bool IsExistPet()
Definition: Player.cpp:9087
void PetSpellInitialize()
Definition: Player.cpp:9366
void SetMinion(Minion *minion, bool apply)
Definition: Unit.cpp:10640
Pet * CreateTamedPetFrom(Creature *creatureTarget, uint32 spell_id=0)
Definition: Unit.cpp:17511
bool IsPet() const
Definition: Unit.h:1413

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

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

◆ CreatePet() [2/2]

Pet * Player::CreatePet ( uint32  creatureEntry,
uint32  spellID = 0 
)
9146{
9147 if (IsExistPet())
9148 {
9149 return nullptr;
9150 }
9151
9152 CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureEntry);
9153 if (!creatrueTemplate->family)
9154 {
9155 // Creatures with family 0 crashes the server
9156 return nullptr;
9157 }
9158
9159 // Everything looks OK, create new pet
9160 Pet* pet = CreateTamedPetFrom(creatureEntry, spellID);
9161 if (!pet)
9162 {
9163 return nullptr;
9164 }
9165
9166 // prepare visual effect for levelup
9168
9169 // add to world
9170 pet->GetMap()->AddToMap(pet->ToCreature());
9171
9172 // visual effect for levelup
9174
9175 // caster have pet now
9176 SetMinion(pet, true);
9177
9178 pet->InitTalentForLevel();
9179
9182
9183 return pet;
9184}

References Map::AddToMap(), Unit::CreateTamedPetFrom(), CreatureTemplate::family, Unit::GetLevel(), WorldObject::GetMap(), Pet::InitTalentForLevel(), IsExistPet(), PET_SAVE_AS_CURRENT, PetSpellInitialize(), Pet::SavePetToDB(), Unit::SetMinion(), Object::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)
14506{
14507 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14508 {
14509 if (itr->second.Guid == setGuid)
14510 {
14511 if (itr->second.state == EQUIPMENT_SET_NEW)
14512 m_EquipmentSets.erase(itr);
14513 else
14514 itr->second.state = EQUIPMENT_SET_DELETED;
14515 break;
14516 }
14517 }
14518}

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
3915{
3916 // for not existed account avoid update realm
3917 if (!accountId)
3918 updateRealmChars = false;
3919
3920 ObjectGuid playerGuid = ObjectGuid::Create<HighGuid::Player>(lowGuid);
3921
3922 uint32 charDelete_method = sWorld->getIntConfig(CONFIG_CHARDELETE_METHOD);
3923 uint32 charDelete_minLvl = sWorld->getIntConfig(CONFIG_CHARDELETE_MIN_LEVEL);
3924
3925 // if we want to finally delete the character or the character does not meet the level requirement,
3926 // we set it to mode CHAR_DELETE_REMOVE
3927 if (deleteFinally || sCharacterCache->GetCharacterLevelByGuid(playerGuid) < charDelete_minLvl)
3928 charDelete_method = CHAR_DELETE_REMOVE;
3929
3930 if (uint32 guildId = sCharacterCache->GetCharacterGuildIdByGuid(playerGuid))
3931 if (Guild* guild = sGuildMgr->GetGuildById(guildId))
3932 guild->DeleteMember(playerGuid, false, false, true);
3933
3934 // remove from arena teams
3935 LeaveAllArenaTeams(playerGuid);
3936
3937 // close player ticket if any
3938 GmTicket* ticket = sTicketMgr->GetTicketByPlayer(playerGuid);
3939 if (ticket)
3940 sTicketMgr->CloseTicket(ticket->GetId(), playerGuid);
3941
3942 // remove from group
3943 if (uint32 groupId = sCharacterCache->GetCharacterGuildIdByGuid(playerGuid))
3944 if (Group* group = sGroupMgr->GetGroupByGUID(groupId))
3945 RemoveFromGroup(group, playerGuid);
3946
3947 // Remove signs from petitions (also remove petitions if owner);
3948 RemovePetitionsAndSigns(playerGuid, 10);
3949
3950 CharacterDatabasePreparedStatement* stmt = nullptr;
3951
3952 switch (charDelete_method)
3953 {
3954 // Completely remove from the database
3955 case CHAR_DELETE_REMOVE:
3956 {
3957 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
3958
3959 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL);
3960 stmt->SetData(0, lowGuid);
3961 PreparedQueryResult resultMail = CharacterDatabase.Query(stmt);
3962
3963 if (resultMail)
3964 {
3965 std::unordered_map<uint32, std::vector<Item*>> itemsByMail;
3966
3967 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS);
3968 stmt->SetData(0, lowGuid);
3969 PreparedQueryResult resultItems = CharacterDatabase.Query(stmt);
3970
3971 if (resultItems)
3972 {
3973 do
3974 {
3975 Field* fields = resultItems->Fetch();
3976 uint32 mailId = fields[14].Get<uint32>();
3977 if (Item* mailItem = _LoadMailedItem(playerGuid, nullptr, mailId, nullptr, fields))
3978 {
3979 itemsByMail[mailId].push_back(mailItem);
3980 }
3981 } while (resultItems->NextRow());
3982 }
3983
3984 do
3985 {
3986 Field* mailFields = resultMail->Fetch();
3987
3988 uint32 mail_id = mailFields[0].Get<uint32>();
3989 uint8 mailType = mailFields[1].Get<uint8>();
3990 uint16 mailTemplateId = mailFields[2].Get<uint16>();
3991 uint32 sender = mailFields[3].Get<uint32>();
3992 std::string subject = mailFields[4].Get<std::string>();
3993 std::string body = mailFields[5].Get<std::string>();
3994 uint32 money = mailFields[6].Get<uint32>();
3995 bool has_items = mailFields[7].Get<bool>();
3996
3997 // We can return mail now
3998 // So firstly delete the old one
3999 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
4000 stmt->SetData(0, mail_id);
4001 trans->Append(stmt);
4002
4003 // Mail is not from player
4004 if (mailType != MAIL_NORMAL)
4005 {
4006 if (has_items)
4007 {
4008 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
4009 stmt->SetData(0, mail_id);
4010 trans->Append(stmt);
4011 }
4012 continue;
4013 }
4014
4015 MailDraft draft(subject, body);
4016 if (mailTemplateId)
4017 draft = MailDraft(mailTemplateId, false); // items are already included
4018
4019 auto itemsItr = itemsByMail.find(mail_id);
4020 if (itemsItr != itemsByMail.end())
4021 {
4022 for (Item* item : itemsItr->second)
4023 {
4024 draft.AddItem(item);
4025 }
4026
4027 // MailDraft will take care of freeing memory.
4028 itemsByMail.erase(itemsItr);
4029 }
4030
4031 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
4032 stmt->SetData(0, mail_id);
4033 trans->Append(stmt);
4034
4035 uint32 pl_account = sCharacterCache->GetCharacterAccountIdByGuid(ObjectGuid(HighGuid::Player, lowGuid));
4036
4037 draft.AddMoney(money).SendReturnToSender(pl_account, lowGuid, sender, trans);
4038 } while (resultMail->NextRow());
4039 }
4040
4041 // Unsummon and delete for pets in world is not required: player deleted from CLI or character list with not loaded pet.
4042 // NOW we can finally clear other DB data related to character
4043 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PET_IDS);
4044 stmt->SetData(0, lowGuid);
4045 PreparedQueryResult resultPets = CharacterDatabase.Query(stmt);
4046
4047 if (resultPets)
4048 {
4049 do
4050 {
4051 ObjectGuid::LowType petguidlow = (*resultPets)[0].Get<uint32>();
4052 Pet::DeleteFromDB(petguidlow);
4053 } while (resultPets->NextRow());
4054 }
4055
4056 // Delete char from social list of online chars
4057 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_SOCIAL);
4058 stmt->SetData(0, lowGuid);
4059 PreparedQueryResult resultFriends = CharacterDatabase.Query(stmt);
4060
4061 if (resultFriends)
4062 {
4063 do
4064 {
4065 if (Player* pFriend = ObjectAccessor::FindPlayerByLowGUID((*resultFriends)[0].Get<uint32>()))
4066 {
4067 pFriend->GetSocial()->RemoveFromSocialList(playerGuid, SOCIAL_FLAG_ALL);
4068 sSocialMgr->SendFriendStatus(pFriend, FRIEND_REMOVED, playerGuid, false);
4069 }
4070 } while (resultFriends->NextRow());
4071 }
4072
4073 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER);
4074 stmt->SetData(0, lowGuid);
4075 trans->Append(stmt);
4076
4077 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ACCOUNT_DATA);
4078 stmt->SetData(0, lowGuid);
4079 trans->Append(stmt);
4080
4081 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_DECLINED_NAME);
4082 stmt->SetData(0, lowGuid);
4083 trans->Append(stmt);
4084
4085 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION);
4086 stmt->SetData(0, lowGuid);
4087 trans->Append(stmt);
4088
4089 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA);
4090 stmt->SetData(0, lowGuid);
4091 trans->Append(stmt);
4092
4093 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GIFT);
4094 stmt->SetData(0, lowGuid);
4095 trans->Append(stmt);
4096
4097 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_HOMEBIND);
4098 stmt->SetData(0, lowGuid);
4099 trans->Append(stmt);
4100
4101 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE);
4102 stmt->SetData(0, lowGuid);
4103 trans->Append(stmt);
4104
4105 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY);
4106 stmt->SetData(0, lowGuid);
4107 trans->Append(stmt);
4108
4109 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS);
4110 stmt->SetData(0, lowGuid);
4111 trans->Append(stmt);
4112
4113 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED);
4114 stmt->SetData(0, lowGuid);
4115 trans->Append(stmt);
4116
4117 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REPUTATION);
4118 stmt->SetData(0, lowGuid);
4119 trans->Append(stmt);
4120
4121 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL);
4122 stmt->SetData(0, lowGuid);
4123 trans->Append(stmt);
4124
4125 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_COOLDOWN);
4126 stmt->SetData(0, lowGuid);
4127 trans->Append(stmt);
4128
4129 if (sWorld->getBoolConfig(CONFIG_DELETE_CHARACTER_TICKET_TRACE))
4130 {
4132 stmt->SetData(0, lowGuid);
4133 trans->Append(stmt);
4134 }
4135 else
4136 {
4137 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_GM_TICKETS);
4138 stmt->SetData(0, lowGuid);
4139 trans->Append(stmt);
4140 }
4141
4142 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER);
4143 stmt->SetData(0, lowGuid);
4144 trans->Append(stmt);
4145
4146 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND);
4147 stmt->SetData(0, lowGuid);
4148 trans->Append(stmt);
4149
4150 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID);
4151 stmt->SetData(0, lowGuid);
4152 trans->Append(stmt);
4153
4154 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL);
4155 stmt->SetData(0, lowGuid);
4156 trans->Append(stmt);
4157
4158 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEMS);
4159 stmt->SetData(0, lowGuid);
4160 trans->Append(stmt);
4161
4162 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_BY_OWNER);
4163 stmt->SetData(0, lowGuid);
4164 trans->Append(stmt);
4165
4167 stmt->SetData(0, lowGuid);
4168 trans->Append(stmt);
4169
4170 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENTS);
4171 stmt->SetData(0, lowGuid);
4172 trans->Append(stmt);
4173
4174 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS);
4175 stmt->SetData(0, lowGuid);
4176 trans->Append(stmt);
4177
4178 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_EQUIPMENTSETS);
4179 stmt->SetData(0, lowGuid);
4180 trans->Append(stmt);
4181
4182 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER);
4183 stmt->SetData(0, lowGuid);
4184 stmt->SetData(1, lowGuid);
4185 trans->Append(stmt);
4186
4187 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER);
4188 stmt->SetData(0, lowGuid);
4189 trans->Append(stmt);
4190
4191 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ENTRY_POINT);
4192 stmt->SetData(0, lowGuid);
4193 trans->Append(stmt);
4194
4195 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS);
4196 stmt->SetData(0, lowGuid);
4197 trans->Append(stmt);
4198
4199 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_DAILY_CHAR);
4200 stmt->SetData(0, lowGuid);
4201 trans->Append(stmt);
4202
4203 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR);
4204 stmt->SetData(0, lowGuid);
4205 trans->Append(stmt);
4206
4207 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR);
4208 stmt->SetData(0, lowGuid);
4209 trans->Append(stmt);
4210
4211 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR);
4212 stmt->SetData(0, lowGuid);
4213 trans->Append(stmt);
4214
4215 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT);
4216 stmt->SetData(0, lowGuid);
4217 trans->Append(stmt);
4218
4219 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILLS);
4220 stmt->SetData(0, lowGuid);
4221 trans->Append(stmt);
4222
4223 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SETTINGS);
4224 stmt->SetData(0, lowGuid);
4225 trans->Append(stmt);
4226
4227 Corpse::DeleteFromDB(playerGuid, trans);
4228
4229 sScriptMgr->OnDeleteFromDB(trans, lowGuid);
4230
4231 CharacterDatabase.CommitTransaction(trans);
4232 break;
4233 }
4234 // The character gets unlinked from the account, the name gets freed up and appears as deleted ingame
4235 case CHAR_DELETE_UNLINK:
4236 {
4237 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_DELETE_INFO);
4238
4239 stmt->SetData(0, lowGuid);
4240
4241 CharacterDatabase.Execute(stmt);
4242 break;
4243 }
4244 default:
4245 LOG_ERROR("entities.player", "Player::DeleteFromDB: Unsupported delete method: {}.", charDelete_method);
4246 return;
4247 }
4248
4249 if (CharacterCacheEntry const* cache = sCharacterCache->GetCharacterCacheByGuid(playerGuid))
4250 {
4251 std::string name = cache->Name;
4252 sCharacterCache->DeleteCharacterCacheEntry(playerGuid, name);
4253 }
4254
4255 if (updateRealmChars)
4256 {
4257 sWorld->UpdateRealmCharCount(accountId);
4258 }
4259}
@ CHAR_DEL_CHAR_SOCIAL_BY_FRIEND
Definition: CharacterDatabase.h:390
@ CHAR_DEL_CHAR_GIFT
Definition: CharacterDatabase.h:405
@ CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER
Definition: CharacterDatabase.h:473
@ CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER
Definition: CharacterDatabase.h:416
@ CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER
Definition: CharacterDatabase.h:415
@ CHAR_DEL_CHAR_SKILLS
Definition: CharacterDatabase.h:419
@ CHAR_DEL_CHAR_PET_BY_OWNER
Definition: CharacterDatabase.h:472
@ CHAR_DEL_ITEM_INSTANCE_BY_OWNER
Definition: CharacterDatabase.h:128
@ CHAR_DEL_CHAR_DECLINED_NAME
Definition: CharacterDatabase.h:381
@ CHAR_SEL_MAILITEMS
Definition: CharacterDatabase.h:101
@ CHAR_UPD_DELETE_INFO
Definition: CharacterDatabase.h:292
@ CHAR_DEL_CHAR_EQUIPMENTSETS
Definition: CharacterDatabase.h:414
@ CHAR_DEL_PLAYER_ACCOUNT_DATA
Definition: CharacterDatabase.h:203
@ CHAR_DEL_MAIL
Definition: CharacterDatabase.h:411
@ CHAR_DEL_CHAR_TALENT
Definition: CharacterDatabase.h:418
@ CHAR_SEL_CHAR_SOCIAL
Definition: CharacterDatabase.h:348
@ CHAR_DEL_CHAR_INVENTORY
Definition: CharacterDatabase.h:407
@ CHAR_DEL_CHAR_QUESTSTATUS
Definition: CharacterDatabase.h:388
@ CHAR_DEL_CHAR_ACTION
Definition: CharacterDatabase.h:403
@ CHAR_SEL_CHAR_PET_IDS
Definition: CharacterDatabase.h:475
@ CHAR_DEL_CHAR_ACHIEVEMENTS
Definition: CharacterDatabase.h:413
@ 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:409
@ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS
Definition: CharacterDatabase.h:364
@ CHAR_DEL_CHARACTER
Definition: CharacterDatabase.h:402
@ CHAR_DEL_CHAR_SOCIAL_BY_GUID
Definition: CharacterDatabase.h:389
@ CHAR_DEL_CHAR_SETTINGS
Definition: CharacterDatabase.h:517
@ CHAR_DEL_CHAR_SPELL
Definition: CharacterDatabase.h:410
@ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED
Definition: CharacterDatabase.h:408
@ CHAR_DEL_PLAYER_GM_TICKETS
Definition: CharacterDatabase.h:264
@ CHAR_DEL_MAIL_ITEMS
Definition: CharacterDatabase.h:412
@ CHAR_DEL_CHAR_INSTANCE
Definition: CharacterDatabase.h:406
@ CHAR_DELETE_REMOVE
Definition: Player.h:945
@ CHAR_DELETE_UNLINK
Definition: Player.h:946
@ FRIEND_REMOVED
Definition: SocialMgr.h:72
#define sSocialMgr
Definition: SocialMgr.h:148
@ SOCIAL_FLAG_ALL
Definition: SocialMgr.h:45
#define sGuildMgr
Definition: GuildMgr.h:51
@ MAIL_NORMAL
Definition: Mail.h:38
#define sTicketMgr
Definition: TicketMgr.h:258
@ CONFIG_CHARDELETE_METHOD
Definition: IWorld.h:349
@ CONFIG_CHARDELETE_MIN_LEVEL
Definition: IWorld.h:350
@ CONFIG_DELETE_CHARACTER_TICKET_TRACE
Definition: IWorld.h:140
Player * FindPlayerByLowGUID(ObjectGuid::LowType lowguid)
Definition: ObjectAccessor.cpp:256
Definition: CharacterCache.h:28
void DeleteFromDB(CharacterDatabaseTransaction trans)
Definition: Corpse.cpp:120
void DeleteFromDB() override
Definition: Pet.h:170
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition: Player.cpp:2313
static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
Definition: Player.cpp:10006
static void LeaveAllArenaTeams(ObjectGuid guid)
Definition: Player.cpp:10074
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.

4265{
4266 uint32 keepDays = sWorld->getIntConfig(CONFIG_CHARDELETE_KEEP_DAYS);
4267 if (!keepDays)
4268 return;
4269
4271}
@ CONFIG_CHARDELETE_KEEP_DAYS
Definition: IWorld.h:348
static void DeleteOldCharacters()
Definition: Player.cpp:4264

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.

4277{
4278 LOG_INFO("server.loading", "Player::DeleteOldChars: Deleting all characters which have been deleted {} days before...", keepDays);
4279 LOG_INFO("server.loading", " ");
4280
4282 stmt->SetData(0, uint32(GameTime::GetGameTime().count() - time_t(keepDays * DAY)));
4283 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4284
4285 if (result)
4286 {
4287 LOG_INFO("server.loading", "Player::DeleteOldChars: Found {} character(s) to delete", result->GetRowCount());
4288 do
4289 {
4290 Field* fields = result->Fetch();
4291 Player::DeleteFromDB(fields[0].Get<uint32>(), fields[1].Get<uint32>(), true, true);
4292 } while (result->NextRow());
4293 }
4294}
constexpr auto DAY
Definition: Common.h:58
@ CHAR_SEL_CHAR_OLD_CHARS
Definition: CharacterDatabase.h:349
static void DeleteFromDB(ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally)
Definition: Player.cpp:3914

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

◆ DeleteRefundReference()

void Player::DeleteRefundReference ( ObjectGuid  itemGUID)
15395{
15396 RefundableItemsSet::iterator itr = m_refundableItems.find(itemGUID);
15397 if (itr != m_refundableItems.end())
15398 m_refundableItems.erase(itr);
15399}

References m_refundableItems.

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

◆ DestroyConjuredItems()

void Player::DestroyConjuredItems ( bool  update)
3371{
3372 // used when entering arena
3373 // destroys all conjured items
3374 LOG_DEBUG("entities.player.items", "STORAGE: DestroyConjuredItems");
3375
3376 // in inventory
3378 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3379 if (pItem->IsConjuredConsumable())
3381
3382 // in inventory bags
3384 if (Bag* pBag = GetBagByPos(i))
3385 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
3386 if (Item* pItem = pBag->GetItemByPos(j))
3387 if (pItem->IsConjuredConsumable())
3388 DestroyItem(i, j, update);
3389
3390 // in equipment and bag list
3392 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3393 if (pItem->IsConjuredConsumable())
3395}

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.

3788{
3789 Unit::DestroyForPlayer(target, onDeath);
3790
3791 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) // xinef: previously INVENTORY_SLOT_BAG_END
3792 {
3793 if (!m_items[i])
3794 continue;
3795
3796 m_items[i]->DestroyForPlayer(target);
3797 }
3798
3799 if (target == this)
3800 {
3802 {
3803 if (!m_items[i])
3804 continue;
3805
3806 m_items[i]->DestroyForPlayer(target);
3807 }
3809 {
3810 if (!m_items[i])
3811 continue;
3812
3813 m_items[i]->DestroyForPlayer(target);
3814 }
3815 }
3816}

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 
)
3052{
3053 Item* pItem = GetItemByPos(bag, slot);
3054 if (pItem)
3055 {
3056 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItem bag = {}, slot = {}, item = {}", bag, slot, pItem->GetEntry());
3057 // Also remove all contained items if the item is a bag.
3058 // This if () prevents item saving crashes if the condition for a bag to be empty before being destroyed was bypassed somehow.
3059 if (pItem->IsNotEmptyBag())
3060 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
3061 DestroyItem(slot, i, update);
3062
3064 {
3066 stmt->SetData(0, pItem->GetGUID().GetCounter());
3067 CharacterDatabase.Execute(stmt);
3068 }
3069
3071 RemoveItemDurations(pItem);
3072
3073 pItem->SetNotRefundable(this);
3074 pItem->ClearSoulboundTradeable(this);
3075 RemoveTradeableItem(pItem);
3076
3077 ItemTemplate const* proto = pItem->GetTemplate();
3078 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
3079 if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
3081
3082 ItemRemovedQuestCheck(pItem->GetEntry(), pItem->GetCount());
3083
3084 sScriptMgr->OnItemRemove(this, pItem);
3085
3086 if (bag == INVENTORY_SLOT_BAG_0)
3087 {
3089
3090 // equipment and equipped bags can have applied bonuses
3091 if (slot < INVENTORY_SLOT_BAG_END)
3092 {
3093 ItemTemplate const* pProto = pItem->GetTemplate();
3094
3095 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
3096 if (pProto && pProto->ItemSet)
3097 RemoveItemsSetItem(this, pProto);
3098
3099 _ApplyItemMods(pItem, slot, false);
3100 }
3101
3102 if (slot < EQUIPMENT_SLOT_END)
3103 {
3104 // remove item dependent auras and casts (only weapon and armor slots)
3106
3107 // update expertise and armor penetration - passive auras may need it
3108 switch (slot)
3109 {
3114 default:
3115 break;
3116 }
3117
3118 if (slot == EQUIPMENT_SLOT_MAINHAND)
3120 else if (slot == EQUIPMENT_SLOT_OFFHAND)
3122
3123 // equipment visual show
3124 SetVisibleItemSlot(slot, nullptr);
3125 }
3126
3127 m_items[slot] = nullptr;
3128 }
3129 else if (Bag* pBag = GetBagByPos(bag))
3130 pBag->RemoveItem(slot, update);
3131
3132 // Xinef: item is removed, remove loot from storage if any
3133 if (proto->Flags & ITEM_FLAG_HAS_LOOT)
3134 sLootItemStorage->RemoveStoredLoot(pItem->GetGUID());
3135
3136 if (IsInWorld() && update)
3137 {
3138 pItem->RemoveFromWorld();
3139 pItem->DestroyForPlayer(this);
3140 }
3141
3142 //pItem->SetOwnerGUID(0);
3144 pItem->SetSlot(NULL_SLOT);
3145 pItem->SetState(ITEM_REMOVED, this);
3146 }
3147}
@ CHAR_DEL_GIFT
Definition: CharacterDatabase.h:130
@ ITEM_FIELD_FLAG_WRAPPED
Definition: ItemTemplate.h:113
@ ITEM_SPELLTRIGGER_ON_NO_DELAY_USE
Definition: ItemTemplate.h:88
void ItemRemovedQuestCheck(uint32 entry, uint32 count)
Definition: PlayerQuest.cpp:1858
void RemoveItemDependentAurasAndCasts(Item *pItem)
Definition: Player.cpp:12473
void RecalculateRating(CombatRating cr)
Definition: Player.h:1912
void UpdateExpertise(WeaponAttackType attType)
Definition: StatSystem.cpp:884
void SetVisibleItemSlot(uint8 slot, Item *pItem)
Definition: PlayerStorage.cpp:2886

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, ItemTemplate::Flags, GetBagByPos(), Item::GetCount(), ObjectGuid::GetCounter(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Item::GetTemplate(), Object::HasFlag(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, Object::IsInWorld(), Item::IsNotEmptyBag(), ITEM_FIELD_CONTAINED, ITEM_FIELD_FLAG_WRAPPED, ITEM_FIELD_FLAGS, 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(), and Item::UpdateDuration().

◆ DestroyItemCount() [1/2]

void Player::DestroyItemCount ( Item item,
uint32 count,
bool  update 
)
3426{
3427 if (!pItem)
3428 return;
3429
3430 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item ({}, Entry: {}) count = {}", pItem->GetGUID().ToString(), pItem->GetEntry(), count);
3431
3432 if (pItem->GetCount() <= count)
3433 {
3434 count -= pItem->GetCount();
3435
3436 DestroyItem(pItem->GetBagSlot(), pItem->GetSlot(), update);
3437 }
3438 else
3439 {
3440 ItemRemovedQuestCheck(pItem->GetEntry(), count);
3441 pItem->SetCount(pItem->GetCount() - count);
3442 count = 0;
3443 if (IsInWorld() && update)
3444 pItem->SendUpdateToPlayer(this);
3445 pItem->SetState(ITEM_CHANGED, this);
3446 }
3447}

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

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(), 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(), go_ahune_ice_stone::OnGossipSelect(), 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 
)
3341{
3342 LOG_DEBUG("entities.player.items", "STORAGE: DestroyZoneLimitedItem in map {} and area {}", GetMapId(), new_zone);
3343
3344 // in inventory
3346 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3347 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3349
3351 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3352 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3354
3355 // in inventory bags
3357 if (Bag* pBag = GetBagByPos(i))
3358 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
3359 if (Item* pItem = pBag->GetItemByPos(j))
3360 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3361 DestroyItem(i, j, update);
3362
3363 // in equipment and bag list
3365 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3366 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3368}

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 
)
16059{
16060 ASSERT(minimum <= maximum);
16061
16062 uint32 roll = urand(minimum, maximum);
16063
16065 randomRoll.Min = minimum;
16066 randomRoll.Max = maximum;
16067 randomRoll.Result = roll;
16068 randomRoll.Roller = GetGUID();
16069 if (Group* group = GetGroup())
16070 group->BroadcastPacket(randomRoll.Write(), false);
16071 else
16072 SendDirectMessage(randomRoll.Write());
16073
16074 return roll;
16075}
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:44
Definition: MiscPackets.h:105
uint32 Max
Definition: MiscPackets.h:112
uint32 Result
Definition: MiscPackets.h:113
WorldPacket const * Write() override
Definition: MiscPackets.cpp:76
uint32 Min
Definition: MiscPackets.h:111
ObjectGuid Roller
Definition: MiscPackets.h:114

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 
)
9965{
9966 if (spell && mod->ownerAura && mod->charges > 0)
9967 {
9968 if (--mod->charges == 0)
9969 mod->charges = -1;
9970
9971 spell->m_appliedMods.insert(mod->ownerAura);
9972 }
9973}
int16 charges
Definition: Player.h:186
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)
6310{
6311 // duel not requested
6312 if (!duel)
6313 return;
6314
6315 // Check if DuelComplete() has been called already up in the stack and in that case don't do anything else here
6316 if (duel->State == DUEL_STATE_COMPLETED)
6317 return;
6318
6319 Player* opponent = duel->Opponent;
6320 duel->State = DUEL_STATE_COMPLETED;
6321 opponent->duel->State = DUEL_STATE_COMPLETED;
6322
6323 LOG_DEBUG("entities.unit", "Player::DuelComplete: Player '{}' ({}), Opponent: '{}' ({})", GetName(), GetGUID().ToString(), opponent->GetName(), opponent->GetGUID().ToString());
6324
6326 data << uint8((type != DUEL_INTERRUPTED) ? 1 : 0);
6327 SendDirectMessage(&data);
6328 if (opponent->GetSession())
6329 {
6330 opponent->SendDirectMessage(&data);
6331 }
6332
6333 if (type != DUEL_INTERRUPTED)
6334 {
6335 data.Initialize(SMSG_DUEL_WINNER, (1 + 20)); // we guess size
6336 data << uint8(type == DUEL_WON ? 0 : 1); // 0 = just won; 1 = fled
6337 data << opponent->GetName();
6338 data << GetName();
6339 SendMessageToSet(&data, true);
6340 }
6341
6342 sScriptMgr->OnPlayerDuelEnd(opponent, this, type);
6343
6344 switch (type)
6345 {
6346 case DUEL_FLED:
6347 // if initiator and opponent are on the same team
6348 // or initiator and opponent are not PvP enabled, forcibly stop attacking
6349 if (GetTeamId() == opponent->GetTeamId())
6350 {
6351 AttackStop();
6352 opponent->AttackStop();
6353 }
6354 else
6355 {
6356 if (!IsPvP())
6357 {
6358 AttackStop();
6359 }
6360 if (!opponent->IsPvP())
6361 {
6362 opponent->AttackStop();
6363 }
6364 }
6365 break;
6366 case DUEL_WON:
6369
6370 // Credit for quest Death's Challenge
6371 if (getClass() == CLASS_DEATH_KNIGHT && opponent->GetQuestStatus(12733) == QUEST_STATUS_INCOMPLETE)
6372 {
6373 opponent->CastSpell(opponent, 52994, true);
6374 }
6375
6376 // Honor points after duel (the winner) - ImpConfig
6377 if (uint32 amount = sWorld->getIntConfig(CONFIG_HONOR_AFTER_DUEL))
6378 {
6379 opponent->RewardHonor(nullptr, 1, amount);
6380 }
6381
6382 break;
6383 default:
6384 break;
6385 }
6386
6387 // Victory emote spell
6388 if (type != DUEL_INTERRUPTED)
6389 {
6390 opponent->CastSpell(opponent, 52852, true);
6391 }
6392
6393 // Remove Duel Flag object
6395 if (obj)
6396 {
6397 duel->Initiator->RemoveGameObject(obj, true);
6398 }
6399
6400 /* remove auras */
6401 AuraApplicationMap& itsAuras = opponent->GetAppliedAuras();
6402 for (AuraApplicationMap::iterator i = itsAuras.begin(); i != itsAuras.end();)
6403 {
6404 Aura const* aura = i->second->GetBase();
6405 if (!i->second->IsPositive() && aura->GetCasterGUID() == GetGUID() && aura->GetApplyTime() >= duel->StartTime)
6406 {
6407 opponent->RemoveAura(i);
6408 }
6409 else
6410 {
6411 ++i;
6412 }
6413 }
6414
6416 for (AuraApplicationMap::iterator i = myAuras.begin(); i != myAuras.end();)
6417 {
6418 Aura const* aura = i->second->GetBase();
6419 if (!i->second->IsPositive() && aura->GetCasterGUID() == opponent->GetGUID() && aura->GetApplyTime() >= duel->StartTime)
6420 RemoveAura(i);
6421 else
6422 ++i;
6423 }
6424
6425 // cleanup combo points
6426 if (GetComboTarget() == duel->Opponent)
6427 {
6429 }
6430 else if (GetComboTargetGUID() == duel->Opponent->GetPetGUID())
6431 {
6433 }
6434
6435 if (duel->Opponent->GetComboTarget() == this)
6436 {
6437 duel->Opponent->ClearComboPoints();
6438 }
6439 else if (duel->Opponent->GetComboTargetGUID() == GetPetGUID())
6440 {
6441 duel->Opponent->ClearComboPoints();
6442 }
6443
6444 //cleanups
6448 opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 0);
6449
6450 opponent->duel.reset(nullptr);
6451 duel.reset(nullptr);
6452}
@ PLAYER_DUEL_TEAM
Definition: UpdateFields.h:184
@ DUEL_STATE_COMPLETED
Definition: Player.h:374
@ CONFIG_HONOR_AFTER_DUEL
Definition: IWorld.h:329
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL
Definition: DBCEnums.h:192
@ ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL
Definition: DBCEnums.h:193
@ DUEL_WON
Definition: SharedDefines.h:3585
@ 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:5967
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition: Player.h:1976
bool IsPvP()
Definition: Player.cpp:16110
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition: Unit.h:1299
void ClearComboPoints()
Definition: Unit.cpp:17035
Unit * GetComboTarget() const
Definition: Unit.h:2292
bool AttackStop()
Definition: Unit.cpp:10368
ObjectGuid const GetComboTargetGUID() const
Definition: Unit.h:2293
ObjectGuid GetPetGUID() const
Definition: Unit.h:1824
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_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::getClass(), Unit::GetComboTarget(), Unit::GetComboTargetGUID(), Map::GetGameObject(), Object::GetGUID(), Object::GetGuidValue(), WorldObject::GetMap(), WorldObject::GetName(), Unit::GetPetGUID(), GetQuestStatus(), GetSession(), GetTeamId(), WorldPacket::Initialize(), IsPvP(), LOG_DEBUG, PLAYER_DUEL_ARBITER, PLAYER_DUEL_TEAM, QUEST_STATUS_INCOMPLETE, Unit::RemoveAura(), RewardHonor(), SendDirectMessage(), SendMessageToSet(), Object::SetGuidValue(), Object::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 
)
4644{
4645 if(!item)
4646 return;
4647
4648 uint32 pMaxDurability = item ->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4649
4650 if (!pMaxDurability)
4651 return;
4652
4653 uint32 pDurabilityLoss = uint32(pMaxDurability * percent);
4654
4655 if (pDurabilityLoss < 1)
4656 pDurabilityLoss = 1;
4657
4658 DurabilityPointsLoss(item, pDurabilityLoss);
4659}
@ ITEM_FIELD_MAXDURABILITY
Definition: UpdateFields.h:70
void DurabilityPointsLoss(Item *item, int32 points)
Definition: Player.cpp:4687

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

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

◆ DurabilityLossAll()

void Player::DurabilityLossAll ( double  percent,
bool  inventory 
)
4618{
4620 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4621 DurabilityLoss(pItem, percent);
4622
4623 if (inventory)
4624 {
4625 // bags not have durability
4626 // for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
4627
4629 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4630 DurabilityLoss(pItem, percent);
4631
4632 // keys not have durability
4633 //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
4634
4636 if (Bag* pBag = GetBagByPos(i))
4637 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4638 if (Item* pItem = GetItemByPos(i, j))
4639 DurabilityLoss(pItem, percent);
4640 }
4641}
void DurabilityLoss(Item *item, double percent)
Definition: Player.cpp:4643

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)
4720{
4721 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
4722 DurabilityPointsLoss(pItem, 1);
4723}

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

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

◆ DurabilityPointsLoss()

void Player::DurabilityPointsLoss ( Item item,
int32  points 
)
4688{
4690 {
4691 return;
4692 }
4693
4694 int32 pMaxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4695 int32 pOldDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
4696 int32 pNewDurability = pOldDurability - points;
4697
4698 if (pNewDurability < 0)
4699 pNewDurability = 0;
4700 else if (pNewDurability > pMaxDurability)
4701 pNewDurability = pMaxDurability;
4702
4703 if (pOldDurability != pNewDurability)
4704 {
4705 // modify item stats _before_ Durability set to 0 to pass _ApplyItemMods internal check
4706 if (pNewDurability == 0 && pOldDurability > 0 && item->IsEquipped())
4707 _ApplyItemMods(item, item->GetSlot(), false);
4708
4709 item->SetUInt32Value(ITEM_FIELD_DURABILITY, pNewDurability);
4710
4711 // modify item stats _after_ restore durability to pass _ApplyItemMods internal check
4712 if (pNewDurability > 0 && pOldDurability == 0 && item->IsEquipped())
4713 _ApplyItemMods(item, item->GetSlot(), true);
4714
4715 item->SetState(ITEM_CHANGED, this);
4716 }
4717}
@ ITEM_FIELD_DURABILITY
Definition: UpdateFields.h:69
@ SPELL_AURA_PREVENT_DURABILITY_LOSS
Definition: SpellAuraDefines.h:352

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 
)
4662{
4664 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4665 DurabilityPointsLoss(pItem, points);
4666
4667 if (inventory)
4668 {
4669 // bags not have durability
4670 // for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
4671
4673 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4674 DurabilityPointsLoss(pItem, points);
4675
4676 // keys not have durability
4677 //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
4678
4680 if (Bag* pBag = (Bag*)GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4681 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4682 if (Item* pItem = GetItemByPos(i, j))
4683 DurabilityPointsLoss(pItem, points);
4684 }
4685}

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 
)
4742{
4743 Item* item = GetItemByPos(pos);
4744
4745 uint32 TotalCost = 0;
4746 if (!item)
4747 return TotalCost;
4748
4749 uint32 maxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4750 if (!maxDurability)
4751 return TotalCost;
4752
4753 uint32 curDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
4754
4755 if (cost)
4756 {
4757 uint32 LostDurability = maxDurability - curDurability;
4758 if (LostDurability > 0)
4759 {
4760 ItemTemplate const* ditemProto = item->GetTemplate();
4761
4762 DurabilityCostsEntry const* dcost = sDurabilityCostsStore.LookupEntry(ditemProto->ItemLevel);
4763 if (!dcost)
4764 {
4765 LOG_ERROR("entities.player", "RepairDurability: Wrong item lvl {}", ditemProto->ItemLevel);
4766 return TotalCost;
4767 }
4768
4769 uint32 dQualitymodEntryId = (ditemProto->Quality + 1) * 2;
4770 DurabilityQualityEntry const* dQualitymodEntry = sDurabilityQualityStore.LookupEntry(dQualitymodEntryId);
4771 if (!dQualitymodEntry)
4772 {
4773 LOG_ERROR("entities.player", "RepairDurability: Wrong dQualityModEntry {}", dQualitymodEntryId);
4774 return TotalCost;
4775 }
4776
4777 uint32 dmultiplier = dcost->multiplier[ItemSubClassToDurabilityMultiplierId(ditemProto->Class, ditemProto->SubClass)];
4778 uint32 costs = uint32(LostDurability * dmultiplier * double(dQualitymodEntry->quality_mod));
4779
4780 costs = uint32(costs * discountMod * sWorld->getRate(RATE_REPAIRCOST));
4781
4782 if (costs == 0) //fix for ITEM_QUALITY_ARTIFACT
4783 costs = 1;
4784
4785 if (guildBank)
4786 {
4787 if (GetGuildId() == 0)
4788 {
4789 // LOG_DEBUG("entities.player", "You are not member of a guild");
4790 return TotalCost;
4791 }
4792
4793 Guild* guild = sGuildMgr->GetGuildById(GetGuildId());
4794 if (!guild)
4795 return TotalCost;
4796
4797 if (!guild->HandleMemberWithdrawMoney(GetSession(), costs, true))
4798 return TotalCost;
4799
4800 TotalCost = costs;
4801 }
4802 else if (!HasEnoughMoney(costs))
4803 {
4804 // LOG_DEBUG("entities.player", "You do not have enough money");
4805 return TotalCost;
4806 }
4807 else
4808 ModifyMoney(-int32(costs));
4809 }
4810 }
4811
4812 item->SetUInt32Value(ITEM_FIELD_DURABILITY, maxDurability);
4813 item->SetState(ITEM_CHANGED, this);
4814
4815 // reapply mods for total broken and repaired item if equipped
4816 if (IsEquipmentPos(pos) && !curDurability)
4817 _ApplyItemMods(item, pos & 255, true);
4818 return TotalCost;
4819}
DBCStorage< DurabilityQualityEntry > sDurabilityQualityStore(DurabilityQualityfmt)
DBCStorage< DurabilityCostsEntry > sDurabilityCostsStore(DurabilityCostsfmt)
uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass)
Definition: ItemTemplate.h:566
@ RATE_REPAIRCOST
Definition: IWorld.h:470
uint32 ItemLevel
Definition: ItemTemplate.h:644
bool HandleMemberWithdrawMoney(WorldSession *session, uint32 amount, bool repair=false)
Definition: Guild.cpp:1678
Definition: DBCStructure.h:869
uint32 multiplier[29]
Definition: DBCStructure.h:871
Definition: DBCStructure.h:875
float quality_mod
Definition: DBCStructure.h:877

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 
)
4726{
4727 uint32 TotalCost = 0;
4728 // equipped, backpack, bags itself
4730 TotalCost += DurabilityRepair(((INVENTORY_SLOT_BAG_0 << 8) | i), cost, discountMod, guildBank);
4731
4732 // bank, buyback and keys not repaired
4733
4734 // items in inventory bags
4736 for (uint8 i = 0; i < MAX_BAG_SIZE; i++)
4737 TotalCost += DurabilityRepair(((j << 8) | i), cost, discountMod, guildBank);
4738 return TotalCost;
4739}
uint32 DurabilityRepair(uint16 pos, bool cost, float discountMod, bool guildBank)
Definition: Player.cpp:4741

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 
)
11018{
11019 if (!enchantmentcondition)
11020 return true;
11021
11022 SpellItemEnchantmentConditionEntry const* Condition = sSpellItemEnchantmentConditionStore.LookupEntry(enchantmentcondition);
11023
11024 if (!Condition)
11025 return true;
11026
11027 uint8 curcount[4] = {0, 0, 0, 0};
11028
11029 //counting current equipped gem colors
11031 {
11032 if (i == slot)
11033 continue;
11035 if (pItem2 && !pItem2->IsBroken() && pItem2->HasSocket())
11036 {
11037 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot <= PRISMATIC_ENCHANTMENT_SLOT; ++enchant_slot)
11038 {
11039 if (enchant_slot == BONUS_ENCHANTMENT_SLOT)
11040 continue;
11041
11042 uint32 enchant_id = pItem2->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11043 if (!enchant_id)
11044 continue;
11045
11046 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11047 if (!enchantEntry)
11048 continue;
11049
11050 uint32 gemid = enchantEntry->GemID;
11051 if (!gemid)
11052 continue;
11053
11054 ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemid);
11055 if (!gemProto)
11056 continue;
11057
11058 GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GemProperties);
11059 if (!gemProperty)
11060 continue;
11061
11062 uint8 GemColor = gemProperty->color;
11063
11064 for (uint8 b = 0, tmpcolormask = 1; b < 4; b++, tmpcolormask <<= 1)
11065 {
11066 if (tmpcolormask & GemColor)
11067 ++curcount[b];
11068 }
11069 }
11070 }
11071 }
11072
11073 bool activate = true;
11074
11075 for (uint8 i = 0; i < 5; i++)
11076 {
11077 if (!Condition->Color[i])
11078 continue;
11079
11080 uint32 _cur_gem = curcount[Condition->Color[i] - 1];
11081
11082 // if have <CompareColor> use them as count, else use <value> from Condition
11083 uint32 _cmp_gem = Condition->CompareColor[i] ? curcount[Condition->CompareColor[i] - 1] : Condition->Value[i];
11084
11085 switch (Condition->Comparator[i])
11086 {
11087 case 2: // requires less <color> than (<value> || <comparecolor>) gems
11088 activate &= (_cur_gem < _cmp_gem);
11089 break;
11090 case 3: // requires more <color> than (<value> || <comparecolor>) gems
11091 activate &= (_cur_gem > _cmp_gem);
11092 break;
11093 case 5: // requires at least <color> than (<value> || <comparecolor>) gems
11094 activate &= (_cur_gem >= _cmp_gem);
11095 break;
11096 }
11097 }
11098
11099 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");
11100
11101 return activate;
11102}
DBCStorage< SpellItemEnchantmentConditionEntry > sSpellItemEnchantmentConditionStore(SpellItemEnchantmentConditionfmt)
DBCStorage< GemPropertiesEntry > sGemPropertiesStore(GemPropertiesEntryfmt)
@ BONUS_ENCHANTMENT_SLOT
Definition: Item.h:168
Definition: ConditionMgr.h:194
uint32 GemProperties
Definition: ItemTemplate.h:692
Definition: DBCStructure.h:1005
uint32 color
Definition: DBCStructure.h:1008
Definition: DBCStructure.h:1836

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:831
@ DAMAGE_FALL
Definition: Player.h:829
@ DAMAGE_LAVA
Definition: Player.h:830
@ DAMAGE_FALL_TO_VOID
Definition: Player.h:833
@ SELF_DAMAGE
Definition: Unit.h:440
@ DIRECT_DAMAGE
Definition: Unit.h:435
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition: IWorld.h:504
@ ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM
Definition: DBCEnums.h:146
@ SPELL_SCHOOL_MASK_NATURE
Definition: SharedDefines.h:272
@ SPELL_SCHOOL_MASK_FIRE
Definition: SharedDefines.h:271
void DurabilityLossAll(double percent, bool inventory)
Definition: Player.cpp:4617
void SendDurabilityLoss()
Definition: Player.cpp:4612
bool IsImmuneToEnvironmentalDamage()
Definition: Player.cpp:748
Definition: Unit.h:761
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition: Unit.cpp:2117
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition: Unit.cpp:805
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:815
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 
)
2756{
2758 AddItemDurations(pItem);
2759
2760 uint8 bag = pos >> 8;
2761 uint8 slot = pos & 255;
2762
2763 Item* pItem2 = GetItemByPos(bag, slot);
2764
2765 if (!pItem2)
2766 {
2767 VisualizeItem(slot, pItem);
2768
2769 if (IsAlive())
2770 {
2771 ItemTemplate const* pProto = pItem->GetTemplate();
2772
2773 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
2774 if (pProto && pProto->ItemSet)
2775 AddItemsSetItem(this, pItem);
2776
2777 _ApplyItemMods(pItem, slot, true);
2778
2779 if (pProto && IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer == 0)
2780 {
2781 uint32 cooldownSpell = getClass() == CLASS_ROGUE ? 6123 : 6119;
2782 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(cooldownSpell);
2783
2784 if (!spellProto)
2785 LOG_ERROR("entities.player", "Weapon switch cooldown spell {} couldn't be found in Spell.dbc", cooldownSpell);
2786 else
2787 {
2789
2791
2792 WorldPacket data;
2794 GetSession()->SendPacket(&data);
2795 }
2796 }
2797 }
2798
2799 if (IsInWorld() && update)
2800 {
2801 pItem->AddToWorld();
2802 pItem->SendUpdateToPlayer(this);
2803 }
2804
2805 ApplyEquipCooldown(pItem);
2806
2807 // update expertise and armor penetration - passive auras may need it
2808
2809 if (slot == EQUIPMENT_SLOT_MAINHAND)
2811
2812 else if (slot == EQUIPMENT_SLOT_OFFHAND)
2814
2815 switch (slot)
2816 {
2821 default:
2822 break;
2823 }
2824 }
2825 else
2826 {
2827 pItem2->SetCount(pItem2->GetCount() + pItem->GetCount());
2828 if (IsInWorld() && update)
2829 pItem2->SendUpdateToPlayer(this);
2830
2831 // delete item (it not in any slot currently)
2832 //pItem->DeleteFromDB();
2833 if (IsInWorld() && update)
2834 {
2835 pItem->RemoveFromWorld();
2836 pItem->DestroyForPlayer(this);
2837 }
2838
2840 RemoveItemDurations(pItem);
2841
2842 pItem->SetOwnerGUID(GetGUID()); // prevent error at next SetState in case trade/mail/buy from vendor
2843 pItem->SetNotRefundable(this);
2844 pItem->ClearSoulboundTradeable(this);
2845 RemoveTradeableItem(pItem);
2846 pItem->SetState(ITEM_REMOVED, this);
2847 pItem2->SetState(ITEM_CHANGED, this);
2848
2849 ApplyEquipCooldown(pItem2);
2850 sScriptMgr->OnEquip(this, pItem2, bag, slot, update);
2851 return pItem2;
2852 }
2853
2854 // only for full equip instead adding to stack
2857
2858 sScriptMgr->OnEquip(this, pItem, bag, slot, update);
2860 return pItem;
2861}
@ SPELL_COOLDOWN_FLAG_INCLUDE_GCD
Starts GCD in addition to normal cooldown specified in the packet.
Definition: Unit.h:1231
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM
Definition: DBCEnums.h:177
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM
Definition: DBCEnums.h:169
void UpdateForQuestWorldObjects()
Definition: PlayerUpdates.cpp:1743
GlobalCooldownMgr & GetGlobalCooldownMgr()
Definition: Player.h:1755
void ApplyEquipCooldown(Item *pItem)
Definition: Player.cpp:11666
void VisualizeItem(uint8 slot, Item *pItem)
Definition: PlayerStorage.cpp:2903
void AddGlobalCooldown(SpellInfo const *spellInfo, uint32 gcd)
Definition: Unit.cpp:347
uint32 StartRecoveryTime
Definition: SpellInfo.h:349

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_ROGUE, Item::ClearSoulboundTradeable(), CR_ARMOR_PENETRATION, Object::DestroyForPlayer(), EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, Unit::getClass(), Item::GetCount(), Object::GetEntry(), GetGlobalCooldownMgr(), Object::GetGUID(), GetItemByPos(), GetSession(), Item::GetTemplate(), ItemTemplate::InventoryType, INVTYPE_RELIC, Unit::IsAlive(), 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 
)
2736{
2737 Item* _item = Item::CreateItem(item, 1, this);
2738 if (!_item)
2739 return nullptr;
2740
2741 if (!IsEquipmentPos(pos) || sScriptMgr->CanSaveEquipNewItem(this, _item, pos, update))
2742 {
2743 // pussywizard: obtaining blue or better items saves to db
2744 if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item))
2745 if (pProto->Quality >= ITEM_QUALITY_RARE)
2747
2748 ItemAddedQuestCheck(item, 1);
2750 }
2751
2752 return EquipItem(pos, _item, update);
2753}
@ ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM
Definition: DBCEnums.h:205
@ ITEM_QUALITY_RARE
Definition: SharedDefines.h:304
void ItemAddedQuestCheck(uint32 entry, uint32 count)
Definition: PlayerQuest.cpp:1819

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

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

References AutoUnequipOffhandIfNeed(), Unit::CanDualWield(), CanTitanGrip(), 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, Unit::getClass(), 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, 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
2486{ return m_achievementMgr; }

References m_achievementMgr.

◆ GetActionButton()

ActionButton const * Player::GetActionButton ( uint8  button)
5556{
5557 ActionButtonList::iterator buttonItr = m_actionButtons.find(button);
5558 if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED)
5559 return nullptr;
5560
5561 return &buttonItr->second;
5562}

References ACTIONBUTTON_DELETED, and m_actionButtons.

Referenced by Spell::EffectCastButtons().

◆ GetActiveSpec()

◆ GetActiveSpecMask()

uint8 Player::GetActiveSpecMask ( ) const
inline

◆ GetAmmoDPS()

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

References m_ammoDPS.

Referenced by _ApplyAmmoBonuses(), and CalculateMinMaxDamage().

◆ GetArenaPersonalRating()

uint32 Player::GetArenaPersonalRating ( uint8  slot) const
16084{
16086
16087 sScriptMgr->OnGetArenaPersonalRating(const_cast<Player*>(this), slot, result);
16088
16089 return result;
16090}

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
6203{
6205 stmt->SetData(0, guid.GetCounter());
6206 stmt->SetData(1, type);
6207 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6208
6209 if (!result)
6210 return 0;
6211
6212 uint32 id = (*result)[0].Get<uint32>();
6213 return id;
6214}
@ 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
1329{ return m_ArmorProficiency; }

References m_ArmorProficiency.

Referenced by Spell::EffectProficiency().

◆ GetAttackBySlot()

◆ GetAurasForTarget()

void Player::GetAurasForTarget ( Unit target)

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

11962{
11963 if (!target/* || target->GetVisibleAuras()->empty()*/) // speedup things
11964 return;
11965
11970 target->SendMovementFeatherFall(this);
11971
11973 target->SendMovementWaterWalking(this);
11974
11975 if (target->HasAuraType(SPELL_AURA_HOVER))
11976 target->SendMovementHover(this);
11977
11979 data<< target->GetPackGUID();
11980
11981 Unit::VisibleAuraMap const* visibleAuras = target->GetVisibleAuras();
11982 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
11983 {
11984 AuraApplication* auraApp = itr->second;
11985 auraApp->BuildUpdatePacket(data, false);
11986 }
11987
11988 GetSession()->SendPacket(&data);
11989}
@ 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:20946
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition: Unit.h:1312
void SendMovementWaterWalking(Player *sendTo)
Definition: Unit.cpp:20887
VisibleAuraMap const * GetVisibleAuras()
Definition: Unit.h:2151
void SendMovementFeatherFall(Player *sendTo)
Definition: Unit.cpp:20909
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 SendInitialPacketsAfterAddToMap().

◆ GetAuraUpdateMaskForRaid()

uint64 Player::GetAuraUpdateMaskForRaid ( ) const
inline

◆ GetAverageItemLevel()

float Player::GetAverageItemLevel ( )
15605{
15606 float sum = 0;
15607 uint32 count = 0;
15608 uint8 level = GetLevel();
15609
15611 {
15612 // don't check tabard, ranged, offhand or shirt
15614 continue;
15615
15616 if (m_items[i] && m_items[i]->GetTemplate())
15618
15619 ++count;
15620 }
15621
15622 return std::max<float>(0.0f, sum / (float)count);
15623}
float GetItemLevelIncludingQuality(uint8 pLevel) const
Definition: ItemTemplate.h:766

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 ( )
15626{
15627 float sum = 0;
15628 uint32 count = 0;
15629 uint8 level = GetLevel();
15630
15631 for (int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
15632 {
15633 // don't check tabard, ranged, offhand or shirt
15635 continue;
15636
15637 if (m_items[i] && m_items[i]->GetTemplate())
15638 {
15639 if (m_items[i]->GetTemplate()->Quality == ITEM_QUALITY_HEIRLOOM)
15640 sum += level * 2.33f;
15641 else
15642 sum += m_items[i]->GetTemplate()->ItemLevel;
15643 }
15644
15645 ++count;
15646 }
15647
15648 return std::max(0.0f, sum / (float)count);
15649}

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 
)
13143{
13144 uint8 level = GetLevel();
13145
13146 if (level > GT_MAX_LEVEL)
13147 level = GT_MAX_LEVEL; // max level in this dbc
13148
13149 uint8 hairstyle = GetByteValue(PLAYER_BYTES, 2);
13150 uint8 haircolor = GetByteValue(PLAYER_BYTES, 3);
13151 uint8 facialhair = GetByteValue(PLAYER_BYTES_2, 0);
13152 uint8 skincolor = GetByteValue(PLAYER_BYTES, 0);
13153
13154 if ((hairstyle == newhairstyle) && (haircolor == newhaircolor) && (facialhair == newfacialhair) && (!newSkin || (newSkin->hair_id == skincolor)))
13155 return 0;
13156
13157 GtBarberShopCostBaseEntry const* bsc = sGtBarberShopCostBaseStore.LookupEntry(level - 1);
13158
13159 if (!bsc) // shouldn't happen
13160 return 0xFFFFFFFF;
13161
13162 float cost = 0;
13163
13164 if (hairstyle != newhairstyle)
13165 cost += bsc->cost; // full price
13166
13167 if ((haircolor != newhaircolor) && (hairstyle == newhairstyle))
13168 cost += bsc->cost * 0.5f; // +1/2 of price
13169
13170 if (facialhair != newfacialhair)
13171 cost += bsc->cost * 0.75f; // +3/4 of price
13172
13173 if (newSkin && skincolor != newSkin->hair_id)
13174 cost += bsc->cost * 0.75f; // +5/6 of price
13175
13176 return uint32(cost);
13177}
DBCStorage< GtBarberShopCostBaseEntry > sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt)
#define GT_MAX_LEVEL
Definition: DBCStructure.h:1027
Definition: DBCStructure.h:1033
float cost
Definition: DBCStructure.h:1034

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:2853
uint16 GetBaseSkillValue(uint32 skill) const
Definition: Player.cpp:5405

References GetBaseSkillValue(), and SKILL_DEFENSE.

Referenced by UpdateCombatSkills().

◆ GetBaseModValue()

float Player::GetBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType 
) const
4961{
4962 if (modGroup >= BASEMOD_END)
4963 {
4964 LOG_ERROR("entities.player", "trial to access non existed BaseModGroup!");
4965 return 0.0f;
4966 }
4967
4968 if (modType == PCT_MOD && m_auraBaseMod[modGroup][PCT_MOD] <= 0.0f)
4969 return 0.0f;
4970
4971 return m_auraBaseMod[modGroup][modType];
4972}

References BASEMOD_END, LOG_ERROR, m_auraBaseMod, and PCT_MOD.

◆ GetBaseRune()

RuneType Player::GetBaseRune ( uint8  index) const
inline
2456{ return RuneType(m_runes->runes[index].BaseRune); }
RuneType
Definition: Player.h:409
uint8 BaseRune
Definition: Player.h:419
RuneInfo runes[MAX_RUNES]
Definition: Player.h:428

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
5406{
5407 if (!skill)
5408 return 0;
5409
5410 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5411 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5412 return 0;
5413
5414 int32 result = int32(SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5415 result += SKILL_PERM_BONUS(GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos)));
5416 return result < 0 ? 0 : result;
5417}
#define SKILL_PERM_BONUS(x)
Definition: Player.h:88

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
12706{
12707 Item* item = GetWeaponForAttack(attType, true);
12708
12709 // unarmed only with base attack
12710 if (attType != BASE_ATTACK && !item)
12711 return 0;
12712
12713 // weapon skill or (unarmed for base attack)
12714 uint32 skill = item ? item->GetSkill() : uint32(SKILL_UNARMED);
12715 return GetBaseSkillValue(skill);
12716}
@ SKILL_UNARMED
Definition: SharedDefines.h:2879

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

Referenced by UpdateCombatSkills().

◆ GetBattleground()

Battleground * Player::GetBattleground ( bool  create = false) const
12098{
12099 if (GetBattlegroundId() == 0)
12100 return nullptr;
12101
12103 return (create || (bg && bg->FindBgMap()) ? bg : nullptr);
12104}
#define sBattlegroundMgr
Definition: BattlegroundMgr.h:188
BattlegroundMap * FindBgMap() const
Definition: Battleground.h:425
BattlegroundTypeId GetBattlegroundTypeId() const
Definition: Player.h:2204
uint32 GetBattlegroundId() const
Definition: Player.h:2203

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

Referenced by GameObject::ActivateToQuest(), CanEquipItem(), 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::spell_ioc_gunship_portal_SpellScript::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
2204{ return m_bgData.bgTypeID; }
BattlegroundTypeId bgTypeID
Definition: Player.h:1018

References BGData::bgTypeID, and m_bgData.

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

◆ GetBGAccessByLevel()

bool Player::GetBGAccessByLevel ( BattlegroundTypeId  bgTypeId) const
12220{
12221 // get a template bg instead of running one
12222 Battleground* bgt = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);
12223 if (!bgt)
12224 return false;
12225
12226 // limit check leel to dbc compatible level range
12227 uint32 level = GetLevel();
12228 if (level > DEFAULT_MAX_LEVEL)
12229 level = DEFAULT_MAX_LEVEL;
12230
12231 if (level < bgt->GetMinLevel() || level > bgt->GetMaxLevel())
12232 return false;
12233
12234 return true;
12235}
uint32 GetMaxLevel() const
Definition: Battleground.h:329

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
2208{ return m_bgData; }

References m_bgData.

◆ GetBgTeamId()

◆ GetChampioningFaction()

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

References m_ChampioningFaction.

Referenced by RewardReputation().

◆ GetChatTag()

uint8 Player::GetChatTag ( ) const
1287{
1288 uint8 tag = CHAT_TAG_NONE;
1289
1290 if (isGMChat())
1291 tag |= CHAT_TAG_GM;
1292 if (isDND())
1293 tag |= CHAT_TAG_DND;
1294 if (isAFK())
1295 tag |= CHAT_TAG_AFK;
1296 if (IsDeveloper())
1297 tag |= CHAT_TAG_DEV;
1298
1299 return tag;
1300}
@ CHAT_TAG_DND
Definition: Player.h:840
@ CHAT_TAG_DEV
Definition: Player.h:843
@ CHAT_TAG_AFK
Definition: Player.h:839
@ CHAT_TAG_GM
Definition: Player.h:841
@ CHAT_TAG_NONE
Definition: Player.h:838
bool isGMChat() const
Definition: Player.h:1138
bool isDND() const
Definition: Player.h:1115
bool IsDeveloper() const
Definition: Player.h:1132
bool isAFK() const
Definition: Player.h:1114

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

◆ getCinematic()

uint8 Player::getCinematic ( ) const
inline
1782 {
1783 return m_cinematic;
1784 }

References m_cinematic.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ GetCinematicMgr()

CinematicMgr * Player::GetCinematicMgr ( ) const
inline

◆ GetCommandStatus()

◆ GetCorpse()

◆ GetCorpseLocation()

◆ GetCorpseReclaimDelay()

uint32 Player::GetCorpseReclaimDelay ( bool  pvp) const
12813{
12814 if (pvp)
12815 {
12816 if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP))
12817 return copseReclaimDelay[0];
12818 }
12819 else if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE))
12820 return 0;
12821
12822 time_t now = GameTime::GetGameTime().count();
12823 // 0..2 full period
12824 // should be std::ceil(x)-1 but not floor(x)
12825 uint64 count = (now < m_deathExpireTime - 1) ? (m_deathExpireTime - 1 - now) / DEATH_EXPIRE_STEP : 0;
12826 return copseReclaimDelay[count];
12827}

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().

◆ GetCurrentBattlegroundQueueSlot()

uint32 Player::GetCurrentBattlegroundQueueSlot ( ) const
inline

◆ GetCurrentRune()

RuneType Player::GetCurrentRune ( uint8  index) const
inline

◆ GetDeathTimer()

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

References m_deathTimer.

Referenced by WorldSession::LogoutPlayer().

◆ GetDebugInfo()

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

Reimplemented from WorldObject.

16233{
16234 std::stringstream sstr;
16235 sstr << Unit::GetDebugInfo();
16236 return sstr.str();
16237}
std::string GetDebugInfo() const override
Definition: Unit.cpp:21462

References Unit::GetDebugInfo().

◆ GetDeclinedNames()

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

References m_declinedname.

◆ GetDefaultGossipMenuForSource()

uint32 Player::GetDefaultGossipMenuForSource ( WorldObject source)
static
424{
425 switch (source->GetTypeId())
426 {
427 case TYPEID_UNIT:
428 return source->ToCreature()->GetCreatureTemplate()->GossipMenuId;
430 return source->ToGameObject()->GetGOInfo()->GetGossipMenuId();
431 default:
432 break;
433 }
434
435 return 0;
436}
uint32 GossipMenuId
Definition: CreatureData.h:187
GameObjectTemplate const * GetGOInfo() const
Definition: GameObject.h:138
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
5015{
5016 // Table for base dodge values
5017 const float dodge_base[MAX_CLASSES] =
5018 {
5019 0.036640f, // Warrior
5020 0.034943f, // Paladi
5021 -0.040873f, // Hunter
5022 0.020957f, // Rogue
5023 0.034178f, // Priest
5024 0.036640f, // DK
5025 0.021080f, // Shaman
5026 0.036587f, // Mage
5027 0.024211f, // Warlock
5028 0.0f, // ??
5029 0.056097f // Druid
5030 };
5031 // Crit/agility to dodge/agility coefficient multipliers; 3.2.0 increased required agility by 15%
5032 const float crit_to_dodge[MAX_CLASSES] =
5033 {
5034 0.85f / 1.15f, // Warrior
5035 1.00f / 1.15f, // Paladin
5036 1.11f / 1.15f, // Hunter
5037 2.00f / 1.15f, // Rogue
5038 1.00f / 1.15f, // Priest
5039 0.85f / 1.15f, // DK
5040 1.60f / 1.15f, // Shaman
5041 1.00f / 1.15f, // Mage
5042 0.97f / 1.15f, // Warlock (?)
5043 0.0f, // ??
5044 2.00f / 1.15f // Druid
5045 };
5046
5047 uint8 level = GetLevel();
5048 uint32 pclass = getClass();
5049
5050 if (level > GT_MAX_LEVEL)
5051 level = GT_MAX_LEVEL;
5052
5053 // Dodge per agility is proportional to crit per agility, which is available from DBC files
5054 GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5055 if (!dodgeRatio || pclass > MAX_CLASSES)
5056 return;
5057
5060 float bonus_agility = GetStat(STAT_AGILITY) - base_agility;
5061
5062 // calculate diminishing (green in char screen) and non-diminishing (white) contribution
5063 diminishing = 100.0f * bonus_agility * dodgeRatio->ratio * crit_to_dodge[pclass - 1];
5064 nondiminishing = 100.0f * (dodge_base[pclass - 1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass - 1]);
5065}
DBCStorage< GtChanceToMeleeCritEntry > sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt)
@ UNIT_MOD_STAT_START
Definition: Unit.h:289
#define MAX_CLASSES
Definition: SharedDefines.h:127
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition: Unit.h:2515
float GetCreateStat(Stats stat) const
Definition: Unit.h:2045
Definition: DBCStructure.h:1048
float ratio
Definition: DBCStructure.h:1049

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:466
@ DRUNKEN_DRUNK
Definition: Player.h:467
@ DRUNKEN_SOBER
Definition: Player.h:465
@ DRUNKEN_SMASHED
Definition: Player.h:468

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
5106{
5107 switch (attType)
5108 {
5109 case BASE_ATTACK:
5110 return GetUInt32Value(PLAYER_EXPERTISE) / 4.0f;
5111 case OFF_ATTACK:
5113 default:
5114 break;
5115 }
5116 return 0.0f;
5117}
@ 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.

◆ GetFarSightDistance()

Optional< float > Player::GetFarSightDistance ( ) const
16162{
16163 return _farSightDistance;
16164}
Optional< float > _farSightDistance
Definition: Player.h:2937

References _farSightDistance.

◆ GetFreeInventorySpace()

uint32 Player::GetFreeInventorySpace ( ) const
498{
499 uint32 freeSpace = 0;
500
501 // Check backpack
502 for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; ++slot)
503 {
505 if (!item)
506 freeSpace += 1;
507 }
508
509 // Check bags
511 {
512 if (Bag* bag = GetBagByPos(i))
513 freeSpace += bag->GetFreeSlots();
514 }
515
516 return freeSpace;
517}

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
2108{
2109 if (GameObject* go = GetMap()->GetGameObject(guid))
2110 {
2111 if (go->GetGoType() == type)
2112 {
2113 // Players cannot interact with gameobjects that use the "Point" icon
2114 if (go->GetGOInfo()->IconName == "Point")
2115 {
2116 return nullptr;
2117 }
2118
2119 if (go->IsWithinDistInMap(this))
2120 {
2121 return go;
2122 }
2123
2124 LOG_DEBUG("maps", "IsGameObjectOfTypeInRange: GameObject '{}' [{}] is too far away from player {} [{}] to be used by him (distance={}, maximal 10 is allowed)",
2125 go->GetGOInfo()->name, go->GetGUID().ToString(), GetName(), GetGUID().ToString(), go->GetDistance(this));
2126 }
2127 }
2128 return nullptr;
2129}
GameObject * GetGameObject(uint32 spellId) const
Definition: Unit.cpp:6081

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
1755{ return m_GlobalCooldownMgr; }
GlobalCooldownMgr m_GlobalCooldownMgr
Definition: Player.h:2749

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 
)
406{
408
409 if (!menuId)
410 return textId;
411
412 GossipMenusMapBounds menuBounds = sObjectMgr->GetGossipMenusMapBounds(menuId);
413
414 for (GossipMenusContainer::const_iterator itr = menuBounds.first; itr != menuBounds.second; ++itr)
415 {
416 if (sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
417 textId = itr->second.TextID;
418 }
419
420 return textId;
421}
#define DEFAULT_GOSSIP_MESSAGE
Definition: GossipDef.h:30
std::pair< GossipMenusContainer::const_iterator, GossipMenusContainer::const_iterator > GossipMenusMapBounds
Definition: ObjectMgr.h:636

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_aged_dying_ancient_kodo::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_captain_saeed::OnGossipHello(), npc_professor_dabiri::OnGossipHello(), npc_drake_dealer_hurlunk::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_salsalabim::OnGossipHello(), npc_zephyr::OnGossipHello(), npcs_ashyen_and_keleth::OnGossipHello(), npc_mortog_steamhead::OnGossipHello(), npc_timothy_daniels::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)
398{
399 if (!source)
401
402 return GetGossipTextId(GetDefaultGossipMenuForSource(source), source);
403}
static uint32 GetDefaultGossipMenuForSource(WorldObject *source)
Definition: PlayerGossip.cpp:423
uint32 GetGossipTextId(uint32 menuId, WorldObject *source)
Definition: PlayerGossip.cpp:405

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

◆ GetGracePeriod()

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

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
2418{ return m_group.getTarget(); }
TO * getTarget() const
Definition: Reference.h:95
GroupReference m_group
Definition: Player.h:2829

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

Referenced by _LoadGroup(), Group::AddInvite(), Loot::AddItem(), Group::AddMember(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), Battleground::AddOrSetPlayerToCorrectBgGroup(), InstanceMap::AddPlayerToMap(), LootItem::AllowedForPlayer(), Group::BroadcastPacket(), npc_coren_direbrew::CanBeSeen(), go_loosely_turned_soil::go_loosely_turned_soilAI::CanBeSeen(), boss_ahune::boss_ahuneAI::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(), npc_shay_leafrunner::npc_shay_leafrunnerAI::FailQuest(), 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(), 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::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(), 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
2419{ return (const Group*)m_group.getTarget(); }

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

◆ GetGroupInvite()

Group * Player::GetGroupInvite ( )
inline

◆ GetGroupRef()

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

References m_group.

◆ GetGroupUpdateFlag()

uint32 Player::GetGroupUpdateFlag ( ) const
inline

◆ GetGuild()

Guild * Player::GetGuild ( ) const
15887{
15888 uint32 guildId = GetGuildId();
15889 return guildId ? sGuildMgr->GetGuildById(guildId) : nullptr;
15890}

References GetGuildId(), and sGuildMgr.

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

◆ GetGuildId()

◆ GetGuildIdInvited()

◆ GetGuildName()

std::string const & Player::GetGuildName ( )
15226{
15227 return sGuildMgr->GetGuildById(GetGuildId())->GetName();
15228}

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
1516{ return m_ingametime; }

References m_ingametime.

◆ GetInitialVisiblePackets()

void Player::GetInitialVisiblePackets ( Unit target)
1658{
1659 GetAurasForTarget(target);
1660 if (target->IsAlive())
1661 {
1663 target->GetVictim())
1664 target->SendMeleeAttackStart(target->GetVictim(), this);
1665 }
1666}
@ UNIT_STATE_MELEE_ATTACKING
Definition: Unit.h:326
void GetAurasForTarget(Unit *target)
Definition: Player.cpp:11961
Unit * GetVictim() const
Definition: Unit.h:1386
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition: Unit.cpp:3023

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
1176{ return _innTriggerId; }

References _innTriggerId.

Referenced by Update().

◆ GetItemByEntry()

Item * Player::GetItemByEntry ( uint32  entry) const
3398{
3399 // in inventory
3401 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3402 if (pItem->GetEntry() == entry)
3403 return pItem;
3404
3406 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3407 if (pItem->GetEntry() == entry)
3408 return pItem;
3409
3410 for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i)
3411 if (Bag* pBag = GetBagByPos(i))
3412 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
3413 if (Item* pItem = pBag->GetItemByPos(j))
3414 if (pItem->GetEntry() == entry)
3415 return pItem;
3416
3417 for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; ++i)
3418 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3419 if (pItem->GetEntry() == entry)
3420 return pItem;
3421
3422 return nullptr;
3423}

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
439{
441 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
442 if (pItem->GetGUID() == guid)
443 return pItem;
444
446 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
447 if (pItem->GetGUID() == guid)
448 return pItem;
449
450 for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
451 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
452 if (pItem->GetGUID() == guid)
453 return pItem;
454
456 if (Bag* pBag = GetBagByPos(i))
457 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
458 if (Item* pItem = pBag->GetItemByPos(j))
459 if (pItem->GetGUID() == guid)
460 return pItem;
461
463 if (Bag* pBag = GetBagByPos(i))
464 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
465 if (Item* pItem = pBag->GetItemByPos(j))
466 if (pItem->GetGUID() == guid)
467 return pItem;
468
469 return nullptr;
470}

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
473{
474 uint8 bag = pos >> 8;
475 uint8 slot = pos & 255;
476 return GetItemByPos(bag, slot);
477}

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(), SplitItem(), SwapItem(), and ToggleMetaGemsActive().

◆ GetItemByPos() [2/2]

Item * Player::GetItemByPos ( uint8  bag,
uint8  slot 
) const
480{
481 if (bag == INVENTORY_SLOT_BAG_0 && (slot < BANK_SLOT_BAG_END || (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END)))
482 return m_items[slot];
483 else if (Bag* pBag = GetBagByPos(bag))
484 return pBag->GetItemByPos(slot);
485 return nullptr;
486}

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
359{
360 uint32 count = 0;
362 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
363 if (pItem != skipItem && pItem->GetEntry() == item)
364 count += pItem->GetCount();
365
367 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
368 if (pItem != skipItem && pItem->GetEntry() == item)
369 count += pItem->GetCount();
370
372 if (Bag* pBag = GetBagByPos(i))
373 count += pBag->GetItemCount(item, skipItem);
374
375 if (skipItem && skipItem->GetTemplate()->GemProperties)
377 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
378 if (pItem != skipItem && pItem->GetTemplate()->Socket[0].Color)
379 count += pItem->GetGemCountWithID(item);
380
381 if (inBankAlso)
382 {
383 // checking every item from 39 to 74 (including bank bags)
385 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
386 if (pItem != skipItem && pItem->GetEntry() == item)
387 count += pItem->GetCount();
388
390 if (Bag* pBag = GetBagByPos(i))
391 count += pBag->GetItemCount(item, skipItem);
392
393 if (skipItem && skipItem->GetTemplate()->GemProperties)
395 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
396 if (pItem != skipItem && pItem->GetTemplate()->Socket[0].Color)
397 count += pItem->GetGemCountWithID(item);
398 }
399
400 return count;
401}

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(), 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
404{
405 uint32 count = 0;
406 for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i)
407 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
408 if (pItem != skipItem)
409 if (ItemTemplate const* pProto = pItem->GetTemplate())
410 if (pProto->ItemLimitCategory == limitCategory)
411 count += pItem->GetCount();
412
413 for (int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
414 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
415 if (pItem != skipItem)
416 if (ItemTemplate const* pProto = pItem->GetTemplate())
417 if (pProto->ItemLimitCategory == limitCategory)
418 count += pItem->GetCount();
419
421 if (Bag* pBag = GetBagByPos(i))
422 count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
423
424 for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
425 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
426 if (pItem != skipItem)
427 if (ItemTemplate const* pProto = pItem->GetTemplate())
428 if (pProto->ItemLimitCategory == limitCategory)
429 count += pItem->GetCount();
430
431 for (int i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i)
432 if (Bag* pBag = GetBagByPos(i))
433 count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
434
435 return count;
436}

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)
4016{
4017 LOG_DEBUG("entities.player.items", "STORAGE: GetItemFromBuyBackSlot slot = {}", slot);
4018 if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END)
4019 return m_items[slot];
4020 return nullptr;
4021}

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, LOG_DEBUG, and m_items.

Referenced by WorldSession::HandleBuybackItem().

◆ GetItemUpdateQueue()

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

◆ GetLastPetNumber()

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

References m_lastpetnumber.

Referenced by spell_gen_pet_summoned::HandleScript().

◆ GetLastPetSpell()

uint32 Player::GetLastPetSpell ( ) const
inline

◆ GetLastPotionId()

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

References m_lastPotionId.

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

◆ GetLastUsedRune()

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

References Runes::lastUsedRune, and m_runes.

◆ GetLevelPlayedTime()

uint32 Player::GetLevelPlayedTime ( )
inline

◆ GetLootGUID()

◆ GetMail()

Mail * Player::GetMail ( uint32  id)
3745{
3746 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
3747 {
3748 if ((*itr)->messageID == id)
3749 {
3750 return (*itr);
3751 }
3752 }
3753 return nullptr;
3754}

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
1608{ 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
2441{ return m_mapRef; }
MapReference m_mapRef
Definition: Player.h:2884

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.

10783{
10784 // returns the maximal personal arena rating that can be used to purchase items requiring this condition
10785 // the personal rating of the arena team must match the required limit as well
10786 // so return max[in arenateams](min(personalrating[teamtype], teamrating[teamtype]))
10787 uint32 max_personal_rating = 0;
10788 for (uint8 i = minarenaslot; i < MAX_ARENA_SLOT; ++i)
10789 {
10790 if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamId(i)))
10791 {
10792 uint32 p_rating = GetArenaPersonalRating(i);
10793 uint32 t_rating = at->GetRating();
10794 p_rating = p_rating < t_rating ? p_rating : t_rating;
10795 if (max_personal_rating < p_rating)
10796 max_personal_rating = p_rating;
10797 }
10798 }
10799
10800 sScriptMgr->OnGetMaxPersonalArenaRatingRequirement(this, minarenaslot, max_personal_rating);
10801
10802 return max_personal_rating;
10803}
uint32 GetArenaPersonalRating(uint8 slot) const
Definition: Player.cpp:16083
uint32 GetArenaTeamId(uint8 slot) const
Definition: Player.cpp:16092

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

Referenced by BuyItemFromVendorSlot().

◆ GetMaxSkillValue()

uint16 Player::GetMaxSkillValue ( uint32  skill) const
5372{
5373 if (!skill)
5374 return 0;
5375
5376 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5377 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5378 return 0;
5379
5380 uint32 bonus = GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos));
5381
5382 int32 result = int32(SKILL_MAX(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5383 sScriptMgr->OnGetMaxSkillValue(const_cast<Player*>(this), skill, result, false);
5384 result += SKILL_TEMP_BONUS(bonus);
5385 result += SKILL_PERM_BONUS(bonus);
5386 return result < 0 ? 0 : result;
5387}
#define SKILL_TEMP_BONUS(x)
Definition: Player.h:87

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
16120{
16122
16123 sScriptMgr->OnGetMaxSkillValueForLevel(const_cast<Player*>(this), result);
16124
16125 return result;
16126}
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition: Unit.h:1547

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 1 * IN_MILLISECONDS;
828 }
829 default:
830 return 0;
831 }
832}
AccountTypes
Definition: Common.h:65
T AddPct(T &base, U pct)
Definition: Util.h:67
@ FIRE_TIMER
Definition: Player.h:577
@ FATIGUE_TIMER
Definition: Player.h:575
@ BREATH_TIMER
Definition: Player.h:576
@ SPELL_AURA_MOD_WATER_BREATHING
Definition: SpellAuraDefines.h:218
@ SPELL_AURA_WATER_BREATHING
Definition: SpellAuraDefines.h:145
@ CONFIG_WATER_BREATH_TIMER
Definition: IWorld.h:414
@ CONFIG_DISABLE_BREATHING
Definition: IWorld.h:305

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 ( )
4998{
4999 uint8 level = GetLevel();
5000 uint32 pclass = getClass();
5001
5002 if (level > GT_MAX_LEVEL)
5003 level = GT_MAX_LEVEL;
5004
5005 GtChanceToMeleeCritBaseEntry const* critBase = sGtChanceToMeleeCritBaseStore.LookupEntry(pclass - 1);
5006 GtChanceToMeleeCritEntry const* critRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5007 if (!critBase || !critRatio)
5008 return 0.0f;
5009
5010 float crit = critBase->base + GetStat(STAT_AGILITY) * critRatio->ratio;
5011 return crit * 100.0f;
5012}
DBCStorage< GtChanceToMeleeCritBaseEntry > sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt)
Definition: DBCStructure.h:1043
float base
Definition: DBCStructure.h:1044

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.

6878{
6879 if (Item const* weapon = GetWeaponForAttack(attackType, true))
6880 {
6881 return SpellSchoolMask(1 << weapon->GetTemplate()->Damage[damageIndex].DamageType);
6882 }
6883
6885}
SpellSchoolMask
Definition: SharedDefines.h:267

References GetWeaponForAttack(), and SPELL_SCHOOL_MASK_NORMAL.

◆ GetMissPercentageFromDefence()

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

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
1627 {
1628 ItemMap::const_iterator itr = mMitems.find(itemLowGuid);
1629 return itr != mMitems.end() ? itr->second : nullptr;
1630 }

References mMitems.

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

◆ GetMoney()

◆ GetMostPointsTalentTree()

uint8 Player::GetMostPointsTalentTree ( ) const
15185{
15186 uint32 specPoints[3] = {0, 0, 0};
15187 const PlayerTalentMap& talentMap = GetTalentMap();
15188 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
15189 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec()))
15190 if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID))
15191 if (TalentTabEntry const* tab = sTalentTabStore.LookupEntry(talentInfo->TalentTab))
15192 if (tab->tabpage < 3)
15193 {
15194 // find current talent rank
15195 uint8 currentTalentRank = 0;
15196 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
15197 if (talentInfo->RankID[rank] && itr->first == talentInfo->RankID[rank])
15198 {
15199 currentTalentRank = rank + 1;
15200 break;
15201 }
15202 specPoints[tab->tabpage] += currentTalentRank;
15203 }
15204 uint8 maxIndex = 0;
15205 uint8 maxCount = specPoints[0];
15206 for (uint8 i = 1; i < 3; ++i)
15207 if (specPoints[i] > maxCount)
15208 {
15209 maxIndex = i;
15210 maxCount = specPoints[i];
15211 }
15212 return maxIndex;
15213}

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

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)
12878{
12879 Group* group = GetGroup();
12880 if (!group)
12881 return nullptr;
12882
12883 std::vector<Player*> nearMembers;
12884 nearMembers.reserve(group->GetMembersCount());
12885
12886 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12887 {
12888 Player* Target = itr->GetSource();
12889
12890 // IsHostileTo check duel and controlled by enemy
12891 if (Target && Target != this && IsWithinDistInMap(Target, radius) &&
12892 !Target->HasInvisibilityAura() && !IsHostileTo(Target))
12893 nearMembers.push_back(Target);
12894 }
12895
12896 if (nearMembers.empty())
12897 return nullptr;
12898
12899 uint32 randTarget = urand(0, nearMembers.size() - 1);
12900 return nearMembers[randTarget];
12901}
bool IsHostileTo(Unit const *unit) const
Definition: Unit.cpp:10209

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

◆ GetNextSave()

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

References m_nextSave.

◆ GetNPCIfCanInteractWith()

Creature * Player::GetNPCIfCanInteractWith ( ObjectGuid  guid,
uint32  npcflagmask 
)
2051{
2052 // unit checks
2053 if (!guid)
2054 return nullptr;
2055
2056 if (!IsInWorld())
2057 return nullptr;
2058
2059 if (IsInFlight())
2060 return nullptr;
2061
2062 // exist (we need look pets also for some interaction (quest/etc)
2063 Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid);
2064 if (!creature)
2065 return nullptr;
2066
2067 // Deathstate checks
2069 return nullptr;
2070
2071 // alive or spirit healer
2073 return nullptr;
2074
2075 // appropriate npc type
2076 if (npcflagmask && !creature->HasNpcFlag(NPCFlags(npcflagmask)))
2077 return nullptr;
2078
2079 // not allow interaction under control, but allow with own pets
2080 if (creature->GetCharmerGUID())
2081 return nullptr;
2082
2083 // xinef: perform better check
2084 if (creature->GetReactionTo(this) <= REP_UNFRIENDLY)
2085 return nullptr;
2086
2087 // xinef: not needed, CORRECTLY checked above including forced reputations etc
2088 // not unfriendly
2089 //if (FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(creature->GetFaction()))
2090 // if (factionTemplate->faction)
2091 // if (FactionEntry const* faction = sFactionStore.LookupEntry(factionTemplate->faction))
2092 // if (faction->reputationListID >= 0 && GetReputationMgr().GetRank(faction) <= REP_UNFRIENDLY)
2093 // return nullptr;
2094
2095 // not too far
2096 if (!creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
2097 return nullptr;
2098
2099 // 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
2100 // pussywizard: this function is not used when talking, but when already taking action (buy spell, reset talents, show spell list)
2102 return nullptr;
2103
2104 return creature;
2105}
#define INTERACTION_DISTANCE
Definition: ObjectDefines.h:24
NPCFlags
Non Player Character flags.
Definition: Unit.h:514
@ UNIT_NPC_FLAG_TRAINER_CLASS
Definition: Unit.h:521
@ UNIT_NPC_FLAG_TRAINER
Definition: Unit.h:520
@ REP_UNFRIENDLY
Definition: SharedDefines.h:154
@ TRAINER_TYPE_CLASS
Definition: SharedDefines.h:2589
@ CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS
Definition: SharedDefines.h:2668
@ CREATURE_TYPE_FLAG_INTERACT_WHILE_DEAD
Definition: SharedDefines.h:2674
uint32 trainer_class
Definition: CreatureData.h:213
uint32 type_flags
Definition: CreatureData.h:216
uint32 trainer_type
Definition: CreatureData.h:211
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition: Unit.cpp:10037
bool HasNpcFlag(NPCFlags flags) const
Definition: Unit.h:1646
ObjectGuid GetCharmerGUID() const
Definition: Unit.h:1820

References CREATURE_TYPE_FLAG_INTERACT_WHILE_DEAD, CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS, Unit::GetCharmerGUID(), Unit::getClass(), ObjectAccessor::GetCreatureOrPetOrVehicle(), Creature::GetCreatureTemplate(), Unit::GetReactionTo(), Unit::HasNpcFlag(), INTERACTION_DISTANCE, Unit::IsAlive(), 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
2434{ return m_originalGroup; }

References m_originalGroup.

◆ GetOriginalSubGroup()

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

References GroupReference::getSubGroup(), and m_originalGroup.

Referenced by RemoveFromBattlegroundOrBattlefieldRaid().

◆ GetOrInitPetStable()

PetStable & Player::GetOrInitPetStable ( )
15465{
15466 if (!m_petStable)
15467 m_petStable = std::make_unique<PetStable>();
15468
15469 return *m_petStable;
15470}

References m_petStable.

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

◆ GetOutdoorPvP()

OutdoorPvP * Player::GetOutdoorPvP ( ) const
12407{
12408 return sOutdoorPvPMgr->GetOutdoorPvPToZoneId(GetZoneId());
12409}
#define sOutdoorPvPMgr
Definition: OutdoorPvPMgr.h:106

References WorldObject::GetZoneId(), and sOutdoorPvPMgr.

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

◆ GetPassOnGroupLoot()

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

References m_bPassOnGroupLoot.

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

◆ GetPendingBind()

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

References _pendingBindId.

Referenced by WorldSession::HandleInstanceLockResponse().

◆ GetPendingSpectatorInviteInstanceId()

uint32 Player::GetPendingSpectatorInviteInstanceId ( ) const
inline

◆ GetPet()

Pet * Player::GetPet ( ) const
8785{
8786 if (ObjectGuid pet_guid = GetPetGUID())
8787 {
8788 if (!pet_guid.IsPet())
8789 return nullptr;
8790
8791 Pet* pet = ObjectAccessor::GetPet(*this, pet_guid);
8792
8793 if (!pet)
8794 return nullptr;
8795
8796 if (IsInWorld())
8797 return pet;
8798
8799 //there may be a guardian in slot
8800 //LOG_ERROR("entities.player", "Player::GetPet: Pet {} not exist.", pet_guid.ToString());
8801 //const_cast<Player*>(this)->SetPetGUID(0);
8802 }
8803
8804 return nullptr;
8805}
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:220

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(), 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(), 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
1180{ return m_petStable.get(); }

References m_petStable.

◆ GetPhaseMaskForSpawn()

uint32 Player::GetPhaseMaskForSpawn ( ) const
13653{
13655
13656 if (!phase)
13658
13659 // some aura phases include 1 normal map in addition to phase itself
13660 uint32 n_phase = phase & ~PHASEMASK_NORMAL;
13661 if (n_phase > 0)
13662 return n_phase;
13663
13664 return phase;
13665}
@ PHASEMASK_NORMAL
Definition: Object.h:56
phase
Definition: boss_skadi.cpp:102
uint32 GetPhaseMask() const
Definition: Object.h:434
uint32 GetPhaseByAuras() const
Definition: Unit.cpp:19206

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:474

References Object::GetUInt32Value(), and PLAYER_FLAGS.

Referenced by _SaveCharacter().

◆ GetPlayerName()

std::string Player::GetPlayerName ( )
16178{
16179 std::string name = GetName();
16180 std::string color = "";
16181
16182 switch (getClass())
16183 {
16184 case CLASS_DEATH_KNIGHT: color = "|cffC41F3B"; break;
16185 case CLASS_DRUID: color = "|cffFF7D0A"; break;
16186 case CLASS_HUNTER: color = "|cffABD473"; break;
16187 case CLASS_MAGE: color = "|cff69CCF0"; break;
16188 case CLASS_PALADIN: color = "|cffF58CBA"; break;
16189 case CLASS_PRIEST: color = "|cffFFFFFF"; break;
16190 case CLASS_ROGUE: color = "|cffFFF569"; break;
16191 case CLASS_SHAMAN: color = "|cff0070DE"; break;
16192 case CLASS_WARLOCK: color = "|cff9482C9"; break;
16193 case CLASS_WARRIOR: color = "|cffC79C6E"; break;
16194 }
16195
16196 return "|Hplayer:" + name + "|h" + color + name + "|h|r";
16197}
@ CLASS_PRIEST
Definition: SharedDefines.h:117

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(), and player_settings_commandscript::HandleSettingsAnnouncerFlags().

◆ GetPureMaxSkillValue()

uint16 Player::GetPureMaxSkillValue ( uint32  skill) const
5390{
5391 if (!skill)
5392 return 0;
5393
5394 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5395 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5396 return 0;
5397
5398 int32 result = int32(SKILL_MAX(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5399
5400 sScriptMgr->OnGetMaxSkillValue(const_cast<Player*>(this), skill, result, true);
5401
5402 return result < 0 ? 0 : result;
5403}

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)
1580{
1583
1584 sScriptMgr->GetDialogStatus(this, questgiver);
1585
1586 switch (questgiver->GetTypeId())
1587 {
1588 case TYPEID_GAMEOBJECT:
1589 {
1590 QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToGameObject()));
1591 if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
1592 return questStatus;
1593 qr = sObjectMgr->GetGOQuestRelationBounds(questgiver->GetEntry());
1594 qir = sObjectMgr->GetGOQuestInvolvedRelationBounds(questgiver->GetEntry());
1595 break;
1596 }
1597 case TYPEID_UNIT:
1598 {
1599 QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToCreature()));
1600 if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
1601 return questStatus;
1602 qr = sObjectMgr->GetCreatureQuestRelationBounds(questgiver->GetEntry());
1603 qir = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(questgiver->GetEntry());
1604 break;
1605 }
1606 default:
1607 // it's impossible, but check
1608 //LOG_ERROR("entities.player.quest", "GetQuestDialogStatus called for unexpected type {}", questgiver->GetTypeId());
1609 return DIALOG_STATUS_NONE;
1610 }
1611
1613
1614 for (QuestRelations::const_iterator i = qir.first; i != qir.second; ++i)
1615 {
1617 uint32 questId = i->second;
1618 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1619 if (!quest)
1620 continue;
1621
1622 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId());
1623 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1624 continue;
1625
1626 QuestStatus status = GetQuestStatus(questId);
1627 if (status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus(questId))
1628 {
1629 result2 = DIALOG_STATUS_REWARD;
1630 }
1631 else if (status == QUEST_STATUS_INCOMPLETE)
1632 {
1633 result2 = DIALOG_STATUS_INCOMPLETE;
1634 }
1635
1636 if (quest->IsAutoComplete() && CanTakeQuest(quest, false) && quest->IsRepeatable() && !quest->IsDailyOrWeekly())
1637 {
1638 result2 = DIALOG_STATUS_REWARD_REP;
1639 }
1640
1641 if (result2 > result)
1642 {
1643 result = result2;
1644 }
1645 }
1646
1647 for (QuestRelations::const_iterator i = qr.first; i != qr.second; ++i)
1648 {
1650 uint32 questId = i->second;
1651 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1652 if (!quest)
1653 continue;
1654
1655 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId());
1656 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1657 continue;
1658
1659 QuestStatus status = GetQuestStatus(questId);
1660 if (status == QUEST_STATUS_NONE)
1661 {
1662 if (CanSeeStartQuest(quest))
1663 {
1664 if (SatisfyQuestLevel(quest, false))
1665 {
1666 bool isNotLowLevelQuest = GetLevel() <= (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF));
1667
1668 if (quest->IsRepeatable())
1669 {
1670 if (quest->IsDaily())
1671 {
1672 if (isNotLowLevelQuest)
1673 {
1675 }
1676 else
1677 {
1679 }
1680 }
1681 else if (quest->IsWeekly() || quest->IsMonthly())
1682 {
1683 if (isNotLowLevelQuest)
1684 {
1685 result2 = DIALOG_STATUS_AVAILABLE;
1686 }
1687 else
1688 {
1690 }
1691 }
1692 else if (quest->IsAutoComplete())
1693 {
1694 if (isNotLowLevelQuest)
1695 {
1696 result2 = DIALOG_STATUS_REWARD_REP;
1697 }
1698 else
1699 {
1701 }
1702 }
1703 else
1704 {
1705 if (isNotLowLevelQuest)
1706 {
1707 result2 = DIALOG_STATUS_REWARD_REP;
1708 }
1709 else
1710 {
1712 }
1713 }
1714 }
1715 else
1716 {
1717 result2 = isNotLowLevelQuest ? DIALOG_STATUS_AVAILABLE : DIALOG_STATUS_LOW_LEVEL_AVAILABLE;
1718 }
1719 }
1720 else
1721 {
1722 result2 = DIALOG_STATUS_UNAVAILABLE;
1723 }
1724 }
1725 }
1726
1727 if (result2 > result)
1728 result = result2;
1729 }
1730
1731 return result;
1732}
@ CONDITION_SOURCE_TYPE_QUEST_AVAILABLE
Definition: ConditionMgr.h:141
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
@ CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF
Definition: IWorld.h:285
int32 GetQuestLevel(Quest const *quest) const
Definition: Player.h:1391
bool CanSeeStartQuest(Quest const *quest)
Definition: PlayerQuest.cpp:236
uint32 GetQuestId() const
Definition: QuestDef.h:225
bool IsDaily() const
Definition: QuestDef.h:284
bool IsWeekly() const
Definition: QuestDef.h:285
bool IsDailyOrWeekly() const
Definition: QuestDef.h:288
bool IsMonthly() const
Definition: QuestDef.h:286

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)
16129{
16130 float result = isDFQuest ? sWorld->getRate(RATE_XP_QUEST_DF) : sWorld->getRate(RATE_XP_QUEST);
16131
16132 sScriptMgr->OnGetQuestRate(this, result);
16133
16134 return result;
16135}
@ RATE_XP_QUEST_DF
Definition: IWorld.h:466
@ RATE_XP_QUEST
Definition: IWorld.h:465

References RATE_XP_QUEST, RATE_XP_QUEST_DF, sScriptMgr, and sWorld.

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

◆ GetQuestRewardStatus()

◆ GetQuestSlotCounter()

uint16 Player::GetQuestSlotCounter ( uint16  slot,
uint8  counter 
) const
inline
1451{ 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:625
#define MAX_QUEST_OFFSET
Definition: Player.h:629

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
1415{
1416 if (quest_id)
1417 {
1418 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
1419
1420 if (itr != m_QuestStatus.end())
1421 {
1422 return itr->second.Status;
1423 }
1424
1425 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id))
1426 {
1427 if (qInfo->IsSeasonal())
1428 {
1430 }
1431
1432 if (!qInfo->IsRepeatable() && IsQuestRewarded(quest_id))
1433 {
1434 return QUEST_STATUS_REWARDED;
1435 }
1436 }
1437 }
1438
1439 return QUEST_STATUS_NONE;
1440}
@ 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(), npc_greatfather_aldrimus::npc_greatfather_aldrimusAI::CanBeSeen(), 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::spell_sindragosa_frost_breath_SpellScript::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::boss_alarAI::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(), npc_professor_dabiri::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_raliq_the_drunk::OnGossipHello(), npc_salsalabim::OnGossipHello(), npc_floon::OnGossipHello(), npc_cooshcoosh::OnGossipHello(), npc_elder_kuruti::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_panther_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(), AreaTrigger_at_sholazar_waygate::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_injured_patient::npc_injured_patientAI::SpellHit(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), 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(), npc_enslaved_netherwing_drake::npc_enslaved_netherwing_drakeAI::UpdateAI(), and GameObject::Use().

◆ getQuestStatusMap()

◆ GetQuestStatusSaveMap()

QuestStatusSaveMap & Player::GetQuestStatusSaveMap ( )
inline
1586{ 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
5085{
5086 uint8 level = GetLevel();
5087
5088 if (level > GT_MAX_LEVEL)
5089 level = GT_MAX_LEVEL;
5090
5091 GtCombatRatingsEntry const* Rating = sGtCombatRatingsStore.LookupEntry(cr * GT_MAX_LEVEL + level - 1);
5092 // gtOCTClassCombatRatingScalarStore.dbc starts with 1, CombatRating with zero, so cr+1
5093 GtOCTClassCombatRatingScalarEntry const* classRating = sGtOCTClassCombatRatingScalarStore.LookupEntry((getClass() - 1) * GT_MAX_RATING + cr + 1);
5094 if (!Rating || !classRating)
5095 return 1.0f; // By default use minimum coefficient (not must be called)
5096
5097 return classRating->ratio / Rating->ratio;
5098}
DBCStorage< GtCombatRatingsEntry > sGtCombatRatingsStore(GtCombatRatingsfmt)
DBCStorage< GtOCTClassCombatRatingScalarEntry > sGtOCTClassCombatRatingScalarStore(GtOCTClassCombatRatingScalarfmt)
#define GT_MAX_RATING
Definition: DBCStructure.h:1030
Definition: DBCStructure.h:1038
float ratio
Definition: DBCStructure.h:1039
Definition: DBCStructure.h:1068
float ratio
Definition: DBCStructure.h:1069

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
2555{ return m_realDodge; }

References m_realDodge.

Referenced by Unit::GetUnitDodgeChance().

◆ GetRealParry()

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

References m_realParry.

◆ GetReputation()

uint32 Player::GetReputation ( uint32  factionentry) const
15221{
15222 return GetReputationMgr().GetReputation(sFactionStore.LookupEntry(factionentry));
15223}
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
2077{ return *m_reputationMgr; }

References m_reputationMgr.

◆ GetReputationPriceDiscount() [1/2]

◆ GetReputationPriceDiscount() [2/2]

float Player::GetReputationPriceDiscount ( FactionTemplateEntry const *  factionTemplate) const
12243{
12244 if (!factionTemplate || !factionTemplate->faction)
12245 {
12246 return 1.0f;
12247 }
12248
12249 ReputationRank rank = GetReputationRank(factionTemplate->faction);
12250 if (rank <= REP_NEUTRAL)
12251 {
12252 return 1.0f;
12253 }
12254
12255 return 1.0f - 0.05f * (rank - REP_NEUTRAL);
12256}
ReputationRank
Definition: SharedDefines.h:151
@ REP_NEUTRAL
Definition: SharedDefines.h:155

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

◆ GetReputationRank()

◆ GetReqKillOrCastCurrentCount()

uint16 Player::GetReqKillOrCastCurrentCount ( uint32  quest_id,
int32  entry 
)
1736{
1737 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
1738 if (!qInfo)
1739 return 0;
1740
1741 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
1742 if (qInfo->RequiredNpcOrGo[j] == entry)
1743 return m_QuestStatus[quest_id].CreatureOrGOCount[j];
1744
1745 return 0;
1746}

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
1170{ return _restBonus; }

References _restBonus.

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

◆ GetResurrectionSpellId()

uint32 Player::GetResurrectionSpellId ( )
12506{
12507 // search priceless resurrection possibilities
12508 uint32 prio = 0;
12509 uint32 spell_id = 0;
12511 for (AuraEffectList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
12512 {
12513 // Soulstone Resurrection // prio: 3 (max, non death persistent)
12514 if (prio < 2 && (*itr)->GetSpellInfo()->SpellVisual[0] == 99 && (*itr)->GetSpellInfo()->SpellIconID == 92)
12515 {
12516 switch ((*itr)->GetId())
12517 {
12518 case 20707:
12519 spell_id = 3026;
12520 break; // rank 1
12521 case 20762:
12522 spell_id = 20758;
12523 break; // rank 2
12524 case 20763:
12525 spell_id = 20759;
12526 break; // rank 3
12527 case 20764:
12528 spell_id = 20760;
12529 break; // rank 4
12530 case 20765:
12531 spell_id = 20761;
12532 break; // rank 5
12533 case 27239:
12534 spell_id = 27240;
12535 break; // rank 6
12536 case 47883:
12537 spell_id = 47882;
12538 break; // rank 7
12539 default:
12540 LOG_ERROR("entities.player", "Unhandled spell {}: S.Resurrection", (*itr)->GetId());
12541 continue;
12542 }
12543
12544 prio = 3;
12545 }
12546 // Twisting Nether // prio: 2 (max)
12547 else if ((*itr)->GetId() == 23701 && roll_chance_i(10))
12548 {
12549 prio = 2;
12550 spell_id = 23700;
12551 }
12552 }
12553
12554 // Reincarnation (passive spell) // prio: 1 // Glyph of Renewed Life
12555 if (prio < 1 && HasSpell(20608) && !HasSpellCooldown(21169) && (HasAura(58059) || HasItemCount(17030)))
12556 spell_id = 21169;
12557
12558 return spell_id;
12559}
bool roll_chance_i(int chance)
Definition: Random.h:59
@ SPELL_AURA_DUMMY
Definition: SpellAuraDefines.h:67

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

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

◆ GetRewardedQuestCount()

size_t Player::GetRewardedQuestCount ( ) const
inline
1588{ 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 
)
13261{
13262 uint8 rune = GetBaseRune(index);
13263 uint32 cooldown = RUNE_BASE_COOLDOWN;
13264 if (!skipGrace)
13265 cooldown -= GetGracePeriod(index) < 250 ? 0 : GetGracePeriod(index) - 250; // xinef: reduce by grace period, treat first 250ms as instant use of rune
13266
13268 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
13269 {
13270 if ((*i)->GetMiscValue() == POWER_RUNE && (*i)->GetMiscValueB() == rune)
13271 cooldown = cooldown * (100 - (*i)->GetAmount()) / 100;
13272 }
13273
13274 return cooldown;
13275}
@ RUNE_BASE_COOLDOWN
Definition: Player.h:403
@ SPELL_AURA_MOD_POWER_REGEN_PERCENT
Definition: SpellAuraDefines.h:173
uint32 GetGracePeriod(uint8 index) const
Definition: Player.h:2459
RuneType GetBaseRune(uint8 index) const
Definition: Player.h:2456

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
2455{ return m_runes->runeState; }
uint8 runeState
Definition: Player.h:429

References m_runes, and Runes::runeState.

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

◆ getRuneWeaponGUID()

ObjectGuid Player::getRuneWeaponGUID ( )
inline
2540{ return m_drwGUID; };
ObjectGuid m_drwGUID
Definition: Player.h:2541

References m_drwGUID.

◆ GetSaveTimer()

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

References m_nextSave.

Referenced by misc_commandscript::HandleSaveCommand().

◆ GetSelectedPlayer()

Player * Player::GetSelectedPlayer ( ) const
11442{
11443 if (ObjectGuid selectionGUID = GetGuidValue(UNIT_FIELD_TARGET))
11444 return ObjectAccessor::GetPlayer(*this, selectionGUID);
11445
11446 return nullptr;
11447}
@ UNIT_FIELD_TARGET
Definition: UpdateFields.h:92
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:225

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

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

◆ GetSelectedUnit()

◆ GetSemaphoreTeleportFar()

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

References mSemaphoreTeleport_Far.

◆ GetSemaphoreTeleportNear()

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

References mSemaphoreTeleport_Near.

◆ GetSession()

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

References m_session.

Referenced by _addSpell(), _LoadHomeBind(), _LoadInventory(), Pet::_LoadSpellCooldowns(), _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(), Unit::BuildValuesUpdate(), BuyItemFromVendorSlot(), WorldSession::CanOpenMailBox(), CanSpeak(), CharacterActionIpLogger::CharacterIPLogAction(), CharmSpellInitialize(), Spell::CheckCast(), CheckDuelDistance(), Spell::CheckEffectTarget(), AchievementMgr::CompletedAchievement(), ContinueTaxiFlight(), ConvertRune(), Create(), Guild::Create(), ArenaTeam::DelMember(), Object::DestroyForPlayer(), Group::Disband(), DuelComplete(), DurabilityRepair(), Spell::EffectApplyGlyph(), Spell::EffectDiscoverTaxi(), Spell::EffectDuel(), Spell::EffectPlaySound(), Spell::EffectSummonPlayer(), Spell::EffectSummonRaFFriend(), EquipItem(), AuctionListItemsDelayEvent::Execute(), BGQueueInviteEvent::Execute(), SendEncounterUnit::Execute(), lfg::LFGMgr::FinishDungeon(), Channel::FlagsNotify(), GetAurasForTarget(), ChannelMgr::GetChannel(), SocialMgr::GetFriendInfo(), getMaxTimer(), GetsRecruitAFriendBonus(), GiveLevel(), 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(), 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::HandlePushQuestToParty(), WorldSession::HandleRaidReadyCheckOpcode(), reset_commandscript::HandleResetSpellsCommand(), reset_commandscript::HandleResetTalentsCommand(), spell_pvp_trinket_wotf_shared_cd::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::LeaveChannel(), Channel::LeaveNotify(), Channel::List(), LoadFromDB(), Pet::LoadPetFromDB(), GameObject::ModifyHealth(), ModifySpellCooldown(), 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_mortog_steamhead::OnGossipSelect(), npc_timothy_daniels::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(), InstanceMap::PermBindAllPlayers(), PetSpellInitialize(), Player(), Battlefield::PlayerAcceptInviteToQueue(), Battlefield::PlayerAcceptInviteToWar(), Battleground::PlayerAddedToBGCheckIfBGIsRunning(), InstanceSaveMgr::PlayerBindToInstance(), MapMgr::PlayerCannotEnter(), InstanceSaveMgr::PlayerUnbindInstance(), InstanceSaveMgr::PlayerUnbindInstanceNotExtended(), PossessSpellInitialize(), 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(), SendInitialPacketsAfterAddToMap(), SendInitialPacketsBeforeAddToMap(), SendInitialSpells(), Map::SendInitSelf(), 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(), SendMessageToSetInRange(), SendMessageToSetInRange_OwnTeam(), 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(), TradeData::SetAccepted(), SetBindPoint(), SetClientControl(), Item::SetEnchantment(), SetEquipmentSet(), SetGameMaster(), SetGMVisible(), Channel::SetMode(), TradeData::SetMoney(), SetMovement(), Channel::SetOwner(), SetRestBonus(), Unit::SetStandState(), Guild::Member::SetStats(), SetTitle(), 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
555{
556 Item* item = nullptr;
557 if (useable)
559 else
561 if (!item || item->GetTemplate()->Class != ITEM_CLASS_ARMOR)
562 return nullptr;
563
564 if (!useable)
565 return item;
566
567 if (item->IsBroken())
568 return nullptr;
569
570 return item;
571}
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition: Player.h:1220

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

◆ GetShieldBlockValue()

uint32 Player::GetShieldBlockValue ( ) const
overridevirtual

Implements Unit.

4989{
4991
4992 value = (value < 0) ? 0 : value;
4993
4994 return uint32(value);
4995}

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.

16167{
16168 float sightRange = WorldObject::GetSightRange(target);
16170 {
16171 sightRange += *_farSightDistance;
16172 }
16173
16174 return sightRange;
16175}
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
5432{
5433 if (!skill)
5434 return 0;
5435
5436 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5437 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5438 return 0;
5439
5441}

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
5343{
5344 if (!skill)
5345 return 0;
5346
5347 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5348 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5349 return 0;
5350
5351 return PAIR32_HIPART(GetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos)));
5352}
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
5444{
5445 if (!skill)
5446 return 0;
5447
5448 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5449 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5450 return 0;
5451
5453}

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)
15893{
15894 uint32 mostTalentTabId = 0;
15895 uint32 mostTalentCount = 0;
15896 uint32 specIdx = 0;
15897
15898 if (m_specsCount) // not all instances of Player have a spec for some reason
15899 {
15900 if (spec < 0)
15901 specIdx = m_activeSpec;
15902 else
15903 specIdx = spec;
15904 // find class talent tabs (all players have 3 talent tabs)
15905 uint32 const* talentTabIds = GetTalentTabPages(getClass());
15906
15907 for (uint8 i = 0; i < MAX_TALENT_TABS; ++i)
15908 {
15909 uint32 talentCount = 0;
15910 uint32 talentTabId = talentTabIds[i];
15911 for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
15912 {
15913 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
15914 if (!talentInfo)
15915 continue;
15916
15917 // skip another tab talents
15918 if (talentInfo->TalentTab != talentTabId)
15919 continue;
15920
15921 // find max talent rank (0~4)
15922 int8 curtalent_maxrank = -1;
15923 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
15924 {
15925 if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], specIdx))
15926 {
15927 curtalent_maxrank = rank;
15928 break;
15929 }
15930 }
15931
15932 // not learned talent
15933 if (curtalent_maxrank < 0)
15934 continue;
15935
15936 talentCount += curtalent_maxrank + 1;
15937 }
15938
15939 if (mostTalentCount < talentCount)
15940 {
15941 mostTalentCount = talentCount;
15942 mostTalentTabId = talentTabId;
15943 }
15944 }
15945 }
15946 return mostTalentTabId;
15947}
uint32 const * GetTalentTabPages(uint8 cls)
Definition: DBCStores.cpp:817
#define MAX_TALENT_TABS
Definition: DBCStructure.h:1896

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
16227{
16228 SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
16229 return uint32(itr != m_spellCooldowns.end() && itr->second.end > getMSTime() ? itr->second.end - getMSTime() : 0);
16230}
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
1730{ return m_spellCooldowns; }

References m_spellCooldowns.

◆ GetSpellCooldownMap() [2/2]

◆ GetSpellCooldowns()

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

References m_spellCooldowns.

Referenced by Unit::HandleDummyAuraProc().

◆ GetSpellCritFromIntellect()

float Player::GetSpellCritFromIntellect ( )
5068{
5069 uint8 level = GetLevel();
5070 uint32 pclass = getClass();
5071
5072 if (level > GT_MAX_LEVEL)
5073 level = GT_MAX_LEVEL;
5074
5075 GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.LookupEntry(pclass - 1);
5076 GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5077 if (!critBase || !critRatio)
5078 return 0.0f;
5079
5080 float crit = critBase->base + GetStat(STAT_INTELLECT) * critRatio->ratio;
5081 return crit * 100.0f;
5082}
DBCStorage< GtChanceToSpellCritBaseEntry > sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt)
DBCStorage< GtChanceToSpellCritEntry > sGtChanceToSpellCritStore(GtChanceToSpellCritfmt)
Definition: DBCStructure.h:1053
float base
Definition: DBCStructure.h:1054
Definition: DBCStructure.h:1063
float ratio
Definition: DBCStructure.h:1064

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
1727{ return m_spells; }

References m_spells.

◆ GetSpellMap() [2/2]

◆ GetSpellModList()

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

References m_spellMods.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld().

◆ GetSpellPenetrationItemMod()

int32 Player::GetSpellPenetrationItemMod ( ) const
inline

◆ GetsRecruitAFriendBonus()

bool Player::GetsRecruitAFriendBonus ( bool  forXP)
12582{
12583 bool recruitAFriend = false;
12584 if (GetLevel() <= sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL) || !forXP)
12585 {
12586 if (Group* group = this->GetGroup())
12587 {
12588 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12589 {
12590 Player* player = itr->GetSource();
12591 if (!player || !player->IsInMap(this))
12592 continue;
12593
12594 if (!player->IsAtRecruitAFriendDistance(this))
12595 continue; // member (alive or dead) or his corpse at req. distance
12596
12597 if (forXP)
12598 {
12599 // level must be allowed to get RaF bonus
12600 if (player->GetLevel() > sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
12601 continue;
12602
12603 // level difference must be small enough to get RaF bonus, UNLESS we are lower level
12604 if (player->GetLevel() < GetLevel())
12606 continue;
12607 }
12608
12609 bool ARecruitedB = (player->GetSession()->GetRecruiterId() == GetSession()->GetAccountId());
12610 bool BRecruitedA = (GetSession()->GetRecruiterId() == player->GetSession()->GetAccountId());
12611 if (ARecruitedB || BRecruitedA)
12612 {
12613 recruitAFriend = true;
12614 break;
12615 }
12616 }
12617 }
12618 }
12619 return recruitAFriend;
12620}
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL
Definition: IWorld.h:245
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE
Definition: IWorld.h:246
bool IsInMap(WorldObject const *obj) const
Definition: Object.cpp:1285
bool IsAtRecruitAFriendDistance(WorldObject const *pOther) const
Definition: Player.cpp:12691
uint32 GetRecruiterId() const
Definition: WorldSession.h:524
uint32 GetAccountId() const
Definition: WorldSession.h:360

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
11298{
11299 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
11300 uint32 mapId = info->mapId;
11301 if (getClass() == CLASS_DEATH_KNIGHT && HasSpell(50977))
11302 return WorldLocation(0, 2352.0f, -5709.0f, 154.5f, 0.0f);
11303 return WorldLocation(mapId, info->positionX, info->positionY, info->positionZ, 0);
11304}

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

Referenced by misc_commandscript::HandleUnstuckCommand().

◆ GetStoredRaidDifficulty()

Difficulty Player::GetStoredRaidDifficulty ( ) const
inline
1873{ 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
1083{ return m_summon_expire; }

References m_summon_expire.

Referenced by Spell::CheckCast().

◆ GetTalentMap()

◆ GetTalentTreePoints()

void Player::GetTalentTreePoints ( uint8(&)  specPoints[3]) const
15164{
15165 const PlayerTalentMap& talentMap = GetTalentMap();
15166 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
15167 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec()))
15168 if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID))
15169 if (TalentTabEntry const* tab = sTalentTabStore.LookupEntry(talentInfo->TalentTab))
15170 if (tab->tabpage < 3)
15171 {
15172 // find current talent rank
15173 uint8 currentTalentRank = 0;
15174 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
15175 if (talentInfo->RankID[rank] && itr->first == talentInfo->RankID[rank])
15176 {
15177 currentTalentRank = rank + 1;
15178 break;
15179 }
15180 specPoints[tab->tabpage] += currentTalentRank;
15181 }
15182}

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
2059{ return original ? TeamIdForRace(getRace(true)) : m_team; };
static TeamId TeamIdForRace(uint8 race)
Definition: Player.cpp:5731

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::spell_wintergrasp_portal_SpellScript::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(), 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_chesspiece::sGossipHello(), npc_midsummer_torch_target::SpellHit(), BattlegroundSA::TeleportToEntrancePosition(), OPvPCapturePoint::Update(), UpdateArea(), UpdateLocalChannels(), UpdateZone(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ GetTeleportDest()

◆ GetTemporaryUnsummonedPetNumber()

uint32 Player::GetTemporaryUnsummonedPetNumber ( ) const
inline

◆ GetTotalBaseModValue()

float Player::GetTotalBaseModValue ( BaseModGroup  modGroup) const
4975{
4976 if (modGroup >= BASEMOD_END)
4977 {
4978 LOG_ERROR("entities.player", "wrong BaseModGroup in GetTotalBaseModValue()!");
4979 return 0.0f;
4980 }
4981
4982 if (m_auraBaseMod[modGroup][PCT_MOD] <= 0.0f)
4983 return 0.0f;
4984
4985 return m_auraBaseMod[modGroup][FLAT_MOD] * m_auraBaseMod[modGroup][PCT_MOD];
4986}

References BASEMOD_END, FLAT_MOD, LOG_ERROR, m_auraBaseMod, and PCT_MOD.

◆ GetTotalPercentageModValue()

float Player::GetTotalPercentageModValue ( BaseModGroup  modGroup) const
inline
2145{ 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
1343{ 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
3837{
3838 if (!trainer_spell)
3839 return TRAINER_SPELL_RED;
3840
3841 bool hasSpell = true;
3842 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3843 {
3844 if (!trainer_spell->learnedSpell[i])
3845 continue;
3846
3847 if (!HasSpell(trainer_spell->learnedSpell[i]))
3848 {
3849 hasSpell = false;
3850 break;
3851 }
3852 }
3853 // known spell
3854 if (hasSpell)
3855 return TRAINER_SPELL_GRAY;
3856
3857 // check skill requirement
3858 if (trainer_spell->reqSkill && GetBaseSkillValue(trainer_spell->reqSkill) < trainer_spell->reqSkillValue)
3859 return TRAINER_SPELL_RED;
3860
3861 // check level requirement
3862 if (GetLevel() < trainer_spell->reqLevel)
3863 return TRAINER_SPELL_RED;
3864
3865 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3866 {
3867 if (!trainer_spell->learnedSpell[i])
3868 continue;
3869
3870 // check race/class requirement
3871 if (!IsSpellFitByClassAndRace(trainer_spell->learnedSpell[i]))
3872 return TRAINER_SPELL_RED;
3873
3874 if (uint32 prevSpell = sSpellMgr->GetPrevSpellInChain(trainer_spell->learnedSpell[i]))
3875 {
3876 // check prev.rank requirement
3877 if (prevSpell && !HasSpell(prevSpell))
3878 return TRAINER_SPELL_RED;
3879 }
3880
3881 SpellsRequiringSpellMapBounds spellsRequired = sSpellMgr->GetSpellsRequiredForSpellBounds(trainer_spell->learnedSpell[i]);
3882 for (SpellsRequiringSpellMap::const_iterator itr = spellsRequired.first; itr != spellsRequired.second; ++itr)
3883 {
3884 // check additional spell requirement
3885 if (!HasSpell(itr->second))
3886 return TRAINER_SPELL_RED;
3887 }
3888 }
3889
3890 // check primary prof. limit
3891 // first rank of primary profession spell when there are no proffesions avalible is disabled
3892 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3893 {
3894 if (!trainer_spell->learnedSpell[i])
3895 continue;
3896 SpellInfo const* learnedSpellInfo = sSpellMgr->GetSpellInfo(trainer_spell->learnedSpell[i]);
3897 if (learnedSpellInfo && learnedSpellInfo->IsPrimaryProfessionFirstRank() && (GetFreePrimaryProfessionPoints() == 0))
3899 }
3900
3901 return TRAINER_SPELL_GREEN;
3902}
@ TRAINER_SPELL_GREEN
Definition: Player.h:214
@ TRAINER_SPELL_GRAY
Definition: Player.h:216
@ TRAINER_SPELL_GREEN_DISABLED
Definition: Player.h:217
@ TRAINER_SPELL_RED
Definition: Player.h:215
std::pair< SpellsRequiringSpellMap::const_iterator, SpellsRequiringSpellMap::const_iterator > SpellsRequiringSpellMapBounds
Definition: SpellMgr.h:563
bool IsSpellFitByClassAndRace(uint32 spell_id) const
Definition: Player.cpp:12258

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
13106{
13108 return static_cast<WorldObject*>(ObjectAccessor::GetObjectByTypeMask(*this, guid, TYPEMASK_SEER));
13109 return nullptr;
13110}
@ TYPEMASK_SEER
Definition: ObjectGuid.h:56
Object * GetObjectByTypeMask(WorldObject const &, ObjectGuid const guid, uint32 typemask)
Definition: ObjectAccessor.cpp:146
Definition: Object.h:393

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
1328{ return m_WeaponProficiency; }

References m_WeaponProficiency.

Referenced by Spell::EffectProficiency().

◆ GetXPRestBonus()

uint32 Player::GetXPRestBonus ( uint32  xp)
8737{
8738 uint32 rested_bonus = (uint32)GetRestBonus(); // xp for each rested bonus
8739
8740 if (rested_bonus > xp) // max rested_bonus == xp or (r+x) = 200% xp
8741 rested_bonus = xp;
8742
8743 SetRestBonus(GetRestBonus() - rested_bonus);
8744
8745 LOG_DEBUG("entities.player", "Player gain {} xp (+ {} Rested Bonus). Rested points={}", xp + rested_bonus, rested_bonus, GetRestBonus());
8746 return rested_bonus;
8747}
void SetRestBonus(float rest_bonus_new)
Definition: Player.cpp:10097
float GetRestBonus() const
Definition: Player.h:1170

References GetRestBonus(), LOG_DEBUG, and SetRestBonus().

Referenced by GiveXP().

◆ GetZoneIdFromDB()

uint32 Player::GetZoneIdFromDB ( ObjectGuid  guid)
static
6217{
6218 ObjectGuid::LowType guidLow = guid.GetCounter();
6219
6221 stmt->SetData(0, guidLow);
6222 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6223
6224 if (!result)
6225 return 0;
6226
6227 Field* fields = result->Fetch();
6228 uint32 zone = fields[0].Get<uint16>();
6229
6230 if (!zone)
6231 {
6232 // stored zone is zero, use generic and slow zone detection
6233 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_POSITION_XYZ);
6234 stmt->SetData(0, guidLow);
6235 PreparedQueryResult posResult = CharacterDatabase.Query(stmt);
6236
6237 if (!posResult)
6238 {
6239 return 0;
6240 }
6241
6242 fields = posResult->Fetch();
6243 uint32 map = fields[0].Get<uint16>();
6244 float posx = fields[1].Get<float>();
6245 float posy = fields[2].Get<float>();
6246 float posz = fields[3].Get<float>();
6247
6248 if (!sMapStore.LookupEntry(map))
6249 return 0;
6250
6251 zone = sMapMgr->GetZoneId(PHASEMASK_NORMAL, map, posx, posy, posz);
6252
6253 if (zone > 0)
6254 {
6255 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ZONE);
6256
6257 stmt->SetData(0, uint16(zone));
6258 stmt->SetData(1, guidLow);
6259
6260 CharacterDatabase.Execute(stmt);
6261 }
6262 }
6263
6264 return zone;
6265}
@ 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
2419{
2420 uint8 oldLevel = GetLevel();
2421 if (level == oldLevel)
2422 return;
2423
2424 if (Guild* guild = GetGuild())
2425 guild->UpdateMemberData(this, GUILD_MEMBER_DATA_LEVEL, level);
2426
2427 PlayerLevelInfo info;
2428 sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), level, &info);
2429
2430 PlayerClassLevelInfo classInfo;
2431 sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, &classInfo);
2432
2434 packet.Level = level;
2435 packet.HealthDelta = int32(classInfo.basehealth) - int32(GetCreateHealth());
2436
2438 // for (int i = 0; i < MAX_POWERS; ++i)
2439 packet.PowerDelta[0] = int32(classInfo.basemana) - int32(GetCreateMana());
2440 packet.PowerDelta[1] = 0;
2441 packet.PowerDelta[2] = 0;
2442 packet.PowerDelta[3] = 0;
2443 packet.PowerDelta[4] = 0;
2444 packet.PowerDelta[5] = 0;
2445
2446 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2447 packet.StatDelta[i] = int32(info.stats[i]) - GetCreateStat(Stats(i));
2448
2449 SendDirectMessage(packet.Write());
2450
2451 SetUInt32Value(PLAYER_NEXT_LEVEL_XP, sObjectMgr->GetXPForLevel(level));
2452
2453 //update level, max level of skills
2454 m_Played_time[PLAYED_TIME_LEVEL] = 0; // Level Played Time reset
2455
2457
2458 SetLevel(level);
2459
2461
2462 // save base values (bonuses already included in stored stats
2463 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2464 SetCreateStat(Stats(i), info.stats[i]);
2465
2466 SetCreateHealth(classInfo.basehealth);
2467 SetCreateMana(classInfo.basemana);
2468
2472
2474
2475 if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL)) // Max weapon skill when leveling up
2477
2479
2480 // set current level health and mana/energy to maximum after applying all mods.
2481 SetFullHealth();
2488
2489 // update level to hunter/summon pet
2490 if (Pet* pet = GetPet())
2491 pet->SynchronizeLevelWithOwner();
2492
2493 MailLevelReward const* mailReward = sObjectMgr->GetMailLevelReward(level, getRaceMask());
2494 if (mailReward && sScriptMgr->CanGiveMailRewardAtGiveLevel(this, level))
2495 {
2496 //- TODO: Poor design of mail system
2497 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2498 MailDraft(mailReward->mailTemplateId).SendMailTo(trans, this, MailSender(MAIL_CREATURE, mailReward->senderEntry));
2499 CharacterDatabase.CommitTransaction(trans);
2500 }
2501
2503
2504 // Refer-A-Friend
2505 if (GetSession()->GetRecruiterId())
2506 if (level < sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
2507 if (level % 2 == 0)
2508 {
2510
2511 if (!HasByteFlag(PLAYER_FIELD_BYTES, 1, 0x01))
2513 }
2514
2516
2517 sScriptMgr->OnPlayerLevelChanged(this, oldLevel);
2518}
@ PLAYER_NEXT_LEVEL_XP
Definition: UpdateFields.h:340
@ GUILD_MEMBER_DATA_LEVEL
Definition: Guild.h:62
@ CONFIG_ALWAYS_MAXSKILL
Definition: IWorld.h:132
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL
Definition: DBCEnums.h:130
@ POWER_RAGE
Definition: SharedDefines.h:242
@ POWER_HAPPINESS
Definition: SharedDefines.h:245
@ POWER_ENERGY
Definition: SharedDefines.h:244
@ POWER_FOCUS
Definition: SharedDefines.h:243
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition: Object.cpp:949
Definition: Player.h:290
uint32 basehealth
Definition: Player.h:292
uint32 basemana
Definition: Player.h:293
Definition: Player.h:304
std::array< uint32, MAX_STATS > stats
Definition: Player.h:310
void _ApplyAllLevelScaleItemMods(bool apply)
Definition: Player.cpp:7495
void UpdateSkillsToMaxSkillsForLevel()
Definition: PlayerUpdates.cpp:1086
Guild * GetGuild() const
Definition: Player.cpp:15886
void UpdateSkillsForLevel()
Definition: PlayerUpdates.cpp:1035
void SendQuestGiverStatusMultiple()
Definition: Player.cpp:7572
void SetCreateStat(Stats stat, float val)
Definition: Unit.h:2037
void SetCreateHealth(uint32 val)
Definition: Unit.h:2038
void SetCreateMana(uint32 val)
Definition: Unit.h:2040
void SetLevel(uint8 lvl, bool showLevelChange=true)
Definition: Unit.cpp:15352
uint32 GetCreateHealth() const
Definition: Unit.h:2039
uint32 GetCreateMana() const
Definition: Unit.h:2041
Definition: ObjectMgr.h:537
uint32 senderEntry
Definition: ObjectMgr.h:543
uint32 mailTemplateId
Definition: ObjectMgr.h:542
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(), Object::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)
1333{
1334 uint32 srcitem = quest->GetSrcItemId();
1335 if (srcitem > 0)
1336 {
1337 uint32 count = quest->GetSrcItemCount();
1338 if (count <= 0)
1339 count = 1;
1340
1341 ItemPosCountVec dest;
1342 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count);
1343 if (msg == EQUIP_ERR_OK)
1344 {
1345 Item* item = StoreNewItem(dest, srcitem, true);
1346 SendNewItem(item, count, true, false);
1347 return true;
1348 }
1349 // player already have max amount required item, just report success
1350 else if (msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS)
1351 return true;
1352 else
1353 SendEquipError(msg, nullptr, nullptr, srcitem);
1354 return false;
1355 }
1356
1357 return true;
1358}

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 
)
2342{
2343 if (xp < 1)
2344 {
2345 return;
2346 }
2347
2348 if (!IsAlive() && !GetBattlegroundId() && !isLFGReward)
2349 {
2350 return;
2351 }
2352
2354 {
2355 return;
2356 }
2357
2358 if (victim && victim->GetTypeId() == TYPEID_UNIT && !victim->ToCreature()->hasLootRecipient())
2359 {
2360 return;
2361 }
2362
2363 uint8 level = GetLevel();
2364
2365 sScriptMgr->OnGivePlayerXP(this, xp, victim);
2366
2367 // Favored experience increase START
2368 uint32 zone = GetZoneId();
2369 float favored_exp_mult = 0;
2370 if ((zone == 3483 || zone == 3562 || zone == 3836 || zone == 3713 || zone == 3714) && (HasAura(32096) || HasAura(32098)))
2371 favored_exp_mult = 0.05f; // Thrallmar's Favor and Honor Hold's Favor
2372
2373 xp = uint32(xp * (1 + favored_exp_mult));
2374 // Favored experience increase END
2375
2376 // XP to money conversion processed in Player::RewardQuest
2377 if (level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2378 return;
2379
2380 uint32 bonus_xp = 0;
2381 bool recruitAFriend = GetsRecruitAFriendBonus(true);
2382
2383 // RaF does NOT stack with rested experience
2384 if (recruitAFriend)
2385 bonus_xp = 2 * xp; // xp + bonus_xp must add up to 3 * xp for RaF; calculation for quests done client-side
2386 else
2387 bonus_xp = victim ? GetXPRestBonus(xp) : 0; // XP resting bonus
2388
2389 // hooks and multipliers can modify the xp with a zero or negative value
2390 // check again before sending invalid xp to the client
2391 if (xp < 1)
2392 {
2393 return;
2394 }
2395
2396 SendLogXPGain(xp, victim, bonus_xp, recruitAFriend, group_rate);
2397
2400 uint32 newXP = curXP + xp + bonus_xp;
2401
2402 while (newXP >= nextLvlXP && level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2403 {
2404 newXP -= nextLvlXP;
2405
2406 if (level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2407 GiveLevel(level + 1);
2408
2409 level = GetLevel();
2411 }
2412
2413 SetUInt32Value(PLAYER_XP, newXP);
2414}
@ PLAYER_FLAGS_NO_XP_GAIN
Definition: Player.h:500
bool hasLootRecipient() const
Definition: Creature.h:223
void GiveLevel(uint8 level)
Definition: Player.cpp:2418
uint32 GetXPRestBonus(uint32 xp)
Definition: Player.cpp:8736
void SendLogXPGain(uint32 GivenXP, Unit *victim, uint32 BonusXP, bool recruitAFriend=false, float group_rate=1.0f)
Definition: Player.cpp:2322

References CONFIG_MAX_PLAYER_LEVEL, GetBattlegroundId(), Unit::GetLevel(), GetsRecruitAFriendBonus(), Object::GetTypeId(), Object::GetUInt32Value(), GetXPRestBonus(), WorldObject::GetZoneId(), GiveLevel(), Unit::HasAura(), Creature::hasLootRecipient(), HasPlayerFlag(), Unit::IsAlive(), PLAYER_FLAGS_NO_XP_GAIN, PLAYER_NEXT_LEVEL_XP, PLAYER_XP, SendLogXPGain(), Object::SetUInt32Value(), sScriptMgr, sWorld, Object::ToCreature(), and TYPEID_UNIT.

Referenced by KillRewarder::_RewardXP(), CheckAreaExploreAndOutdoor(), RewardHonor(), and RewardQuest().

◆ GroupEventHappens()

void Player::GroupEventHappens ( uint32  questId,
WorldObject const *  pEventObject 
)
1803{
1804 if (Group* group = GetGroup())
1805 {
1806 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
1807 {
1808 Player* player = itr->GetSource();
1809
1810 // for any leave or dead (with not released body) group member at appropriate distance
1811 if (player && player->IsAtGroupRewardDistance(pEventObject) && !player->GetCorpse())
1812 player->AreaExploredOrEventHappens(questId);
1813 }
1814 }
1815 else
1817}
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition: Player.cpp:12655
void AreaExploredOrEventHappens(uint32 questId)
Definition: PlayerQuest.cpp:1775

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(), npc_isla_starmane::npc_isla_starmaneAI::WaypointReached(), and npc_kayra_longmane::npc_kayra_longmaneAI::WaypointReached().

◆ HandleBaseModValue()

void Player::HandleBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType,
float  amount,
bool  apply 
)
4921{
4922 if (modGroup >= BASEMOD_END)
4923 {
4924 LOG_ERROR("entities.player", "ERROR in HandleBaseModValue(): non existed BaseModGroup!");
4925 return;
4926 }
4927
4928 switch (modType)
4929 {
4930 case FLAT_MOD:
4931 m_auraBaseMod[modGroup][modType] += apply ? amount : -amount;
4932 break;
4933 case PCT_MOD:
4934 ApplyPercentModFloatVar(m_auraBaseMod[modGroup][modType], amount, apply);
4935 break;
4936 }
4937
4938 if (!CanModifyStats())
4939 return;
4940
4941 switch (modGroup)
4942 {
4943 case CRIT_PERCENTAGE:
4945 break;
4948 break;
4951 break;
4952 case SHIELD_BLOCK_VALUE:
4954 break;
4955 default:
4956 break;
4957 }
4958}
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition: Util.h:50
void UpdateShieldBlockValue()
Definition: StatSystem.cpp:529
void UpdateCritPercentage(WeaponAttackType attType)
Definition: StatSystem.cpp:648

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 {
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:828
@ DAMAGE_EXHAUSTED
Definition: Player.h:827
@ UNDERWATER_INDARKWATER
Definition: Player.h:105
@ UNDERWATER_EXIST_TIMERS
Definition: Player.h:107
@ UNDERWATER_INWATER
Definition: Player.h:102
@ UNDERWATER_INLAVA
Definition: Player.h:103
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:4821
int32 getMaxTimer(MirrorTimerType timer)
Definition: Player.cpp:807
void StopMirrorTimer(MirrorTimerType Type)
Definition: Player.cpp:742
LiquidTypeEntry const * _lastLiquid
Definition: Unit.h:2538
uint32 SpellId
Definition: DBCStructure.h:1272

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)
13731{
13732 // calculate total z distance of the fall
13733 float z_diff = m_lastFallZ - movementInfo.pos.GetPositionZ();
13734
13735 //Players with low fall distance, Feather Fall or physical immunity (charges used) are ignored
13736 // 14.57 can be calculated by resolving damageperc formula below to 0
13737 if (z_diff >= 14.57f && !isDead() && !IsGameMaster() && !GetCommandStatus(CHEAT_GOD) &&
13740 {
13741 //Safe fall, fall height reduction
13743
13744 float damageperc = 0.018f * (z_diff - safe_fall) - 0.2426f;
13745 uint32 original_health = GetHealth(), final_damage = 0;
13746
13748 {
13749 uint32 damage = (uint32)(damageperc * GetMaxHealth() * sWorld->getRate(RATE_DAMAGE_FALL));
13750
13751 //float height = movementInfo.pos.m_positionZ;
13752 //UpdateGroundPositionZ(movementInfo.pos.m_positionX, movementInfo.pos.m_positionY, height);
13753
13754 if (damage > 0)
13755 {
13756 //Prevent fall damage from being more than the player maximum health
13757 if (damage > GetMaxHealth())
13758 damage = GetMaxHealth();
13759
13760 // Gust of Wind
13761 if (HasAura(43621))
13762 damage = GetMaxHealth() / 2;
13763
13764 // Divine Protection
13765 if (HasAura(498))
13766 {
13767 damage /= 2;
13768 }
13769
13770 final_damage = EnvironmentalDamage(DAMAGE_FALL, damage);
13771 }
13772
13773 //Z given by moveinfo, LastZ, FallTime, WaterZ, MapZ, Damage, Safefall reduction
13774 LOG_DEBUG("entities.player", "FALLDAMAGE mZ={} z={} fallTime={} damage={} SF={}", movementInfo.pos.GetPositionZ(), GetPositionZ(), movementInfo.fallTime, damage, safe_fall);
13775 }
13776
13777 // recheck alive, might have died of EnvironmentalDamage, avoid cases when player die in fact like Spirit of Redemption case
13778 if (IsAlive() && final_damage < original_health)
13780 }
13781}
@ CHEAT_GOD
Definition: Player.h:991
@ SPELL_AURA_FLY
Definition: SpellAuraDefines.h:264
@ SPELL_AURA_SAFE_FALL
Definition: SpellAuraDefines.h:207
@ RATE_DAMAGE_FALL
Definition: IWorld.h:494
@ ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING
Definition: DBCEnums.h:145
bool GetCommandStatus(uint32 command) const
Definition: Player.h:1154
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12812
bool isDead() const
Definition: Unit.h:1810

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 
)
3425{
3426 if (!checkAllSpells)
3428 else
3429 {
3430 SetHas310Flyer(false);
3431 SpellInfo const* spellInfo;
3432 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
3433 {
3434 // pussywizard:
3435 if (itr->second->State == PLAYERSPELL_REMOVED)
3436 continue;
3437
3438 if (itr->first == excludeSpellId)
3439 continue;
3440
3441 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(itr->first);
3442 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
3443 {
3444 if (_spell_idx->second->SkillLine != SKILL_MOUNTS)
3445 break; // We can break because mount spells belong only to one skillline (at least 310 flyers do)
3446
3447 spellInfo = sSpellMgr->AssertSpellInfo(itr->first);
3448 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3449 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&
3450 spellInfo->Effects[i].CalcValue() == 310)
3451 {
3452 SetHas310Flyer(true);
3453 return true;
3454 }
3455 }
3456 }
3457 }
3458
3459 return false;
3460}
@ PLAYER_EXTRA_HAS_310_FLYER
Definition: Player.h:591

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
13799{
13800 return m_achievementMgr->HasAchieved(achievementId);
13801}
bool HasAchieved(uint32 achievementId) const
Definition: AchievementMgr.cpp:2353

References AchievementMgr::HasAchieved(), and m_achievementMgr.

Referenced by _LoadBrewOfTheMonth(), spell_gen_on_tournament_mount::GetPennatSpellId(), BattlegroundIC::HandleAreaTrigger(), lfg::LFGMgr::InitializeLockedDungeons(), and Satisfy().

◆ HasActiveSpell()

bool Player::HasActiveSpell ( uint32  spell) const
3831{
3832 PlayerSpellMap::const_iterator itr = m_spells.find(spell);
3833 return (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->Active && itr->second->IsInSpec(m_activeSpec));
3834}

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 ( )
15991{
15992 switch (GetSpec(GetActiveSpec()))
15993 {
16006 return true;
16007 default:
16008 break;
16009 }
16010 return false;
16011}
@ TALENT_TREE_HUNTER_SURVIVAL
Definition: Player.h:154
@ TALENT_TREE_MAGE_FIRE
Definition: Player.h:168
@ TALENT_TREE_PRIEST_SHADOW
Definition: Player.h:160
@ TALENT_TREE_SHAMAN_ELEMENTAL
Definition: Player.h:164
@ TALENT_TREE_HUNTER_BEAST_MASTERY
Definition: Player.h:152
@ TALENT_TREE_WARLOCK_DEMONOLOGY
Definition: Player.h:171
@ TALENT_TREE_WARLOCK_DESTRUCTION
Definition: Player.h:172
@ TALENT_TREE_WARLOCK_AFFLICTION
Definition: Player.h:170
@ TALENT_TREE_MAGE_ARCANE
Definition: Player.h:167
@ TALENT_TREE_MAGE_FROST
Definition: Player.h:169
@ TALENT_TREE_DRUID_BALANCE
Definition: Player.h:173
@ TALENT_TREE_HUNTER_MARKSMANSHIP
Definition: Player.h:153
uint32 GetSpec(int8 spec=-1)
Definition: Player.cpp:15892

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
2881{ return m_bHasDelayedTeleport; }

References m_bHasDelayedTeleport.

Referenced by Update().

◆ HasEnoughMoney() [1/2]

bool Player::HasEnoughMoney ( int32  amount) const
inline
1571 {
1572 if (amount > 0)
1573 return (GetMoney() >= (uint32) amount);
1574 return true;
1575 }

References GetMoney().

◆ HasEnoughMoney() [2/2]

◆ HasFreeBattlegroundQueueId()

bool Player::HasFreeBattlegroundQueueId ( ) const

◆ HasHealSpec()

bool Player::HasHealSpec ( )
16014{
16015 switch (GetSpec(GetActiveSpec()))
16016 {
16022 return true;
16023 default:
16024 break;
16025 }
16026 return false;
16027}
@ TALENT_TREE_DRUID_RESTORATION
Definition: Player.h:175
@ TALENT_TREE_SHAMAN_RESTORATION
Definition: Player.h:166
@ TALENT_TREE_PRIEST_HOLY
Definition: Player.h:159
@ TALENT_TREE_PALADIN_HOLY
Definition: Player.h:149
@ TALENT_TREE_PRIEST_DISCIPLINE
Definition: Player.h:158

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
687{
688 uint32 tempcount = 0;
690 {
692 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
693 {
694 tempcount += pItem->GetCount();
695 if (tempcount >= count)
696 return true;
697 }
698 }
700 {
702 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
703 {
704 tempcount += pItem->GetCount();
705 if (tempcount >= count)
706 return true;
707 }
708 }
710 {
711 if (Bag* pBag = GetBagByPos(i))
712 {
713 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
714 {
715 Item* pItem = GetItemByPos(i, j);
716 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
717 {
718 tempcount += pItem->GetCount();
719 if (tempcount >= count)
720 return true;
721 }
722 }
723 }
724 }
725
726 if (inBankAlso)
727 {
729 {
731 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
732 {
733 tempcount += pItem->GetCount();
734 if (tempcount >= count)
735 return true;
736 }
737 }
739 {
740 if (Bag* pBag = GetBagByPos(i))
741 {
742 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
743 {
744 Item* pItem = GetItemByPos(i, j);
745 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
746 {
747 tempcount += pItem->GetCount();
748 if (tempcount >= count)
749 return true;
750 }
751 }
752 }
753 }
754 }
755
756 return false;
757}

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 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_tyrande_whisperwind::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_professor_dabiri::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(), go_inconspicuous_landmark::OnGossipHello(), go_ahune_ice_stone::OnGossipHello(), npc_elder_kuruti::OnGossipSelect(), npc_oculus_drakegiver::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), go_ahune_ice_stone::OnGossipSelect(), go_amberpine_outhouse::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
12412{
12413 if (spellInfo->EquippedItemClass < 0)
12414 return true;
12415
12416 // scan other equipped items for same requirements (mostly 2 daggers/etc)
12417 // for optimize check 2 used cases only
12418 switch (spellInfo->EquippedItemClass)
12419 {
12420 case ITEM_CLASS_WEAPON:
12421 {
12424 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12425 return true;
12426 break;
12427 }
12428 case ITEM_CLASS_ARMOR:
12429 {
12430 // tabard not have dependent spells
12433 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12434 return true;
12435
12436 // shields can be equipped to offhand slot
12438 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12439 return true;
12440
12441 // ranged slot can have some armor subclasses
12443 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12444 return true;
12445
12446 break;
12447 }
12448 default:
12449 LOG_ERROR("entities.player", "HasItemFitToSpellRequirements: Not handled spell requirement for item class {}", spellInfo->EquippedItemClass);
12450 break;
12451 }
12452
12453 return false;
12454}

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
760{
761 uint32 tempcount = 0;
763 {
764 if (i == except_slot)
765 continue;
766
768 if (pItem && pItem->GetEntry() == item)
769 {
770 tempcount += pItem->GetCount();
771 if (tempcount >= count)
772 return true;
773 }
774 }
775
776 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
777 if (pProto && pProto->GemProperties)
778 {
780 {
781 if (i == except_slot)
782 continue;
783
785 if (pItem && pItem->GetTemplate()->Socket[0].Color)
786 {
787 tempcount += pItem->GetGemCountWithID(item);
788 if (tempcount >= count)
789 return true;
790 }
791 }
792 }
793
794 return false;
795}
uint8 GetGemCountWithID(uint32 GemID) const
Definition: Item.cpp:1016

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
798{
799 uint32 tempcount = 0;
801 {
802 if (i == except_slot)
803 continue;
804
806 if (!pItem)
807 continue;
808
809 ItemTemplate const* pProto = pItem->GetTemplate();
810 if (!pProto)
811 continue;
812
813 if (pProto->ItemLimitCategory == limitCategory)
814 {
815 tempcount += pItem->GetCount();
816 if (tempcount >= count)
817 return true;
818 }
819
821 {
822 tempcount += pItem->GetGemCountWithLimitCategory(limitCategory);
823 if (tempcount >= count)
824 return true;
825 }
826 }
827
828 return false;
829}

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
883{
884 Item* pItem;
886 {
889 return true;
890 }
892 {
895 return true;
896 }
898 {
899 if (Bag* pBag = GetBagByPos(i))
900 {
901 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
902 {
903 pItem = GetItemByPos(i, j);
905 return true;
906 }
907 }
908 }
909 return false;
910}
TotemCategory
Definition: SharedDefines.h:3055
bool IsTotemCategoryCompatiableWith(ItemTemplate const *pProto, uint32 requiredTotemCategoryId) const
Definition: PlayerStorage.cpp:912

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 ( )
15968{
15969 switch (GetSpec(GetActiveSpec()))
15970 {
15980 return true;
15982 if (GetShapeshiftForm() == FORM_CAT)
15983 return true;
15984 default:
15985 break;
15986 }
15987 return false;
15988}
@ TALENT_TREE_DEATH_KNIGHT_FROST
Definition: Player.h:162
@ TALENT_TREE_DRUID_FERAL_COMBAT
Definition: Player.h:174
@ TALENT_TREE_WARRIOR_FURY
Definition: Player.h:147
@ TALENT_TREE_ROGUE_ASSASSINATION
Definition: Player.h:155
@ TALENT_TREE_DEATH_KNIGHT_UNHOLY
Definition: Player.h:163
@ TALENT_TREE_SHAMAN_ENHANCEMENT
Definition: Player.h:165
@ TALENT_TREE_WARRIOR_ARMS
Definition: Player.h:146
@ TALENT_TREE_ROGUE_COMBAT
Definition: Player.h:156
@ TALENT_TREE_PALADIN_RETRIBUTION
Definition: Player.h:151
@ TALENT_TREE_ROGUE_SUBTLETY
Definition: Player.h:157
@ FORM_CAT
Definition: Unit.h:91

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
2527{ return m_pendingSpectatorForBG == bgInstanceId; }

References m_pendingSpectatorForBG.

Referenced by WorldSession::HandleMoveWorldportAck(), and TeleportTo().

◆ HasPlayerFlag()

◆ HasPvPForcingQuest()

bool Player::HasPvPForcingQuest ( ) const
2480{
2481 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2482 {
2483 uint32 questId = GetQuestSlotQuestId(i);
2484 if (questId == 0)
2485 continue;
2486
2487 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
2488 if (!quest)
2489 continue;
2490
2491 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
2492 return true;
2493 }
2494
2495 return false;
2496}

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
101{
102 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
103 {
104 uint32 questid = GetQuestSlotQuestId(i);
105 if (questid == questId)
106 {
107 return true;
108 }
109 }
110
111 return false;
112}

References GetQuestSlotQuestId(), and MAX_QUEST_LOG_SIZE.

◆ HasQuestForGO()

bool Player::HasQuestForGO ( int32  GOId) const
12284{
12285 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
12286 {
12287 uint32 questid = GetQuestSlotQuestId(i);
12288 if (questid == 0)
12289 continue;
12290
12291 QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questid);
12292 if (qs_itr == m_QuestStatus.end())
12293 continue;
12294
12295 QuestStatusData const& qs = qs_itr->second;
12296
12298 {
12299 Quest const* qinfo = sObjectMgr->GetQuestTemplate(questid);
12300 if (!qinfo)
12301 continue;
12302
12303 if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
12304 continue;
12305
12306 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
12307 {
12308 if (qinfo->RequiredNpcOrGo[j] >= 0) //skip non GO case
12309 continue;
12310
12311 if ((-1)*GOId == qinfo->RequiredNpcOrGo[j] && qs.CreatureOrGOCount[j] < qinfo->RequiredNpcOrGoCount[j])
12312 return true;
12313 }
12314 }
12315 }
12316 return false;
12317}
Difficulty GetDifficulty(bool isRaid) const
Definition: Player.h:1870
bool IsAllowedInRaid(Difficulty difficulty) const
Definition: QuestDef.cpp:293

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
2249{
2250 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2251 {
2252 uint32 questid = GetQuestSlotQuestId(i);
2253 if (questid == 0 || questid == excludeQuestId)
2254 continue;
2255
2256 QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questid);
2257 if (qs_itr == m_QuestStatus.end())
2258 continue;
2259
2260 QuestStatusData const& q_status = qs_itr->second;
2261
2262 if ((q_status.Status == QUEST_STATUS_INCOMPLETE) || (turnIn && q_status.Status == QUEST_STATUS_COMPLETE))
2263 {
2264 Quest const* qinfo = sObjectMgr->GetQuestTemplate(questid);
2265 if (!qinfo)
2266 continue;
2267
2268 // hide quest if player is in raid-group and quest is no raid quest
2269 if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
2270 {
2271 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
2272 {
2273 continue;
2274 }
2275 }
2276
2277 // There should be no mixed ReqItem/ReqSource drop
2278 // This part for ReqItem drop
2279 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
2280 {
2281 if (itemid == qinfo->RequiredItemId[j] && q_status.ItemCount[j] < qinfo->RequiredItemCount[j])
2282 {
2283 if (showInLoot)
2284 {
2285 if (GetItemCount(itemid, true) < qinfo->RequiredItemCount[j])
2286 {
2287 return true;
2288 }
2289
2290 *showInLoot = false;
2291 }
2292 else
2293 {
2294 return true;
2295 }
2296 }
2297
2298 if (turnIn && q_status.ItemCount[j] >= qinfo->RequiredItemCount[j])
2299 {
2300 return true;
2301 }
2302 }
2303 // This part - for ReqSource
2304 for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
2305 {
2306 // examined item is a source item
2307 if (qinfo->ItemDrop[j] == itemid)
2308 {
2309 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemid);
2310 uint32 ownedCount = GetItemCount(itemid, true);
2311 // 'unique' item
2312 if ((pProto->MaxCount && int32(ownedCount) < pProto->MaxCount) || (turnIn && int32(ownedCount) >= pProto->MaxCount))
2313 return true;
2314
2315 // allows custom amount drop when not 0
2316 if (qinfo->ItemDropQuantity[j])
2317 {
2318 if ((ownedCount < qinfo->ItemDropQuantity[j]) || (turnIn && ownedCount >= qinfo->ItemDropQuantity[j]))
2319 return true;
2320 }
2321 else if (ownedCount < pProto->GetMaxStackSize())
2322 return true;
2323 }
2324 }
2325 }
2326 }
2327 return false;
2328}
uint32 ItemDropQuantity[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition: QuestDef.h:300
uint32 ItemDrop[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition: QuestDef.h:299
uint32 RequiredItemId[QUEST_ITEM_OBJECTIVES_COUNT]
Definition: QuestDef.h:297

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
1173{ return (_restFlagMask & restFlag) != 0; }

References _restFlagMask.

Referenced by Update().

◆ HasSkill()

◆ hasSpanishClient()

bool Player::hasSpanishClient ( )
inline
1068 {
1070 }
@ LOCALE_esES
Definition: Common.h:81
@ LOCALE_esMX
Definition: Common.h:82
LocaleConstant GetSessionDbLocaleIndex() const
Definition: WorldSession.h:497

References GetSession(), WorldSession::GetSessionDbLocaleIndex(), LOCALE_esES, and LOCALE_esMX.

◆ HasSpell()

bool Player::HasSpell ( uint32  spell) const
overridevirtual

Reimplemented from Unit.

3819{
3820 PlayerSpellMap::const_iterator itr = m_spells.find(spell);
3821 return (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec));
3822}

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.

16221{
16222 SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
16223 return itr != m_spellCooldowns.end() && itr->second.end > getMSTime() && itr->second.itemid == itemid;
16224}

References getMSTime(), and m_spellCooldowns.

◆ HasSpellMod()

bool Player::HasSpellMod ( SpellModifier mod,
Spell spell 
)
9603{
9604 if (!mod || !spell)
9605 return false;
9606
9607 return spell->m_appliedMods.find(mod->ownerAura) != spell->m_appliedMods.end();
9608}

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

Referenced by ApplySpellMod().

◆ HasTalent()

bool Player::HasTalent ( uint32  spell_id,
uint8  spec 
) const
3825{
3826 PlayerTalentMap::const_iterator itr = m_talents.find(spell);
3827 return (itr != m_talents.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec));
3828}

References m_activeSpec, m_talents, and PLAYERSPELL_REMOVED.

Referenced by ActivateSpec(), GetSpec(), AuraEffect::HandleShapeshiftBoosts(), and LearnTalent().

◆ HasTankSpec()

bool Player::HasTankSpec ( )
15950{
15951 switch (GetSpec())
15952 {
15956 return true;
15959 return true;
15960 break;
15961 default:
15962 break;
15963 }
15964 return false;
15965}
@ TALENT_TREE_DEATH_KNIGHT_BLOOD
Definition: Player.h:161
@ TALENT_TREE_PALADIN_PROTECTION
Definition: Player.h:150
@ TALENT_TREE_WARRIOR_PROTECTION
Definition: Player.h:148
@ FORM_DIREBEAR
Definition: Unit.h:98
@ FORM_BEAR
Definition: Unit.h:95

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
2489{ return HasTitle(title->bit_index); }
bool HasTitle(uint32 bitIndex) const
Definition: Player.cpp:13218

References CharTitlesEntry::bit_index, and HasTitle().

Referenced by HasTitle().

◆ HasTitle() [2/2]

bool Player::HasTitle ( uint32  bitIndex) const
13219{
13220 if (bitIndex > MAX_TITLE_INDEX)
13221 return false;
13222
13223 uint32 fieldIndexOffset = bitIndex / 32;
13224 uint32 flag = 1 << (bitIndex % 32);
13225 return HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13226}
#define MAX_TITLE_INDEX
Definition: Player.h:555

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
11326{
11327 if (guid == GetGUID())
11328 {
11329 return true;
11330 }
11331
11332 return m_clientGUIDs.find(guid) != m_clientGUIDs.end();
11333}
GuidUnorderedSet m_clientGUIDs
Definition: Player.h:2331

References Object::GetGUID(), and m_clientGUIDs.

◆ HaveAtClient() [2/2]

bool Player::HaveAtClient ( WorldObject const *  u) const
11307{
11308 if (u == this)
11309 {
11310 return true;
11311 }
11312
11313 // Motion Transports are always present in player's client
11314 if (GameObject const* gameobject = u->ToGameObject())
11315 {
11316 if (gameobject->IsMotionTransport())
11317 {
11318 return true;
11319 }
11320 }
11321
11322 return m_clientGUIDs.find(u->GetGUID()) != m_clientGUIDs.end();
11323}

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
12199{
12201 if (!bg || !bg->isArena())
12202 return false;
12203
12204 return true;
12205}
bool isArena() const
Definition: Battleground.h:388

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
12141{
12143}
uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const
Definition: Player.cpp:12122

References GetBattlegroundQueueIndex(), and PLAYER_MAX_BATTLEGROUND_QUEUES.

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

◆ IncompleteQuest()

◆ InitDataForForm()

void Player::InitDataForForm ( bool  reapplyMods = false)
10468{
10470
10471 SpellShapeshiftEntry const* ssEntry = sSpellShapeshiftStore.LookupEntry(form);
10472 if (ssEntry && ssEntry->attackSpeed)
10473 {
10477 }
10478 else
10480
10481 switch (form)
10482 {
10483 case FORM_GHOUL:
10484 case FORM_CAT:
10485 {
10486 if (getPowerType() != POWER_ENERGY)
10488 break;
10489 }
10490 case FORM_BEAR:
10491 case FORM_DIREBEAR:
10492 {
10493 if (getPowerType() != POWER_RAGE)
10495 break;
10496 }
10497 default: // 0, for example
10498 {
10499 ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(getClass());
10500 if (cEntry && cEntry->powerType < MAX_POWERS && uint32(getPowerType()) != cEntry->powerType)
10501 setPowerType(Powers(cEntry->powerType));
10502 break;
10503 }
10504 }
10505
10506 // update auras at form change, ignore this at mods reapply (.reset stats/etc) when form not change.
10507 if (!reapplyMods)
10509
10512}
DBCStorage< SpellShapeshiftEntry > sSpellShapeshiftStore(SpellShapeshiftfmt)
ShapeshiftForm
Definition: Unit.h:89
@ FORM_GHOUL
Definition: Unit.h:97
void SetRegularAttackTime()
Definition: Player.cpp:5195
void UpdateEquipSpellsAtFormChange()
Definition: PlayerUpdates.cpp:1310
void setPowerType(Powers power)
Definition: Unit.cpp:9952
Definition: DBCStructure.h:1792
uint32 attackSpeed
Definition: DBCStructure.h:1800

References SpellShapeshiftEntry::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(), sSpellShapeshiftStore, UpdateAttackPowerAndDamage(), and UpdateEquipSpellsAtFormChange().

Referenced by AuraEffect::HandleAuraModShapeshift(), and InitStatsForLevel().

◆ InitDisplayIds()

void Player::InitDisplayIds ( )
10515{
10516 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
10517 if (!info)
10518 {
10519 LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Can't init display ids.", GetGUID().ToString());
10520 return;
10521 }
10522
10523 uint8 gender = getGender();
10524 switch (gender)
10525 {
10526 case GENDER_FEMALE:
10529 break;
10530 case GENDER_MALE:
10533 break;
10534 default:
10535 LOG_ERROR("entities.player", "Invalid gender {} for player", gender);
10536 return;
10537 }
10538}
@ GENDER_MALE
Definition: SharedDefines.h:60
@ GENDER_FEMALE
Definition: SharedDefines.h:61
uint16 displayId_m
Definition: Player.h:346
uint16 displayId_f
Definition: Player.h:347
uint8 getGender() const
Definition: Unit.h:1428
void SetNativeDisplayId(uint32 modelId)
Definition: Unit.h:2172
virtual void SetDisplayId(uint32 modelId)
Definition: Unit.cpp:16936

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 ( )
13180{
13181 for (uint32 i = 0; i < sGlyphSlotStore.GetNumRows(); ++i)
13182 if (GlyphSlotEntry const* gs = sGlyphSlotStore.LookupEntry(i))
13183 if (gs->Order)
13184 SetGlyphSlot(gs->Order - 1, gs->Id);
13185
13186 uint8 level = GetLevel();
13187 uint32 value = 0;
13188
13189 // 0x3F = 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 for 80 level
13190 if (level >= 15)
13191 value |= (0x01 | 0x02);
13192 if (level >= 30)
13193 value |= 0x08;
13194 if (level >= 50)
13195 value |= 0x04;
13196 if (level >= 70)
13197 value |= 0x10;
13198 if (level >= 80)
13199 value |= 0x20;
13200
13202}
@ PLAYER_GLYPHS_ENABLED
Definition: UpdateFields.h:390
void SetGlyphSlot(uint8 slot, uint32 slottype)
Definition: Player.h:1710

References Unit::GetLevel(), PLAYER_GLYPHS_ENABLED, SetGlyphSlot(), Object::SetUInt32Value(), and sGlyphSlotStore.

Referenced by Create(), GiveLevel(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ Initialize()

void Player::Initialize ( ObjectGuid::LowType  guid)
4807{
4808 Object::_Create(guid, 0, HighGuid::Player);
4809}

References Object::_Create().

◆ InitPrimaryProfessions()

void Player::InitPrimaryProfessions ( )
11405{
11407}
@ CONFIG_MAX_PRIMARY_TRADE_SKILL
Definition: IWorld.h:250

References CONFIG_MAX_PRIMARY_TRADE_SKILL, SetFreePrimaryProfessions(), and sWorld.

Referenced by Create(), and LoadFromDB().

◆ InitRunes()

void Player::InitRunes ( )
13348{
13350 return;
13351
13352 m_runes = new Runes;
13353
13354 m_runes->runeState = 0;
13356
13357 for (uint8 i = 0; i < MAX_RUNES; ++i)
13358 {
13359 SetBaseRune(i, runeSlotTypes[i]); // init base types
13360 SetCurrentRune(i, runeSlotTypes[i]); // init current types
13361 SetRuneCooldown(i, 0); // reset cooldowns
13362 SetGracePeriod(i, 0); // xinef: reset grace period
13363 SetRuneConvertAura(i, nullptr);
13365 }
13366
13367 for (uint8 i = 0; i < NUM_RUNE_TYPES; ++i)
13369}
@ PLAYER_RUNE_REGEN_1
Definition: UpdateFields.h:386
static RuneType runeSlotTypes[MAX_RUNES]
Definition: Player.cpp:13337
@ NUM_RUNE_TYPES
Definition: Player.h:414
@ RUNE_BLOOD
Definition: Player.h:410
#define MAX_RUNES
Definition: Player.h:399
Definition: Player.h:427
void SetRuneState(uint8 index, bool set=true)
Definition: Player.h:432
void SetRuneCooldown(uint8 index, uint32 cooldown)
Definition: Player.h:2466
void SetBaseRune(uint8 index, RuneType baseRune)
Definition: Player.h:2464
void SetGracePeriod(uint8 index, uint32 period)
Definition: Player.h:2467

References CLASS_DEATH_KNIGHT, Unit::getClass(), 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)
2536{
2537 if (reapplyMods) //reapply stats values only on .reset stats (level) command
2539
2540 PlayerClassLevelInfo classInfo;
2541 sObjectMgr->GetPlayerClassLevelInfo(getClass(), GetLevel(), &classInfo);
2542
2543 PlayerLevelInfo info;
2544 sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), GetLevel(), &info);
2545
2546 uint32 maxPlayerLevel = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
2547 sScriptMgr->OnSetMaxLevel(this, maxPlayerLevel);
2548 SetUInt32Value(PLAYER_FIELD_MAX_LEVEL, maxPlayerLevel);
2550
2551 // reset before any aura state sources (health set/aura apply)
2553
2555
2556 // set default cast time multiplier
2558
2559 // reset size before reapply auras
2560 SetObjectScale(1.0f);
2561
2562 // save base values (bonuses already included in stored stats
2563 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2564 SetCreateStat(Stats(i), info.stats[i]);
2565
2566 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2567 SetStat(Stats(i), info.stats[i]);
2568
2569 SetCreateHealth(classInfo.basehealth);
2570
2571 //set create powers
2572 SetCreateMana(classInfo.basemana);
2573
2575
2577
2578 //reset rating fields values
2580 SetUInt32Value(index, 0);
2581
2583 for (uint8 i = 0; i < 7; ++i)
2584 {
2588 }
2589
2590 //reset attack power, damage and attack speed fields
2592 SetFloatValue(UNIT_FIELD_BASEATTACKTIME + 1, 2000.0f); // offhand attack time
2594
2601
2608
2609 // Base crit values (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
2613
2614 // Init spell schools (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
2615 for (uint8 i = 0; i < 7; ++i)
2617
2621
2622 // Dodge percentage
2624
2625 // set armor (resistance 0) to original value (create_agility*2)
2627 SetResistanceBuffMods(SpellSchools(0), true, 0.0f);
2628 SetResistanceBuffMods(SpellSchools(0), false, 0.0f);
2629 // set other resistance to original value (0)
2630 for (uint8 i = 1; i < MAX_SPELL_SCHOOL; ++i)
2631 {
2633 SetResistanceBuffMods(SpellSchools(i), true, 0.0f);
2634 SetResistanceBuffMods(SpellSchools(i), false, 0.0f);
2635 }
2636
2639 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
2640 {
2643 }
2644 // Reset no reagent cost field
2645 for (uint8 i = 0; i < 3; ++i)
2647 // Init data for form but skip reapply item mods for form
2648 InitDataForForm(reapplyMods);
2649
2650 // save new stats
2651 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
2653
2654 SetMaxHealth(classInfo.basehealth); // stamina bonus will applied later
2655
2656 // cleanup mounted state (it will set correctly at aura loading if player saved at mount.
2658
2659 // cleanup unit flags (will be re-applied if need at aura load).
2667 SetImmuneToAll(false);
2669
2671
2672 // cleanup player flags (will be re-applied if need at aura load), to avoid have ghost flag without ghost aura, for example.
2674
2675 RemoveStandFlags(UNIT_STAND_FLAGS_ALL); // one form stealth modified bytes
2677 {
2679 sScriptMgr->OnFfaPvpStateUpdate(this, false);
2680
2681 }
2682 // restore if need some important flags
2683 SetUInt32Value(PLAYER_FIELD_BYTES2, 0); // flags empty by default
2684
2685 if (reapplyMods) // reapply stats values only on .reset stats (level) command
2687
2688 // set current level health and mana/energy to maximum after applying all mods.
2689 SetFullHealth();
2697
2698 // update level to hunter/summon pet
2699 if (Pet* pet = GetPet())
2700 pet->SynchronizeLevelWithOwner();
2701}
@ 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:498
@ PLAYER_FLAGS_DND
Definition: Player.h:477
@ PLAYER_FLAGS_AFK
Definition: Player.h:476
@ PLAYER_FLAGS_GM
Definition: Player.h:478
@ UNIT_STAND_FLAGS_ALL
Definition: Unit.h:73
@ UNIT_BYTE2_FLAG_FFA_PVP
Definition: Unit.h:138
@ UNIT_BYTE2_FLAG_SANCTUARY
Definition: Unit.h:139
@ UNIT_FLAG_STUNNED
Definition: Unit.h:466
@ UNIT_FLAG_NON_ATTACKABLE
Definition: Unit.h:449
@ UNIT_FLAG_IN_COMBAT
Definition: Unit.h:467
@ UNIT_FLAG_DISARMED
Definition: Unit.h:469
@ UNIT_FLAG_PACIFIED
Definition: Unit.h:465
@ UNIT_FLAG_CONFUSED
Definition: Unit.h:470
@ UNIT_FLAG_FLEEING
Definition: Unit.h:471
@ UNIT_FLAG_NOT_SELECTABLE
Definition: Unit.h:473
@ UNIT_FLAG_LOOTING
Definition: Unit.h:458
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition: Unit.h:455
@ UNIT_FLAG_SILENCED
Definition: Unit.h:461
@ UNIT_FLAG_MOUNT
Definition: Unit.h:475
@ UNIT_FLAG_PET_IN_COMBAT
Definition: Unit.h:459
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition: Object.cpp:930
void _ApplyAllStatBonuses()
Definition: StatSystem.cpp:986
void InitDataForForm(bool reapplyMods=false)
Definition: Player.cpp:10467
void _RemoveAllStatBonuses()
Definition: StatSystem.cpp:998
uint32 GetCreatePowers(Powers power) const
Definition: Unit.cpp:15552
void SetStat(Stats stat, int32 val)
Definition: Unit.h:1431
void SetResistanceBuffMods(SpellSchools school, bool positive, float val)
Definition: Unit.h:2026
float m_createStats[MAX_STATS]
Definition: Unit.h:2485
void SetResistance(SpellSchools school, int32 val)
Definition: Unit.h:1437
void RemoveStandFlags(uint8 flags)
Definition: Unit.h:1540
void SetArmor(int32 val)
Definition: Unit.h:1433
void SetMaxHealth(uint32 val)
Definition: Unit.cpp:15420
void InitStatBuffMods()
Definition: Unit.h:2029
void SetImmuneToAll(bool apply, bool keepCombat=false)
Definition: Unit.h:1678

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(), Object::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 ( )
2521{
2522 uint32 talentPointsForLevel = CalculateTalentsPoints();
2523
2524 // xinef: more talent points that we have are used, reset
2525 if (m_usedTalentCount > talentPointsForLevel)
2526 resetTalents(true);
2527 // xinef: else, recalculate free talent points count
2528 else
2529 SetFreeTalentPoints(talentPointsForLevel - m_usedTalentCount);
2530
2531 if (!GetSession()->PlayerLoading())
2532 SendTalentsInfoData(false); // update at client
2533}
void SendTalentsInfoData(bool pet)
Definition: Player.cpp:14305
bool resetTalents(bool noResetCost=false)
Definition: Player.cpp:3643
void SetFreeTalentPoints(uint32 points)
Definition: Player.cpp:3738
uint32 CalculateTalentsPoints() const
Definition: Player.cpp:13507

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 ( )
12967{
12968 if (sLFGMgr->selectedRandomLfgDungeon(GetGUID()))
12969 {
12970 Map const* map = GetMap();
12971 return sLFGMgr->inLfgDungeonMap(GetGUID(), map->GetId(), map->GetDifficulty());
12972 }
12973
12974 return false;
12975}

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 
)
5484{
5485 if (button >= MAX_ACTION_BUTTONS)
5486 {
5487 LOG_ERROR("entities.player", "Action {} not added into button {} for player {}: button must be < {}", action, button, GetName(), MAX_ACTION_BUTTONS);
5488 return false;
5489 }
5490
5491 if (action >= MAX_ACTION_BUTTON_ACTION_VALUE)
5492 {
5493 LOG_ERROR("entities.player", "Action {} not added into button {} for player {}: action must be < {}", action, button, GetName(), MAX_ACTION_BUTTON_ACTION_VALUE);
5494 return false;
5495 }
5496
5497 switch (type)
5498 {
5500 if (!sSpellMgr->GetSpellInfo(action))
5501 {
5502 LOG_ERROR("entities.player", "Spell action {} not added into button {} for player {}: spell not exist", action, button, GetName());
5503 return false;
5504 }
5505
5506 if (!HasSpell(action))
5507 {
5508 LOG_DEBUG("entities.player.loading", "Player::IsActionButtonDataValid Spell action {} not added into button {} for player {}: player don't known this spell", action, button, GetName());
5509 return false;
5510 }
5511 break;
5512 case ACTION_BUTTON_ITEM:
5513 if (!sObjectMgr->GetItemTemplate(action))
5514 {
5515 LOG_ERROR("entities.player", "Item action {} not added into button {} for player {}: item not exist", action, button, GetName());
5516 return false;
5517 }
5518 break;
5519 default:
5520 break; // other cases not checked at this moment
5521 }
5522
5523 return true;
5524}
@ ACTION_BUTTON_ITEM
Definition: Player.h:235
@ ACTION_BUTTON_SPELL
Definition: Player.h:230
#define MAX_ACTION_BUTTONS
Definition: Player.h:275
#define MAX_ACTION_BUTTON_ACTION_VALUE
Definition: Player.h:251

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
202{
203 return m_QuestStatus.find(quest_id) != m_QuestStatus.end();
204}

References m_QuestStatus.

◆ IsAffectedBySpellmod()

bool Player::IsAffectedBySpellmod ( SpellInfo const *  spellInfo,
SpellModifier mod,
Spell spell = nullptr 
)
9611{
9612 if (!mod || !spellInfo)
9613 return false;
9614
9615 // Mod out of charges
9616 if (spell && mod->charges == -1 && spell->m_appliedMods.find(mod->ownerAura) == spell->m_appliedMods.end())
9617 return false;
9618
9619 // +duration to infinite duration spells making them limited
9620 if (mod->op == SPELLMOD_DURATION && spellInfo->GetDuration() == -1)
9621 return false;
9622
9623 return spellInfo->IsAffectedBySpellMod(mod);
9624}

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)
5643{
5644 if (!creature->isDead() || !creature->IsDamageEnoughForLootingAndReward())
5645 return false;
5646
5647 if (HasPendingBind())
5648 return false;
5649
5650 const Loot* loot = &creature->loot;
5651 if (loot->isLooted()) // nothing to loot or everything looted.
5652 return false;
5653
5654 if (!loot->hasItemForAll() && !loot->hasItemFor(this)) // no loot in creature for this player
5655 return false;
5656
5657 if (loot->loot_type == LOOT_SKINNING)
5658 return creature->GetLootRecipientGUID() == GetGUID();
5659
5660 Group* thisGroup = GetGroup();
5661 if (!thisGroup)
5662 return this == creature->GetLootRecipient();
5663 else if (thisGroup != creature->GetLootRecipientGroup())
5664 return false;
5665
5666 switch (thisGroup->GetLootMethod())
5667 {
5668 case MASTER_LOOT:
5669 case FREE_FOR_ALL:
5670 return true;
5671 case ROUND_ROBIN:
5672 // may only loot if the player is the loot roundrobin player
5673 // or if there are free/quest/conditional item for the player
5674 if (!loot->roundRobinPlayer || loot->roundRobinPlayer == GetGUID())
5675 return true;
5676
5677 return loot->hasItemFor(this);
5678 case GROUP_LOOT:
5679 case NEED_BEFORE_GREED:
5680 // may only loot if the player is the loot roundrobin player
5681 // or item over threshold (so roll(s) can be launched)
5682 // or if there are free/quest/conditional item for the player
5683 if (!loot->roundRobinPlayer || loot->roundRobinPlayer == GetGUID())
5684 return true;
5685
5686 if (loot->hasOverThresholdItem())
5687 return true;
5688
5689 return loot->hasItemFor(this);
5690 }
5691
5692 return false;
5693}
@ 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:2389
LootMethod GetLootMethod() const
Definition: Group.cpp:2255
bool hasItemFor(Player *player) const
Definition: LootMgr.cpp:914
bool isLooted() const
Definition: LootMgr.h:368
bool hasOverThresholdItem() const
Definition: LootMgr.cpp:959
ObjectGuid roundRobinPlayer
Definition: LootMgr.h:324
bool hasItemForAll() const
Definition: LootMgr.cpp:899
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::BuildValuesUpdate().

◆ IsAlwaysDetectableFor()

bool Player::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

11360{
11362 return true;
11363
11364 if (duel && duel->State != DUEL_STATE_CHALLENGED && duel->Opponent == seer)
11365 {
11366 return false;
11367 }
11368
11369 if (Player const* seerPlayer = seer->ToPlayer())
11370 {
11371 if (IsGroupVisibleFor(seerPlayer))
11372 {
11373 return true;
11374 }
11375 }
11376
11377 return false;
11378}
@ DUEL_STATE_CHALLENGED
Definition: Player.h:371
bool IsGroupVisibleFor(Player const *p) const
Definition: Player.cpp:2267
bool IsAlwaysDetectableFor(WorldObject const *seer) const override
Definition: Unit.cpp:14111

References duel, DUEL_STATE_CHALLENGED, Unit::IsAlwaysDetectableFor(), IsGroupVisibleFor(), and Object::ToPlayer().

◆ IsAtGroupRewardDistance()

bool Player::IsAtGroupRewardDistance ( WorldObject const *  pRewardSource) const
12656{
12657 WorldObject const* player = GetCorpse();
12658 if (!player || IsAlive())
12659 {
12660 player = this;
12661 }
12662
12663 if (!pRewardSource || !player->IsInMap(pRewardSource))
12664 {
12665 return false;
12666 }
12667
12668 if (pRewardSource->GetMap()->IsDungeon())
12669 {
12670 return true;
12671 }
12672
12673 return pRewardSource->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE);
12674}
@ CONFIG_GROUP_XP_DISTANCE
Definition: IWorld.h:190
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(), Battleground::HandleKillPlayer(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), IsAtLootRewardDistance(), and RewardPlayerAndGroupAtEvent().

◆ IsAtLootRewardDistance()

bool Player::IsAtLootRewardDistance ( WorldObject const *  pRewardSource) const
12677{
12678 if (!IsAtGroupRewardDistance(pRewardSource))
12679 {
12680 return false;
12681 }
12682
12683 if (HasPendingBind())
12684 {
12685 return false;
12686 }
12687
12688 return pRewardSource->HasAllowedLooter(GetGUID());
12689}

References Object::GetGUID(), WorldObject::HasAllowedLooter(), HasPendingBind(), and IsAtGroupRewardDistance().

Referenced by Loot::FillLoot(), Group::GroupLoot(), WorldSession::HandleLootMoneyOpcode(), Group::MasterLoot(), Group::NeedBeforeGreed(), and Group::UpdateLooterGuid().

◆ IsAtRecruitAFriendDistance()

bool Player::IsAtRecruitAFriendDistance ( WorldObject const *  pOther) const
12692{
12693 if (!pOther)
12694 return false;
12695 WorldObject const* player = GetCorpse();
12696 if (!player || IsAlive())
12697 player = this;
12698
12699 if (player->GetMapId() != pOther->GetMapId() || player->GetInstanceId() != pOther->GetInstanceId())
12700 return false;
12701
12702 return pOther->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE);
12703}
@ CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE
Definition: IWorld.h:191

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
611{
612 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END))
613 return true;
614 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END))
615 return true;
616 if (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END)
617 return true;
618 return false;
619}

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
13372{
13373 for (uint8 i = 0; i < MAX_RUNES; ++i)
13374 if (GetBaseRune(i) == runeType && GetRuneCooldown(i) == 0)
13375 return false;
13376
13377 return true;
13378}
uint32 GetRuneCooldown(uint8 index) const
Definition: Player.h:2458

References GetBaseRune(), GetRuneCooldown(), and MAX_RUNES.

Referenced by Unit::HandleProcTriggerSpell().

◆ isBeingLoaded()

bool Player::isBeingLoaded ( ) const
overridevirtual

Reimplemented from Unit.

4941{
4942 return GetSession()->PlayerLoading();
4943}
bool PlayerLoading() const
Definition: WorldSession.h:335

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

◆ IsCurrentBattlegroundRandom()

bool Player::IsCurrentBattlegroundRandom ( ) const
inline
2207{ return m_bgData.bgIsRandom; }
bool bgIsRandom
Definition: Player.h:1022

References BGData::bgIsRandom, and m_bgData.

◆ IsDailyQuestDone()

bool Player::IsDailyQuestDone ( uint32  quest_id)
12018{
12019 if (sObjectMgr->GetQuestTemplate(quest_id))
12020 {
12021 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12022 {
12023 if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx) == quest_id)
12024 {
12025 return true;
12026 }
12027 }
12028 }
12029
12030 return false;
12031}

References Object::GetUInt32Value(), PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and sObjectMgr.

◆ IsDeserter()

bool Player::IsDeserter ( ) const
inline
2213{ return HasAura(26013); }

References Unit::HasAura().

◆ IsDeveloper()

bool Player::IsDeveloper ( ) const
inline
@ PLAYER_FLAGS_DEVELOPER
Definition: Player.h:490

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
602{
603 if (bag == INVENTORY_SLOT_BAG_0 && (slot < EQUIPMENT_SLOT_END))
604 return true;
606 return true;
607 return false;
608}

References EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, and INVENTORY_SLOT_BAG_START.

◆ IsExistPet()

bool Player::IsExistPet ( )
9088{
9089 PetStable* const petStable = GetPetStable();
9090 return petStable && (petStable->CurrentPet || petStable->GetUnslottedHunterPet());
9091}

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

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

◆ IsFalling()

bool Player::IsFalling ( ) const
2132{
2133 // Xinef: Added !IsInFlight check
2134 return GetPositionZ() < m_lastFallZ && !IsInFlight();
2135}

References Position::GetPositionZ(), Unit::IsInFlight(), and m_lastFallZ.

Referenced by lfg::LFGMgr::TeleportPlayer().

◆ IsFFAPvP()

bool Player::IsFFAPvP ( )
16102{
16103 bool result = Unit::IsFFAPvP();
16104
16105 sScriptMgr->OnIsFFAPvP(this, result);
16106
16107 return result;
16108}
bool IsFFAPvP() const
Definition: Unit.h:1518

References Unit::IsFFAPvP(), and sScriptMgr.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), WorldSession::HandleRequestPartyMemberStatsOpcode(), RewardHonor(), UpdateFFAPvPFlag(), and UpdateFFAPvPState().

◆ IsGameMaster()

bool Player::IsGameMaster ( ) const
inline
1136{ return m_ExtraFlags & PLAYER_EXTRA_GM_ON; }
@ PLAYER_EXTRA_GM_ON
Definition: Player.h:586

References m_ExtraFlags, and PLAYER_EXTRA_GM_ON.

Referenced by ThreatMgr::_addThreat(), Group::_homebindIfInstance(), Unit::_IsValidAssistTarget(), Unit::_IsValidAttackTarget(), Unit::Attack(), GameObject::BuildValuesUpdate(), Unit::BuildValuesUpdate(), BuyItemFromVendorSlot(), npc_coren_direbrew::CanBeSeen(), go_loosely_turned_soil::go_loosely_turned_soilAI::CanBeSeen(), boss_ahune::boss_ahuneAI::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(), npc_jaina_proudmoore::OnGossipHello(), npc_thrall::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()(), MapMgr::PlayerCannotEnter(), Unit::ProcessTerrainStatusUpdate(), Battleground::RemovePlayerAtLeave(), AchievementMgr::ResetAchievementCriteria(), Satisfy(), 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:590

References m_ExtraFlags, and PLAYER_EXTRA_GM_CHAT.

Referenced by GetChatTag().

◆ isGMVisible()

bool Player::isGMVisible ( ) const
inline
@ PLAYER_EXTRA_GM_INVISIBLE
Definition: Player.h:589

References m_ExtraFlags, and PLAYER_EXTRA_GM_INVISIBLE.

Referenced by gm_commandscript::HandleGMVisibleCommand(), and Channel::Invite().

◆ IsGroupVisibleFor()

bool Player::IsGroupVisibleFor ( Player const *  p) const
2268{
2269 switch (sWorld->getIntConfig(CONFIG_GROUP_VISIBILITY))
2270 {
2271 default:
2272 return IsInSameGroupWith(p);
2273 case 1:
2274 return IsInSameRaidWith(p);
2275 case 2:
2276 return GetTeamId() == p->GetTeamId();
2277 }
2278}
@ CONFIG_GROUP_VISIBILITY
Definition: IWorld.h:260
bool IsInSameRaidWith(Player const *p) const
Definition: Player.h:1836
bool IsInSameGroupWith(Player const *p) const
Definition: Player.cpp:2280

References CONFIG_GROUP_VISIBILITY, GetTeamId(), IsInSameGroupWith(), IsInSameRaidWith(), and sWorld.

Referenced by IsAlwaysDetectableFor().

◆ isHonorOrXPTarget()

bool Player::isHonorOrXPTarget ( Unit victim) const
12563{
12564 uint8 v_level = victim->GetLevel();
12566
12567 // Victim level less gray level
12568 if (v_level <= k_grey)
12569 return false;
12570
12571 if (victim->GetTypeId() == TYPEID_UNIT)
12572 {
12573 if (victim->IsTotem() ||
12574 victim->IsPet() ||
12576 return false;
12577 }
12578 return true;
12579}
@ CREATURE_FLAG_EXTRA_NO_XP
Definition: CreatureData.h:55
uint32 flags_extra
Definition: CreatureData.h:239
bool IsTotem() const
Definition: Unit.h:1415

References CREATURE_FLAG_EXTRA_NO_XP, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), Object::GetTypeId(), Unit::IsPet(), Unit::IsTotem(), Object::ToCreature(), and TYPEID_UNIT.

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:13759

References Unit::isTargetableForAttack(), and isTotalImmune().

Referenced by EnvironmentalDamage().

◆ IsInAreaTriggerRadius()

bool Player::IsInAreaTriggerRadius ( AreaTrigger const *  trigger,
float  delta = 0.f 
) const
2156{
2157 if (!trigger || GetMapId() != trigger->map)
2158 return false;
2159
2160 if (trigger->radius > 0)
2161 {
2162 // if we have radius check it
2163 float dist = GetDistance(trigger->x, trigger->y, trigger->z);
2164 if (dist > trigger->radius + delta)
2165 return false;
2166 }
2167 else
2168 {
2169 Position center(trigger->x, trigger->y, trigger->z, trigger->orientation);
2170 if (!IsWithinBox(center, trigger->length / 2 + delta, trigger->width / 2 + delta, trigger->height / 2 + delta))
2171 return false;
2172 }
2173
2174 return true;
2175}
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
2281{
2282 return p == this || (GetGroup() &&
2283 GetGroup() == p->GetGroup() &&
2284 GetGroup()->SameSubGroup(this, p));
2285}
bool SameSubGroup(ObjectGuid guid1, ObjectGuid guid2) const
Definition: Group.cpp:2302

References GetGroup(), and Group::SameSubGroup().

Referenced by IsGroupVisibleFor(), and Unit::IsInPartyWith().

◆ IsInSameRaidWith()

bool Player::IsInSameRaidWith ( Player const *  p) const
inline

◆ IsInventoryPos() [1/2]

◆ IsInventoryPos() [2/2]

bool Player::IsInventoryPos ( uint8  bag,
uint8  slot 
)
static
589{
590 if (bag == INVENTORY_SLOT_BAG_0 && slot == NULL_SLOT)
591 return true;
593 return true;
595 return true;
596 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END))
597 return true;
598 return false;
599}

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
2206{ return m_bgData.isInvited; }
bool isInvited
Definition: Player.h:1021

References BGData::isInvited, and m_bgData.

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

◆ IsInvitedForBattlegroundInstance() [2/2]

bool Player::IsInvitedForBattlegroundInstance ( uint32  instanceId) const
12190{
12191 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12192 if (_BgBattlegroundQueueID[i].invitedToInstance == instanceId)
12193 return true;
12194
12195 return false;
12196}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

◆ IsInvitedForBattlegroundQueueType()

bool Player::IsInvitedForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId) const
12132{
12133 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12134 if (_BgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
12135 return _BgBattlegroundQueueID[i].invitedToInstance != 0;
12136
12137 return false;
12138}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by WorldSession::HandleBattleFieldPortOpcode().

◆ IsInWater()

bool Player::IsInWater ( ) const
inlineoverridevirtual

Reimplemented from Unit.

1099{ return m_isInWater; }

References m_isInWater.

Referenced by WorldSession::HandleMovementOpcodes().

◆ IsInWhisperWhiteList()

bool Player::IsInWhisperWhiteList ( ObjectGuid  guid)
15772{
15773 for (auto const& itr : WhisperList)
15774 {
15775 if (itr == guid)
15776 {
15777 return true;
15778 }
15779 }
15780
15781 return false;
15782}

References WhisperList.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ IsMirrorTimerActive()

bool Player::IsMirrorTimerActive ( MirrorTimerType  type)
inline
2012{ return m_MirrorTimer[type] == getMaxTimer(type); }

References getMaxTimer(), and m_MirrorTimer.

Referenced by lfg::LFGMgr::TeleportPlayer().

◆ IsNeedCastPassiveSpellAtLearn()

bool Player::IsNeedCastPassiveSpellAtLearn ( SpellInfo const *  spellInfo) const
3222{
3223 // note: form passives activated with shapeshift spells be implemented by HandleShapeshiftBoosts instead of spell_learn_spell
3224 // talent dependent passives activated at form apply have proper stance data
3226 return (!spellInfo->Stances || (form && (spellInfo->Stances & (1 << (form - 1)))) ||
3227 (!form && spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED)));
3228}
@ SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED
Definition: SharedDefines.h:447

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.

11336{
11338 return true;
11339
11340 if (GetSession()->PlayerLogout() || GetSession()->PlayerLoading())
11341 return true;
11342
11343 return false;
11344}
virtual bool IsNeverVisible() const
Definition: Object.h:647

References GetSession(), and WorldObject::IsNeverVisible().

◆ IsOutdoorPvPActive()

bool Player::IsOutdoorPvPActive ( )

◆ IsPetNeedBeTemporaryUnsummoned()

bool Player::IsPetNeedBeTemporaryUnsummoned ( ) const
inline

◆ IsPvP()

bool Player::IsPvP ( )
16111{
16112 bool result = Unit::IsPvP();
16113
16114 sScriptMgr->OnIsPvP(this, result);
16115
16116 return result;
16117}
bool IsPvP() const
Definition: Unit.h:1517

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
1777{ return m_resurrectGUID && m_resurrectGUID == guid; }

References m_resurrectGUID.

◆ IsSpectator()

◆ IsSpellFitByClassAndRace()

bool Player::IsSpellFitByClassAndRace ( uint32  spell_id) const
12259{
12260 uint32 racemask = getRaceMask();
12261 uint32 classmask = getClassMask();
12262
12263 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id);
12264 if (bounds.first == bounds.second)
12265 return true;
12266
12267 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
12268 {
12269 // skip wrong race skills
12270 if (_spell_idx->second->RaceMask && (_spell_idx->second->RaceMask & racemask) == 0)
12271 continue;
12272
12273 // skip wrong class skills
12274 if (_spell_idx->second->ClassMask && (_spell_idx->second->ClassMask & classmask) == 0)
12275 continue;
12276
12277 return true;
12278 }
12279
12280 return false;
12281}

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
13205{
13207
13208 uint32 immuneMask = 0;
13209 for (AuraEffectList::const_iterator itr = immune.begin(); itr != immune.end(); ++itr)
13210 {
13211 immuneMask |= (*itr)->GetMiscValue();
13212 if (immuneMask & SPELL_SCHOOL_MASK_ALL) // total immunity
13213 return true;
13214 }
13215 return false;
13216}
@ SPELL_AURA_SCHOOL_IMMUNITY
Definition: SpellAuraDefines.h:102
@ SPELL_SCHOOL_MASK_ALL
Definition: SharedDefines.h:287

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
913{
914 if (requiredTotemCategoryId == 0)
915 return true;
916 if (pProto->TotemCategory == 0)
917 return false;
918
919 TotemCategoryEntry const* itemEntry = sTotemCategoryStore.LookupEntry(pProto->TotemCategory);
920 if (!itemEntry)
921 return false;
922 TotemCategoryEntry const* reqEntry = sTotemCategoryStore.LookupEntry(requiredTotemCategoryId);
923 if (!reqEntry)
924 return false;
925
926 if (itemEntry->categoryType != reqEntry->categoryType)
927 return false;
928
929 if ((itemEntry->categoryMask & reqEntry->categoryMask) != reqEntry->categoryMask)
930 return false;
931
932 // xinef: check skill requirements, needed for enchants!
933 if (pProto->RequiredSkill)
934 if (this->GetSkillValue(pProto->RequiredSkill) < pProto->RequiredSkillRank)
935 return false;
936
937 return true;
938}
DBCStorage< TotemCategoryEntry > sTotemCategoryStore(TotemCategoryEntryfmt)
Definition: DBCStructure.h:1970
uint32 categoryType
Definition: DBCStructure.h:1974
uint32 categoryMask
Definition: DBCStructure.h:1975

References TotemCategoryEntry::categoryMask, TotemCategoryEntry::categoryType, GetSkillValue(), ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, sTotemCategoryStore, and ItemTemplate::TotemCategory.

Referenced by HasItemTotemCategory().

◆ IsTwoHandUsed()

◆ isUsingLfg()

bool Player::isUsingLfg ( )
12962{
12963 return sLFGMgr->GetState(GetGUID()) != lfg::LFG_STATE_NONE;
12964}
@ 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
1536{ return Gender <= GENDER_FEMALE; }
Gender
Definition: SharedDefines.h:59

References GENDER_FEMALE.

Referenced by BuildEnumData(), Create(), ConditionMgr::isConditionTypeValid(), and LoadFromDB().

◆ IsValidPos() [1/2]

bool Player::IsValidPos ( uint16  pos,
bool  explicit_pos 
)
inline
1237{ return IsValidPos(pos >> 8, pos & 255, explicit_pos); }
bool IsValidPos(uint16 pos, bool explicit_pos)
Definition: Player.h:1237

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 
)
633{
634 // post selected
635 if (bag == NULL_BAG && !explicit_pos)
636 return true;
637
638 if (bag == INVENTORY_SLOT_BAG_0)
639 {
640 // any post selected
641 if (slot == NULL_SLOT && !explicit_pos)
642 return true;
643
644 // equipment
645 if (slot < EQUIPMENT_SLOT_END)
646 return true;
647
648 // bag equip slots
650 return true;
651
652 // backpack slots
654 return true;
655
656 // keyring slots
657 if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_END)
658 return true;
659
660 // bank main slots
661 if (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END)
662 return true;
663
664 // bank bag slots
665 if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
666 return true;
667
668 return false;
669 }
670
671 // bag content slots
672 // bank bag content slots
673 if (Bag* pBag = GetBagByPos(bag))
674 {
675 // any post selected
676 if (slot == NULL_SLOT && !explicit_pos)
677 return true;
678
679 return slot < pBag->GetBagSize();
680 }
681
682 // where this?
683 return false;
684}

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
11381{
11382 if (!u)
11383 return false;
11384
11385 // Always can see self
11386 if (u == this)
11387 return true;
11388
11389 // Visible units, always are visible for all players
11390 if (IsVisible())
11391 return true;
11392
11393 // GMs are visible for higher gms (or players are visible for gms)
11394 if (!AccountMgr::IsPlayerAccount(u->GetSession()->GetSecurity()))
11395 return GetSession()->GetSecurity() <= u->GetSession()->GetSecurity();
11396
11397 if (!sScriptMgr->NotVisibleGloballyFor(const_cast<Player*>(this), u))
11398 return true;
11399
11400 // non faction visibility non-breakable for non-GMs
11401 return false;
11402}
bool IsVisible() const
Definition: Unit.h:2127
AccountTypes GetSecurity() const
Definition: WorldSession.h:358

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 
)
1820{
1821 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1822 {
1823 uint32 questid = GetQuestSlotQuestId(i);
1824 if (questid == 0)
1825 continue;
1826
1827 QuestStatusData& q_status = m_QuestStatus[questid];
1828
1829 if (q_status.Status != QUEST_STATUS_INCOMPLETE)
1830 continue;
1831
1832 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1833 if (!qInfo || !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
1834 continue;
1835
1836 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
1837 {
1838 uint32 reqitem = qInfo->RequiredItemId[j];
1839 if (reqitem == entry)
1840 {
1841 uint32 reqitemcount = qInfo->RequiredItemCount[j];
1842 uint16 curitemcount = q_status.ItemCount[j];
1843 if (curitemcount < reqitemcount)
1844 {
1845 q_status.ItemCount[j] = std::min<uint16>(q_status.ItemCount[j] + count, reqitemcount);
1846 m_QuestStatusSave[questid] = true;
1847 }
1848 if (CanCompleteQuest(questid))
1849 CompleteQuest(questid);
1850 else
1852 }
1853 }
1854 }
1856}

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 
)
1859{
1860 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1861 {
1862 uint32 questid = GetQuestSlotQuestId(i);
1863 if (!questid)
1864 continue;
1865
1866 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1867 if (!qInfo)
1868 continue;
1869
1871 continue;
1872
1873 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
1874 {
1875 uint32 reqitem = qInfo->RequiredItemId[j];
1876 if (reqitem == entry)
1877 {
1878 QuestStatusData& q_status = m_QuestStatus[questid];
1879 uint32 reqitemcount = qInfo->RequiredItemCount[j];
1880 uint16 curitemcount = q_status.ItemCount[j];
1881
1882 if (q_status.ItemCount[j] >= reqitemcount) // we may have more than what the status shows
1883 curitemcount = GetItemCount(entry, false);
1884
1885 uint16 newItemCount = (count > curitemcount) ? 0 : curitemcount - count;
1886 newItemCount = std::min<uint16>(newItemCount, reqitemcount);
1887 if (newItemCount != q_status.ItemCount[j])
1888 {
1889 q_status.ItemCount[j] = newItemCount;
1890 m_QuestStatusSave[questid] = true;
1891 IncompleteQuest(questid);
1892 }
1893 }
1894 }
1895 }
1897}
void IncompleteQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:640

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)
4895{
4896 m_channels.push_back(c);
4897}

References m_channels.

Referenced by Channel::JoinChannel().

◆ KillCreditGO()

void Player::KillCreditGO ( uint32  entry,
ObjectGuid  guid = ObjectGuid::Empty 
)
2041{
2042 uint16 addCastCount = 1;
2043 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2044 {
2045 uint32 questid = GetQuestSlotQuestId(i);
2046 if (!questid)
2047 continue;
2048
2049 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2050 if (!qInfo)
2051 continue;
2052
2053 QuestStatusData& q_status = m_QuestStatus[questid];
2054
2055 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2056 {
2057 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL)*/)
2058 {
2059 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
2060 {
2061 uint32 reqTarget = 0;
2062
2063 // GO activate objective
2064 if (qInfo->RequiredNpcOrGo[j] < 0)
2065 // checked at quest_template loading
2066 reqTarget = - qInfo->RequiredNpcOrGo[j];
2067
2068 // other not this creature/GO related objectives
2069 if (reqTarget != entry)
2070 continue;
2071
2072 uint32 reqCastCount = qInfo->RequiredNpcOrGoCount[j];
2073 uint16 curCastCount = q_status.CreatureOrGOCount[j];
2074 if (curCastCount < reqCastCount)
2075 {
2076 q_status.CreatureOrGOCount[j] = curCastCount + addCastCount;
2077
2078 m_QuestStatusSave[questid] = true;
2079
2080 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curCastCount, addCastCount);
2081 }
2082
2083 if (CanCompleteQuest(questid))
2084 CompleteQuest(questid);
2085 else
2087
2088 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
2089 break;
2090 }
2091 }
2092 }
2093 }
2094}
void SendQuestUpdateAddCreatureOrGo(Quest const *quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count)
Definition: PlayerQuest.cpp:2440

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 
)
1900{
1901 ASSERT(cInfo);
1902
1903 if (cInfo->Entry)
1904 KilledMonsterCredit(cInfo->Entry, guid);
1905
1906 for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i)
1907 if (cInfo->KillCredit[i])
1908 KilledMonsterCredit(cInfo->KillCredit[i]);
1909}
#define MAX_KILL_CREDIT
Definition: CreatureData.h:34
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition: PlayerQuest.cpp:1911

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 
)
1912{
1913 uint16 addkillcount = 1;
1914 uint32 real_entry = entry;
1915 if (guid)
1916 {
1917 Creature* killed = GetMap()->GetCreature(guid);
1918 if (killed && killed->GetEntry())
1919 real_entry = killed->GetEntry();
1920 }
1921
1922 StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_CREATURE, real_entry); // MUST BE CALLED FIRST
1923 UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, real_entry, addkillcount, guid ? GetMap()->GetCreature(guid) : nullptr);
1924
1925 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1926 {
1927 uint32 questid = GetQuestSlotQuestId(i);
1928 if (!questid)
1929 continue;
1930
1931 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1932 if (!qInfo)
1933 continue;
1934 // just if !ingroup || !noraidgroup || raidgroup
1935 // xinef: or is pvp quest, and player in BG/BF group
1936 QuestStatusData& q_status = m_QuestStatus[questid];
1937 if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty()) ||
1938 (qInfo->IsPVPQuest() && (GetGroup()->isBFGroup() || GetGroup()->isBGGroup()))))
1939 {
1940 if (!sScriptMgr->PassedQuestKilledMonsterCredit(this, qInfo, entry, real_entry, guid))
1941 continue;
1942
1943 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST)*/)
1944 {
1945 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
1946 {
1947 // skip GO activate objective or none
1948 if (qInfo->RequiredNpcOrGo[j] <= 0)
1949 continue;
1950
1951 uint32 reqkill = qInfo->RequiredNpcOrGo[j];
1952
1953 if (reqkill == real_entry)
1954 {
1955 uint32 reqkillcount = qInfo->RequiredNpcOrGoCount[j];
1956 uint16 curkillcount = q_status.CreatureOrGOCount[j];
1957 if (curkillcount < reqkillcount)
1958 {
1959 q_status.CreatureOrGOCount[j] = curkillcount + addkillcount;
1960
1961 m_QuestStatusSave[questid] = true;
1962
1963 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curkillcount, addkillcount);
1964 }
1965 if (CanCompleteQuest(questid))
1966 CompleteQuest(questid);
1967 else
1969
1970 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
1971 break;
1972 }
1973 }
1974 }
1975 }
1976 }
1977}
@ ACHIEVEMENT_TIMED_TYPE_CREATURE
Definition: DBCEnums.h:120
@ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE
Definition: DBCEnums.h:128
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:215
Creature * GetCreature(ObjectGuid const guid)
Definition: Map.cpp:3293
bool IsPVPQuest() const
Definition: QuestDef.h:292

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(), Spell::EffectKillCreditPersonal(), 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::spell_q10612_10613_the_fel_and_the_furious_SpellScript::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_corkis_prison::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)
1980{
1981 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1982 {
1983 uint32 questid = GetQuestSlotQuestId(i);
1984 if (!questid)
1985 {
1986 continue;
1987 }
1988
1989 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1990 if (!qInfo)
1991 {
1992 continue;
1993 }
1994
1995 // just if !ingroup || !noraidgroup || raidgroup
1996 QuestStatusData& q_status = m_QuestStatus[questid];
1997 if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty())))
1998 {
1999 // 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)
2000 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL) && (qInfo->GetZoneOrSort() >= 0 && GetZoneId() == uint32(qInfo->GetZoneOrSort())))
2001 {
2002 KilledPlayerCreditForQuest(count, qInfo);
2003 break; // there is only one quest per zone
2004 }
2005 }
2006 }
2007}
void KilledPlayerCreditForQuest(uint16 count, Quest const *quest)
Definition: PlayerQuest.cpp:2009
int32 GetZoneOrSort() const
Definition: QuestDef.h:227

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 
)
2010{
2011 uint32 const questId = quest->GetQuestId();
2012
2013 auto it = m_QuestStatus.find(questId);
2014 if (it == m_QuestStatus.end())
2015 {
2016 return;
2017 }
2018
2019 QuestStatusData& questStatus = it->second;
2020
2021 uint16 curKill = questStatus.PlayerCount;
2022 uint32 reqKill = quest->GetPlayersSlain();
2023
2024 if (curKill < reqKill)
2025 {
2026 count = std::min<uint16>(reqKill - curKill, count);
2027 questStatus.PlayerCount = curKill + count;
2028
2029 m_QuestStatusSave[quest->GetQuestId()] = true;
2030
2031 SendQuestUpdateAddPlayer(quest, curKill, count);
2032 }
2033
2034 if (CanCompleteQuest(questId))
2035 {
2036 CompleteQuest(questId);
2037 }
2038}
void SendQuestUpdateAddPlayer(Quest const *quest, uint16 old_count, uint16 add_count)
Definition: PlayerQuest.cpp:2463

References CanCompleteQuest(), CompleteQuest(), Quest::GetPlayersSlain(), Quest::GetQuestId(), m_QuestStatus, m_QuestStatusSave, QuestStatusData::PlayerCount, and SendQuestUpdateAddPlayer().

Referenced by KilledPlayerCredit().

◆ KillPlayer()

void Player::KillPlayer ( )
4453{
4454 if (IsFlying() && !GetTransport())
4456
4458
4459 StopMirrorTimers(); //disable timers(bars)
4460
4462 //SetUnitFlag(UNIT_FLAG_NOT_IN_PVP);
4463
4466
4467 // 6 minutes until repop at graveyard
4469
4470 UpdateCorpseReclaimDelay(); // dependent at use SetDeathPvP() call before kill
4471
4472 int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
4473
4474 if (corpseReclaimDelay >= 0)
4475 SendCorpseReclaimDelay(corpseReclaimDelay);
4476
4477 // don't create corpse at this moment, player might be falling
4478
4479 // update visibility
4480 //UpdateObjectVisibility(); // pussywizard: not needed
4481}
@ PLAYER_FIELD_BYTE_RELEASE_TIMER
Definition: Player.h:561
@ MOVE_ROOT
Definition: Player.h:457
@ CORPSE
Definition: Unit.h:318
@ SPELL_AURA_PREVENT_RESURRECTION
Definition: SpellAuraDefines.h:377
@ UNIT_DYNFLAG_NONE
Definition: SharedDefines.h:3092
void ApplyModFlag(uint16 index, uint32 flag, bool apply)
Definition: Object.cpp:899
void UpdateCorpseReclaimDelay()
Definition: PlayerUpdates.cpp:1880
void setDeathState(DeathState s, bool despawn=false) override
Definition: Player.cpp:1006
void ReplaceAllDynamicFlags(uint32 flag) override
Definition: Unit.h:1326
MotionMaster * GetMotionMaster()
Definition: Unit.h:2262
bool IsFlying() const
Definition: Unit.h:2385
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
Definition: MotionMaster.cpp:545

References Object::ApplyModFlag(), CalculateCorpseReclaimDelay(), CORPSE, 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, StopMirrorTimers(), UNIT_DYNFLAG_NONE, and UpdateCorpseReclaimDelay().

Referenced by WorldSession::HandleMovementOpcodes(), WorldSession::HandleRepopRequestOpcode(), WorldSession::LogoutPlayer(), and Update().

◆ LearnCustomSpells()

void Player::LearnCustomSpells ( )
11733{
11734 if (!sWorld->getBoolConfig(CONFIG_START_CUSTOM_SPELLS))
11735 {
11736 return;
11737 }
11738
11739 // learn default race/class spells
11740 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
11741 ASSERT(info);
11742 for (PlayerCreateInfoSpells::const_iterator itr = info->customSpells.begin(); itr != info->customSpells.end(); ++itr)
11743 {
11744 uint32 tspell = *itr;
11745 LOG_DEBUG("entities.player.loading", "Player::LearnCustomSpells: Player '{}' ({}, Class: {} Race: {}): Adding initial spell (SpellID: {})",
11746 GetName(), GetGUID().ToString(), uint32(getClass()), uint32(getRace()), tspell);
11747 if (!IsInWorld()) // will send in INITIAL_SPELLS in list anyway at map add
11748 {
11749 addSpell(tspell, SPEC_MASK_ALL, true);
11750 }
11751 else // but send in normal spell in game learn case
11752 {
11753 learnSpell(tspell);
11754 }
11755 }
11756}
@ CONFIG_START_CUSTOM_SPELLS
Definition: IWorld.h:129
PlayerCreateInfoSpells customSpells
Definition: Player.h:349

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 
)
11773{
11774 SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(skillId, getRace(), getClass());
11775 if (!rcInfo)
11776 return;
11777
11778 LOG_DEBUG("entities.player.loading", "PLAYER (Class: {} Race: {}): Adding initial skill, id = {}", uint32(getClass()), uint32(getRace()), skillId);
11779 switch (GetSkillRangeType(rcInfo))
11780 {
11782 SetSkill(skillId, 0, 300, 300);
11783 break;
11784 case SKILL_RANGE_LEVEL:
11785 {
11786 uint16 skillValue = 1;
11787 uint16 maxValue = GetMaxSkillValueForLevel();
11788 if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL) && !IsProfessionOrRidingSkill(skillId))
11789 {
11790 skillValue = maxValue;
11791 }
11792 else if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
11793 {
11794 skillValue = maxValue;
11795 }
11796 else if (getClass() == CLASS_DEATH_KNIGHT)
11797 {
11798 skillValue = std::min(std::max<uint16>({ 1, uint16((GetLevel() - 1) * 5) }), maxValue);
11799 }
11800 else if (skillId == SKILL_FIST_WEAPONS)
11801 {
11802 skillValue = std::max<uint16>(1, GetSkillValue(SKILL_UNARMED));
11803 }
11804 else if (skillId == SKILL_LOCKPICKING)
11805 {
11806 skillValue = std::max<uint16>(1, GetSkillValue(SKILL_LOCKPICKING));
11807 }
11808
11809 SetSkill(skillId, 0, skillValue, maxValue);
11810 break;
11811 }
11812 case SKILL_RANGE_MONO:
11813 SetSkill(skillId, 0, 1, 1);
11814 break;
11815 case SKILL_RANGE_RANK:
11816 {
11817 if (!rank)
11818 {
11819 break;
11820 }
11821
11822 SkillTiersEntry const* tier = sSkillTiersStore.LookupEntry(rcInfo->SkillTierID);
11823 uint16 maxValue = tier->Value[std::max<int32>(rank - 1, 0)];
11824 uint16 skillValue = 1;
11825 if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
11826 {
11827 skillValue = maxValue;
11828 }
11829 else if (getClass() == CLASS_DEATH_KNIGHT)
11830 {
11831 skillValue = std::min(std::max<uint16>({ uint16(1), uint16((GetLevel() - 1) * 5) }), maxValue);
11832 }
11833
11834 SetSkill(skillId, rank, skillValue, maxValue);
11835 break;
11836 }
11837 default:
11838 break;
11839 }
11840}
@ SKILL_RANGE_RANK
Definition: ObjectMgr.h:682
bool IsProfessionOrRidingSkill(uint32 skill)
Definition: SpellMgr.h:616
@ SKILL_FLAG_ALWAYS_MAX_VALUE
Definition: DBCEnums.h:391
uint32 SkillTierID
Definition: DBCStructure.h:1549
uint32 Flags
Definition: DBCStructure.h:1547
uint32 Value[MAX_SKILL_STEP]
Definition: DBCStructure.h:1591

References CLASS_DEATH_KNIGHT, CONFIG_ALWAYS_MAXSKILL, SkillRaceClassInfoEntry::Flags, Unit::getClass(), Unit::GetLevel(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), GetSkillValue(), 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 ( )
11759{
11760 // learn default race/class skills
11761 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
11762 for (PlayerCreateInfoSkills::const_iterator itr = info->skills.begin(); itr != info->skills.end(); ++itr)
11763 {
11764 uint32 skillId = itr->SkillId;
11765 if (HasSkill(skillId))
11766 continue;
11767
11768 LearnDefaultSkill(skillId, itr->Rank);
11769 }
11770}
PlayerCreateInfoSkills skills
Definition: Player.h:352

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 
)
13960{
13961 Pet* pet = GetPet();
13962
13963 if (!pet)
13964 return;
13965
13966 if (petGuid != pet->GetGUID())
13967 return;
13968
13969 uint32 CurTalentPoints = pet->GetFreeTalentPoints();
13970
13971 if (CurTalentPoints == 0)
13972 return;
13973
13974 if (talentRank >= MAX_PET_TALENT_RANK)
13975 return;
13976
13977 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
13978
13979 if (!talentInfo)
13980 return;
13981
13982 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
13983
13984 if (!talentTabInfo)
13985 return;
13986
13987 CreatureTemplate const* ci = pet->GetCreatureTemplate();
13988
13989 if (!ci)
13990 return;
13991
13992 CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
13993
13994 if (!pet_family)
13995 return;
13996
13997 if (pet_family->petTalentType < 0) // not hunter pet
13998 return;
13999
14000 // prevent learn talent for different family (cheating)
14001 if (!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
14002 return;
14003
14004 // find current max talent rank (0~5)
14005 uint8 curtalent_maxrank = 0; // 0 = not learned any rank
14006 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
14007 {
14008 if (talentInfo->RankID[rank] && pet->HasSpell(talentInfo->RankID[rank]))
14009 {
14010 curtalent_maxrank = (rank + 1);
14011 break;
14012 }
14013 }
14014
14015 // we already have same or higher talent rank learned
14016 if (curtalent_maxrank >= (talentRank + 1))
14017 return;
14018
14019 // check if we have enough talent points
14020 if (CurTalentPoints < (talentRank - curtalent_maxrank + 1))
14021 return;
14022
14023 // Check if it requires another talent
14024 if (talentInfo->DependsOn > 0)
14025 {
14026 if (TalentEntry const* depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
14027 {
14028 bool hasEnoughRank = false;
14029 for (uint8 rank = talentInfo->DependsOnRank; rank < MAX_TALENT_RANK; rank++)
14030 {
14031 if (depTalentInfo->RankID[rank] != 0)
14032 if (pet->HasSpell(depTalentInfo->RankID[rank]))
14033 hasEnoughRank = true;
14034 }
14035 if (!hasEnoughRank)
14036 return;
14037 }
14038 }
14039
14040 // Find out how many points we have in this field
14041 uint32 spentPoints = 0;
14042
14043 uint32 tTab = talentInfo->TalentTab;
14044 if (talentInfo->Row > 0)
14045 {
14046 uint32 numRows = sTalentStore.GetNumRows();
14047 for (uint32 i = 0; i < numRows; ++i) // Loop through all talents.
14048 {
14049 // Someday, someone needs to revamp
14050 const TalentEntry* tmpTalent = sTalentStore.LookupEntry(i);
14051 if (tmpTalent) // the way talents are tracked
14052 {
14053 if (tmpTalent->TalentTab == tTab)
14054 {
14055 for (uint8 rank = 0; rank < MAX_TALENT_RANK; rank++)
14056 {
14057 if (tmpTalent->RankID[rank] != 0)
14058 {
14059 if (pet->HasSpell(tmpTalent->RankID[rank]))
14060 {
14061 spentPoints += (rank + 1);
14062 }
14063 }
14064 }
14065 }
14066 }
14067 }
14068 }
14069
14070 // not have required min points spent in talent tree
14071 if (spentPoints < (talentInfo->Row * MAX_PET_TALENT_RANK))
14072 return;
14073
14074 // spell not set in talent.dbc
14075 uint32 spellid = talentInfo->RankID[talentRank];
14076 if (spellid == 0)
14077 {
14078 LOG_ERROR("entities.player", "Talent.dbc have for talent: {} Rank: {} spell id = 0", talentId, talentRank);
14079 return;
14080 }
14081
14082 // already known
14083 if (pet->HasSpell(spellid))
14084 return;
14085
14086 // learn! (other talent ranks will unlearned at learning)
14087 pet->learnSpell(spellid);
14088 LOG_DEBUG("entities.player", "PetTalentID: {} Rank: {} Spell: {}\n", talentId, talentRank, spellid);
14089
14090 // update free talent points
14091 pet->SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1));
14092}
#define MAX_PET_TALENT_RANK
Definition: DBCStructure.h:1895
void SetFreeTalentPoints(uint8 points)
Definition: Pet.h:131
bool learnSpell(uint32 spell_id)
Definition: Pet.cpp:1874
uint32 Row
Definition: DBCStructure.h:1902
uint32 DependsOnRank
Definition: DBCStructure.h:1908
uint32 DependsOn
Definition: DBCStructure.h:1906

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 ( )
11875{
11876 // learn spells received from quest completing
11877 for (RewardedQuestSet::const_iterator itr = m_RewardedQuests.begin(); itr != m_RewardedQuests.end(); ++itr)
11878 {
11879 Quest const* quest = sObjectMgr->GetQuestTemplate(*itr);
11880 if (!quest)
11881 continue;
11882
11884 }
11885}

References learnQuestRewardedSpells(), m_RewardedQuests, and sObjectMgr.

Referenced by _LoadQuestStatusRewarded(), learn_commandscript::HandleLearnAllDefaultCommand(), learnQuestRewardedSpells(), and resetSpells().

◆ learnQuestRewardedSpells() [2/2]

void Player::learnQuestRewardedSpells ( Quest const *  quest)
11843{
11844 // xinef: quest does not learn anything
11845 int32 spellId = quest->GetRewSpellCast();
11846 if (!spellId)
11847 return;
11848
11849 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
11850 if (!spellInfo)
11851 return;
11852
11853 // xinef: find effect with learn spell and check if we have this spell
11854 bool found = false;
11855 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
11856 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && spellInfo->Effects[i].TriggerSpell && !HasSpell(spellInfo->Effects[i].TriggerSpell))
11857 {
11858 // pusywizard: don't re-add profession specialties!
11859 if (SpellInfo const* triggeredInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
11860 if (triggeredInfo->Effects[0].Effect == SPELL_EFFECT_TRADE_SKILL)
11861 break; // pussywizard: break and not cast the spell (found is false)
11862
11863 found = true;
11864 break;
11865 }
11866
11867 // xinef: we know the spell, return
11868 if (!found)
11869 return;
11870
11871 CastSpell(this, spellId, true);
11872}
@ SPELL_EFFECT_TRADE_SKILL
Definition: SharedDefines.h:797

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 
)
11888{
11889 uint32 raceMask = getRaceMask();
11890 uint32 classMask = getClassMask();
11891 for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j)
11892 {
11893 SkillLineAbilityEntry const* pAbility = sSkillLineAbilityStore.LookupEntry(j);
11894 if (!pAbility || pAbility->SkillLine != skill_id)
11895 {
11896 continue;
11897 }
11898
11899 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pAbility->Spell);
11900 if (!spellInfo)
11901 {
11902 continue;
11903 }
11904
11906 {
11907 continue;
11908 }
11909
11910 // Check race if set
11911 if (pAbility->RaceMask && !(pAbility->RaceMask & raceMask))
11912 {
11913 continue;
11914 }
11915
11916 // Check class if set
11917 if (pAbility->ClassMask && !(pAbility->ClassMask & classMask))
11918 {
11919 continue;
11920 }
11921
11922 // need unlearn spell
11923 if (skill_value < pAbility->MinSkillLineRank && pAbility->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE)
11924 {
11925 removeSpell(pAbility->Spell, GetActiveSpec(), true);
11926 }
11927 // need learn
11928 else
11929 {
11930 //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
11932 {
11933 bool skipCurrent = false;
11934 auto bounds = sSpellMgr->GetSkillLineAbilityMapBounds(pAbility->SupercededBySpell);
11935 for (auto itr = bounds.first; itr != bounds.second; ++itr)
11936 {
11937 if (itr->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && skill_value >= itr->second->MinSkillLineRank)
11938 {
11939 skipCurrent = true;
11940 break;
11941 }
11942 }
11943 if (skipCurrent)
11944 {
11945 continue;
11946 }
11947 }
11948
11949 if (!IsInWorld())
11950 {
11951 addSpell(pAbility->Spell, SPEC_MASK_ALL, true, true);
11952 }
11953 else
11954 {
11955 learnSpell(pAbility->Spell, true, true);
11956 }
11957 }
11958 }
11959}
DBCStorage< SkillLineAbilityEntry > sSkillLineAbilityStore(SkillLineAbilityfmt)
@ SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE
Definition: DBCEnums.h:365
Definition: DBCStructure.h:1571
uint32 SkillLine
Definition: DBCStructure.h:1573
uint32 SupercededBySpell
Definition: DBCStructure.h:1580
uint32 Spell
Definition: DBCStructure.h:1574
uint32 AcquireMethod
Definition: DBCStructure.h:1581
uint32 ClassMask
Definition: DBCStructure.h:1576
uint32 RaceMask
Definition: DBCStructure.h:1575

References SkillLineAbilityEntry::AcquireMethod, addSpell(), SkillLineAbilityEntry::ClassMask, GetActiveSpec(), Unit::getClassMask(), Unit::getRaceMask(), Object::IsInWorld(), learnSpell(), SkillLineAbilityEntry::RaceMask, removeSpell(), SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN, SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE, SkillLineAbilityEntry::SkillLine, SPEC_MASK_ALL, SkillLineAbilityEntry::Spell, sSkillLineAbilityStore, sSpellMgr, and SkillLineAbilityEntry::SupercededBySpell.

Referenced by _LoadSkills(), SetSkill(), and UpdateSkillPro().

◆ learnSpell()

void Player::learnSpell ( uint32  spellId,
bool  temporary = false,
bool  learnFromSkill = false 
)
3231{
3232 // Xinef: don't allow to learn active spell once more
3233 if (HasActiveSpell(spellId))
3234 {
3235 LOG_DEBUG("entities.player", "Player ({}) tries to learn already active spell: {}", GetGUID().ToString(), spellId);
3236 return;
3237 }
3238
3239 uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spellId);
3240 bool thisSpec = GetTalentSpellCost(firstRankSpellId) > 0 || sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId);
3241 bool added = addSpell(spellId, thisSpec ? GetActiveSpecMask() : SPEC_MASK_ALL, true, temporary, learnFromSkill);
3242 if (added)
3243 {
3244 sScriptMgr->OnPlayerLearnSpell(this, spellId);
3245
3246 // pussywizard: a system message "you have learnt spell X (rank Y)"
3247 if (IsInWorld())
3248 SendLearnPacket(spellId, true);
3249 }
3250
3251 // pussywizard: rank stuff at the end!
3252 if (uint32 nextSpell = sSpellMgr->GetNextSpellInChain(spellId))
3253 {
3254 // 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)
3255 // pussywizard: next ranks must not be in current spec (otherwise no need to learn already learnt)
3256 PlayerSpellMap::iterator itr = m_spells.find(nextSpell);
3257 if (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && !itr->second->IsInSpec(m_activeSpec))
3258 learnSpell(nextSpell, temporary);
3259 }
3260
3261 // 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
3262 SpellsRequiringSpellMapBounds spellsRequiringSpell = sSpellMgr->GetSpellsRequiringSpellBounds(spellId);
3263 for (SpellsRequiringSpellMap::const_iterator itr = spellsRequiringSpell.first; itr != spellsRequiringSpell.second; ++itr)
3264 {
3265 PlayerSpellMap::iterator itr2 = m_spells.find(itr->second);
3266 if (itr2 != m_spells.end() && itr2->second->State != PLAYERSPELL_REMOVED && !itr2->second->IsInSpec(m_activeSpec))
3267 learnSpell(itr2->first, temporary);
3268 }
3269}
uint32 GetTalentSpellCost(uint32 spellId)
Definition: DBCStores.cpp:679

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)
13547{
13548 learnSpell(spellid);
13549
13550 if (uint32 next = sSpellMgr->GetNextSpellInChain(spellid))
13551 learnSpellHighRank(next);
13552}
void learnSpellHighRank(uint32 spellid)
Definition: Player.cpp:13546

References learnSpell(), learnSpellHighRank(), and sSpellMgr.

Referenced by learnSpellHighRank().

◆ LearnTalent()

void Player::LearnTalent ( uint32  talentId,
uint32  talentRank,
bool  command = false 
)
13824{
13825 uint32 CurTalentPoints = GetFreeTalentPoints();
13826
13827 if (!command)
13828 {
13829 // xinef: check basic data
13830 if (!CurTalentPoints)
13831 {
13832 return;
13833 }
13834
13835 if (talentRank >= MAX_TALENT_RANK)
13836 {
13837 return;
13838 }
13839 }
13840
13841 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
13842 if (!talentInfo)
13843 return;
13844
13845 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
13846 if (!talentTabInfo)
13847 return;
13848
13849 // xinef: prevent learn talent for different class (cheating)
13850 if ((getClassMask() & talentTabInfo->ClassMask) == 0)
13851 return;
13852
13853 // xinef: find current talent rank
13854 uint32 currentTalentRank = 0;
13855 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
13856 {
13857 if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], GetActiveSpec()))
13858 {
13859 currentTalentRank = rank + 1;
13860 break;
13861 }
13862 }
13863
13864 // xinef: we already have same or higher rank talent learned
13865 if (currentTalentRank >= talentRank + 1)
13866 return;
13867
13868 uint32 talentPointsChange = (talentRank - currentTalentRank + 1);
13869 if (!command)
13870 {
13871 // xinef: check if we have enough free talent points
13872 if (CurTalentPoints < talentPointsChange)
13873 {
13874 return;
13875 }
13876 }
13877
13878 // xinef: check if talent deponds on another talent
13879 if (talentInfo->DependsOn > 0)
13880 if (TalentEntry const* depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
13881 {
13882 bool hasEnoughRank = false;
13883 for (uint8 rank = talentInfo->DependsOnRank; rank < MAX_TALENT_RANK; rank++)
13884 {
13885 if (depTalentInfo->RankID[rank] != 0)
13886 if (HasTalent(depTalentInfo->RankID[rank], GetActiveSpec()))
13887 {
13888 hasEnoughRank = true;
13889 break;
13890 }
13891 }
13892
13893 // xinef: does not have enough talent points spend in required talent
13894 if (!hasEnoughRank)
13895 return;
13896 }
13897
13898 if (!command)
13899 {
13900 // xinef: check amount of points spent in current talent tree
13901 // xinef: be smart and quick
13902 uint32 spentPoints = 0;
13903 if (talentInfo->Row > 0)
13904 {
13905 const PlayerTalentMap& talentMap = GetTalentMap();
13906 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
13907 if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first))
13908 if (TalentEntry const* itrTalentInfo = sTalentStore.LookupEntry(talentPos->talent_id))
13909 if (itrTalentInfo->TalentTab == talentInfo->TalentTab)
13910 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec())) // pussywizard
13911 spentPoints += talentPos->rank + 1;
13912 }
13913
13914 // xinef: we do not have enough talent points to add talent of this tier
13915 if (spentPoints < (talentInfo->Row * MAX_TALENT_RANK))
13916 return;
13917 }
13918
13919 // xinef: hacking attempt, tries to learn unknown rank
13920 uint32 spellId = talentInfo->RankID[talentRank];
13921 if (spellId == 0)
13922 return;
13923
13924 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
13925 if (!spellInfo)
13926 return;
13927
13928 bool learned = false;
13929
13930 // xinef: if talent info has special marker in dbc - add to spell book
13931 if (talentInfo->addToSpellBook)
13932 if (!spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
13933 {
13934 learnSpell(spellId);
13935 learned = true;
13936 }
13937
13938 if (!learned)
13939 SendLearnPacket(spellId, true);
13940
13941 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13942 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
13943 if (sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
13944 learnSpell(spellInfo->Effects[i].TriggerSpell);
13945
13946 addTalent(spellId, GetActiveSpecMask(), currentTalentRank);
13947
13948 // xinef: update free talent points count
13949 m_usedTalentCount += talentPointsChange;
13950
13951 if (!command)
13952 {
13953 SetFreeTalentPoints(CurTalentPoints - talentPointsChange);
13954 }
13955
13956 sScriptMgr->OnPlayerLearnTalents(this, talentId, talentRank, spellId);
13957}
uint32 ClassMask
Definition: DBCStructure.h:1922

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
10075{
10076 // xinef: sync query
10078 stmt->SetData(0, guid.GetCounter());
10079 PreparedQueryResult result = CharacterDatabase.Query(stmt);
10080
10081 if (!result)
10082 return;
10083
10084 do
10085 {
10086 Field* fields = result->Fetch();
10087 uint32 arenaTeamId = fields[0].Get<uint32>();
10088 if (arenaTeamId != 0)
10089 {
10090 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
10091 if (arenaTeam)
10092 arenaTeam->DelMember(guid, true);
10093 }
10094 } while (result->NextRow());
10095}
@ 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)
11217{
11218 if (!bg)
11219 bg = GetBattleground();
11220
11221 if (!bg)
11222 return;
11223
11224 // Deserter tracker - leave BG
11225 if (bg->isBattleground() && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN))
11226 {
11227 if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS))
11228 {
11230 stmt->SetData(0, GetGUID().GetCounter());
11232 CharacterDatabase.Execute(stmt);
11233 }
11234 sScriptMgr->OnBattlegroundDesertion(this, BG_DESERTION_TYPE_LEAVE_BG);
11235 }
11236
11237 bg->RemovePlayerAtLeave(this);
11238
11239 // xinef: reset corpse reclaim time
11241
11242 // Remove all dots
11246
11247 // pussywizard: clear movement, because after porting player will move to arena cords
11249 StopMoving();
11251}
@ CHAR_INS_DESERTER_TRACK
Definition: CharacterDatabase.h:496
@ BG_DESERTION_TYPE_LEAVE_BG
Definition: Battleground.h:50
@ STATUS_WAIT_JOIN
Definition: Battleground.h:196
@ 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
@ CONFIG_BATTLEGROUND_TRACK_DESERTERS
Definition: IWorld.h:120
virtual void RemovePlayerAtLeave(Player *player)
Definition: Battleground.cpp:934
bool isBattleground() const
Definition: Battleground.h:389
BattlegroundStatus GetStatus() const
Definition: Battleground.h:322
bool TeleportToEntryPoint()
Definition: Player.cpp:1578
void StopMoving()
Definition: Unit.cpp:16824
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)
4900{
4901 m_channels.remove(c);
4902}

References m_channels.

Referenced by Channel::KickOrBan(), Channel::LeaveChannel(), and UpdateLocalChannels().

◆ LoadActions()

void Player::LoadActions ( PreparedQueryResult  result)
15156{
15157 if (result)
15158 _LoadActions(result);
15159
15161}
void _LoadActions(PreparedQueryResult result)
Definition: PlayerStorage.cpp:5695

References _LoadActions(), and SendActionButtons().

◆ LoadCorpse()

void Player::LoadCorpse ( PreparedQueryResult  result)
5837{
5839 SpawnCorpseBones(false);
5840
5841 if (!IsAlive())
5842 {
5843 if (result && !HasAtLoginFlag(AT_LOGIN_RESURRECT))
5844 {
5845 Field* fields = result->Fetch();
5846 _corpseLocation.WorldRelocate(fields[0].Get<uint16>(), fields[1].Get<float>(), fields[2].Get<float>(), fields[3].Get<float>(), fields[4].Get<float>());
5848 }
5849 else
5850 ResurrectPlayer(0.5f);
5851 }
5852
5854}
void RemoveAtLoginFlag(AtLoginFlags flags, bool persist=false)
Definition: Player.cpp:14520
bool HasAtLoginFlag(AtLoginFlags f) const
Definition: Player.h:2352
void ResurrectPlayer(float restore_percent, bool applySickness=false)
Definition: Player.cpp:4375

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 
)
4946{
4948 //QueryResult* result = CharacterDatabase.Query("SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags, "
4949 // 17 18 19 20 21 22 23 24 25 26 27 28 29
4950 //"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, "
4951 // 30 31 32 33 34 35 36 37 38 39 40 41 42 43
4952 //"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, "
4953 // 44 45 46 47 48 49 50 51 52 53 54
4954 //"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, "
4955 // 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
4956 //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles,
4957 // 70 71 72
4958 //"actionBars, grantableLevels, innTriggerId FROM characters WHERE guid = '{}'", guid);
4959 PreparedQueryResult result = holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM);
4960
4961 if (!result)
4962 {
4963 LOG_ERROR("entities.player", "Player ({}) not found in table `characters`, can't load. ", playerGuid.ToString());
4964 return false;
4965 }
4966
4967 Field* fields = result->Fetch();
4968
4969 uint32 dbAccountId = fields[1].Get<uint32>();
4970
4971 // check if the character's account in the db and the logged in account match.
4972 // player should be able to load/delete character only with correct account!
4973 if (dbAccountId != GetSession()->GetAccountId())
4974 {
4975 LOG_ERROR("entities.player", "Player ({}) loading from wrong account (is: {}, should be: {})", playerGuid.ToString(), GetSession()->GetAccountId(), dbAccountId);
4976 return false;
4977 }
4978
4979 if (holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BANNED))
4980 {
4981 LOG_ERROR("entities.player", "Player ({}) is banned, can't load.", playerGuid.ToString());
4982 return false;
4983 }
4984
4985 ObjectGuid::LowType guid = playerGuid.GetCounter();
4986
4987 Object::_Create(guid, 0, HighGuid::Player);
4988
4989 m_name = fields[2].Get<std::string>();
4990
4991 // check name limitations
4993 (AccountMgr::IsPlayerAccount(GetSession()->GetSecurity()) && (sObjectMgr->IsReservedName(m_name) || sObjectMgr->IsProfanityName(m_name))))
4994 {
4996 stmt->SetData(0, uint16(AT_LOGIN_RENAME));
4997 stmt->SetData(1, guid);
4998 CharacterDatabase.Execute(stmt);
4999 return false;
5000 }
5001
5002 uint8 Gender = fields[5].Get<uint8>();
5003 if (!IsValidGender(Gender))
5004 {
5005 LOG_ERROR("entities.player", "Player (GUID: {}) has wrong gender ({}), can't be loaded.", guid, Gender);
5006 return false;
5007 }
5008
5009 // overwrite some data fields
5010 uint32 bytes0 = 0;
5011 bytes0 |= fields[3].Get<uint8>(); // race
5012 bytes0 |= fields[4].Get<uint8>() << 8; // class
5013 bytes0 |= Gender << 16; // gender
5015
5016 m_realRace = fields[3].Get<uint8>(); // set real race
5017 m_race = fields[3].Get<uint8>(); // set real race
5018
5019 SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].Get<uint8>());
5020 SetUInt32Value(PLAYER_XP, fields[7].Get<uint32>());
5021
5022 if (!_LoadIntoDataField(fields[66].Get<std::string>(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE))
5023 {
5024 LOG_WARN("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid exploredzones data ({}). Forcing partial load.", guid, fields[66].Get<std::string_view>());
5025 }
5026
5027 if (!_LoadIntoDataField(fields[69].Get<std::string>(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE * 2))
5028 {
5029 LOG_WARN("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid knowntitles mask ({}). Forcing partial load.", guid, fields[69].Get<std::string_view>());
5030 }
5031
5032 SetObjectScale(1.0f);
5034
5035 // load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateAchievementCriteria)
5037
5038 uint32 money = fields[8].Get<uint32>();
5039 if (money > MAX_MONEY_AMOUNT)
5040 money = MAX_MONEY_AMOUNT;
5041 SetMoney(money);
5042
5043 SetByteValue(PLAYER_BYTES, 0, fields[9].Get<uint8>());
5044 SetByteValue(PLAYER_BYTES, 1, fields[10].Get<uint8>());
5045 SetByteValue(PLAYER_BYTES, 2, fields[11].Get<uint8>());
5046 SetByteValue(PLAYER_BYTES, 3, fields[12].Get<uint8>());
5047 SetByteValue(PLAYER_BYTES_2, 0, fields[13].Get<uint8>());
5048 SetByteValue(PLAYER_BYTES_2, 2, fields[14].Get<uint8>());
5049 SetByteValue(PLAYER_BYTES_2, 3, fields[15].Get<uint8>());
5050 SetByteValue(PLAYER_BYTES_3, 0, fields[5].Get<uint8>());
5051 SetByteValue(PLAYER_BYTES_3, 1, fields[54].Get<uint8>());
5052 ReplaceAllPlayerFlags((PlayerFlags)fields[16].Get<uint32>());
5053 SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, fields[53].Get<uint32>());
5054
5055 SetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES, fields[52].Get<uint64>());
5056
5057 SetUInt32Value(PLAYER_AMMO_ID, fields[68].Get<uint32>());
5058
5059 // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise)
5060 SetByteValue(PLAYER_FIELD_BYTES, 2, fields[70].Get<uint8>());
5061
5063
5064 // cleanup inventory related item value fields (its will be filled correctly in _LoadInventory)
5065 for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
5066 {
5068 SetVisibleItemSlot(slot, nullptr);
5069
5070 delete m_items[slot];
5071 m_items[slot] = nullptr;
5072 }
5073
5074 LOG_DEBUG("entities.player.loading", "Load Basic value of player {} is: ", m_name);
5076
5077 //Need to call it to initialize m_team (m_team can be calculated from race)
5078 //Other way is to saves m_team into characters table.
5080
5081 // pussywizard: create empty instance bind containers if necessary
5082 sInstanceSaveMgr->PlayerCreateBoundInstancesMaps(playerGuid);
5083
5084 // load home bind and check in same time class/race pair, it used later for restore broken positions
5085 if (!_LoadHomeBind(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_HOME_BIND)))
5086 return false;
5087
5088 InitPrimaryProfessions(); // to max set before any spell loaded
5089
5090 // init saved position, and fix it later if problematic
5091 int32 transLowGUID = fields[35].Get<int32>();
5092 Relocate(fields[17].Get<float>(), fields[18].Get<float>(), fields[19].Get<float>(), fields[21].Get<float>());
5093 uint32 mapId = fields[20].Get<uint16>();
5094 uint32 instanceId = fields[63].Get<uint32>();
5095
5096 uint32 dungeonDiff = fields[43].Get<uint8>() & 0x0F;
5097 if (dungeonDiff >= MAX_DUNGEON_DIFFICULTY)
5098 dungeonDiff = DUNGEON_DIFFICULTY_NORMAL;
5099 uint32 raidDiff = (fields[43].Get<uint8>() >> 4) & 0x0F;
5100 if (raidDiff >= MAX_RAID_DIFFICULTY)
5102 SetDungeonDifficulty(Difficulty(dungeonDiff)); // may be changed in _LoadGroup
5103 SetRaidDifficulty(Difficulty(raidDiff)); // may be changed in _LoadGroup
5104
5105 std::string taxi_nodes = fields[42].Get<std::string>();
5106
5107 auto RelocateToHomebind = [this, &mapId, &instanceId]() { mapId = m_homebindMapId; instanceId = 0; Relocate(m_homebindX, m_homebindY, m_homebindZ, m_homebindO); };
5108
5109 _LoadGroup();
5110
5112
5113 SetArenaPoints(fields[44].Get<uint32>());
5114
5115 SetHonorPoints(fields[45].Get<uint32>());
5116 SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, fields[46].Get<uint32>());
5117 SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, fields[47].Get<uint32>());
5118 SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[48].Get<uint32>());
5119 SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[49].Get<uint16>());
5120 SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[50].Get<uint16>());
5121
5124
5125 GetSession()->SetPlayer(this);
5126 MapEntry const* mapEntry = sMapStore.LookupEntry(mapId);
5127
5128 Map* map = nullptr;
5129
5130 // pussywizard: group changed difficulty when player was offline, teleport to the enterance of new difficulty
5131 if (mapEntry && ((mapEntry->IsNonRaidDungeon() && dungeonDiff != GetDungeonDifficulty()) || (mapEntry->IsRaid() && raidDiff != GetRaidDifficulty())))
5132 {
5133 bool fixed = false;
5134 if (uint32 destInstId = sInstanceSaveMgr->PlayerGetDestinationInstanceId(this, mapId, GetDifficulty(mapEntry->IsRaid())))
5135 {
5136 instanceId = destInstId;
5137 if (AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId))
5138 {
5139 Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
5140 fixed = true;
5141 }
5142 }
5143 if (!fixed)
5144 {
5145 RelocateToHomebind();
5146 mapEntry = sMapStore.LookupEntry(mapId);
5147 }
5148 }
5149
5150 if (!mapEntry || !IsPositionValid())
5151 {
5152 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());
5153 RelocateToHomebind();
5154 }
5155 // Player was saved in Arena or Bg
5156 else if (mapEntry->IsBattlegroundOrArena())
5157 {
5158 // xinef: resurrect player, cant log in dead without corpse
5159 {
5162 if (!IsAlive())
5163 ResurrectPlayer(1.0f);
5164 }
5165
5166 const WorldLocation& _loc = GetEntryPoint();
5167 mapId = _loc.GetMapId();
5168 instanceId = 0;
5169
5170 if (mapId == MAPID_INVALID)
5171 {
5172 RelocateToHomebind();
5173 }
5174 else
5175 {
5176 Relocate(&_loc);
5177
5178 // xinef: restore taxi flight from entry point data
5180 {
5184 }
5185 }
5186 }
5187 // currently we do not support transport in bg
5188 else if (transLowGUID != 0)
5189 {
5190 // transLowGUID > 0 ---> motion transport guid
5191 // transLowGUID < 0 ---> static transport spawn id
5192 Transport* transGO = nullptr;
5193 if (transLowGUID > 0)
5194 {
5195 ObjectGuid transGUID = ObjectGuid::Create<HighGuid::Mo_Transport>(transLowGUID);
5196 transGO = HashMapHolder<MotionTransport>::Find(transGUID);
5197 }
5198 else
5199 {
5200 map = sMapMgr->CreateMap(mapId, this);
5201 if (map)
5202 {
5203 auto bounds = map->GetGameObjectBySpawnIdStore().equal_range(std::abs(transLowGUID));
5204 if (bounds.first != bounds.second)
5205 transGO = bounds.first->second->ToTransport();
5206 }
5207 }
5208
5209 // 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
5210 if (transGO && transGO->IsInWorld() && transGO->FindMap())
5211 m_transport = transGO;
5212
5213 if (m_transport)
5214 {
5215 float x = fields[31].Get<float>(), y = fields[32].Get<float>(), z = fields[33].Get<float>(), o = fields[34].Get<float>();
5219
5220 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)
5221 {
5222 m_transport = nullptr;
5225 RelocateToHomebind();
5226 }
5227 else
5228 {
5229 Relocate(x, y, z, o);
5230 mapId = m_transport->GetMapId();
5233 }
5234 }
5235 else
5236 {
5237 bool fixed = false;
5238 if (mapEntry->Instanceable())
5239 if (AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId))
5240 {
5241 fixed = true;
5242 Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
5243 }
5244 if (!fixed)
5245 RelocateToHomebind();
5246 }
5247 }
5248 // currently we do not support taxi in instance
5249 else if (!taxi_nodes.empty())
5250 {
5251 instanceId = 0;
5252 if (!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes, GetTeamId(true)))
5253 {
5254 // xinef: could no load valid data for taxi, relocate to homebind and clear
5256 RelocateToHomebind();
5257 }
5258 }
5259
5260 // Map could be changed before
5261 mapEntry = sMapStore.LookupEntry(mapId);
5262 // client without expansion support
5263 if (mapEntry)
5264 {
5265 if (GetSession()->Expansion() < mapEntry->Expansion())
5266 {
5267 LOG_DEBUG("entities.player.loading", "Player {} using client without required expansion tried login at non accessible map {}", GetName(), mapId);
5268 RelocateToHomebind();
5269 }
5270
5271 // check whether player was unbound or is bound to another instance
5272 if (instanceId)
5273 {
5274 InstanceSave* save = sInstanceSaveMgr->PlayerGetInstanceSave(GetGUID(), mapId, GetDifficulty(mapEntry->IsRaid()));
5275 if (!save || save->GetInstanceId() != instanceId)
5276 instanceId = 0;
5277 }
5278 }
5279
5280 // if the player is in an instance and it has been reset in the meantime teleport him to the entrance
5281 if ((instanceId && !sInstanceSaveMgr->GetInstanceSave(instanceId) && !mapEntry->IsBattlegroundOrArena()) || (!instanceId && mapEntry->IsDungeon()))
5282 {
5283 AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId);
5284 if (at)
5286 else
5287 RelocateToHomebind();
5288 }
5289
5290 // NOW player must have valid map
5291 // load the player's map here if it's not already loaded
5292 if (!map)
5293 map = sMapMgr->CreateMap(mapId, this);
5294
5295 if (!map)
5296 {
5297 instanceId = 0;
5298 AreaTriggerTeleport const* at = sObjectMgr->GetGoBackTrigger(mapId);
5299 if (at)
5300 {
5301 LOG_ERROR("entities.player", "Player (guidlow {}) is teleported to gobacktrigger (Map: {} X: {} Y: {} Z: {} O: {}).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5303 mapId = at->target_mapId;
5304 }
5305 else
5306 {
5307 LOG_ERROR("entities.player", "Player (guidlow {}) is teleported to home (Map: {} X: {} Y: {} Z: {} O: {}).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5308 RelocateToHomebind();
5309 }
5310
5311 map = sMapMgr->CreateMap(mapId, this);
5312 if (!map)
5313 {
5314 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
5315 mapId = info->mapId;
5316 Relocate(info->positionX, info->positionY, info->positionZ, 0.0f);
5317 LOG_ERROR("entities.player", "Player (guidlow {}) have invalid coordinates (X: {} Y: {} Z: {} O: {}). Teleport to default race/class locations.", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5318 map = sMapMgr->CreateMap(mapId, this);
5319 if (!map)
5320 {
5321 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());
5322 return false;
5323 }
5324 }
5325 }
5326
5327 SetMap(map);
5329
5331
5333
5334 time_t now = GameTime::GetGameTime().count();
5335 time_t logoutTime = time_t(fields[27].Get<uint32>());
5336
5337 // since last logout (in seconds)
5338 uint32 time_diff = uint32(now - logoutTime); //uint64 is excessive for a time_diff in seconds.. uint32 allows for 136~ year difference.
5339
5340 // randomize first save time in range [CONFIG_INTERVAL_SAVE] around [CONFIG_INTERVAL_SAVE]
5341 // this must help in case next save after mass player load after server startup
5342 m_nextSave = urand(m_nextSave / 2, m_nextSave * 3 / 2);
5343
5344 // set value, including drunk invisibility detection
5345 // calculate sobering. after 15 minutes logged out, the player will be sober again
5346 uint8 newDrunkValue = 0;
5347 if (time_diff < uint32(GetDrunkValue()) * 9)
5348 newDrunkValue = GetDrunkValue() - time_diff / 9;
5349
5350 SetDrunkValue(newDrunkValue);
5351
5352 m_cinematic = fields[23].Get<uint8>();
5353 m_Played_time[PLAYED_TIME_TOTAL] = fields[24].Get<uint32>();
5354 m_Played_time[PLAYED_TIME_LEVEL] = fields[25].Get<uint32>();
5355
5356 m_resetTalentsCost = fields[29].Get<uint32>();
5357 m_resetTalentsTime = time_t(fields[30].Get<uint32>());
5358
5359 m_taxi.LoadTaxiMask(fields[22].Get<std::string_view>()); // must be before InitTaxiNodesForLevel
5360
5361 uint32 extraflags = fields[36].Get<uint16>();
5362
5363 _LoadPetStable(fields[37].Get<uint8>(), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS));
5364
5365 m_atLoginFlags = fields[38].Get<uint16>();
5366
5368 {
5369 LOG_ERROR("entities.player", "Player {} tried to login while forced to rename, can't load.'", GetGUID().ToString());
5370 return false;
5371 }
5372
5373 // Honor system
5374 // Update Honor kills data
5375 m_lastHonorUpdateTime = logoutTime;
5377
5378 m_deathExpireTime = time_t(fields[41].Get<uint32>());
5379
5382
5383 // clear channel spell data (if saved at channel spell casting)
5386
5387 // clear charm/summon related fields
5394
5396
5397 // reset some aura modifiers before aura apply
5400
5401 // make sure the unit is considered not in duel for proper loading
5404
5405 // reset stats before loading any modifiers
5409 InitRunes();
5410
5411 sScriptMgr->OnPlayerLoadFromDB(this);
5412
5413 // make sure the unit is considered out of combat for proper loading
5414 ClearInCombat();
5415
5416 // rest bonus can only be calculated after InitStatsForLevel()
5417 _restBonus = fields[26].Get<float>();
5418
5419 if (time_diff > 0)
5420 {
5421 //speed collect rest bonus in offline, in logout, far from tavern, city (section/in hour)
5422 float bubble0 = 0.031f;
5423 //speed collect rest bonus in offline, in logout, in tavern, city (section/in hour)
5424 float bubble1 = 0.125f;
5425 float bubble = fields[28].Get<uint8>() > 0
5426 ? bubble1 * sWorld->getRate(RATE_REST_OFFLINE_IN_TAVERN_OR_CITY)
5427 : bubble0 * sWorld->getRate(RATE_REST_OFFLINE_IN_WILDERNESS);
5428
5429 // Client automatically doubles the value sent so we have to divide it by 2
5430 SetRestBonus(GetRestBonus() + time_diff * ((float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 144000)*bubble);
5431 }
5432
5433 uint32 innTriggerId = fields[72].Get<uint32>();
5434 if (innTriggerId)
5435 {
5436 SetRestFlag(REST_FLAG_IN_TAVERN, innTriggerId);
5437 }
5438
5439 // load skills after InitStatsForLevel because it triggering aura apply also
5440 _LoadSkills(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SKILLS));
5441 UpdateSkillsForLevel(); //update skills after load, to make sure they are correctly update at player load
5442
5443 // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
5444
5445 m_specsCount = fields[64].Get<uint8>();
5446 m_activeSpec = fields[65].Get<uint8>();
5447
5450
5451 _LoadSpells(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS));
5452 _LoadTalents(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS));
5453
5454 _LoadGlyphs(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GLYPHS));
5456 _LoadAuras(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURAS), time_diff);
5457 // add ghost flag (must be after aura load: PLAYER_FLAGS_GHOST set in aura)
5459 {
5462 }
5463
5464 // pussywizard: remove auras that are removed at map change (after _LoadAuras)
5466
5467 // after spell load, learn rewarded spell if need also
5468 _LoadQuestStatus(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS));
5474 _LoadRandomBGStatus(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG));
5475
5476 // after spell and quest load
5478
5479 // must be before inventory (some items required reputation check)
5481
5482 // xinef: load mails before inventory, so problematic items can be added to already loaded mails
5483 _LoadMail(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAILS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS));
5484
5485 _LoadInventory(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INVENTORY), time_diff);
5486
5487 // update items with duration and realtime
5488 UpdateItemDuration(time_diff, true);
5489
5490 _LoadActions(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACTIONS));
5491
5492 m_social = sSocialMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST), GetGUID());
5493
5494 // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES
5495 // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded
5496 uint32 curTitle = fields[51].Get<uint32>();
5497 if (curTitle && !HasTitle(curTitle))
5498 curTitle = 0;
5499
5501
5502 // has to be called after last Relocate() in Player::LoadFromDB
5504
5506
5507 // Spell code allow apply any auras to dead character in load time in aura/spell/item loading
5508 // Do now before stats re-calculation cleanup for ghost state unexpected auras
5509 if (!IsAlive())
5511 else
5513
5514 //apply all stat bonuses from items and auras
5515 SetCanModifyStats(true);
5517
5518 // restore remembered power/health values (but not more max values)
5519 uint32 savedHealth = fields[55].Get<uint32>();
5520 SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth);
5521 for (uint8 i = 0; i < MAX_POWERS; ++i)
5522 {
5523 uint32 savedPower = fields[56 + i].Get<uint32>();
5524 SetPower(Powers(i), savedPower > GetMaxPower(Powers(i)) ? GetMaxPower(Powers(i)) : savedPower);
5525 }
5526
5527 LOG_DEBUG("entities.player.loading", "The value of player {} after load item and aura is: ", m_name);
5529
5530 // GM state
5532 {
5533 switch (sWorld->getIntConfig(CONFIG_GM_LOGIN_STATE))
5534 {
5535 default:
5536 case 0:
5537 break; // disable
5538 case 1:
5539 SetGameMaster(true);
5540 break; // enable
5541 case 2: // save state
5542 if (extraflags & PLAYER_EXTRA_GM_ON)
5543 SetGameMaster(true);
5544 break;
5545 }
5546
5547 switch (sWorld->getIntConfig(CONFIG_GM_VISIBLE_STATE))
5548 {
5549 default:
5550 case 0:
5551 SetGMVisible(false);
5552 break; // invisible
5553 case 1:
5554 break; // visible
5555 case 2: // save state
5556 if (extraflags & PLAYER_EXTRA_GM_INVISIBLE)
5557 SetGMVisible(false);
5558 break;
5559 }
5560
5561 switch (sWorld->getIntConfig(CONFIG_GM_CHAT))
5562 {
5563 default:
5564 case 0:
5565 break; // disable
5566 case 1:
5567 SetGMChat(true);
5568 break; // enable
5569 case 2: // save state
5570 if (extraflags & PLAYER_EXTRA_GM_CHAT)
5571 SetGMChat(true);
5572 break;
5573 }
5574
5575 switch (sWorld->getIntConfig(CONFIG_GM_WHISPERING_TO))
5576 {
5577 default:
5578 case 0:
5579 break; // disable
5580 case 1:
5581 SetAcceptWhispers(true);
5582 break; // enable
5583 case 2: // save state
5584 if (extraflags & PLAYER_EXTRA_ACCEPT_WHISPERS)
5585 SetAcceptWhispers(true);
5586 break;
5587 }
5588 }
5589
5590 // RaF stuff.
5591 m_grantableLevels = fields[71].Get<uint8>();
5592 if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0))
5594
5595 if (m_grantableLevels > 0)
5597
5599
5600 //m_achievementMgr->CheckAllAchievementCriteria(); // pussywizard: disabled this
5601
5603
5605
5607
5608 // Players are immune to taunt
5611
5612 // Init charm info
5614
5615 // Fix aurastate auras, depending on health!
5616 // Set aurastate manualy, prevents aura switching
5617 if (HealthBelowPct(20))
5619 if (HealthBelowPct(35))
5621 if (HealthAbovePct(75))
5623
5624 // unapply aura stats if dont meet requirements
5625 AuraApplicationMap const& Auras = GetAppliedAuras();
5626 for (AuraApplicationMap::const_iterator itr = Auras.begin(); itr != Auras.end(); ++itr)
5627 {
5628 // we assume that all auras are applied now, aurastate was modfied MANUALY preventing any apply/unapply state switching
5629 Aura* aura = itr->second->GetBase();
5630 SpellInfo const* m_spellInfo = aura->GetSpellInfo();
5634 continue;
5635
5636 if (!HasAuraState((AuraStateType)m_spellInfo->CasterAuraState))
5637 aura->HandleAllEffects(itr->second, AURA_EFFECT_HANDLE_REAL, false);
5638 }
5639 return true;
5640}
@ CHAR_UPD_ADD_AT_LOGIN_FLAG
Definition: CharacterDatabase.h:274
@ 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:807
@ PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS
Definition: Player.h:869
@ PLAYER_LOGIN_QUERY_LOAD_GLYPHS
Definition: Player.h:875
@ PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES
Definition: Player.h:870
@ PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW
Definition: Player.h:882
@ PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS
Definition: Player.h:861
@ PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS
Definition: Player.h:888
@ PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES
Definition: Player.h:883
@ PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS
Definition: Player.h:884
@ PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST
Definition: Player.h:867
@ PLAYER_LOGIN_QUERY_LOAD_ACTIONS
Definition: Player.h:864
@ PLAYER_LOGIN_QUERY_LOAD_SKILLS
Definition: Player.h:878
@ PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS
Definition: Player.h:866
@ PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS
Definition: Player.h:889
@ PLAYER_LOGIN_QUERY_LOAD_INVENTORY
Definition: Player.h:863
@ PLAYER_LOGIN_QUERY_LOAD_REPUTATION
Definition: Player.h:862
@ PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH
Definition: Player.h:886
@ PLAYER_LOGIN_QUERY_LOAD_FROM
Definition: Player.h:857
@ PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS
Definition: Player.h:860
@ PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT
Definition: Player.h:874
@ PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS
Definition: Player.h:879
@ PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS
Definition: Player.h:885
@ PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS
Definition: Player.h:873
@ PLAYER_LOGIN_QUERY_LOAD_MAILS
Definition: Player.h:865
@ PLAYER_LOGIN_QUERY_LOAD_AURAS
Definition: Player.h:858
@ PLAYER_LOGIN_QUERY_LOAD_TALENTS
Definition: Player.h:876
@ PLAYER_LOGIN_QUERY_LOAD_BANNED
Definition: Player.h:881
@ PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS
Definition: Player.h:872
@ PLAYER_LOGIN_QUERY_LOAD_HOME_BIND
Definition: Player.h:868
@ PLAYER_LOGIN_QUERY_LOAD_SPELLS
Definition: Player.h:859
@ PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG
Definition: Player.h:880
@ PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS
Definition: Player.h:871
@ MOVEMENTFLAG_ONTRANSPORT
Definition: Unit.h:561
@ UNIT_FLAG2_FORCE_MOVEMENT
Definition: Unit.h:494
@ DEAD
Definition: Unit.h:319
@ UNIT_STATE_ISOLATED
Definition: Unit.h:338
@ SPELL_AURA_SPIRIT_OF_REDEMPTION
Definition: SpellAuraDefines.h:239
@ SPELL_AURA_MOD_TAUNT
Definition: SpellAuraDefines.h:74
@ AURA_INTERRUPT_FLAG_CHANGE_MAP
Definition: SpellDefines.h:63
@ CONFIG_GM_CHAT
Definition: IWorld.h:255
@ CONFIG_GM_WHISPERING_TO
Definition: IWorld.h:256
@ CONFIG_GM_LOGIN_STATE
Definition: IWorld.h:252
@ CONFIG_GM_VISIBLE_STATE
Definition: IWorld.h:253
@ RATE_REST_OFFLINE_IN_WILDERNESS
Definition: IWorld.h:493
@ RATE_REST_OFFLINE_IN_TAVERN_OR_CITY
Definition: IWorld.h:492
#define MAX_RAID_DIFFICULTY
Definition: DBCEnums.h:287
#define MAX_DUNGEON_DIFFICULTY
Definition: DBCEnums.h:286
@ SPELL_EFFECT_ATTACK_ME
Definition: SharedDefines.h:864
@ CHAR_NAME_SUCCESS
Definition: SharedDefines.h:3391
@ UNIT_DYNFLAG_REFER_A_FRIEND
Definition: SharedDefines.h:3099
@ IMMUNITY_STATE
Definition: SharedDefines.h:1367
@ IMMUNITY_EFFECT
Definition: SharedDefines.h:1366
bool IsValidMapCoord(float c)
Definition: GridDefines.h:216
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult)
Definition: AchievementMgr.cpp:611
Transport * ToTransport()
Definition: GameObject.h:325
virtual void SetDynamicFlag(uint32 flag)
Definition: Object.h:117
bool _LoadIntoDataField(std::string const &data, uint32 startOffset, uint32 count)
Definition: Object.cpp:612
void RemoveMovementFlag(uint32 flag)
Definition: Object.h:321
struct MovementInfo::TransportInfo transport
void Reset()
Definition: Object.h:275
ObjectGuid guid
Definition: Object.h:284
Position pos
Definition: Object.h:285
Transport * m_transport
Definition: Object.h:639
bool IsPositionValid() const
Definition: Position.cpp:175
void ClearTaxiPath()
Definition: Player.h:1041
bool HasTaxiPath() const
Definition: Player.h:1042
void _LoadDeclinedNames(PreparedQueryResult result)
Definition: PlayerStorage.cpp:4811
void _LoadGlyphs(PreparedQueryResult result)
Definition: Player.cpp:14838
void SetRestFlag(RestFlag restFlag, uint32 triggerId=0)
Definition: Player.cpp:16031
void SetGameMaster(bool on)
Definition: Player.cpp:2177
void _LoadQuestStatusRewarded(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6336
void _LoadAuras(PreparedQueryResult result, uint32 timediff)
Definition: PlayerStorage.cpp:5721
void _LoadSeasonalQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6444
void _LoadGroup()
Definition: PlayerStorage.cpp:6502
void _LoadCharacterSettings(PreparedQueryResult result)
Definition: PlayerSettings.cpp:26
void _LoadTalents(PreparedQueryResult result)
Definition: Player.cpp:14887
void SetFallInformation(uint32 time, float z)
Definition: Player.h:2285
void _LoadPetStable(uint8 petStableSlots, PreparedQueryResult result)
Definition: Player.cpp:15700
void _LoadBrewOfTheMonth(PreparedQueryResult result)
Definition: Player.cpp:15663
WorldLocation const & GetEntryPoint() const
Definition: Player.h:2327
void outDebugValues() const
Definition: PlayerStorage.cpp:7799
void _LoadRandomBGStatus(PreparedQueryResult result)
Definition: Player.cpp:15598
void SaveRecallPosition()
Definition: Player.cpp:5564
void _LoadQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6249
void _LoadMonthlyQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6467
void SetGMChat(bool on)
Definition: Player.h:1139
void _LoadArenaTeamInfo()
Definition: PlayerStorage.cpp:4822
bool _LoadHomeBind(PreparedQueryResult result)
Definition: PlayerStorage.cpp:7003
void UpdateItemDuration(uint32 time, bool realtimeonly=false)
Definition: PlayerStorage.cpp:4173
void _LoadSpells(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6489
void _LoadSkills(PreparedQueryResult result)
Definition: Player.cpp:13554
void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult)
Definition: PlayerStorage.cpp:6176
void _LoadWeeklyQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6422
void SetGMVisible(bool on)
Definition: Player.cpp:2246
void PrepareCharmAISpells()
Definition: Player.cpp:15294
void _LoadGlyphAuras()
Definition: PlayerStorage.cpp:5804
void ReplaceAllPlayerFlags(PlayerFlags flags)
Definition: Player.h:1093
void _LoadEquipmentSets(PreparedQueryResult result)
Definition: PlayerStorage.cpp:4853
void _LoadEntryPointData(PreparedQueryResult result)
Definition: PlayerStorage.cpp:4884
void _LoadInstanceTimeRestrictions(PreparedQueryResult result)
Definition: Player.cpp:15651
void StoreRaidMapDifficulty()
Definition: Player.h:1876
void _LoadInventory(PreparedQueryResult result, uint32 timeDiff)
Definition: PlayerStorage.cpp:5856
void UpdateHonorFields()
Definition: PlayerUpdates.cpp:1138
void _LoadSpellCooldowns(PreparedQueryResult result)
Definition: Player.cpp:3526
void SetMoney(uint32 value)
Definition: Player.h:1577
void _LoadDailyQuestStatus(PreparedQueryResult result)
Definition: PlayerStorage.cpp:6371
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:1446
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition: Unit.cpp:13300
void RemoveAllAurasRequiringDeadTarget()
Definition: Unit.cpp:5292
DeathState m_deathState
Definition: Unit.h:2490
void RemoveAllAurasOnDeath()
Definition: Unit.cpp:5269
void AddUnitState(uint32 f)
Definition: Unit.h:1397
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:1444
void AddUnitMovementFlag(uint32 f)
Definition: Unit.h:2272
void RemoveUnitFlag2(UnitFlags2 flags)
Definition: Unit.h:1488
void SetOwnerGUID(ObjectGuid owner)
Definition: Unit.cpp:10533
void ClearInCombat()
Definition: Unit.cpp:13714
void SetCreatorGUID(ObjectGuid creator)
Definition: Unit.h:1817
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition: Unit.cpp:5096
static T * Find(ObjectGuid guid)
Definition: ObjectAccessor.cpp:58
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:8355
uint32 GetInstanceId() const
Definition: InstanceSaveMgr.h:61
GameObjectBySpawnIdContainer & GetGameObjectBySpawnIdStore()
Definition: Map.h:521
void LoadFromDB(PreparedQueryResult result)
Definition: ReputationMgr.cpp:561
void SetPlayer(Player *player)
Definition: WorldSession.cpp:1289
bool IsARecruiter() const
Definition: WorldSession.h:525
uint32 CasterAuraState
Definition: SpellInfo.h:337
bool IsNonRaidDungeon() const
Definition: DBCStructure.h:1335
uint32 Expansion() const
Definition: DBCStructure.h:1332
bool IsBattlegroundOrArena() const
Definition: DBCStructure.h:1340
bool IsDungeon() const
Definition: DBCStructure.h:1334
bool IsRaid() const
Definition: DBCStructure.h:1337
bool Instanceable() const
Definition: DBCStructure.h:1336

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, DEAD, 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_grantableLevels, m_homebindMapId, m_homebindO, 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_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(), 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(), Object::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 ( )
6238{
6239 //fixme: the pet should still be loaded if the player is not in world
6240 // just not added to the map
6241 if (m_petStable && IsInWorld())
6242 {
6243 Pet* pet = new Pet(this);
6244 if (!pet->LoadPetFromDB(this, 0, 0, true))
6245 delete pet;
6246 }
6247}
bool LoadPetFromDB(Player *owner, uint32 petEntry, uint32 petnumber, bool current, uint32 healthPct=0)
Definition: Pet.cpp:207

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
4902{
4904 stmt->SetData(0, guid);
4905 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4906
4907 if (!result)
4908 return false;
4909
4910 Field* fields = result->Fetch();
4911
4912 x = fields[0].Get<float>();
4913 y = fields[1].Get<float>();
4914 z = fields[2].Get<float>();
4915 o = fields[3].Get<float>();
4916 mapid = fields[4].Get<uint16>();
4917 in_flight = !fields[5].Get<std::string>().empty();
4918
4919 return true;
4920}
@ 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.

6187{
6188 int32 newValue = int32(GetArenaPoints()) + value;
6189 if (newValue < 0)
6190 newValue = 0;
6191 SetArenaPoints(uint32(newValue));
6192
6193 if (trans)
6194 {
6196 stmt->SetData(0, newValue);
6197 stmt->SetData(1, GetGUID().GetCounter());
6198 trans->Append(stmt);
6199 }
6200}
@ CHAR_UDP_CHAR_ARENA_POINTS
Definition: CharacterDatabase.h:422

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) 
)
6171{
6172 int32 newValue = int32(GetHonorPoints()) + value;
6173 if (newValue < 0)
6174 newValue = 0;
6175 SetHonorPoints(uint32(newValue));
6176
6177 if (trans)
6178 {
6180 stmt->SetData(0, newValue);
6181 stmt->SetData(1, GetGUID().GetCounter());
6182 trans->Append(stmt);
6183 }
6184}
@ CHAR_UDP_CHAR_HONOR_POINTS
Definition: CharacterDatabase.h:420

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 
)
11410{
11411 if (!amount)
11412 return true;
11413
11414 sScriptMgr->OnPlayerMoneyChanged(this, amount);
11415
11416 if (amount < 0)
11417 SetMoney (GetMoney() > uint32(-amount) ? GetMoney() + amount : 0);
11418 else
11419 {
11420 if (GetMoney() < uint32(MAX_MONEY_AMOUNT - amount))
11421 SetMoney(GetMoney() + amount);
11422 else
11423 {
11424 if (sendError)
11425 SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, nullptr, nullptr);
11426 return false;
11427 }
11428 }
11429
11430 return true;
11431}
@ EQUIP_ERR_TOO_MUCH_GOLD
Definition: Item.h:117

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 
)
5212{
5213 SkillStatusMap::const_iterator itr = mSkillStatus.find(skillid);
5214 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5215 return;
5216
5217 uint32 bonusIndex = PLAYER_SKILL_BONUS_INDEX(itr->second.pos);
5218
5219 uint32 bonus_val = GetUInt32Value(bonusIndex);
5220 int16 temp_bonus = SKILL_TEMP_BONUS(bonus_val);
5221 int16 perm_bonus = SKILL_PERM_BONUS(bonus_val);
5222
5223 if (talent) // permanent bonus stored in high part
5224 SetUInt32Value(bonusIndex, MAKE_SKILL_BONUS(temp_bonus, perm_bonus + val));
5225 else // temporary/item bonus stored in low part
5226 SetUInt32Value(bonusIndex, MAKE_SKILL_BONUS(temp_bonus + val, perm_bonus));
5227}
#define MAKE_SKILL_BONUS(t, p)
Definition: Player.h:89

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

Referenced by AuraEffect::HandleAuraModSkill().

◆ ModifySpellCooldown()

void Player::ModifySpellCooldown ( uint32  spellId,
int32  cooldown 
)
10989{
10990 SpellCooldowns::iterator itr = m_spellCooldowns.find(spellId);
10991 if (itr == m_spellCooldowns.end())
10992 return;
10993
10994 itr->second.end += cooldown;
10995
10996 WorldPacket data(SMSG_MODIFY_COOLDOWN, 4 + 8 + 4);
10997 data << uint32(spellId); // Spell ID
10998 data << GetGUID(); // Player GUID
10999 data << int32(cooldown); // Cooldown mod in milliseconds
11000 GetSession()->SendPacket(&data);
11001}
@ 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)
2156{
2157 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2158 {
2159 uint32 questid = GetQuestSlotQuestId(i);
2160 if (!questid)
2161 continue;
2162
2163 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2164 {
2165 int32 rewOrReqMoney = qInfo->GetRewOrReqMoney();
2166 if (rewOrReqMoney < 0)
2167 {
2168 QuestStatusData& q_status = m_QuestStatus[questid];
2169
2170 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2171 {
2172 if (int32(count) >= -rewOrReqMoney)
2173 {
2174 if (CanCompleteQuest(questid))
2175 {
2176 CompleteQuest(questid);
2177 }
2178 }
2179 }
2180 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2181 {
2182 if (int32(count) < -rewOrReqMoney)
2183 {
2184 IncompleteQuest(questid);
2185 }
2186 }
2187 }
2188 }
2189 }
2190}

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 
)
3007{
3008 if (Item* it = GetItemByPos(bag, slot))
3009 {
3010 ItemRemovedQuestCheck(it->GetEntry(), it->GetCount());
3011 RemoveItem(bag, slot, update);
3013 it->SetNotRefundable(this, false);
3014 it->RemoveFromUpdateQueueOf(this);
3015 if (it->IsInWorld())
3016 {
3017 it->RemoveFromWorld();
3018 it->DestroyForPlayer(this);
3019 }
3020
3021 sScriptMgr->OnAfterPlayerMoveItemFromInventory(this, it, bag, slot, update);
3022 }
3023}

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 
)
3027{
3028 // update quest counters
3029 ItemAddedQuestCheck(pItem->GetEntry(), pItem->GetCount());
3031
3032 // store item
3033 Item* pLastItem = StoreItem(dest, pItem, update);
3034
3035 // only set if not merged to existed stack (pItem can be deleted already but we can compare pointers any way)
3036 if (pLastItem == pItem)
3037 {
3038 // update owner for last item (this can be original item with wrong owner
3039 if (pLastItem->GetOwnerGUID() != GetGUID())
3040 pLastItem->SetOwnerGUID(GetGUID());
3041
3042 // if this original item then it need create record in inventory
3043 // in case trade we already have item in other player inventory
3044 pLastItem->SetState(in_characterInventoryDB ? ITEM_CHANGED : ITEM_NEW, this);
3045
3047 AddTradeableItem(pLastItem);
3048 }
3049}
ObjectGuid GetOwnerGUID() const
Definition: Item.h:225

References ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, AddTradeableItem(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Item::GetOwnerGUID(), Object::HasFlag(), ITEM_CHANGED, ITEM_FIELD_FLAG_BOP_TRADEABLE, ITEM_FIELD_FLAGS, ITEM_NEW, ItemAddedQuestCheck(), Item::SetOwnerGUID(), Item::SetState(), StoreItem(), and UpdateAchievementCriteria().

Referenced by WorldSession::HandleMailTakeItem(), and WorldSession::moveItems().

◆ MustDelayTeleport()

bool Player::MustDelayTeleport ( ) const
inlineprivate
2879{ 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
15283{
15284 if (FindMap() && FindMap()->IsBattleArena() && !IsSpectator())
15285 {
15286 Battleground* bg = ((BattlegroundMap*)FindMap())->GetBG();
15287 if (bg && bg->HaveSpectators() && bg->GetStatus() == STATUS_IN_PROGRESS && !bg->GetPlayers().empty())
15288 if (bg->GetPlayers().find(GetGUID()) != bg->GetPlayers().end())
15289 return true;
15290 }
15291 return false;
15292}
bool HaveSpectators()
Definition: Battleground.h:382
BattlegroundPlayerMap const & GetPlayers() const
Definition: Battleground.h:393
bool IsSpectator() const
Definition: Player.h:2523
Definition: Map.h:847

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
2548{ return m_NeedToSaveGlyphs; }

References m_NeedToSaveGlyphs.

Referenced by _SaveGlyphs().

◆ OCTRegenHPPerSpirit()

float Player::OCTRegenHPPerSpirit ( )
5120{
5121 uint8 level = GetLevel();
5122 uint32 pclass = getClass();
5123
5124 if (level > GT_MAX_LEVEL)
5125 level = GT_MAX_LEVEL;
5126
5127 GtOCTRegenHPEntry const* baseRatio = sGtOCTRegenHPStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5128 GtRegenHPPerSptEntry const* moreRatio = sGtRegenHPPerSptStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5129 if (!baseRatio || !moreRatio)
5130 return 0.0f;
5131
5132 // Formula from PaperDollFrame script
5133 float spirit = GetStat(STAT_SPIRIT);
5134 float baseSpirit = spirit;
5135 if (baseSpirit > 50)
5136 baseSpirit = 50;
5137 float moreSpirit = spirit - baseSpirit;
5138 float regen = baseSpirit * baseRatio->ratio + moreSpirit * moreRatio->ratio;
5139 return regen;
5140}
DBCStorage< GtRegenHPPerSptEntry > sGtRegenHPPerSptStore(GtRegenHPPerSptfmt)
DBCStorage< GtOCTRegenHPEntry > sGtOCTRegenHPStore(GtOCTRegenHPfmt)
Definition: DBCStructure.h:1073
float ratio
Definition: DBCStructure.h:1074
Definition: DBCStructure.h:1083
float ratio
Definition: DBCStructure.h:1084

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 ( )
5143{
5144 uint8 level = GetLevel();
5145 uint32 pclass = getClass();
5146
5147 if (level > GT_MAX_LEVEL)
5148 level = GT_MAX_LEVEL;
5149
5150 // GtOCTRegenMPEntry const* baseRatio = sGtOCTRegenMPStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1);
5151 GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5152 if (!moreRatio)
5153 return 0.0f;
5154
5155 // Formula get from PaperDollFrame script
5156 float spirit = GetStat(STAT_SPIRIT);
5157 float regen = spirit * moreRatio->ratio;
5158 return regen;
5159}
DBCStorage< GtRegenMPPerSptEntry > sGtRegenMPPerSptStore(GtRegenMPPerSptfmt)
Definition: DBCStructure.h:1088
float ratio
Definition: DBCStructure.h:1089

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 
)
246{
248
249 // if not same, then something funky is going on
250 if (menuId != gossipMenu.GetMenuId())
251 return;
252
253 GossipMenuItem const* item = gossipMenu.GetItem(gossipListId);
254 if (!item)
255 return;
256
257 uint32 gossipOptionId = item->OptionType;
258 ObjectGuid guid = source->GetGUID();
259
260 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && source->GetTypeId() == TYPEID_UNIT)
261 {
263 {
265
268 else
270
272 return;
273 }
274 }
275
276 if (source->GetTypeId() == TYPEID_GAMEOBJECT)
277 {
278 if (gossipOptionId > GOSSIP_OPTION_QUESTGIVER)
279 {
280 LOG_ERROR("entities.player", "Player guid {} request invalid gossip option for GameObject entry {}", GetGUID().ToString(), source->GetEntry());
281 return;
282 }
283 }
284
285 GossipMenuItemData const* menuItemData = gossipMenu.GetItemData(gossipListId);
286 if (!menuItemData)
287 return;
288
289 int32 cost = int32(item->BoxMoney);
290 if (!HasEnoughMoney(cost))
291 {
294 return;
295 }
296
297 switch (gossipOptionId)
298 {
301 {
302 if (menuItemData->GossipActionPoi)
304
305 if (menuItemData->GossipActionMenuId)
306 {
307 PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
308 SendPreparedGossip(source);
309 }
310
311 break;
312 }
314 sOutdoorPvPMgr->HandleGossipOption(this, source->ToCreature(), gossipListId);
315 break;
317 if (isDead())
318 source->ToCreature()->CastSpell(source->ToCreature(), 17251, true, nullptr, nullptr, GetGUID());
319 break;
321 PrepareQuestMenu(guid);
322 SendPreparedQuest(guid);
323 break;
326 GetSession()->SendListInventory(guid, menuItemData->GossipActionMenuId);
327 break;
329 GetSession()->SendStablePet(guid);
330 break;
333 break;
335 if (GetSpecsCount() == 1 && GetLevel() >= sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))
336 {
337 // Cast spells that teach dual spec
338 // Both are also ImplicitTarget self and must be cast by player
339 CastSpell(this, 63680, true, nullptr, nullptr, GetGUID());
340 CastSpell(this, 63624, true, nullptr, nullptr, GetGUID());
341
342 PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
343 SendPreparedGossip(source);
344 }
345 break;
349 break;
353 break;
355 GetSession()->SendTaxiMenu(source->ToCreature());
356 break;
359 SetBindPoint(guid);
360 break;
362 GetSession()->SendShowBank(guid);
363 break;
367 break;
371 break;
373 GetSession()->SendAuctionHello(guid, source->ToCreature());
374 break;
376 PrepareGossipMenu(source);
377 SendPreparedGossip(source);
378 break;
380 {
381 BattlegroundTypeId bgTypeId = sBattlegroundMgr->GetBattleMasterBG(source->GetEntry());
382
383 if (bgTypeId == BATTLEGROUND_TYPE_NONE)
384 {
385 LOG_ERROR("entities.player", "A user ({}) requested battlegroundlist from a npc who is no battlemaster", GetGUID().ToString());
386 return;
387 }
388
389 GetSession()->SendBattleGroundList(guid, bgTypeId);
390 break;
391 }
392 }
393
394 ModifyMoney(-cost);
395}
@ 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:1000
@ UNIT_NPC_FLAG_FLIGHTMASTER
Definition: Unit.h:529
@ LANG_INSTANT_FLIGHT_OFF
Definition: Language.h:1320
@ LANG_INSTANT_FLIGHT_ON
Definition: Language.h:1319
@ CONFIG_MIN_DUALSPEC_LEVEL
Definition: IWorld.h:235
BattlegroundTypeId
Definition: SharedDefines.h:3451
@ BATTLEGROUND_TYPE_NONE
Definition: SharedDefines.h:3452
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:240
void SendPointOfInterest(uint32 poiId) const
Definition: GossipDef.cpp:248
GossipMenu & GetGossipMenu()
Definition: GossipDef.h:263
Unit * ToUnit()
Definition: Object.h:200
void SendTalentWipeConfirm(ObjectGuid guid)
Definition: Player.cpp:8756
void SendPreparedGossip(WorldObject *source)
Definition: PlayerGossip.cpp:210
void SendPreparedQuest(ObjectGuid guid)
Definition: PlayerQuest.cpp:114
void ToggleInstantFlight()
Definition: PlayerGossip.cpp:438
void ResetPetTalents()
Definition: Player.cpp:8765
void PrepareQuestMenu(ObjectGuid guid)
Definition: PlayerQuest.cpp:38
void SetBindPoint(ObjectGuid guid)
Definition: Player.cpp:8749
void PrepareGossipMenu(WorldObject *source, uint32 menuId=0, bool showQuests=false)
Definition: PlayerGossip.cpp:31
NPCFlags GetNpcFlags() const
Definition: Unit.h:1645
void SendAuctionHello(ObjectGuid guid, Creature *unit)
Definition: AuctionHouseHandler.cpp:54
void SendPetitionShowList(ObjectGuid guid)
Definition: PetitionsHandler.cpp:820
void SendNotification(const char *format,...) ATTR_PRINTF(2
Definition: WorldSession.cpp:787
void SendTaxiMenu(Creature *unit)
Definition: TaxiHandler.cpp:89
void SendListInventory(ObjectGuid guid, uint32 vendorEntry=0)
Definition: ItemHandler.cpp:1039
void SendTrainerList(ObjectGuid guid)
Definition: NPCHandler.cpp:87
void SendShowBank(ObjectGuid guid)
Definition: BankHandler.cpp:191
void SendStablePet(ObjectGuid guid)
Definition: NPCHandler.cpp:483
void SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId=BATTLEGROUND_RB)
Definition: BattleGroundHandler.cpp:64
void SendTabardVendorActivate(ObjectGuid guid)
Definition: NPCHandler.cpp:65

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(), Object::GetTypeId(), 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(), Unit::isDead(), 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(), WorldSession::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(), TYPEID_GAMEOBJECT, TYPEID_UNIT, and UNIT_NPC_FLAG_FLIGHTMASTER.

Referenced by WorldSession::HandleGossipSelectOptionOpcode().

◆ outDebugValues()

void Player::outDebugValues ( ) const
protected
7800{
7801 if (!sLog->ShouldLog("entities.player", LogLevel::LOG_LEVEL_DEBUG)) // optimize disabled debug output
7802 return;
7803
7804 LOG_DEBUG("entities.player", "HP is: \t\t\t{}\t\tMP is: \t\t\t{}", GetMaxHealth(), GetMaxPower(POWER_MANA));
7805 LOG_DEBUG("entities.player", "AGILITY is: \t\t{}\t\tSTRENGTH is: \t\t{}", GetStat(STAT_AGILITY), GetStat(STAT_STRENGTH));
7806 LOG_DEBUG("entities.player", "INTELLECT is: \t\t{}\t\tSPIRIT is: \t\t{}", GetStat(STAT_INTELLECT), GetStat(STAT_SPIRIT));
7807 LOG_DEBUG("entities.player", "STAMINA is: \t\t{}", GetStat(STAT_STAMINA));
7808 LOG_DEBUG("entities.player", "Armor is: \t\t{}\t\tBlock is: \t\t{}", GetArmor(), GetFloatValue(PLAYER_BLOCK_PERCENTAGE));
7809 LOG_DEBUG("entities.player", "HolyRes is: \t\t{}\t\tFireRes is: \t\t{}", GetResistance(SPELL_SCHOOL_HOLY), GetResistance(SPELL_SCHOOL_FIRE));
7810 LOG_DEBUG("entities.player", "NatureRes is: \t\t{}\t\tFrostRes is: \t\t{}", GetResistance(SPELL_SCHOOL_NATURE), GetResistance(SPELL_SCHOOL_FROST));
7811 LOG_DEBUG("entities.player", "ShadowRes is: \t\t{}\t\tArcaneRes is: \t\t{}", GetResistance(SPELL_SCHOOL_SHADOW), GetResistance(SPELL_SCHOOL_ARCANE));
7812 LOG_DEBUG("entities.player", "MIN_DAMAGE is: \t\t{}\tMAX_DAMAGE is: \t\t{}", GetFloatValue(UNIT_FIELD_MINDAMAGE), GetFloatValue(UNIT_FIELD_MAXDAMAGE));
7813 LOG_DEBUG("entities.player", "MIN_OFFHAND_DAMAGE is: \t{}\tMAX_OFFHAND_DAMAGE is: \t{}", GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE), GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE));
7814 LOG_DEBUG("entities.player", "MIN_RANGED_DAMAGE is: \t{}\tMAX_RANGED_DAMAGE is: \t{}", GetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE), GetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE));
7815 LOG_DEBUG("entities.player", "ATTACK_TIME is: \t{}\t\tRANGE_ATTACK_TIME is: \t{}", GetAttackTime(BASE_ATTACK), GetAttackTime(RANGED_ATTACK));
7816}
#define sLog
Definition: Log.h:128
@ SPELL_SCHOOL_SHADOW
Definition: SharedDefines.h:260
@ SPELL_SCHOOL_NATURE
Definition: SharedDefines.h:258
@ SPELL_SCHOOL_FROST
Definition: SharedDefines.h:259
@ SPELL_SCHOOL_ARCANE
Definition: SharedDefines.h:261
@ SPELL_SCHOOL_FIRE
Definition: SharedDefines.h:257
uint32 GetArmor() const
Definition: Unit.h:1432

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 ( )
9367{
9368 Pet* pet = GetPet();
9369
9370 if (!pet)
9371 return;
9372
9373 LOG_DEBUG("entities.pet", "Pet Spells Groups");
9374
9375 CharmInfo* charmInfo = pet->GetCharmInfo();
9376
9377 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 1);
9378 data << pet->GetGUID();
9379 data << uint16(pet->GetCreatureTemplate()->family); // creature family (required for pet talents)
9380 data << uint32(pet->GetDuration().count());
9381 data << uint8(pet->GetReactState());
9382 data << uint8(charmInfo->GetCommandState());
9383 data << uint16(0); // Flags, mostly unknown
9384
9385 // action bar loop
9386 charmInfo->BuildActionBar(&data);
9387
9388 size_t spellsCountPos = data.wpos();
9389
9390 // spells count
9391 uint8 addlist = 0;
9392 data << uint8(addlist); // placeholder
9393
9394 if (pet->IsPermanentPetFor(this))
9395 {
9396 // spells loop
9397 for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr)
9398 {
9399 if (itr->second.state == PETSPELL_REMOVED)
9400 continue;
9401
9402 data << uint32(MAKE_UNIT_ACTION_BUTTON(itr->first, itr->second.active));
9403 ++addlist;
9404 }
9405 }
9406
9407 data.put<uint8>(spellsCountPos, addlist);
9408
9409 uint8 cooldownsCount = pet->m_CreatureSpellCooldowns.size();
9410 data << uint8(cooldownsCount);
9411
9412 uint32 curTime = GameTime::GetGameTimeMS().count();
9414
9415 for (CreatureSpellCooldowns::const_iterator itr = pet->m_CreatureSpellCooldowns.begin(); itr != pet->m_CreatureSpellCooldowns.end(); ++itr)
9416 {
9417 uint16 category = itr->second.category;
9418 uint32 cooldown = (itr->second.end > curTime) ? itr->second.end - curTime : 0;
9419
9420 data << uint32(itr->first); // spellid
9421 data << uint16(itr->second.category); // spell category
9422
9423 // send infinity cooldown in special format
9424 if (itr->second.end >= infTime)
9425 {
9426 data << uint32(1); // cooldown
9427 data << uint32(0x80000000); // category cooldown
9428 continue;
9429 }
9430
9431 data << uint32(category ? 0 : cooldown); // cooldown
9432 data << uint32(category ? cooldown : 0); // category cooldown
9433 }
9434
9435 GetSession()->SendPacket(&data);
9436}
@ PETSPELL_REMOVED
Definition: PetDefines.h:60
#define MAKE_UNIT_ACTION_BUTTON(A, T)
Definition: Unit.h:1038
CreatureSpellCooldowns m_CreatureSpellCooldowns
Definition: Creature.h:243
bool IsPermanentPetFor(Player *owner) const
Definition: Pet.cpp:2238
Milliseconds GetDuration() const
Definition: Pet.h:90
PetSpellMap m_spells
Definition: Pet.h:120

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 ( )
9439{
9440 Unit* charm = GetCharm();
9441 if (!charm)
9442 return;
9443
9444 CharmInfo* charmInfo = charm->GetCharmInfo();
9445
9446 if (!charmInfo)
9447 {
9448 LOG_ERROR("entities.player", "Player::PossessSpellInitialize(): charm ({}) has no charminfo!", charm->GetGUID().ToString());
9449 return;
9450 }
9451
9452 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 1);
9453 data << charm->GetGUID();
9454 data << uint16(0);
9455 data << uint32(0);
9456 data << uint32(0);
9457
9458 charmInfo->BuildActionBar(&data);
9459
9460 data << uint8(0); // spells count
9461 data << uint8(0); // cooldowns count
9462
9463 GetSession()->SendPacket(&data);
9464}
Unit * GetCharm() const
Definition: Unit.cpp:10626

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 ( )
15295{
15296 for (int i = 0; i < NUM_CAI_SPELLS; ++i)
15297 m_charmAISpells[i] = 0;
15298
15299 uint32 damage_type[4] = {0, 0, 0, 0};
15300 uint32 periodic_damage = 0;
15301
15302 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
15303 {
15304 if (itr->second->State == PLAYERSPELL_REMOVED || !itr->second->Active || !itr->second->IsInSpec(GetActiveSpec()))
15305 continue;
15306
15307 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
15308 if (!spellInfo)
15309 continue;
15310
15311 if (!spellInfo->SpellFamilyName || spellInfo->IsPassive() || spellInfo->NeedsComboPoints() || (spellInfo->Stances && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED)))
15312 continue;
15313
15314 float cast = spellInfo->CalcCastTime() / 1000.0f;
15315 if (cast > 3.0f)
15316 continue;
15317
15318 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
15319 {
15320 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
15321 {
15322 int32 dmg = CalculateSpellDamage(this, spellInfo, i);
15323 uint8 offset = 0;
15324 if (cast)
15325 {
15326 dmg = dmg / cast;
15327 offset = 2;
15328 }
15329
15330 if ((int32)damage_type[offset] < dmg)
15331 {
15332 if (!m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] || !spellInfo->IsHighRankOf(sSpellMgr->GetSpellInfo(m_charmAISpells[SPELL_INSTANT_DAMAGE + offset])) || urand(0, 1))
15333 if (damage_type[1 + offset] < damage_type[offset])
15334 {
15336 damage_type[1 + offset] = damage_type[offset];
15337 }
15338
15339 m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] = spellInfo->Id;
15340 damage_type[offset] = dmg;
15341 }
15342 else if ((int32)damage_type[1 + offset] < dmg)
15343 {
15344 if (m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] && sSpellMgr->GetSpellInfo(m_charmAISpells[SPELL_INSTANT_DAMAGE + offset])->IsHighRankOf(spellInfo) && urand(0, 1))
15345 continue;
15346
15347 m_charmAISpells[SPELL_INSTANT_DAMAGE2 + offset] = spellInfo->Id;
15348 damage_type[1 + offset] = dmg;
15349 }
15350 break;
15351 }
15353 {
15354 m_charmAISpells[SPELL_T_CHARGE] = spellInfo->Id;
15355 break;
15356 }
15357 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_SPEED)
15358 {
15359 m_charmAISpells[SPELL_FAST_RUN] = spellInfo->Id;
15360 break;
15361 }
15362 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_SCHOOL_IMMUNITY)
15363 {
15364 m_charmAISpells[SPELL_IMMUNITY] = spellInfo->Id;
15365 break;
15366 }
15367 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE)
15368 {
15369 if( (int32)periodic_damage < CalculateSpellDamage(this, spellInfo, i) )
15370 {
15371 m_charmAISpells[SPELL_DOT_DAMAGE] = spellInfo->Id;
15372 break;
15373 }
15374 }
15375 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_STUN)
15376 {
15377 m_charmAISpells[SPELL_T_STUN] = spellInfo->Id;
15378 break;
15379 }
15380 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_ROOT || spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_FEAR)
15381 {
15383 break;
15384 }
15385 }
15386 }
15387}
@ SPELL_ROOT_OR_FEAR
Definition: Player.h:908
@ SPELL_INSTANT_DAMAGE2
Definition: Player.h:910
@ SPELL_INSTANT_DAMAGE
Definition: Player.h:909
@ SPELL_T_CHARGE
Definition: Player.h:914
@ SPELL_DOT_DAMAGE
Definition: Player.h:913
@ SPELL_FAST_RUN
Definition: Player.h:916
@ SPELL_T_STUN
Definition: Player.h:907
@ SPELL_IMMUNITY
Definition: Player.h:915
@ 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_ATTR7_ATTACK_ON_CHARGE_TO_UNIT
Definition: SharedDefines.h:631
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition: SharedDefines.h:752
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition: Unit.cpp:14743
bool IsHighRankOf(SpellInfo const *spellInfo) const
Definition: SpellInfo.cpp:2564
bool NeedsComboPoints() const
Definition: SpellInfo.cpp:1250
uint32 CalcCastTime(Unit *caster=nullptr, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:2335

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.

32{
34 menu->ClearMenus();
35
36 menu->GetGossipMenu().SetMenuId(menuId);
37
38 GossipMenuItemsMapBounds menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId);
39
40 // if default menuId and no menu options exist for this, use options from default options
41 if (menuItemBounds.first == menuItemBounds.second && menuId == GetDefaultGossipMenuForSource(source))
42 menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(0);
43
44 uint32 npcflags = 0;
45
46 if (source->GetTypeId() == TYPEID_UNIT)
47 {
48 npcflags = source->ToUnit()->GetNpcFlags();
49 if (showQuests && npcflags & UNIT_NPC_FLAG_QUESTGIVER)
50 PrepareQuestMenu(source->GetGUID());
51 }
52 else if (source->GetTypeId() == TYPEID_GAMEOBJECT)
53 if (showQuests && source->ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER)
54 PrepareQuestMenu(source->GetGUID());
55
56 for (GossipMenuItemsContainer::const_iterator itr = menuItemBounds.first; itr != menuItemBounds.second; ++itr)
57 {
58 bool canTalk = true;
59 if (!sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
60 continue;
61
62 if (Creature* creature = source->ToCreature())
63 {
64 if (!(itr->second.OptionNpcFlag & npcflags))
65 continue;
66
67 switch (itr->second.OptionType)
68 {
70 canTalk = false; // added in special mode
71 break;
73 if (!isDead())
74 canTalk = false;
75 break;
77 {
78 if (!creature->isVendorWithIconSpeak())
79 {
80 VendorItemData const* vendorItems = itr->second.ActionMenuID ? sObjectMgr->GetNpcVendorItemList(itr->second.ActionMenuID) : creature->GetVendorItems();
81 if (!vendorItems || vendorItems->Empty())
82 {
83 LOG_ERROR("sql.sql", "Creature {} have UNIT_NPC_FLAG_VENDOR but have empty trading item list.", creature->GetGUID().ToString());
84 canTalk = false;
85 }
86 break;
87 }
88 break;
89 }
92 if (!(GetSpecsCount() == 1 && creature->isCanTrainingAndResetTalentsOf(this) && !(GetLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))))
93 canTalk = false;
94 break;
96 if (!creature->isCanTrainingAndResetTalentsOf(this))
97 canTalk = false;
98 break;
100 if (!GetPet() || GetPet()->getPetType() != HUNTER_PET || GetPet()->m_spells.size() <= 1 || creature->GetCreatureTemplate()->trainer_type != TRAINER_TYPE_PETS || creature->GetCreatureTemplate()->trainer_class != CLASS_HUNTER)
101 canTalk = false;
102 break;
104 if (GetSession()->SendLearnNewTaxiNode(creature))
105 return;
106 break;
108 if (!creature->isCanInteractWithBattleMaster(this, false))
109 canTalk = false;
110 break;
112 if (getClass() != CLASS_HUNTER)
113 canTalk = false;
114 break;
116 canTalk = false;
117 break;
119 if (!creature->IsValidTrainerForPlayer(this))
120 {
121 canTalk = false;
122 }
123 break;
125 if (creature->isVendorWithIconSpeak())
126 {
127 VendorItemData const* vendorItems = creature->GetVendorItems();
128 if (!vendorItems || vendorItems->Empty())
129 {
130 canTalk = false;
131 }
132 }
133 break;
140 break; // no checks
142 if (!sOutdoorPvPMgr->CanTalkTo(this, creature, itr->second))
143 canTalk = false;
144 break;
145 default:
146 LOG_ERROR("sql.sql", "Creature entry {} has unknown OptionType {} for menu {}", creature->GetEntry(), itr->second.OptionType, itr->second.MenuID);
147 canTalk = false;
148 break;
149 }
150 }
151 else if (GameObject* go = source->ToGameObject())
152 {
153 switch (itr->second.OptionType)
154 {
156 if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER && go->GetGoType() != GAMEOBJECT_TYPE_GOOBER)
157 canTalk = false;
158 break;
159 default:
160 canTalk = false;
161 break;
162 }
163 }
164
165 if (canTalk)
166 {
167 // search in broadcast_text and broadcast_text_locale
168 std::string strOptionText, strBoxText;
169 BroadcastText const* optionBroadcastText = sObjectMgr->GetBroadcastText(itr->second.OptionBroadcastTextID);
170 BroadcastText const* boxBroadcastText = sObjectMgr->GetBroadcastText(itr->second.BoxBroadcastTextID);
172
173 if (optionBroadcastText)
174 ObjectMgr::GetLocaleString(getGender() == GENDER_MALE ? optionBroadcastText->MaleText : optionBroadcastText->FemaleText, locale, strOptionText);
175 else
176 strOptionText = itr->second.OptionText;
177
178 if (boxBroadcastText)
179 ObjectMgr::GetLocaleString(getGender() == GENDER_MALE ? boxBroadcastText->MaleText : boxBroadcastText->FemaleText, locale, strBoxText);
180 else
181 strBoxText = itr->second.BoxText;
182
183 // if the language is not default and the texts weren't found, maybe they're in gossip_menu_option_locale table
184 if (locale != DEFAULT_LOCALE)
185 {
186 if (strOptionText.empty())
187 {
189 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionID)))
190 ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, locale, strOptionText);
191 }
192
193 if (strBoxText.empty())
194 {
196 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionID)))
197 ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, locale, strBoxText);
198 }
199 }
200
201 menu->GetGossipMenu().AddMenuItem(itr->second.OptionID, itr->second.OptionIcon, strOptionText, 0, itr->second.OptionType, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded);
202 menu->GetGossipMenu().AddGossipMenuItemData(itr->second.OptionID, itr->second.ActionMenuID, itr->second.ActionPoiID);
203 }
204 }
205
206 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && npcflags & UNIT_NPC_FLAG_FLIGHTMASTER)
208}
LocaleConstant
Definition: Common.h:74
#define DEFAULT_LOCALE
Definition: Common.h:88
@ GOSSIP_ICON_INTERACT_1
Definition: GossipDef.h:64
@ HUNTER_PET
Definition: PetDefines.h:32
std::pair< GossipMenuItemsContainer::const_iterator, GossipMenuItemsContainer::const_iterator > GossipMenuItemsMapBounds
Definition: ObjectMgr.h:639
@ LANG_TOGGLE_INSTANT_FLIGHT
Definition: Language.h:1318
@ GAMEOBJECT_TYPE_GOOBER
Definition: SharedDefines.h:1542
@ TRAINER_TYPE_PETS
Definition: SharedDefines.h:2592
AC_GAME_API char const * GetAcoreString(ChatHandler const *handler, AcoreStrings which)
Definition: ChatCommandHelpers.cpp:28
Definition: CreatureData.h:338
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:40
void AddGossipMenuItemData(uint32 menuItemId, uint32 gossipActionMenuId, uint32 gossipActionPoi)
Definition: GossipDef.cpp:135
void ClearMenus()
Definition: GossipDef.cpp:186
GameobjectTypes GetGoType() const
Definition: GameObject.h:205
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, size_t locale)
Definition: ObjectMgr.h:1416

References GossipMenu::AddGossipMenuItemData(), GossipMenu::AddMenuItem(), 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, Unit::getClass(), GetDefaultGossipMenuForSource(), Unit::getGender(), PlayerMenu::GetGossipMenu(), GameObject::GetGoType(), Object::GetGUID(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), Unit::GetNpcFlags(), GetPet(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), GetSpecsCount(), Object::GetTypeId(), 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, Unit::isDead(), 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, TYPEID_GAMEOBJECT, TYPEID_UNIT, 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)
39{
40 QuestRelationBounds objectQR;
41 QuestRelationBounds objectQIR;
42
43 // pets also can have quests
45 if (creature)
46 {
47 objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
48 objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry());
49 }
50 else
51 {
52 //we should obtain map pointer from GetMap() in 99% of cases. Special case
53 //only for quests which cast teleport spells on player
55 ASSERT(_map);
56 GameObject* pGameObject = _map->GetGameObject(guid);
57 if (pGameObject)
58 {
59 objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry());
60 objectQIR = sObjectMgr->GetGOQuestInvolvedRelationBounds(pGameObject->GetEntry());
61 }
62 else
63 return;
64 }
65
67 qm.ClearMenu();
68
69 for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i)
70 {
71 uint32 quest_id = i->second;
72 QuestStatus status = GetQuestStatus(quest_id);
73 if (status == QUEST_STATUS_COMPLETE)
74 qm.AddMenuItem(quest_id, 4);
75 else if (status == QUEST_STATUS_INCOMPLETE)
76 qm.AddMenuItem(quest_id, 4);
77 //else if (status == QUEST_STATUS_AVAILABLE)
78 // qm.AddMenuItem(quest_id, 2);
79 }
80
81 for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i)
82 {
83 uint32 quest_id = i->second;
84 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
85 if (!quest)
86 continue;
87
88 if (!CanTakeQuest(quest, false))
89 continue;
90
91 if (quest->IsAutoComplete() && (!quest->IsRepeatable() || quest->IsDaily() || quest->IsWeekly() || quest->IsMonthly()))
92 qm.AddMenuItem(quest_id, 0);
93 else if (quest->IsAutoComplete())
94 qm.AddMenuItem(quest_id, 4);
95 else if (GetQuestStatus(quest_id) == QUEST_STATUS_NONE)
96 qm.AddMenuItem(quest_id, 2);
97 }
98}
Definition: GossipDef.h:228
void ClearMenu()
Definition: GossipDef.cpp:311
void AddMenuItem(uint32 QuestId, uint8 Icon)
Definition: GossipDef.cpp:287
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_professor_dabiri::OnGossipHello(), npc_salsalabim::OnGossipHello(), npc_timothy_daniels::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
6657{
6659 for (const ProgressionRequirement* missingReq : missingAchievements)
6660 {
6661 AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(missingReq->id);
6662 if (!achievementEntry)
6663 {
6664 continue;
6665 }
6666
6667 std::string name = achievementEntry->name[sObjectMgr->GetDBCLocaleIndex()];
6668
6669 std::stringstream stream;
6670 stream << "|cffff7c0a|Hachievement:";
6671 stream << missingReq->id;
6672 stream << ":";
6673 stream << GetGUID().ToString();
6674 stream << ":0:0:0:0:0:0:0:0|h[";
6675 stream << name;
6676 stream << "]|h|r";
6677
6678 if (missingReq->note.empty())
6679 {
6680 ChatHandler(GetSession()).PSendSysMessage(" - %s", stream.str().c_str());
6681 }
6682 else
6683 {
6684 ChatHandler(GetSession()).PSendSysMessage(" - %s %s %s", stream.str().c_str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note.c_str());
6685 }
6686 }
6687}
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
@ LANG_ACCESS_REQUIREMENT_NOTE
Definition: Language.h:819
Definition: Player.h:925
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
6690{
6692 for (const ProgressionRequirement* missingReq : missingItems)
6693 {
6694 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(missingReq->id);
6695 if (!itemTemplate)
6696 {
6697 continue;
6698 }
6699
6700 //Get the localised name
6701 std::string name = itemTemplate->Name1;
6702 if (ItemLocale const* il = sObjectMgr->GetItemLocale(itemTemplate->ItemId))
6703 {
6704 ObjectMgr::GetLocaleString(il->Name, loc_idx, name);
6705 }
6706
6707 std::stringstream stream;
6708 stream << "|c";
6709 stream << std::hex << ItemQualityColors[itemTemplate->Quality] << std::dec;
6710 stream << "|Hitem:";
6711 stream << itemTemplate->ItemId;
6712 stream << ":0:0:0:0:0:0:0:0:0|h[";
6713 stream << name;
6714 stream << "]|h|r";
6715
6716 if (missingReq->note.empty())
6717 {
6718 ChatHandler(GetSession()).PSendSysMessage(" - %s", stream.str().c_str());
6719 }
6720 else
6721 {
6722 ChatHandler(GetSession()).PSendSysMessage(" - %s %s %s", stream.str().c_str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note.c_str());
6723 }
6724 }
6725}
const uint32 ItemQualityColors[MAX_ITEM_QUALITY]
Definition: SharedDefines.h:325
std::string Name1
Definition: ItemTemplate.h:633
Definition: ItemTemplate.h:841

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
6620{
6622 for (const ProgressionRequirement* missingReq : missingQuests)
6623 {
6624 Quest const* questTemplate = sObjectMgr->GetQuestTemplate(missingReq->id);
6625 if (!questTemplate)
6626 {
6627 continue;
6628 }
6629
6630 std::string questTitle = questTemplate->GetTitle();
6631 if (QuestLocale const* questLocale = sObjectMgr->GetQuestLocale(questTemplate->GetQuestId()))
6632 {
6633 ObjectMgr::GetLocaleString(questLocale->Title, loc_idx, questTitle);
6634 }
6635
6636 std::stringstream stream;
6637 stream << "|cffff7c0a|Hquest:";
6638 stream << questTemplate->GetQuestId();
6639 stream << ":";
6640 stream << questTemplate->GetQuestLevel();
6641 stream << "|h[";
6642 stream << questTitle;
6643 stream << "]|h|r";
6644
6645 if (missingReq->note.empty())
6646 {
6647 ChatHandler(GetSession()).PSendSysMessage(" - %s", stream.str().c_str());
6648 }
6649 else
6650 {
6651 ChatHandler(GetSession()).PSendSysMessage(" - %s %s %s", stream.str().c_str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note.c_str());
6652 }
6653 }
6654}
Definition: QuestDef.h:180
int32 GetQuestLevel() const
Definition: QuestDef.h:230
std::string const & GetTitle() const
Definition: QuestDef.h:258

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 ( )
1596{
1597 if (m_DelayedOperations == 0)
1598 return;
1599
1601 {
1602 ResurrectPlayer(0.0f, false);
1603
1606 else
1607 SetFullHealth();
1608
1611 else
1613
1614 SetPower(POWER_RAGE, 0);
1616
1618 }
1619
1621 SaveToDB(false, false);
1622
1624 {
1625 Aura* aura = GetAura(26013);
1626 if (!aura || aura->GetDuration() <= 900000)
1627 CastSpell(this, 26013, true);
1628 }
1629
1631 {
1633 {
1634 // xinef: remove shapeshift auras
1636 {
1638 }
1641 }
1642 }
1643
1645 {
1647 {
1652 }
1653 }
1654
1656 {
1657 if (Group* g = GetGroup())
1658 g->SendUpdateToPlayer(GetGUID());
1659 }
1660
1662 {
1663 if (Vehicle* vehicle = GetVehicle())
1664 {
1665 SeatMap::iterator itr = vehicle->GetSeatIteratorForPassenger(this);
1666 if (itr != vehicle->Seats.end())
1667 if (Unit* base = vehicle->GetBase())
1668 {
1669 ExitVehicle();
1670 base->HandleSpellClick(this, itr->first);
1671 }
1672 }
1673 }
1674
1675 //we have executed ALL delayed ops, so clear the flag
1677}
@ DELAYED_BG_GROUP_RESTORE
Flag to restore group state after teleport from BG.
Definition: Player.h:900
@ DELAYED_SAVE_PLAYER
Definition: Player.h:895
@ DELAYED_BG_MOUNT_RESTORE
Flag to restore mount state after teleport from BG.
Definition: Player.h:898
@ DELAYED_VEHICLE_TELEPORT
Definition: Player.h:901
@ DELAYED_BG_TAXI_RESTORE
Flag to restore taxi state after teleport from BG.
Definition: Player.h:899
@ DELAYED_SPELL_CAST_DESERTER
Definition: Player.h:897
@ DELAYED_RESURRECT_PLAYER
Definition: Player.h:896
void SaveToDB(bool create, bool logout)
Definition: PlayerStorage.cpp:7067
uint32 m_resurrectMana
Definition: Player.h:2778
void ContinueTaxiFlight()
Definition: Player.cpp:10339
uint32 m_resurrectHealth
Definition: Player.h:2778
Aura * AddAura(uint32 spellId, Unit *target)
Definition: Unit.cpp:19031
Definition: Vehicle.h:30

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.

2203{
2204 // process liquid auras using generic unit code
2206
2207 LiquidData const& liquidData = GetLiquidData();
2208
2209 // player specific logic for mirror timers
2210 if (liquidData.Status != LIQUID_MAP_NO_WATER)
2211 {
2212 // Breath bar state (under water in any liquid type)
2213 if ((liquidData.Flags & MAP_ALL_LIQUIDS) != 0)
2214 {
2215 if ((liquidData.Status & LIQUID_MAP_UNDER_WATER) != 0)
2217 else
2218 m_MirrorTimerFlags &= ~UNDERWATER_INWATER;
2219 }
2220
2221 // Fatigue bar state (if not on flight path or transport)
2222 if ((liquidData.Flags & MAP_LIQUID_TYPE_DARK_WATER) && !IsInFlight() && !GetTransport())
2223 {
2224 // Exclude also uncontrollable vehicles
2225 Vehicle* vehicle = GetVehicle();
2226 VehicleSeatEntry const* vehicleSeat = vehicle ? vehicle->GetSeatForPassenger(this) : nullptr;
2227 if (!vehicleSeat || vehicleSeat->CanControl())
2229 else
2230 m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
2231 }
2232 else
2233 m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
2234
2235 // Lava state (any contact)
2236 if (liquidData.Flags & MAP_LIQUID_TYPE_MAGMA)
2237 {
2238 if (liquidData.Status & MAP_LIQUID_STATUS_IN_CONTACT)
2240 else
2241 m_MirrorTimerFlags &= ~UNDERWATER_INLAVA;
2242 }
2243
2244 // Slime state (any contact)
2245 if (liquidData.Flags & MAP_LIQUID_TYPE_SLIME)
2246 {
2247 if (liquidData.Status & MAP_LIQUID_STATUS_IN_CONTACT)
2249 else
2250 m_MirrorTimerFlags &= ~UNDERWATER_INSLIME;
2251 }
2252 }
2253 else
2255}
@ UNDERWATER_INSLIME
Definition: Player.h:104
#define MAP_LIQUID_TYPE_MAGMA
Definition: Map.h:156
@ LIQUID_MAP_UNDER_WATER
Definition: Map.h:147
@ LIQUID_MAP_NO_WATER
Definition: Map.h:143
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition: Map.h:151
#define MAP_LIQUID_TYPE_DARK_WATER
Definition: Map.h:161
#define MAP_LIQUID_TYPE_SLIME
Definition: Map.h:157
#define MAP_ALL_LIQUIDS
Definition: Map.h:159
LiquidData const & GetLiquidData() const
Definition: Object.cpp:3108
virtual void ProcessTerrainStatusUpdate()
Definition: Unit.cpp:4200
VehicleSeatEntry const * GetSeatForPassenger(Unit const *passenger)
Definition: Vehicle.cpp:585
Definition: Map.h:170
uint32 Flags
Definition: Map.h:174
LiquidStatus Status
Definition: Map.h:177
Definition: DBCStructure.h:2040
bool CanControl() const
Definition: DBCStructure.h:2103

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.

10435{
10436 PacketCooldowns cooldowns;
10437 WorldPacket data;
10438
10439 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
10440 {
10441 if (itr->second->State == PLAYERSPELL_REMOVED)
10442 continue;
10443 uint32 unSpellId = itr->first;
10444 SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(unSpellId);
10445
10446 // Not send cooldown for this spells
10447 if (spellInfo->IsCooldownStartedOnEvent())
10448 continue;
10449
10451 continue;
10452
10453 if ((idSchoolMask & spellInfo->GetSchoolMask()) && GetSpellCooldownDelay(unSpellId) < unTimeMs)
10454 {
10455 cooldowns[unSpellId] = unTimeMs;
10456 AddSpellCooldown(unSpellId, 0, unTimeMs, true);
10457 }
10458 }
10459
10460 if (!cooldowns.empty())
10461 {
10463 GetSession()->SendPacket(&data);
10464 }
10465}
@ SPELL_PREVENTION_TYPE_SILENCE
Definition: SharedDefines.h:1526
uint32 GetSpellCooldownDelay(uint32 spell_id) const
Definition: Player.cpp:16226
uint32 PreventionType
Definition: SpellInfo.h:388
bool IsCooldownStartedOnEvent() const
Definition: SpellInfo.cpp:1196
SpellSchoolMask GetSchoolMask() const
Definition: SpellInfo.cpp:1972

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 
)
2864{
2865 if (pItem)
2866 {
2868 AddItemDurations(pItem);
2869
2870 uint8 slot = pos & 255;
2871 VisualizeItem(slot, pItem);
2872
2873 if (IsInWorld())
2874 {
2875 pItem->AddToWorld();
2876 pItem->SendUpdateToPlayer(this);
2877 }
2878
2881
2882 sScriptMgr->OnEquip(this, pItem, (pos >> 8), slot, true);
2883 }
2884}

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
1912{ ApplyRatingMod(cr, 0, true);}

References ApplyRatingMod().

Referenced by DestroyItem(), EquipItem(), RemoveItem(), and UpdateAllStats().

◆ RefundItem()

void Player::RefundItem ( Item item)
private

Already checked before

15473{
15475 {
15476 LOG_DEBUG("entities.player.items", "Item refund: item not refundable!");
15477 return;
15478 }
15479
15480 if (item->IsRefundExpired()) // item refund has expired
15481 {
15482 item->SetNotRefundable(this);
15484 data << item->GetGUID(); // Guid
15485 data << uint32(10); // Error!
15486 GetSession()->SendPacket(&data);
15487 return;
15488 }
15489
15490 if (GetGUID().GetCounter() != item->GetRefundRecipient()) // Formerly refundable item got traded
15491 {
15492 LOG_DEBUG("entities.player.items", "Item refund: item was traded!");
15493 item->SetNotRefundable(this);
15494 return;
15495 }
15496
15497 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(item->GetPaidExtendedCost());
15498 if (!iece)
15499 {
15500 LOG_DEBUG("entities.player.items", "Item refund: cannot find extendedcost data.");
15501 return;
15502 }
15503
15504 bool store_error = false;
15505 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
15506 {
15507 uint32 count = iece->reqitemcount[i];
15508 uint32 itemid = iece->reqitem[i];
15509
15510 if (count && itemid)
15511 {
15512 ItemPosCountVec dest;
15513 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count);
15514 if (msg != EQUIP_ERR_OK)
15515 {
15516 store_error = true;
15517 break;
15518 }
15519 }
15520 }
15521
15522 if (store_error)
15523 {
15525 data << item->GetGUID(); // Guid
15526 data << uint32(10); // Error!
15527 GetSession()->SendPacket(&data);
15528 return;
15529 }
15530
15531 WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8 + 4 + 4 + 4 + 4 + 4 * 4 + 4 * 4);
15532 data << item->GetGUID(); // item guid
15533 data << uint32(0); // 0, or error code
15534 data << uint32(item->GetPaidMoney()); // money cost
15535 data << uint32(iece->reqhonorpoints); // honor point cost
15536 data << uint32(iece->reqarenapoints); // arena point cost
15537 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
15538 {
15539 data << uint32(iece->reqitem[i]);
15540 data << uint32(iece->reqitemcount[i]);
15541 }
15542 GetSession()->SendPacket(&data);
15543
15544 uint32 moneyRefund = item->GetPaidMoney(); // item-> will be invalidated in DestroyItem
15545
15546 // Save all relevant data to DB to prevent desynchronisation exploits
15547 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15548
15549 // Delete any references to the refund data
15550 item->SetNotRefundable(this, true, &trans);
15551
15552 // Destroy item
15553 DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
15554
15555 // Grant back extendedcost items
15556 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
15557 {
15558 uint32 count = iece->reqitemcount[i];
15559 uint32 itemid = iece->reqitem[i];
15560 if (count && itemid)
15561 {
15562 ItemPosCountVec dest;
15563 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count);
15564 ASSERT(msg == EQUIP_ERR_OK);
15565 Item* it = StoreNewItem(dest, itemid, true);
15566 SendNewItem(it, count, true, false, true);
15567 }
15568 }
15569
15570 // Grant back money
15571 if (moneyRefund)
15572 ModifyMoney(moneyRefund); // Saved in SaveInventoryAndGoldToDB
15573
15574 // Grant back Honor points
15575 if (uint32 honorRefund = iece->reqhonorpoints)
15576 ModifyHonorPoints(honorRefund, trans);
15577
15578 // Grant back Arena points
15579 if (uint32 arenaRefund = iece->reqarenapoints)
15580 ModifyArenaPoints(arenaRefund, trans);
15581
15583
15584 CharacterDatabase.CommitTransaction(trans);
15585}
@ SMSG_ITEM_REFUND_RESULT
Definition: Opcodes.h:1235
uint32 GetPaidExtendedCost()
Definition: Item.h:340
uint32 GetPaidMoney()
Definition: Item.h:339
ObjectGuid::LowType GetRefundRecipient()
Definition: Item.h:338
bool IsRefundExpired()
Definition: Item.cpp:1255
void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7138

References ASSERT, CanStoreNewItem(), CharacterDatabase, DestroyItem(), EQUIP_ERR_OK, Item::GetBagSlot(), Object::GetGUID(), Item::GetPaidExtendedCost(), Item::GetPaidMoney(), Item::GetRefundRecipient(), GetSession(), Item::GetSlot(), Object::HasFlag(), Item::IsRefundExpired(), ITEM_FIELD_FLAG_REFUNDABLE, ITEM_FIELD_FLAGS, 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
1817{
1818 uint32 maxValue = GetMaxPower(power);
1819 if (!maxValue)
1820 return;
1821
1822 //If .cheat power is on always have the max power
1824 {
1825 if (m_regenTimerCount >= 2000)
1826 {
1827 //Set the value to 0 first then set it to max to force resend of packet as for range clients keeps removing rage
1828 if (power == POWER_RAGE || power == POWER_RUNIC_POWER)
1829 {
1830 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, 0);
1831 }
1832
1833 SetPower(power, maxValue);
1834 return;
1835 }
1836 }
1837
1838 uint32 curValue = GetPower(power);
1839
1842 return;
1843
1844 float addvalue = 0.0f;
1845
1846 switch (power)
1847 {
1848 case POWER_MANA:
1849 {
1850 bool recentCast = IsUnderLastManaUseEffect();
1851 float ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA);
1852
1853 if (sWorld->getBoolConfig(CONFIG_LOW_LEVEL_REGEN_BOOST) && GetLevel() < 15)
1854 ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA) * (2.066f - (GetLevel() * 0.066f));
1855
1856 if (recentCast) // Trinity Updates Mana in intervals of 2s, which is correct
1857 addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
1858 else
1859 addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
1860 }
1861 break;
1862 case POWER_RAGE: // Regenerate rage
1863 {
1865 {
1866 float RageDecreaseRate = sWorld->getRate(RATE_POWER_RAGE_LOSS);
1867 addvalue += -20 * RageDecreaseRate; // 2 rage by tick (= 2 seconds => 1 rage/sec)
1868 }
1869 }
1870 break;
1871 case POWER_ENERGY: // Regenerate energy (rogue)
1872 addvalue += 0.01f * m_regenTimer * sWorld->getRate(RATE_POWER_ENERGY);
1873 break;
1874 case POWER_RUNIC_POWER:
1875 {
1877 {
1878 float RunicPowerDecreaseRate = sWorld->getRate(RATE_POWER_RUNICPOWER_LOSS);
1879 addvalue += -30 * RunicPowerDecreaseRate; // 3 RunicPower by tick
1880 }
1881 }
1882 break;
1883 case POWER_RUNE:
1884 case POWER_FOCUS:
1885 case POWER_HAPPINESS:
1886 break;
1887 case POWER_HEALTH:
1888 return;
1889 default:
1890 break;
1891 }
1892
1893 // Mana regen calculated in Player::UpdateManaRegen()
1894 if (power != POWER_MANA)
1895 {
1897 for (AuraEffectList::const_iterator i = ModPowerRegenPCTAuras.begin(); i != ModPowerRegenPCTAuras.end(); ++i)
1898 if (Powers((*i)->GetMiscValue()) == power)
1899 AddPct(addvalue, (*i)->GetAmount());
1900
1901 // Butchery requires combat for this effect
1902 if (power != POWER_RUNIC_POWER || IsInCombat())
1904 }
1905
1906 if (addvalue < 0.0f)
1907 {
1908 if (curValue == 0)
1909 return;
1910 }
1911 else if (addvalue > 0.0f)
1912 {
1913 if (curValue == maxValue)
1914 return;
1915 }
1916 else
1917 return;
1918
1919 addvalue += m_powerFraction[power];
1920 uint32 integerValue = uint32(std::fabs(addvalue));
1921
1922 bool forcedUpdate = false;
1923 if (addvalue < 0.0f)
1924 {
1925 if (curValue > integerValue)
1926 {
1927 curValue -= integerValue;
1928 m_powerFraction[power] = addvalue + integerValue;
1929 }
1930 else
1931 {
1932 curValue = 0;
1933 m_powerFraction[power] = 0;
1934 forcedUpdate = true;
1935 }
1936 }
1937 else
1938 {
1939 curValue += integerValue;
1940
1941 if (curValue >= maxValue)
1942 {
1943 curValue = maxValue;
1944 m_powerFraction[power] = 0;
1945 forcedUpdate = true;
1946 }
1947 else
1948 {
1949 m_powerFraction[power] = addvalue - integerValue;
1950 }
1951 }
1952
1953 if (m_regenTimerCount >= 2000 || forcedUpdate)
1954 {
1955 SetPower(power, curValue, true, true);
1956 }
1957 else
1958 {
1959 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, curValue);
1960 }
1961}
@ 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:994
@ 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
@ CONFIG_LOW_LEVEL_REGEN_BOOST
Definition: IWorld.h:180
@ RATE_POWER_RAGE_LOSS
Definition: IWorld.h:424
@ RATE_POWER_RUNICPOWER_LOSS
Definition: IWorld.h:426
@ RATE_POWER_ENERGY
Definition: IWorld.h:428
@ RATE_POWER_MANA
Definition: IWorld.h:422
@ POWER_HEALTH
Definition: SharedDefines.h:250
void UpdateUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:663
bool IsUnderLastManaUseEffect() const
Definition: Unit.cpp:17414
bool HasAuraTypeWithMiscvalue(AuraType auratype, int32 miscvalue) const
Definition: Unit.cpp:5641

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 ( )
1734{
1735 //if (m_regenTimer <= 500)
1736 // return;
1737
1740
1742
1744
1745 // Runes act as cooldowns, and they don't need to send any data
1747 for (uint8 i = 0; i < MAX_RUNES; ++i)
1748 {
1749 // xinef: implement grace
1750 if (int32 cd = GetRuneCooldown(i))
1751 {
1752 SetRuneCooldown(i, (cd > m_regenTimer) ? cd - m_regenTimer : 0);
1753 // start grace counter, player must be in combat and rune has to go off cooldown
1754 if (IsInCombat() && cd <= m_regenTimer)
1755 SetGracePeriod(i, m_regenTimer - cd + 1); // added 1 because m_regenTimer-cd can be equal 0
1756 }
1757 // xinef: if grace is started, increase it but no more than cap
1758 else if (uint32 grace = GetGracePeriod(i))
1759 {
1760 if (grace < RUNE_GRACE_PERIOD)
1761 SetGracePeriod(i, std::min<uint32>(grace + m_regenTimer, RUNE_GRACE_PERIOD));
1762 }
1763 }
1764
1765 if (m_regenTimerCount >= 2000)
1766 {
1767 // Not in combat or they have regeneration
1771 {
1773 }
1774
1778
1779 m_regenTimerCount -= 2000;
1780 }
1781
1782 m_regenTimer = 0;
1783
1784 // Handles the emotes for drinking and eating.
1785 // According to sniffs there is a background timer going on that repeats independed from the time window where the aura applies.
1786 // 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
1787 // 5 seconds over and over again which confirms my theory that we have a independed timer.
1788 if (m_foodEmoteTimerCount >= 5000)
1789 {
1790 std::vector<AuraEffect*> auraList;
1793
1794 auraList.reserve(ModRegenAuras.size() + ModPowerRegenAuras.size());
1795 auraList.insert(auraList.end(), ModRegenAuras.begin(), ModRegenAuras.end());
1796 auraList.insert(auraList.end(), ModPowerRegenAuras.begin(), ModPowerRegenAuras.end());
1797
1798 for (auto itr = auraList.begin(); itr != auraList.end(); ++itr)
1799 {
1800 // Food emote comes above drinking emote if we have to decide (mage regen food for example)
1801 if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
1802 {
1804 break;
1805 }
1806 else if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_POWER_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
1807 {
1809 break;
1810 }
1811 }
1812 m_foodEmoteTimerCount -= 5000;
1813 }
1814}
@ RUNE_GRACE_PERIOD
Definition: Player.h:404
@ 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
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition: SpellDefines.h:62
@ SPELL_VISUAL_KIT_DRINK
Definition: SharedDefines.h:322
@ SPELL_VISUAL_KIT_FOOD
Definition: SharedDefines.h:321
void Regenerate(Powers power)
Definition: Player.cpp:1816
void RegenerateHealth()
Definition: Player.cpp:1963
bool IsPolymorphed() const
Definition: Unit.cpp:16915
void SendPlaySpellVisual(uint32 id)
Definition: Unit.cpp:19079

References AURA_INTERRUPT_FLAG_NOT_SEATED, CLASS_DEATH_KNIGHT, Unit::GetAuraEffectsByType(), Unit::getClass(), GetGracePeriod(), GetRuneCooldown(), Unit::HasAuraType(), 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 ( )
1964{
1965 uint32 curValue = GetHealth();
1966 uint32 maxValue = GetMaxHealth();
1967
1968 if (curValue >= maxValue)
1969 return;
1970
1971 float HealthIncreaseRate = sWorld->getRate(RATE_HEALTH);
1972
1973 if (sWorld->getBoolConfig(CONFIG_LOW_LEVEL_REGEN_BOOST) && GetLevel() < 15)
1974 HealthIncreaseRate = sWorld->getRate(RATE_HEALTH) * (2.066f - (GetLevel() * 0.066f));
1975
1976 float addvalue = 0.0f;
1977
1978 // polymorphed case
1979 if (IsPolymorphed())
1980 addvalue = (float)GetMaxHealth() / 3;
1981 // normal regen case (maybe partly in combat case)
1983 {
1984 addvalue = OCTRegenHPPerSpirit() * HealthIncreaseRate;
1985 if (!IsInCombat())
1986 {
1988 for (AuraEffectList::const_iterator i = mModHealthRegenPct.begin(); i != mModHealthRegenPct.end(); ++i)
1989 AddPct(addvalue, (*i)->GetAmount());
1990
1992 }
1995
1996 if (!IsStandState())
1997 addvalue *= 1.5f;
1998 }
1999
2000 // always regeneration bonus (including combat)
2002 addvalue += m_baseHealthRegen / 2.5f;
2003
2004 if (addvalue < 0)
2005 addvalue = 0;
2006
2007 ModifyHealth(int32(addvalue));
2008}
T ApplyPct(T &base, U pct)
Definition: Util.h:73
@ SPELL_AURA_MOD_HEALTH_REGEN_PERCENT
Definition: SpellAuraDefines.h:151
@ RATE_HEALTH
Definition: IWorld.h:421
float OCTRegenHPPerSpirit()
Definition: Player.cpp:5119
int32 ModifyHealth(int32 val)
Definition: Unit.cpp:13993
bool IsStandState() const
Definition: Unit.cpp:16894

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)
5542{
5543 ActionButtonList::iterator buttonItr = m_actionButtons.find(button);
5544 if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED)
5545 return;
5546
5547 if (buttonItr->second.uState == ACTIONBUTTON_NEW)
5548 m_actionButtons.erase(buttonItr); // new and not saved
5549 else
5550 buttonItr->second.uState = ACTIONBUTTON_DELETED; // saved, will deleted at next save
5551
5552 LOG_DEBUG("entities.player", "Action Button {} Removed from Player {}", button, GetGUID().ToString());
5553}

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 
)
1480{
1481 QuestStatusMap::iterator itr = m_QuestStatus.find(questId);
1482 if (itr != m_QuestStatus.end())
1483 {
1484 m_QuestStatus.erase(itr);
1485 m_QuestStatusSave[questId] = false;
1486 }
1487
1488 if (update)
1489 SendQuestUpdate(questId);
1490
1491 // Xinef: area auras may change on quest remove!
1495}

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 ( )
3514{
3516 if (!m_spellCooldowns.empty())
3517 {
3518 for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr)
3519 if (itr->second.end < infTime)
3520 SendClearCooldown(itr->first, this);
3521
3522 m_spellCooldowns.clear();
3523 }
3524}
void SendClearCooldown(uint32 spell_id, Unit *target)
Definition: Player.cpp:14535

References GameTime::GetGameTimeMS(), infinityCooldownDelayCheck, m_spellCooldowns, and SendClearCooldown().

Referenced by misc_commandscript::HandleCooldownCommand().

◆ RemoveAmmo()

◆ RemoveArenaEnchantments()

void Player::RemoveArenaEnchantments ( EnchantmentSlot  slot)
4254{
4255 // remove enchantments from equipped items first to clean up the m_enchantDuration list
4256 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(), next; itr != m_enchantDuration.end(); itr = next)
4257 {
4258 next = itr;
4259 if (itr->slot == slot)
4260 {
4261 if (itr->item && itr->item->GetEnchantmentId(slot))
4262 {
4263 // Poisons and DK runes are enchants which are allowed on arenas
4264 if (sSpellMgr->IsArenaAllowedEnchancment(itr->item->GetEnchantmentId(slot)))
4265 {
4266 ++next;
4267 continue;
4268 }
4269 // remove from stats
4270 ApplyEnchantment(itr->item, slot, false, false);
4271 // remove visual
4272 itr->item->ClearEnchantment(slot);
4273 }
4274 // remove from update list
4275 next = m_enchantDuration.erase(itr);
4276 }
4277 else
4278 ++next;
4279 }
4280
4281 // Xinef: check arena allowed enchantments :)
4282 // remove enchants from inventory items
4283 // NOTE: no need to remove these from stats, since these aren't equipped
4284 // in inventory
4286 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4287 if (uint32 enchId = pItem->GetEnchantmentId(slot))
4288 if (!sSpellMgr->IsArenaAllowedEnchancment(enchId))
4289 pItem->ClearEnchantment(slot);
4290
4291 // in inventory bags
4293 if (Bag* pBag = GetBagByPos(i))
4294 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4295 if (Item* pItem = pBag->GetItemByPos(j))
4296 if (uint32 enchId = pItem->GetEnchantmentId(slot))
4297 if (!sSpellMgr->IsArenaAllowedEnchancment(enchId))
4298 pItem->ClearEnchantment(slot);
4299}

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)
3479{
3480 // remove cooldowns on spells that have < 10 min CD
3482 SpellCooldowns::iterator itr, next;
3483 for (itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); itr = next)
3484 {
3485 next = itr;
3486 ++next;
3487 SpellInfo const* spellInfo = sSpellMgr->CheckSpellInfo(itr->first);
3488 if (!spellInfo)
3489 {
3490 continue;
3491 }
3492
3494 RemoveSpellCooldown(itr->first, true);
3495 else if (spellInfo->RecoveryTime < 10 * MINUTE * IN_MILLISECONDS && spellInfo->CategoryRecoveryTime < 10 * MINUTE * IN_MILLISECONDS && itr->second.end < infTime// xinef: dont remove active cooldowns - bugz
3496 && 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)
3497 RemoveSpellCooldown(itr->first, true);
3498 }
3499
3500 // pet cooldowns
3501 if (removeActivePetCooldowns)
3502 if (Pet* pet = GetPet())
3503 {
3504 // notify player
3505 for (CreatureSpellCooldowns::const_iterator itr2 = pet->m_CreatureSpellCooldowns.begin(); itr2 != pet->m_CreatureSpellCooldowns.end(); ++itr2)
3506 SendClearCooldown(itr2->first, pet);
3507
3508 // actually clear cooldowns
3509 pet->m_CreatureSpellCooldowns.clear();
3510 }
3511}
@ SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS
Definition: SharedDefines.h:519
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition: Player.cpp:3462

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 
)
14521{
14522 m_atLoginFlags &= ~flags;
14523
14524 if (persist)
14525 {
14527
14528 stmt->SetData(0, uint16(flags));
14529 stmt->SetData(1, GetGUID().GetCounter());
14530
14531 CharacterDatabase.Execute(stmt);
14532 }
14533}
@ 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)
12170{
12171 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12172 {
12173 if (_BgBattlegroundQueueID[i].bgQueueTypeId == val)
12174 {
12176 _BgBattlegroundQueueID[i].invitedToInstance = 0;
12177 return;
12178 }
12179 }
12180}

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)
3471{
3472 SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat);
3473 if (i_scstore != sSpellsByCategoryStore.end())
3474 for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset)
3475 RemoveSpellCooldown(i_scset->second, true);
3476}

References RemoveSpellCooldown(), and sSpellsByCategoryStore.

Referenced by spell_hun_readiness::HandleDummy(), spell_item_refocus::HandleDummy(), and Unit::HandleProcTriggerSpell().

◆ RemoveCorpse()

void Player::RemoveCorpse ( )
4574{
4575 if (GetCorpse())
4576 {
4578 }
4579
4580 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4581 Corpse::DeleteFromDB(GetGUID(), trans);
4582 CharacterDatabase.CommitTransaction(trans);
4583
4585}
void RemoveFromWorld() override
Definition: Corpse.cpp:53

References _corpseLocation, CharacterDatabase, Corpse::DeleteFromDB(), GetCorpse(), Object::GetGUID(), Corpse::RemoveFromWorld(), and WorldLocation::WorldRelocate().

Referenced by WorldSession::HandleMoveWorldportAck().

◆ RemovedInsignia()

void Player::RemovedInsignia ( Player looterPlr)
7619{
7620 // Xinef: If player is not in battleground and not in wintergrasp
7622 return;
7623
7624 // If not released spirit, do it !
7625 if (m_deathTimer > 0)
7626 {
7627 m_deathTimer = 0;
7630 }
7631
7633
7634 // We have to convert player corpse to bones, not to be able to resurrect there
7635 // SpawnCorpseBones isn't handy, 'cos it saves player while he in BG
7636 Corpse* bones = GetMap()->ConvertCorpseToBones(GetGUID(), true);
7637 if (!bones)
7638 return;
7639
7640 // Now we must make bones lootable, and send player loot
7642
7643 // We store the level of our player in the gold field
7644 // We retrieve this information at Player::SendLoot()
7645 bones->loot.gold = GetLevel();
7646 bones->lootRecipient = looterPlr;
7647 looterPlr->SendLoot(bones->GetGUID(), LOOT_INSIGNIA);
7648}
@ 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:3105
Player * lootRecipient
Definition: Corpse.h:78
Loot loot
Definition: Corpse.h:77
void SendLoot(ObjectGuid guid, LootType loot_type)
Definition: Player.cpp:7657
void BuildPlayerRepop()
Definition: Player.cpp:4326
uint32 gold
Definition: LootMgr.h:322
Corpse * ConvertCorpseToBones(ObjectGuid const ownerGuid, bool insignia=false)
Definition: Map.cpp:3607

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)
4228{
4229 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end();)
4230 {
4231 if (itr->item == item)
4232 {
4233 // save duration in item
4234 item->SetEnchantmentDuration(EnchantmentSlot(itr->slot), itr->leftduration, this);
4235 itr = m_enchantDuration.erase(itr);
4236 }
4237 else
4238 ++itr;
4239 }
4240}
void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration, Player *owner)
Definition: Item.cpp:943

References m_enchantDuration, and Item::SetEnchantmentDuration().

Referenced by _StoreItem(), DestroyItem(), EquipItem(), and RemoveItem().

◆ RemoveEnchantmentDurationsReferences()

void Player::RemoveEnchantmentDurationsReferences ( Item item)
4243{
4244 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end();)
4245 {
4246 if (itr->item == item)
4247 itr = m_enchantDuration.erase(itr);
4248 else
4249 ++itr;
4250 }
4251}

References m_enchantDuration.

Referenced by _SaveInventory().

◆ RemoveFromBattlegroundOrBattlefieldRaid()

void Player::RemoveFromBattlegroundOrBattlefieldRaid ( )
12994{
12995 //remove existing reference
12996 m_group.unlink();
12997 if (Group* group = GetOriginalGroup())
12998 {
12999 m_group.link(group, this);
13001 }
13002 SetOriginalGroup(nullptr);
13003}
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:13005
Group * GetOriginalGroup()
Definition: Player.h:2433
uint8 GetOriginalSubGroup() const
Definition: Player.h:2435
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
2314{
2315 if (group)
2316 {
2317 group->RemoveMember(guid, method, kicker, reason);
2318 group = nullptr;
2319 }
2320}
bool RemoveMember(ObjectGuid guid, const RemoveMethod &method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition: Group.cpp:546

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
1839{ RemoveFromGroup(GetGroup(), GetGUID(), method); }

References GetGroup(), Object::GetGUID(), and RemoveFromGroup().

Referenced by RemoveFromGroup().

◆ RemoveFromWhisperWhiteList()

void Player::RemoveFromWhisperWhiteList ( ObjectGuid  guid)
inline
2508{ 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.

1692{
1693 // cleanup
1694 if (IsInWorld())
1695 {
1700 ClearComboPoints(); // pussywizard: crashfix
1701 ClearComboPointHolders(); // pussywizard: crashfix
1702 if (ObjectGuid lguid = GetLootGUID()) // pussywizard: crashfix
1703 m_session->DoLootRelease(lguid);
1704 sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1705 sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1706 }
1707
1708 // Remove items from world before self - player must be found in Item::RemoveFromObjectUpdate
1709 for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
1710 {
1711 if (m_items[i])
1713 }
1714
1715 for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
1716 iter->second->RemoveFromWorld();
1717
1722
1723 if (m_uint32Values)
1724 {
1725 if (WorldObject* viewpoint = GetViewpoint())
1726 {
1727 LOG_FATAL("entities.player", "Player {} has viewpoint {} {} when removed from world", GetName(), viewpoint->GetEntry(), viewpoint->GetTypeId());
1728 SetViewpoint(viewpoint, false);
1729 }
1730 }
1731}
#define LOG_FATAL(filterType__,...)
Definition: Log.h:155
void SetViewpoint(WorldObject *target, bool apply)
Definition: Player.cpp:13062
void UnsummonPetTemporaryIfAny()
Definition: Player.cpp:14100
WorldObject * GetViewpoint() const
Definition: Player.cpp:13105
void ClearComboPointHolders()
Definition: Unit.cpp:17090
void RemoveFromWorld() override
Definition: Unit.cpp:15588
void DoLootRelease(ObjectGuid lguid)
Definition: LootHandler.cpp:267

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 
)
2928{
2929 // note: removeitem does not actually change the item
2930 // it only takes the item out of storage temporarily
2931 // note2: if removeitem is to be used for delinking
2932 // the item must be removed from the player's updatequeue
2933
2934 Item* pItem = GetItemByPos(bag, slot);
2935 if (pItem)
2936 {
2937 LOG_DEBUG("entities.player.items", "STORAGE: RemoveItem bag = {}, slot = {}, item = {}", bag, slot, pItem->GetEntry());
2938
2940 RemoveItemDurations(pItem);
2941 RemoveTradeableItem(pItem);
2942
2943 if (bag == INVENTORY_SLOT_BAG_0)
2944 {
2945 if (slot < INVENTORY_SLOT_BAG_END)
2946 {
2947 ItemTemplate const* pProto = pItem->GetTemplate();
2948 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
2949
2950 if (pProto && pProto->ItemSet)
2951 RemoveItemsSetItem(this, pProto);
2952
2953 _ApplyItemMods(pItem, slot, false);
2954 }
2955
2956 m_items[slot] = nullptr;
2957
2958 // remove item dependent auras and casts (only weapon and armor slots)
2959 if (slot < INVENTORY_SLOT_BAG_END && slot < EQUIPMENT_SLOT_END)
2960 {
2961 // Xinef: Ensure that this function is called for places with swap=true
2962 if (!swap)
2963 {
2965 }
2966
2967 // remove held enchantments, update expertise
2968 if (slot == EQUIPMENT_SLOT_MAINHAND)
2969 {
2971 }
2972 else if (slot == EQUIPMENT_SLOT_OFFHAND)
2973 {
2975 }
2976
2977 // update armor penetration - passive auras may need it
2978 switch (slot)
2979 {
2984 default:
2985 break;
2986 }
2987 }
2988
2990
2991 if (slot < EQUIPMENT_SLOT_END)
2992 SetVisibleItemSlot(slot, nullptr);
2993 }
2994 else if (Bag* pBag = GetBagByPos(bag))
2995 pBag->RemoveItem(slot, update);
2996
2998 // 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
2999 pItem->SetSlot(NULL_SLOT);
3000 if (IsInWorld() && update)
3001 pItem->SendUpdateToPlayer(this);
3002 }
3003}

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)
12474{
12475 for (AuraMap::iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end();)
12476 {
12477 Aura* aura = itr->second;
12478
12479 // skip passive (passive item dependent spells work in another way) and not self applied auras
12480 SpellInfo const* spellInfo = aura->GetSpellInfo();
12481 if (aura->IsPassive() || aura->GetCasterGUID() != GetGUID())
12482 {
12483 ++itr;
12484 continue;
12485 }
12486
12487 // skip if not item dependent or have alternative item
12488 if (HasItemFitToSpellRequirements(spellInfo, pItem))
12489 {
12490 ++itr;
12491 continue;
12492 }
12493
12494 // no alt item, remove aura, restart check
12495 RemoveOwnedAura(itr);
12496 }
12497
12498 // currently casted spells can be dependent from item
12499 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
12500 if (Spell* spell = GetCurrentSpell(CurrentSpellTypes(i)))
12501 if (spell->getState() != SPELL_STATE_DELAYED && !HasItemFitToSpellRequirements(spell->m_spellInfo, pItem))
12503}
#define CURRENT_MAX_SPELL
Definition: Unit.h:985
CurrentSpellTypes
Definition: Unit.h:977
@ SPELL_STATE_DELAYED
Definition: Spell.h:228
bool HasItemFitToSpellRequirements(SpellInfo const *spellInfo, Item const *ignoreItem=nullptr) const
Definition: Player.cpp:12411

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)
12344{
12345 for (ItemDurationList::iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end(); ++itr)
12346 {
12347 if (*itr == item)
12348 {
12349 m_itemDuration.erase(itr);
12350 break;
12351 }
12352 }
12353}

References m_itemDuration.

Referenced by _SaveInventory(), _StoreItem(), DestroyItem(), EquipItem(), and RemoveItem().

◆ RemoveItemFromBuyBackSlot()

void Player::RemoveItemFromBuyBackSlot ( uint32  slot,
bool  del 
)
4024{
4025 LOG_DEBUG("entities.player.items", "STORAGE: RemoveItemFromBuyBackSlot slot = {}", slot);
4026 if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END)
4027 {
4028 Item* pItem = m_items[slot];
4029 if (pItem)
4030 {
4031 pItem->RemoveFromWorld();
4032 if (del)
4033 pItem->SetState(ITEM_REMOVED, this);
4034 }
4035
4036 m_items[slot] = nullptr;
4037
4038 uint32 eslot = slot - BUYBACK_SLOT_START;
4042
4043 // if current backslot is filled set to now free slot
4045 m_currentBuybackSlot = slot;
4046 }
4047}

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 Object::SetUInt32Value().

Referenced by AddItemToBuyBackSlot(), and WorldSession::HandleBuybackItem().

◆ RemoveMail()

void Player::RemoveMail ( uint32  id)
2800{
2801 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
2802 {
2803 if ((*itr)->messageID == id)
2804 {
2805 //do not delete item, because Player::removeMail() is called when returning mail to sender.
2806 m_mail.erase(itr);
2807 return;
2808 }
2809 }
2810}

References m_mail.

Referenced by WorldSession::HandleMailReturnToSender().

◆ RemoveMItem()

bool Player::RemoveMItem ( ObjectGuid::LowType  itemLowGuid)
inline
1640 {
1641 return !!mMitems.erase(itemLowGuid);
1642 }

References mMitems.

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

◆ RemovePet()

void Player::RemovePet ( Pet pet,
PetSaveMode  mode,
bool  returnreagent = false 
)
8936{
8937 if (!pet)
8938 pet = GetPet();
8939
8940 if (pet)
8941 {
8942 // xinef: dont save dead pet as current, save him not in slot
8943 if (!pet->IsAlive() && mode == PET_SAVE_AS_CURRENT && pet->getPetType() == HUNTER_PET)
8944 {
8945 mode = PET_SAVE_NOT_IN_SLOT;
8947 }
8948
8949 LOG_DEBUG("entities.pet", "RemovePet {}, {}, {}", pet->GetEntry(), mode, returnreagent);
8950 if (pet->m_removed)
8951 return;
8952 }
8953
8954 if (returnreagent && (pet || (m_temporaryUnsummonedPetNumber && (!m_session || !m_session->PlayerLogout()))) && !InBattleground())
8955 {
8956 //returning of reagents only for players, so best done here
8958 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
8959
8960 if (spellInfo)
8961 {
8962 for (uint32 i = 0; i < MAX_SPELL_REAGENTS; ++i)
8963 {
8964 if (spellInfo->Reagent[i] > 0)
8965 {
8966 ItemPosCountVec dest; //for succubus, voidwalker, felhunter and felguard credit soulshard when despawn reason other than death (out of range, logout)
8967 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, spellInfo->Reagent[i], spellInfo->ReagentCount[i]);
8968 if (msg == EQUIP_ERR_OK)
8969 {
8970 Item* item = StoreNewItem(dest, spellInfo->Reagent[i], true);
8971 if (IsInWorld())
8972 SendNewItem(item, spellInfo->ReagentCount[i], true, false);
8973 }
8974 }
8975 }
8976 }
8978 }
8979
8980 if (!pet)
8981 {
8982 if (mode == PET_SAVE_NOT_IN_SLOT && m_petStable && m_petStable->CurrentPet)
8983 {
8984 // Handle removing pet while it is in "temporarily unsummoned" state, for example on mount
8986 stmt->SetData(0, PET_SAVE_NOT_IN_SLOT);
8987 stmt->SetData(1, GetGUID().GetCounter());
8988 stmt->SetData(2, m_petStable->CurrentPet->PetNumber);
8989 CharacterDatabase.Execute(stmt);
8990
8991 m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
8992 m_petStable->CurrentPet.reset();
8993 }
8994
8995 return;
8996 }
8997 else
8998 {
8999 pet->CombatStop();
9000
9001 if (returnreagent)
9002 {
9003 switch (pet->GetEntry())
9004 {
9005 //warlock pets except imp are removed(?) when logging out
9006 case 1860:
9007 case 1863:
9008 case 417:
9009 case 17252:
9010 mode = PET_SAVE_NOT_IN_SLOT;
9011 break;
9012 }
9013 }
9014
9015 // only if current pet in slot
9016 pet->SavePetToDB(mode);
9017
9018 if (m_petStable->CurrentPet && m_petStable->CurrentPet->PetNumber == pet->GetCharmInfo()->GetPetNumber())
9019 {
9020 if (mode == PET_SAVE_NOT_IN_SLOT)
9021 {
9022 m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
9023 m_petStable->CurrentPet.reset();
9024 }
9025 else if (mode == PET_SAVE_AS_DELETED)
9026 m_petStable->CurrentPet.reset();
9027 // else if (stable slots) handled in opcode handlers due to required swaps
9028 // else (current pet) doesnt need to do anything
9029 }
9030
9031 SetMinion(pet, false);
9032
9033 pet->AddObjectToRemoveList();
9034 pet->m_removed = true;
9035
9036 if (pet->isControlled())
9037 {
9039 data << uint64(0);
9040 GetSession()->SendPacket(&data);
9041
9042 if (GetGroup())
9044 }
9045
9047 {
9050 }
9051 }
9052}
@ CHAR_UPD_CHAR_PET_SLOT_BY_ID
Definition: CharacterDatabase.h:480
@ UNIT_CREATED_BY_SPELL
Definition: UpdateFields.h:138
@ PET_SAVE_AS_DELETED
Definition: PetDefines.h:41
@ GROUP_UPDATE_PET
Definition: Group.h:119
#define MAX_SPELL_REAGENTS
Definition: DBCStructure.h:1612
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition: ArenaSpectator.h:62
void AddObjectToRemoveList()
Definition: Object.cpp:2115
PetType getPetType() const
Definition: Pet.h:51
bool isControlled() const
Definition: Pet.h:53
bool m_removed
Definition: Pet.h:141
void SetGroupUpdateFlag(uint32 flag)
Definition: Player.h:2424
uint32 GetPetNumber() const
Definition: Unit.h:1099
std::array< int32, MAX_SPELL_REAGENTS > Reagent
Definition: SpellInfo.h:371
std::array< uint32, MAX_SPELL_REAGENTS > ReagentCount
Definition: SpellInfo.h:372

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
10007{
10008 SignatureContainer* signatureStore = sPetitionMgr->GetSignatureStore();
10009 for (SignatureContainer::iterator itr = signatureStore->begin(); itr != signatureStore->end(); ++itr)
10010 {
10011 SignatureMap::iterator signItr = itr->second.signatureMap.find(guid);
10012 if (signItr != itr->second.signatureMap.end())
10013 {
10014 Petition const* petition = sPetitionMgr->GetPetition(itr->first);
10015 if (!petition || (type != 10 && type != petition->petitionType))
10016 continue;
10017
10018 // erase this
10019 itr->second.signatureMap.erase(signItr);
10020
10021 // send update if charter owner in game
10023 if (owner)
10024 owner->GetSession()->SendPetitionQueryOpcode(petition->petitionGuid);
10025 }
10026 }
10027
10028 if (type == 10)
10029 {
10031 stmt->SetData(0, guid.GetCounter());
10032 CharacterDatabase.Execute(stmt);
10033 }
10034 else
10035 {
10037 stmt->SetData(0, guid.GetCounter());
10038 stmt->SetData(1, uint8(type));
10039 CharacterDatabase.Execute(stmt);
10040 }
10041
10042 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
10043 if (type == 10)
10044 {
10046 stmt->SetData(0, guid.GetCounter());
10047 trans->Append(stmt);
10048
10049 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER);
10050 stmt->SetData(0, guid.GetCounter());
10051 trans->Append(stmt);
10052
10053 // xinef: clear petition store
10054 sPetitionMgr->RemovePetitionByOwnerAndType(guid, 0);
10055 }
10056 else
10057 {
10059 stmt->SetData(0, guid.GetCounter());
10060 stmt->SetData(1, uint8(type));
10061 trans->Append(stmt);
10062
10064 stmt->SetData(0, guid.GetCounter());
10065 stmt->SetData(1, uint8(type));
10066 trans->Append(stmt);
10067
10068 // xinef: clear petition store
10069 sPetitionMgr->RemovePetitionByOwnerAndType(guid, uint8(type));
10070 }
10071 CharacterDatabase.CommitTransaction(trans);
10072}
@ CHAR_DEL_PETITION_SIGNATURE
Definition: CharacterDatabase.h:235
@ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER
Definition: CharacterDatabase.h:448
@ CHAR_DEL_ALL_PETITION_SIGNATURES
Definition: CharacterDatabase.h:234
@ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE
Definition: CharacterDatabase.h:450
@ CHAR_DEL_PETITION_BY_OWNER
Definition: CharacterDatabase.h:447
@ CHAR_DEL_PETITION_BY_OWNER_AND_TYPE
Definition: CharacterDatabase.h:449
#define sPetitionMgr
Definition: PetitionMgr.h:88
std::map< ObjectGuid, Signatures > SignatureContainer
Definition: PetitionMgr.h:53
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:279

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
2533{ m_receivedSpectatorResetFor.erase(guid); }

References m_receivedSpectatorResetFor.

◆ RemoveRestFlag()

void Player::RemoveRestFlag ( RestFlag  restFlag)
16047{
16048 uint32 oldRestMask = _restFlagMask;
16049 _restFlagMask &= ~restFlag;
16050
16051 if (oldRestMask && !_restFlagMask) // only remove flag/time on the last rest state remove
16052 {
16053 _restTime = 0;
16055 }
16056}

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 
)
1498{
1499 RewardedQuestSet::iterator rewItr = m_RewardedQuests.find(questId);
1500 if (rewItr != m_RewardedQuests.end())
1501 {
1502 m_RewardedQuests.erase(rewItr);
1503 m_RewardedQuestsSave[questId] = false;
1504 }
1505
1506 if (update)
1507 SendQuestUpdate(questId);
1508}

References m_RewardedQuests, m_RewardedQuestsSave, and SendQuestUpdate().

Referenced by Spell::EffectQuestClear().

◆ RemoveRunesByAuraEffect()

void Player::RemoveRunesByAuraEffect ( AuraEffect const *  aura)
13278{
13279 for (uint8 i = 0; i < MAX_RUNES; ++i)
13280 {
13281 if (m_runes->runes[i].ConvertAura == aura)
13282 {
13283 ConvertRune(i, GetBaseRune(i));
13284 SetRuneConvertAura(i, nullptr);
13285 }
13286 }
13287}
AuraEffect const * ConvertAura
Definition: Player.h:423

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 
)
3272{
3273 PlayerSpellMap::iterator itr = m_spells.find(spell_id);
3274 if (itr == m_spells.end())
3275 return;
3276
3277 // pussywizard: nothing to do if already removed or not in specs of removeSpecMask
3278 if (itr->second->State == PLAYERSPELL_REMOVED || (itr->second->specMask & removeSpecMask) == 0)
3279 return;
3280
3281 // pussywizard: avoid any possible bugs
3282 if (onlyTemporary && itr->second->State != PLAYERSPELL_TEMPORARY)
3283 return;
3284
3285 // pussywizard: remove non-talent higher ranks (recursive)
3286 // pussywizard: do this at the beginning, not in the middle of removing!
3287 if (uint32 nextSpell = sSpellMgr->GetNextSpellInChain(spell_id))
3288 if (!GetTalentSpellPos(nextSpell))
3289 removeSpell(nextSpell, removeSpecMask, onlyTemporary);
3290
3291 // xinef: if current spell has talentcost, remove spells requiring this spell
3292 uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spell_id);
3293 if (GetTalentSpellCost(firstRankSpellId))
3294 {
3295 SpellsRequiringSpellMapBounds spellsRequiringSpell = sSpellMgr->GetSpellsRequiringSpellBounds(firstRankSpellId);
3296 for (auto spellsItr = spellsRequiringSpell.first; spellsItr != spellsRequiringSpell.second; ++spellsItr)
3297 {
3298 removeSpell(spellsItr->second, removeSpecMask, onlyTemporary);
3299 }
3300 }
3301
3302 // pussywizard: re-search, it can be corrupted in prev loop
3303 itr = m_spells.find(spell_id);
3304 if (itr == m_spells.end())
3305 return;
3306
3307 itr->second->specMask = (((uint8)itr->second->specMask) & ~removeSpecMask); // pussywizard: update specMask in map
3308
3309 // 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)
3310 if (GetTalentSpellCost(firstRankSpellId) == 0 && !sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId) && itr->second->specMask == 0)
3311 {
3312 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_TEMPORARY)
3313 {
3314 delete itr->second;
3315 m_spells.erase(itr);
3316 }
3317 else
3318 itr->second->State = PLAYERSPELL_REMOVED;
3319 }
3320 else if (itr->second->State != PLAYERSPELL_NEW && itr->second->State != PLAYERSPELL_TEMPORARY)
3321 itr->second->State = PLAYERSPELL_CHANGED;
3322
3323 // xinef: this is used for talents and they are not removed in removeSpell function...
3324 // xinef: however ill leave this here just in case
3325 // pussywizard: remove owned aura obtained from currently removed spell
3326 RemoveOwnedAura(spell_id);
3327
3328 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id);
3329 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3330 {
3331 // pussywizard: remove pet auras
3332 if (PetAura const* petSpell = sSpellMgr->GetPetAura(spell_id, i))
3333 RemovePetAura(petSpell);
3334
3335 // pussywizard: remove all triggered auras
3336 if (spellInfo->Effects[i].TriggerSpell > 0)
3337 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
3338 }
3339
3340 // pussywizard: update free primary prof points
3341 if (spellInfo->IsPrimaryProfessionFirstRank())
3342 {
3343 uint32 freeProfs = GetFreePrimaryProfessionPoints() + 1;
3344 if (freeProfs <= sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL))
3345 SetFreePrimaryProfessions(freeProfs);
3346 }
3347
3348 // pussywizard: update 310 flyer
3349 if (Has310Flyer(false))
3350 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3351 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && spellInfo->Effects[i].CalcValue() == 310)
3352 Has310Flyer(true, spell_id);
3353
3354 // pussywizard: remove dependent skill
3355 SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spell_id);
3356 if (spellLearnSkill)
3357 {
3358 uint32 prev_spell = sSpellMgr->GetPrevSpellInChain(spell_id);
3359
3360 if (!prev_spell) // pussywizard: first rank, remove skill
3361 SetSkill(spellLearnSkill->skill, 0, 0, 0);
3362 else // pussywizard: search previous ranks
3363 {
3364 SpellLearnSkillNode const* prevSkill = sSpellMgr->GetSpellLearnSkill(prev_spell);
3365 while (!prevSkill && prev_spell)
3366 {
3367 prev_spell = sSpellMgr->GetPrevSpellInChain(prev_spell);
3368 prevSkill = sSpellMgr->GetSpellLearnSkill(sSpellMgr->GetFirstSpellInChain(prev_spell));
3369 }
3370
3371 if (!prevSkill) // pussywizard: not found prev skill setting, remove skill
3372 SetSkill(spellLearnSkill->skill, 0, 0, 0);
3373 else // pussywizard: set to prev skill setting values
3374 {
3375 uint32 skill_value = GetPureSkillValue(prevSkill->skill);
3376 uint32 skill_max_value = GetPureMaxSkillValue(prevSkill->skill);
3377 uint32 new_skill_max_value = prevSkill->maxvalue == 0 ? GetMaxSkillValueForLevel() : prevSkill->maxvalue;
3378
3379 if (skill_value > prevSkill->value)
3380 skill_value = prevSkill->value;
3381 if (skill_max_value > new_skill_max_value)
3382 skill_max_value = new_skill_max_value;
3383
3384 SetSkill(prevSkill->skill, prevSkill->step, skill_value, skill_max_value);
3385 }
3386 }
3387 }
3388 else
3389 {
3390 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id);
3391 // most likely will never be used, haven't heard of cases where players unlearn a mount
3392 if (Has310Flyer(false) && spellInfo)
3393 {
3394 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
3395 {
3396 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine);
3397 if (!pSkill)
3398 continue;
3399
3400 if (_spell_idx->second->SkillLine == SKILL_MOUNTS)
3401 {
3402 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3403 {
3404 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&
3405 spellInfo->Effects[i].CalcValue() == 310)
3406 {
3407 Has310Flyer(true, spell_id); // with true as first argument its also used to set/remove the flag
3408 break;
3409 }
3410 }
3411 }
3412 }
3413 }
3414 }
3415
3416 // pussywizard: remove from spell book (can't be replaced by previous rank, because such spells can't be unlearnt)
3417 if (!onlyTemporary || ((!spellInfo->HasAttribute(SpellAttr0(SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) || !spellInfo->HasAnyAura()) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL)))
3418 {
3419 sScriptMgr->OnPlayerForgotSpell(this, spell_id);
3420 SendLearnPacket(spell_id, false);
3421 }
3422}

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)
9908{
9909 if (!spell)
9910 return;
9911
9912 if (spell->m_appliedMods.empty())
9913 return;
9914
9915 SpellInfo const* const spellInfo = spell->m_spellInfo;
9916
9917 for (uint8 i = 0; i < MAX_SPELLMOD; ++i)
9918 {
9919 for (SpellModList::const_iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end();)
9920 {
9921 SpellModifier* mod = *itr;
9922 ++itr;
9923
9924 // don't handle spells with proc_event entry defined
9925 // this is a temporary workaround, because all spellmods should be handled like that
9926 if (sSpellMgr->GetSpellProcEvent(mod->spellId))
9927 {
9928 continue;
9929 }
9930
9931 // spellmods without aura set cannot be charged
9932 if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
9933 continue;
9934
9935 // check if mod affected this spell
9936 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
9937 if (iterMod == spell->m_appliedMods.end())
9938 continue;
9939
9940 // remove from list
9941 // leave this here, if spell have two mods it will remove 2 charges - wrong
9942 spell->m_appliedMods.erase(iterMod);
9943
9944 // MAGE T8P4 BONUS
9945 if( spellInfo->SpellFamilyName == SPELLFAMILY_MAGE )
9946 {
9947 SpellInfo const* sp = mod->ownerAura->GetSpellInfo();
9948 // Missile Barrage, Hot Streak, Brain Freeze (trigger spell - Fireball!)
9949 if( sp->SpellIconID == 3261 || sp->SpellIconID == 2999 || sp->SpellIconID == 2938 )
9950 if( AuraEffect* aurEff = GetAuraEffectDummy(64869) )
9951 if( roll_chance_i(aurEff->GetAmount()) )
9952 {
9953 mod->charges = 1;
9954 continue;
9955 }
9956 }
9957
9959 itr = m_spellMods[i].begin();
9960 }
9961 }
9962}
@ AURA_REMOVE_BY_EXPIRE
Definition: SpellAuraDefines.h:395
#define MAX_SPELLMOD
Definition: SpellDefines.h:110
@ SPELLFAMILY_MAGE
Definition: SharedDefines.h:3503
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition: Unit.cpp:5468
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:378

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 
)
13809{
13811}
void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
Definition: AchievementMgr.cpp:2172

References m_achievementMgr, and AchievementMgr::RemoveTimedAchievement().

Referenced by WorldSession::HandleQuestLogRemoveQuest().

◆ RemoveTimedQuest()

void Player::RemoveTimedQuest ( uint32  quest_id)
inline
1521{ m_timedquests.erase(quest_id); }

References m_timedquests.

Referenced by FailQuest(), WorldSession::HandleQuestLogRemoveQuest(), and RewardQuest().

◆ RemoveTradeableItem()

◆ ReplaceAllPlayerFlags()

void Player::ReplaceAllPlayerFlags ( PlayerFlags  flags)
inline
1093{ SetUInt32Value(PLAYER_FLAGS, flags); }

References PLAYER_FLAGS, and Object::SetUInt32Value().

Referenced by LoadFromDB().

◆ RepopAtGraveyard()

void Player::RepopAtGraveyard ( )
4822{
4823 // note: this can be called also when the player is alive
4824 // for example from WorldSession::HandleMovementOpcodes
4825
4826 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(GetAreaId());
4827
4828 if (!sScriptMgr->CanRepopAtGraveyard(this))
4829 return;
4830
4831 // Such zones are considered unreachable as a ghost and the player must be automatically revived
4832 // Xinef: Get Transport Check is not needed
4833 if ((!IsAlive() && zone && zone->flags & AREA_FLAG_NEED_FLY) /*|| GetTransport()*/ || GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY()))
4834 {
4835 ResurrectPlayer(0.5f);
4837 }
4838
4839 GraveyardStruct const* ClosestGrave = nullptr;
4840
4841 // Special handle for battleground maps
4842 if (Battleground* bg = GetBattleground())
4843 ClosestGrave = bg->GetClosestGraveyard(this);
4844 else
4845 {
4846 if (sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId()))
4847 ClosestGrave = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())->GetClosestGraveyard(this);
4848 else
4849 ClosestGrave = sGraveyard->GetClosestGraveyard(this, GetTeamId());
4850 }
4851
4852 // stop countdown until repop
4853 m_deathTimer = 0;
4854
4855 // if no grave found, stay at the current location
4856 // and don't show spirit healer location
4857 if (ClosestGrave)
4858 {
4859 TeleportTo(ClosestGrave->Map, ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, GetOrientation());
4860 if (isDead()) // not send if alive, because it used in TeleportTo()
4861 {
4862 WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // show spirit healer position on minimap
4863 data << ClosestGrave->Map;
4864 data << ClosestGrave->x;
4865 data << ClosestGrave->y;
4866 data << ClosestGrave->z;
4867 GetSession()->SendPacket(&data);
4868 }
4869 }
4870 else if (GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY()))
4872
4874}
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition: Player.h:489
#define sGraveyard
Definition: GameGraveyard.h:75
@ AREA_FLAG_NEED_FLY
Definition: DBCEnums.h:251
@ 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_homebindO, 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.

11273{
11275 // Battleground also must be in progress!
11276 if (!bg || bg != reporter->GetBattleground() || GetTeamId() != reporter->GetTeamId() || bg->GetStatus() != STATUS_IN_PROGRESS)
11277 return;
11278
11279 // Xinef: 2 minutes startup + 2 minute of match
11281 return;
11282
11283 // check if player has 'Idle' or 'Inactive' debuff
11284 if (m_bgData.bgAfkReporter.find(reporter->GetGUID()) == m_bgData.bgAfkReporter.end() && !HasAura(43680) && !HasAura(43681) && reporter->CanReportAfkDueToLimit())
11285 {
11286 m_bgData.bgAfkReporter.insert(reporter->GetGUID());
11287 // by default 3 players have to complain to apply debuff
11288 if (m_bgData.bgAfkReporter.size() >= sWorld->getIntConfig(CONFIG_BATTLEGROUND_REPORT_AFK))
11289 {
11290 // cast 'Idle' spell
11291 CastSpell(this, 43680, true);
11292 m_bgData.bgAfkReporter.clear();
11293 }
11294 }
11295}
@ CONFIG_BATTLEGROUND_REPORT_AFK_TIMER
Definition: IWorld.h:310
@ CONFIG_BATTLEGROUND_REPORT_AFK
Definition: IWorld.h:311
uint32 GetStartTime() const
Definition: Battleground.h:324
bool CanReportAfkDueToLimit()
Definition: Player.cpp:11262

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)
2193{
2194 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2195 {
2196 if (uint32 questid = GetQuestSlotQuestId(i))
2197 {
2198 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2199 {
2200 if (qInfo->GetRepObjectiveFaction() == factionEntry->ID)
2201 {
2202 QuestStatusData& q_status = m_QuestStatus[questid];
2203 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2204 {
2205 if (GetReputationMgr().GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue())
2206 if (CanCompleteQuest(questid))
2207 CompleteQuest(questid);
2208 }
2209 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2210 {
2211 if (GetReputationMgr().GetReputation(factionEntry) < qInfo->GetRepObjectiveValue())
2212 IncompleteQuest(questid);
2213 }
2214 }
2215 }
2216 }
2217 }
2218}

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)
2221{
2222 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2223 {
2224 if (uint32 questid = GetQuestSlotQuestId(i))
2225 {
2226 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2227 {
2228 if (qInfo->GetRepObjectiveFaction2() == factionEntry->ID)
2229 {
2230 QuestStatusData& q_status = m_QuestStatus[questid];
2231 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2232 {
2233 if (GetReputationMgr().GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue2())
2234 if (CanCompleteQuest(questid))
2235 CompleteQuest(questid);
2236 }
2237 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2238 {
2239 if (GetReputationMgr().GetReputation(factionEntry) < qInfo->GetRepObjectiveValue2())
2240 IncompleteQuest(questid);
2241 }
2242 }
2243 }
2244 }
2245 }
2246}

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 
)
13814{
13815 m_achievementMgr->ResetAchievementCriteria(condition, value, evenIfCriteriaComplete);
13816}
void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
Definition: AchievementMgr.cpp:513

References m_achievementMgr, and AchievementMgr::ResetAchievementCriteria().

Referenced by Battleground::AddPlayer(), spell_algalon_supermassive_fail::spell_algalon_supermassive_fail_SpellScript::RecalculateDamage(), Battleground::RemovePlayerAtLeave(), and setDeathState().

◆ ResetAchievements()

void Player::ResetAchievements ( )
13789{
13791}
void Reset()
Definition: AchievementMgr.cpp:489

References m_achievementMgr, and AchievementMgr::Reset().

Referenced by reset_commandscript::HandleResetAchievementsCommand().

◆ ResetAllPowers()

void Player::ResetAllPowers ( )
2011{
2013 switch (getPowerType())
2014 {
2015 case POWER_MANA:
2017 break;
2018 case POWER_RAGE:
2019 SetPower(POWER_RAGE, 0);
2020 break;
2021 case POWER_ENERGY:
2023 break;
2024 case POWER_RUNIC_POWER:
2026 break;
2027 default:
2028 break;
2029 }
2030}

References Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::getPowerType(), POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, Unit::SetHealth(), and Unit::SetPower().

Referenced by Battleground::AddPlayer().

◆ ResetContestedPvP()

void Player::ResetContestedPvP ( )
inline
1821 {
1825 }
@ PLAYER_FLAGS_CONTESTED_PVP
Definition: Player.h:483
@ UNIT_STATE_ATTACK_PLAYER
Definition: Unit.h:339
void ClearUnitState(uint32 f)
Definition: Unit.h:1399

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 ( )
12056{
12057 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12058 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, 0);
12059
12060 m_DFQuests.clear(); // Dungeon Finder Quests.
12061
12062 // DB data deleted in caller
12063 m_DailyQuestChanged = false;
12065}

References m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and Object::SetUInt32Value().

◆ ResetFarSightDistance()

void Player::ResetFarSightDistance ( )
16157{
16158 _farSightDistance.reset();
16159}

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}
std::unordered_map< uint32, InstancePlayerBind > BoundInstancesMap
Definition: InstanceSaveMgr.h:46
@ INSTANCE_RESET_GROUP_JOIN
Definition: Map.h:808
@ INSTANCE_RESET_CHANGE_DIFFICULTY
Definition: Map.h:806
@ INSTANCE_RESET_GROUP_LEAVE
Definition: Map.h:809
@ INSTANCE_RESET_ALL
Definition: Map.h:805
#define MAX_DIFFICULTY
Definition: DBCEnums.h:288
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:544
bool Reset(uint8 method, GuidList *globalSkipList=nullptr)
Definition: Map.cpp:3084

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.

14547{
14548 // this may be called during Map::Update
14549 // after decrement+unlink, ++m_mapRefIter will continue correctly
14550 // when the first element of the list is being removed
14551 // nocheck_prev will return the padding element of the RefMgr
14552 // instead of nullptr in the case of prev
14553 GetMap()->UpdateIteratorBack(this);
14555 GetMapRef().unlink();
14556}
virtual void ResetMap()
Definition: Object.cpp:2097
MapReference & GetMapRef()
Definition: Player.h:2441
void UpdateIteratorBack(Player *player)
Definition: Map.cpp:3322

References WorldObject::GetMap(), GetMapRef(), WorldObject::ResetMap(), Reference< TO, FROM >::unlink(), and Map::UpdateIteratorBack().

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::HandleSetRaidDifficultyOpcode().

◆ ResetMonthlyQuestStatus()

void Player::ResetMonthlyQuestStatus ( )
12088{
12089 if (m_monthlyquests.empty())
12090 return;
12091
12092 m_monthlyquests.clear();
12093 // DB data deleted in caller
12094 m_MonthlyQuestChanged = false;
12095}

References m_MonthlyQuestChanged, and m_monthlyquests.

◆ ResetPetTalents()

void Player::ResetPetTalents ( )
8766{
8767 // This needs another gossip option + NPC text as a confirmation.
8768 // The confirmation gossip listid has the text: "Yes, please do."
8769 Pet* pet = GetPet();
8770
8771 if (!pet || pet->getPetType() != HUNTER_PET || pet->m_usedTalentCount == 0)
8772 return;
8773
8774 CharmInfo* charmInfo = pet->GetCharmInfo();
8775 if (!charmInfo)
8776 {
8777 LOG_ERROR("entities.player", "Object ({}) is considered pet-like but doesn't have a charminfo!", pet->GetGUID().ToString());
8778 return;
8779 }
8780 pet->resetTalents();
8781 SendTalentsInfoData(true);
8782}
uint32 m_usedTalentCount
Definition: Pet.h:133
bool resetTalents()
Definition: Pet.cpp:2022

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)
12078{
12079 if (m_seasonalquests.empty() || m_seasonalquests[event_id].empty())
12080 return;
12081
12082 m_seasonalquests.erase(event_id);
12083 // DB data deleted in caller
12084 m_SeasonalQuestChanged = false;
12085}

References m_SeasonalQuestChanged, and m_seasonalquests.

◆ resetSpells()

void Player::resetSpells ( )
11715{
11716 // not need after this call
11719
11720 // make full copy of map (spells removed and marked as deleted at another spell remove
11721 // and we can't use original map for safe iterative with visit each spell at loop end
11722 PlayerSpellMap spellMap = GetSpellMap();
11723
11724 for (PlayerSpellMap::const_iterator iter = spellMap.begin(); iter != spellMap.end(); ++iter)
11725 removeSpell(iter->first, SPEC_MASK_ALL, false);
11726
11730}
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition: Player.h:194
@ AT_LOGIN_RESET_SPELLS
Definition: Player.h:602
PlayerSpellMap const & GetSpellMap() const
Definition: Player.h:1726

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)
3644{
3645 sScriptMgr->OnPlayerTalentsReset(this, noResetCost);
3646
3647 // xinef: remove at login flag upon talents reset
3650
3651 // xinef: get max available talent points amount
3652 uint32 talentPointsForLevel = CalculateTalentsPoints();
3653
3654 // xinef: no talent points are used, return
3655 if (m_usedTalentCount == 0)
3656 return false;
3658
3659 // xinef: check if we have enough money
3660 uint32 resetCost = 0;
3661 if (!noResetCost && !sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST))
3662 {
3663 resetCost = resetTalentsCost();
3664 if (!HasEnoughMoney(resetCost))
3665 {
3667 return false;
3668 }
3669 }
3670
3671 RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
3672
3673 // xinef: reset talents
3674 for (PlayerTalentMap::iterator iter = m_talents.begin(); iter != m_talents.end(); )
3675 {
3676 PlayerTalentMap::iterator itr = iter++;
3677
3678 if (itr->second->State == PLAYERSPELL_REMOVED)
3679 continue;
3680
3681 // xinef: talent not in current spec
3682 if (!(itr->second->specMask & GetActiveSpecMask()))
3683 continue;
3684
3685 // xinef: remove talent auras
3686 _removeTalentAurasAndSpells(itr->first);
3687
3688 // xinef: check if talent learns spell to spell book
3689 TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID);
3690 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
3691
3692 bool removed = false;
3693 if (talentInfo->addToSpellBook)
3694 if (!spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3695 {
3696 removeSpell(itr->first, GetActiveSpecMask(), false);
3697 removed = true;
3698 }
3699
3700 // Xinef: send unlearn spell packet at talent remove
3701 if (!removed)
3702 SendLearnPacket(itr->first, false);
3703
3704 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3705 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
3706 if (sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
3707 removeSpell(spellInfo->Effects[i].TriggerSpell, GetActiveSpecMask(), false);
3708
3709 // xinef: remove talent modifies m_talents, move itr to map begin
3711 }
3712
3713 // xinef: remove titan grip if player had it set
3714 if (m_canTitanGrip)
3715 SetCanTitanGrip(false);
3716 // xinef: remove dual wield if player does not have dual wield spell (shamans)
3717 if (!HasSpell(674) && m_canDualWield)
3718 SetCanDualWield(false);
3719
3721
3722 // 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)
3723 SetFreeTalentPoints(talentPointsForLevel);
3724
3725 if (!noResetCost)
3726 {
3727 ModifyMoney(-(int32)resetCost);
3730
3731 m_resetTalentsCost = resetCost;
3733 }
3734
3735 return true;
3736}
@ AT_LOGIN_RESET_TALENTS
Definition: Player.h:603
@ CONFIG_NO_RESET_TALENT_COST
Definition: IWorld.h:134
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS
Definition: DBCEnums.h:179
@ ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS
Definition: DBCEnums.h:180
uint32 resetTalentsCost() const
Definition: Player.cpp:3610

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
3611{
3612 // The first time reset costs 1 gold
3613 if (m_resetTalentsCost < 1 * GOLD)
3614 return 1 * GOLD;
3615 // then 5 gold
3616 else if (m_resetTalentsCost < 5 * GOLD)
3617 return 5 * GOLD;
3618 // After that it increases in increments of 5 gold
3619 else if (m_resetTalentsCost < 10 * GOLD)
3620 return 10 * GOLD;
3621 else
3622 {
3623 uint64 months = (GameTime::GetGameTime().count() - m_resetTalentsTime) / MONTH;
3624 if (months > 0)
3625 {
3626 // This cost will be reduced by a rate of 5 gold per month
3627 int32 new_cost = int32(m_resetTalentsCost - 5 * GOLD * months);
3628 // to a minimum of 10 gold.
3629 return (new_cost < 10 * GOLD ? 10 * GOLD : new_cost);
3630 }
3631 else
3632 {
3633 // After that it increases in increments of 5 gold
3634 int32 new_cost = m_resetTalentsCost + 5 * GOLD;
3635 // until it hits a cap of 50 gold.
3636 if (new_cost > 50 * GOLD)
3637 new_cost = 50 * GOLD;
3638 return new_cost;
3639 }
3640 }
3641}
constexpr auto MONTH
Definition: Common.h:60
@ GOLD
Definition: SharedDefines.h:225

References GameTime::GetGameTime(), GOLD, m_resetTalentsCost, m_resetTalentsTime, and MONTH.

Referenced by resetTalents(), and SendTalentWipeConfirm().

◆ ResetWeeklyQuestStatus()

void Player::ResetWeeklyQuestStatus ( )
12068{
12069 if (m_weeklyquests.empty())
12070 return;
12071
12072 m_weeklyquests.clear();
12073 // DB data deleted in caller
12074 m_WeeklyQuestChanged = false;
12075}

References m_WeeklyQuestChanged, and m_weeklyquests.

◆ RestoreAllSpellMods()

void Player::RestoreAllSpellMods ( uint32  ownerAuraId = 0,
Aura aura = nullptr 
)
9901{
9902 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
9903 if (m_currentSpells[i])
9904 RestoreSpellMods(m_currentSpells[i], ownerAuraId, aura);
9905}
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition: Player.cpp:9833
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition: Unit.h:2501

References CURRENT_MAX_SPELL, Unit::m_currentSpells, and RestoreSpellMods().

◆ RestoreBaseRune()

void Player::RestoreBaseRune ( uint8  index)
13290{
13291 AuraEffect const* aura = m_runes->runes[index].ConvertAura;
13292 // If rune was converted by a non-pasive aura that still active we should keep it converted
13293 if (aura && !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_PASSIVE))
13294 return;
13295 ConvertRune(index, GetBaseRune(index));
13296 SetRuneConvertAura(index, nullptr);
13297 // Don't drop passive talents providing rune convertion
13298 if (!aura || aura->GetAuraType() != SPELL_AURA_CONVERT_RUNE)
13299 return;
13300 for (uint8 i = 0; i < MAX_RUNES; ++i)
13301 {
13302 if (aura == m_runes->runes[i].ConvertAura)
13303 return;
13304 }
13305 aura->GetBase()->Remove();
13306}
@ 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:2928

References healthBeforeDuel, and Unit::SetHealth().

◆ RestoreManaAfterDuel()

void Player::RestoreManaAfterDuel ( )
inline
uint32 manaBeforeDuel
Definition: Player.h:2929

References manaBeforeDuel, POWER_MANA, and Unit::SetPower().

◆ RestoreSpellMods()

void Player::RestoreSpellMods ( Spell spell,
uint32  ownerAuraId = 0,
Aura aura = nullptr 
)
Todo:
track these changes correctly
9834{
9835 if (!spell || spell->m_appliedMods.empty())
9836 return;
9837
9838 std::list<Aura*> aurasQueue;
9839
9840 for (uint8 i = 0; i < MAX_SPELLMOD; ++i)
9841 {
9842 for (SpellModList::iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end(); ++itr)
9843 {
9844 SpellModifier* mod = *itr;
9845
9846 // Spellmods without aura set cannot be charged
9847 if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
9848 continue;
9849
9850 // Restore only specific owner aura mods
9851 if (ownerAuraId && (ownerAuraId != mod->ownerAura->GetSpellInfo()->Id))
9852 continue;
9853
9854 if (aura && mod->ownerAura != aura)
9855 continue;
9856
9857 // Check if mod affected this spell
9858 // First, check if the mod aura applied at least one spellmod to this spell
9859 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
9860 if (iterMod == spell->m_appliedMods.end())
9861 continue;
9862 // Second, check if the current mod is one of those applied by the mod aura
9863 if (!(mod->mask & spell->m_spellInfo->SpellFamilyFlags))
9864 continue;
9865
9866 // remove from list - This will be done after all mods have been gone through
9867 // to ensure we iterate over all mods of an aura before removing said aura
9868 // from applied mods (Else, an aura with two mods on the current spell would
9869 // only see the first of its modifier restored)
9870 aurasQueue.push_back(mod->ownerAura);
9871
9872 // add mod charges back to mod
9873 if (mod->charges == -1)
9874 mod->charges = 1;
9875 else
9876 mod->charges++;
9877
9878 // Do not set more spellmods than available
9879 if (mod->ownerAura->GetCharges() < mod->charges)
9880 mod->charges = mod->ownerAura->GetCharges();
9881
9882 // Skip this check for now - aura charges may change due to various reason
9884 //ASSERT (mod->ownerAura->GetCharges() <= mod->charges);
9885 }
9886 }
9887
9888 for (std::list<Aura*>::iterator itr = aurasQueue.begin(); itr != aurasQueue.end(); ++itr)
9889 {
9890 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(*itr);
9891 if (iterMod != spell->m_appliedMods.end())
9892 spell->m_appliedMods.erase(iterMod);
9893 }
9894
9895 // Xinef: clear the list just do be sure
9896 if (!ownerAuraId && !aura)
9897 spell->m_appliedMods.clear();
9898}
uint8 GetCharges() const
Definition: SpellAuras.h:141
flag96 SpellFamilyFlags
Definition: SpellInfo.h:386

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 ( )
14116{
14118 return;
14119
14120 // not resummon in not appropriate state
14122 return;
14123
14124 if (GetPetGUID())
14125 return;
14126
14128 return;
14129
14130 Pet* newPet = new Pet(this);
14131 if (!newPet->LoadPetFromDB(this, 0, m_temporaryUnsummonedPetNumber, true))
14132 delete newPet;
14133
14135}
bool IsPetNeedBeTemporaryUnsummoned() const
Definition: Player.h:2367
uint32 GetLastPetSpell() const
Definition: Player.h:2409
bool CanResummonPet(uint32 spellid)
Definition: Player.cpp:14137

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

12719{
12722
12723 if (IsBeingTeleported())
12724 {
12726 return;
12727 }
12728
12729 ResurrectPlayer(0.0f, false);
12730
12733 else
12734 SetFullHealth();
12735
12738 else
12740
12741 SetPower(POWER_RAGE, 0);
12742
12744
12746}
void ScheduleDelayedOperation(uint32 operation)
Definition: Player.h:2050
float m_resurrectZ
Definition: Player.h:2777
uint32 m_resurrectMap
Definition: Player.h:2776
float m_resurrectX
Definition: Player.h:2777
float m_resurrectY
Definition: Player.h:2777

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 
)
4376{
4377 WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // remove spirit healer position
4378 data << uint32(-1);
4379 data << float(0);
4380 data << float(0);
4381 data << float(0);
4382 GetSession()->SendPacket(&data);
4383
4384 // speed change, land walk
4385
4386 // remove death flag + set aura
4388 RemoveAurasDueToSpell(20584); // speed bonuses
4389 RemoveAurasDueToSpell(8326); // SPELL_AURA_GHOST
4390
4391 if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0))
4393
4397 SetWaterWalking(false);
4398 m_deathTimer = 0;
4399
4400 // set health/powers (0- will be set in caller)
4401 if (restore_percent > 0.0f)
4402 {
4403 SetHealth(uint32(GetMaxHealth()*restore_percent));
4404 SetPower(POWER_MANA, uint32(GetMaxPower(POWER_MANA)*restore_percent));
4405 SetPower(POWER_RAGE, 0);
4407 }
4408
4409 // trigger update zone for alive state zone updates
4410 uint32 newzone, newarea;
4411 GetZoneAndAreaId(newzone, newarea);
4412 UpdateZone(newzone, newarea);
4413 sOutdoorPvPMgr->HandlePlayerResurrects(this, newzone);
4414
4415 if (Battleground* bg = GetBattleground())
4416 bg->HandlePlayerResurrect(this);
4417
4418 // update visibility
4420
4421 sScriptMgr->OnPlayerResurrect(this, restore_percent, applySickness);
4422
4423 if (!applySickness)
4424 {
4425 return;
4426 }
4427
4428 //Characters from level 1-10 are not affected by resurrection sickness.
4429 //Characters from level 11-19 will suffer from one minute of sickness
4430 //for each level they are above 10.
4431 //Characters level 20 and up suffer from ten minutes of sickness.
4432 int32 startLevel = sWorld->getIntConfig(CONFIG_DEATH_SICKNESS_LEVEL);
4433
4434 if (int32(GetLevel()) >= startLevel)
4435 {
4436 // set resurrection sickness
4437 CastSpell(this, 15007, true);
4438
4439 // not full duration
4440 if (int32(GetLevel()) < startLevel + 9)
4441 {
4442 int32 delta = (int32(GetLevel()) - startLevel + 1) * MINUTE;
4443
4444 if (Aura* aur = GetAura(15007, GetGUID()))
4445 {
4446 aur->SetDuration(delta * IN_MILLISECONDS);
4447 }
4448 }
4449 }
4450}
@ MOVE_LAND_WALK
Definition: Player.h:460
@ UNIT_BYTE1_FLAG_GROUND
Definition: Unit.h:79
@ ALIVE
Definition: Unit.h:316
@ CONFIG_DEATH_SICKNESS_LEVEL
Definition: IWorld.h:303
void GetZoneAndAreaId(uint32 &zoneid, uint32 &areaid) const
Definition: Object.cpp:3091
void UpdateZone(uint32 newZone, uint32 newArea)
Definition: PlayerUpdates.cpp:1208
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: PlayerUpdates.cpp:1568

References ALIVE, 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)
13319{
13320 WorldPacket data(SMSG_RESYNC_RUNES, 4 + count * 2);
13321 data << uint32(count);
13322 for (uint32 i = 0; i < count; ++i)
13323 {
13324 data << uint8(GetCurrentRune(i)); // rune type
13325 data << uint8(255 - (GetRuneCooldown(i) * 51)); // passed cooldown time (0-255)
13326 }
13327 GetSession()->SendPacket(&data);
13328}
@ SMSG_RESYNC_RUNES
Definition: Opcodes.h:1189
RuneType GetCurrentRune(uint8 index) const
Definition: Player.h:2457

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)

5957{
5958 if (bonusTalentPoints)
5959 {
5960 m_extraBonusTalentCount += bonusTalentPoints;
5961 }
5962}

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)

5968{
5969 // do not reward honor in arenas, but enable onkill spellproc
5970 if (InArena())
5971 {
5972 if (!uVictim || uVictim == this || uVictim->GetTypeId() != TYPEID_PLAYER)
5973 return false;
5974
5975 if (GetBgTeamId() == uVictim->ToPlayer()->GetBgTeamId())
5976 return false;
5977
5978 return true;
5979 }
5980
5981 // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
5983 return false;
5984
5985 /* check if player has same IP
5986 if (uVictim && uVictim->GetTypeId() == TYPEID_PLAYER)
5987 {
5988 if (GetSession()->GetRemoteAddress() == uVictim->ToPlayer()->GetSession()->GetRemoteAddress())
5989 return false;
5990 }
5991 */
5992
5993 ObjectGuid victim_guid;
5994 uint32 victim_rank = 0;
5995
5996 // need call before fields update to have chance move yesterday data to appropriate fields before today data change.
5998
5999 // do not reward honor in arenas, but return true to enable onkill spellproc
6000 if (InArena())
6001 return true;
6002
6003 // Promote to float for calculations
6004 float honor_f = (float)honor;
6005
6006 if (honor_f <= 0)
6007 {
6008 if (!uVictim || uVictim == this || uVictim->HasAuraType(SPELL_AURA_NO_PVP_CREDIT))
6009 return false;
6010
6011 victim_guid = uVictim->GetGUID();
6012
6013 if (uVictim->GetTypeId() == TYPEID_PLAYER)
6014 {
6015 Player* victim = uVictim->ToPlayer();
6016
6017 if (GetTeamId() == victim->GetTeamId() && !sWorld->IsFFAPvPRealm())
6018 return false;
6019
6020 uint8 k_level = GetLevel();
6021 uint8 k_grey = Acore::XP::GetGrayLevel(k_level);
6022 uint8 v_level = victim->GetLevel();
6023
6024 if (v_level <= k_grey)
6025 return false;
6026
6027 // PLAYER_CHOSEN_TITLE VALUES DESCRIPTION
6028 // [0] Just name
6029 // [1..14] Alliance honor titles and player name
6030 // [15..28] Horde honor titles and player name
6031 // [29..38] Other title and player name
6032 // [39+] Nothing
6033 uint32 victim_title = victim->GetUInt32Value(PLAYER_CHOSEN_TITLE);
6034 uint32 killer_title = 0;
6035 sScriptMgr->OnVictimRewardBefore(this, victim, killer_title, victim_title);
6036 // Get Killer titles, CharTitlesEntry::bit_index
6037 // Ranks:
6038 // title[1..14] -> rank[5..18]
6039 // title[15..28] -> rank[5..18]
6040 // title[other] -> 0
6041 if (victim_title == 0)
6042 victim_guid.Clear(); // Don't show HK: <rank> message, only log.
6043 else if (victim_title < 15)
6044 victim_rank = victim_title + 4;
6045 else if (victim_title < 29)
6046 victim_rank = victim_title - 14 + 4;
6047 else
6048 victim_guid.Clear(); // Don't show HK: <rank> message, only log.
6049
6050 honor_f = std::ceil(Acore::Honor::hk_honor_at_level_f(k_level) * (v_level - k_grey) / (k_level - k_grey));
6051
6052 // count the number of playerkills in one day
6054 // and those in a lifetime
6062 sScriptMgr->OnVictimRewardAfter(this, victim, killer_title, victim_rank, honor_f);
6063 }
6064 else
6065 {
6066 if (!uVictim->ToCreature()->IsRacialLeader())
6067 return false;
6068
6069 honor_f = 100.0f; // ??? need more info
6070 victim_rank = 19; // HK: Leader
6071 }
6072 }
6073
6074 if (uVictim)
6075 {
6076 if (groupsize > 1)
6077 honor_f /= groupsize;
6078
6079 // apply honor multiplier from aura (not stacking-get highest)
6081 }
6082
6083 honor_f *= sWorld->getRate(RATE_HONOR);
6084 // Back to int now
6085 honor = int32(honor_f);
6086 // honor - for show honor points in log
6087 // victim_guid - for show victim name in log
6088 // victim_rank [1..4] HK: <dishonored rank>
6089 // victim_rank [5..19] HK: <alliance\horde rank>
6090 // victim_rank [0, 20+] HK: <>
6091 WorldPacket data(SMSG_PVP_CREDIT, 4 + 8 + 4);
6092 data << honor;
6093 data << victim_guid;
6094 data << victim_rank;
6095
6096 // Xinef: non quest case, quest honor obtain is send in quest reward packet
6097 if (uVictim || groupsize > 0)
6098 GetSession()->SendPacket(&data);
6099
6100 // add honor points
6101 ModifyHonorPoints(honor);
6102
6104
6105 // Xinef: Battleground experience
6106 if (awardXP)
6107 if (Battleground* bg = GetBattleground())
6108 {
6109 bg->UpdatePlayerScore(this, SCORE_BONUS_HONOR, honor, false); //false: prevent looping
6110 // Xinef: Only for BG activities
6111 if (!uVictim)
6112 GiveXP(uint32(honor * (3 + GetLevel() * 0.30f)), nullptr);
6113 }
6114
6115 if (sWorld->getBoolConfig(CONFIG_PVP_TOKEN_ENABLE))
6116 {
6117 if (!uVictim || uVictim == this || uVictim->HasAuraType(SPELL_AURA_NO_PVP_CREDIT))
6118 return true;
6119
6120 if (uVictim->GetTypeId() == TYPEID_PLAYER)
6121 {
6122 // Check if allowed to receive it in current map
6124 if ((MapType == 1 && !InBattleground() && !IsFFAPvP())
6125 || (MapType == 2 && !IsFFAPvP())
6126 || (MapType == 3 && !InBattleground()))
6127 return true;
6128
6129 uint32 itemID = sWorld->getIntConfig(CONFIG_PVP_TOKEN_ID);
6130 int32 count = sWorld->getIntConfig(CONFIG_PVP_TOKEN_COUNT);
6131
6132 if (AddItem(itemID, count))
6133 ChatHandler(GetSession()).PSendSysMessage("You have been awarded a token for slaying another player.");
6134 }
6135 }
6136
6137 return true;
6138}
@ SPELL_AURA_PLAYER_INACTIVE
Definition: Battleground.h:140
@ SCORE_BONUS_HONOR
Definition: BattlegroundScore.h:32
@ SPELL_AURA_MOD_HONOR_GAIN_PCT
Definition: SpellAuraDefines.h:344
@ SPELL_AURA_NO_PVP_CREDIT
Definition: SpellAuraDefines.h:222
@ CONFIG_PVP_TOKEN_MAP_TYPE
Definition: IWorld.h:330
@ CONFIG_PVP_TOKEN_ID
Definition: IWorld.h:331
@ CONFIG_PVP_TOKEN_COUNT
Definition: IWorld.h:332
@ CONFIG_PVP_TOKEN_ENABLE
Definition: IWorld.h:133
@ RATE_HONOR
Definition: IWorld.h:498
@ ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL
Definition: DBCEnums.h:225
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL
Definition: DBCEnums.h:155
@ ACHIEVEMENT_CRITERIA_TYPE_HK_RACE
Definition: DBCEnums.h:173
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA
Definition: DBCEnums.h:151
@ ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL
Definition: DBCEnums.h:188
@ ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS
Definition: DBCEnums.h:172
@ SMSG_PVP_CREDIT
Definition: Opcodes.h:682
std::unordered_map< std::string, Player * > MapType
Definition: ObjectAccessor.cpp:90
float hk_honor_at_level_f(uint8 level, float multiplier=1.0f)
Definition: Formulas.h:26
bool IsRacialLeader() const
Definition: Creature.h:75
void Clear()
Definition: ObjectGuid.h:140
bool AddItem(uint32 itemId, uint32 count)
Definition: Player.cpp:15441
bool IsFFAPvP()
Definition: Player.cpp:16101
TeamId GetBgTeamId() const
Definition: Player.h:2227
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition: Unit.cpp:5847

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::GetTypeId(), Object::GetUInt32Value(), GiveXP(), Unit::HasAura(), Unit::HasAuraType(), Acore::Honor::hk_honor_at_level_f(), InArena(), InBattleground(), IsFFAPvP(), 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(), TYPEID_PLAYER, 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 
)
12628{
12629 if (!pRewardSource)
12630 return;
12631
12632 ObjectGuid creature_guid = (pRewardSource->GetTypeId() == TYPEID_UNIT) ? pRewardSource->GetGUID() : ObjectGuid::Empty;
12633
12634 // prepare data for near group iteration
12635 if (Group* group = GetGroup())
12636 {
12637 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12638 {
12639 Player* player = itr->GetSource();
12640 if (!player)
12641 continue;
12642
12643 if (!player->IsAtGroupRewardDistance(pRewardSource))
12644 continue; // member (alive or dead) or his corpse at req. distance
12645
12646 // quest objectives updated only for alive group member or dead but with not released body
12647 if (player->IsAlive() || !player->GetCorpse())
12648 player->KilledMonsterCredit(creature_id, creature_guid);
12649 }
12650 }
12651 else // if (!group)
12652 KilledMonsterCredit(creature_id, creature_guid);
12653}

References ObjectGuid::Empty, GetCorpse(), GetGroup(), Object::GetGUID(), Object::GetTypeId(), Unit::IsAlive(), IsAtGroupRewardDistance(), KilledMonsterCredit(), GroupReference::next(), and TYPEID_UNIT.

Referenced by Spell::EffectKillCredit(), SmartScript::ProcessAction(), and SmartAI::StopFollow().

◆ RewardPlayerAndGroupAtKill()

void Player::RewardPlayerAndGroupAtKill ( Unit victim,
bool  isBattleGround 
)
12623{
12624 KillRewarder(this, victim, isBattleGround).Reward();
12625}
Definition: KillRewarder.h:28
void Reward()
Definition: KillRewarder.cpp:266

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 
)
658{
659 //this THING should be here to protect code from quest, which cast on player far teleport as a reward
660 //should work fine, cause far teleport will be executed in Player::Update()
662
663 uint32 quest_id = quest->GetQuestId();
664
665 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
666 {
667 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
668 {
669 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM && !quest->IsRepeatable() && !HasQuestForItem(quest->RequiredItemId[i], quest_id, true))
670 DestroyItemCount(quest->RequiredItemId[i], 9999, true);
671 else
672 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
673 }
674 }
675 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
676 {
677 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
678 {
679 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM && !quest->IsRepeatable() && !HasQuestForItem(quest->ItemDrop[i], quest_id))
680 DestroyItemCount(quest->ItemDrop[i], 9999, true);
681 else
682 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
683 }
684 }
685
686 RemoveTimedQuest(quest_id);
687
688 std::vector<std::pair<uint32, uint32>> problematicItems;
689
690 if (quest->GetRewChoiceItemsCount())
691 {
692 if (uint32 itemId = quest->RewardChoiceItemId[reward])
693 {
694 ItemPosCountVec dest;
695 if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardChoiceItemCount[reward]) == EQUIP_ERR_OK)
696 {
697 Item* item = StoreNewItem(dest, itemId, true);
698 SendNewItem(item, quest->RewardChoiceItemCount[reward], true, false, false, false);
699
700 sScriptMgr->OnQuestRewardItem(this, item, quest->RewardChoiceItemCount[reward]);
701 }
702 else
703 {
704 problematicItems.emplace_back(itemId, quest->RewardChoiceItemCount[reward]);
705 }
706 }
707 }
708
709 if (quest->GetRewItemsCount())
710 {
711 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
712 {
713 if (uint32 itemId = quest->RewardItemId[i])
714 {
715 ItemPosCountVec dest;
716 if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardItemIdCount[i]) == EQUIP_ERR_OK)
717 {
718 Item* item = StoreNewItem(dest, itemId, true);
719 SendNewItem(item, quest->RewardItemIdCount[i], true, false, false, false);
720
721 sScriptMgr->OnQuestRewardItem(this, item, quest->RewardItemIdCount[i]);
722 }
723 else
724 problematicItems.emplace_back(itemId, quest->RewardItemIdCount[i]);
725 }
726 }
727 }
728
729 // Xinef: send items that couldn't be added properly by mail
730 if (!problematicItems.empty())
731 {
732 SendItemRetrievalMail(problematicItems);
733 }
734
735 RewardReputation(quest);
736
737 uint16 log_slot = FindQuestSlot(quest_id);
738 if (log_slot < MAX_QUEST_LOG_SIZE)
739 SetQuestSlot(log_slot, 0);
740
741 bool rewarded = IsQuestRewarded(quest_id) && !quest->IsDFQuest();
742
743 // Not give XP in case already completed once repeatable quest
744 uint32 XP = rewarded ? 0 : uint32(quest->XPValue(GetLevel()) * GetQuestRate(quest->IsDFQuest()));
745
746 // handle SPELL_AURA_MOD_XP_QUEST_PCT auras
748 for (Unit::AuraEffectList::const_iterator i = ModXPPctAuras.begin(); i != ModXPPctAuras.end(); ++i)
749 AddPct(XP, (*i)->GetAmount());
750
751 sScriptMgr->OnQuestComputeXP(this, quest, XP);
752 int32 moneyRew = 0;
753 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || sScriptMgr->ShouldBeRewardedWithMoneyInsteadOfExp(this))
754 {
755 moneyRew = quest->GetRewMoneyMaxLevel();
756 }
757 else
758 {
759 GiveXP(XP, nullptr, isLFGReward);
760 }
761
762 // Give player extra money if GetRewOrReqMoney > 0 and get ReqMoney if negative
763 if (int32 rewOrReqMoney = quest->GetRewOrReqMoney(GetLevel()))
764 {
765 moneyRew += rewOrReqMoney;
766 }
767
768 if (moneyRew)
769 {
770 ModifyMoney(moneyRew);
771
772 if (moneyRew > 0)
774 }
775
776 // honor reward
777 if (uint32 honor = quest->CalculateHonorGain(GetLevel()))
778 RewardHonor(nullptr, 0, honor);
779
780 // title reward
781 if (quest->GetCharTitleId())
782 {
783 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(quest->GetCharTitleId()))
784 SetTitle(titleEntry);
785 }
786
787 if (quest->GetBonusTalents())
788 {
789 m_questRewardTalentCount += quest->GetBonusTalents();
791 }
792
793 if (quest->GetRewArenaPoints())
794 ModifyArenaPoints(quest->GetRewArenaPoints());
795
796 // Send reward mail
797 if (uint32 mail_template_id = quest->GetRewMailTemplateId())
798 {
799 //- TODO: Poor design of mail system
800 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
801 if (quest->GetRewMailSenderEntry() != 0)
802 MailDraft(mail_template_id).SendMailTo(trans, this, quest->GetRewMailSenderEntry(), MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
803 else
804 MailDraft(mail_template_id).SendMailTo(trans, this, questGiver, MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
805 CharacterDatabase.CommitTransaction(trans);
806 }
807
808 if (quest->IsDaily() || quest->IsDFQuest())
809 {
810 SetDailyQuestStatus(quest_id);
811 if (quest->IsDaily())
812 {
815 }
816 }
817 else if (quest->IsWeekly())
818 SetWeeklyQuestStatus(quest_id);
819 else if (quest->IsMonthly())
820 SetMonthlyQuestStatus(quest_id);
821 else if (quest->IsSeasonal())
822 SetSeasonalQuestStatus(quest_id);
823
824 RemoveActiveQuest(quest_id, false);
825 m_RewardedQuests.insert(quest_id);
826 m_RewardedQuestsSave[quest_id] = true;
827
828 if (announce)
829 SendQuestReward(quest, XP);
830
831 // cast spells after mark quest complete (some spells have quest completed state requirements in spell_area data)
832 if (quest->GetRewSpellCast() > 0)
833 {
834 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast());
835 if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
836 {
837 if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
838 creature->CastSpell(this, quest->GetRewSpellCast(), true);
839 }
840 else
841 CastSpell(this, quest->GetRewSpellCast(), true);
842 }
843 else if (quest->GetRewSpell() > 0)
844 {
845 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell());
846 if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
847 {
848 if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
849 creature->CastSpell(this, quest->GetRewSpell(), true);
850 }
851 else
852 CastSpell(this, quest->GetRewSpell(), true);
853 }
854
855 if (quest->GetZoneOrSort() > 0)
859
860 // pussywizard: replaced partial save with full save
861 SaveToDB(false, false);
862
863 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
864 {
867 }
868
869 SendQuestUpdate(quest_id);
870
872
873 //lets remove flag for delayed teleports
875
876 // Xinef: area auras may change on quest completion!
879
880 sScriptMgr->OnPlayerCompleteQuest(this, quest);
881}
@ TYPEMASK_UNIT
Definition: ObjectGuid.h:51
@ MAIL_CHECK_MASK_HAS_BODY
Definition: Mail.h:52
@ SPELL_AURA_MOD_XP_QUEST_PCT
Definition: SpellAuraDefines.h:354
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE
Definition: DBCEnums.h:135
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY
Definition: DBCEnums.h:134
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT
Definition: DBCEnums.h:133
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST
Definition: DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD
Definition: DBCEnums.h:181
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST
Definition: DBCEnums.h:147
@ SPELL_EFFECT_CREATE_ITEM
Definition: SharedDefines.h:774
bool isType(uint16 mask) const
Definition: Object.h:122
bool IsInHostileArea
Definition: Player.h:362
bool HasPvPForcingQuest() const
Definition: PlayerQuest.cpp:2479
bool HasQuestForItem(uint32 itemId, uint32 excludeQuestId=0, bool turnIn=false, bool *showInLoot=nullptr) const
Definition: PlayerQuest.cpp:2248
void SetMonthlyQuestStatus(uint32 quest_id)
Definition: Player.cpp:12049
void SetSeasonalQuestStatus(uint32 quest_id)
Definition: Player.cpp:12039
void SendItemRetrievalMail(uint32 itemEntry, uint32 count)
Definition: PlayerMisc.cpp:439
void SendQuestReward(Quest const *quest, uint32 XP)
Definition: PlayerQuest.cpp:2341
void SetDailyQuestStatus(uint32 quest_id)
Definition: Player.cpp:11991
float GetQuestRate(bool isDFQuest=false)
Definition: Player.cpp:16128
void SetWeeklyQuestStatus(uint32 quest_id)
Definition: Player.cpp:12033
void RemoveActiveQuest(uint32 questId, bool update=true)
Definition: PlayerQuest.cpp:1479
void RewardReputation(Unit *victim, float rate)
Definition: Player.cpp:5850
void SetMustDelayTeleport(bool setting)
Definition: Player.h:2880
bool IsSelfCast() const
Definition: SpellInfo.cpp:1074

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, AddPct(), BIND_QUEST_ITEM, Quest::CalculateHonorGain(), CanStoreNewItem(), Unit::CastSpell(), CharacterDatabase, CONFIG_MAX_PLAYER_LEVEL, DestroyItemCount(), EQUIP_ERR_OK, FindQuestSlot(), WorldObject::GetAreaId(), Unit::GetAuraEffectsByType(), Quest::GetBonusTalents(), Quest::GetCharTitleId(), Object::GetGUID(), Unit::GetLevel(), WorldObject::GetMap(), Quest::GetQuestId(), GetQuestRate(), 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::isType(), 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_AURA_MOD_XP_QUEST_PCT, SPELL_EFFECT_CREATE_ITEM, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, StoreNewItem(), sWorld, TYPEMASK_UNIT, UpdateAchievementCriteria(), UpdateAreaDependentAuras(), UpdatePvPState(), UpdateZoneDependentAuras(), and Quest::XPValue().

Referenced by CompleteQuest(), lfg::LFGMgr::FinishDungeon(), and WorldSession::HandleQuestgiverChooseRewardOpcode().

◆ RewardReputation() [1/2]

void Player::RewardReputation ( Quest const *  quest)
5903{
5904 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
5905 {
5906 if (!quest->RewardFactionId[i])
5907 continue;
5908
5909 float rep = 0.f;
5910
5911 if (quest->RewardFactionValueIdOverride[i])
5912 {
5913 rep = quest->RewardFactionValueIdOverride[i] / 100.f;
5914 }
5915 else
5916 {
5917 uint32 row = ((quest->RewardFactionValueId[i] < 0) ? 1 : 0) + 1;
5918 if (QuestFactionRewEntry const* questFactionRewEntry = sQuestFactionRewardStore.LookupEntry(row))
5919 {
5920 uint32 field = std::abs(quest->RewardFactionValueId[i]);
5921 rep = static_cast<float>(questFactionRewEntry->QuestRewFactionValue[field]);
5922 }
5923 }
5924
5925 if (rep == 0.f)
5926 continue;
5927
5928 if (quest->IsDaily())
5929 {
5930 rep = CalculateReputationGain(REPUTATION_SOURCE_DAILY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5931 }
5932 else if (quest->IsWeekly())
5933 {
5934 rep = CalculateReputationGain(REPUTATION_SOURCE_WEEKLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5935 }
5936 else if (quest->IsMonthly())
5937 {
5938 rep = CalculateReputationGain(REPUTATION_SOURCE_MONTHLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5939 }
5940 else if (quest->IsRepeatable())
5941 {
5942 rep = CalculateReputationGain(REPUTATION_SOURCE_REPEATABLE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5943 }
5944 else
5945 {
5946 rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
5947 }
5948
5949 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->RewardFactionId[i]))
5950 {
5951 GetReputationMgr().ModifyReputation(factionEntry, rep, quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER));
5952 }
5953 }
5954}
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:5770
bool ModifyReputation(FactionEntry const *factionEntry, float standing, bool noSpillOver=false, Optional< ReputationRank > repMaxCap={})
Definition: ReputationMgr.h:118
Definition: DBCStructure.h:1441

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,
float  rate 
)
5851{
5852 if (!victim || victim->GetTypeId() == TYPEID_PLAYER)
5853 return;
5854
5855 if (victim->ToCreature()->IsReputationGainDisabled())
5856 return;
5857
5858 ReputationOnKillEntry const* Rep = sObjectMgr->GetReputationOnKilEntry(victim->ToCreature()->GetCreatureTemplate()->Entry);
5859 if (!Rep)
5860 return;
5861
5862 uint32 ChampioningFaction = 0;
5863
5865 {
5866 // support for: Championing - http://www.wowwiki.com/Championing
5867 Map const* map = GetMap();
5868 if (map->IsNonRaidDungeon())
5869 if (LFGDungeonEntry const* dungeon = GetLFGDungeon(map->GetId(), map->GetDifficulty()))
5870 if (dungeon->reclevel == 80)
5871 ChampioningFaction = GetChampioningFaction();
5872 }
5873
5874 TeamId teamId = GetTeamId(true); // Always check player original reputation when rewarding
5875
5876 if (Rep->RepFaction1 && (!Rep->TeamDependent || teamId == TEAM_ALLIANCE))
5877 {
5878 float donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast<float>(Rep->RepValue1), ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
5879 donerep1 *= rate;
5880
5881 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
5882 if (factionEntry1)
5883 {
5884 GetReputationMgr().ModifyReputation(factionEntry1, donerep1, false, static_cast<ReputationRank>(Rep->ReputationMaxCap1));
5885 }
5886 }
5887
5888 if (Rep->RepFaction2 && (!Rep->TeamDependent || teamId == TEAM_HORDE))
5889 {
5890 float donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast<float>(Rep->RepValue2), ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
5891 donerep2 *= rate;
5892
5893 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
5894 if (factionEntry2)
5895 {
5896 GetReputationMgr().ModifyReputation(factionEntry2, donerep2, false, static_cast<ReputationRank>(Rep->ReputationMaxCap2));
5897 }
5898 }
5899}
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:845
TeamId
Definition: SharedDefines.h:731
bool IsReputationGainDisabled() const
Definition: Creature.h:352
uint32 Entry
Definition: CreatureData.h:177
uint32 GetChampioningFaction() const
Definition: Player.h:2497
Definition: ObjectMgr.h:562
uint32 ReputationMaxCap1
Definition: ObjectMgr.h:565
uint32 RepFaction1
Definition: ObjectMgr.h:563
uint32 RepFaction2
Definition: ObjectMgr.h:564
bool TeamDependent
Definition: ObjectMgr.h:571
int32 RepValue1
Definition: ObjectMgr.h:566
uint32 ReputationMaxCap2
Definition: ObjectMgr.h:567
int32 RepValue2
Definition: ObjectMgr.h:568
bool IsNonRaidDungeon() const
Definition: Map.h:448
Definition: DBCStructure.h:1224

References CalculateReputationGain(), CreatureTemplate::Entry, GetChampioningFaction(), Creature::GetCreatureTemplate(), Map::GetDifficulty(), Map::GetId(), Unit::GetLevel(), GetLFGDungeon(), WorldObject::GetMap(), GetReputationMgr(), GetTeamId(), Object::GetTypeId(), Map::IsNonRaidDungeon(), 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, Object::ToCreature(), and TYPEID_PLAYER.

Referenced by KillRewarder::_RewardReputation(), and RewardQuest().

◆ Satisfy()

bool Player::Satisfy ( DungeonProgressionRequirements const *  ar,
uint32  target_map,
bool  report = false 
)
6728{
6729 if (!IsGameMaster() && ar)
6730 {
6731 uint8 LevelMin = 0;
6732 uint8 LevelMax = 0;
6733
6734 MapEntry const* mapEntry = sMapStore.LookupEntry(target_map);
6735 if (!mapEntry)
6736 return false;
6737
6738 if (!sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_LEVEL))
6739 {
6740 if (ar->levelMin && GetLevel() < ar->levelMin)
6741 LevelMin = ar->levelMin;
6742 if (ar->levelMax && GetLevel() > ar->levelMax)
6743 LevelMax = ar->levelMax;
6744 }
6745
6746 if (DisableMgr::IsDisabledFor(DISABLE_TYPE_MAP, target_map, this))
6747 {
6749 return false;
6750 }
6751
6752 Player* partyLeader = this;
6753 std::string leaderName = m_session->GetAcoreString(LANG_YOU);
6754 {
6755 ObjectGuid leaderGuid = GetGroup() ? GetGroup()->GetLeaderGUID() : GetGUID();
6756 Player* tempLeader = HashMapHolder<Player>::Find(leaderGuid);
6757 if (leaderGuid != GetGUID())
6758 {
6759 if (tempLeader != nullptr)
6760 {
6761 partyLeader = tempLeader;
6762 }
6763 leaderName = GetGroup()->GetLeaderName();
6764 }
6765 }
6766
6767 //Check all items
6768 std::vector<const ProgressionRequirement*> missingPlayerItems;
6769 std::vector<const ProgressionRequirement*> missingLeaderItems;
6770 for (const ProgressionRequirement* itemRequirement : ar->items)
6771 {
6772 Player* checkPlayer = this;
6773 std::vector<const ProgressionRequirement*>* missingItems = &missingPlayerItems;
6774 if (itemRequirement->checkLeaderOnly)
6775 {
6776 checkPlayer = partyLeader;
6777 missingItems = &missingLeaderItems;
6778 }
6779
6780 if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == checkPlayer->GetTeamId(true))
6781 {
6782 if (!checkPlayer->HasItemCount(itemRequirement->id, 1))
6783 {
6784 missingItems->push_back(itemRequirement);
6785 }
6786 }
6787 }
6788
6789 //Check all achievements
6790 std::vector<const ProgressionRequirement*> missingPlayerAchievements;
6791 std::vector<const ProgressionRequirement*> missingLeaderAchievements;
6792 for (const ProgressionRequirement* achievementRequirement : ar->achievements)
6793 {
6794 Player* checkPlayer = this;
6795 std::vector<const ProgressionRequirement*>* missingAchievements = &missingPlayerAchievements;
6796 if (achievementRequirement->checkLeaderOnly)
6797 {
6798 checkPlayer = partyLeader;
6799 missingAchievements = &missingLeaderAchievements;
6800 }
6801
6802 if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == GetTeamId(true))
6803 {
6804 if (!checkPlayer || !checkPlayer->HasAchieved(achievementRequirement->id))
6805 {
6806 missingAchievements->push_back(achievementRequirement);
6807 }
6808 }
6809 }
6810
6811 //Check all quests
6812 std::vector<const ProgressionRequirement*> missingPlayerQuests;
6813 std::vector<const ProgressionRequirement*> missingLeaderQuests;
6814 for (const ProgressionRequirement* questRequirement : ar->quests)
6815 {
6816 Player* checkPlayer = this;
6817 std::vector<const ProgressionRequirement*>* missingQuests = &missingPlayerQuests;
6818 if (questRequirement->checkLeaderOnly)
6819 {
6820 checkPlayer = partyLeader;
6821 missingQuests = &missingLeaderQuests;
6822 }
6823
6824 if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == checkPlayer->GetTeamId(true))
6825 {
6826 if (!checkPlayer->GetQuestRewardStatus(questRequirement->id))
6827 {
6828 missingQuests->push_back(questRequirement);
6829 }
6830 }
6831 }
6832
6833 //Check if avg ILVL requirement is allowed
6834 bool ilvlRequirementNotMet = false;
6836 {
6837 const int32 currentIlvl = (int32)GetAverageItemLevelForDF();
6838 if (ar->reqItemLevel > currentIlvl)
6839 {
6840 ilvlRequirementNotMet = true;
6841 }
6842 }
6843
6844 Difficulty target_difficulty = GetDifficulty(mapEntry->IsRaid());
6845 MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty);
6846 if (LevelMin || LevelMax || ilvlRequirementNotMet
6847 || missingPlayerItems.size() || missingPlayerQuests.size() || missingPlayerAchievements.size()
6848 || missingLeaderItems.size() || missingLeaderQuests.size() || missingLeaderAchievements.size())
6849 {
6850 if (!sScriptMgr->NotAvoidSatisfy(partyLeader, ar, target_map, report))
6851 return true;
6852
6853 if (report)
6854 {
6855 uint8 requirementPrintMode = sWorld->getIntConfig(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE);
6856
6857 if (requirementPrintMode == 0)
6858 {
6859 //Just print out the requirements are not met
6861 }
6862 else if (requirementPrintMode == 1)
6863 {
6864 //Blizzlike method of printing out the requirements
6865 if (missingPlayerQuests.size() && !missingPlayerQuests[0]->note.empty())
6866 {
6867 ChatHandler(GetSession()).PSendSysMessage("%s", missingPlayerQuests[0]->note.c_str());
6868 }
6869 else if (missingLeaderQuests.size() && !missingLeaderQuests[0]->note.empty())
6870 {
6871 ChatHandler(GetSession()).PSendSysMessage("%s", missingLeaderQuests[0]->note.c_str());
6872 }
6873 else if (mapDiff->hasErrorMessage)
6874 {
6875 // if (missingAchievement) covered by this case
6876 SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
6877 }
6878 else if (missingPlayerItems.size())
6879 {
6880 GetSession()->SendAreaTriggerMessage(GetSession()->GetAcoreString(LANG_LEVEL_MINREQUIRED_AND_ITEM), LevelMin, sObjectMgr->GetItemTemplate(missingPlayerItems[0]->id)->Name1.c_str());
6881 }
6882 else if (LevelMin)
6883 {
6885 }
6886 else if (ilvlRequirementNotMet)
6887 {
6889 }
6890 }
6891 else
6892 {
6893 bool errorAlreadyPrinted = false;
6894 //Pretty way of printing out requirements
6895 if (missingPlayerQuests.size())
6896 {
6898 PrettyPrintRequirementsQuestList(missingPlayerQuests);
6899 errorAlreadyPrinted = true;
6900 }
6901 if (missingLeaderQuests.size())
6902 {
6904 PrettyPrintRequirementsQuestList(missingLeaderQuests);
6905 errorAlreadyPrinted = true;
6906 }
6907
6908 if (missingPlayerAchievements.size())
6909 {
6911 PrettyPrintRequirementsAchievementsList(missingPlayerAchievements);
6912 errorAlreadyPrinted = true;
6913 }
6914 if (missingLeaderAchievements.size())
6915 {
6917 PrettyPrintRequirementsAchievementsList(missingLeaderAchievements);
6918 errorAlreadyPrinted = true;
6919 }
6920
6921 if (missingPlayerItems.size())
6922 {
6924 PrettyPrintRequirementsItemsList(missingPlayerItems);
6925 errorAlreadyPrinted = true;
6926 }
6927
6928 if (missingLeaderItems.size())
6929 {
6931 PrettyPrintRequirementsItemsList(missingLeaderItems);
6932 errorAlreadyPrinted = true;
6933 }
6934
6935 if (ilvlRequirementNotMet)
6936 {
6938 }
6939
6940 if (LevelMin)
6941 {
6943 }
6944 else if (LevelMax)
6945 {
6947 }
6948 else if (mapDiff->hasErrorMessage && !errorAlreadyPrinted)
6949 {
6950 SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
6951 }
6952 }
6953
6954 //Print the extra string
6956 if (optionalStringID > 0)
6957 {
6958 ChatHandler(GetSession()).SendSysMessage(optionalStringID);
6959 }
6960 }
6961 return false;
6962 }
6963 }
6964 return true;
6965}
@ DISABLE_TYPE_MAP
Definition: DisableMgr.h:31
MapDifficulty const * GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty)
Definition: DBCStores.cpp:760
@ TRANSFER_ABORT_DIFFICULTY
Definition: Player.h:783
@ LANG_INSTANCE_CLOSED
Definition: Language.h:1061
@ LANG_ACCESS_REQUIREMENT_LEADER_OBTAIN_ITEMS
Definition: Language.h:825
@ LANG_YOU
Definition: Language.h:76
@ LANG_ACCESS_REQUIREMENT_AVERAGE_ILVL_NOT_MET
Definition: Language.h:821
@ LANG_ACCESS_REQUIREMENT_OBTAIN_ITEMS
Definition: Language.h:818
@ LANG_ACCESS_REQUIREMENT_COMPLETE_QUESTS
Definition: Language.h:816
@ LANG_ACCESS_REQUIREMENT_NOT_MET
Definition: Language.h:820
@ LANG_LEVEL_MINREQUIRED_AND_ITEM
Definition: Language.h:82
@ LANG_ACCESS_REQUIREMENT_MAX_LEVEL
Definition: Language.h:822
@ LANG_ACCESS_REQUIREMENT_COMPLETE_ACHIEVEMENTS
Definition: Language.h:817
@ LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_QUESTS
Definition: Language.h:823
@ LANG_LEVEL_MINREQUIRED
Definition: Language.h:81
@ LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_ACHIEVEMENTS
Definition: Language.h:824
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID
Definition: IWorld.h:397
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE
Definition: IWorld.h:396
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL
Definition: IWorld.h:167
@ CONFIG_INSTANCE_IGNORE_LEVEL
Definition: IWorld.h:88
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:103
TeamId faction
Definition: Player.h:927
uint32 id
Definition: Player.h:926
bool checkLeaderOnly
Definition: Player.h:930
float GetAverageItemLevelForDF()
Definition: Player.cpp:15625
void PrettyPrintRequirementsQuestList(const std::vector< const ProgressionRequirement * > &missingQuests) const
Definition: PlayerStorage.cpp:6619
void PrettyPrintRequirementsItemsList(const std::vector< const ProgressionRequirement * > &missingItems) const
Definition: PlayerStorage.cpp:6689
void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg=0)
Definition: Player.cpp:11612
void PrettyPrintRequirementsAchievementsList(const std::vector< const ProgressionRequirement * > &missingAchievements) const
Definition: PlayerStorage.cpp:6656
const char * GetLeaderName() const
Definition: Group.cpp:2250
ObjectGuid GetLeaderGUID() const
Definition: Group.cpp:2235
void SendAreaTriggerMessage(const char *Text,...) ATTR_PRINTF(2
Definition: MiscHandler.cpp:714
Definition: DBCStructure.h:2195
bool hasErrorMessage
Definition: DBCStructure.h:2201

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(), GetQuestRewardStatus(), GetSession(), 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
1083{
1084 uint32 reqClass = qInfo->GetRequiredClasses();
1085
1086 if (reqClass == 0)
1087 return true;
1088
1089 if ((reqClass & getClassMask()) == 0)
1090 {
1091 if (msg)
1093
1094 return false;
1095 }
1096
1097 return true;
1098}
@ INVALIDREASON_DONT_HAVE_REQ
Definition: QuestDef.h:48
void SendCanTakeQuestResponse(uint32 msg) const
Definition: PlayerQuest.cpp:2389

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 
)
1157{
1158 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, qInfo->GetQuestId());
1159 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1160 {
1161 if (msg)
1163 LOG_DEBUG("condition", "Player::SatisfyQuestConditions: conditions not met for quest {}", qInfo->GetQuestId());
1164 return false;
1165 }
1166 return true;
1167}

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
1266{
1267 if (!qInfo->IsDaily() && !qInfo->IsDFQuest())
1268 return true;
1269
1270 if (qInfo->IsDFQuest())
1271 {
1272 if (!m_DFQuests.empty())
1273 return false;
1274
1275 return true;
1276 }
1277
1278 bool have_slot = false;
1279 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
1280 {
1281 uint32 id = GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx);
1282 if (qInfo->GetQuestId() == id)
1283 return false;
1284
1285 if (!id)
1286 have_slot = true;
1287 }
1288
1289 if (!have_slot)
1290 {
1291 if (msg)
1293 return false;
1294 }
1295
1296 return true;
1297}
@ 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
1181{
1182 // non positive exclusive group, if > 0 then can be start if any other quest in exclusive group already started/completed
1183 if (qInfo->GetExclusiveGroup() <= 0)
1184 return true;
1185
1186 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qInfo->GetExclusiveGroup()));
1187
1188 for (; range.first != range.second; ++range.first)
1189 {
1190 uint32 exclude_Id = range.first->second;
1191
1192 // skip checked quest id, only state of other quests in group is interesting
1193 if (exclude_Id == qInfo->GetQuestId())
1194 continue;
1195
1196 // not allow have daily quest if daily quest from exclusive group already recently completed
1197 Quest const* Nquest = sObjectMgr->GetQuestTemplate(exclude_Id);
1198 if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false) || !SatisfyQuestSeasonal(Nquest, false))
1199 {
1200 if (msg)
1202
1203 return false;
1204 }
1205
1206 // alternative quest already started or completed - but don't check rewarded states if both are repeatable
1207 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
1208 {
1209 if (msg)
1211 return false;
1212 }
1213 }
1214 return true;
1215}
std::pair< ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator > ExclusiveQuestGroupsBounds
Definition: ObjectMgr.h:1135

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
965{
966 if (GetLevel() < qInfo->GetMinLevel())
967 {
968 if (msg)
970 return false;
971 }
972 else if (qInfo->GetMaxLevel() > 0 && GetLevel() > qInfo->GetMaxLevel())
973 {
974 if (msg)
975 SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); // There doesn't seem to be a specific response for too high player level
976 return false;
977 }
978 return true;
979}
@ 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)
982{
983 // exist free slot
985 return true;
986
987 if (msg)
988 {
990 GetSession()->SendPacket(&data);
991 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTLOG_FULL");
992 }
993 return false;
994}
@ 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
1324{
1325 if (!qInfo->IsMonthly() || m_monthlyquests.empty())
1326 return true;
1327
1328 // if not found in cooldown list
1329 return m_monthlyquests.find(qInfo->GetQuestId()) == m_monthlyquests.end();
1330}

References Quest::GetQuestId(), Quest::IsMonthly(), and m_monthlyquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestNextChain()

bool Player::SatisfyQuestNextChain ( Quest const *  qInfo,
bool  msg 
) const
1218{
1219 uint32 nextQuest = qInfo->GetNextQuestInChain();
1220 if (!nextQuest)
1221 return true;
1222
1223 // next quest in chain already started or completed
1224 if (GetQuestStatus(nextQuest) != QUEST_STATUS_NONE) // GetQuestStatus returns QUEST_STATUS_COMPLETED for rewarded quests
1225 {
1226 if (msg)
1228 return false;
1229 }
1230
1231 // check for all quests further up the chain
1232 // only necessary if there are quest chains with more than one quest that can be skipped
1233 //return SatisfyQuestNextChain(qInfo->GetNextQuestInChain(), msg);
1234 return true;
1235}

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
1238{
1239 // No previous quest in chain
1240 if (qInfo->prevChainQuests.empty())
1241 return true;
1242
1243 for (Quest::PrevChainQuests::const_iterator iter = qInfo->prevChainQuests.begin(); iter != qInfo->prevChainQuests.end(); ++iter)
1244 {
1245 QuestStatusMap::const_iterator itr = m_QuestStatus.find(*iter);
1246
1247 // If any of the previous quests in chain active, return false
1248 if (itr != m_QuestStatus.end() && itr->second.Status != QUEST_STATUS_NONE)
1249 {
1250 if (msg)
1252 return false;
1253 }
1254
1255 // check for all quests further down the chain
1256 // only necessary if there are quest chains with more than one quest that can be skipped
1257 //if (!SatisfyQuestPrevChain(prevId, msg))
1258 // return false;
1259 }
1260
1261 // No previous quest in chain active
1262 return true;
1263}

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
997{
998 // No previous quest (might be first quest in a series)
999 if (qInfo->prevQuests.empty())
1000 return true;
1001
1002 for (Quest::PrevQuests::const_iterator iter = qInfo->prevQuests.begin(); iter != qInfo->prevQuests.end(); ++iter)
1003 {
1004 uint32 prevId = std::abs(*iter);
1005
1006 Quest const* qPrevInfo = sObjectMgr->GetQuestTemplate(prevId);
1007
1008 if (qPrevInfo)
1009 {
1010 // If any of the positive previous quests completed, return true
1011 if (*iter > 0 && IsQuestRewarded(prevId) && (!qPrevInfo->IsSeasonal() || !SatisfyQuestSeasonal(qPrevInfo, false)))
1012 {
1013 // skip one-from-all exclusive group
1014 if (qPrevInfo->GetExclusiveGroup() >= 0)
1015 return true;
1016
1017 // each-from-all exclusive group (< 0)
1018 // can be start if only all quests in prev quest exclusive group completed and rewarded
1019 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
1020
1021 for (; range.first != range.second; ++range.first)
1022 {
1023 uint32 exclude_Id = range.first->second;
1024
1025 // skip checked quest id, only state of other quests in group is interesting
1026 if (exclude_Id == prevId)
1027 continue;
1028
1029 // alternative quest from group also must be completed and rewarded(reported)
1030
1031 Quest const* qExcludeInfo = sObjectMgr->GetQuestTemplate(exclude_Id);
1032 if (!IsQuestRewarded(exclude_Id) || (qExcludeInfo->IsSeasonal() && SatisfyQuestSeasonal(qExcludeInfo, false)))
1033 {
1034 if (msg)
1036 return false;
1037 }
1038 }
1039 return true;
1040 }
1041
1042 // If any of the negative previous quests active, return true
1043 if (*iter < 0 && GetQuestStatus(prevId) != QUEST_STATUS_NONE)
1044 {
1045 // skip one-from-all exclusive group
1046 if (qPrevInfo->GetExclusiveGroup() >= 0)
1047 return true;
1048
1049 // each-from-all exclusive group (< 0)
1050 // can be start if only all quests in prev quest exclusive group active
1051 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
1052
1053 for (; range.first != range.second; ++range.first)
1054 {
1055 uint32 exclude_Id = range.first->second;
1056
1057 // skip checked quest id, only state of other quests in group is interesting
1058 if (exclude_Id == prevId)
1059 continue;
1060
1061 // alternative quest from group also must be active
1062 if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE)
1063 {
1064 if (msg)
1066 return false;
1067 }
1068 }
1069 return true;
1070 }
1071 }
1072 }
1073
1074 // Has only positive prev. quests in non-rewarded state
1075 // and negative prev. quests in non-active state
1076 if (msg)
1078
1079 return false;
1080}
int32 GetExclusiveGroup() const
Definition: QuestDef.h:248

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
1101{
1102 uint32 reqraces = qInfo->GetAllowableRaces();
1103 if (reqraces == 0)
1104 return true;
1105 if ((reqraces & getRaceMask()) == 0)
1106 {
1107 if (msg)
1109 return false;
1110 }
1111 return true;
1112}
@ 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
1115{
1116 uint32 fIdMin = qInfo->GetRequiredMinRepFaction(); //Min required rep
1117 if (fIdMin && GetReputationMgr().GetReputation(fIdMin) < qInfo->GetRequiredMinRepValue())
1118 {
1119 if (msg)
1121 return false;
1122 }
1123
1124 uint32 fIdMax = qInfo->GetRequiredMaxRepFaction(); //Max required rep
1125 if (fIdMax && GetReputationMgr().GetReputation(fIdMax) >= qInfo->GetRequiredMaxRepValue())
1126 {
1127 if (msg)
1129 return false;
1130 }
1131
1132 // ReputationObjective2 does not seem to be an objective requirement but a requirement
1133 // to be able to accept the quest
1134 uint32 fIdObj = qInfo->GetRepObjectiveFaction2();
1135 if (fIdObj && GetReputationMgr().GetReputation(fIdObj) >= qInfo->GetRepObjectiveValue2())
1136 {
1137 if (msg)
1139 return false;
1140 }
1141
1142 return true;
1143}

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
1309{
1310 if (!qInfo->IsSeasonal() || m_seasonalquests.empty())
1311 return true;
1312
1313 // cppcheck-suppress mismatchingContainers
1314 Player::SeasonalEventQuestMap::iterator itr = ((Player*)this)->m_seasonalquests.find(qInfo->GetEventIdForQuest());
1315
1316 if (itr == m_seasonalquests.end() || itr->second.empty())
1317 return true;
1318
1319 // if not found in cooldown list
1320 return itr->second.find(qInfo->GetQuestId()) == itr->second.end();
1321}

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
945{
946 uint32 skill = qInfo->GetRequiredSkill();
947
948 // skip 0 case RequiredSkill
949 if (skill == 0)
950 return true;
951
952 // check skill value
953 if (GetBaseSkillValue(skill) < qInfo->GetRequiredSkillValue())
954 {
955 if (msg)
957
958 return false;
959 }
960
961 return true;
962}

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
1146{
1147 if (GetQuestStatus(qInfo->GetQuestId()) != QUEST_STATUS_NONE)
1148 {
1149 if (msg)
1151 return false;
1152 }
1153 return true;
1154}
@ 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
1170{
1171 if (!m_timedquests.empty() && qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
1172 {
1173 if (msg)
1175 return false;
1176 }
1177 return true;
1178}
@ 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
1300{
1301 if (!qInfo->IsWeekly() || m_weeklyquests.empty())
1302 return true;
1303
1304 // if not found in cooldown list
1305 return m_weeklyquests.find(qInfo->GetQuestId()) == m_weeklyquests.end();
1306}

References Quest::GetQuestId(), Quest::IsWeekly(), and m_weeklyquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), and SatisfyQuestExclusiveGroup().

◆ SaveGoldToDB()

void Player::SaveGoldToDB ( CharacterDatabaseTransaction  trans)
7145{
7147 stmt->SetData(0, GetMoney());
7148 stmt->SetData(1, GetGUID().GetCounter());
7149 trans->Append(stmt);
7150}
@ CHAR_UDP_CHAR_MONEY
Definition: CharacterDatabase.h:424

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)
7139{
7140 _SaveInventory(trans);
7141 SaveGoldToDB(trans);
7142}
void SaveGoldToDB(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7144
void _SaveInventory(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7258

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
85{
87
88 stmt->SetData(0, x);
89 stmt->SetData(1, y);
90 stmt->SetData(2, z);
91 stmt->SetData(3, o);
92 stmt->SetData(4, uint16(mapid));
93 stmt->SetData(5, uint16(zone));
94 stmt->SetData(6, guid.GetCounter());
95
96 CharacterDatabase.Execute(stmt);
97}
@ CHAR_UPD_CHARACTER_POSITION
Definition: CharacterDatabase.h:322

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

Referenced by tele_commandscript::DoNameTeleport(), WorldSession::HandleCharFactionOrRaceChangeCallback(), misc_commandscript::HandleSummonCommand(), and tele_commandscript::HandleTeleNameCommand().

◆ 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 
)
7077{
7078 // delay auto save at any saves (manual, in code, or autosave)
7079 m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
7080
7081 //lets allow only players in world to be saved
7083 {
7085 return;
7086 }
7087
7088 // pussywizard: full save now, so clear partial additional saves
7091
7092 // first save/honor gain after midnight will also update the player's honor fields
7094
7095 LOG_DEBUG("entities.unit", "The value of player {} at save: ", m_name);
7097
7098 if (!create)
7099 sScriptMgr->OnPlayerSave(this);
7100
7101 _SaveCharacter(create, trans);
7102
7103 if (m_mailsUpdated) //save mails only when needed
7104 _SaveMail(trans);
7105
7106 _SaveEntryPoint(trans);
7107 _SaveInventory(trans);
7108 _SaveQuestStatus(trans);
7109 _SaveDailyQuestStatus(trans);
7113 _SaveTalents(trans);
7114 _SaveSpells(trans);
7115 _SaveSpellCooldowns(trans, logout);
7116 _SaveActions(trans);
7117 _SaveAuras(trans, logout);
7118 _SaveSkills(trans);
7119 m_achievementMgr->SaveToDB(trans);
7120 m_reputationMgr->SaveToDB(trans);
7121 _SaveEquipmentSets(trans);
7122 GetSession()->SaveTutorialsData(trans); // changed only while character in game
7123 _SaveGlyphs(trans);
7125 _SavePlayerSettings(trans);
7126
7127 // check if stats should only be saved on logout
7128 // save stats can be out of transaction
7130 _SaveStats(trans);
7131
7132 // save pet (hunter pet level and experience and all type pets health/mana).
7133 if (Pet* pet = GetPet())
7134 pet->SavePetToDB(PET_SAVE_AS_CURRENT);
7135}
@ CONFIG_STATS_SAVE_ONLY_ON_LOGOUT
Definition: IWorld.h:75
void SaveToDB(CharacterDatabaseTransaction trans)
Definition: AchievementMgr.cpp:555
bool IsBeingTeleportedFar() const
Definition: Player.h:2043
void _SaveMonthlyQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7633
void _SaveTalents(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14908
void _SaveDailyQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7538
void _SaveSpells(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7711
void _SaveCharacter(bool create, CharacterDatabaseTransaction trans)
Definition: Player.cpp:14564
void _SaveSkills(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7655
void _SaveEquipmentSets(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14430
void _SaveGlyphs(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14861
void _SaveMail(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7396
void _SaveQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7471
void _SaveAuras(CharacterDatabaseTransaction trans, bool logout)
Definition: PlayerStorage.cpp:7200
void _SaveSeasonalQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7599
void _SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans)
Definition: Player.cpp:15752
void _SavePlayerSettings(CharacterDatabaseTransaction trans)
Definition: PlayerSettings.cpp:91
void _SaveWeeklyQuestStatus(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7576
void _SaveSpellCooldowns(CharacterDatabaseTransaction trans, bool logout)
Definition: Player.cpp:3562
void _SaveEntryPoint(CharacterDatabaseTransaction trans)
Definition: Player.cpp:14481
void _SaveStats(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7758
void SaveToDB(CharacterDatabaseTransaction trans)
Definition: ReputationMgr.cpp:625
bool isLogingOut() const
Is the user engaged in a log out process?
Definition: WorldSession.h:384
void SaveTutorialsData(CharacterDatabaseTransaction trans)
Definition: WorldSession.cpp:964

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.

9231{
9232 std::string _text(text);
9233 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_SAY, language, _text))
9234 {
9235 return;
9236 }
9237
9238 sScriptMgr->OnPlayerChat(this, CHAT_MSG_SAY, language, _text);
9239
9240 WorldPacket data;
9241 ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, language, this, this, _text);
9242 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true);
9243}
@ CONFIG_LISTEN_RANGE_SAY
Definition: IWorld.h:193
@ CHAT_MSG_SAY
Definition: SharedDefines.h:3125
static 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:192
void SendMessageToSetInRange(WorldPacket const *data, float dist, bool self, bool includeMargin=false, Player const *skipped_rcvr=nullptr) const override
Definition: Player.cpp:5573

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.

9246{
9247 Talk(textId, CHAT_MSG_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
9248}
Talk
Definition: boss_fathomlord_karathress.cpp:23

References CHAT_MSG_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ ScheduleDelayedOperation()

void Player::ScheduleDelayedOperation ( uint32  operation)
inline
2051 {
2052 if (operation < DELAYED_END)
2053 m_DelayedOperations |= operation;
2054 }
@ DELAYED_END
Definition: Player.h:902

References DELAYED_END, and m_DelayedOperations.

Referenced by Battleground::RemovePlayerAtLeave(), ResurectUsingRequestData(), SaveToDB(), and TeleportToEntryPoint().

◆ SendActionButtons()

void Player::SendActionButtons ( uint32  state) const
5456{
5457 LOG_DEBUG("entities.player", "Sending Action Buttons for {} spec {}", GetGUID().ToString(), m_activeSpec);
5458
5460 data << uint8(state);
5461 /*
5462 state can be 0, 1, 2
5463 0 - Looks to be sent when initial action buttons get sent, however on Trinity we use 1 since 0 had some difficulties
5464 1 - Used in any SMSG_ACTION_BUTTONS packet with button data on Trinity. Only used after spec swaps on retail.
5465 2 - Clears the action bars client sided. This is sent during spec swap before unlearning and before sending the new buttons
5466 */
5467 if (state != 2)
5468 {
5469 for (uint8 button = 0; button < MAX_ACTION_BUTTONS; ++button)
5470 {
5471 ActionButtonList::const_iterator itr = m_actionButtons.find(button);
5472 if (itr != m_actionButtons.end() && itr->second.uState != ACTIONBUTTON_DELETED)
5473 data << uint32(itr->second.packedData);
5474 else
5475 data << uint32(0);
5476 }
5477 }
5478
5479 GetSession()->SendPacket(&data);
5480 LOG_DEBUG("entities.player", "Action Buttons for {} spec {} Sent", GetGUID().ToString(), m_activeSpec);
5481}
@ 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:276

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.

8719{
8721 if (sWorld->getIntConfig(CONFIG_WINTERGRASP_ENABLE) == 1)
8722 {
8723 if (BattlefieldWG* wg = (BattlefieldWG*)sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
8724 {
8727 SendUpdateWorldState(BATTLEFIELD_WG_WORLD_STATE_ACTIVE, wg->IsWarTime() ? 0 : 1); // Note: cleanup these two, their names look awkward
8729
8730 for (uint32 i = 0; i < 2; ++i)
8731 SendUpdateWorldState(ClockWorldState[i], uint32(GameTime::GetGameTime().count() + (wg->GetTimer() / 1000)));
8732 }
8733 }
8734}
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:319
Definition: BattlefieldWG.h:277
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition: PlayerUpdates.cpp:2194

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 ( )
8704{
8705 for (uint32 i = 1; i < sBattlemasterListStore.GetNumRows(); ++i)
8706 {
8707 BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(i);
8708 if (bl && bl->HolidayWorldStateId)
8709 {
8712 else
8714 }
8715 }
8716}
DBCStorage< BattlemasterListEntry > sBattlemasterListStore(BattlemasterListEntryfmt)
static bool IsBGWeekend(BattlegroundTypeId bgTypeId)
Definition: BattlegroundMgr.cpp:895
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 
)
4093{
4094 LOG_DEBUG("network", "WORLD: Sent SMSG_BUY_FAILED");
4095 WorldPacket data(SMSG_BUY_FAILED, (8 + 4 + 4 + 1));
4096 data << (creature ? creature->GetGUID() : ObjectGuid::Empty);
4097 data << uint32(item);
4098 if (param > 0)
4099 data << uint32(param);
4100 data << uint8(msg);
4101 GetSession()->SendPacket(&data);
4102}
@ 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
5600{
5602 data << uint32(CinematicSequenceId);
5603 SendDirectMessage(&data);
5604 if (CinematicSequencesEntry const* sequence = sCinematicSequencesStore.LookupEntry(CinematicSequenceId))
5605 {
5606 _cinematicMgr->SetActiveCinematicCamera(sequence->cinematicCamera);
5607 }
5608}
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 
)
11004{
11005 // start cooldowns at server side, if any
11006 if (setCooldown)
11007 AddSpellAndCategoryCooldowns(spellInfo, itemId, spell);
11008
11009 // Send activate cooldown timer (possible 0) at client side
11010 WorldPacket data(SMSG_COOLDOWN_EVENT, 4 + 8);
11011 data << uint32(spellInfo->Id);
11012 data << GetGUID();
11013 SendDirectMessage(&data);
11014}
@ SMSG_COOLDOWN_EVENT
Definition: Opcodes.h:339
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition: Player.cpp:10805

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)
12871{
12873 data << uint32(delay);
12874 GetSession()->SendPacket(&data);
12875}
@ 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
5595{
5596 m_session->SendPacket(data);
5597}

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(), SendLoot(), SendLootError(), SendLootRelease(), Unit::SendMeleeAttackStart(), SendMirrorTimer(), Unit::SendMovementFeatherFall(), Unit::SendMovementHover(), Unit::SendMovementWaterWalking(), SendMovieStart(), World::SendServerMessage(), Unit::SendSpellNonMeleeReflectLog(), ReputationMgr::SendState(), Unit::SendTameFailure(), SendTaxiNodeStatusMultiple(), SendUpdateWorldState(), ReputationMgr::SendVisible(), Weather::SendWeatherUpdateToPlayer(), 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)
15231{
15233 data << uint32(counter); // seconds
15234 GetSession()->SendPacket(&data);
15235}
@ 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 ( )
4753{
4754 for (EnchantDurationList::const_iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4755 {
4756 GetSession()->SendItemEnchantTimeUpdate(GetGUID(), itr->item->GetGUID(), itr->slot, uint32(itr->leftduration) / 1000);
4757 }
4758}

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 
)
4050{
4051 LOG_DEBUG("network", "WORLD: Sent SMSG_INVENTORY_CHANGE_FAILURE ({})", msg);
4053 data << uint8(msg);
4054
4055 if (msg != EQUIP_ERR_OK)
4056 {
4057 data << (pItem ? pItem->GetGUID() : ObjectGuid::Empty);
4058 data << (pItem2 ? pItem2->GetGUID() : ObjectGuid::Empty);
4059 data << uint8(0); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2
4060
4061 switch (msg)
4062 {
4065 {
4066 ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
4067 data << uint32(proto ? proto->RequiredLevel : 0);
4068 break;
4069 }
4070 case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM: // no idea about this one...
4071 {
4072 data << ObjectGuid::Empty; // item guid
4073 data << uint32(0); // slot
4074 data << ObjectGuid::Empty; // container
4075 break;
4076 }
4080 {
4081 ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
4082 data << uint32(proto ? proto->ItemLimitCategory : 0);
4083 break;
4084 }
4085 default:
4086 break;
4087 }
4088 }
4089 GetSession()->SendPacket(&data);
4090}
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED
Definition: Item.h:125
@ EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM
Definition: Item.h:121
@ EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW
Definition: Item.h:127
@ SMSG_INVENTORY_CHANGE_FAILURE
Definition: Opcodes.h:304
uint32 RequiredLevel
Definition: ItemTemplate.h:645

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(), npc_elder_kuruti::OnGossipSelect(), item_petrov_cluster_bombs::OnUse(), item_only_for_flight::OnUse(), item_incendiary_explosives::OnUse(), item_captured_frog::OnUse(), item_gor_dreks_ointment::OnUse(), ProcessUnlearnAction(), SetAmmo(), SplitItem(), StoreLootItem(), SwapItem(), and TakeQuestSourceItem().

◆ SendEquipmentSetList()

void Player::SendEquipmentSetList ( )
14360{
14361 uint32 count = 0;
14363 size_t count_pos = data.wpos();
14364 data << uint32(count); // count placeholder
14365 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14366 {
14367 if (itr->second.state == EQUIPMENT_SET_DELETED)
14368 continue;
14369
14370 data.appendPackGUID(itr->second.Guid);
14371 data << uint32(itr->first);
14372 data << itr->second.Name;
14373 data << itr->second.IconName;
14374 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14375 {
14376 // ignored slots stored in IgnoreMask, client wants "1" as raw GUID, so no HighGuid::Item
14377 if (itr->second.IgnoreMask & (1 << i))
14378 data.appendPackGUID(uint64(1));
14379 else // xinef: send proper data (do not append 0 with high guid)
14380 data.appendPackGUID(itr->second.Items[i] ? itr->second.Items[i].GetRawValue() : uint64(0));
14381 }
14382
14383 ++count; // client have limit but it checked at loading and set
14384 }
14385 data.put<uint32>(count_pos, count);
14386 GetSession()->SendPacket(&data);
14387}
@ 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 ( )
11530{
11532
11535
11536 CastSpell(this, 836, true); // LOGINEFFECT
11537
11538 // set some aura effects that send packet to player client after add player to map
11539 // SendMessageToSet not send it to player not it map, only for aura that not changed anything at re-apply
11540 // same auras state lost at far teleport, send it one more time in this case also
11541 static const AuraType auratypes[] =
11542 {
11546 };
11547 for (AuraType const* itr = &auratypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
11548 {
11549 Unit::AuraEffectList const& auraList = GetAuraEffectsByType(*itr);
11550 if (!auraList.empty())
11551 auraList.front()->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
11552 }
11553
11554 // Fix mount, update block gets messed somewhere
11555 {
11557 {
11558 AddAura(GetMountBlockId(), this);
11559 SetMountBlockId(0);
11560 }
11561 }
11562
11563 // update zone
11564 uint32 newzone, newarea;
11565 GetZoneAndAreaId(newzone, newarea);
11566 UpdateZone(newzone, newarea); // also call SendInitWorldStates();
11567
11570
11571 // manual send package (have code in HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true); that must not be re-applied.
11573 {
11575 data2 << GetPackGUID();
11576 data2 << (uint32)2;
11577 SendMessageToSet(&data2, true);
11578 }
11579
11580 GetAurasForTarget(this);
11581 SendEnchantmentDurations(); // must be after add to map
11582 SendItemDurations(); // must be after add to map
11585
11586 // raid downscaling - send difficulty to player
11587 if (GetMap()->IsRaid())
11588 {
11590 {
11593 }
11594 }
11596 SendRaidDifficulty(GetGroup() != nullptr);
11597}
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:1543
uint32 GetMountBlockId()
Definition: Player.h:2551
void SendTaxiNodeStatusMultiple()
Definition: Player.cpp:10401
Difficulty GetStoredRaidDifficulty() const
Definition: Player.h:1873
void SendEnchantmentDurations()
Definition: PlayerStorage.cpp:4752
void SendItemDurations()
Definition: PlayerStorage.cpp:4768
void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty=-1)
Definition: PlayerMisc.cpp:177
void SendTimeSync()
Definition: WorldSession.cpp:1648
void ResetTimeSync()
Definition: WorldSession.cpp:1642

References Unit::AddAura(), AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Unit::CastSpell(), Unit::GetAuraEffectsByType(), GetAurasForTarget(), 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

11473{
11476
11477 // guild bank list?
11478
11479 // Homebind
11480 WorldPacket data(SMSG_BINDPOINTUPDATE, 5 * 4);
11481 data << m_homebindX << m_homebindY << m_homebindZ;
11482 data << (uint32) m_homebindMapId;
11483 data << (uint32) m_homebindAreaId;
11484 GetSession()->SendPacket(&data);
11485
11486 // SMSG_SET_PROFICIENCY
11487 // SMSG_SET_PCT_SPELL_MODIFIER
11488 // SMSG_SET_FLAT_SPELL_MODIFIER
11489 // SMSG_UPDATE_AURA_DURATION
11490
11491 SendTalentsInfoData(false);
11492
11493 // SMSG_INSTANCE_DIFFICULTY
11494 data.Initialize(SMSG_INSTANCE_DIFFICULTY, 4 + 4);
11495 data << uint32(GetMap()->GetDifficulty());
11496 data << uint32(GetMap()->GetEntry()->IsDynamicDifficultyMap() && GetMap()->IsHeroic()); // Raid dynamic difficulty
11497 GetSession()->SendPacket(&data);
11498
11500
11501 data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4);
11502 data << uint32(0); // count, for (count) uint32;
11503 GetSession()->SendPacket(&data);
11504
11508
11510
11511 data.Initialize(SMSG_LOGIN_SETTIMESPEED, 4 + 4 + 4);
11512 data.AppendPackedTime(GameTime::GetGameTime().count());
11513 data << float(0.01666667f); // game speed
11514 data << uint32(0); // added in 3.1.2
11515 GetSession()->SendPacket(&data);
11516
11517 GetReputationMgr().SendForceReactions(); // SMSG_SET_FORCED_REACTIONS
11518
11519 // SMSG_TALENTS_INFO x 2 for pet (unspent points and talents in separate packets...)
11520 // SMSG_PET_GUIDS
11521 // SMSG_UPDATE_WORLD_STATE
11522 // SMSG_POWER_UPDATE
11523
11524 SetMover(this);
11525
11526 sScriptMgr->OnSendInitialPacketsBeforeAddToMap(this, data);
11527}
@ 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:2305
void SendInitialSpells()
Definition: Player.cpp:2703
PlayerSocial * GetSocial()
Definition: Player.h:1121
void SendInitialActionButtons() const
Definition: Player.h:1793
void SendEquipmentSetList()
Definition: Player.cpp:14359
void SetMover(Unit *target)
Definition: Player.cpp:12789
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 ( )
2704{
2705 uint32 curTime = GameTime::GetGameTimeMS().count();
2707
2708 uint16 spellCount = 0;
2709
2710 WorldPacket data(SMSG_INITIAL_SPELLS, (1 + 2 + 4 * m_spells.size() + 2 + m_spellCooldowns.size() * (4 + 2 + 2 + 4 + 4)));
2711 data << uint8(0);
2712
2713 size_t countPos = data.wpos();
2714 data << uint16(spellCount); // spell count placeholder
2715
2716 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
2717 {
2718 if (itr->second->State == PLAYERSPELL_REMOVED)
2719 continue;
2720
2721 if (!itr->second->Active || !itr->second->IsInSpec(GetActiveSpec()))
2722 continue;
2723
2724 data << uint32(itr->first);
2725 data << uint16(0); // it's not slot id
2726
2727 ++spellCount;
2728 }
2729
2730 // Added spells from glyphs too (needed by spell tooltips)
2731 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
2732 {
2733 if (uint32 glyph = GetGlyph(i))
2734 {
2735 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyph))
2736 {
2737 data << uint32(glyphEntry->SpellId);
2738 data << uint16(0); // it's not slot id
2739
2740 ++spellCount;
2741 }
2742 }
2743 }
2744
2745 // xinef: we have to send talents, but not those on m_spells list
2746 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
2747 {
2748 if (itr->second->State == PLAYERSPELL_REMOVED)
2749 continue;
2750
2751 // xinef: remove all active talent auras
2752 if (!(itr->second->specMask & GetActiveSpecMask()))
2753 continue;
2754
2755 // xinef: already sent from m_spells
2756 if (itr->second->inSpellBook)
2757 continue;
2758
2759 data << uint32(itr->first);
2760 data << uint16(0); // it's not slot id
2761
2762 ++spellCount;
2763 }
2764
2765 data.put<uint16>(countPos, spellCount); // write real count value
2766
2767 uint16 spellCooldowns = m_spellCooldowns.size();
2768 data << uint16(spellCooldowns);
2769 for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr)
2770 {
2771 if (!itr->second.needSendToClient)
2772 continue;
2773
2774 SpellInfo const* sEntry = sSpellMgr->GetSpellInfo(itr->first);
2775 if (!sEntry)
2776 continue;
2777
2778 data << uint32(itr->first);
2779
2780 data << uint16(itr->second.itemid); // cast item id
2781 data << uint16(itr->second.category); // spell category
2782
2783 // send infinity cooldown in special format
2784 if (itr->second.end >= infTime)
2785 {
2786 data << uint32(1); // cooldown
2787 data << uint32(0x80000000); // category cooldown
2788 continue;
2789 }
2790
2791 uint32 cooldown = itr->second.end > curTime ? itr->second.end - curTime : 0;
2792 data << uint32(itr->second.category ? 0 : cooldown); // cooldown
2793 data << uint32(itr->second.category ? cooldown : 0); // category cooldown
2794 }
2795
2796 GetSession()->SendPacket(&data);
2797}
@ 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 
)
8065{
8066 // data depends on zoneid/mapid...
8068 uint32 mapid = GetMapId();
8069 OutdoorPvP* pvp = sOutdoorPvPMgr->GetOutdoorPvPToZoneId(zoneid);
8070 InstanceScript* instance = GetInstanceScript();
8071 Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(zoneid);
8072
8073 LOG_DEBUG("network", "Sending SMSG_INIT_WORLD_STATES to Map: {}, Zone: {}", mapid, zoneid);
8074
8075 WorldPacket data(SMSG_INIT_WORLD_STATES, (4 + 4 + 4 + 2 + (12 * 8)));
8076 data << uint32(mapid); // mapid
8077 data << uint32(zoneid); // zone id
8078 data << uint32(areaid); // area id, new 2.1.0
8079 size_t countPos = data.wpos();
8080 data << uint16(0); // count of uint64 blocks
8081 data << uint32(0x8d8) << uint32(0x0); // 1
8082 data << uint32(0x8d7) << uint32(0x0); // 2
8083 data << uint32(0x8d6) << uint32(0x0); // 3
8084 data << uint32(0x8d5) << uint32(0x0); // 4
8085 data << uint32(0x8d4) << uint32(0x0); // 5
8086 data << uint32(0x8d3) << uint32(0x0); // 6
8087 // 7 1 - Arena season in progress, 0 - end of season
8088 data << uint32(0xC77) << uint32(sWorld->getBoolConfig(CONFIG_ARENA_SEASON_IN_PROGRESS));
8089 // 8 Arena season id
8090 data << uint32(0xF3D) << uint32(sWorld->getIntConfig(CONFIG_ARENA_SEASON_ID));
8091
8092 if (mapid == 530) // Outland
8093 {
8094 data << uint32(0x9bf) << uint32(0x0); // 7
8095 data << uint32(0x9bd) << uint32(0xF); // 8
8096 data << uint32(0x9bb) << uint32(0xF); // 9
8097 }
8098
8100 {
8101 Player::bgZoneIdToFillWorldStates[zoneid](bg, data);
8102 }
8103 else
8104 {
8105 // insert <field> <value>
8106 switch (zoneid)
8107 {
8108 case 1: // Dun Morogh
8109 case 11: // Wetlands
8110 case 12: // Elwynn Forest
8111 case 38: // Loch Modan
8112 case 40: // Westfall
8113 case 51: // Searing Gorge
8114 case 1519: // Stormwind City
8115 case 1537: // Ironforge
8116 case 2257: // Deeprun Tram
8117 case 3703: // Shattrath City
8118 break;
8119 case 139: // Eastern Plaguelands
8120 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_EP)
8121 pvp->FillInitialWorldStates(data);
8122 else
8123 {
8124 data << uint32(0x97a) << uint32(0x0); // 10 2426
8125 data << uint32(0x917) << uint32(0x0); // 11 2327
8126 data << uint32(0x918) << uint32(0x0); // 12 2328
8127 data << uint32(0x97b) << uint32(0x32); // 13 2427
8128 data << uint32(0x97c) << uint32(0x32); // 14 2428
8129 data << uint32(0x933) << uint32(0x1); // 15 2355
8130 data << uint32(0x946) << uint32(0x0); // 16 2374
8131 data << uint32(0x947) << uint32(0x0); // 17 2375
8132 data << uint32(0x948) << uint32(0x0); // 18 2376
8133 data << uint32(0x949) << uint32(0x0); // 19 2377
8134 data << uint32(0x94a) << uint32(0x0); // 20 2378
8135 data << uint32(0x94b) << uint32(0x0); // 21 2379
8136 data << uint32(0x932) << uint32(0x0); // 22 2354
8137 data << uint32(0x934) << uint32(0x0); // 23 2356
8138 data << uint32(0x935) << uint32(0x0); // 24 2357
8139 data << uint32(0x936) << uint32(0x0); // 25 2358
8140 data << uint32(0x937) << uint32(0x0); // 26 2359
8141 data << uint32(0x938) << uint32(0x0); // 27 2360
8142 data << uint32(0x939) << uint32(0x1); // 28 2361
8143 data << uint32(0x930) << uint32(0x1); // 29 2352
8144 data << uint32(0x93a) << uint32(0x0); // 30 2362
8145 data << uint32(0x93b) << uint32(0x0); // 31 2363
8146 data << uint32(0x93c) << uint32(0x0); // 32 2364
8147 data << uint32(0x93d) << uint32(0x0); // 33 2365
8148 data << uint32(0x944) << uint32(0x0); // 34 2372
8149 data << uint32(0x945) << uint32(0x0); // 35 2373
8150 data << uint32(0x931) << uint32(0x1); // 36 2353
8151 data << uint32(0x93e) << uint32(0x0); // 37 2366
8152 data << uint32(0x931) << uint32(0x1); // 38 2367 ?? grey horde not in dbc! send for consistency's sake, and to match field count
8153 data << uint32(0x940) << uint32(0x0); // 39 2368
8154 data << uint32(0x941) << uint32(0x0); // 7 2369
8155 data << uint32(0x942) << uint32(0x0); // 8 2370
8156 data << uint32(0x943) << uint32(0x0); // 9 2371
8157 }
8158 break;
8159 case 1377: // Silithus
8160 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_SI)
8161 pvp->FillInitialWorldStates(data);
8162 else
8163 {
8164 // states are always shown
8165 data << uint32(2313) << uint32(0x0); // 7 ally silityst gathered
8166 data << uint32(2314) << uint32(0x0); // 8 horde silityst gathered
8167 data << uint32(2317) << uint32(0x0); // 9 max silithyst
8168 }
8169 // dunno about these... aq opening event maybe?
8170 data << uint32(2322) << uint32(0x0); // 10 sandworm N
8171 data << uint32(2323) << uint32(0x0); // 11 sandworm S
8172 data << uint32(2324) << uint32(0x0); // 12 sandworm SW
8173 data << uint32(2325) << uint32(0x0); // 13 sandworm E
8174 break;
8175 case 2597: // Alterac Valley
8176 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_AV)
8177 bg->FillInitialWorldStates(data);
8178 else
8179 {
8180 data << uint32(0x7ae) << uint32(0x1); // 7 snowfall n
8181 data << uint32(0x532) << uint32(0x1); // 8 frostwolfhut hc
8182 data << uint32(0x531) << uint32(0x0); // 9 frostwolfhut ac
8183 data << uint32(0x52e) << uint32(0x0); // 10 stormpike firstaid a_a
8184 data << uint32(0x571) << uint32(0x0); // 11 east frostwolf tower horde assaulted -unused
8185 data << uint32(0x570) << uint32(0x0); // 12 west frostwolf tower horde assaulted - unused
8186 data << uint32(0x567) << uint32(0x1); // 13 frostwolfe c
8187 data << uint32(0x566) << uint32(0x1); // 14 frostwolfw c
8188 data << uint32(0x550) << uint32(0x1); // 15 irondeep (N) ally
8189 data << uint32(0x544) << uint32(0x0); // 16 ice grave a_a
8190 data << uint32(0x536) << uint32(0x0); // 17 stormpike grave h_c
8191 data << uint32(0x535) << uint32(0x1); // 18 stormpike grave a_c
8192 data << uint32(0x518) << uint32(0x0); // 19 stoneheart grave a_a
8193 data << uint32(0x517) << uint32(0x0); // 20 stoneheart grave h_a
8194 data << uint32(0x574) << uint32(0x0); // 21 1396 unk
8195 data << uint32(0x573) << uint32(0x0); // 22 iceblood tower horde assaulted -unused
8196 data << uint32(0x572) << uint32(0x0); // 23 towerpoint horde assaulted - unused
8197 data << uint32(0x56f) << uint32(0x0); // 24 1391 unk
8198 data << uint32(0x56e) << uint32(0x0); // 25 iceblood a
8199 data << uint32(0x56d) << uint32(0x0); // 26 towerp a
8200 data << uint32(0x56c) << uint32(0x0); // 27 frostwolfe a
8201 data << uint32(0x56b) << uint32(0x0); // 28 froswolfw a
8202 data << uint32(0x56a) << uint32(0x1); // 29 1386 unk
8203 data << uint32(0x569) << uint32(0x1); // 30 iceblood c
8204 data << uint32(0x568) << uint32(0x1); // 31 towerp c
8205 data << uint32(0x565) << uint32(0x0); // 32 stoneh tower a
8206 data << uint32(0x564) << uint32(0x0); // 33 icewing tower a
8207 data << uint32(0x563) << uint32(0x0); // 34 dunn a
8208 data << uint32(0x562) << uint32(0x0); // 35 duns a
8209 data << uint32(0x561) << uint32(0x0); // 36 stoneheart bunker alliance assaulted - unused
8210 data << uint32(0x560) << uint32(0x0); // 37 icewing bunker alliance assaulted - unused
8211 data << uint32(0x55f) << uint32(0x0); // 38 dunbaldar south alliance assaulted - unused
8212 data << uint32(0x55e) << uint32(0x0); // 39 dunbaldar north alliance assaulted - unused
8213 data << uint32(0x55d) << uint32(0x0); // 40 stone tower d
8214 data << uint32(0x3c6) << uint32(0x0); // 41 966 unk
8215 data << uint32(0x3c4) << uint32(0x0); // 42 964 unk
8216 data << uint32(0x3c2) << uint32(0x0); // 43 962 unk
8217 data << uint32(0x516) << uint32(0x1); // 44 stoneheart grave a_c
8218 data << uint32(0x515) << uint32(0x0); // 45 stonheart grave h_c
8219 data << uint32(0x3b6) << uint32(0x0); // 46 950 unk
8220 data << uint32(0x55c) << uint32(0x0); // 47 icewing tower d
8221 data << uint32(0x55b) << uint32(0x0); // 48 dunn d
8222 data << uint32(0x55a) << uint32(0x0); // 49 duns d
8223 data << uint32(0x559) << uint32(0x0); // 50 1369 unk
8224 data << uint32(0x558) << uint32(0x0); // 51 iceblood d
8225 data << uint32(0x557) << uint32(0x0); // 52 towerp d
8226 data << uint32(0x556) << uint32(0x0); // 53 frostwolfe d
8227 data << uint32(0x555) << uint32(0x0); // 54 frostwolfw d
8228 data << uint32(0x554) << uint32(0x1); // 55 stoneh tower c
8229 data << uint32(0x553) << uint32(0x1); // 56 icewing tower c
8230 data << uint32(0x552) << uint32(0x1); // 57 dunn c
8231 data << uint32(0x551) << uint32(0x1); // 58 duns c
8232 data << uint32(0x54f) << uint32(0x0); // 59 irondeep (N) horde
8233 data << uint32(0x54e) << uint32(0x0); // 60 irondeep (N) ally
8234 data << uint32(0x54d) << uint32(0x1); // 61 mine (S) neutral
8235 data << uint32(0x54c) << uint32(0x0); // 62 mine (S) horde
8236 data << uint32(0x54b) << uint32(0x0); // 63 mine (S) ally
8237 data << uint32(0x545) << uint32(0x0); // 64 iceblood h_a
8238 data << uint32(0x543) << uint32(0x1); // 65 iceblod h_c
8239 data << uint32(0x542) << uint32(0x0); // 66 iceblood a_c
8240 data << uint32(0x540) << uint32(0x0); // 67 snowfall h_a
8241 data << uint32(0x53f) << uint32(0x0); // 68 snowfall a_a
8242 data << uint32(0x53e) << uint32(0x0); // 69 snowfall h_c
8243 data << uint32(0x53d) << uint32(0x0); // 70 snowfall a_c
8244 data << uint32(0x53c) << uint32(0x0); // 71 frostwolf g h_a
8245 data << uint32(0x53b) << uint32(0x0); // 72 frostwolf g a_a
8246 data << uint32(0x53a) << uint32(0x1); // 73 frostwolf g h_c
8247 data << uint32(0x539) << uint32(0x0); // 74 frostwolf g a_c
8248 data << uint32(0x538) << uint32(0x0); // 75 stormpike grave h_a
8249 data << uint32(0x537) << uint32(0x0); // 76 stormpike grave a_a
8250 data << uint32(0x534) << uint32(0x0); // 77 frostwolf hut h_a
8251 data << uint32(0x533) << uint32(0x0); // 78 frostwolf hut a_a
8252 data << uint32(0x530) << uint32(0x0); // 79 stormpike first aid h_a
8253 data << uint32(0x52f) << uint32(0x0); // 80 stormpike first aid h_c
8254 data << uint32(0x52d) << uint32(0x1); // 81 stormpike first aid a_c
8255 }
8256 break;
8257 case 3277: // Warsong Gulch
8258 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_WS)
8259 bg->FillInitialWorldStates(data);
8260 else
8261 {
8262 data << uint32(0x62d) << uint32(0x0); // 7 1581 alliance flag captures
8263 data << uint32(0x62e) << uint32(0x0); // 8 1582 horde flag captures
8264 data << uint32(0x609) << uint32(0x0); // 9 1545 unk, set to 1 on alliance flag pickup...
8265 data << uint32(0x60a) << uint32(0x0); // 10 1546 unk, set to 1 on horde flag pickup, after drop it's -1
8266 data << uint32(0x60b) << uint32(0x2); // 11 1547 unk
8267 data << uint32(0x641) << uint32(0x3); // 12 1601 unk (max flag captures?)
8268 data << uint32(0x922) << uint32(0x1); // 13 2338 horde (0 - hide, 1 - flag ok, 2 - flag picked up (flashing), 3 - flag picked up (not flashing)
8269 data << uint32(0x923) << uint32(0x1); // 14 2339 alliance (0 - hide, 1 - flag ok, 2 - flag picked up (flashing), 3 - flag picked up (not flashing)
8270 }
8271 break;
8272 case 3358: // Arathi Basin
8273 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_AB)
8274 bg->FillInitialWorldStates(data);
8275 else
8276 {
8277 data << uint32(0x6e7) << uint32(0x0); // 7 1767 stables alliance
8278 data << uint32(0x6e8) << uint32(0x0); // 8 1768 stables horde
8279 data << uint32(0x6e9) << uint32(0x0); // 9 1769 unk, ST?
8280 data << uint32(0x6ea) << uint32(0x0); // 10 1770 stables (show/hide)
8281 data << uint32(0x6ec) << uint32(0x0); // 11 1772 farm (0 - horde controlled, 1 - alliance controlled)
8282 data << uint32(0x6ed) << uint32(0x0); // 12 1773 farm (show/hide)
8283 data << uint32(0x6ee) << uint32(0x0); // 13 1774 farm color
8284 data << uint32(0x6ef) << uint32(0x0); // 14 1775 gold mine color, may be FM?
8285 data << uint32(0x6f0) << uint32(0x0); // 15 1776 alliance resources
8286 data << uint32(0x6f1) << uint32(0x0); // 16 1777 horde resources
8287 data << uint32(0x6f2) << uint32(0x0); // 17 1778 horde bases
8288 data << uint32(0x6f3) << uint32(0x0); // 18 1779 alliance bases
8289 data << uint32(0x6f4) << uint32(0x640); // 19 1780 max resources (1600)
8290 data << uint32(0x6f6) << uint32(0x0); // 20 1782 blacksmith color
8291 data << uint32(0x6f7) << uint32(0x0); // 21 1783 blacksmith (show/hide)
8292 data << uint32(0x6f8) << uint32(0x0); // 22 1784 unk, bs?
8293 data << uint32(0x6f9) << uint32(0x0); // 23 1785 unk, bs?
8294 data << uint32(0x6fb) << uint32(0x0); // 24 1787 gold mine (0 - horde contr, 1 - alliance contr)
8295 data << uint32(0x6fc) << uint32(0x0); // 25 1788 gold mine (0 - conflict, 1 - horde)
8296 data << uint32(0x6fd) << uint32(0x0); // 26 1789 gold mine (1 - show/0 - hide)
8297 data << uint32(0x6fe) << uint32(0x0); // 27 1790 gold mine color
8298 data << uint32(0x700) << uint32(0x0); // 28 1792 gold mine color, may be LM?
8299 data << uint32(0x701) << uint32(0x0); // 29 1793 lumber mill color (0 - conflict, 1 - horde contr)
8300 data << uint32(0x702) << uint32(0x0); // 30 1794 lumber mill (show/hide)
8301 data << uint32(0x703) << uint32(0x0); // 31 1795 lumber mill color color
8302 data << uint32(0x732) << uint32(0x1); // 32 1842 stables (1 - uncontrolled)
8303 data << uint32(0x733) << uint32(0x1); // 33 1843 gold mine (1 - uncontrolled)
8304 data << uint32(0x734) << uint32(0x1); // 34 1844 lumber mill (1 - uncontrolled)
8305 data << uint32(0x735) << uint32(0x1); // 35 1845 farm (1 - uncontrolled)
8306 data << uint32(0x736) << uint32(0x1); // 36 1846 blacksmith (1 - uncontrolled)
8307 data << uint32(0x745) << uint32(0x2); // 37 1861 unk
8308 data << uint32(0x7a3) << uint32(0x578); // 38 1955 warning limit (1400)
8309 }
8310 break;
8311 case 3820: // Eye of the Storm
8312 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_EY)
8313 bg->FillInitialWorldStates(data);
8314 else
8315 {
8316 data << uint32(0xac1) << uint32(0x0); // 7 2753 Horde Bases
8317 data << uint32(0xac0) << uint32(0x0); // 8 2752 Alliance Bases
8318 data << uint32(0xab6) << uint32(0x0); // 9 2742 Mage Tower - Horde conflict
8319 data << uint32(0xab5) << uint32(0x0); // 10 2741 Mage Tower - Alliance conflict
8320 data << uint32(0xab4) << uint32(0x0); // 11 2740 Fel Reaver - Horde conflict
8321 data << uint32(0xab3) << uint32(0x0); // 12 2739 Fel Reaver - Alliance conflict
8322 data << uint32(0xab2) << uint32(0x0); // 13 2738 Draenei - Alliance conflict
8323 data << uint32(0xab1) << uint32(0x0); // 14 2737 Draenei - Horde conflict
8324 data << uint32(0xab0) << uint32(0x0); // 15 2736 unk // 0 at start
8325 data << uint32(0xaaf) << uint32(0x0); // 16 2735 unk // 0 at start
8326 data << uint32(0xaad) << uint32(0x0); // 17 2733 Draenei - Horde control
8327 data << uint32(0xaac) << uint32(0x0); // 18 2732 Draenei - Alliance control
8328 data << uint32(0xaab) << uint32(0x1); // 19 2731 Draenei uncontrolled (1 - yes, 0 - no)
8329 data << uint32(0xaaa) << uint32(0x0); // 20 2730 Mage Tower - Alliance control
8330 data << uint32(0xaa9) << uint32(0x0); // 21 2729 Mage Tower - Horde control
8331 data << uint32(0xaa8) << uint32(0x1); // 22 2728 Mage Tower uncontrolled (1 - yes, 0 - no)
8332 data << uint32(0xaa7) << uint32(0x0); // 23 2727 Fel Reaver - Horde control
8333 data << uint32(0xaa6) << uint32(0x0); // 24 2726 Fel Reaver - Alliance control
8334 data << uint32(0xaa5) << uint32(0x1); // 25 2725 Fel Reaver uncontrolled (1 - yes, 0 - no)
8335 data << uint32(0xaa4) << uint32(0x0); // 26 2724 Boold Elf - Horde control
8336 data << uint32(0xaa3) << uint32(0x0); // 27 2723 Boold Elf - Alliance control
8337 data << uint32(0xaa2) << uint32(0x1); // 28 2722 Boold Elf uncontrolled (1 - yes, 0 - no)
8338 data << uint32(0xac5) << uint32(0x1); // 29 2757 Flag (1 - show, 0 - hide) - doesn't work exactly this way!
8339 data << uint32(0xad2) << uint32(0x1); // 30 2770 Horde top-stats (1 - show, 0 - hide) // 02 -> horde picked up the flag
8340 data << uint32(0xad1) << uint32(0x1); // 31 2769 Alliance top-stats (1 - show, 0 - hide) // 02 -> alliance picked up the flag
8341 data << uint32(0xabe) << uint32(0x0); // 32 2750 Horde resources
8342 data << uint32(0xabd) << uint32(0x0); // 33 2749 Alliance resources
8343 data << uint32(0xa05) << uint32(0x8e); // 34 2565 unk, constant?
8344 data << uint32(0xaa0) << uint32(0x0); // 35 2720 Capturing progress-bar (100 -> empty (only grey), 0 -> blue|red (no grey), default 0)
8345 data << uint32(0xa9f) << uint32(0x0); // 36 2719 Capturing progress-bar (0 - left, 100 - right)
8346 data << uint32(0xa9e) << uint32(0x0); // 37 2718 Capturing progress-bar (1 - show, 0 - hide)
8347 data << uint32(0xc0d) << uint32(0x17b); // 38 3085 unk
8348 // and some more ... unknown
8349 }
8350 break;
8351 // any of these needs change! the client remembers the prev setting!
8352 // ON EVERY ZONE LEAVE, RESET THE OLD ZONE'S WORLD STATE, BUT AT LEAST THE UI STUFF!
8353 case 3483: // Hellfire Peninsula
8354 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_HP)
8355 pvp->FillInitialWorldStates(data);
8356 else
8357 {
8358 data << uint32(0x9ba) << uint32(0x1); // 10 // add ally tower main gui icon // maybe should be sent only on login?
8359 data << uint32(0x9b9) << uint32(0x1); // 11 // add horde tower main gui icon // maybe should be sent only on login?
8360 data << uint32(0x9b5) << uint32(0x0); // 12 // show neutral broken hill icon // 2485
8361 data << uint32(0x9b4) << uint32(0x1); // 13 // show icon above broken hill // 2484
8362 data << uint32(0x9b3) << uint32(0x0); // 14 // show ally broken hill icon // 2483
8363 data << uint32(0x9b2) << uint32(0x0); // 15 // show neutral overlook icon // 2482
8364 data << uint32(0x9b1) << uint32(0x1); // 16 // show the overlook arrow // 2481
8365 data << uint32(0x9b0) << uint32(0x0); // 17 // show ally overlook icon // 2480
8366 data << uint32(0x9ae) << uint32(0x0); // 18 // horde pvp objectives captured // 2478
8367 data << uint32(0x9ac) << uint32(0x0); // 19 // ally pvp objectives captured // 2476
8368 data << uint32(2475) << uint32(100); //: ally / horde slider grey area // show only in direct vicinity!
8369 data << uint32(2474) << uint32(50); //: ally / horde slider percentage, 100 for ally, 0 for horde // show only in direct vicinity!
8370 data << uint32(2473) << uint32(0); //: ally / horde slider display // show only in direct vicinity!
8371 data << uint32(0x9a8) << uint32(0x0); // 20 // show the neutral stadium icon // 2472
8372 data << uint32(0x9a7) << uint32(0x0); // 21 // show the ally stadium icon // 2471
8373 data << uint32(0x9a6) << uint32(0x1); // 22 // show the horde stadium icon // 2470
8374 }
8375 break;
8376 case 3518: // Nagrand
8377 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_NA)
8378 pvp->FillInitialWorldStates(data);
8379 else
8380 {
8381 data << uint32(2503) << uint32(0x0); // 10
8382 data << uint32(2502) << uint32(0x0); // 11
8383 data << uint32(2493) << uint32(0x0); // 12
8384 data << uint32(2491) << uint32(0x0); // 13
8385
8386 data << uint32(2495) << uint32(0x0); // 14
8387 data << uint32(2494) << uint32(0x0); // 15
8388 data << uint32(2497) << uint32(0x0); // 16
8389
8390 data << uint32(2762) << uint32(0x0); // 17
8391 data << uint32(2662) << uint32(0x0); // 18
8392 data << uint32(2663) << uint32(0x0); // 19
8393 data << uint32(2664) << uint32(0x0); // 20
8394
8395 data << uint32(2760) << uint32(0x0); // 21
8396 data << uint32(2670) << uint32(0x0); // 22
8397 data << uint32(2668) << uint32(0x0); // 23
8398 data << uint32(2669) << uint32(0x0); // 24
8399
8400 data << uint32(2761) << uint32(0x0); // 25
8401 data << uint32(2667) << uint32(0x0); // 26
8402 data << uint32(2665) << uint32(0x0); // 27
8403 data << uint32(2666) << uint32(0x0); // 28
8404
8405 data << uint32(2763) << uint32(0x0); // 29
8406 data << uint32(2659) << uint32(0x0); // 30
8407 data << uint32(2660) << uint32(0x0); // 31
8408 data << uint32(2661) << uint32(0x0); // 32
8409
8410 data << uint32(2671) << uint32(0x0); // 33
8411 data << uint32(2676) << uint32(0x0); // 34
8412 data << uint32(2677) << uint32(0x0); // 35
8413 data << uint32(2672) << uint32(0x0); // 36
8414 data << uint32(2673) << uint32(0x0); // 37
8415 }
8416 break;
8417 case 3519: // Terokkar Forest
8418 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_TF)
8419 pvp->FillInitialWorldStates(data);
8420 else
8421 {
8422 data << uint32(0xa41) << uint32(0x0); // 10 // 2625 capture bar pos
8423 data << uint32(0xa40) << uint32(0x14); // 11 // 2624 capture bar neutral
8424 data << uint32(0xa3f) << uint32(0x0); // 12 // 2623 show capture bar
8425 data << uint32(0xa3e) << uint32(0x0); // 13 // 2622 horde towers controlled
8426 data << uint32(0xa3d) << uint32(0x5); // 14 // 2621 ally towers controlled
8427 data << uint32(0xa3c) << uint32(0x0); // 15 // 2620 show towers controlled
8428 data << uint32(0xa88) << uint32(0x0); // 16 // 2696 SE Neu
8429 data << uint32(0xa87) << uint32(0x0); // 17 // SE Horde
8430 data << uint32(0xa86) << uint32(0x0); // 18 // SE Ally
8431 data << uint32(0xa85) << uint32(0x0); // 19 //S Neu
8432 data << uint32(0xa84) << uint32(0x0); // 20 S Horde
8433 data << uint32(0xa83) << uint32(0x0); // 21 S Ally
8434 data << uint32(0xa82) << uint32(0x0); // 22 NE Neu
8435 data << uint32(0xa81) << uint32(0x0); // 23 NE Horde
8436 data << uint32(0xa80) << uint32(0x0); // 24 NE Ally
8437 data << uint32(0xa7e) << uint32(0x0); // 25 // 2686 N Neu
8438 data << uint32(0xa7d) << uint32(0x0); // 26 N Horde
8439 data << uint32(0xa7c) << uint32(0x0); // 27 N Ally
8440 data << uint32(0xa7b) << uint32(0x0); // 28 NW Ally
8441 data << uint32(0xa7a) << uint32(0x0); // 29 NW Horde
8442 data << uint32(0xa79) << uint32(0x0); // 30 NW Neutral
8443 data << uint32(0x9d0) << uint32(0x5); // 31 // 2512 locked time remaining seconds first digit
8444 data << uint32(0x9ce) << uint32(0x0); // 32 // 2510 locked time remaining seconds second digit
8445 data << uint32(0x9cd) << uint32(0x0); // 33 // 2509 locked time remaining minutes
8446 data << uint32(0x9cc) << uint32(0x0); // 34 // 2508 neutral locked time show
8447 data << uint32(0xad0) << uint32(0x0); // 35 // 2768 horde locked time show
8448 data << uint32(0xacf) << uint32(0x1); // 36 // 2767 ally locked time show
8449 }
8450 break;
8451 case 3521: // Zangarmarsh
8452 if (pvp && pvp->GetTypeId() == OUTDOOR_PVP_ZM)
8453 pvp->FillInitialWorldStates(data);
8454 else
8455 {
8456 data << uint32(0x9e1) << uint32(0x0); // 10 //2529
8457 data << uint32(0x9e0) << uint32(0x0); // 11
8458 data << uint32(0x9df) << uint32(0x0); // 12
8459 data << uint32(0xa5d) << uint32(0x1); // 13 //2653
8460 data << uint32(0xa5c) << uint32(0x0); // 14 //2652 east beacon neutral
8461 data << uint32(0xa5b) << uint32(0x1); // 15 horde
8462 data << uint32(0xa5a) << uint32(0x0); // 16 ally
8463 data << uint32(0xa59) << uint32(0x1); // 17 // 2649 Twin spire graveyard horde 12???
8464 data << uint32(0xa58) << uint32(0x0); // 18 ally 14 ???
8465 data << uint32(0xa57) << uint32(0x0); // 19 neutral 7???
8466 data << uint32(0xa56) << uint32(0x0); // 20 // 2646 west beacon neutral
8467 data << uint32(0xa55) << uint32(0x1); // 21 horde
8468 data << uint32(0xa54) << uint32(0x0); // 22 ally
8469 data << uint32(0x9e7) << uint32(0x0); // 23 // 2535
8470 data << uint32(0x9e6) << uint32(0x0); // 24
8471 data << uint32(0x9e5) << uint32(0x0); // 25
8472 data << uint32(0xa00) << uint32(0x0); // 26 // 2560
8473 data << uint32(0x9ff) << uint32(0x1); // 27
8474 data << uint32(0x9fe) << uint32(0x0); // 28
8475 data << uint32(0x9fd) << uint32(0x0); // 29
8476 data << uint32(0x9fc) << uint32(0x1); // 30
8477 data << uint32(0x9fb) << uint32(0x0); // 31
8478 data << uint32(0xa62) << uint32(0x0); // 32 // 2658
8479 data << uint32(0xa61) << uint32(0x1); // 33
8480 data << uint32(0xa60) << uint32(0x1); // 34
8481 data << uint32(0xa5f) << uint32(0x0); // 35
8482 }
8483 break;
8484 case 3698: // Nagrand Arena
8485 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_NA)
8486 bg->FillInitialWorldStates(data);
8487 else
8488 {
8489 data << uint32(0xa0f) << uint32(0x0); // 7
8490 data << uint32(0xa10) << uint32(0x0); // 8
8491 data << uint32(0xa11) << uint32(0x0); // 9 show
8492 }
8493 break;
8494 case 3702: // Blade's Edge Arena
8495 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_BE)
8496 bg->FillInitialWorldStates(data);
8497 else
8498 {
8499 data << uint32(0x9f0) << uint32(0x0); // 7 gold
8500 data << uint32(0x9f1) << uint32(0x0); // 8 green
8501 data << uint32(0x9f3) << uint32(0x0); // 9 show
8502 }
8503 break;
8504 case 3968: // Ruins of Lordaeron
8505 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_RL)
8506 bg->FillInitialWorldStates(data);
8507 else
8508 {
8509 data << uint32(0xbb8) << uint32(0x0); // 7 gold
8510 data << uint32(0xbb9) << uint32(0x0); // 8 green
8511 data << uint32(0xbba) << uint32(0x0); // 9 show
8512 }
8513 break;
8514 case 4378: // Dalaran Sewers
8515 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_DS)
8516 bg->FillInitialWorldStates(data);
8517 else
8518 {
8519 data << uint32(3601) << uint32(0x0); // 7 gold
8520 data << uint32(3600) << uint32(0x0); // 8 green
8521 data << uint32(3610) << uint32(0x0); // 9 show
8522 }
8523 break;
8524 case 4384: // Strand of the Ancients
8525 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_SA)
8526 bg->FillInitialWorldStates(data);
8527 else
8528 {
8529 // 1-3 A defend, 4-6 H defend, 7-9 unk defend, 1 - ok, 2 - half destroyed, 3 - destroyed
8530 data << uint32(0xf09) << uint32(0x0); // 7 3849 Gate of Temple
8531 data << uint32(0xe36) << uint32(0x0); // 8 3638 Gate of Yellow Moon
8532 data << uint32(0xe27) << uint32(0x0); // 9 3623 Gate of Green Emerald
8533 data << uint32(0xe24) << uint32(0x0); // 10 3620 Gate of Blue Sapphire
8534 data << uint32(0xe21) << uint32(0x0); // 11 3617 Gate of Red Sun
8535 data << uint32(0xe1e) << uint32(0x0); // 12 3614 Gate of Purple Ametyst
8536
8537 data << uint32(0xdf3) << uint32(0x0); // 13 3571 bonus timer (1 - on, 0 - off)
8538 data << uint32(0xded) << uint32(0x0); // 14 3565 Horde Attacker
8539 data << uint32(0xdec) << uint32(0x0); // 15 3564 Alliance Attacker
8540 // End Round (timer), better explain this by example, eg. ends in 19:59 -> A:BC
8541 data << uint32(0xde9) << uint32(0x0); // 16 3561 C
8542 data << uint32(0xde8) << uint32(0x0); // 17 3560 B
8543 data << uint32(0xde7) << uint32(0x0); // 18 3559 A
8544 data << uint32(0xe35) << uint32(0x0); // 19 3637 East g - Horde control
8545 data << uint32(0xe34) << uint32(0x0); // 20 3636 West g - Horde control
8546 data << uint32(0xe33) << uint32(0x0); // 21 3635 South g - Horde control
8547 data << uint32(0xe32) << uint32(0x0); // 22 3634 East g - Alliance control
8548 data << uint32(0xe31) << uint32(0x0); // 23 3633 West g - Alliance control
8549 data << uint32(0xe30) << uint32(0x0); // 24 3632 South g - Alliance control
8550 data << uint32(0xe2f) << uint32(0x0); // 25 3631 Chamber of Ancients - Horde control
8551 data << uint32(0xe2e) << uint32(0x0); // 26 3630 Chamber of Ancients - Alliance control
8552 data << uint32(0xe2d) << uint32(0x0); // 27 3629 Beach1 - Horde control
8553 data << uint32(0xe2c) << uint32(0x0); // 28 3628 Beach2 - Horde control
8554 data << uint32(0xe2b) << uint32(0x0); // 29 3627 Beach1 - Alliance control
8555 data << uint32(0xe2a) << uint32(0x0); // 30 3626 Beach2 - Alliance control
8556 // and many unks...
8557 }
8558 break;
8559 case 4406: // Ring of Valor
8560 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_RV)
8561 bg->FillInitialWorldStates(data);
8562 else
8563 {
8564 data << uint32(0xe10) << uint32(0x0); // 7 gold
8565 data << uint32(0xe11) << uint32(0x0); // 8 green
8566 data << uint32(0xe1a) << uint32(0x0); // 9 show
8567 }
8568 break;
8569 case 4710: // Isle of Conquest
8570 if (bg && bg->GetBgTypeID(true) == BATTLEGROUND_IC)
8571 bg->FillInitialWorldStates(data);
8572 else
8573 {
8574 data << uint32(4221) << uint32(1); // 7 BG_IC_ALLIANCE_RENFORT_SET
8575 data << uint32(4222) << uint32(1); // 8 BG_IC_HORDE_RENFORT_SET
8576 data << uint32(4226) << uint32(300); // 9 BG_IC_ALLIANCE_RENFORT
8577 data << uint32(4227) << uint32(300); // 10 BG_IC_HORDE_RENFORT
8578 data << uint32(4322) << uint32(1); // 11 BG_IC_GATE_FRONT_H_WS_OPEN
8579 data << uint32(4321) << uint32(1); // 12 BG_IC_GATE_WEST_H_WS_OPEN
8580 data << uint32(4320) << uint32(1); // 13 BG_IC_GATE_EAST_H_WS_OPEN
8581 data << uint32(4323) << uint32(1); // 14 BG_IC_GATE_FRONT_A_WS_OPEN
8582 data << uint32(4324) << uint32(1); // 15 BG_IC_GATE_WEST_A_WS_OPEN
8583 data << uint32(4325) << uint32(1); // 16 BG_IC_GATE_EAST_A_WS_OPEN
8584 data << uint32(4317) << uint32(1); // 17 unknown
8585
8586 data << uint32(4301) << uint32(1); // 18 BG_IC_DOCKS_UNCONTROLLED
8587 data << uint32(4296) << uint32(1); // 19 BG_IC_HANGAR_UNCONTROLLED
8588 data << uint32(4306) << uint32(1); // 20 BG_IC_QUARRY_UNCONTROLLED
8589 data << uint32(4311) << uint32(1); // 21 BG_IC_REFINERY_UNCONTROLLED
8590 data << uint32(4294) << uint32(1); // 22 BG_IC_WORKSHOP_UNCONTROLLED
8591 data << uint32(4243) << uint32(1); // 23 unknown
8592 data << uint32(4345) << uint32(1); // 24 unknown
8593 }
8594 break;
8595 // The Ruby Sanctum
8596 case 4987:
8597 if (instance && mapid == 724)
8598 instance->FillInitialWorldStates(data);
8599 else
8600 {
8601 data << uint32(5049) << uint32(50); // 9 WORLDSTATE_CORPOREALITY_MATERIAL
8602 data << uint32(5050) << uint32(50); // 10 WORLDSTATE_CORPOREALITY_TWILIGHT
8603 data << uint32(5051) << uint32(0); // 11 WORLDSTATE_CORPOREALITY_TOGGLE
8604 }
8605 break;
8606 // Icecrown Citadel
8607 case 4812:
8608 if (instance && mapid == 631)
8609 instance->FillInitialWorldStates(data);
8610 else
8611 {
8612 data << uint32(4903) << uint32(0); // 9 WORLDSTATE_SHOW_TIMER (Blood Quickening weekly)
8613 data << uint32(4904) << uint32(30); // 10 WORLDSTATE_EXECUTION_TIME
8614 data << uint32(4940) << uint32(0); // 11 WORLDSTATE_SHOW_ATTEMPTS
8615 data << uint32(4941) << uint32(50); // 12 WORLDSTATE_ATTEMPTS_REMAINING
8616 data << uint32(4942) << uint32(50); // 13 WORLDSTATE_ATTEMPTS_MAX
8617 }
8618 break;
8619 // The Culling of Stratholme
8620 case 4100:
8621 if (instance && mapid == 595)
8622 instance->FillInitialWorldStates(data);
8623 else
8624 {
8625 data << uint32(3479) << uint32(0); // 9 WORLDSTATE_SHOW_CRATES
8626 data << uint32(3480) << uint32(0); // 10 WORLDSTATE_CRATES_REVEALED
8627 data << uint32(3504) << uint32(0); // 11 WORLDSTATE_WAVE_COUNT
8628 data << uint32(3931) << uint32(25); // 12 WORLDSTATE_TIME_GUARDIAN
8629 data << uint32(3932) << uint32(0); // 13 WORLDSTATE_TIME_GUARDIAN_SHOW
8630 }
8631 break;
8632 // The Oculus
8633 case 4228:
8634 if (instance && mapid == 578)
8635 instance->FillInitialWorldStates(data);
8636 else
8637 {
8638 data << uint32(3524) << uint32(0); // 9 WORLD_STATE_CENTRIFUGE_CONSTRUCT_SHOW
8639 data << uint32(3486) << uint32(0); // 10 WORLD_STATE_CENTRIFUGE_CONSTRUCT_AMOUNT
8640 }
8641 break;
8642 // Ulduar
8643 case 4273:
8644 if (instance && mapid == 603)
8645 instance->FillInitialWorldStates(data);
8646 else
8647 {
8648 data << uint32(4132) << uint32(0); // 9 WORLDSTATE_ALGALON_TIMER_ENABLED
8649 data << uint32(4131) << uint32(0); // 10 WORLDSTATE_ALGALON_DESPAWN_TIMER
8650 }
8651 break;
8652 // Halls of Refection
8653 case 4820:
8654 if (instance && mapid == 668)
8655 instance->FillInitialWorldStates(data);
8656 else
8657 {
8658 data << uint32(4884) << uint32(0); // 9 WORLD_STATE_HOR_WAVES_ENABLED
8659 data << uint32(4882) << uint32(0); // 10 WORLD_STATE_HOR_WAVE_COUNT
8660 }
8661 break;
8662 // Scarlet Enclave (DK starting zone)
8663 case 4298:
8664 // Get Mograine, GUID and ENTRY should NEVER change
8665 if (Creature* mograine = ObjectAccessor::GetCreature(*this, ObjectGuid::Create<HighGuid::Unit>(29173, 130956)))
8666 {
8667 if (CreatureAI* mograineAI = mograine->AI())
8668 {
8669 data << uint32(3590) << uint32(mograineAI->GetData(3590));
8670 data << uint32(3591) << uint32(mograineAI->GetData(3591));
8671 data << uint32(3592) << uint32(mograineAI->GetData(3592));
8672 data << uint32(3603) << uint32(mograineAI->GetData(3603));
8673 data << uint32(3604) << uint32(mograineAI->GetData(3604));
8674 data << uint32(3605) << uint32(mograineAI->GetData(3605));
8675 }
8676 }
8677 break;
8678 // Wintergrasp
8679 case 4197:
8680 if (bf && bf->GetTypeId() == BATTLEFIELD_WG)
8681 {
8682 bf->FillInitialWorldStates(data);
8683 break;
8684 }
8685 [[fallthrough]];
8686 default:
8687 data << uint32(0x914) << uint32(0x0); // 7
8688 data << uint32(0x913) << uint32(0x0); // 8
8689 data << uint32(0x912) << uint32(0x0); // 9
8690 data << uint32(0x915) << uint32(0x0); // 10
8691 break;
8692 }
8693 }
8694
8695 uint16 length = (data.wpos() - countPos) / 8;
8696 data.put<uint16>(countPos, length);
8697
8698 GetSession()->SendPacket(&data);
8701}
@ BATTLEFIELD_WG
Definition: Battlefield.h:31
@ OUTDOOR_PVP_SI
Definition: OutdoorPvP.h:33
@ OUTDOOR_PVP_TF
Definition: OutdoorPvP.h:31
@ OUTDOOR_PVP_ZM
Definition: OutdoorPvP.h:32
@ OUTDOOR_PVP_EP
Definition: OutdoorPvP.h:34
@ OUTDOOR_PVP_NA
Definition: OutdoorPvP.h:30
@ OUTDOOR_PVP_HP
Definition: OutdoorPvP.h:29
@ CONFIG_ARENA_SEASON_ID
Definition: IWorld.h:325
@ CONFIG_ARENA_SEASON_IN_PROGRESS
Definition: IWorld.h:123
@ BATTLEGROUND_IC
Definition: SharedDefines.h:3464
@ BATTLEGROUND_WS
Definition: SharedDefines.h:3454
@ BATTLEGROUND_EY
Definition: SharedDefines.h:3459
@ BATTLEGROUND_AV
Definition: SharedDefines.h:3453
@ BATTLEGROUND_BE
Definition: SharedDefines.h:3457
@ BATTLEGROUND_RV
Definition: SharedDefines.h:3463
@ BATTLEGROUND_NA
Definition: SharedDefines.h:3456
@ BATTLEGROUND_DS
Definition: SharedDefines.h:3462
@ BATTLEGROUND_SA
Definition: SharedDefines.h:3461
@ BATTLEGROUND_AB
Definition: SharedDefines.h:3455
@ BATTLEGROUND_RL
Definition: SharedDefines.h:3460
@ SMSG_INIT_WORLD_STATES
Definition: Opcodes.h:736
Definition: CreatureAI.h:70
virtual void FillInitialWorldStates(WorldPacket &)=0
uint32 GetTypeId()
Definition: Battlefield.h:242
virtual void FillInitialWorldStates(WorldPacket &)
Definition: Battleground.h:435
BattlegroundTypeId GetBgTypeID(bool GetRandom=false) const
Definition: Battleground.h:319
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1192
void SendBGWeekendWorldStates()
Definition: Player.cpp:8703
void SendBattlefieldWorldStates()
Definition: Player.cpp:8718
static std::unordered_map< int, bgZoneRef > bgZoneIdToFillWorldStates
Definition: Player.h:2564
Definition: InstanceScript.h:140
virtual void FillInitialWorldStates(WorldPacket &)
Definition: InstanceScript.h:252
Definition: OutdoorPvP.h:197
virtual void FillInitialWorldStates(WorldPacket &)
Definition: OutdoorPvP.h:214
uint32 GetTypeId()
Definition: OutdoorPvP.h:249

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 
)
11632{
11633 // pussywizard:
11634 InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(GetGUID(), mapid, difficulty);
11635 if (bind && bind->extended)
11636 {
11637 if (!onEnterMap) // extended id player shouldn't be warned about lock expiration
11638 return;
11639 time += (bind->save->GetExtendedResetTime() - bind->save->GetResetTime()); // add lockout period to the time left
11640 }
11641
11642 // type of warning, based on the time remaining until reset
11643 uint32 type;
11644 if (time > 3600)
11645 type = RAID_INSTANCE_WELCOME;
11646 else if (time > 900)
11648 else if (time > 300)
11650 else
11652
11653 WorldPacket data(SMSG_RAID_INSTANCE_MESSAGE, 4 + 4 + 4 + 4);
11654 data << uint32(type);
11655 data << uint32(mapid);
11656 data << uint32(difficulty); // difficulty
11657 data << uint32(time);
11658 if (type == RAID_INSTANCE_WELCOME)
11659 {
11660 data << uint8(bind && bind->perm); // is locked
11661 data << uint8(bind && bind->extended); // is extended, ignored if prev field is 0
11662 }
11663 GetSession()->SendPacket(&data);
11664}
@ RAID_INSTANCE_WARNING_MIN
Definition: Player.h:797
@ RAID_INSTANCE_WARNING_MIN_SOON
Definition: Player.h:798
@ RAID_INSTANCE_WARNING_HOURS
Definition: Player.h:796
@ RAID_INSTANCE_WELCOME
Definition: Player.h:799
@ 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 ( )
4769{
4770 for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end(); ++itr)
4771 {
4772 (*itr)->SendTimeUpdate(this);
4773 }
4774}

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 
)
2979{
2980 if (learn)
2981 {
2983 data << uint32(spellId);
2984 data << uint16(0);
2985 GetSession()->SendPacket(&data);
2986 }
2987 else
2988 {
2990 data << uint32(spellId);
2991 GetSession()->SendPacket(&data);
2992 }
2993}
@ 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 
)
2323{
2324 WorldPacket data(SMSG_LOG_XPGAIN, 22); // guess size?
2325 data << (victim ? victim->GetGUID() : ObjectGuid::Empty); // guid
2326 data << uint32(GivenXP + BonusXP); // given experience
2327 data << uint8(victim ? 0 : 1); // 00-kill_xp type, 01-non_kill_xp type
2328
2329 if (victim)
2330 {
2331 data << uint32(GivenXP); // experience without bonus
2332
2333 // should use group_rate here but can't figure out how
2334 data << float(1); // 1 - none 0 - 100% group bonus output
2335 }
2336
2337 data << uint8(recruitAFriend ? 1 : 0); // does the GivenXP include a RaF bonus?
2338 GetSession()->SendPacket(&data);
2339}
@ 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 
)
7658{
7659 if (ObjectGuid lguid = GetLootGUID())
7660 m_session->DoLootRelease(lguid);
7661
7662 Loot* loot = 0;
7663 PermissionTypes permission = ALL_PERMISSION;
7664
7665 LOG_DEBUG("loot", "Player::SendLoot");
7666
7667 // remove FD and invisibility at all loots
7668 constexpr std::array<AuraType, 2> toRemove = {SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_FEIGN_DEATH};
7669 for (const auto& aura : toRemove)
7670 {
7671 RemoveAurasByType(aura);
7672 }
7673 // remove stealth only if looting a corpse
7674 if (loot_type == LOOT_CORPSE && !guid.IsItem())
7675 {
7677 }
7678
7679 if (guid.IsGameObject())
7680 {
7681 LOG_DEBUG("loot", "guid.IsGameObject");
7682 GameObject* go = GetMap()->GetGameObject(guid);
7683
7684 // not check distance for GO in case owned GO (fishing bobber case, for example)
7685 // And permit out of range GO with no owner in case fishing hole
7686 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()))
7687 {
7689 SendLootRelease(guid);
7690 return;
7691 }
7692
7693 loot = &go->loot;
7694
7695 // Xinef: loot was generated and respawntime has passed since then, allow to recreate loot
7696 // Xinef: to avoid bugs, this rule covers spawned gameobjects only
7697 if (go->isSpawnedByDefault() && go->getLootState() == GO_ACTIVATED && !go->loot.isLooted() && go->GetLootGenerationTime() + go->GetRespawnDelay() < GameTime::GetGameTime().count())
7699
7700 if (go->getLootState() == GO_READY)
7701 {
7702 uint32 lootid = go->GetGOInfo()->GetLootId();
7703
7704 //TODO: fix this big hack
7706 if (Battleground* bg = GetBattleground())
7707 if (bg->GetBgTypeID(true) == BATTLEGROUND_AV)
7708 if (!bg->ToBattlegroundAV()->PlayerCanDoMineQuest(go->GetEntry(), GetTeamId()))
7709 {
7711 SendLootRelease(guid);
7712 return;
7713 }
7714
7715 if (lootid)
7716 {
7717 loot->clear();
7718
7719 Group* group = GetGroup();
7720 bool groupRules = (group && go->GetGOInfo()->type == GAMEOBJECT_TYPE_CHEST && go->GetGOInfo()->chest.groupLootRules);
7721
7722 // check current RR player and get next if necessary
7723 if (groupRules)
7724 group->UpdateLooterGuid(go, true);
7725
7726 loot->FillLoot(lootid, LootTemplates_Gameobject, this, !groupRules, false, go->GetLootMode(), go);
7728
7729 // get next RR player (for next loot)
7730 if (groupRules && !go->loot.empty())
7731 group->UpdateLooterGuid(go);
7732 }
7733 if (GameObjectTemplateAddon const* addon = go->GetTemplateAddon())
7734 loot->generateMoneyLoot(addon->mingold, addon->maxgold);
7735
7736 if (loot_type == LOOT_FISHING)
7737 go->GetFishLoot(loot, this);
7738 else if (loot_type == LOOT_FISHING_JUNK)
7739 go->GetFishLootJunk(loot, this);
7740
7742 {
7743 if (Group* group = GetGroup())
7744 {
7745 switch (group->GetLootMethod())
7746 {
7747 case GROUP_LOOT:
7748 // GroupLoot: rolls items over threshold. Items with quality < threshold, round robin
7749 group->GroupLoot(loot, go);
7750 break;
7751 case NEED_BEFORE_GREED:
7752 group->NeedBeforeGreed(loot, go);
7753 break;
7754 case MASTER_LOOT:
7755 group->MasterLoot(loot, go);
7756 break;
7757 default:
7758 break;
7759 }
7760 }
7761 }
7762
7763 go->SetLootState(GO_ACTIVATED, this);
7764 }
7765
7766 if (go->getLootState() == GO_ACTIVATED)
7767 {
7768 if (Group* group = GetGroup())
7769 {
7770 switch (group->GetLootMethod())
7771 {
7772 case MASTER_LOOT:
7774 break;
7775 case FREE_FOR_ALL:
7776 permission = ALL_PERMISSION;
7777 break;
7778 case ROUND_ROBIN:
7779 permission = ROUND_ROBIN_PERMISSION;
7780 break;
7781 default:
7782 permission = GROUP_PERMISSION;
7783 break;
7784 }
7785 }
7786 else
7787 permission = ALL_PERMISSION;
7788 }
7789 }
7790 else if (guid.IsItem())
7791 {
7792 Item* item = GetItemByGuid(guid);
7793
7794 if (!item)
7795 {
7796 SendLootRelease(guid);
7797 return;
7798 }
7799
7800 permission = OWNER_PERMISSION;
7801
7802 loot = &item->loot;
7803
7804 // Xinef: Store container id
7805 loot->containerGUID = item->GetGUID();
7806
7807 if (!item->m_lootGenerated && !sLootItemStorage->LoadStoredLoot(item, this))
7808 {
7809 item->m_lootGenerated = true;
7810 loot->clear();
7811
7812 switch (loot_type)
7813 {
7814 case LOOT_DISENCHANTING:
7815 loot->FillLoot(item->GetTemplate()->DisenchantID, LootTemplates_Disenchant, this, true);
7816 break;
7817 case LOOT_PROSPECTING:
7818 loot->FillLoot(item->GetEntry(), LootTemplates_Prospecting, this, true);
7819 break;
7820 case LOOT_MILLING:
7821 loot->FillLoot(item->GetEntry(), LootTemplates_Milling, this, true);
7822 break;
7823 default:
7825 loot->FillLoot(item->GetEntry(), LootTemplates_Item, this, true, loot->gold != 0);
7826
7827 // Xinef: Add to storage
7828 if (loot->gold > 0 || loot->unlootedCount > 0)
7829 sLootItemStorage->AddNewStoredLoot(loot, this);
7830
7831 break;
7832 }
7833 }
7834 }
7835 else if (guid.IsCorpse()) // remove insignia
7836 {
7837 Corpse* bones = ObjectAccessor::GetCorpse(*this, guid);
7838
7839 if (!bones || !(loot_type == LOOT_CORPSE || loot_type == LOOT_INSIGNIA) || bones->GetType() != CORPSE_BONES || !bones->HasFlag(CORPSE_FIELD_DYNAMIC_FLAGS, CORPSE_DYNFLAG_LOOTABLE))
7840 {
7841 SendLootRelease(guid);
7842 return;
7843 }
7844
7845 loot = &bones->loot;
7846
7847 if (loot->loot_type == LOOT_NONE)
7848 {
7849 uint32 pLevel = bones->loot.gold;
7850 bones->loot.clear();
7851
7852 loot->FillLoot(GetTeamId(), LootTemplates_Player, this, true);
7853
7854 // It may need a better formula
7855 // Now it works like this: lvl10: ~6copper, lvl70: ~9silver
7856 bones->loot.gold = uint32(urand(50, 150) * 0.016f * pow(float(pLevel) / 5.76f, 2.5f) * sWorld->getRate(RATE_DROP_MONEY));
7857 }
7858
7859 if (bones->lootRecipient != this)
7860 permission = NONE_PERMISSION;
7861 else
7862 permission = OWNER_PERMISSION;
7863 }
7864 else
7865 {
7866 Creature* creature = GetMap()->GetCreature(guid);
7867
7868 // must be in range and creature must be alive for pickpocket and must be dead for another loot
7869 if (!creature || creature->IsAlive() != (loot_type == LOOT_PICKPOCKETING) || !creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
7870 {
7871 SendLootRelease(guid);
7872 return;
7873 }
7874
7875 if (loot_type == LOOT_PICKPOCKETING && IsFriendlyTo(creature))
7876 {
7877 SendLootRelease(guid);
7878 return;
7879 }
7880
7881 loot = &creature->loot;
7882
7883 if (loot_type == LOOT_PICKPOCKETING)
7884 {
7885 if (!loot || loot->loot_type != LOOT_PICKPOCKETING)
7886 {
7887 if (creature->CanGeneratePickPocketLoot())
7888 {
7889 creature->SetPickPocketLootTime();
7890 loot->clear();
7891
7892 if (uint32 lootid = creature->GetCreatureTemplate()->pickpocketLootId)
7893 loot->FillLoot(lootid, LootTemplates_Pickpocketing, this, true);
7894
7895 // Generate extra money for pick pocket loot
7896 const uint32 a = urand(0, creature->GetLevel() / 2);
7897 const uint32 b = urand(0, GetLevel() / 2);
7898 loot->gold = uint32(10 * (a + b) * sWorld->getRate(RATE_DROP_MONEY));
7899 permission = OWNER_PERMISSION;
7900 }
7901 else
7902 {
7903 permission = NONE_PERMISSION;
7905 return;
7906 }
7907 }
7908 }
7909 else
7910 {
7911 // Xinef: Exploit fix
7912 if (!creature->HasDynamicFlag(UNIT_DYNFLAG_LOOTABLE))
7913 {
7915 return;
7916 }
7917
7918 // the player whose group may loot the corpse
7919 Player* recipient = creature->GetLootRecipient();
7920 Group* recipientGroup = creature->GetLootRecipientGroup();
7921 if (!recipient && !recipientGroup)
7922 return;
7923
7924 if (loot->loot_type == LOOT_NONE)
7925 {
7926 // for creature, loot is filled when creature is killed.
7927 if (recipientGroup)
7928 {
7929 switch (recipientGroup->GetLootMethod())
7930 {
7931 case GROUP_LOOT:
7932 // GroupLoot: rolls items over threshold. Items with quality < threshold, round robin
7933 recipientGroup->GroupLoot(loot, creature);
7934 break;
7935 case NEED_BEFORE_GREED:
7936 recipientGroup->NeedBeforeGreed(loot, creature);
7937 break;
7938 case MASTER_LOOT:
7939 recipientGroup->MasterLoot(loot, creature);
7940 break;
7941 default:
7942 break;
7943 }
7944 }
7945 }
7946
7947 // if loot is already skinning loot then don't do anything else
7948 if (loot->loot_type == LOOT_SKINNING)
7949 {
7950 loot_type = LOOT_SKINNING;
7951 permission = creature->GetLootRecipientGUID() == GetGUID() ? OWNER_PERMISSION : NONE_PERMISSION;
7952 }
7953 else if (loot_type == LOOT_SKINNING)
7954 {
7955 loot->clear();
7956 loot->FillLoot(creature->GetCreatureTemplate()->SkinLootId, LootTemplates_Skinning, this, true);
7957 permission = OWNER_PERMISSION;
7958
7959 //Inform instance if creature is skinned.
7960 if (InstanceScript* mapInstance = creature->GetInstanceScript())
7961 {
7962 mapInstance->CreatureLooted(creature, LOOT_SKINNING);
7963 }
7964
7965 // Xinef: Set new loot recipient
7966 creature->SetLootRecipient(this, false);
7967 }
7968 // set group rights only for loot_type != LOOT_SKINNING
7969 else
7970 {
7971 if (recipientGroup)
7972 {
7973 if (GetGroup() == recipientGroup)
7974 {
7975 switch (recipientGroup->GetLootMethod())
7976 {
7977 case MASTER_LOOT:
7978 permission = recipientGroup->GetMasterLooterGuid() == GetGUID() ? MASTER_PERMISSION : RESTRICTED_PERMISSION;
7979 break;
7980 case FREE_FOR_ALL:
7981 permission = ALL_PERMISSION;
7982 break;
7983 case ROUND_ROBIN:
7984 permission = ROUND_ROBIN_PERMISSION;
7985 break;
7986 default:
7987 permission = GROUP_PERMISSION;
7988 break;
7989 }
7990 }
7991 else
7992 permission = NONE_PERMISSION;
7993 }
7994 else if (recipient == this)
7995 permission = OWNER_PERMISSION;
7996 else
7997 permission = NONE_PERMISSION;
7998 }
7999 }
8000 }
8001
8002 // LOOT_INSIGNIA and LOOT_FISHINGHOLE unsupported by client
8003 switch (loot_type)
8004 {
8005 case LOOT_INSIGNIA:
8006 loot_type = LOOT_SKINNING;
8007 break;
8008 case LOOT_FISHINGHOLE:
8009 loot_type = LOOT_FISHING;
8010 break;
8011 case LOOT_FISHING_JUNK:
8012 loot_type = LOOT_FISHING;
8013 break;
8014 default:
8015 break;
8016 }
8017
8018 // need know merged fishing/corpse loot type for achievements
8019 loot->loot_type = loot_type;
8020
8021 if (permission != NONE_PERMISSION)
8022 {
8023 SetLootGUID(guid);
8024
8025 WorldPacket data(SMSG_LOOT_RESPONSE, (9 + 50)); // we guess size
8026 data << guid;
8027 data << uint8(loot_type);
8028 data << LootView(*loot, this, permission);
8029
8030 SendDirectMessage(&data);
8031
8032 // add 'this' player as one of the players that are looting 'loot'
8033 loot->AddLooter(GetGUID());
8034
8035 if (loot_type == LOOT_CORPSE && !guid.IsItem())
8037 }
8038 else
8040}
@ BG_AV_OBJECTID_MINE_N
Definition: BattlegroundAV.h:160
@ BG_AV_OBJECTID_MINE_S
Definition: BattlegroundAV.h:161
@ CORPSE_BONES
Definition: Corpse.h:28
@ GO_ACTIVATED
Definition: GameObject.h:114
@ GO_READY
Definition: GameObject.h:113
@ GAMEOBJECT_BYTES_1
Definition: UpdateFields.h:404
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
@ SPELL_AURA_MOD_INVISIBILITY
Definition: SpellAuraDefines.h:81
@ SPELL_AURA_FEIGN_DEATH
Definition: SpellAuraDefines.h:129
@ SPELL_AURA_MOD_STEALTH
Definition: SpellAuraDefines.h:79
@ RATE_DROP_MONEY
Definition: IWorld.h:456
@ GAMEOBJECT_TYPE_CHEST
Definition: SharedDefines.h:1535
@ UNIT_DYNFLAG_LOOTABLE
Definition: SharedDefines.h:3093
@ SMSG_LOOT_RESPONSE
Definition: Opcodes.h:382
Corpse * GetCorpse(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:184
Loot loot
Definition: Creature.h:218
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition: Creature.cpp:1292
ObjectGuid GetLootRecipientGUID() const
Definition: Creature.h:219
void SetPickPocketLootTime()
Definition: Creature.cpp:3648
Player * GetLootRecipient() const
Definition: Creature.cpp:1278
bool CanGeneratePickPocketLoot() const
Definition: Creature.cpp:3653
Group * GetLootRecipientGroup() const
Definition: Creature.cpp:1285
uint32 SkinLootId
Definition: CreatureData.h:219
uint32 pickpocketLootId
Definition: CreatureData.h:218
uint32 GetRespawnDelay() const
Definition: GameObject.h:199
bool IsWithinDistInMap(Player const *player) const
Definition: GameObject.cpp:3048
Loot loot
Definition: GameObject.h:249
LootState getLootState() const
Definition: GameObject.h:226
bool isSpawnedByDefault() const
Definition: GameObject.h:197
time_t GetRespawnTime() const
Definition: GameObject.h:185
uint32 GetLootGenerationTime() const
Definition: GameObject.h:260
void SetLootState(LootState s, Unit *unit=nullptr)
Definition: GameObject.cpp:2432
void GetFishLootJunk(Loot *loot, Player *loot_owner)
Definition: GameObject.cpp:1019
ObjectGuid GetOwnerGUID() const
Definition: GameObject.h:175
void GetFishLoot(Loot *loot, Player *loot_owner)
Definition: GameObject.cpp:999
GameObjectTemplateAddon const * GetTemplateAddon() const
Definition: GameObject.cpp:909
void SetLootGenerationTime()
Definition: GameObject.cpp:2977
uint16 GetLootMode() const
Definition: GameObject.h:230
uint32 type
Definition: GameObjectData.h:34
struct GameObjectTemplate::@215::@220 chest
uint32 groupLootRules
Definition: GameObjectData.h:99
uint32 GetLootId() const
Definition: GameObjectData.h:540
Definition: GameObjectData.h:665
Loot loot
Definition: Item.h:311
uint32 DisenchantID
Definition: ItemTemplate.h:699
uint32 MinMoneyLoot
Definition: ItemTemplate.h:701
uint32 MaxMoneyLoot
Definition: ItemTemplate.h:702
bool HasDynamicFlag(uint32 flag) const
Definition: Object.h:116
void ForceValuesUpdateAtIndex(uint32)
Definition: Object.cpp:2042
bool IsCorpse() const
Definition: ObjectGuid.h:175
bool IsItem() const
Definition: ObjectGuid.h:172
bool IsGameObject() const
Definition: ObjectGuid.h:173
void SendLootRelease(ObjectGuid guid)
Definition: Player.cpp:7650
void SetLootGUID(ObjectGuid guid)
Definition: Player.h:1944
void SendLootError(ObjectGuid guid, LootError error)
Definition: Player.cpp:8042
bool IsFriendlyTo(Unit const *unit) const
Definition: Unit.cpp:10214
void NeedBeforeGreed(Loot *loot, WorldObject *pLootedObject)
Definition: Group.cpp:1137
ObjectGuid GetMasterLooterGuid() const
Definition: Group.cpp:2265
void GroupLoot(Loot *loot, WorldObject *pLootedObject)
Definition: Group.cpp:987
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition: Group.cpp:1836
void MasterLoot(Loot *loot, WorldObject *pLootedObject)
Definition: Group.cpp:1279
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:815
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, 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)
7651{
7653 data << guid << uint8(1);
7654 SendDirectMessage(&data);
7655}
@ 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 
)
2813{
2814 WorldPacket data(SMSG_SEND_MAIL_RESULT, (4 + 4 + 4 + (mailError == MAIL_ERR_EQUIP_ERROR ? 4 : (mailAction == MAIL_ITEM_TAKEN ? 4 + 4 : 0))));
2815 data << (uint32) mailId;
2816 data << (uint32) mailAction;
2817 data << (uint32) mailError;
2818 if (mailError == MAIL_ERR_EQUIP_ERROR)
2819 data << (uint32) equipError;
2820 else if (mailAction == MAIL_ITEM_TAKEN)
2821 {
2822 data << (uint32) item_guid; // item guid low?
2823 data << (uint32) item_count; // item count?
2824 }
2825 GetSession()->SendPacket(&data);
2826}
@ MAIL_ITEM_TAKEN
Definition: SharedDefines.h:3474
@ MAIL_ERR_EQUIP_ERROR
Definition: SharedDefines.h:3483
@ 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
inlineoverridevirtual

Reimplemented from WorldObject.

1979{ SendMessageToSetInRange(data, GetVisibilityRange(), skipped_rcvr != this, true, skipped_rcvr); } // pussywizard!

References WorldObject::GetVisibilityRange(), and SendMessageToSetInRange().

◆ SendMessageToSetInRange()

void Player::SendMessageToSetInRange ( WorldPacket const *  data,
float  dist,
bool  self,
bool  includeMargin = false,
Player const *  skipped_rcvr = nullptr 
) const
overridevirtual

Reimplemented from WorldObject.

5574{
5575 if (self)
5576 GetSession()->SendPacket(data);
5577
5578 dist += GetObjectSize();
5579 if (includeMargin)
5580 dist += VISIBILITY_COMPENSATION; // pussywizard: to ensure everyone receives all important packets
5581 Acore::MessageDistDeliverer notifier(this, data, dist, false, skipped_rcvr);
5582 Cell::VisitWorldObjects(this, notifier, dist);
5583}
#define VISIBILITY_COMPENSATION
Definition: ObjectDefines.h:26
float GetObjectSize() const
Definition: Object.cpp:2734
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:193
Definition: GridNotifiers.h:98

References WorldObject::GetObjectSize(), GetSession(), WorldSession::SendPacket(), VISIBILITY_COMPENSATION, and Cell::VisitWorldObjects().

Referenced by Say(), AchievementMgr::SendAchievementEarned(), SendMessageToSet(), TextEmote(), and Yell().

◆ SendMessageToSetInRange_OwnTeam()

void Player::SendMessageToSetInRange_OwnTeam ( WorldPacket const *  data,
float  dist,
bool  self 
) const
5586{
5587 if (self)
5588 GetSession()->SendPacket(data);
5589
5590 Acore::MessageDistDeliverer notifier(this, data, dist, true);
5591 Cell::VisitWorldObjects(this, notifier, dist);
5592}

References GetSession(), WorldSession::SendPacket(), and Cell::VisitWorldObjects().

Referenced by TextEmote().

◆ 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:118

References DISABLED_MIRROR_TIMER, SendDirectMessage(), and StopMirrorTimer().

Referenced by HandleDrowning().

◆ SendMovieStart()

void Player::SendMovieStart ( uint32  MovieId)
5611{
5613 data << uint32(MovieId);
5614 SendDirectMessage(&data);
5615}
@ 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 
)
4777{
4778 if (!item) // prevent crash
4779 return;
4780
4781 // last check 2.0.10
4782 WorldPacket data(SMSG_ITEM_PUSH_RESULT, (8 + 4 + 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4));
4783 data << GetGUID(); // player GUID
4784 data << uint32(received); // 0=looted, 1=from npc
4785 data << uint32(created); // 0=received, 1=created
4786 data << uint32(sendChatMessage); // bool print message to chat
4787 data << uint8(item->GetBagSlot()); // bagslot
4788 // item slot, but when added to stack: 0xFFFFFFFF
4789 data << uint32((item->GetCount() == count) ? item->GetSlot() : -1);
4790 data << uint32(item->GetEntry()); // item id
4791 data << uint32(item->GetItemSuffixFactor()); // SuffixFactor
4792 data << int32(item->GetItemRandomPropertyId()); // random item property id
4793 data << uint32(count); // count of items
4794 data << uint32(GetItemCount(item->GetEntry())); // count of items in inventory
4795
4796 if (broadcast && GetGroup())
4797 GetGroup()->BroadcastPacket(&data, true);
4798 else
4799 GetSession()->SendPacket(&data);
4800}
@ 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:1725

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(), npc_tyrande_whisperwind::OnGossipSelect(), RefundItem(), RemovePet(), RewardQuest(), npc_oculus_drakegiver::StoreEssence(), and StoreLootItem().

◆ SendNewMail()

void Player::SendNewMail ( )
2829{
2830 // deliver undelivered mail
2832 data << (uint32) 0;
2833 GetSession()->SendPacket(&data);
2834}
@ 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)
8058{
8060 data << uint8(lootSlot);
8061 GetSession()->SendPacket(&data);
8062}
@ 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 ( )
8052{
8054 GetSession()->SendPacket(&data);
8055}
@ 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)
211{
212 if (!source)
213 return;
214
215 if (source->GetTypeId() == TYPEID_UNIT)
216 {
217 // in case no gossip flag and quest menu not empty, open quest menu (client expect gossip menu with this flag)
219 {
220 SendPreparedQuest(source->GetGUID());
221 return;
222 }
223 }
224 else if (source->GetTypeId() == TYPEID_GAMEOBJECT)
225 {
226 // probably need to find a better way here
228 {
229 SendPreparedQuest(source->GetGUID());
230 return;
231 }
232 }
233
234 // in case non empty gossip menu (that not included quests list size) show it
235 // (quest entries from quest menu will be included in list)
236
237 uint32 textId = GetGossipTextId(source);
238
240 textId = GetGossipTextId(menuId, source);
241
242 PlayerTalkClass->SendGossipMenu(textId, source->GetGUID());
243}
@ UNIT_NPC_FLAG_GOSSIP
Definition: Unit.h:516
bool Empty() const
Definition: GossipDef.h:241
void SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
Definition: GossipDef.cpp:192

References QuestMenu::Empty(), PlayerMenu::GetGossipMenu(), GetGossipTextId(), Object::GetGUID(), GossipMenu::GetMenuId(), PlayerMenu::GetQuestMenu(), Object::GetTypeId(), Unit::HasNpcFlag(), PlayerTalkClass, PlayerMenu::SendGossipMenu(), SendPreparedQuest(), Object::ToCreature(), TYPEID_GAMEOBJECT, TYPEID_UNIT, 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)
115{
116 QuestMenu& questMenu = PlayerTalkClass->GetQuestMenu();
117 if (questMenu.Empty())
118 return;
119
120 // single element case
121 if (questMenu.GetMenuItemCount() == 1)
122 {
123 QuestMenuItem const& qmi0 = questMenu.GetItem(0);
124 uint32 questId = qmi0.QuestId;
125
126 // Auto open -- maybe also should verify there is no greeting
127 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
128 {
129 if (qmi0.QuestIcon == 4)
130 PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, CanRewardQuest(quest, false), true);
131 // Send completable on repeatable and autoCompletable quest if player don't have quest
133 else
134 {
136 if (!object || (!object->hasQuest(questId) && !object->hasInvolvedQuest(questId)))
137 {
139 return;
140 }
141
142 if (quest->IsAutoAccept() && CanAddQuest(quest, true) && CanTakeQuest(quest, true))
143 AddQuestAndCheckCompletion(quest, object);
144
145 if (quest->IsAutoComplete() || !quest->GetQuestMethod())
147 else
149 }
150 }
151 }
152 // multiple entries
153 else
154 {
155 QEmote qe;
156 qe._Delay = 0;
157 qe._Emote = 0;
158 std::string title = "";
159
160 // need pet case for some quests
162 if (creature)
163 {
164 uint32 textid = GetGossipTextId(creature);
165 GossipText const* gossiptext = sObjectMgr->GetGossipText(textid);
166 if (!gossiptext)
167 {
168 qe._Delay = 0; //TEXTEMOTE_MESSAGE; //zyg: player emote
169 qe._Emote = 0; //TEXTEMOTE_HELLO; //zyg: NPC emote
170 title = "";
171 }
172 else
173 {
174 qe = gossiptext->Options[0].Emotes[0];
175
176 if (!gossiptext->Options[0].Text_0.empty())
177 {
178 title = gossiptext->Options[0].Text_0;
179
180 int loc_idx = GetSession()->GetSessionDbLocaleIndex();
181 if (loc_idx >= 0)
182 if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textid))
183 ObjectMgr::GetLocaleString(npcTextLocale->Text_0[0], loc_idx, title);
184 }
185 else
186 {
187 title = gossiptext->Options[0].Text_1;
188
189 int loc_idx = GetSession()->GetSessionDbLocaleIndex();
190 if (loc_idx >= 0)
191 if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textid))
192 ObjectMgr::GetLocaleString(npcTextLocale->Text_1[0], loc_idx, title);
193 }
194 }
195 }
196
198 }
199}
@ TYPEMASK_ITEM
Definition: ObjectGuid.h:49
@ TYPEMASK_GAMEOBJECT
Definition: ObjectGuid.h:53
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:316
void SendQuestGiverQuestDetails(Quest const *quest, ObjectGuid npcGUID, bool activateAccept) const
Definition: GossipDef.cpp:385
void SendQuestGiverRequestItems(Quest const *quest, ObjectGuid npcGUID, bool canComplete, bool closeOnCancel) const
Definition: GossipDef.cpp:751
Definition: Object.h:97
virtual bool hasQuest(uint32) const
Definition: Object.h:183
virtual bool hasInvolvedQuest(uint32) const
Definition: Object.h:184
bool CanAddQuest(Quest const *quest, bool msg)
Definition: PlayerQuest.cpp:263
void AddQuestAndCheckCompletion(Quest const *quest, Object *questGiver)
Definition: PlayerQuest.cpp:419
bool CanCompleteRepeatableQuest(Quest const *quest)
Definition: PlayerQuest.cpp:364
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 
)
10000{
10001 WorldPacket data(SMSG_SET_PROFICIENCY, 1 + 4);
10002 data << uint8(itemClass) << uint32(itemSubclassMask);
10003 GetSession()->SendPacket(&data);
10004}
@ 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
2420{
2421 if (player)
2422 {
2423 WorldPacket data(MSG_QUEST_PUSH_RESULT, (8 + 1));
2424 data << player->GetGUID();
2425 data << uint8(msg); // valid values: 0-8
2426 GetSession()->SendPacket(&data);
2427 LOG_DEBUG("network", "WORLD: Sent MSG_QUEST_PUSH_RESULT");
2428 }
2429}
@ 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)
2331{
2332 if (quest_id)
2333 {
2335 data << uint32(quest_id);
2336 GetSession()->SendPacket(&data);
2337 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_COMPLETE quest = {}", quest_id);
2338 }
2339}
@ 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 
)
2398{
2399 if (pReceiver)
2400 {
2401 //load locale from db
2402 std::string strTitle = quest->GetTitle();
2403
2404 int loc_idx = pReceiver->GetSession()->GetSessionDbLocaleIndex();
2405 if (loc_idx >= 0)
2406 if (const QuestLocale* pLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
2407 ObjectMgr::GetLocaleString(pLocale->Title, loc_idx, strTitle);
2408
2409 WorldPacket data(SMSG_QUEST_CONFIRM_ACCEPT, (4 + quest->GetTitle().size() + 8));
2410 data << uint32(quest->GetQuestId());
2411 data << quest->GetTitle();
2412 data << GetGUID();
2413 pReceiver->GetSession()->SendPacket(&data);
2414
2415 LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_CONFIRM_ACCEPT");
2416 }
2417}
@ 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 
)
2367{
2368 if (questId)
2369 {
2371 data << uint32(questId);
2372 data << uint32(reason); // failed reason (valid reasons: 4, 16, 50, 17, 74, other values show default message)
2373 GetSession()->SendPacket(&data);
2374 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_FAILED");
2375 }
2376}
@ 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
7573{
7574 uint32 count = 0;
7575
7577 data << uint32(count); // placeholder
7578
7579 for (GuidUnorderedSet::const_iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
7580 {
7581 uint32 questStatus = DIALOG_STATUS_NONE;
7582
7583 if ((*itr).IsAnyTypeCreature())
7584 {
7585 // need also pet quests case support
7586 Creature* questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, *itr);
7587 if (!questgiver || questgiver->IsHostileTo(this))
7588 continue;
7589 if (!questgiver->HasNpcFlag(UNIT_NPC_FLAG_QUESTGIVER))
7590 continue;
7591
7592 questStatus = GetQuestDialogStatus(questgiver);
7593
7594 data << questgiver->GetGUID();
7595 data << uint8(questStatus);
7596 ++count;
7597 }
7598 else if ((*itr).IsGameObject())
7599 {
7600 GameObject* questgiver = GetMap()->GetGameObject(*itr);
7601 if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER)
7602 continue;
7603
7604 questStatus = GetQuestDialogStatus(questgiver);
7605
7606 data << questgiver->GetGUID();
7607 data << uint8(questStatus);
7608 ++count;
7609 }
7610 }
7611
7612 data.put<uint32>(0, count); // write real count
7613 GetSession()->SendPacket(&data);
7614}
@ SMSG_QUESTGIVER_STATUS_MULTIPLE
Definition: Opcodes.h:1078
QuestGiverStatus GetQuestDialogStatus(Object *questGiver)
Definition: PlayerQuest.cpp:1579

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 
)
2342{
2343 uint32 questid = quest->GetQuestId();
2344 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_COMPLETE quest = {}", questid);
2345 sGameEventMgr->HandleQuestComplete(questid);
2346 WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4 + 4 + 4 + 4 + 4));
2347 data << uint32(questid);
2348
2349 if (GetLevel() < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2350 {
2351 data << uint32(XP);
2352 data << uint32(quest->GetRewOrReqMoney(GetLevel()));
2353 }
2354 else
2355 {
2356 data << uint32(0);
2357 data << uint32(quest->GetRewOrReqMoney(GetLevel()) + quest->GetRewMoneyMaxLevel());
2358 }
2359
2360 data << uint32(10 * quest->CalculateHonorGain(GetQuestLevel(quest)));
2361 data << uint32(quest->GetBonusTalents()); // bonus talents
2362 data << uint32(quest->GetRewArenaPoints());
2363 GetSession()->SendPacket(&data);
2364}
@ SMSG_QUESTGIVER_QUEST_COMPLETE
Definition: Opcodes.h:431

References Quest::CalculateHonorGain(), CONFIG_MAX_PLAYER_LEVEL, Quest::GetBonusTalents(), Unit::GetLevel(), Quest::GetQuestId(), GetQuestLevel(), Quest::GetRewArenaPoints(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), GetSession(), LOG_DEBUG, WorldSession::SendPacket(), sGameEventMgr, SMSG_QUESTGIVER_QUEST_COMPLETE, and sWorld.

Referenced by RewardQuest().

◆ SendQuestTimerFailed()

void Player::SendQuestTimerFailed ( uint32  quest_id)
2379{
2380 if (quest_id)
2381 {
2383 data << uint32(quest_id);
2384 GetSession()->SendPacket(&data);
2385 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_FAILEDTIMER");
2386 }
2387}
@ 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)
1511{
1512 uint32 zone = 0, area = 0;
1513 // xinef: fixup
1514 uint32 oldSpellId = 0;
1515
1516 SpellAreaForQuestMapBounds saBounds = sSpellMgr->GetSpellAreaForQuestMapBounds(questId);
1517 if (saBounds.first != saBounds.second)
1518 {
1519 GetZoneAndAreaId(zone, area);
1520
1521 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1522 {
1523 // xinef: spell was already casted, skip different areas with same spell
1524 if (itr->second->spellId == oldSpellId)
1525 continue;
1526 if (itr->second->autocast && itr->second->IsFitToRequirements(this, zone, area))
1527 if (!HasAura(itr->second->spellId))
1528 {
1529 CastSpell(this, itr->second->spellId, true);
1530 oldSpellId = itr->second->spellId;
1531 }
1532 }
1533 }
1534
1535 saBounds = sSpellMgr->GetSpellAreaForQuestEndMapBounds(questId);
1536
1537 // xinef: fixup
1538 uint32 skipSpellId = 0;
1539 oldSpellId = 0;
1540 if (saBounds.first != saBounds.second)
1541 {
1542 if (!zone || !area)
1543 GetZoneAndAreaId(zone, area);
1544
1545 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1546 {
1547 // xinef: skip spell for which condition is already fulfilled
1548 if (itr->second->spellId == skipSpellId)
1549 continue;
1550 skipSpellId = 0;
1551
1552 // xinef: spells are sorted, if no condition is fulfilled remove aura
1553 if (oldSpellId && oldSpellId != itr->second->spellId)
1554 {
1555 RemoveAurasDueToSpell(oldSpellId);
1556 oldSpellId = 0;
1557 }
1558
1559 if (!itr->second->IsFitToRequirements(this, zone, area))
1560 {
1561 //RemoveAurasDueToSpell(itr->second->spellId);
1562 oldSpellId = itr->second->spellId;
1563 }
1564 else
1565 {
1566 skipSpellId = itr->second->spellId;
1567 oldSpellId = 0;
1568 }
1569 }
1570
1571 // xinef: check if we have something to remove yet
1572 if (oldSpellId)
1573 RemoveAurasDueToSpell(oldSpellId);
1574 }
1575
1577}
std::pair< SpellAreaForQuestMap::const_iterator, SpellAreaForQuestMap::const_iterator > SpellAreaForQuestMapBounds
Definition: SpellMgr.h:541

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 
)
2441{
2442 ASSERT(old_count + add_count < 65536 && "mob/GO count store in 16 bits 2^16 = 65536 (0..65536)");
2443
2444 int32 entry = quest->RequiredNpcOrGo[ creatureOrGO_idx ];
2445 if (entry < 0)
2446 // client expected gameobject template id in form (id|0x80000000)
2447 entry = (-entry) | 0x80000000;
2448
2449 WorldPacket data(SMSG_QUESTUPDATE_ADD_KILL, (4 * 4 + 8));
2450 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_KILL");
2451 data << uint32(quest->GetQuestId());
2452 data << uint32(entry);
2453 data << uint32(old_count + add_count);
2454 data << uint32(quest->RequiredNpcOrGoCount[ creatureOrGO_idx ]);
2455 data << guid;
2456 GetSession()->SendPacket(&data);
2457
2458 uint16 log_slot = FindQuestSlot(quest->GetQuestId());
2459 if (log_slot < MAX_QUEST_LOG_SIZE)
2460 SetQuestSlotCounter(log_slot, creatureOrGO_idx, GetQuestSlotCounter(log_slot, creatureOrGO_idx) + add_count);
2461}
@ SMSG_QUESTUPDATE_ADD_KILL
Definition: Opcodes.h:439
uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const
Definition: Player.h:1451

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 
)
2432{
2434 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_ITEM");
2435 //data << quest->RequiredItemId[item_idx];
2436 //data << count;
2437 GetSession()->SendPacket(&data);
2438}
@ 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 
)
2464{
2465 ASSERT(old_count + add_count < 65536 && "player count store in 16 bits");
2466
2468 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_PVP_KILL");
2469 data << uint32(quest->GetQuestId());
2470 data << uint32(old_count + add_count);
2471 data << uint32(quest->GetPlayersSlain());
2472 GetSession()->SendPacket(&data);
2473
2474 uint16 log_slot = FindQuestSlot(quest->GetQuestId());
2475 if (log_slot < MAX_QUEST_LOG_SIZE)
2477}
@ 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 ( )
6542{
6543 uint32 counter = 0;
6544
6546
6547 size_t p_counter = data.wpos();
6548 data << uint32(counter); // placeholder
6549
6550 time_t now = GameTime::GetGameTime().count();
6551
6552 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6553 {
6554 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6555 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6556 {
6557 if (itr->second.perm)
6558 {
6559 InstanceSave* save = itr->second.save;
6560 time_t resetTime = itr->second.extended ? save->GetExtendedResetTime() : save->GetResetTime();
6561 data << uint32(save->GetMapId()); // map id
6562 data << uint32(save->GetDifficulty()); // difficulty
6563 data << ObjectGuid::Create<HighGuid::Instance>(save->GetInstanceId()); // instance id
6564 data << uint8(1); // expired = 0
6565 data << uint8(itr->second.extended ? 1 : 0);// extended = 1
6566 data << uint32(resetTime >= now ? resetTime - now : 0); // reset time
6567 ++counter;
6568 }
6569 }
6570 }
6571 data.put<uint32>(p_counter, counter);
6572 GetSession()->SendPacket(&data);
6573}
@ 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
15402{
15403 // This function call unsets ITEM_FLAGS_REFUNDABLE if played time is over 2 hours.
15404 item->UpdatePlayedTime(this);
15405
15407 {
15408 LOG_DEBUG("entities.player.items", "Item refund: item not refundable!");
15409 return;
15410 }
15411
15412 if (GetGUID().GetCounter() != item->GetRefundRecipient()) // Formerly refundable item got traded
15413 {
15414 LOG_DEBUG("entities.player.items", "Item refund: item was traded!");
15415 item->SetNotRefundable(this);
15416 return;
15417 }
15418
15419 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(item->GetPaidExtendedCost());
15420 if (!iece)
15421 {
15422 LOG_DEBUG("entities.player.items", "Item refund: cannot find extendedcost data.");
15423 return;
15424 }
15425
15426 WorldPacket data(SMSG_ITEM_REFUND_INFO_RESPONSE, 8 + 4 + 4 + 4 + 4 * 4 + 4 * 4 + 4 + 4);
15427 data << item->GetGUID(); // item guid
15428 data << uint32(item->GetPaidMoney()); // money cost
15429 data << uint32(iece->reqhonorpoints); // honor point cost
15430 data << uint32(iece->reqarenapoints); // arena point cost
15431 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
15432 {
15433 data << uint32(iece->reqitem[i]);
15434 data << uint32(iece->reqitemcount[i]);
15435 }
15436 data << uint32(0);
15437 data << uint32(GetTotalPlayedTime() - item->GetPlayedTime());
15438 GetSession()->SendPacket(&data);
15439}
@ SMSG_ITEM_REFUND_INFO_RESPONSE
Definition: Opcodes.h:1232
uint32 GetTotalPlayedTime()
Definition: Player.h:1162

References Object::GetGUID(), Item::GetPaidExtendedCost(), Item::GetPaidMoney(), Item::GetPlayedTime(), Item::GetRefundRecipient(), GetSession(), GetTotalPlayedTime(), Object::HasFlag(), ITEM_FIELD_FLAG_REFUNDABLE, ITEM_FIELD_FLAGS, 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 ( )
9596{
9598 data << uint64(0);
9599 GetSession()->SendPacket(&data);
9600}

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
13794{
13796}
void SendRespondInspectAchievements(Player *player) const
Definition: AchievementMgr.cpp:2312

References m_achievementMgr, and AchievementMgr::SendRespondInspectAchievements().

Referenced by WorldSession::HandleQueryInspectAchievements().

◆ SendSavedInstances()

void Player::SendSavedInstances ( )
6579{
6580 bool hasBeenSaved = false;
6581 WorldPacket data;
6582
6583 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6584 {
6585 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6586 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6587 {
6588 if (itr->second.perm) // only permanent binds are sent
6589 {
6590 hasBeenSaved = true;
6591 break;
6592 }
6593 }
6594 }
6595
6596 //Send opcode 811. true or false means, whether you have current raid/heroic instances
6598 data << uint32(hasBeenSaved);
6599 GetSession()->SendPacket(&data);
6600
6601 if (!hasBeenSaved)
6602 return;
6603
6604 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6605 {
6606 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6607 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6608 {
6609 if (itr->second.perm)
6610 {
6612 data << uint32(itr->second.save->GetMapId());
6613 GetSession()->SendPacket(&data);
6614 }
6615 }
6616 }
6617}
@ SMSG_UPDATE_INSTANCE_OWNERSHIP
Definition: Opcodes.h:841
@ SMSG_UPDATE_LAST_INSTANCE
Definition: Opcodes.h:830
void Initialize(uint16 opcode, 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 
)
4105{
4106 LOG_DEBUG("network", "WORLD: Sent SMSG_SELL_ITEM");
4107 WorldPacket data(SMSG_SELL_ITEM, (8 + 8 + (param ? 4 : 0) + 1)); // last check 2.0.10
4108 data << (creature ? creature->GetGUID() : ObjectGuid::Empty);
4109 data << guid;
4110 if (param > 0)
4111 data << uint32(param);
4112 data << uint8(msg);
4113 GetSession()->SendPacket(&data);
4114}
@ 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 
)
16240{
16241 ChatHandler(GetSession()).SendSysMessage(msg, escapeCharacters);
16242}

References GetSession(), and ChatHandler::SendSysMessage().

◆ SendTalentsInfoData()

◆ SendTalentWipeConfirm()

void Player::SendTalentWipeConfirm ( ObjectGuid  guid)
8757{
8758 WorldPacket data(MSG_TALENT_WIPE_CONFIRM, (8 + 4));
8759 data << guid;
8760 uint32 cost = sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST) ? 0 : resetTalentsCost();
8761 data << cost;
8762 GetSession()->SendPacket(&data);
8763}
@ 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 ( )
10402{
10403 for (auto itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
10404 {
10405 if (!itr->IsCreature())
10406 {
10407 continue;
10408 }
10409
10410 Creature* creature = ObjectAccessor::GetCreature(*this, *itr);
10411 if (!creature || creature->IsHostileTo(this))
10412 {
10413 continue;
10414 }
10415
10416 if (!creature->HasNpcFlag(UNIT_NPC_FLAG_FLIGHTMASTER))
10417 {
10418 continue;
10419 }
10420
10421 uint32 nearestNode = sObjectMgr->GetNearestTaxiNode(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetMapId(), GetTeamId());
10422 if (!nearestNode)
10423 {
10424 continue;
10425 }
10426
10428 data << *itr;
10429 data << uint8(m_taxi.IsTaximaskNodeKnown(nearestNode) ? 1 : 0);
10430 SendDirectMessage(&data);
10431 }
10432}
@ SMSG_TAXINODE_STATUS
Definition: Opcodes.h:457
bool IsTaximaskNodeKnown(uint32 nodeidx) const
Definition: PlayerTaxi.h:36

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 ( )
1303{
1305 data << GetPackGUID();
1306 data << uint32(0); // this value increments every time
1307 BuildMovementPacket(&data);
1308 GetSession()->SendPacket(&data);
1309}
@ MSG_MOVE_TELEPORT_ACK
Definition: Opcodes.h:229
void BuildMovementPacket(ByteBuffer *data) const
Definition: Unit.cpp:20069

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 
)
11613{
11615 data << uint32(mapid);
11616 data << uint8(reason); // transfer abort reason
11617 switch (reason)
11618 {
11622 // these are the ONLY cases that have an extra argument in the packet!!!
11623 data << uint8(arg);
11624 break;
11625 default:
11626 break;
11627 }
11628 GetSession()->SendPacket(&data);
11629}
@ TRANSFER_ABORT_UNIQUE_MESSAGE
Definition: Player.h:784
@ TRANSFER_ABORT_INSUF_EXPAN_LVL
Definition: Player.h:782
@ 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 ( )
11600{
11602 return;
11603 if (Group* group = GetGroup())
11604 group->UpdatePlayerOutOfRange(this);
11605
11608 if (Pet* pet = GetPet())
11609 pet->ResetAuraUpdateMaskForRaid();
11610}
@ GROUP_UPDATE_FLAG_NONE
Definition: Group.h:98

References GetGroup(), GetPet(), GROUP_UPDATE_FLAG_NONE, m_auraRaidUpdateMask, and m_groupUpdateMask.

Referenced by Update().

◆ SendUpdateWorldState()

void Player::SendUpdateWorldState ( uint32  variable,
uint32  value 
) const
2195{
2197 worldstate.VariableID = variable;
2198 worldstate.Value = value;
2199 SendDirectMessage(worldstate.Write());
2200}
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
1696{ m_activeSpec = spec; }

References m_activeSpec.

Referenced by ActivateSpec().

◆ SetAmmo()

void Player::SetAmmo ( uint32  item)
2521{
2522 if (!item)
2523 return;
2524
2525 // already set
2526 if (GetUInt32Value(PLAYER_AMMO_ID) == item)
2527 return;
2528
2529 // check ammo
2530 InventoryResult msg = CanUseAmmo(item);
2531 if (msg != EQUIP_ERR_OK)
2532 {
2533 SendEquipError(msg, nullptr, nullptr, item);
2534 return;
2535 }
2536
2538
2540}

References _ApplyAmmoBonuses(), CanUseAmmo(), EQUIP_ERR_OK, Object::GetUInt32Value(), PLAYER_AMMO_ID, SendEquipError(), and Object::SetUInt32Value().

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

◆ SetArenaPoints()

void Player::SetArenaPoints ( uint32  value)
6162{
6163 if (value > sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS))
6164 value = sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS);
6166 if (value)
6168}
@ ITEM_ARENA_POINTS_ID
Definition: Player.h:953
@ CONFIG_MAX_ARENA_POINTS
Definition: IWorld.h:243

References AddKnownCurrency(), CONFIG_MAX_ARENA_POINTS, ITEM_ARENA_POINTS_ID, PLAYER_FIELD_ARENA_CURRENCY, Object::SetUInt32Value(), and sWorld.

Referenced by Create(), LoadFromDB(), and ModifyArenaPoints().

◆ SetArenaTeamIdInvited()

void Player::SetArenaTeamIdInvited ( uint32  ArenaTeamId)
inline

◆ SetArenaTeamInfoField()

◆ SetAtLoginFlag()

void Player::SetAtLoginFlag ( AtLoginFlags  f)
inline
2353{ m_atLoginFlags |= f; }

References m_atLoginFlags.

◆ SetAuraUpdateMaskForRaid()

void Player::SetAuraUpdateMaskForRaid ( uint8  slot)
inline
2426{ 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
2141{ m_auraBaseMod[modGroup][modType] = value; }

References m_auraBaseMod.

Referenced by UpdateAllCritPercentages().

◆ SetBaseRune()

void Player::SetBaseRune ( uint8  index,
RuneType  baseRune 
)
inline
2464{ 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 
)
12978{
12979 //we must move references from m_group to m_originalGroup
12980 if (GetGroup() && (GetGroup()->isBGGroup() || GetGroup()->isBFGroup()))
12981 {
12982 LOG_INFO("misc", "Player::SetBattlegroundOrBattlefieldRaid - current group is {} group!", (GetGroup()->isBGGroup() ? "BG" : "BF"));
12983 //ABORT(); // pussywizard: origanal group can never be bf/bg group
12984 }
12985
12987
12988 m_group.unlink();
12989 m_group.link(group, this);
12990 m_group.setSubGroup((uint8)subgroup);
12991}
uint8 GetSubGroup() const
Definition: Player.h:2422

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
2209{ m_bgData = bgdata; }

References m_bgData.

◆ SetBindPoint()

void Player::SetBindPoint ( ObjectGuid  guid)
8750{
8752 data << guid;
8753 GetSession()->SendPacket(&data);
8754}
@ 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)
13028{
13029 if (m_canBlock == value)
13030 return;
13031
13032 m_canBlock = value;
13034}
void UpdateBlockPercentage()
Definition: StatSystem.cpp:623

References m_canBlock, and UpdateBlockPercentage().

Referenced by Spell::EffectBlock().

◆ SetCanFly()

bool Player::SetCanFly ( bool  apply,
bool  packetOnly = false 
)
overridevirtual

movement counter

Reimplemented from Unit.

15802{
15803 sScriptMgr->AnticheatSetCanFlybyServer(this, apply);
15804
15805 if (!packetOnly && !Unit::SetCanFly(apply))
15806 return false;
15807
15808 if (!apply)
15810
15812 data << GetPackGUID();
15813 data << uint32(0);
15814 SendDirectMessage(&data);
15815
15816 data.Initialize(MSG_MOVE_UPDATE_CAN_FLY, 64);
15817 data << GetPackGUID();
15818 BuildMovementPacket(&data);
15819 SendMessageToSet(&data, false);
15820 return true;
15821}
@ 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)
Definition: Unit.cpp:20856

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(), and WorldSession::ReadMovementInfo().

◆ SetCanKnockback()

void Player::SetCanKnockback ( bool  value)
inline
2450{ m_canKnockback = value; }

References m_canKnockback.

Referenced by Unit::KnockbackFrom().

◆ SetCanParry()

void Player::SetCanParry ( bool  value)
13019{
13020 if (m_canParry == value)
13021 return;
13022
13023 m_canParry = value;
13025}
void UpdateParryPercentage()
Definition: StatSystem.cpp:742

References m_canParry, and UpdateParryPercentage().

Referenced by Spell::EffectParry(), and AuraEffect::HandleAuraModParryPercent().

◆ SetCanTeleport()

◆ SetCanTitanGrip()

void Player::SetCanTitanGrip ( bool  value)
13037{
13038 m_canTitanGrip = value;
13039}

References m_canTitanGrip.

Referenced by ActivateSpec(), Spell::EffectTitanGrip(), and resetTalents().

◆ SetChampioningFaction()

void Player::SetChampioningFaction ( uint32  faction)
inline
2498{ m_ChampioningFaction = faction; }

References m_ChampioningFaction.

Referenced by AuraEffect::HandleAuraDummy().

◆ setCinematic()

void Player::setCinematic ( uint8  cine)
inline
1786 {
1787 m_cinematic = cine;
1788 }

References m_cinematic.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ SetClientControl()

void Player::SetClientControl ( Unit target,
bool  allowMove,
bool  packetOnly = false 
)
12749{
12751 data << target->GetPackGUID();
12752 data << uint8((allowMove && !target->HasUnitState(UNIT_STATE_FLEEING | UNIT_STATE_CONFUSED)) ? 1 : 0);
12753 GetSession()->SendPacket(&data);
12754
12755 // We want to set the packet only
12756 if (packetOnly)
12757 return;
12758
12759 if (this != target)
12760 SetViewpoint(target, allowMove);
12761
12762 if (allowMove)
12763 SetMover(target);
12764
12765 // Xinef: disable moving if target has disable move flag
12766 if (target->GetTypeId() != TYPEID_UNIT)
12767 return;
12768
12769 if (allowMove && target->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE))
12770 {
12772 target->SetControlled(true, UNIT_STATE_ROOT);
12773 }
12774 else if (!allowMove && target->HasUnitState(UNIT_STATE_ROOT) && !target->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
12775 {
12777 {
12778 // Xinef: restore original orientation, important for shooting vehicles!
12780 target->SetOrientation(pos.GetOrientation());
12781 target->SetFacingTo(pos.GetOrientation());
12782 target->DisableSpline();
12783 }
12784 else
12785 target->SetControlled(false, UNIT_STATE_ROOT);
12786 }
12787}
@ UNIT_MASK_ACCESSORY
Definition: Unit.h:684
@ UNIT_STATE_CONFUSED
Definition: Unit.h:336
@ UNIT_STATE_FLEEING
Definition: Unit.h:332
@ SMSG_CLIENT_CONTROL_UPDATE
Definition: Opcodes.h:375
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:330
void GetTransportHomePosition(float &x, float &y, float &z, float &ori) const
Definition: Creature.h:335
bool IsMOTransport() const
Definition: ObjectGuid.h:177
void SetOrientation(float orientation)
Definition: Position.h:112
void SetFacingTo(float ori)
Definition: Unit.cpp:20782
void DisableSpline()
Definition: Unit.cpp:655
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition: Unit.cpp:18192
ObjectGuid GetTransGUID() const override
Definition: Unit.cpp:18924
uint32 HasUnitTypeMask(uint32 mask) const
Definition: Unit.h:1407

References Unit::ClearUnitState(), Unit::DisableSpline(), Creature::GetHomePosition(), Position::GetOrientation(), Object::GetPackGUID(), GetSession(), Unit::GetTransGUID(), Creature::GetTransportHomePosition(), Object::GetTypeId(), Unit::HasUnitFlag(), Unit::HasUnitMovementFlag(), Unit::HasUnitState(), Unit::HasUnitTypeMask(), ObjectGuid::IsMOTransport(), MOVEMENTFLAG_ONTRANSPORT, WorldSession::SendPacket(), Unit::SetControlled(), Unit::SetFacingTo(), SetMover(), Position::SetOrientation(), SetViewpoint(), PackedGuid::size(), SMSG_CLIENT_CONTROL_UPDATE, Object::ToCreature(), TYPEID_UNIT, 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()

◆ SetContestedPvPTimer()

void Player::SetContestedPvPTimer ( uint32  newTime)
inline
1819{m_contestedPvPTimer = newTime;}

References m_contestedPvPTimer.

Referenced by Unit::SetContestedPvP().

◆ SetCurrentRune()

void Player::SetCurrentRune ( uint8  index,
RuneType  currentRune 
)
inline
2465{ 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
2491{ SetUInt32Value(PLAYER_CHOSEN_TITLE, clear ? 0 : title->bit_index); };

References CharTitlesEntry::bit_index, PLAYER_CHOSEN_TITLE, and Object::SetUInt32Value().

Referenced by SetTitle().

◆ SetDailyQuestStatus()

void Player::SetDailyQuestStatus ( uint32  quest_id)
11992{
11993 if (Quest const* qQuest = sObjectMgr->GetQuestTemplate(quest_id))
11994 {
11995 if (!qQuest->IsDFQuest())
11996 {
11997 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
11998 {
11999 if (!GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
12000 {
12001 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, quest_id);
12002 m_lastDailyQuestTime = GameTime::GetGameTime().count(); // last daily quest time
12003 m_DailyQuestChanged = true;
12004 break;
12005 }
12006 }
12007 }
12008 else
12009 {
12010 m_DFQuests.insert(quest_id);
12012 m_DailyQuestChanged = true;
12013 }
12014 }
12015}

References GameTime::GetGameTime(), Object::GetUInt32Value(), m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, Object::SetUInt32Value(), and sObjectMgr.

Referenced by RewardQuest().

◆ setDeathState()

void Player::setDeathState ( DeathState  s,
bool  despawn = false 
)
overridevirtual

Reimplemented from Unit.

1007{
1008 uint32 ressSpellId = 0;
1009
1010 bool cur = IsAlive();
1011
1012 if (s == JUST_DIED)
1013 {
1014 if (!cur)
1015 {
1016 LOG_ERROR("entities.player", "setDeathState: attempt to kill a dead player {} ({})", GetName(), GetGUID().ToString());
1017 return;
1018 }
1019
1020 // drunken state is cleared on death
1021 SetDrunkValue(0);
1022 // lost combo points at any target (targeted combo points clear in Unit::setDeathState)
1024
1026
1027 //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DEAD) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD)
1028 RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
1029
1030 // save value before aura remove in Unit::setDeathState
1032
1033 // xinef: disable passive area auras!
1035
1036 // passive spell
1037 if (!ressSpellId)
1038 ressSpellId = GetResurrectionSpellId();
1042
1043 // Xinef: reset all death criterias
1045 }
1046 // xinef: enable passive area auras!
1047 else if (s == ALIVE)
1049
1051
1054
1055 // restore resurrection spell id for player after aura remove
1056 if (s == JUST_DIED && cur && ressSpellId)
1058
1059 if (IsAlive() && !cur)
1060 //clear aura case after resurrection by another way (spells will be applied before next death)
1062}
@ PLAYER_SELF_RES_SPELL
Definition: UpdateFields.h:370
@ JUST_DIED
Definition: Unit.h:317
@ ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH
Definition: DBCEnums.h:94
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP
Definition: DBCEnums.h:139
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH
Definition: DBCEnums.h:140
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON
Definition: DBCEnums.h:141
uint32 GetResurrectionSpellId()
Definition: Player.cpp:12505
void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
Definition: Player.cpp:13813
virtual void setDeathState(DeathState s, bool despawn=false)
Definition: Unit.cpp:14447

References ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, Unit::AddUnitState(), ALIVE, Unit::ClearComboPoints(), clearResurrectRequestData(), Unit::ClearUnitState(), WorldObject::FindMap(), Object::GetGUID(), WorldObject::GetName(), GetResurrectionSpellId(), Object::GetUInt32Value(), Unit::IsAlive(), JUST_DIED, LOG_ERROR, NeedSendSpectatorData(), PET_SAVE_NOT_IN_SLOT, PLAYER_SELF_RES_SPELL, RemovePet(), ResetAchievementCriteria(), ArenaSpectator::SendCommand_UInt32Value(), Unit::setDeathState(), SetDrunkValue(), Object::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.

15785{
15786 if (!packetOnly && !Unit::SetDisableGravity(disable))
15787 return false;
15788
15790 data << GetPackGUID();
15791 data << uint32(0);
15792 SendDirectMessage(&data);
15793
15794 data.Initialize(MSG_MOVE_GRAVITY_CHNG, 64);
15795 data << GetPackGUID();
15796 BuildMovementPacket(&data);
15797 SendMessageToSet(&data, false);
15798 return true;
15799}
@ 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:20819

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 bool isSobering = newDrunkValue < GetDrunkValue();
975 if (newDrunkValue > 100)
976 newDrunkValue = 100;
977
978 // select drunk percent or total SPELL_AURA_MOD_FAKE_INEBRIATE amount, whichever is higher for visibility updates
979 int32 drunkPercent = std::max<int32>(newDrunkValue, GetTotalAuraModifier(SPELL_AURA_MOD_FAKE_INEBRIATE));
980 if (drunkPercent)
981 {
984 }
985 else if (!HasAuraType(SPELL_AURA_MOD_FAKE_INEBRIATE) && !newDrunkValue)
987
988 uint32 newDrunkenState = Player::GetDrunkenstateByValue(newDrunkValue);
989 SetByteValue(PLAYER_BYTES_3, 1, newDrunkValue);
991
992 if (!isSobering)
993 m_drunkTimer = 0; // reset sobering timer
994
995 if (newDrunkenState == oldDrunkenState)
996 return;
997
999 data.Guid = GetGUID();
1000 data.Threshold = newDrunkenState;
1001 data.ItemID = itemId;
1002
1003 SendMessageToSet(data.Write(), true);
1004}
@ SPELL_AURA_MOD_FAKE_INEBRIATE
Definition: SpellAuraDefines.h:367
@ INVISIBILITY_DRUNK
Definition: SharedDefines.h:1233
void AddFlag(FLAG_TYPE flag)
Definition: Object.h:356
void DelFlag(FLAG_TYPE flag)
Definition: Object.h:357
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition: Object.h:360
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPES > m_invisibilityDetect
Definition: Object.h:507
static DrunkenState GetDrunkenstateByValue(uint8 value)
Definition: Player.cpp:960
WorldPacket const * Write() override
Definition: MiscPackets.cpp:113
ObjectGuid Guid
Definition: MiscPackets.h:172
uint32 Threshold
Definition: MiscPackets.h:173
uint32 ItemID
Definition: MiscPackets.h:174

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::AddFlag(), FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::DelFlag(), GetDrunkenstateByValue(), GetDrunkValue(), Object::GetGUID(), Unit::GetTotalAuraModifier(), WorldPackets::Misc::CrossedInebriationThreshold::Guid, Unit::HasAuraType(), INVISIBILITY_DRUNK, WorldPackets::Misc::CrossedInebriationThreshold::ItemID, m_drunkTimer, WorldObject::m_invisibilityDetect, PLAYER_BYTES_3, SendMessageToSet(), Object::SetByteValue(), FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), SPELL_AURA_MOD_FAKE_INEBRIATE, WorldPackets::Misc::CrossedInebriationThreshold::Threshold, UpdateObjectVisibility(), 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 ( )
11180{
11183
11184 if (!m_taxi.empty())
11185 {
11188
11191 }
11192 else
11193 {
11194 if (IsMounted())
11195 {
11197 if (!auras.empty())
11198 m_entryPointData.mountSpell = (*auras.begin())->GetId();
11199 }
11200 else
11202
11203 if (GetMap()->IsDungeon())
11204 {
11205 if (const GraveyardStruct* entry = sGraveyard->GetClosestGraveyard(this, GetTeamId()))
11206 m_entryPointData.joinPos = WorldLocation(entry->Map, entry->x, entry->y, entry->z, 0.0f);
11207 }
11208 else if (!GetMap()->IsBattlegroundOrArena())
11210 }
11211
11214}
uint32 m_mapId
Definition: Position.h:319
bool empty() const
Definition: PlayerTaxi.h:74
uint32 GetTaxiDestination() const
Definition: PlayerTaxi.h:65
bool IsDungeon() const
Definition: Map.h:447
bool IsBattlegroundOrArena() const
Definition: Map.h:455

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_homebindO, 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 
)
14390{
14391 if (eqset.Guid != 0)
14392 {
14393 bool found = false;
14394
14395 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14396 {
14397 if ((itr->second.Guid == eqset.Guid) && (itr->first == index))
14398 {
14399 found = true;
14400 break;
14401 }
14402 }
14403
14404 if (!found) // something wrong...
14405 {
14406 LOG_ERROR("entities.player", "Player {} tried to save equipment set {} (index {}), but that equipment set not found!", GetName(), eqset.Guid, index);
14407 return;
14408 }
14409 }
14410
14411 EquipmentSet& eqslot = m_EquipmentSets[index];
14412
14413 EquipmentSetUpdateState old_state = eqslot.state;
14414
14415 eqslot = eqset;
14416
14417 if (eqset.Guid == 0)
14418 {
14419 eqslot.Guid = sObjectMgr->GenerateEquipmentSetGuid();
14420
14422 data << uint32(index);
14423 data.appendPackGUID(eqslot.Guid);
14424 GetSession()->SendPacket(&data);
14425 }
14426
14428}
EquipmentSetUpdateState
Definition: Player.h:742
@ 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)
5751{
5752 m_team = TeamIdForRace(race);
5753
5754 sScriptMgr->OnPlayerUpdateFaction(this);
5755
5756 if (GetTeamId(true) != GetTeamId())
5757 return;
5758
5759 ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race);
5760 SetFaction(rEntry ? rEntry->FactionID : 0);
5761}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
void SetFaction(uint32 faction)
Definition: Unit.cpp:10029
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)
16152{
16153 _farSightDistance = radius;
16154}

References _farSightDistance.

Referenced by AuraEffect::HandleFarSight().

◆ SetFeatherFall()

bool Player::SetFeatherFall ( bool  apply,
bool  packetOnly = false 
)
overridevirtual

movement counter

Reimplemented from Unit.

15866{
15867 // Xinef: moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15868 if (!packetOnly/* && !Unit::SetFeatherFall(apply)*/)
15869 {
15870 Unit::SetFeatherFall(apply);
15871 //return false;
15872 }
15873
15875 data << GetPackGUID();
15876 data << uint32(0);
15877 SendDirectMessage(&data);
15878
15879 data.Initialize(MSG_MOVE_FEATHER_FALL, 64);
15880 data << GetPackGUID();
15881 BuildMovementPacket(&data);
15882 SendMessageToSet(&data, false);
15883 return true;
15884}
@ 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:20896

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)
2178{
2179 if (on)
2180 {
2186
2187 if (Pet* pet = GetPet())
2188 {
2190 pet->SetFaction(FACTION_FRIENDLY);
2191 pet->getHostileRefMgr().setOnlineOfflineState(false);
2192 }
2194 {
2196 sScriptMgr->OnFfaPvpStateUpdate(this, false);
2197 }
2199
2202
2203 SetPhaseMask(uint32(PHASEMASK_ANYWHERE), false); // see and visible in all phases
2205 }
2206 else
2207 {
2208 // restore phase
2209 uint32 newPhase = GetPhaseByAuras();
2210
2211 if (!newPhase)
2212 newPhase = PHASEMASK_NORMAL;
2213
2214 SetPhaseMask(newPhase, false);
2215
2216 m_ExtraFlags &= ~ PLAYER_EXTRA_GM_ON;
2220
2221 if (Pet* pet = GetPet())
2222 {
2223 pet->SetFaction(GetFaction());
2224 pet->getHostileRefMgr().setOnlineOfflineState(true);
2225 }
2226
2227 // restore FFA PvP Server state
2228 if (sWorld->IsFFAPvPRealm())
2229 {
2231 {
2233 sScriptMgr->OnFfaPvpStateUpdate(this, true);
2234 }
2235 }
2236 // restore FFA PvP area state, remove not allowed for GM mounts
2238
2241 }
2242
2244}
@ SEC_PLAYER
Definition: Common.h:66
@ PHASEMASK_ANYWHERE
Definition: Object.h:57
@ UNIT_FLAG2_ALLOW_CHEAT_SPELLS
Definition: Unit.h:505
@ SERVERSIDE_VISIBILITY_GM
Definition: SharedDefines.h:1245
@ FACTION_FRIENDLY
Definition: SharedDefines.h:173
bool IsGMAccount(uint32 gmlevel)
Definition: AccountMgr.cpp:281
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibilityDetect
Definition: Object.h:510
void ResetContestedPvP()
Definition: Player.h:1820
void UpdateArea(uint32 newArea)
Definition: PlayerUpdates.cpp:1171
uint32 GetFaction() const
Definition: Unit.h:1495
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition: Unit.cpp:19217
void CombatStopWithPets(bool includingCast=false)
Definition: Unit.cpp:10417

References Unit::CombatStopWithPets(), FACTION_FRIENDLY, Unit::GetFaction(), Unit::getHostileRefMgr(), GetPet(), Unit::GetPhaseByAuras(), Unit::getRace(), GetSession(), Object::HasByteFlag(), AccountMgr::IsGMAccount(), 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
1713 {
1714 m_Glyphs[m_activeSpec][slot] = glyph;
1716
1717 if (save)
1718 SetNeedToSaveGlyphs(true);
1719 }
@ PLAYER_FIELD_GLYPHS_1
Definition: UpdateFields.h:389

References m_activeSpec, m_Glyphs, PLAYER_FIELD_GLYPHS_1, SetNeedToSaveGlyphs(), and Object::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
1139{ 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)
2247{
2248 const uint32 VISUAL_AURA = 37800;
2249
2250 if (on)
2251 {
2252 RemoveAurasDueToSpell(VISUAL_AURA);
2253 m_ExtraFlags &= ~PLAYER_EXTRA_GM_INVISIBLE;
2255
2258 }
2259 else
2260 {
2261 AddAura(VISUAL_AURA, this);
2264 }
2265}
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition: Object.h:509

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 
)
11458{
11459 if (!group)
11460 m_group.unlink();
11461 else
11462 {
11463 // never use SetGroup without a subgroup unless you specify nullptr for group
11464 ASSERT(subgroup >= 0);
11465 m_group.link(group, this);
11466 m_group.setSubGroup((uint8)subgroup);
11467 }
11468
11470}

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
1145{ 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
2882{ m_bHasDelayedTeleport = setting; }

References m_bHasDelayedTeleport.

Referenced by TeleportTo(), and Update().

◆ SetHomebind()

void Player::SetHomebind ( WorldLocation const &  loc,
uint32  areaId 
)
4923{
4924 loc.GetPosition(m_homebindX, m_homebindY, m_homebindZ, m_homebindO);
4925 m_homebindMapId = loc.GetMapId();
4926 m_homebindAreaId = areaId;
4927
4928 // update sql homebind
4930 stmt->SetData(0, m_homebindMapId);
4931 stmt->SetData(1, m_homebindAreaId);
4932 stmt->SetData(2, m_homebindX);
4933 stmt->SetData(3, m_homebindY);
4934 stmt->SetData(4, m_homebindZ);
4935 stmt->SetData(5, m_homebindO);
4936 stmt->SetData(6, GetGUID().GetCounter());
4937 CharacterDatabase.Execute(stmt);
4938}
@ 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_homebindO, m_homebindX, m_homebindY, m_homebindZ, and PreparedStatementBase::SetData().

Referenced by Spell::EffectBind().

◆ SetHonorPoints()

void Player::SetHonorPoints ( uint32  value)
6141{
6142 if (value > sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS))
6143 {
6144 if (int32 copperPerPoint = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT))
6145 {
6146 // Only convert points on login, not when awarded honor points.
6147 if (isBeingLoaded())
6148 {
6149 int32 excessPoints = value - sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS);
6150 ModifyMoney(excessPoints * copperPerPoint);
6151 }
6152 }
6153
6154 value = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS);
6155 }
6157 if (value)
6159}
@ ITEM_HONOR_POINTS_ID
Definition: Player.h:952
@ CONFIG_MAX_HONOR_POINTS
Definition: IWorld.h:240
@ CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT
Definition: IWorld.h:241

References AddKnownCurrency(), CONFIG_MAX_HONOR_POINTS, CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT, isBeingLoaded(), ITEM_HONOR_POINTS_ID, ModifyMoney(), PLAYER_FIELD_HONOR_CURRENCY, Object::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.

15824{
15825 // moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15826 if (!packetOnly /* && !Unit::SetHover(apply)*/)
15827 {
15828 Unit::SetHover(apply);
15829 // return false;
15830 }
15831
15833 data << GetPackGUID();
15834 data << uint32(0);
15835 SendDirectMessage(&data);
15836
15837 data.Initialize(MSG_MOVE_HOVER, 64);
15838 data << GetPackGUID();
15839 BuildMovementPacket(&data);
15840 SendMessageToSet(&data, false);
15841 return true;
15842}
@ 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:20918

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
1858 {
1859 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, ArenaTeamId);
1861 }

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 
)
12183{
12184 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12185 if (_BgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
12186 _BgBattlegroundQueueID[i].invitedToInstance = instanceId;
12187}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by BattlegroundQueue::InviteGroupToBG().

◆ SetInWater()

void Player::SetInWater ( bool  apply)
2138{
2139 if (m_isInWater == apply)
2140 return;
2141
2142 //define player in water by opcodes
2143 //move player's guid into HateOfflineList of those mobs
2144 //which can't swim and move guid back into ThreatList when
2145 //on surface.
2146 //TODO: exist also swimming mobs, and function must be symmetric to enter/leave water
2148
2149 // remove auras that need water/land
2151
2153}
@ 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(), m_isInWater, Unit::RemoveAurasWithInterruptFlags(), and HostileRefMgr::updateThreatTables().

Referenced by WorldSession::HandleMovementOpcodes().

◆ SetIsSpectator()

void Player::SetIsSpectator ( bool  on)
15238{
15239 if (on)
15240 {
15244 //SetFaction(1100);
15247 {
15249 sScriptMgr->OnFfaPvpStateUpdate(this, false);
15250 }
15252 SetDisplayId(23691);
15253 }
15254 else
15255 {
15257 if (IsSpectator())
15259 m_ExtraFlags &= ~PLAYER_EXTRA_SPECTATOR_ON;
15262
15263 if (!IsGameMaster())
15264 {
15265 //SetFactionForRace(getRace());
15266
15267 // restore FFA PvP Server state
15268 // Xinef: it will be removed if necessery in UpdateArea called in WorldPortOpcode
15269 if (sWorld->IsFFAPvPRealm())
15270 {
15272 {
15274 sScriptMgr->OnFfaPvpStateUpdate(this, true);
15275
15276 }
15277 }
15278 }
15279 }
15280}
#define SPECTATOR_SPELL_SPEED
Definition: ArenaSpectator.h:39
void RestoreDisplayId()
Definition: Unit.cpp:16946

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
2408{ m_lastpetnumber = petnumber; }

References m_lastpetnumber.

Referenced by Pet::LoadPetFromDB().

◆ SetLastPetSpell()

void Player::SetLastPetSpell ( uint32  petspell)
inline
2410{ m_oldpetspell = petspell; }

References m_oldpetspell.

Referenced by UnsummonPetTemporaryIfAny().

◆ SetLastPotionId()

void Player::SetLastPotionId ( uint32  item_id)
inline
1763{ m_lastPotionId = item_id; }

References m_lastPotionId.

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

◆ SetLastUsedRune()

void Player::SetLastUsedRune ( RuneType  type)
inline
2463{ m_runes->lastUsedRune = type; }

References Runes::lastUsedRune, and m_runes.

Referenced by Spell::TakeRunePower().

◆ SetLootGUID()

void Player::SetLootGUID ( ObjectGuid  guid)
inline
1944{ m_lootGuid = guid; }

References m_lootGuid.

Referenced by WorldSession::DoLootRelease(), and SendLoot().

◆ SetMap()

void Player::SetMap ( Map map)
overridevirtual

Reimplemented from WorldObject.

14559{
14560 Unit::SetMap(map);
14561 m_mapRef.link(map, this);
14562}
virtual void SetMap(Map *map)
Definition: Object.cpp:2071

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)
12050{
12051 m_monthlyquests.insert(quest_id);
12052 m_MonthlyQuestChanged = true;
12053}

References m_MonthlyQuestChanged, and m_monthlyquests.

Referenced by RewardQuest().

◆ SetMountBlockId()

void Player::SetMountBlockId ( uint32  mount)
inline

◆ SetMovement()

void Player::SetMovement ( PlayerMovementType  pType)
4297{
4298 WorldPacket data;
4299 switch (pType)
4300 {
4301 case MOVE_ROOT:
4302 data.Initialize(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
4303 break;
4304 case MOVE_UNROOT:
4305 data.Initialize(SMSG_FORCE_MOVE_UNROOT, GetPackGUID().size() + 4);
4306 break;
4307 case MOVE_WATER_WALK:
4308 data.Initialize(SMSG_MOVE_WATER_WALK, GetPackGUID().size() + 4);
4309 break;
4310 case MOVE_LAND_WALK:
4311 data.Initialize(SMSG_MOVE_LAND_WALK, GetPackGUID().size() + 4);
4312 break;
4313 default:
4314 LOG_ERROR("entities.player", "Player::SetMovement: Unsupported move type ({}), data not sent to client.", pType);
4315 return;
4316 }
4317 data << GetPackGUID();
4318 data << uint32(0);
4319 GetSession()->SendPacket(&data);
4320}
@ 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)
12790{
12791 if (this != target && target->m_movedByPlayer && target->m_movedByPlayer != target && target->m_movedByPlayer != this)
12792 {
12793 LOG_INFO("misc", "Player::SetMover (A1) - {}, {}, {}, {}, {}, {}, {}, {}", GetGUID().ToString(), GetMapId(), GetInstanceId(), FindMap()->GetId(), IsInWorld() ? 1 : 0, IsDuringRemoveFromWorld() ? 1 : 0, IsBeingTeleported() ? 1 : 0, isBeingLoaded() ? 1 : 0);
12794 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);
12795 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);
12796 }
12797 if (this != target && (!target->IsInWorld() || target->IsDuringRemoveFromWorld() || GetMapId() != target->GetMapId() || GetInstanceId() != target->GetInstanceId()))
12798 {
12799 LOG_INFO("misc", "Player::SetMover (B1) - {}, {}, {}, {}, {}, {}, {}, {}", GetGUID().ToString(), GetMapId(), GetInstanceId(), FindMap()->GetId(), IsInWorld() ? 1 : 0, IsDuringRemoveFromWorld() ? 1 : 0, IsBeingTeleported() ? 1 : 0, isBeingLoaded() ? 1 : 0);
12800 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);
12801 }
12802 m_mover->m_movedByPlayer = nullptr;
12803 if (m_mover->GetTypeId() == TYPEID_UNIT)
12805
12806 m_mover = target;
12807 m_mover->m_movedByPlayer = this;
12808 if (m_mover->GetTypeId() == TYPEID_UNIT)
12810}
virtual bool isBeingLoaded() const
Definition: Unit.h:2395
bool IsDuringRemoveFromWorld() const
Definition: Unit.h:2396
void Initialize()
Definition: MotionMaster.cpp:72

References WorldObject::FindMap(), Object::GetGUID(), Map::GetId(), WorldObject::GetInstanceId(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), Object::GetTypeId(), MotionMaster::Initialize(), Unit::isBeingLoaded(), isBeingLoaded(), IsBeingTeleported(), Unit::IsDuringRemoveFromWorld(), Object::IsInWorld(), LOG_INFO, Unit::m_movedByPlayer, m_mover, Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), and TYPEID_UNIT.

Referenced by SendInitialPacketsBeforeAddToMap(), and SetClientControl().

◆ SetMustDelayTeleport()

void Player::SetMustDelayTeleport ( bool  setting)
inlineprivate
2880{ m_bMustDelayTeleport = setting; }

References m_bMustDelayTeleport.

Referenced by RewardQuest(), and Update().

◆ SetNeedToSaveGlyphs()

void Player::SetNeedToSaveGlyphs ( bool  val)
inline
2549{ m_NeedToSaveGlyphs = val; }

References m_NeedToSaveGlyphs.

Referenced by _SaveGlyphs(), and SetGlyph().

◆ SetNeedZoneUpdate()

void Player::SetNeedZoneUpdate ( bool  needUpdate)
inline
1810{ m_needZoneUpdate = needUpdate; }

References m_needZoneUpdate.

Referenced by WorldSession::HandleZoneUpdateOpcode().

◆ SetObjectScale()

void Player::SetObjectScale ( float  scale)
inlineoverridevirtual

Reimplemented from Object.

1061 {
1062 Unit::SetObjectScale(scale);
1065 }
#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:113

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 
)
13006{
13007 if (!group)
13009 else
13010 {
13011 // never use SetOriginalGroup without a subgroup unless you specify nullptr for group
13012 ASSERT(subgroup >= 0);
13013 m_originalGroup.link(group, this);
13015 }
13016}

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
2438{ 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
1801 {
1802 Unit::SetPvP(state);
1803 if (!m_Controlled.empty())
1804 for (auto itr : m_Controlled)
1805 itr->SetPvP(state);
1806 }
ControlSet m_Controlled
Definition: Unit.h:1867
void SetPvP(bool state)
Definition: Unit.h:1519

References Unit::m_Controlled, and Unit::SetPvP().

Referenced by UpdatePvP().

◆ SetPvPDeath()

void Player::SetPvPDeath ( bool  on)
inline
1146{ 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 
)
1464{
1465 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
1466 {
1467 m_QuestStatus[questId].Status = status;
1468
1469 if (quest->GetQuestMethod() && !quest->IsAutoComplete())
1470 {
1471 m_QuestStatusSave[questId] = true;
1472 }
1473 }
1474
1475 if (update)
1476 SendQuestUpdate(questId);
1477}

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)
15588{
15589 m_IsBGRandomWinner = isWinner;
15591 {
15593 stmt->SetData(0, GetGUID().GetCounter());
15594 CharacterDatabase.Execute(stmt);
15595 }
15596}
@ 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
1564{m_regenTimerCount = time;}

References m_regenTimerCount.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetRegularAttackTime()

void Player::SetRegularAttackTime ( )
5196{
5197 for (uint8 i = 0; i < MAX_ATTACK; ++i)
5198 {
5199 Item* tmpitem = GetWeaponForAttack(WeaponAttackType(i), true);
5200 if (tmpitem && !tmpitem->IsBroken())
5201 {
5202 ItemTemplate const* proto = tmpitem->GetTemplate();
5203 if (proto->Delay)
5205 }
5206 else
5207 SetAttackTime(WeaponAttackType(i), BASE_ATTACK_TIME); // If there is no weapon reset attack time to base (might have been changed from forms)
5208 }
5209}

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 
)
15216{
15217 GetReputationMgr().SetReputation(sFactionStore.LookupEntry(factionentry), value);
15218}
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)
10098{
10099 // Prevent resting on max level
10100 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
10101 rest_bonus_new = 0;
10102
10103 if (rest_bonus_new < 0)
10104 rest_bonus_new = 0;
10105
10106 float rest_bonus_max = (float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) * 1.5f / 2;
10107
10108 if (rest_bonus_new > rest_bonus_max)
10109 _restBonus = rest_bonus_max;
10110 else
10111 _restBonus = rest_bonus_new;
10112
10113 // update data for client
10114 if ((GetsRecruitAFriendBonus(true) && (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0)))
10116 else
10117 {
10118 if (_restBonus > 10)
10120 else if (_restBonus <= 1)
10122 }
10123
10124 //RestTickUpdate
10126}
@ PLAYER_REST_STATE_EXPERIENCE
Definition: UpdateFields.h:358
@ REST_STATE_RESTED
Definition: Player.h:976

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(), Object::SetUInt32Value(), and sWorld.

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

◆ SetRestFlag()

void Player::SetRestFlag ( RestFlag  restFlag,
uint32  triggerId = 0 
)
16032{
16033 uint32 oldRestMask = _restFlagMask;
16034 _restFlagMask |= restFlag;
16035
16036 if (!oldRestMask && _restFlagMask) // only set flag/time on the first rest state
16037 {
16038 _restTime = GameTime::GetGameTime().count();
16040 }
16041
16042 if (triggerId)
16043 _innTriggerId = triggerId;
16044}

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
2539{ m_drwGUID = guid; };

References m_drwGUID.

◆ SetSaveTimer()

void Player::SetSaveTimer ( uint32  timer)
inline
2305{ m_nextSave = timer; }

References m_nextSave.

◆ SetSeasonalQuestStatus()

void Player::SetSeasonalQuestStatus ( uint32  quest_id)
12040{
12041 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
12042 if (!quest)
12043 return;
12044
12045 m_seasonalquests[quest->GetEventIdForQuest()].insert(quest_id);
12047}
uint16 GetEventIdForQuest() const
Definition: QuestDef.h:329

References Quest::GetEventIdForQuest(), m_SeasonalQuestChanged, m_seasonalquests, and sObjectMgr.

Referenced by RewardQuest().

◆ SetSeer()

void Player::SetSeer ( WorldObject target)
inline
2298{ 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.

11450{
11452
11455}
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 
)
16138{
16139 sScriptMgr->OnSetServerSideVisibility(this, type, sec);
16140
16142}

References WorldObject::m_serverSideVisibility, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and sScriptMgr.

◆ SetServerSideVisibilityDetect()

void Player::SetServerSideVisibilityDetect ( ServerSideVisibilityType  type,
AccountTypes  sec 
)
16145{
16146 sScriptMgr->OnSetServerSideVisibilityDetect(this, type, sec);
16147
16149}

References WorldObject::m_serverSideVisibilityDetect, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and sScriptMgr.

◆ SetSession()

void Player::SetSession ( WorldSession sess)
inline
1949{ m_session = sess; }

References m_session.

Referenced by WorldSession::HandlePlayerLoginOpcode().

◆ SetSheath()

void Player::SetSheath ( SheathState  sheathed)
overridevirtual

Reimplemented from Unit.

110{
111 switch (sheathed)
112 {
113 case SHEATH_STATE_UNARMED: // no prepared weapon
114 SetVirtualItemSlot(0, nullptr);
115 SetVirtualItemSlot(1, nullptr);
116 SetVirtualItemSlot(2, nullptr);
117 break;
118 case SHEATH_STATE_MELEE: // prepared melee weapon
121 SetVirtualItemSlot(2, nullptr);
122 break;
123 case SHEATH_STATE_RANGED: // prepared ranged weapon
124 SetVirtualItemSlot(0, nullptr);
125 SetVirtualItemSlot(1, nullptr);
127 break;
128 default:
129 SetVirtualItemSlot(0, nullptr);
130 SetVirtualItemSlot(1, nullptr);
131 SetVirtualItemSlot(2, nullptr);
132 break;
133 }
134 Unit::SetSheath(sheathed); // this must visualize Sheath changing for other players...
135}
@ SHEATH_STATE_UNARMED
Definition: Unit.h:126
@ SHEATH_STATE_MELEE
Definition: Unit.h:127
@ SHEATH_STATE_RANGED
Definition: Unit.h:128
void SetVirtualItemSlot(uint8 i, Item *item)
Definition: PlayerStorage.cpp:89
virtual void SetSheath(SheathState sheathed)
Definition: Unit.h:1492

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 
)
5232{
5233 if (!id)
5234 return;
5235
5236 uint16 currVal;
5237 SkillStatusMap::iterator itr = mSkillStatus.find(id);
5238
5239 //has skill
5240 if (itr != mSkillStatus.end() && itr->second.uState != SKILL_DELETED)
5241 {
5242 currVal = SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos)));
5243 if (newVal)
5244 {
5245 // if skill value is going down, update enchantments before setting the new value
5246 if (newVal < currVal)
5247 UpdateSkillEnchantments(id, currVal, newVal);
5248 // update step
5249 SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), MAKE_PAIR32(id, step));
5250 // update value
5251 SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos), MAKE_SKILL_VALUE(newVal, maxVal));
5252 if (itr->second.uState != SKILL_NEW)
5253 itr->second.uState = SKILL_CHANGED;
5254 learnSkillRewardedSpells(id, newVal);
5255 // if skill value is going up, update enchantments after setting the new value
5256 if (newVal > currVal)
5257 UpdateSkillEnchantments(id, currVal, newVal);
5260 }
5261 else //remove
5262 {
5263 //remove enchantments needing this skill
5264 UpdateSkillEnchantments(id, currVal, 0);
5265 // clear skill fields
5266 SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), 0);
5267 SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos), 0);
5268 SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos), 0);
5269
5270 // mark as deleted or simply remove from map if not saved yet
5271 if (itr->second.uState != SKILL_NEW)
5272 itr->second.uState = SKILL_DELETED;
5273 else
5274 mSkillStatus.erase(itr);
5275
5276 // remove all spells that related to this skill
5277 for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j)
5278 if (SkillLineAbilityEntry const* pAbility = sSkillLineAbilityStore.LookupEntry(j))
5279 if (pAbility->SkillLine == id)
5280 removeSpell(sSpellMgr->GetFirstSpellInChain(pAbility->Spell), SPEC_MASK_ALL, false);
5281 }
5282 }
5283 else if (newVal) //add
5284 {
5285 currVal = 0;
5286 for (int i = 0; i < PLAYER_MAX_SKILLS; ++i)
5288 {
5289 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(id);
5290 if (!pSkill)
5291 {
5292 LOG_ERROR("entities.player", "Skill not found in SkillLineStore: skill #{}", id);
5293 return;
5294 }
5295
5298 UpdateSkillEnchantments(id, currVal, newVal);
5299
5300 // insert new entry or update if not deleted old entry yet
5301 if (itr != mSkillStatus.end())
5302 {
5303 itr->second.pos = i;
5304 itr->second.uState = SKILL_CHANGED;
5305 }
5306 else
5307 mSkillStatus.insert(SkillStatusMap::value_type(id, SkillStatusData(i, SKILL_NEW)));
5308
5309 // apply skill bonuses
5311
5312 // temporary bonuses
5314 for (AuraEffectList::const_iterator j = mModSkill.begin(); j != mModSkill.end(); ++j)
5315 if ((*j)->GetMiscValue() == int32(id))
5316 (*j)->HandleEffect(this, AURA_EFFECT_HANDLE_SKILL, true);
5317
5318 // permanent bonuses
5320 for (AuraEffectList::const_iterator j = mModSkillTalent.begin(); j != mModSkillTalent.end(); ++j)
5321 if ((*j)->GetMiscValue() == int32(id))
5322 (*j)->HandleEffect(this, AURA_EFFECT_HANDLE_SKILL, true);
5323
5324 // Learn all spells for skill
5325 learnSkillRewardedSpells(id, newVal);
5328 return;
5329 }
5330 }
5331}
@ 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:131
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL
Definition: DBCEnums.h:160
void UpdateSkillEnchantments(uint16 skill_id, uint16 curr_value, uint16 new_value)
Definition: PlayerStorage.cpp:4707

References ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, AURA_EFFECT_HANDLE_SKILL, Unit::GetAuraEffectsByType(), 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(), Object::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_NEW, SKILL_VALUE, SPEC_MASK_ALL, SPELL_AURA_MOD_SKILL, SPELL_AURA_MOD_SKILL_TALENT, sSkillLineAbilityStore, sSkillLineStore, sSpellMgr, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by _addSpell(), Spell::EffectLearnSkill(), learn_commandscript::HandleLearnAllRecipesCommand(), misc_commandscript::HandleSetSkillCommand(), WorldSession::HandleUnlearnSkillOpcode(), LearnDefaultSkill(), and removeSpell().

◆ SetSpecsCount()

void Player::SetSpecsCount ( uint8  count)
inline
1698{ m_specsCount = count; }

References m_specsCount.

Referenced by UpdateSpecCount().

◆ SetSpellModTakingSpell()

void Player::SetSpellModTakingSpell ( Spell spell,
bool  apply 
)
9976{
9977 if (apply && m_spellModTakingSpell)
9978 {
9979 LOG_INFO("misc", "Player::SetSpellModTakingSpell (A1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id);
9980 return;
9981 //ASSERT(m_spellModTakingSpell == nullptr);
9982 }
9983 else if (!apply)
9984 {
9986 LOG_INFO("misc", "Player::SetSpellModTakingSpell (B1) - {}", spell->m_spellInfo->Id);
9987 else if (m_spellModTakingSpell != spell)
9988 {
9989 LOG_INFO("misc", "Player::SetSpellModTakingSpell (C1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id);
9990 return;
9991 }
9992 //ASSERT(m_spellModTakingSpell && m_spellModTakingSpell == spell);
9993 }
9994
9995 m_spellModTakingSpell = apply ? spell : nullptr;
9996}

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 
)
16200{
16201 m_summon_expire = GameTime::GetGameTime().count() + (delay ? delay : MAX_PLAYER_SUMMON_DELAY);
16202 m_summon_mapid = mapid;
16203 m_summon_x = x;
16204 m_summon_y = y;
16205 m_summon_z = z;
16206 m_summon_asSpectator = asSpectator;
16207}
#define MAX_PLAYER_SUMMON_DELAY
Definition: Player.h:921

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.

1597{ }

◆ SetTaxiCheater()

void Player::SetTaxiCheater ( bool  on)
inline

◆ setTeamId()

void Player::setTeamId ( TeamId  teamid)
inline
2061{ m_team = teamid; };

References m_team.

◆ SetTemporaryUnsummonedPetNumber()

void Player::SetTemporaryUnsummonedPetNumber ( uint32  petnumber)
inline

◆ SetTitle()

void Player::SetTitle ( CharTitlesEntry const *  title,
bool  lost = false 
)
13229{
13230 uint32 fieldIndexOffset = title->bit_index / 32;
13231 uint32 flag = 1 << (title->bit_index % 32);
13232
13233 if (lost)
13234 {
13235 if (!HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag))
13236 return;
13237
13238 // Clear the current title if it is the one being removed.
13239 if (title->bit_index == GetUInt32Value(PLAYER_CHOSEN_TITLE))
13240 {
13241 SetCurrentTitle(nullptr, true);
13242 }
13243
13244 RemoveFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13245 }
13246 else
13247 {
13248 if (HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag))
13249 return;
13250
13251 SetFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13252 }
13253
13254 WorldPacket data(SMSG_TITLE_EARNED, 4 + 4);
13255 data << uint32(title->bit_index);
13256 data << uint32(lost ? 0 : 1); // 1 - earned, 0 - lost
13257 GetSession()->SendPacket(&data);
13258}
@ SMSG_TITLE_EARNED
Definition: Opcodes.h:913
void SetCurrentTitle(CharTitlesEntry const *title, bool clear=false)
Definition: Player.h:2491

References CharTitlesEntry::bit_index, GetSession(), Object::GetUInt32Value(), Object::HasFlag(), PLAYER__FIELD_KNOWN_TITLES, PLAYER_CHOSEN_TITLE, Object::RemoveFlag(), WorldSession::SendPacket(), SetCurrentTitle(), Object::SetFlag(), and SMSG_TITLE_EARNED.

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 
)
13063{
13064 if (apply)
13065 {
13066 LOG_DEBUG("maps", "Player::CreateViewpoint: Player {} create seer {} (TypeId: {}).", GetName(), target->GetEntry(), target->GetTypeId());
13067
13068 if (!AddGuidValue(PLAYER_FARSIGHT, target->GetGUID()))
13069 {
13070 LOG_DEBUG("entities.player", "Player::CreateViewpoint: Player {} cannot add new viewpoint!", GetName());
13071 return;
13072 }
13073
13074 // farsight dynobj or puppet may be very far away
13075 UpdateVisibilityOf(target);
13076
13077 if (target->isType(TYPEMASK_UNIT) && !GetVehicle())
13078 ((Unit*)target)->AddPlayerToVision(this);
13079 SetSeer(target);
13080 }
13081 else
13082 {
13083 //must immediately set seer back otherwise may crash
13084 m_seer = this;
13085
13086 LOG_DEBUG("maps", "Player::CreateViewpoint: Player {} remove seer", GetName());
13087
13088 if (!RemoveGuidValue(PLAYER_FARSIGHT, target->GetGUID()))
13089 {
13090 LOG_DEBUG("entities.player", "Player::CreateViewpoint: Player {} cannot remove current viewpoint!", GetName());
13091 return;
13092 }
13093
13094 if (target->isType(TYPEMASK_UNIT) && !GetVehicle())
13095 static_cast<Unit*>(target)->RemovePlayerFromVision(this);
13096
13097 // must immediately set seer back otherwise may crash
13098 SetSeer(this);
13099
13100 //WorldPacket data(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, 0);
13101 //GetSession()->SendPacket(&data);
13102 }
13103}
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:2298
void UpdateVisibilityOf(WorldObject *target)
Definition: PlayerUpdates.cpp:1668

References Object::AddGuidValue(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), Unit::GetVehicle(), Object::isType(), LOG_DEBUG, m_seer, PLAYER_FARSIGHT, Object::RemoveGuidValue(), Unit::RemovePlayerFromVision(), SetSeer(), TYPEMASK_UNIT, 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
90{
91 ASSERT(i < 3);
92 if (i < 2 && item)
93 {
95 return;
97 if (charges == 0)
98 return;
99 if (charges > 1)
101 else if (charges <= 1)
102 {
105 }
106 }
107}

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  apply,
bool  packetOnly = false 
)
overridevirtual

movement counter

Reimplemented from Unit.

15845{
15846 // moved inside, flag can be removed on landing and wont send appropriate packet to client when aura is removed
15847 if (!packetOnly /* && !Unit::SetWaterWalking(apply)*/)
15848 {
15849 Unit::SetWaterWalking(apply);
15850 // return false;
15851 }
15852
15854 data << GetPackGUID();
15855 data << uint32(0);
15856 SendDirectMessage(&data);
15857
15858 data.Initialize(MSG_MOVE_WATER_WALK, 64);
15859 data << GetPackGUID();
15860 BuildMovementPacket(&data);
15861 SendMessageToSet(&data, false);
15862 return true;
15863}
@ MSG_MOVE_WATER_WALK
Definition: Opcodes.h:719
virtual bool SetWaterWalking(bool enable, bool packetOnly=false)
Definition: Unit.cpp:20874

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
1565{m_weaponChangeTimer = time;}

References m_weaponChangeTimer.

◆ SetWeeklyQuestStatus()

void Player::SetWeeklyQuestStatus ( uint32  quest_id)
12034{
12035 m_weeklyquests.insert(quest_id);
12036 m_WeeklyQuestChanged = true;
12037}

References m_WeeklyQuestChanged, and m_weeklyquests.

Referenced by RewardQuest().

◆ SpawnCorpseBones()

void Player::SpawnCorpseBones ( bool  triggerSave = true)
4588{
4590 if (GetMap()->ConvertCorpseToBones(GetGUID()))
4591 if (triggerSave && !GetSession()->PlayerLogoutWithSave()) // at logout we will already store the player
4592 {
4593 // prevent loading as ghost without corpse
4594 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4595
4596 // pussywizard: update only ghost flag instead of whole character table entry! data integrity is crucial
4598 stmt->SetData(0, GetGUID().GetCounter());
4599 trans->Append(stmt);
4600
4601 _SaveAuras(trans, false);
4602
4603 CharacterDatabase.CommitTransaction(trans);
4604 }
4605}
@ CHAR_UPD_CHAR_REMOVE_GHOST
Definition: CharacterDatabase.h:426

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)

3450{
3451 uint8 srcbag = src >> 8;
3452 uint8 srcslot = src & 255;
3453
3454 uint8 dstbag = dst >> 8;
3455 uint8 dstslot = dst & 255;
3456
3457 Item* pSrcItem = GetItemByPos(srcbag, srcslot);
3458 if (!pSrcItem)
3459 {
3460 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr);
3461 return;
3462 }
3463
3464 if (pSrcItem->m_lootGenerated) // prevent split looting item (item
3465 {
3466 //best error message found for attempting to split while looting
3468 return;
3469 }
3470
3471 // not let split all items (can be only at cheating)
3472 if (pSrcItem->GetCount() == count)
3473 {
3475 return;
3476 }
3477
3478 // not let split more existed items (can be only at cheating)
3479 if (pSrcItem->GetCount() < count)
3480 {
3482 return;
3483 }
3484
3486 if (TradeData* tradeData = GetTradeData())
3487 {
3489 if (tradeData->GetTradeSlotForItem(pSrcItem->GetGUID()) != TRADE_SLOT_INVALID)
3490 return;
3491 }
3492
3493 LOG_DEBUG("entities.player.items", "STORAGE: SplitItem bag = {}, slot = {}, item = {}, count = {}", dstbag, dstslot, pSrcItem->GetEntry(), count);
3494 Item* pNewItem = pSrcItem->CloneItem(count, this);
3495 if (!pNewItem)
3496 {
3497 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr);
3498 return;
3499 }
3500
3501 if (IsInventoryPos(dst))
3502 {
3503 // change item amount before check (for unique max count check)
3504 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3505
3506 ItemPosCountVec dest;
3507 InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pNewItem, false);
3508 if (msg != EQUIP_ERR_OK)
3509 {
3510 delete pNewItem;
3511 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3512 SendEquipError(msg, pSrcItem, nullptr);
3513 return;
3514 }
3515
3516 if (IsInWorld())
3517 pSrcItem->SendUpdateToPlayer(this);
3518 pSrcItem->SetState(ITEM_CHANGED, this);
3519 StoreItem(dest, pNewItem, true);
3520 }
3521 else if (IsBankPos(dst))
3522 {
3523 // change item amount before check (for unique max count check)
3524 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3525
3526 ItemPosCountVec dest;
3527 InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pNewItem, false);
3528 if (msg != EQUIP_ERR_OK)
3529 {
3530 delete pNewItem;
3531 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3532 SendEquipError(msg, pSrcItem, nullptr);
3533 return;
3534 }
3535
3536 if (IsInWorld())
3537 pSrcItem->SendUpdateToPlayer(this);
3538 pSrcItem->SetState(ITEM_CHANGED, this);
3539 BankItem(dest, pNewItem, true);
3540 }
3541 else if (IsEquipmentPos(dst))
3542 {
3543 // change item amount before check (for unique max count check), provide space for splitted items
3544 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3545
3546 uint16 dest;
3547 InventoryResult msg = CanEquipItem(dstslot, dest, pNewItem, false);
3548 if (msg != EQUIP_ERR_OK)
3549 {
3550 delete pNewItem;
3551 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3552 SendEquipError(msg, pSrcItem, nullptr);
3553 return;
3554 }
3555
3556 if (IsInWorld())
3557 pSrcItem->SendUpdateToPlayer(this);
3558 pSrcItem->SetState(ITEM_CHANGED, this);
3559 EquipItem(dest, pNewItem, true);
3561 }
3562}
@ EQUIP_ERR_COULDNT_SPLIT_ITEMS
Definition: Item.h:68
@ EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT
Definition: Item.h:67
@ TRADE_SLOT_INVALID
Definition: TradeData.h:32
TradeData * GetTradeData() const
Definition: Player.h:1344
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 
)
13804{
13805 m_achievementMgr->StartTimedAchievement(type, entry, timeLost);
13806}
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
Definition: AchievementMgr.cpp:2149

References m_achievementMgr, and AchievementMgr::StartTimedAchievement().

Referenced by Spell::_cast(), AddQuest(), Spell::DoSpellHitOnUnit(), BattlegroundWS::EventPlayerClickedOnFlag(), and KilledMonsterCredit().

◆ StopCastingBindSight()

void Player::StopCastingBindSight ( Aura except = nullptr)
13050{
13051 if (WorldObject* target = GetViewpoint())
13052 {
13053 if (target->isType(TYPEMASK_UNIT))
13054 {
13055 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID(), except);
13056 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID(), except);
13057 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, GetGUID(), except);
13058 }
13059 }
13060}
@ 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, SPELL_AURA_MOD_POSSESS_PET, and TYPEMASK_UNIT.

Referenced by ActivateTaxiPathTo(), misc_commandscript::HandleUnbindSightCommand(), RemoveFromWorld(), and Unit::SetCharmedBy().

◆ StopCastingCharm()

void Player::StopCastingCharm ( Aura except = nullptr)
9187{
9188 Unit* charm = GetCharm();
9189 if (!charm)
9190 {
9191 return;
9192 }
9193
9194 if (charm->GetTypeId() == TYPEID_UNIT)
9195 {
9197 {
9198 ((Puppet*)charm)->UnSummon();
9199 }
9200 else if (charm->IsVehicle())
9201 {
9202 ExitVehicle();
9203 }
9204 }
9205
9206 if (GetCharmGUID())
9207 {
9212 }
9213
9214 if (GetCharmGUID())
9215 {
9216 LOG_FATAL("entities.player", "Player {} ({} is not able to uncharm unit ({})", GetName(), GetGUID().ToString(), GetCharmGUID().ToString());
9217
9218 if (charm->GetCharmerGUID())
9219 {
9220 LOG_FATAL("entities.player", "Charmed unit has charmer {}", charm->GetCharmerGUID().ToString());
9221 ABORT();
9222 }
9223 else
9224 {
9225 SetCharm(charm, false);
9226 }
9227 }
9228}
#define ABORT
Definition: Errors.h:76
@ UNIT_MASK_PUPPET
Definition: Unit.h:681
@ SPELL_AURA_MOD_CHARM
Definition: SpellAuraDefines.h:69
@ SPELL_AURA_AOE_CHARM
Definition: SpellAuraDefines.h:240
Definition: TemporarySummon.h:114
bool IsVehicle() const
Definition: Unit.h:1416
void SetCharm(Unit *target, bool apply)
Definition: Unit.cpp:10831
ObjectGuid GetCharmGUID() const
Definition: Unit.h:1822

References ABORT, ObjectGuid::Empty, Unit::ExitVehicle(), Unit::GetCharm(), Unit::GetCharmerGUID(), Unit::GetCharmGUID(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), Unit::HasUnitTypeMask(), 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(), TYPEID_UNIT, 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 
)
2603{
2604 if (!pItem)
2605 return nullptr;
2606
2607 Item* lastItem = pItem;
2608 ItemTemplate const* proto = pItem->GetTemplate();
2609
2610 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end();)
2611 {
2612 uint16 pos = itr->pos;
2613 uint32 count = itr->count;
2614
2615 ++itr;
2616
2617 if (itr == dest.end())
2618 {
2619 lastItem = _StoreItem(pos, pItem, count, false, update);
2620 break;
2621 }
2622
2623 lastItem = _StoreItem(pos, pItem, count, true, update);
2624 }
2625
2626 // cast after item storing - some checks in checkcast requires item to be present!!
2627 if (lastItem)
2628 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
2629 if (proto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE && proto->Spells[i].SpellId > 0) // On obtain trigger
2630 if (!HasAura(proto->Spells[i].SpellId))
2631 CastSpell(this, proto->Spells[i].SpellId, true, lastItem);
2632
2633 return lastItem;
2634}
Item * _StoreItem(uint16 pos, Item *pItem, uint32 count, bool clone, bool update)
Definition: PlayerStorage.cpp:2637

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 
)
13408{
13409 QuestItem* qitem = nullptr;
13410 QuestItem* ffaitem = nullptr;
13411 QuestItem* conditem = nullptr;
13412
13413 msg = EQUIP_ERR_OK;
13414
13415 LootItem* item = loot->LootItemInSlot(lootSlot, this, &qitem, &ffaitem, &conditem);
13416 if (!item || item->is_looted)
13417 {
13418 SendEquipError(EQUIP_ERR_ALREADY_LOOTED, nullptr, nullptr);
13419 return nullptr;
13420 }
13421
13422 // Xinef: exploit protection, dont allow to loot normal items if player is not master loot and not below loot threshold
13423 // Xinef: only quest, ffa and conditioned items
13424 if (!item->is_underthreshold && loot->roundRobinPlayer && !GetLootGUID().IsItem() && GetGroup() && GetGroup()->GetLootMethod() == MASTER_LOOT && GetGUID() != GetGroup()->GetMasterLooterGuid())
13425 if (!qitem && !ffaitem && !conditem)
13426 {
13428 return nullptr;
13429 }
13430
13431 if (!item->AllowedForPlayer(this, loot->sourceWorldObjectGUID))
13432 {
13434 return nullptr;
13435 }
13436
13437 // questitems use the blocked field for other purposes
13438 if (!qitem && item->is_blocked)
13439 {
13441 return nullptr;
13442 }
13443
13444 // xinef: dont allow protected item to be looted by someone else
13445 if (item->rollWinnerGUID && item->rollWinnerGUID != GetGUID())
13446 {
13448 return nullptr;
13449 }
13450
13451 ItemPosCountVec dest;
13452 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count);
13453 if (msg == EQUIP_ERR_OK)
13454 {
13455 AllowedLooterSet looters = item->GetAllowedLooters();
13456 Item* newitem = StoreNewItem(dest, item->itemid, true, item->randomPropertyId, looters);
13457
13458 if (qitem)
13459 {
13460 qitem->is_looted = true;
13461 //freeforall is 1 if everyone's supposed to get the quest item.
13462 if (item->freeforall || loot->GetPlayerQuestItems().size() == 1)
13463 SendNotifyLootItemRemoved(lootSlot);
13464 else
13465 loot->NotifyQuestItemRemoved(qitem->index);
13466 }
13467 else
13468 {
13469 if (ffaitem)
13470 {
13471 //freeforall case, notify only one player of the removal
13472 ffaitem->is_looted = true;
13473 SendNotifyLootItemRemoved(lootSlot);
13474 }
13475 else
13476 {
13477 //not freeforall, notify everyone
13478 if (conditem)
13479 conditem->is_looted = true;
13480 loot->NotifyItemRemoved(lootSlot);
13481 }
13482 }
13483
13484 //if only one person is supposed to loot the item, then set it to looted
13485 if (!item->freeforall)
13486 item->is_looted = true;
13487
13488 --loot->unlootedCount;
13489
13490 SendNewItem(newitem, uint32(item->count), false, false, true);
13491 UpdateLootAchievements(item, loot);
13492
13493 // LootItem is being removed (looted) from the container, delete it from the DB.
13494 if (loot->containerGUID)
13495 sLootItemStorage->RemoveStoredLootItem(loot->containerGUID, item->itemid, item->count, loot, item->itemIndex);
13496
13497 sScriptMgr->OnLootItem(this, newitem, item->count, this->GetLootGUID());
13498 }
13499 else
13500 {
13501 SendEquipError(msg, nullptr, nullptr, item->itemid);
13502 }
13503
13504 return item;
13505}
void UpdateLootAchievements(LootItem *item, Loot *loot)
Definition: PlayerUpdates.cpp:2118
void SendNotifyLootItemRemoved(uint8 lootSlot)
Definition: Player.cpp:8057
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:781
QuestItemMap const & GetPlayerQuestItems() const
Definition: LootMgr.h:316
void NotifyItemRemoved(uint8 lootIndex)
Definition: LootMgr.cpp:750

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, 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 
)
2560{
2561 uint32 count = 0;
2562 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr)
2563 count += itr->count;
2564
2565 Item* pItem = Item::CreateItem(item, count, this, false, randomPropertyId);
2566 if (pItem)
2567 {
2568 // pussywizard: obtaining blue or better items saves to db
2569 if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item))
2570 if (pProto->Quality >= ITEM_QUALITY_RARE)
2572
2573 ItemAddedQuestCheck(item, count);
2576 pItem = StoreItem(dest, pItem, update);
2577
2578 if (allowedLooters.size() > 1 && pItem->GetTemplate()->GetMaxStackSize() == 1 && pItem->IsSoulBound() && sWorld->getBoolConfig(CONFIG_SET_BOP_ITEM_TRADEABLE))
2579 {
2580 pItem->SetSoulboundTradeable(allowedLooters);
2582 AddTradeableItem(pItem);
2583
2584 // save data
2585 std::ostringstream ss;
2586 AllowedLooterSet::const_iterator itr = allowedLooters.begin();
2587 ss << (*itr).GetCounter();
2588 for (++itr; itr != allowedLooters.end(); ++itr)
2589 ss << ' ' << (*itr).GetCounter();
2590
2592 stmt->SetData(0, pItem->GetGUID().GetCounter());
2593 stmt->SetData(1, ss.str());
2594 CharacterDatabase.Execute(stmt);
2595 }
2596
2597 sScriptMgr->OnStoreNewItem(this, pItem, count);
2598 }
2599 return pItem;
2600}
@ CHAR_INS_ITEM_BOP_TRADE
Definition: CharacterDatabase.h:122
@ ITEM_FIELD_CREATE_PLAYED_TIME
Definition: UpdateFields.h:71
@ CONFIG_SET_BOP_ITEM_TRADEABLE
Definition: IWorld.h:170
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM
Definition: DBCEnums.h:156

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 
)
12320{
12321 if (!agree)
12322 {
12323 m_summon_expire = 0;
12324 return;
12325 }
12326
12327 // expire and auto declined
12328 if (m_summon_expire < GameTime::GetGameTime().count())
12329 return;
12330
12331 // drop flag at summon
12332 // 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
12333 if (Battleground* bg = GetBattleground())
12334 bg->EventPlayerDroppedFlag(this);
12335
12336 m_summon_expire = 0;
12337
12339
12341}
@ ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS
Definition: DBCEnums.h:226
Player * FindPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:250

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 
)
8808{
8809 PetStable& petStable = GetOrInitPetStable();
8810
8811 Pet* pet = new Pet(this, petType);
8812
8813 if (petType == SUMMON_PET && pet->LoadPetFromDB(this, entry, 0, false, healthPct))
8814 {
8815 // Remove Demonic Sacrifice auras (known pet)
8817 for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
8818 {
8819 if ((*itr)->GetMiscValue() == 2228)
8820 {
8821 RemoveAurasDueToSpell((*itr)->GetId());
8822 itr = auraClassScripts.begin();
8823 }
8824 else
8825 ++itr;
8826 }
8827
8828 if (duration > 0s)
8829 pet->SetDuration(duration);
8830
8831 // Generate a new name for the newly summoned ghoul
8832 if (pet->IsPetGhoul())
8833 {
8834 std::string new_name = sObjectMgr->GeneratePetNameLocale(entry, GetSession()->GetSessionDbLocaleIndex());
8835 if (!new_name.empty())
8836 pet->SetName(new_name);
8837 }
8838
8839 return nullptr;
8840 }
8841
8842 // petentry == 0 for hunter "call pet" (current pet summoned if any)
8843 if (!entry)
8844 {
8845 delete pet;
8846 return nullptr;
8847 }
8848
8849 pet->Relocate(x, y, z, ang);
8850 if (!pet->IsPositionValid())
8851 {
8852 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());
8853 delete pet;
8854 return nullptr;
8855 }
8856
8857 Map* map = GetMap();
8858 uint32 pet_number = sObjectMgr->GeneratePetNumber();
8859 if (!pet->Create(map->GenerateLowGuid<HighGuid::Pet>(), map, GetPhaseMask(), entry, pet_number))
8860 {
8861 LOG_ERROR("misc", "Player::SummonPet: No such creature entry {}", entry);
8862 delete pet;
8863 return nullptr;
8864 }
8865
8866 if (petType == SUMMON_PET && petStable.CurrentPet)
8868
8869 pet->SetCreatorGUID(GetGUID());
8870 pet->SetFaction(GetFaction());
8875
8876 SetMinion(pet, true);
8877
8878 if (petType == SUMMON_PET)
8879 {
8881 {
8882 pet->GetCharmInfo()->SetPetNumber(pet_number, true); // Show pet details tab (Shift+P) only for demons & undead
8883 }
8884 else
8885 {
8886 pet->GetCharmInfo()->SetPetNumber(pet_number, false);
8887 }
8888
8892 pet->SetFullHealth();
8894 pet->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped in this case
8895 }
8896
8897 map->AddToMap(pet->ToCreature(), true);
8898
8899 ASSERT(!petStable.CurrentPet && (petType != HUNTER_PET || !petStable.GetUnslottedHunterPet()));
8900 pet->FillPetInfo(&petStable.CurrentPet.emplace());
8901
8902 if (petType == SUMMON_PET)
8903 {
8904 pet->InitPetCreateSpells();
8905 pet->InitTalentForLevel();
8908
8909 // Remove Demonic Sacrifice auras (known pet)
8911 for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
8912 {
8913 if ((*itr)->GetMiscValue() == 2228)
8914 {
8915 RemoveAurasDueToSpell((*itr)->GetId());
8916 itr = auraClassScripts.begin();
8917 }
8918 else
8919 ++itr;
8920 }
8921 }
8922
8923 if (duration > 0s)
8924 pet->SetDuration(duration);
8925
8927 {
8930 }
8931
8932 return pet;
8933}
@ 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: Unit.h:515
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition: SpellAuraDefines.h:175
@ CREATURE_TYPE_UNDEAD
Definition: SharedDefines.h:2605
@ CREATURE_TYPE_DEMON
Definition: SharedDefines.h:2602
uint32 type
Definition: CreatureData.h:215
bool IsPetGhoul() const
Definition: TemporarySummon.h:84
bool InitStatsForLevel(uint8 level)
Definition: Pet.cpp:1009
void SetName(std::string const &newname)
Definition: Object.h:447
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition: Pet.cpp:2417
bool Create(ObjectGuid::LowType guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 pet_number)
Definition: Pet.cpp:2261
void SetDuration(Milliseconds dur)
Definition: Pet.h:89
void InitPetCreateSpells()
Definition: Pet.cpp:2011
PetStable & GetOrInitPetStable()
Definition: Player.cpp:15464
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition: Unit.cpp:15940
float GetHealthPct() const
Definition: Unit.h:1448
void ReplaceAllNpcFlags(NPCFlags flags)
Definition: Unit.h:1649
ObjectGuid::LowType GenerateLowGuid()
Definition: Map.h:632

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(), Object::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 
)
3565{
3566 uint8 srcbag = src >> 8;
3567 uint8 srcslot = src & 255;
3568
3569 uint8 dstbag = dst >> 8;
3570 uint8 dstslot = dst & 255;
3571
3572 Item* pSrcItem = GetItemByPos(srcbag, srcslot);
3573 Item* pDstItem = GetItemByPos(dstbag, dstslot);
3574
3575 if (!pSrcItem)
3576 return;
3577
3578 LOG_DEBUG("entities.player.items", "STORAGE: SwapItem bag = {}, slot = {}, item = {}", dstbag, dstslot, pSrcItem->GetEntry());
3579
3580 if (!IsAlive())
3581 {
3582 SendEquipError(EQUIP_ERR_YOU_ARE_DEAD, pSrcItem, pDstItem);
3583 return;
3584 }
3585
3586 // SRC checks
3587
3588 if (GetLootGUID() == pSrcItem->GetGUID()) // prevent swap looting item
3589 {
3590 //best error message found for attempting to swap while looting
3591 SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pSrcItem, nullptr);
3592 return;
3593 }
3594
3595 // check unequip potability for equipped items and bank bags
3596 if (IsEquipmentPos(src) || IsBagPos(src))
3597 {
3598 // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
3599 InventoryResult msg = CanUnequipItem(src, !IsBagPos(src) || IsBagPos(dst) || (pDstItem && pDstItem->ToBag() && pDstItem->ToBag()->IsEmpty()));
3600 if (msg != EQUIP_ERR_OK)
3601 {
3602 SendEquipError(msg, pSrcItem, pDstItem);
3603 return;
3604 }
3605 }
3606
3607 // anti-wpe
3608 if (pSrcItem->IsBag() && pSrcItem->IsNotEmptyBag() && !IsBagPos(dst))
3609 {
3611 return;
3612 }
3613
3614 // prevent put equipped/bank bag in self
3615 if (IsBagPos(src) && srcslot == dstbag)
3616 {
3618 return;
3619 }
3620
3621 // prevent equipping bag in the same slot from its inside
3622 if (IsBagPos(dst) && srcbag == dstslot)
3623 {
3625 return;
3626 }
3627
3628 // DST checks
3629
3630 if (pDstItem)
3631 {
3632 // Xinef: Removed next loot generated check
3633 if (pDstItem->GetGUID() == GetLootGUID()) // prevent swap looting item
3634 {
3635 //best error message found for attempting to swap while looting
3636 SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pDstItem, nullptr);
3637 return;
3638 }
3639
3640 // check unequip potability for equipped items and bank bags
3641 if (IsEquipmentPos(dst) || IsBagPos(dst))
3642 {
3643 // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
3644 InventoryResult msg = CanUnequipItem(dst, !IsBagPos(dst) || IsBagPos(src) || (pSrcItem->ToBag() && pSrcItem->ToBag()->IsEmpty()));
3645 if (msg != EQUIP_ERR_OK)
3646 {
3647 SendEquipError(msg, pSrcItem, pDstItem);
3648 return;
3649 }
3650 }
3651 }
3652
3653 // NOW this is or item move (swap with empty), or swap with another item (including bags in bag possitions)
3654 // or swap empty bag with another empty or not empty bag (with items exchange)
3655
3656 // Move case
3657 if (!pDstItem)
3658 {
3659 if (IsInventoryPos(dst))
3660 {
3661 ItemPosCountVec dest;
3662 InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pSrcItem, false);
3663 if (msg != EQUIP_ERR_OK)
3664 {
3665 SendEquipError(msg, pSrcItem, nullptr);
3666 return;
3667 }
3668
3669 RemoveItem(srcbag, srcslot, true);
3670 StoreItem(dest, pSrcItem, true);
3672 if (IsBankPos(src))
3673 ItemAddedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
3674 }
3675 else if (IsBankPos(dst))
3676 {
3677 ItemPosCountVec dest;
3678 InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pSrcItem, false);
3679 if (msg != EQUIP_ERR_OK)
3680 {
3681 SendEquipError(msg, pSrcItem, nullptr);
3682 return;
3683 }
3684
3685 RemoveItem(srcbag, srcslot, true);
3686 BankItem(dest, pSrcItem, true);
3688 ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
3689 }
3690 else if (IsEquipmentPos(dst))
3691 {
3692 uint16 dest;
3693 InventoryResult msg = CanEquipItem(dstslot, dest, pSrcItem, false);
3694 if (msg != EQUIP_ERR_OK)
3695 {
3696 SendEquipError(msg, pSrcItem, nullptr);
3697 return;
3698 }
3699
3700 RemoveItem(srcbag, srcslot, true);
3701 EquipItem(dest, pSrcItem, true);
3703 }
3704
3705 return;
3706 }
3707
3708 // attempt merge to / fill target item
3709 if (!pSrcItem->IsBag() && !pDstItem->IsBag())
3710 {
3711 InventoryResult msg;
3712 ItemPosCountVec sDest;
3713 uint16 eDest = 0;
3714 if (IsInventoryPos(dst))
3715 msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, false);
3716 else if (IsBankPos(dst))
3717 msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, false);
3718 else if (IsEquipmentPos(dst))
3719 msg = CanEquipItem(dstslot, eDest, pSrcItem, false);
3720 else
3721 return;
3722
3723 // can be merge/fill
3724 if (msg == EQUIP_ERR_OK)
3725 {
3726 if (pSrcItem->GetCount() + pDstItem->GetCount() <= pSrcItem->GetTemplate()->GetMaxStackSize())
3727 {
3728 RemoveItem(srcbag, srcslot, true);
3729
3730 if (IsInventoryPos(dst))
3731 StoreItem(sDest, pSrcItem, true);
3732 else if (IsBankPos(dst))
3733 BankItem(sDest, pSrcItem, true);
3734 else if (IsEquipmentPos(dst))
3735 {
3736 EquipItem(eDest, pSrcItem, true);
3738 }
3739 }
3740 else
3741 {
3742 pSrcItem->SetCount(pSrcItem->GetCount() + pDstItem->GetCount() - pSrcItem->GetTemplate()->GetMaxStackSize());
3743 pDstItem->SetCount(pSrcItem->GetTemplate()->GetMaxStackSize());
3744 pSrcItem->SetState(ITEM_CHANGED, this);
3745 pDstItem->SetState(ITEM_CHANGED, this);
3746 if (IsInWorld())
3747 {
3748 pSrcItem->SendUpdateToPlayer(this);
3749 pDstItem->SendUpdateToPlayer(this);
3750 }
3751 }
3752 SendRefundInfo(pDstItem);
3753 return;
3754 }
3755 }
3756
3757 // Remove item enchantments for now and restore it later
3758 // Needed for swap sanity checks
3759 ApplyEnchantment(pSrcItem, false);
3760 if (pDstItem)
3761 {
3762 ApplyEnchantment(pDstItem, false);
3763 }
3764
3765 // impossible merge/fill, do real swap
3767
3768 // check src->dest move possibility
3769 ItemPosCountVec sDest;
3770 uint16 eDest = 0;
3771 if (IsInventoryPos(dst))
3772 msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, true);
3773 else if (IsBankPos(dst))
3774 msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, true);
3775 else if (IsEquipmentPos(dst))
3776 {
3777 msg = CanEquipItem(dstslot, eDest, pSrcItem, true);
3778 if (msg == EQUIP_ERR_OK)
3779 msg = CanUnequipItem(eDest, true);
3780 }
3781
3782 if (msg != EQUIP_ERR_OK)
3783 {
3784 // Restore enchantments
3785 ApplyEnchantment(pSrcItem, true);
3786 if (pDstItem)
3787 {
3788 ApplyEnchantment(pDstItem, true);
3789 }
3790
3791 SendEquipError(msg, pSrcItem, pDstItem);
3792 return;
3793 }
3794
3795 // check dest->src move possibility
3796 ItemPosCountVec sDest2;
3797 uint16 eDest2 = 0;
3798 if (IsInventoryPos(src))
3799 msg = CanStoreItem(srcbag, srcslot, sDest2, pDstItem, true);
3800 else if (IsBankPos(src))
3801 msg = CanBankItem(srcbag, srcslot, sDest2, pDstItem, true);
3802 else if (IsEquipmentPos(src))
3803 {
3804 msg = CanEquipItem(srcslot, eDest2, pDstItem, true);
3805 if (msg == EQUIP_ERR_OK)
3806 msg = CanUnequipItem(eDest2, true);
3807 }
3808
3809 if (msg != EQUIP_ERR_OK)
3810 {
3811 // Restore enchantments
3812 ApplyEnchantment(pSrcItem, true);
3813 if (pDstItem)
3814 {
3815 ApplyEnchantment(pDstItem, true);
3816 }
3817
3818 SendEquipError(msg, pDstItem, pSrcItem);
3819 return;
3820 }
3821
3822 // Restore enchantments
3823 ApplyEnchantment(pSrcItem, true);
3824 if (pDstItem)
3825 {
3826 ApplyEnchantment(pDstItem, true);
3827 }
3828
3829 // Check bag swap with item exchange (one from empty in not bag possition (equipped (not possible in fact) or store)
3830 if (Bag* srcBag = pSrcItem->ToBag())
3831 {
3832 if (Bag* dstBag = pDstItem->ToBag())
3833 {
3834 Bag* emptyBag = nullptr;
3835 Bag* fullBag = nullptr;
3836 if (srcBag->IsEmpty() && !IsBagPos(src))
3837 {
3838 emptyBag = srcBag;
3839 fullBag = dstBag;
3840 }
3841 else if (dstBag->IsEmpty() && !IsBagPos(dst))
3842 {
3843 emptyBag = dstBag;
3844 fullBag = srcBag;
3845 }
3846
3847 // bag swap (with items exchange) case
3848 if (emptyBag && fullBag)
3849 {
3850 ItemTemplate const* emptyProto = emptyBag->GetTemplate();
3851
3852 uint32 count = 0;
3853
3854 for (uint32 i = 0; i < fullBag->GetBagSize(); ++i)
3855 {
3856 Item* bagItem = fullBag->GetItemByPos(i);
3857 if (!bagItem)
3858 continue;
3859
3860 ItemTemplate const* bagItemProto = bagItem->GetTemplate();
3861 if (!bagItemProto || !ItemCanGoIntoBag(bagItemProto, emptyProto))
3862 {
3863 // one from items not go to empty target bag
3865 return;
3866 }
3867
3868 ++count;
3869 }
3870
3871 if (count > emptyBag->GetBagSize())
3872 {
3873 // too small targeted bag
3875 return;
3876 }
3877
3878 // Items swap
3879 count = 0; // will pos in new bag
3880 for (uint32 i = 0; i < fullBag->GetBagSize(); ++i)
3881 {
3882 Item* bagItem = fullBag->GetItemByPos(i);
3883 if (!bagItem)
3884 continue;
3885
3886 fullBag->RemoveItem(i, true);
3887 emptyBag->StoreItem(count, bagItem, true);
3888 bagItem->SetState(ITEM_CHANGED, this);
3889
3890 ++count;
3891 }
3892 }
3893 }
3894 }
3895
3896 // now do moves, remove...
3897 RemoveItem(dstbag, dstslot, false, true);
3898 RemoveItem(srcbag, srcslot, false, true);
3899
3900 // add to dest
3901 if (IsInventoryPos(dst))
3902 StoreItem(sDest, pSrcItem, true);
3903 else if (IsBankPos(dst))
3904 BankItem(sDest, pSrcItem, true);
3905 else if (IsEquipmentPos(dst))
3906 EquipItem(eDest, pSrcItem, true);
3907
3908 // add to src
3909 if (IsInventoryPos(src))
3910 StoreItem(sDest2, pDstItem, true);
3911 else if (IsBankPos(src))
3912 BankItem(sDest2, pDstItem, true);
3913 else if (IsEquipmentPos(src))
3914 EquipItem(eDest2, pDstItem, true);
3915
3916 // Xinef: Call this here after all needed items are equipped
3918
3919 // if player is moving bags and is looting an item inside this bag
3920 // release the loot
3921 if (GetLootGUID())
3922 {
3923 bool released = false;
3924 if (IsBagPos(src))
3925 {
3926 Bag* bag = pSrcItem->ToBag();
3927 for (uint32 i = 0; i < bag->GetBagSize(); ++i)
3928 {
3929 if (Item* bagItem = bag->GetItemByPos(i))
3930 {
3931 // Xinef: Removed next loot generated check
3932 if (bagItem->GetGUID() == GetLootGUID())
3933 {
3935 released = true; // so we don't need to look at dstBag
3936 break;
3937 }
3938 }
3939 }
3940 }
3941
3942 if (!released && IsBagPos(dst))
3943 {
3944 Bag* bag = pDstItem->ToBag();
3945 for (uint32 i = 0; i < bag->GetBagSize(); ++i)
3946 {
3947 if (Item* bagItem = bag->GetItemByPos(i))
3948 {
3949 // Xinef: Removed next loot generated check
3950 if (bagItem->GetGUID() == GetLootGUID())
3951 {
3953 released = true; // not realy needed here
3954 break;
3955 }
3956 }
3957 }
3958 }
3959 }
3960
3962}
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:15401

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

◆ TakeQuestSourceItem()

bool Player::TakeQuestSourceItem ( uint32  questId,
bool  msg 
)
1361{
1362 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1363 if (quest)
1364 {
1365 uint32 srcItemId = quest->GetSrcItemId();
1366 ItemTemplate const* item = sObjectMgr->GetItemTemplate(srcItemId);
1367
1368 if (srcItemId > 0)
1369 {
1370 uint32 count = quest->GetSrcItemCount();
1371 if (count <= 0)
1372 count = 1;
1373
1374 // exist two cases when destroy source quest item not possible:
1375 // a) non un-equippable item (equipped non-empty bag, for example)
1376 // b) when quest is started from an item and item also is needed in
1377 // the end as RequiredItemId
1378 InventoryResult res = CanUnequipItems(srcItemId, count);
1379 if (res != EQUIP_ERR_OK)
1380 {
1381 if (msg)
1382 SendEquipError(res, nullptr, nullptr, srcItemId);
1383 return false;
1384 }
1385
1386 bool destroyItem = true;
1387 for (uint8 n = 0; n < QUEST_ITEM_OBJECTIVES_COUNT; ++n)
1388 if (item->StartQuest == questId && srcItemId == quest->RequiredItemId[n])
1389 destroyItem = false;
1390
1391 if (destroyItem)
1392 DestroyItemCount(srcItemId, count, true, true);
1393 }
1394 }
1395
1396 return true;
1397}
uint32 StartQuest
Definition: ItemTemplate.h:677
InventoryResult CanUnequipItems(uint32 item, uint32 count) const
Definition: PlayerStorage.cpp:304
uint32 GetSrcItemCount() const
Definition: QuestDef.h:256
uint32 GetSrcItemId() const
Definition: QuestDef.h:255

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 
)
2097{
2098 uint16 addTalkCount = 1;
2099 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2100 {
2101 uint32 questid = GetQuestSlotQuestId(i);
2102 if (!questid)
2103 continue;
2104
2105 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2106 if (!qInfo)
2107 continue;
2108
2109 QuestStatusData& q_status = m_QuestStatus[questid];
2110
2111 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2112 {
2114 {
2115 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
2116 {
2117 // skip Gameobject objectives
2118 if (qInfo->RequiredNpcOrGo[j] < 0)
2119 continue;
2120
2121 uint32 reqTarget = 0;
2122
2123 if (qInfo->RequiredNpcOrGo[j] > 0) // creature activate objectives
2124 // checked at quest_template loading
2125 reqTarget = qInfo->RequiredNpcOrGo[j];
2126 else
2127 continue;
2128
2129 if (reqTarget == entry)
2130 {
2131 uint32 reqTalkCount = qInfo->RequiredNpcOrGoCount[j];
2132 uint16 curTalkCount = q_status.CreatureOrGOCount[j];
2133 if (curTalkCount < reqTalkCount)
2134 {
2135 q_status.CreatureOrGOCount[j] = curTalkCount + addTalkCount;
2136
2137 m_QuestStatusSave[questid] = true;
2138
2139 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curTalkCount, addTalkCount);
2140 }
2141 if (CanCompleteQuest(questid))
2142 CompleteQuest(questid);
2143 else
2145
2146 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
2147 continue;
2148 }
2149 }
2150 }
2151 }
2152 }
2153}

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(), npcs_ashyen_and_keleth::OnGossipSelect(), and npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI().

◆ TeamIdForRace()

TeamId Player::TeamIdForRace ( uint8  race)
static
5732{
5733 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race))
5734 {
5735 switch (rEntry->TeamID)
5736 {
5737 case 1:
5738 return TEAM_HORDE;
5739 case 7:
5740 return TEAM_ALLIANCE;
5741 }
5742 LOG_ERROR("entities.player", "Race ({}) has wrong teamid ({}) in DBC: wrong DBC files?", uint32(race), rEntry->TeamID);
5743 }
5744 else
5745 LOG_ERROR("entities.player", "Race ({}) not found in DBC: wrong DBC files?", uint32(race));
5746
5747 return TEAM_ALLIANCE;
5748}

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 
)
1312{
1313 // for except kick by antispeedhack
1314 sScriptMgr->AnticheatSetSkipOnePacketForASH(this, true);
1315
1316 if (!MapMgr::IsValidMapCoord(mapid, x, y, z, orientation))
1317 {
1318 LOG_ERROR("entities.player", "TeleportTo: invalid map ({}) or invalid coordinates (X: {}, Y: {}, Z: {}, O: {}) given when teleporting player ({}, name: {}, map: {}, X: {}, Y: {}, Z: {}, O: {}).",
1319 mapid, x, y, z, orientation, GetGUID().ToString(), GetName(), GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
1320 return false;
1321 }
1322
1324 {
1325 LOG_ERROR("entities.player", "Player ({}, name: {}) tried to enter a forbidden map {}", GetGUID().ToString(), GetName(), mapid);
1327 return false;
1328 }
1329
1330 // preparing unsummon pet if lost (we must get pet before teleportation or will not find it later)
1331 Pet* pet = GetPet();
1332
1333 MapEntry const* mEntry = sMapStore.LookupEntry(mapid);
1334
1335 // don't let enter battlegrounds without assigned battleground id (for example through areatrigger)...
1336 if (!InBattleground() && mEntry->IsBattlegroundOrArena())
1337 return false;
1338
1339 // pussywizard: arena spectator, prevent teleporting from arena to instance/etc
1340 if (GetMapId() != mapid && IsSpectator() && mEntry->Instanceable())
1341 {
1343 return false;
1344 }
1345
1346 // client without expansion support
1347 if (GetSession()->Expansion() < mEntry->Expansion())
1348 {
1349 LOG_DEBUG("maps", "Player {} using client without required expansion tried teleport to non accessible map {}", GetName(), mapid);
1350
1351 if (GetTransport())
1352 {
1354 m_transport = nullptr;
1357 RepopAtGraveyard(); // teleport to near graveyard if on transport, looks blizz like :)
1358 }
1359
1361
1362 return false; // normal client can't teleport to this map...
1363 }
1364 else
1365 LOG_DEBUG("maps", "Player {} is being teleported to map {}", GetName(), mapid);
1366
1367 // xinef: do this here in case teleport failed in above checks
1368 if (!(options & TELE_TO_NOT_LEAVE_TAXI) && IsInFlight())
1369 {
1372 }
1373
1374 if (!(options & TELE_TO_NOT_LEAVE_VEHICLE) && m_vehicle)
1375 ExitVehicle();
1376
1377 // reset movement flags at teleport, because player will continue move with these flags after teleport
1379 DisableSpline();
1380
1381 // Xinef: Remove all movement imparing effects auras, skip small teleport like blink
1382 if (mapid != GetMapId() || GetDistance2d(x, y) > 100)
1383 {
1388 // remove auras that should be removed when being teleported
1390 }
1391
1392 if (m_transport)
1393 {
1394 if (options & TELE_TO_NOT_LEAVE_TRANSPORT)
1396 else
1397 {
1399 m_transport = nullptr;
1402 }
1403 }
1404
1405 // The player was ported to another map and loses the duel immediately.
1406 // We have to perform this check before the teleport, otherwise the
1407 // ObjectAccessor won't find the flag.
1410
1411 if (!sScriptMgr->OnBeforePlayerTeleport(this, mapid, x, y, z, orientation, options, target))
1412 return false;
1413
1414 if (GetMapId() == mapid && !newInstance)
1415 {
1416 //lets reset far teleport flag if it wasn't reset during chained teleports
1418
1419 SetHasDelayedTeleport(false); // pussywizard: current teleport cancels stored one
1420 //if teleport spell is casted in Unit::Update() func
1421 //then we need to delay it until update process will be finished
1422 if (MustDelayTeleport())
1423 {
1426 //lets save teleport destination for player
1427 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1428 teleportStore_options = options;
1429 return true;
1430 }
1431
1432 if (options & TELE_TO_WITH_PET)
1434
1435 if (!(options & TELE_TO_NOT_UNSUMMON_PET))
1436 {
1437 //same map, only remove pet if out of range for new position
1438 if (pet && !pet->IsWithinDist3d(x, y, z, GetMap()->GetVisibilityRange()))
1440 }
1441
1442 if (!(options & TELE_TO_NOT_LEAVE_COMBAT))
1443 CombatStop();
1444
1445 // this will be used instead of the current location in SaveToDB
1446 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1448
1449 // code for finish transfer called in WorldSession::HandleMovementOpcodes()
1450 // at client packet MSG_MOVE_TELEPORT_ACK
1452 // near teleport, triggering send MSG_MOVE_TELEPORT_ACK from client at landing
1453 if (!GetSession()->PlayerLogout())
1454 {
1455 SetCanTeleport(true);
1456 Position oldPos = GetPosition();
1457 Relocate(x, y, z, orientation);
1459 SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place
1460 }
1461 }
1462 else
1463 {
1464 if (getClass() == CLASS_DEATH_KNIGHT && GetMapId() == 609 && !IsGameMaster() && !HasSpell(50977))
1465 return false;
1466
1467 // far teleport to another map
1468 Map* oldmap = IsInWorld() ? GetMap() : nullptr;
1469 // check if we can enter before stopping combat / removing pet / totems / interrupting spells
1470
1471 // Check enter rights before map getting to avoid creating instance copy for player
1472 // this check not dependent from map instance copy and same for all instance copies of selected map
1473 if (!(options & TELE_TO_GM_MODE) && sMapMgr->PlayerCannotEnter(mapid, this, false))
1474 return false;
1475
1476 // if PlayerCannotEnter -> CanEnter: checked above
1477 {
1478 //lets reset near teleport flag if it wasn't reset during chained teleports
1480
1481 SetHasDelayedTeleport(false); // pussywizard: current teleport cancels stored one
1482 //if teleport spell is casted in Unit::Update() func
1483 //then we need to delay it until update process will be finished
1484 if (MustDelayTeleport())
1485 {
1488 //lets save teleport destination for player
1489 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1490 teleportStore_options = options;
1491 return true;
1492 }
1493
1495
1496 CombatStop();
1497
1498 // remove arena spell coldowns/buffs now to also remove pet's cooldowns before it's temporarily unsummoned
1500 {
1501 // KEEP THIS ORDER!
1503 if (pet)
1504 pet->RemoveArenaAuras();
1505
1507 }
1508
1509 // remove pet on map change
1510 if (pet)
1512
1513 // remove all dyn objects
1515
1516 // stop spellcasting
1517 // not attempt interrupt teleportation spell at caster teleport
1518 if (!(options & TELE_TO_SPELL))
1519 if (IsNonMeleeSpellCast(true))
1521
1522 //remove auras before removing from map...
1524
1525 if (!GetSession()->PlayerLogout())
1526 {
1527 // send transfer packets
1528 WorldPacket data(SMSG_TRANSFER_PENDING, 4 + 4 + 4);
1529 data << uint32(mapid);
1530 if (m_transport)
1531 data << m_transport->GetEntry() << GetMapId();
1532
1533 GetSession()->SendPacket(&data);
1534 }
1535
1536 // remove from old map now
1537 if (oldmap)
1538 oldmap->RemovePlayerFromMap(this, false);
1539
1540 // xinef: do this before setting fall information!
1541 if (IsMounted() && (!GetMap()->GetEntry()->IsDungeon() && !GetMap()->GetEntry()->IsBattlegroundOrArena()) && !m_transport)
1542 {
1544 if (!auras.empty())
1545 {
1546 SetMountBlockId((*auras.begin())->GetId());
1548 }
1549 }
1550
1551 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1553 // if the player is saved before worldportack (at logout for example)
1554 // this will be used instead of the current location in SaveToDB
1555
1556 if (!GetSession()->PlayerLogout())
1557 {
1558 SetCanTeleport(true);
1559 WorldPacket data(SMSG_NEW_WORLD, 4 + 4 + 4 + 4 + 4);
1560 data << uint32(mapid);
1561 if (m_transport)
1563 else
1565
1566 GetSession()->SendPacket(&data);
1568 }
1569
1570 // move packet sent by client always after far teleport
1571 // code for finish transfer to new map called in WorldSession::HandleMoveWorldportAckOpcode at client packet
1573 }
1574 }
1575 return true;
1576}
@ TELE_TO_WITH_PET
Definition: Player.h:820
@ TELE_TO_NOT_LEAVE_TAXI
Definition: Player.h:821
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition: Player.h:819
@ TELE_TO_SPELL
Definition: Player.h:818
@ TELE_TO_NOT_LEAVE_COMBAT
Definition: Player.h:816
@ TELE_TO_NOT_UNSUMMON_PET
Definition: Player.h:817
@ TELE_TO_GM_MODE
Definition: Player.h:814
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition: Player.h:815
@ TRANSFER_ABORT_MAP_NOT_ALLOWED
Definition: Player.h:791
@ MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE
Movement flags that have change status opcodes associated for players.
Definition: Unit.h:601
@ SPELL_AURA_MOD_CONFUSE
Definition: SpellAuraDefines.h:68
@ AURA_INTERRUPT_FLAG_TELEPORTED
Definition: SpellDefines.h:66
@ AURA_INTERRUPT_FLAG_MOVE
Definition: SpellDefines.h:47
@ AURA_INTERRUPT_FLAG_TURNING
Definition: SpellDefines.h:48
@ 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:2527
void SendTeleportAckPacket()
Definition: Player.cpp:1302
void SetSelection(ObjectGuid guid)
Used for serverside target changes, does not apply to players.
Definition: Player.cpp:11449
void SendSavedInstances()
Definition: PlayerStorage.cpp:6578
void SetSemaphoreTeleportNear(time_t tm)
Definition: Player.h:2044
void SetHasDelayedTeleport(bool setting)
Definition: Player.h:2882
void SetSemaphoreTeleportFar(time_t tm)
Definition: Player.h:2045
bool MustDelayTeleport() const
Definition: Player.h:2879
void CleanupAfterTaxiFlight()
Definition: Player.cpp:10325
void RemoveArenaSpellCooldowns(bool removeActivePetCooldowns=false)
Definition: Player.cpp:3478
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
uint32 GetUnitMovementFlags() const
Definition: Unit.h:2275
Vehicle * m_vehicle
Definition: Unit.h:2534
void SendTeleportPacket(Position &pos)
Definition: Unit.cpp:20175
void SetUnitMovementFlags(uint32 f)
Definition: Unit.h:2276
void RemoveAllDynObjects()
Definition: Unit.cpp:6075
void RemoveArenaAuras()
Definition: Unit.cpp:5255
virtual void RemovePlayerFromMap(Player *, bool)
Definition: Map.cpp:914
bool IsBattleArena() const
Definition: DBCStructure.h:1339

References Unit::AddUnitMovementFlag(), AURA_INTERRUPT_FLAG_CHANGE_MAP, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TELEPORTED, AURA_INTERRUPT_FLAG_TURNING, CLASS_DEATH_KNIGHT, CleanupAfterTaxiFlight(), Unit::CombatStop(), DISABLE_TYPE_MAP, Unit::DisableSpline(), duel, DUEL_FLED, DuelComplete(), ObjectGuid::Empty, Unit::ExitVehicle(), MapEntry::Expansion(), Unit::GetAuraEffectsByType(), GetBattlegroundId(), Unit::getClass(), 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(), 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, 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
1074 {
1075 return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options, target);
1076 }

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.

9272{
9273 std::string _text(text);
9274
9275 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text))
9276 {
9277 return;
9278 }
9279
9280 sScriptMgr->OnPlayerChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text);
9281
9282 WorldPacket data;
9284
9286 {
9287 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true);
9288 }
9289 else
9290 {
9292 }
9293}
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE
Definition: IWorld.h:161
@ CONFIG_LISTEN_RANGE_TEXTEMOTE
Definition: IWorld.h:194
@ CHAT_MSG_EMOTE
Definition: SharedDefines.h:3134
@ LANG_UNIVERSAL
Definition: SharedDefines.h:707
void SendMessageToSetInRange_OwnTeam(WorldPacket const *data, float dist, bool self) const
Definition: Player.cpp:5585

References ChatHandler::BuildChatPacket(), CHAT_MSG_EMOTE, CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, LANG_UNIVERSAL, SendMessageToSetInRange(), SendMessageToSetInRange_OwnTeam(), 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.

9296{
9297 Talk(textId, CHAT_MSG_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
9298}

References CHAT_MSG_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToggleAFK()

void Player::ToggleAFK ( )
1273{
1275
1276 // afk player not allowed in battleground
1277 if (!IsGameMaster() && isAFK() && InBattleground())
1279}
void ToggleFlag(uint16 index, uint32 flag)
Definition: Object.cpp:877
void LeaveBattleground(Battleground *bg=nullptr)
Definition: Player.cpp:11216

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 
)
11147{
11148 //cycle all equipped items
11149 for (int slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
11150 {
11151 //enchants for the slot being socketed are handled by WorldSession::HandleSocketOpcode(WorldPacket& recvData)
11152 if (slot == exceptslot)
11153 continue;
11154
11155 Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
11156
11157 if (!pItem || !pItem->GetTemplate()->Socket[0].Color) //if item has no sockets or no item is equipped go to next item
11158 continue;
11159
11160 //cycle all (gem)enchants
11161 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
11162 {
11163 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11164 if (!enchant_id) //if no enchant go to next enchant(slot)
11165 continue;
11166
11167 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11168 if (!enchantEntry)
11169 continue;
11170
11171 //only metagems to be (de)activated, so only enchants with condition
11172 uint32 condition = enchantEntry->EnchantmentCondition;
11173 if (condition)
11174 ApplyEnchantment(pItem, EnchantmentSlot(enchant_slot), apply);
11175 }
11176 }
11177}

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)
4117{
4118 if (m_trade)
4119 {
4120 Player* trader = m_trade->GetTrader();
4121
4122 // send yellow "Trade canceled" message to both traders
4123 if (sendback)
4125
4126 trader->GetSession()->SendCancelTrade();
4127
4128 // cleanup
4129 delete m_trade;
4130 m_trade = nullptr;
4131 delete trader->m_trade;
4132 trader->m_trade = nullptr;
4133 }
4134}
void SendCancelTrade()
Definition: TradeHandler.cpp:528

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.
    Todo:
    Shouldn't we also check if there is no other invitees before disbanding the group?
2290{
2291 Group* group = GetGroupInvite();
2292 if (!group)
2293 return;
2294
2295 group->RemoveInvite(this);
2296
2297 if (group->GetMembersCount() <= 1) // group has just 1 member => disband
2298 {
2299 if (group->IsCreated())
2300 {
2301 group->Disband(true);
2302 group = nullptr; // gets deleted in disband
2303 }
2304 else
2305 {
2306 group->RemoveAllInvites();
2307 delete group;
2308 group = nullptr;
2309 }
2310 }
2311}
Group * GetGroupInvite()
Definition: Player.h:2416
bool IsCreated() const
Definition: Group.cpp:2225
void RemoveAllInvites()
Definition: Group.cpp:361
void Disband(bool hideDestroy=false)
Definition: Group.cpp:753
void RemoveInvite(Player *player)
Definition: Group.cpp:351

References Group::Disband(), GetGroupInvite(), 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.

51{
52 if (!IsInWorld())
53 return;
54
55 sScriptMgr->OnBeforePlayerUpdate(this, p_time);
56
57 // undelivered mail
59 {
62
63 // It will be recalculate at mailbox open (for unReadMails important
64 // non-0 until mailbox open, it also will be recalculated)
65 m_nextMailDelivereTime = time_t(0);
66 }
67
68 // Update cinematic location, if 500ms have passed and we're doing a
69 // cinematic now.
72 {
75 }
76
77 // used to implement delayed far teleports
79 Unit::Update(p_time);
81
82 time_t now = GameTime::GetGameTime().count();
83
84 UpdatePvPFlag(now);
86
87 UpdateContestedPvP(p_time);
88
89 UpdateDuelFlag(now);
90
92
93 UpdateAfkReport(now);
94
95 // Xinef: update charm AI only if we are controlled by creature or
96 // non-posses player charm
98 {
99 m_charmUpdateTimer += p_time;
100 if (m_charmUpdateTimer >= 1000)
101 {
103 if (Unit* charmer = GetCharmer())
104 if (charmer->IsAlive())
106 }
107 }
108
109 time_t lastTick = m_Last_tick;
110 if (now > m_Last_tick)
111 {
112 // Update items that have just a limited lifetime
114
115 // check every minute, less chance to crash and wont break anything.
117
118 // Played time
119 uint32 elapsed = uint32(now - m_Last_tick);
120 m_Played_time[PLAYED_TIME_TOTAL] += elapsed; // Total played time
121 m_Played_time[PLAYED_TIME_LEVEL] += elapsed; // Level played time
122 GetSession()->SetTotalTime(GetSession()->GetTotalTime() + elapsed);
123 m_Last_tick = now;
124 }
125
126 // If mute expired, remove it from the DB
127 if (GetSession()->m_muteTime && GetSession()->m_muteTime < now)
128 {
129 GetSession()->m_muteTime = 0;
131 LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
132 stmt->SetData(0, 0); // Set the mute time to 0
133 stmt->SetData(1, "");
134 stmt->SetData(2, "");
135 stmt->SetData(3, GetSession()->GetAccountId());
136 LoginDatabase.Execute(stmt);
137 }
138
139 if (!m_timedquests.empty())
140 {
141 QuestSet::iterator iter = m_timedquests.begin();
142 while (iter != m_timedquests.end())
143 {
144 QuestStatusData& q_status = m_QuestStatus[*iter];
145 if (q_status.Timer <= p_time)
146 {
147 uint32 quest_id = *iter;
148 ++iter; // current iter will be removed in FailQuest
149 FailQuest(quest_id);
150 }
151 else
152 {
153 q_status.Timer -= p_time;
154 m_QuestStatusSave[*iter] = true;
155 ++iter;
156 }
157 }
158 }
159
161
163 {
164 if (Unit* victim = GetVictim())
165 {
166 // default combat reach 10
168
170 {
171 if (!IsWithinMeleeRange(victim))
172 {
174 if (m_swingErrorMsg != 1) // send single time (client auto repeat)
175 {
177 m_swingErrorMsg = 1;
178 }
179 }
180 // 120 degrees of radiant range
181 else if (!HasInArc(2 * M_PI / 3, victim))
182 {
184 if (m_swingErrorMsg != 2) // send single time (client auto repeat)
185 {
187 m_swingErrorMsg = 2;
188 }
189 }
190 else
191 {
192 m_swingErrorMsg = 0; // reset swing error state
193
194 // prevent base and off attack in same time, delay attack at
195 // 0.2 sec
196 if (haveOffhandWeapon())
199
200 // do attack
203 }
204 }
205
207 {
208 if (!IsWithinMeleeRange(victim))
210 else if (!HasInArc(2 * M_PI / 3, victim))
212 else
213 {
214 // prevent base and off attack in same time, delay attack at
215 // 0.2 sec
218
219 // do attack
222 }
223 }
224
225 /*Unit* owner = victim->GetOwner();
226 Unit* u = owner ? owner : victim;
227 if (u->IsPvP() && (!duel || duel->opponent != u))
228 {
229 UpdatePvP(true);
230 RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
231 }*/
232 }
233 }
234
236 {
237 if (now > lastTick && _restTime > 0) // freeze update
238 {
239 time_t currTime = GameTime::GetGameTime().count();
240 time_t timeDiff = currTime - _restTime;
241 if (timeDiff >= 10) // freeze update
242 {
243 _restTime = currTime;
244
245 float bubble = 0.125f * sWorld->getRate(RATE_REST_INGAME);
246 float extraPerSec =
247 ((float) GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 72000.0f) *
248 bubble;
249
250 // speed collect rest bonus (section/in hour)
251 SetRestBonus(GetRestBonus() + timeDiff * extraPerSec);
252 }
253 }
254 }
255
256 if (m_weaponChangeTimer > 0)
257 {
258 if (p_time >= m_weaponChangeTimer)
260 else
261 m_weaponChangeTimer -= p_time;
262 }
263
264 if (!IsPositionValid()) // pussywizard: will crash below at eg. GetZoneAndAreaId
265 {
266 LOG_INFO("misc", "Player::Update - invalid position ({0:.1f}, {0:.1f}, {0:.1f})! Map: {}, MapId: {}, {}",
268 GetSession()->KickPlayer("Invalid position");
269 return;
270 }
271
272 if (m_zoneUpdateTimer > 0)
273 {
274 if (p_time >= m_zoneUpdateTimer)
275 {
276 // On zone update tick check if we are still in an inn if we are
277 // supposed to be in one
279 {
280 AreaTrigger const* atEntry = sObjectMgr->GetAreaTrigger(GetInnTriggerId());
281 if (!atEntry || !IsInAreaTriggerRadius(atEntry, 5.f))
282 {
284 }
285 }
286
287 uint32 newzone, newarea;
288 GetZoneAndAreaId(newzone, newarea);
289
290 if (m_zoneUpdateId != newzone)
291 UpdateZone(newzone, newarea); // also update area
292 else
293 {
294 // use area updates as well
295 // needed for free far all arenas for example
296 if (m_areaUpdateId != newarea)
297 UpdateArea(newarea);
298 }
299
301 }
302 else
303 m_zoneUpdateTimer -= p_time;
304 }
305
306 sScriptMgr->OnPlayerUpdate(this, p_time);
307
308 if (IsAlive())
309 {
310 m_regenTimer += p_time;
312 }
313
314 if (m_deathState == JUST_DIED)
315 KillPlayer();
316
317 if (m_nextSave)
318 {
319 if (p_time >= m_nextSave)
320 {
321 // m_nextSave reset in SaveToDB call
322 SaveToDB(false, false);
323 LOG_DEBUG("entities.player", "Player::Update: Player '{}' ({}) saved", GetName(), GetGUID().ToString());
324 }
325 else
326 {
327 m_nextSave -= p_time;
328 }
329 }
330
331 // Handle Water/drowning
332 HandleDrowning(p_time);
333
334 if (GetDrunkValue())
335 {
336 m_drunkTimer += p_time;
339 }
340
341 if (HasPendingBind())
342 {
343 if (_pendingBindTimer <= p_time)
344 {
345 // Player left the instance
348 SetPendingBind(0, 0);
349 }
350 else
351 _pendingBindTimer -= p_time;
352 }
353
354 // not auto-free ghost from body in instances
355 if (m_deathTimer > 0 && !GetMap()->Instanceable() &&
357 {
358 if (p_time >= m_deathTimer)
359 {
360 m_deathTimer = 0;
363 }
364 else
365 m_deathTimer -= p_time;
366 }
367
368 UpdateEnchantTime(p_time);
369 UpdateHomebindTime(p_time);
370
371 if (!_instanceResetTimes.empty())
372 {
373 for (InstanceTimeMap::iterator itr = _instanceResetTimes.begin();
374 itr != _instanceResetTimes.end();)
375 {
376 if (itr->second < now)
377 _instanceResetTimes.erase(itr++);
378 else
379 ++itr;
380 }
381 }
382
383 // group update
385
386 Pet* pet = GetPet();
387 if (pet && !pet->IsWithinDistInMap(this, GetMap()->GetVisibilityRange()) &&
388 !pet->isPossessed())
389 // if (pet && !pet->IsWithinDistInMap(this,
390 // GetMap()->GetVisibilityDistance()) && (GetCharmGUID() &&
391 // (pet->GetGUID()
392 // != GetCharmGUID())))
394
395 // pussywizard:
396 if (m_hostileReferenceCheckTimer <= p_time)
397 {
399 if (!GetMap()->IsDungeon())
402 }
403 else
405
406 // we should execute delayed teleports only for alive(!) players
407 // because we don't want player's ghost teleported from graveyard
408 // xinef: so we store it to the end of the world and teleport out of the ass
409 // after resurrection?
410 if (HasDelayedTeleport() /* && IsAlive()*/)
411 {
414 }
415
417 {
419 UpdateObjectVisibility(true, true);
422 }
423}
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition: Timer.h:131
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
Definition: DatabaseEnv.cpp:22
@ LOGIN_UPD_MUTE_TIME
Definition: LoginDatabase.h:71
@ NOTIFY_VISIBILITY_CHANGED
Definition: Object.h:64
constexpr auto CINEMATIC_UPDATEDIFF
Definition: CinematicMgr.h:24
constexpr auto ZONE_UPDATE_INTERVAL
Definition: PlayerUpdates.cpp:48
#define ATTACK_DISPLAY_DELAY
Definition: Unit.h:1238
@ UNIT_STATE_CHARGING
Definition: Unit.h:342
@ UNIT_STATE_CASTING
Definition: Unit.h:340
@ UNIT_FLAG_POSSESSED
Definition: Unit.h:472
@ RATE_REST_INGAME
Definition: IWorld.h:491
void UpdateTimedAchievements(uint32 timeDiff)
Definition: AchievementMgr.cpp:2127
void deleteReferencesOutOfRange(float range)
Definition: HostileRefMgr.cpp:199
void RemoveFromNotify(uint16 f)
Definition: Object.h:553
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:94
void UpdateEnchantTime(uint32 time)
Definition: PlayerStorage.cpp:4190
uint32 GetInnTriggerId() const
Definition: Player.h:1176
void UpdateContestedPvP(uint32 currTime)
Definition: PlayerMisc.cpp:360
void SendAttackSwingBadFacingAttack()
Definition: PlayerMisc.cpp:146
void SendUpdateToOutOfRangeGroupMembers()
Definition: Player.cpp:11599
void KillPlayer()
Definition: Player.cpp:4452
void UpdateDuelFlag(time_t currTime)
Definition: PlayerMisc.cpp:423
bool HasRestFlag(RestFlag restFlag) const
Definition: Player.h:1173
bool HasDelayedTeleport() const
Definition: Player.h:2881
void SendAttackSwingNotInRange()
Definition: PlayerMisc.cpp:78
void UpdateSoulboundTradeItems()
Definition: PlayerStorage.cpp:4136
void RemoveRestFlag(RestFlag restFlag)
Definition: Player.cpp:16046
void CheckDuelDistance(time_t currTime)
Definition: Player.cpp:6268
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:6529
void FailQuest(uint32 quest_id)
Definition: PlayerQuest.cpp:883
void HandleDrowning(uint32 time_diff)
Definition: Player.cpp:834
void UpdateCharmedAI()
Definition: PlayerUpdates.cpp:1905
void UpdateHomebindTime(uint32 time)
Definition: PlayerUpdates.cpp:1348
bool IsInAreaTriggerRadius(AreaTrigger const *trigger, float delta=0.f) const
Definition: Player.cpp:2155
void RegenerateAll()
Definition: Player.cpp:1733
void UpdateAfkReport(time_t currTime)
checks the 15 afk reports per 5 minutes limit
Definition: PlayerMisc.cpp:351
bool IsCharmed() const
Definition: Unit.h:1871
Unit * GetCharmer() const
Definition: Unit.cpp:10568
bool haveOffhandWeapon() const
Definition: Unit.cpp:540
void setAttackTimer(WeaponAttackType type, int32 time)
Definition: Unit.h:1340
bool IsWithinMeleeRange(Unit const *obj, float dist=0.f) const
Definition: Unit.cpp:683
bool bRequestForcedVisibilityUpdate
Definition: Unit.h:2413
bool isPossessed() const
Definition: Unit.h:1872
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition: Unit.cpp:2527
void Update(uint32 time) override
Definition: Unit.cpp:403
int32 getAttackTimer(WeaponAttackType type) const
Definition: Unit.h:1342
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition: Unit.h:1343
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition: Unit.cpp:661
uint16 m_delayed_unit_relocation_timer
Definition: Unit.h:2411
Definition: ObjectMgr.h:421
void SetTotalTime(uint32 TotalTime)
Definition: WorldSession.h:374
void KickPlayer(bool setKicked=true)
Definition: WorldSession.h:399

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(), JUST_DIED, 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(), UpdateAfkReport(), UpdateArea(), UpdateCharmedAI(), CinematicMgr::UpdateCinematicLocation(), UpdateContestedPvP(), UpdateDuelFlag(), UpdateEnchantTime(), UpdateFFAPvPFlag(), UpdateHomebindTime(), UpdateItemDuration(), UpdateObjectVisibility(), UpdatePvPFlag(), UpdateSoulboundTradeItems(), AchievementMgr::UpdateTimedAchievements(), UpdateZone(), and ZONE_UPDATE_INTERVAL.

Referenced by Map::Update().

◆ UpdateAchievementCriteria()

void Player::UpdateAchievementCriteria ( AchievementCriteriaTypes  type,
uint32  miscValue1 = 0,
uint32  miscValue2 = 0,
Unit unit = nullptr 
)
2132{
2133 m_achievementMgr->UpdateAchievementCriteria(type, miscValue1, miscValue2,
2134 unit);
2135}
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: AchievementMgr.cpp:789

References m_achievementMgr, and AchievementMgr::UpdateAchievementCriteria().

Referenced by _addSpell(), Spell::_cast(), KillRewarder::_RewardKillCredit(), ActivateTaxiPathTo(), CheckAreaExploreAndOutdoor(), Group::CountTheRoll(), Unit::DealDamage(), Spell::DoSpellHitOnUnit(), FlightPathMovementGenerator::DoUpdate(), 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(), QuickEquipItem(), resetTalents(), RewardHonor(), RewardQuest(), AuctionHouseMgr::SendAuctionSuccessfulMail(), AuctionHouseMgr::SendAuctionWonMail(), setDeathState(), SetMoney(), ReputationMgr::SetOneFactionReputation(), SetSkill(), 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:1026

References BGData::bgAfkReportedCount, BGData::bgAfkReportedTimer, m_bgData, and MINUTE.

Referenced by Update().

◆ UpdateAllCritPercentages()

void Player::UpdateAllCritPercentages ( )

◆ UpdateAllRatings()

void Player::UpdateAllRatings ( )
667{
668 for (int cr = 0; cr < MAX_COMBAT_RATING; ++cr)
670}
CombatRating
Definition: Unit.h:403

References MAX_COMBAT_RATING, and UpdateRating().

Referenced by UpdateAllStats().

◆ UpdateAllSpellCritChances()

void Player::UpdateAllSpellCritChances ( )
879{
880 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
882}
@ SPELL_SCHOOL_NORMAL
Definition: SharedDefines.h:255
void UpdateSpellCritChance(uint32 school)
Definition: StatSystem.cpp:829

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:878
void UpdateArmor() override
Definition: StatSystem.cpp:252
void UpdateSpellDamageAndHealingBonus()
Definition: StatSystem.cpp:177
void UpdateAllRatings()
Definition: PlayerUpdates.cpp:666
void UpdateAllCritPercentages()
Definition: StatSystem.cpp:687
void UpdateDefenseBonusesMod()
Definition: StatSystem.cpp:616
virtual void UpdateAllResistances()
Definition: StatSystem.cpp:54
float GetTotalStatValue(Stats stat, float additionalValue=0.0f) const
Definition: Unit.cpp:15194

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(), GiveLevel(), and LoadFromDB().

◆ UpdateArea()

void Player::UpdateArea ( uint32  newArea)
1172{
1173 // pussywizard: inform instance, needed for Icecrown Citadel
1174 if (InstanceScript* instance = GetInstanceScript())
1175 instance->OnPlayerAreaUpdate(this, m_areaUpdateId, newArea);
1176
1177 sScriptMgr->OnPlayerUpdateArea(this, m_areaUpdateId, newArea);
1178
1179 // FFA_PVP flags are area and not zone id dependent
1180 // so apply them accordingly
1181 m_areaUpdateId = newArea;
1182
1183 AreaTableEntry const* area = sAreaTableStore.LookupEntry(newArea);
1184 pvpInfo.IsInFFAPvPArea = area && (area->flags & AREA_FLAG_ARENA);
1185 UpdateFFAPvPState(false);
1186
1187 UpdateAreaDependentAuras(newArea);
1188
1189 pvpInfo.IsInNoPvPArea = false;
1190 if (area && area->IsSanctuary())
1191 {
1193 pvpInfo.IsInNoPvPArea = true;
1195 }
1196 else
1198
1199 uint32 const areaRestFlag = (GetTeamId(true) == TEAM_ALLIANCE)
1202 if (area && area->flags & areaRestFlag)
1204 else
1206}
@ REST_FLAG_IN_FACTION_AREA
Definition: Player.h:809
@ AREA_FLAG_ARENA
Definition: DBCEnums.h:246
@ AREA_FLAG_REST_ZONE_HORDE
Definition: DBCEnums.h:261
@ AREA_FLAG_REST_ZONE_ALLIANCE
Definition: DBCEnums.h:262
bool IsInNoPvPArea
‍Marks if player is in an area which forces PvP flag
Definition: Player.h:363
bool IsInFFAPvPArea
‍Marks if player is in a sanctuary or friendly capital city
Definition: Player.h:364
void UpdateFFAPvPState(bool reset=true)
Definition: PlayerUpdates.cpp:1408
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)
1819{
1820 // remove auras from spells with area limitations
1821 for (AuraMap::iterator iter = m_ownedAuras.begin();
1822 iter != m_ownedAuras.end();)
1823 {
1824 // use m_zoneUpdateId for speed: UpdateArea called from UpdateZone or
1825 // instead UpdateZone in both cases m_zoneUpdateId up-to-date
1826 if (iter->second->GetSpellInfo()->CheckLocation(
1827 GetMapId(), m_zoneUpdateId, newArea, this, false) !=
1829 RemoveOwnedAura(iter);
1830 else
1831 ++iter;
1832 }
1833
1834 // Xinef: check controlled auras
1835 if (!m_Controlled.empty())
1836 for (ControlSet::iterator itr = m_Controlled.begin();
1837 itr != m_Controlled.end();)
1838 {
1839 Unit* controlled = *itr;
1840 ++itr;
1841 if (controlled && !controlled->IsPet())
1842 {
1843 Unit::AuraMap& tAuras = controlled->GetOwnedAuras();
1844 for (Unit::AuraMap::iterator auraIter = tAuras.begin();
1845 auraIter != tAuras.end();)
1846 {
1847 if (auraIter->second->GetSpellInfo()->CheckLocation(
1848 GetMapId(), m_zoneUpdateId, newArea, nullptr) !=
1850 controlled->RemoveOwnedAura(auraIter);
1851 else
1852 ++auraIter;
1853 }
1854 }
1855 }
1856
1857 // some auras applied at subzone enter
1858 SpellAreaForAreaMapBounds saBounds =
1859 sSpellMgr->GetSpellAreaForAreaMapBounds(newArea);
1860 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first;
1861 itr != saBounds.second; ++itr)
1862 if (itr->second->autocast &&
1863 itr->second->IsFitToRequirements(this, m_zoneUpdateId, newArea))
1864 if (!HasAura(itr->second->spellId))
1865 CastSpell(this, itr->second->spellId, true);
1866
1867 if (newArea == 4273 && GetVehicle() && GetPositionX() > 400) // Ulduar
1868 {
1869 switch (GetVehicleBase()->GetEntry())
1870 {
1871 case 33062:
1872 case 33109:
1873 case 33060:
1874 GetVehicle()->Dismiss();
1875 break;
1876 }
1877 }
1878}
std::pair< SpellAreaForAreaMap::const_iterator, SpellAreaForAreaMap::const_iterator > SpellAreaForAreaMapBounds
Definition: SpellMgr.h:543
Unit * GetVehicleBase() const
Definition: Unit.cpp:18910
std::multimap< uint32, Aura * > AuraMap
Definition: Unit.h:1295
AuraMap & GetOwnedAuras()
Definition: Unit.h:1914
void Dismiss()
Definition: Vehicle.cpp:526

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)
855{
856 // Store Rating Value
858}

References CR_ARMOR_PENETRATION, PLAYER_FIELD_COMBAT_RATING_1, and Object::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
349 switch (getClass())
350 {
351 case CLASS_HUNTER:
352 val2 = level * 2.0f + GetStat(STAT_AGILITY) - 10.0f;
353 break;
354 case CLASS_ROGUE:
355 case CLASS_WARRIOR:
356 val2 = level + GetStat(STAT_AGILITY) - 10.0f;
357 break;
358 case CLASS_DRUID:
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 break;
371 default:
372 val2 = GetStat(STAT_AGILITY) - 10.0f;
373 break;
374 }
375 }
376 else
377 {
378 switch (getClass())
379 {
380 case CLASS_PALADIN:
382 case CLASS_WARRIOR:
383 val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
384 break;
385 case CLASS_HUNTER:
386 case CLASS_SHAMAN:
387 case CLASS_ROGUE:
388 val2 = level * 2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f;
389 break;
390 case CLASS_DRUID:
391 {
392 // Check if Predatory Strikes is skilled
393 float mLevelMult = 0.0f;
394 float weapon_bonus = 0.0f;
395 if (IsInFeralForm())
396 {
398 for (Unit::AuraEffectList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
399 {
400 AuraEffect* aurEff = *itr;
401 if (aurEff->GetSpellInfo()->SpellIconID == 1563)
402 {
403 switch (aurEff->GetEffIndex())
404 {
405 case 0: // Predatory Strikes (effect 0)
406 mLevelMult = CalculatePct(1.0f, aurEff->GetAmount());
407 break;
408 case 1: // Predatory Strikes (effect 1)
409 if (Item* mainHand = m_items[EQUIPMENT_SLOT_MAINHAND])
410 {
411 // also gains % attack power from equipped weapon
412 ItemTemplate const* proto = mainHand->GetTemplate();
413 if (!proto)
414 continue;
415
416 uint32 ap = proto->getFeralBonus();
417 // Get AP Bonuses from weapon
418 for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
419 {
420 if (i >= proto->StatsCount)
421 break;
422
424 ap += proto->ItemStat[i].ItemStatValue;
425 }
426
427 // Get AP Bonuses from weapon spells
428 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
429 {
430 // no spell
431 if (!proto->Spells[i].SpellId || proto->Spells[i].SpellTrigger != ITEM_SPELLTRIGGER_ON_EQUIP)
432 continue;
433
434 // check if it is valid spell
435 SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(proto->Spells[i].SpellId);
436 if (!spellproto)
437 continue;
438
439 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
440 if (spellproto->Effects[j].ApplyAuraName == SPELL_AURA_MOD_ATTACK_POWER)
441 ap += spellproto->Effects[j].CalcValue();
442 }
443
444 weapon_bonus = CalculatePct(float(ap), aurEff->GetAmount());
445 }
446 break;
447 default:
448 break;
449 }
450 }
451 }
452 }
453
454 switch (GetShapeshiftForm())
455 {
456 case FORM_CAT:
457 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f + GetStat(STAT_AGILITY) - 20.0f + weapon_bonus + m_baseFeralAP;
458 break;
459 case FORM_BEAR:
460 case FORM_DIREBEAR:
461 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + weapon_bonus + m_baseFeralAP;
462 break;
463 case FORM_MOONKIN:
464 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + m_baseFeralAP;
465 break;
466 default:
467 val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
468 break;
469 }
470 break;
471 }
472 case CLASS_MAGE:
473 case CLASS_PRIEST:
474 case CLASS_WARLOCK:
475 val2 = GetStat(STAT_STRENGTH) - 10.0f;
476 break;
477 }
478 }
479
480 SetModifierValue(unitMod, BASE_VALUE, val2);
481
482 float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT);
483 float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
484
485 //add dynamic flat mods
486 if (ranged)
487 {
488 if ((getClassMask() & CLASSMASK_WAND_USERS) == 0)
489 {
491 for (AuraEffectList::const_iterator i = mRAPbyStat.begin(); i != mRAPbyStat.end(); ++i)
492 attPowerMod += CalculatePct(GetStat(Stats((*i)->GetMiscValue())), (*i)->GetAmount());
493 }
494 }
495 else
496 {
498 for (AuraEffectList::const_iterator i = mAPbyStat.begin(); i != mAPbyStat.end(); ++i)
499 attPowerMod += CalculatePct(GetStat(Stats((*i)->GetMiscValue())), (*i)->GetAmount());
500
502 for (AuraEffectList::const_iterator iter = mAPbyArmor.begin(); iter != mAPbyArmor.end(); ++iter)
503 // always: ((*i)->GetModifier()->m_miscvalue == 1 == SPELL_SCHOOL_MASK_NORMAL)
504 attPowerMod += int32(GetArmor() / (*iter)->GetAmount());
505 }
506
507 float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
508
509 sScriptMgr->OnAfterUpdateAttackPowerAndDamage(this, level, base_attPower, attPowerMod, attPowerMultiplier, ranged);
510 SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field
511 SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field
512 SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
513
514 //automatically update weapon damage after attack power modification
515 if (ranged)
516 {
518 }
519 else
520 {
522 if (CanDualWield() && haveOffhandWeapon()) //allow update offhand damage only if player knows DualWield Spec and has equipped offhand weapon
524 if (getClass() == CLASS_SHAMAN || getClass() == CLASS_PALADIN) // mental quickness
526 }
527}
@ FORM_MOONKIN
Definition: Unit.h:119
@ 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
int32 ItemStatValue
Definition: ItemTemplate.h:596
uint32 ItemStatType
Definition: ItemTemplate.h:595
_ItemStat ItemStat[MAX_ITEM_PROTO_STATS]
Definition: ItemTemplate.h:657
int32 getFeralBonus(int32 extraDPS=0) const
Definition: ItemTemplate.h:753
uint32 StatsCount
Definition: ItemTemplate.h:656
void SetModifierValue(UnitMods unitMod, UnitModifierType modifierType, float value)
Definition: Unit.h:2098
uint32 GetEffIndex() const
Definition: SpellAuraEffects.h:56
int32 GetAmount() const
Definition: SpellAuraEffects.h:63

References BASE_ATTACK, BASE_PCT, BASE_VALUE, CalculatePct(), Unit::CanDualWield(), 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::getClass(), Unit::getClassMask(), AuraEffect::GetEffIndex(), ItemTemplate::getFeralBonus(), Unit::GetLevel(), Unit::GetModifierValue(), Unit::GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Unit::GetStat(), Unit::haveOffhandWeapon(), 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 ( )
624{
625 // No block
626 float value = 0.0f;
627 if (CanBlock())
628 {
629 // Base value
630 value = 5.0f;
631 // Modify value from defense skill
632 value += (int32(GetDefenseSkillValue()) - int32(GetMaxSkillValueForLevel())) * 0.04f;
633 // Increase from SPELL_AURA_MOD_BLOCK_PERCENT aura
635 // Increase from rating
637
638 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
639 {
640 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Block", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Block", 95.0f) : value;
641 }
642
643 value = value < 0.0f ? 0.0f : value;
644 }
646}
#define sConfigMgr
Definition: Config.h:92
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition: SpellAuraDefines.h:114
void SetStatFloatValue(uint16 index, float value)
Definition: Object.cpp:790
bool CanBlock() const
Definition: Player.h:2134
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition: Unit.cpp:3578

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
1906{
1907 // Xinef: maybe passed as argument?
1908 Unit* charmer = GetCharmer();
1909 CharmInfo* charmInfo = GetCharmInfo();
1910
1911 // Xinef: needs more thinking, maybe kill player?
1912 if (!charmer || !charmInfo)
1913 return;
1914
1915 // Xinef: we should be killed if caster enters evade mode and charm is
1916 // infinite
1917 if (charmer->GetTypeId() == TYPEID_UNIT &&
1918 charmer->ToCreature()->IsInEvadeMode())
1919 {
1920 AuraEffectList const& auras =
1922 for (AuraEffectList::const_iterator iter = auras.begin();
1923 iter != auras.end(); ++iter)
1924 if ((*iter)->GetCasterGUID() == charmer->GetGUID() &&
1925 (*iter)->GetBase()->IsPermanent())
1926 {
1927 Unit::DealDamage(charmer, this, GetHealth(), nullptr,
1929 nullptr, false);
1930 return;
1931 }
1932 }
1933
1934 Unit* target = GetVictim();
1935 if (target)
1936 {
1937 SetInFront(target);
1939 }
1940
1942 return;
1943
1944 bool Mages =
1945 getClassMask() & (1 << (CLASS_MAGE - 1) | 1 << (CLASS_WARLOCK - 1) |
1946 1 << (CLASS_DRUID - 1) | 1 << (CLASS_HUNTER - 1) |
1947 1 << (CLASS_PRIEST - 1));
1948
1949 // Xinef: charmer type specific actions
1950 if (charmer->GetTypeId() == TYPEID_PLAYER)
1951 {
1952 bool follow = false;
1953 if (!target)
1954 {
1955 if (charmInfo->GetPlayerReactState() == REACT_PASSIVE)
1956 follow = true;
1957 else if (charmInfo->GetPlayerReactState() == REACT_DEFENSIVE)
1958 {
1959 if (charmer->GetVictim())
1960 target = charmer->GetVictim();
1961 else
1962 follow = true;
1963 }
1964
1965 if (follow)
1966 {
1970 return;
1971 }
1972 }
1973 else if (target &&
1976 GetMotionMaster()->MoveChase(target, Mages ? 15 : 4);
1977 }
1978
1979 if (!target || !IsValidAttackTarget(target))
1980 {
1981 target = SelectNearbyTarget(nullptr, 30);
1982 if (!target)
1983 {
1987
1988 return;
1989 }
1990
1991 GetMotionMaster()->MoveChase(target, Mages ? 15 : 4);
1992 Attack(target, true);
1993 }
1994 else
1995 {
1996 float Distance = GetDistance(target);
1997 uint8 rnd = urand(0, 1);
1998
1999 if (Mages)
2000 {
2001 if ((GetPower(POWER_MANA) * 100 / GetMaxPower(POWER_MANA)) < 10)
2002 {
2003 GetMotionMaster()->MoveChase(target, 4);
2004 return;
2005 }
2006
2007 if (Distance <= 3)
2008 {
2009 if (urand(0, 1))
2010 {
2013 CastSpell(target, m_charmAISpells[SPELL_T_STUN], false);
2018 false);
2019 else if (m_charmAISpells[SPELL_IMMUNITY] &&
2022 }
2023 else
2024 {
2025 switch (urand(0, 1))
2026 {
2027 case 0:
2031 CastSpell(
2032 target,
2034 false);
2035 break;
2036 case 1:
2041 false);
2042 break;
2043 }
2044 }
2045 }
2046 else
2047 {
2048 switch (urand(0, 2))
2049 {
2050 case 0:
2054 CastSpell(target,
2056 false);
2057 break;
2058 case 1:
2062 CastSpell(target,
2064 false);
2065 break;
2066 case 2:
2070 false);
2071 break;
2072 }
2073 }
2074 }
2075 else
2076 {
2077 if (Distance > 10)
2078 {
2079 GetMotionMaster()->MoveChase(target, 2.0f);
2082 CastSpell(target, m_charmAISpells[SPELL_T_CHARGE], false);
2083 else if (m_charmAISpells[SPELL_FAST_RUN] &&
2086 }
2087
2089 return;
2090
2091 switch (urand(0, 2))
2092 {
2093 case 0:
2097 CastSpell(target,
2099 false);
2100 break;
2101 case 1:
2106 false);
2107 break;
2108 case 2:
2112 break;
2113 }
2114 }
2115 }
2116}
#define PET_FOLLOW_ANGLE
Definition: PetDefines.h:194
#define PET_FOLLOW_DIST
Definition: PetDefines.h:193
@ SPELL_HIGH_DAMAGE1
Definition: Player.h:911
@ REACT_DEFENSIVE
Definition: Unit.h:1024
@ REACT_PASSIVE
Definition: Unit.h:1023
@ UNIT_STATE_FOLLOW
Definition: Unit.h:334
@ CHASE_MOTION_TYPE
Definition: MotionMaster.h:43
bool IsInEvadeMode() const
Definition: Creature.h:129
ReactStates GetPlayerReactState() const
Definition: Unit.h:1151
Unit * SelectNearbyTarget(Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
Definition: Unit.cpp:17155
bool Attack(Unit *victim, bool meleeAttack)
Definition: Unit.cpp:10245
void SendMovementFlagUpdate(bool self=false)
Definition: Unit.cpp:16878
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition: Unit.cpp:13776
void SetInFront(WorldObject const *target)
Definition: Unit.cpp:20776
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Definition: MotionMaster.cpp:299
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition: MotionMaster.cpp:817
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE)
Definition: MotionMaster.cpp:367

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(), Unit::GetMaxPower(), Unit::GetMotionMaster(), CharmInfo::GetPlayerReactState(), Unit::GetPower(), Object::GetTypeId(), Unit::GetVictim(), HasSpellCooldown(), Unit::HasUnitState(), Creature::IsInEvadeMode(), 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(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_STATE_CASTING, UNIT_STATE_FOLLOW, and urand().

Referenced by Update().

◆ UpdateCombatSkills()

void Player::UpdateCombatSkills ( Unit victim,
WeaponAttackType  attType,
bool  defence,
Item item = nullptr 
)
982{
983 uint8 playerLevel = GetLevel();
984 uint16 currentSkillValue = defence ? GetBaseDefenseSkillValue() : GetBaseWeaponSkillValue(attType);
985 uint16 currentSkillMax = 5 * playerLevel;
986 int32 skillDiff = currentSkillMax - currentSkillValue;
987
988 // Max skill reached for level.
989 // Can in some cases be less than 0: having max skill and then .level -1 as example.
990 if (skillDiff <= 0)
991 {
992 return;
993 }
994
995 uint8 greylevel = Acore::XP::GetGrayLevel(playerLevel);
996 uint8 moblevel = defence ? victim->getLevelForTarget(this) : victim->GetLevel(); // if defense than victim == attacker
997 /*if (moblevel < greylevel)
998 return;*/
999 // Patch 3.0.8 (2009-01-20): You can no longer skill up weapons on mobs that are immune to damage.
1000
1001 if (moblevel > playerLevel + 5)
1002 {
1003 moblevel = playerLevel + 5;
1004 }
1005
1006 int16 lvldif = moblevel - greylevel;
1007 if (lvldif < 3)
1008 {
1009 lvldif = 3;
1010 }
1011
1012 float chance = float(3 * lvldif * skillDiff) / playerLevel;
1013 if (!defence)
1014 {
1015 chance += chance * 0.02f * GetStat(STAT_INTELLECT);
1016 }
1017
1018 chance = chance < 1.0f ? 1.0f : chance; // minimum chance to increase skill is 1%
1019
1020 LOG_DEBUG("entities.player", "Player::UpdateCombatSkills(defence:{}, playerLevel:{}, moblevel:{}) -> ({}/{}) chance to increase skill is {}%", defence, playerLevel, moblevel, currentSkillValue, currentSkillMax, chance);
1021
1022 if (roll_chance_f(chance))
1023 {
1024 if (defence)
1025 {
1026 UpdateDefense();
1027 }
1028 else
1029 {
1030 UpdateWeaponSkill(victim, attType, item);
1031 }
1032 }
1033}
uint32 GetBaseDefenseSkillValue() const
Definition: Player.h:1885
uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const
Definition: Player.cpp:12705
void UpdateDefense()
Definition: PlayerUpdates.cpp:567
void UpdateWeaponSkill(Unit *victim, WeaponAttackType attType, Item *item=nullptr)
Definition: PlayerUpdates.cpp:935
uint8 getLevelForTarget(WorldObject const *) const override
Definition: Unit.h:1421

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 ( )
1881{
1883
1884 if ((pvp &&
1886 (!pvp && !sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)))
1887 return;
1888
1889 time_t now = GameTime::GetGameTime().count();
1890
1891 if (now < m_deathExpireTime)
1892 {
1893 // full and partly periods 1..3
1894 uint64 count = (m_deathExpireTime - now) / DEATH_EXPIRE_STEP + 1;
1895
1896 if (count < MAX_DEATH_COUNT)
1897 m_deathExpireTime = now + (count + 1) * DEATH_EXPIRE_STEP;
1898 else
1900 }
1901 else
1903}

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)
784{
785 LOG_DEBUG("entities.player.skills", "UpdateCraftSkill spellid {}", spellid);
786
787 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellid);
788
789 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first;
790 _spell_idx != bounds.second; ++_spell_idx)
791 {
792 if (_spell_idx->second->SkillLine)
793 {
794 uint32 SkillValue =
795 GetPureSkillValue(_spell_idx->second->SkillLine);
796
797 // Alchemy Discoveries here
798 SpellInfo const* spellEntry = sSpellMgr->GetSpellInfo(spellid);
799 if (spellEntry && spellEntry->Mechanic == MECHANIC_DISCOVERY)
800 {
801 if (uint32 discoveredSpell = GetSkillDiscoverySpell(
802 _spell_idx->second->SkillLine, spellid, this))
803 learnSpell(discoveredSpell);
804 }
805
806 uint32 craft_skill_gain =
807 sWorld->getIntConfig(CONFIG_SKILL_GAIN_CRAFTING);
808
809 return UpdateSkillPro(
810 _spell_idx->second->SkillLine,
811 SkillGainChance(SkillValue,
812 _spell_idx->second->TrivialSkillLineRankHigh,
813 (_spell_idx->second->TrivialSkillLineRankHigh +
814 _spell_idx->second->TrivialSkillLineRankLow) /
815 2,
816 _spell_idx->second->TrivialSkillLineRankLow),
817 craft_skill_gain);
818 }
819 }
820 return false;
821}
int SkillGainChance(uint32 SkillValue, uint32 GrayLevel, uint32 GreenLevel, uint32 YellowLevel)
Definition: PlayerUpdates.cpp:710
uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player *player)
Definition: SkillDiscovery.cpp:213
@ CONFIG_SKILL_GAIN_CRAFTING
Definition: IWorld.h:269
@ MECHANIC_DISCOVERY
Definition: SharedDefines.h:1325
bool UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step)
Definition: PlayerUpdates.cpp:871
uint32 Mechanic
Definition: SpellInfo.h:321

References CONFIG_SKILL_GAIN_CRAFTING, GetPureSkillValue(), GetSkillDiscoverySpell(), learnSpell(), LOG_DEBUG, SpellInfo::Mechanic, MECHANIC_DISCOVERY, SkillGainChance(), sSpellMgr, sWorld, and UpdateSkillPro().

Referenced by Spell::DoCreateItem(), Spell::EffectEnchantItemPerm(), and spell_gen_profession_research::HandleScript().

◆ UpdateCritPercentage()

void Player::UpdateCritPercentage ( WeaponAttackType  attType)
649{
650 BaseModGroup modGroup;
651 uint16 index;
652 CombatRating cr;
653
654 switch (attType)
655 {
656 case OFF_ATTACK:
657 modGroup = OFFHAND_CRIT_PERCENTAGE;
659 cr = CR_CRIT_MELEE;
660 break;
661 case RANGED_ATTACK:
662 modGroup = RANGED_CRIT_PERCENTAGE;
664 cr = CR_CRIT_RANGED;
665 break;
666 case BASE_ATTACK:
667 default:
668 modGroup = CRIT_PERCENTAGE;
670 cr = CR_CRIT_MELEE;
671 break;
672 }
673
674 float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr);
675 // Modify crit from weapon skill and maximized defense skill of same level victim difference
676 value += (int32(GetWeaponSkillValue(attType)) - int32(GetMaxSkillValueForLevel())) * 0.04f;
677
678 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
679 {
680 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Crit", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Crit", 95.0f) : value;
681 }
682
683 value = value < 0.0f ? 0.0f : value;
684 SetStatFloatValue(index, value);
685}
float GetTotalPercentageModValue(BaseModGroup modGroup) const
Definition: Player.h:2145
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition: Unit.cpp:3743

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 ( )
568{
570 sWorld->getIntConfig(CONFIG_SKILL_GAIN_DEFENSE)))
571 UpdateDefenseBonusesMod(); // update dependent from defense skill part
572}
@ CONFIG_SKILL_GAIN_DEFENSE
Definition: IWorld.h:270
bool UpdateSkill(uint32 skill_id, uint32 step)
Definition: PlayerUpdates.cpp:673

References CONFIG_SKILL_GAIN_DEFENSE, SKILL_DEFENSE, sWorld, UpdateDefenseBonusesMod(), and UpdateSkill().

Referenced by UpdateCombatSkills().

◆ UpdateDefenseBonusesMod()

void Player::UpdateDefenseBonusesMod ( )

◆ UpdateDodgePercentage()

void Player::UpdateDodgePercentage ( )
789{
790 const float dodge_cap[MAX_CLASSES] =
791 {
792 88.129021f, // Warrior
793 88.129021f, // Paladin
794 145.560408f, // Hunter
795 145.560408f, // Rogue
796 150.375940f, // Priest
797 88.129021f, // DK
798 145.560408f, // Shaman
799 150.375940f, // Mage
800 150.375940f, // Warlock
801 0.0f, // ??
802 116.890707f // Druid
803 };
804
805 float diminishing = 0.0f, nondiminishing = 0.0f;
806 GetDodgeFromAgility(diminishing, nondiminishing);
807 // Modify value from defense skill (only bonus from defense rating diminishes)
808 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
809 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
810 // Dodge from SPELL_AURA_MOD_DODGE_PERCENT aura
812 // Dodge from rating
813 diminishing += GetRatingBonusValue(CR_DODGE);
814 // apply diminishing formula to diminishing dodge chance
815 uint32 pclass = getClass() - 1;
816 m_realDodge = nondiminishing + (diminishing * dodge_cap[pclass] / (diminishing + dodge_cap[pclass] * m_diminishing_k[pclass]));
817
818 m_realDodge = m_realDodge < 0.0f ? 0.0f : m_realDodge;
819 float value = std::max(diminishing + nondiminishing, 0.0f);
820
821 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
822 {
823 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Dodge", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Dodge", 95.0f) : value;
824 }
825
827}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition: SpellAuraDefines.h:112
void GetDodgeFromAgility(float &diminishing, float &nondiminishing)
Definition: Player.cpp:5014

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:372
@ DUEL_STATE_IN_PROGRESS
Definition: Player.h:373

References duel, DUEL_STATE_COUNTDOWN, DUEL_STATE_IN_PROGRESS, PLAYER_DUEL_TEAM, Object::SetUInt32Value(), and sScriptMgr.

Referenced by Update().

◆ UpdateEnchantmentDurations()

void Player::UpdateEnchantmentDurations ( )
4761{
4762 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4763 {
4764 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
4765 }
4766}

References m_enchantDuration.

Referenced by Spell::EffectSummonChangeItem().

◆ UpdateEnchantTime()

void Player::UpdateEnchantTime ( uint32  time)
4191{
4192 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(), next; itr != m_enchantDuration.end(); itr = next)
4193 {
4194 ASSERT(itr->item);
4195 next = itr;
4196 if (!itr->item->GetEnchantmentId(itr->slot))
4197 {
4198 next = m_enchantDuration.erase(itr);
4199 }
4200 else if (itr->leftduration <= time)
4201 {
4202 ApplyEnchantment(itr->item, itr->slot, false, false);
4203 itr->item->ClearEnchantment(itr->slot);
4204 next = m_enchantDuration.erase(itr);
4205 }
4206 else if (itr->leftduration > time)
4207 {
4208 itr->leftduration -= time;
4209 ++next;
4210 }
4211 }
4212}

References ApplyEnchantment(), ASSERT, and m_enchantDuration.

Referenced by Update().

◆ UpdateEquipSpellsAtFormChange()

void Player::UpdateEquipSpellsAtFormChange ( )
1311{
1312 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
1313 {
1314 if (m_items[i] && !m_items[i]->IsBroken() &&
1316 {
1317 ApplyItemEquipSpell(m_items[i], false,
1318 true); // remove spells that not fit to form
1320 m_items[i], true,
1321 true); // add spells that fit form but not active
1322 }
1323 }
1324
1325 // item set bonuses not dependent from item broken state
1326 for (size_t setindex = 0; setindex < ItemSetEff.size(); ++setindex)
1327 {
1328 ItemSetEffect* eff = ItemSetEff[setindex];
1329 if (!eff)
1330 continue;
1331
1332 for (uint32 y = 0; y < MAX_ITEM_SET_SPELLS; ++y)
1333 {
1334 SpellInfo const* spellInfo = eff->spells[y];
1335 if (!spellInfo)
1336 continue;
1337
1338 ApplyEquipSpell(spellInfo, nullptr, false,
1339 true); // remove spells that not fit to form
1340 if (!sScriptMgr->CanApplyEquipSpellsItemSet(this, eff))
1341 break;
1342 ApplyEquipSpell(spellInfo, nullptr, true,
1343 true); // add spells that fit form but not active
1344 }
1345 }
1346}
#define MAX_ITEM_SET_SPELLS
Definition: DBCStructure.h:1208
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)
885{
886 if (attack == RANGED_ATTACK)
887 return;
888
890
891 Item* weapon = GetWeaponForAttack(attack, true);
892
894 for (AuraEffectList::const_iterator itr = expAuras.begin(); itr != expAuras.end(); ++itr)
895 {
896 // item neutral spell
897 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
898 expertise += (*itr)->GetAmount();
899 // item dependent spell
900 else if (weapon && weapon->IsFitToSpellRequirements((*itr)->GetSpellInfo()))
901 expertise += (*itr)->GetAmount();
902 }
903
904 if (expertise < 0)
905 expertise = 0;
906
907 switch (attack)
908 {
909 case BASE_ATTACK:
911 break;
912 case OFF_ATTACK:
914 break;
915 default:
916 break;
917 }
918}
@ 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, Object::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 
)
2139{
2140 if (m_lastFallTime >= minfo.fallTime ||
2141 m_lastFallZ <= minfo.pos.GetPositionZ() || opcode == MSG_MOVE_FALL_LAND)
2142 SetFallInformation(minfo.fallTime, minfo.pos.GetPositionZ());
2143}
@ 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:366
std::unordered_set< Unit * > AttackerSet
Definition: Unit.h:1292
AttackerSet const & getAttackers() const
Definition: Unit.h:1383

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
1409{
1411 // and controlled? no, we shouldn't, those are checked for affecting player
1412 // by client
1413 if (!pvpInfo.IsInNoPvPArea && !IsGameMaster() &&
1414 (pvpInfo.IsInFFAPvPArea || sWorld->IsFFAPvPRealm()))
1415 {
1416 if (!IsFFAPvP())
1417 {
1418 sScriptMgr->OnFfaPvpStateUpdate(this, true);
1420 for (ControlSet::iterator itr = m_Controlled.begin();
1421 itr != m_Controlled.end(); ++itr)
1422 (*itr)->SetByteValue(UNIT_FIELD_BYTES_2, 1,
1424 }
1425
1427 {
1428 pvpInfo.FFAPvPEndTimer = time_t(0);
1429 }
1430 }
1431 else if (IsFFAPvP())
1432 {
1433 if ((pvpInfo.IsInNoPvPArea || IsGameMaster()) || reset ||
1435 {
1436 pvpInfo.FFAPvPEndTimer = time_t(0);
1438 {
1440 sScriptMgr->OnFfaPvpStateUpdate(this, false);
1441 }
1442 for (ControlSet::iterator itr = m_Controlled.begin();
1443 itr != m_Controlled.end(); ++itr)
1444 (*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1,
1446
1447 // xinef: iterate attackers
1448 AttackerSet toRemove;
1449 AttackerSet const& attackers = getAttackers();
1450 for (AttackerSet::const_iterator itr = attackers.begin();
1451 itr != attackers.end(); ++itr)
1452 if (!(*itr)->IsValidAttackTarget(this))
1453 toRemove.insert(*itr);
1454
1455 for (AttackerSet::const_iterator itr = toRemove.begin();
1456 itr != toRemove.end(); ++itr)
1457 (*itr)->AttackStop();
1458
1459 // xinef: remove our own victim
1460 if (Unit* victim = GetVictim())
1461 if (!IsValidAttackTarget(victim))
1462 AttackStop();
1463 }
1464 else
1465 {
1466 // Not in FFA PvP Area
1467 // Not FFA PvP realm
1468 // Not FFA PvP timer already set
1469 // Being recently in PvP combat
1470 if (!pvpInfo.IsInFFAPvPArea && !sWorld->IsFFAPvPRealm() &&
1472 {
1474 GameTime::GetGameTime().count() +
1475 sWorld->getIntConfig(CONFIG_FFA_PVP_TIMER);
1476 }
1477 }
1478 }
1479}
@ CONFIG_FFA_PVP_TIMER
Definition: IWorld.h:409
time_t EndTimer
‍Marks if player is in an FFAPvP area (such as Gurubashi Arena)
Definition: Player.h:365

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 ( )
845{
846 LOG_DEBUG("entities.player.skills", "UpdateFishingSkill");
847
849
850 if (SkillValue >= GetMaxSkillValue(SKILL_FISHING))
851 {
852 return false;
853 }
854
855 /* Whenever the player clicks on the fishing gameobject the
856 * core will decide based on a probability if the skill raises or not.
857 */
858 return UpdateSkillPro(
860 static_cast<int32>(getProbabilityOfLevelUp(SkillValue)) * 10,
861 sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING));
862}
float getProbabilityOfLevelUp(uint32 SkillValue)
Definition: PlayerUpdates.cpp:823
@ CONFIG_SKILL_GAIN_GATHERING
Definition: IWorld.h:271
uint16 GetMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5371

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.

1744{
1745 if (m_clientGUIDs.empty())
1746 return;
1747
1748 UpdateData udata;
1749 WorldPacket packet;
1750 for (GuidUnorderedSet::iterator itr = m_clientGUIDs.begin(); itr != m_clientGUIDs.end(); ++itr)
1751 {
1752 if ((*itr).IsGameObject())
1753 {
1754 if (GameObject* obj = ObjectAccessor::GetGameObject(*this, *itr))
1755 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1756 }
1757 else if ((*itr).IsCreatureOrVehicle())
1758 {
1760 if (!obj)
1761 continue;
1762
1763 // check if this unit requires quest specific flags
1765 {
1766 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(obj->GetEntry());
1767 for (SpellClickInfoContainer::const_iterator _itr = clickPair.first; _itr != clickPair.second; ++_itr)
1768 {
1771 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(obj->GetEntry(), _itr->second.spellId);
1772 bool buildUpdateBlock = false;
1773 for (ConditionList::const_iterator jtr = conds.begin(); jtr != conds.end() && !buildUpdateBlock; ++jtr)
1774 if ((*jtr)->ConditionType == CONDITION_QUESTREWARDED || (*jtr)->ConditionType == CONDITION_QUESTTAKEN)
1775 buildUpdateBlock = true;
1776
1777 if (buildUpdateBlock)
1778 {
1779 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1780 break;
1781 }
1782 }
1783 }
1785 {
1786 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1787 }
1788 }
1789 }
1790
1791 udata.BuildPacket(&packet);
1792 GetSession()->SendPacket(&packet);
1793}
@ CONDITION_QUESTREWARDED
Definition: ConditionMgr.h:43
@ CONDITION_QUESTTAKEN
Definition: ConditionMgr.h:44
@ UNIT_NPC_FLAG_VENDOR_MASK
Definition: Unit.h:544
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:189
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target) const
Definition: Object.cpp:257
Definition: UpdateData.h:52
bool BuildPacket(WorldPacket *packet)
Definition: UpdateData.cpp:105

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 
)
724{
725 LOG_DEBUG("entities.player.skills",
726 "UpdateGatherSkill(SkillId {} SkillLevel {} RedLevel {})",
727 SkillId, SkillValue, RedLevel);
728
729 uint32 gathering_skill_gain =
730 sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING);
731
732 // For skinning and Mining chance decrease with level. 1-74 - no decrease,
733 // 75-149 - 2 times, 225-299 - 8 times
734 switch (SkillId)
735 {
736 case SKILL_HERBALISM:
740 return UpdateSkillPro(SkillId,
741 SkillGainChance(SkillValue, RedLevel + 100,
742 RedLevel + 50, RedLevel + 25) *
743 Multiplicator,
744 gathering_skill_gain);
745 case SKILL_SKINNING:
746 if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS) == 0)
747 return UpdateSkillPro(SkillId,
748 SkillGainChance(SkillValue, RedLevel + 100,
749 RedLevel + 50,
750 RedLevel + 25) *
751 Multiplicator,
752 gathering_skill_gain);
753 else
754 return UpdateSkillPro(
755 SkillId,
756 (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50,
757 RedLevel + 25) *
758 Multiplicator) >>
759 (SkillValue /
761 gathering_skill_gain);
762 case SKILL_MINING:
763 if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS) == 0)
764 return UpdateSkillPro(SkillId,
765 SkillGainChance(SkillValue, RedLevel + 100,
766 RedLevel + 50,
767 RedLevel + 25) *
768 Multiplicator,
769 gathering_skill_gain);
770 else
771 return UpdateSkillPro(
772 SkillId,
773 (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50,
774 RedLevel + 25) *
775 Multiplicator) >>
776 (SkillValue /
778 gathering_skill_gain);
779 }
780 return false;
781}
@ CONFIG_SKILL_CHANCE_SKINNING_STEPS
Definition: IWorld.h:268
@ CONFIG_SKILL_CHANCE_MINING_STEPS
Definition: IWorld.h:267
@ SKILL_INSCRIPTION
Definition: SharedDefines.h:2974
@ SKILL_MINING
Definition: SharedDefines.h:2891
@ SKILL_SKINNING
Definition: SharedDefines.h:2933
@ SKILL_JEWELCRAFTING
Definition: SharedDefines.h:2957
@ SKILL_HERBALISM
Definition: SharedDefines.h:2887

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(), sWorld, and UpdateSkillPro().

Referenced by Spell::EffectMilling(), Spell::EffectOpenLock(), Spell::EffectProspecting(), Spell::EffectSkinning(), and GetExplicitDiscoverySpell().

◆ UpdateHomebindTime()

void Player::UpdateHomebindTime ( uint32  time)
1349{
1350 // GMs never get homebind timer online
1352 {
1353 if (m_HomebindTimer) // instance valid, but timer not reset
1354 {
1355 // hide reminder
1356 WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4);
1357 data << uint32(0);
1358 data << uint32(0);
1359 GetSession()->SendPacket(&data);
1360 }
1361 // instance is valid, reset homebind timer
1362 m_HomebindTimer = 0;
1363 }
1364 else if (m_HomebindTimer > 0)
1365 {
1366 if (time >= m_HomebindTimer)
1367 {
1368 // teleport to nearest graveyard
1370 }
1371 else
1372 m_HomebindTimer -= time;
1373 }
1374 else
1375 {
1376 // instance is invalid, start homebind timer
1377 m_HomebindTimer = 60000;
1378 // send message to player
1379 WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4);
1380 data << uint32(m_HomebindTimer);
1381 data << uint32(1);
1382 GetSession()->SendPacket(&data);
1383 LOG_DEBUG(
1384 "maps",
1385 "PLAYER: Player '{}' ({}) will be teleported to homebind in 60 "
1386 "seconds",
1387 GetName(), GetGUID().ToString());
1388 }
1389}
@ 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

1139{
1141 time_t now = time_t(GameTime::GetGameTime().count());
1142 time_t today = time_t(GameTime::GetGameTime().count() / DAY) * DAY;
1143
1144 if (m_lastHonorUpdateTime < today)
1145 {
1146 time_t yesterday = today - DAY;
1147
1149
1150 // update yesterday's contribution
1151 if (m_lastHonorUpdateTime >= yesterday)
1152 {
1155
1156 // this is the first update today, reset today's contribution
1159 }
1160 else
1161 {
1162 // no honor/kills yesterday or today, reset
1165 }
1166 }
1167
1169}
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 Object::SetUInt32Value().

Referenced by honor_commandscript::HandleHonorUpdateCommand(), LoadFromDB(), RewardHonor(), and SaveToDB().

◆ UpdateItemDuration()

void Player::UpdateItemDuration ( uint32  time,
bool  realtimeonly = false 
)
4174{
4175 if (m_itemDuration.empty())
4176 return;
4177
4178 LOG_DEBUG("entities.player.items", "Player::UpdateItemDuration({}, {})", time, realtimeonly);
4179
4180 for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end();)
4181 {
4182 Item* item = *itr;
4183 ++itr; // current element can be erased in UpdateDuration
4184
4185 if (!realtimeonly || item->GetTemplate()->FlagsCu & ITEM_FLAGS_CU_DURATION_REAL_TIME)
4186 item->UpdateDuration(this, time);
4187 }
4188}
@ ITEM_FLAGS_CU_DURATION_REAL_TIME
Definition: ItemTemplate.h:228
void UpdateDuration(Player *owner, uint32 diff)
Definition: Item.cpp:320
uint32 FlagsCu
Definition: ItemTemplate.h:703

References ItemTemplate::FlagsCu, Item::GetTemplate(), ITEM_FLAGS_CU_DURATION_REAL_TIME, LOG_DEBUG, m_itemDuration, and Item::UpdateDuration().

Referenced by LoadFromDB(), and Update().

◆ UpdateLocalChannels()

void Player::UpdateLocalChannels ( uint32  newZone)
465{
466 // pussywizard: mutex needed (tc changed opcode to THREAD UNSAFE)
467 static std::mutex channelsLock;
468 std::lock_guard<std::mutex> guard(channelsLock);
469
470 if (GetSession()->PlayerLoading() && !IsBeingTeleportedFar())
471 return; // The client handles it automatically after loading, but not
472 // after teleporting
473
474 AreaTableEntry const* current_zone = sAreaTableStore.LookupEntry(newZone);
475 if (!current_zone)
476 return;
477
479 if (!cMgr)
480 return;
481
482 std::string current_zone_name =
483 current_zone->area_name[GetSession()->GetSessionDbcLocale()];
484
485 for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i)
486 {
487 if (ChatChannelsEntry const* channel =
488 sChatChannelsStore.LookupEntry(i))
489 {
490 Channel* usedChannel = nullptr;
491
492 for (JoinedChannelsList::iterator itr = m_channels.begin();
493 itr != m_channels.end(); ++itr)
494 {
495 if ((*itr)->GetChannelId() == i)
496 {
497 usedChannel = *itr;
498 break;
499 }
500 }
501
502 Channel* removeChannel = nullptr;
503 Channel* joinChannel = nullptr;
504 bool sendRemove = true;
505
506 if (CanJoinConstantChannelInZone(channel, current_zone))
507 {
508 if (!(channel->flags & CHANNEL_DBC_FLAG_GLOBAL))
509 {
510 if (channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY &&
511 usedChannel)
512 continue; // Already on the channel, as city channel
513 // names are not changing
514
515 char new_channel_name_buf[100];
516 char const* currentNameExt;
517
518 if (channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY)
519 currentNameExt = sObjectMgr->GetAcoreStringForDBCLocale(
521 else
522 currentNameExt = current_zone_name.c_str();
523
524 snprintf(new_channel_name_buf, 100,
525 channel->pattern[m_session->GetSessionDbcLocale()],
526 currentNameExt);
527
528 joinChannel = cMgr->GetJoinChannel(new_channel_name_buf,
529 channel->ChannelID);
530 if (usedChannel)
531 {
532 if (joinChannel != usedChannel)
533 {
534 removeChannel = usedChannel;
535 sendRemove = false; // Do not send leave channel, it
536 // already replaced at client
537 }
538 else
539 joinChannel = nullptr;
540 }
541 }
542 else
543 joinChannel = cMgr->GetJoinChannel(
544 channel->pattern[m_session->GetSessionDbcLocale()],
545 channel->ChannelID);
546 }
547 else
548 removeChannel = usedChannel;
549
550 if (joinChannel)
551 joinChannel->JoinChannel(
552 this, ""); // Changed Channel: ... or Joined Channel: ...
553
554 if (removeChannel)
555 {
556 removeChannel->LeaveChannel(this,
557 sendRemove); // Leave old channel
558 std::string name =
559 removeChannel
560 ->GetName(); // Store name, (*i)erase in LeftChannel
561 LeftChannel(removeChannel); // Remove from player's channel list
562 }
563 }
564 }
565}
@ CHANNEL_DBC_FLAG_GLOBAL
Definition: Channel.h:99
DBCStorage< ChatChannelsEntry > sChatChannelsStore(ChatChannelsEntryfmt)
@ LANG_CHANNEL_CITY
Definition: Language.h:732
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:4899
bool CanJoinConstantChannelInZone(ChatChannelsEntry const *channel, AreaTableEntry const *zone)
Definition: Player.cpp:4876
LocaleConstant GetSessionDbcLocale() const
Definition: WorldSession.h:496
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 ( )
932{
934 {
937 return;
938 }
939
940 float Intellect = GetStat(STAT_INTELLECT);
941 // Mana regen from spirit and intellect
942 float power_regen = std::sqrt(Intellect) * OCTRegenMPPerSpirit();
943 // Apply PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen
945
946 // Mana regen from SPELL_AURA_MOD_POWER_REGEN aura
948
949 // Get bonus from SPELL_AURA_MOD_MANA_REGEN_FROM_STAT aura
951 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
952 {
953 power_regen_mp5 += GetStat(Stats((*i)->GetMiscValue())) * (*i)->GetAmount() / 500.0f;
954 }
955
956 // Set regen rate in cast state apply only on spirit based regen
958 if (modManaRegenInterrupt > 100)
959 modManaRegenInterrupt = 100;
960 SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, power_regen_mp5 + CalculatePct(power_regen, modManaRegenInterrupt));
961
962 SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, power_regen_mp5 + power_regen);
963}
@ 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:5142
float GetTotalAuraMultiplierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:5938

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 Create(), 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:293
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 ( )
426{
427 // Desync flags for update on next HandleDrowning
429 m_MirrorTimerFlagsLast = ~m_MirrorTimerFlags;
430}

References m_MirrorTimerFlags, and m_MirrorTimerFlagsLast.

Referenced by AuraEffect::HandleWaterBreathing().

◆ UpdateNextMailTimeAndUnreads()

void Player::UpdateNextMailTimeAndUnreads ( )
433{
434 // Update the next delivery time and unread mails
435 time_t cTime = GameTime::GetGameTime().count();
436 // Get the next delivery time
437 CharacterDatabasePreparedStatement* stmtNextDeliveryTime =
439 stmtNextDeliveryTime->SetData(0, GetGUID().GetCounter());
440 stmtNextDeliveryTime->SetData(1, uint32(cTime));
441 PreparedQueryResult resultNextDeliveryTime =
442 CharacterDatabase.Query(stmtNextDeliveryTime);
443 if (resultNextDeliveryTime)
444 {
445 Field* fields = resultNextDeliveryTime->Fetch();
446 m_nextMailDelivereTime = time_t(fields[0].Get<uint32>());
447 }
448
449 // Get unread mails count
450 CharacterDatabasePreparedStatement* stmtUnreadAmount =
451 CharacterDatabase.GetPreparedStatement(
453 stmtUnreadAmount->SetData(0, GetGUID().GetCounter());
454 stmtUnreadAmount->SetData(1, uint32(cTime));
455 PreparedQueryResult resultUnreadAmount =
456 CharacterDatabase.Query(stmtUnreadAmount);
457 if (resultUnreadAmount)
458 {
459 Field* fields = resultUnreadAmount->Fetch();
460 unReadMails = uint8(fields[0].Get<uint64>());
461 }
462}
@ CHAR_SEL_CHARACTER_MAILCOUNT_UNREAD_SYNCH
Definition: CharacterDatabase.h:83
@ CHAR_SEL_NEXT_MAIL_DELIVERYTIME
Definition: CharacterDatabase.h:352

References CHAR_SEL_CHARACTER_MAILCOUNT_UNREAD_SYNCH, CHAR_SEL_NEXT_MAIL_DELIVERYTIME, CharacterDatabase, GameTime::GetGameTime(), Object::GetGUID(), m_nextMailDelivereTime, PreparedStatementBase::SetData(), and unReadMails.

Referenced by _LoadMail(), and WorldSession::HandleGetMailList().

◆ UpdateObjectVisibility()

void Player::UpdateObjectVisibility ( bool  forced = true,
bool  fromUpdate = false 
)
overridevirtual

Reimplemented from WorldObject.

1569{
1570 // Prevent updating visibility if player is not in world (example: LoadFromDB sets drunkstate which updates invisibility while player is not in map)
1571 if (!IsInWorld())
1572 return;
1573
1574 if (!forced)
1576 else if (!isBeingLoaded())
1577 {
1578 if (!fromUpdate) // pussywizard:
1579 {
1581 return;
1582 }
1585 }
1586}
void AddToNotify(uint16 f)
Definition: Object.cpp:2907
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: Unit.cpp:19298

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(), SetDrunkValue(), SetGameMaster(), SetGroup(), and Update().

◆ UpdateParryPercentage()

void Player::UpdateParryPercentage ( )
743{
744 const float parry_cap[MAX_CLASSES] =
745 {
746 47.003525f, // Warrior
747 47.003525f, // Paladin
748 145.560408f, // Hunter
749 145.560408f, // Rogue
750 0.0f, // Priest
751 47.003525f, // DK
752 145.560408f, // Shaman
753 0.0f, // Mage
754 0.0f, // Warlock
755 0.0f, // ??
756 0.0f // Druid
757 };
758
759 // No parry
760 float value = 0.0f;
761 m_realParry = 0.0f;
762 uint32 pclass = getClass() - 1;
763 if (CanParry() && parry_cap[pclass] > 0.0f)
764 {
765 float nondiminishing = 5.0f;
766 // Parry from rating
767 float diminishing = GetRatingBonusValue(CR_PARRY);
768 // Modify value from defense skill (only bonus from defense rating diminishes)
769 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
770 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
771 // Parry from SPELL_AURA_MOD_PARRY_PERCENT aura
773 // apply diminishing formula to diminishing parry chance
774 m_realParry = nondiminishing + diminishing * parry_cap[pclass] / (diminishing + parry_cap[pclass] * m_diminishing_k[pclass]);
775 m_realParry = m_realParry < 0.0f ? 0.0f : m_realParry;
776
777 value = std::max(diminishing + nondiminishing, 0.0f);
778
779 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
780 {
781 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Parry", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Parry", 95.0f) : value;
782 }
783 }
784
786}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition: SpellAuraDefines.h:110
bool CanParry() const
Definition: Player.h:2132

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
1972{ 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:1112

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.

1114{
1115 if (!Unit::UpdatePosition(x, y, z, orientation, teleport))
1116 return false;
1117
1118 // Update player zone if needed
1119 if (m_needZoneUpdate)
1120 {
1121 uint32 newZone, newArea;
1122 GetZoneAndAreaId(newZone, newArea);
1123 UpdateZone(newZone, newArea);
1124 m_needZoneUpdate = false;
1125 }
1126
1127 if (GetGroup())
1129
1132
1134
1135 return true;
1136}
@ GROUP_UPDATE_FLAG_POSITION
Definition: Group.h:107
void CheckAreaExploreAndOutdoor()
Definition: Player.cpp:5617
Player * GetTrader() const
Definition: Player.h:1343
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition: Unit.cpp:20194

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::spell_rog_killing_spree_AuraScript::HandleEffectPeriodic(), and WorldSession::HandleMoveTeleportAck().

◆ UpdatePotionCooldown()

void Player::UpdatePotionCooldown ( Spell spell = nullptr)
1499{
1500 // no potion used i combat or still in combat
1501 if (!GetLastPotionId() || IsInCombat())
1502 return;
1503
1504 // Call not from spell cast, send cooldown event for item spells if no in
1505 // combat
1506 if (!spell)
1507 {
1508 // spell/item pair let set proper cooldown (except not existed charged
1509 // spell cooldown spellmods for potions)
1510 if (ItemTemplate const* proto =
1511 sObjectMgr->GetItemTemplate(GetLastPotionId()))
1512 for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
1513 if (proto->Spells[idx].SpellId &&
1514 proto->Spells[idx].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)
1515 if (SpellInfo const* spellInfo =
1516 sSpellMgr->GetSpellInfo(proto->Spells[idx].SpellId))
1517 SendCooldownEvent(spellInfo, GetLastPotionId());
1518 }
1519 // from spell cases (m_lastPotionId set in Spell::SendSpellCooldown)
1520 else
1521 {
1522 if (spell->IsIgnoringCooldowns())
1523 return;
1524
1526 }
1527
1528 SetLastPotionId(0);
1529}
void SetLastPotionId(uint32 item_id)
Definition: Player.h:1763
uint32 GetLastPotionId()
Definition: Player.h:1762
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition: Player.cpp:11003
bool IsIgnoringCooldowns() const
Definition: Spell.cpp:8033

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 
)

◆ 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:1481

References PvPInfo::EndTimer, HasPlayerFlag(), PvPInfo::IsHostile, IsPvP(), PLAYER_FLAGS_PVP_TIMER, pvpInfo, SetPlayerFlag(), and UpdatePvP().

Referenced by Update().

◆ UpdatePvPState()

void Player::UpdatePvPState ( )
1392{
1394
1395 if (pvpInfo.IsHostile) // in hostile area
1396 {
1397 if (!IsPvP() || pvpInfo.EndTimer != 0)
1398 UpdatePvP(true, true);
1399 }
1400 else // in friendly area
1401 {
1403 pvpInfo.EndTimer == 0)
1404 pvpInfo.EndTimer = GameTime::GetGameTime().count(); // start toggle-off
1405 }
1406}
@ PLAYER_FLAGS_IN_PVP
Definition: Player.h:484

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)
575{
576 int32 amount = m_baseRatingValue[cr];
577 // Apply bonus from SPELL_AURA_MOD_RATING_FROM_STAT
578 // stat used stored in miscValueB for this aura
579 AuraEffectList const& modRatingFromStat =
581 for (AuraEffectList::const_iterator i = modRatingFromStat.begin();
582 i != modRatingFromStat.end(); ++i)
583 if ((*i)->GetMiscValue() & (1 << cr))
584 amount += int32(CalculatePct(GetStat(Stats((*i)->GetMiscValueB())),
585 (*i)->GetAmount()));
586 if (amount < 0)
587 amount = 0;
588 SetUInt32Value(static_cast<uint16>(PLAYER_FIELD_COMBAT_RATING_1) + static_cast<uint16>(cr), uint32(amount));
589
590 bool affectStats = CanModifyStats();
591
592 switch (cr)
593 {
594 case CR_WEAPON_SKILL: // Implemented in Unit::RollMeleeOutcomeAgainst
595 case CR_DEFENSE_SKILL:
597 break;
598 case CR_DODGE:
600 break;
601 case CR_PARRY:
603 break;
604 case CR_BLOCK:
606 break;
607 case CR_HIT_MELEE:
609 break;
610 case CR_HIT_RANGED:
612 break;
613 case CR_HIT_SPELL:
615 break;
616 case CR_CRIT_MELEE:
617 if (affectStats)
618 {
621 }
622 break;
623 case CR_CRIT_RANGED:
624 if (affectStats)
626 break;
627 case CR_CRIT_SPELL:
628 if (affectStats)
630 break;
631 case CR_HIT_TAKEN_MELEE: // Implemented in Unit::MeleeMissChanceCalc
633 break;
634 case CR_HIT_TAKEN_SPELL: // Implemented in Unit::MagicSpellHitResult
635 break;
636 case CR_CRIT_TAKEN_MELEE: // Implemented in Unit::RollMeleeOutcomeAgainst
637 // (only for chance to crit)
639 break;
640 case CR_CRIT_TAKEN_SPELL: // Implemented in Unit::SpellCriticalBonus (only
641 // for chance to crit)
642 break;
643 case CR_HASTE_MELEE: // Implemented in Player::ApplyRatingMod
644 case CR_HASTE_RANGED:
645 case CR_HASTE_SPELL:
646 break;
647 case CR_WEAPON_SKILL_MAINHAND: // Implemented in
648 // Unit::RollMeleeOutcomeAgainst
651 break;
652 case CR_EXPERTISE:
653 if (affectStats)
654 {
657 }
658 break;
660 if (affectStats)
662 break;
663 }
664}
@ CR_WEAPON_SKILL_RANGED
Definition: Unit.h:426
@ CR_WEAPON_SKILL
Definition: Unit.h:404
@ CR_WEAPON_SKILL_OFFHAND
Definition: Unit.h:425
@ CR_WEAPON_SKILL_MAINHAND
Definition: Unit.h:424
@ SPELL_AURA_MOD_RATING_FROM_STAT
Definition: SpellAuraDefines.h:283
void UpdateArmorPenetration(int32 amount)
Definition: StatSystem.cpp:854
void UpdateSpellHitChances()
Definition: StatSystem.cpp:872
void UpdateMeleeHitChances()
Definition: StatSystem.cpp:860
void UpdateRangedHitChances()
Definition: StatSystem.cpp:866

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, Object::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)
966{
967 if (rune >= NUM_RUNE_TYPES)
968 return;
969
970 uint32 cooldown = 0;
971
972 for (uint32 i = 0; i < MAX_RUNES; ++i)
973 if (GetBaseRune(i) == rune)
974 {
975 cooldown = GetRuneBaseCooldown(i, true);
976 break;
977 }
978
979 if (cooldown <= 0)
980 return;
981
982 float regen = float(1 * IN_MILLISECONDS) / float(cooldown);
984}
uint32 GetRuneBaseCooldown(uint8 index, bool skipGrace)
Definition: Player.cpp:13260

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 ( )
530{
532}
uint32 GetShieldBlockValue() const override
Definition: Player.cpp:4988

References GetShieldBlockValue(), PLAYER_SHIELD_BLOCK, and Object::SetUInt32Value().

Referenced by HandleBaseModValue(), UpdateAllStats(), and UpdateStats().

◆ UpdateSkill()

bool Player::UpdateSkill ( uint32  skill_id,
uint32  step 
)
674{
675 if (!skill_id)
676 return false;
677
678 SkillStatusMap::iterator itr = mSkillStatus.find(skill_id);
679 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
680 return false;
681
682 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
683 uint32 data = GetUInt32Value(valueIndex);
684 uint32 value = SKILL_VALUE(data);
685 uint32 max = SKILL_MAX(data);
686
687 if ((!max) || (!value) || (value >= max))
688 return false;
689
690 if (value < max)
691 {
692 uint32 new_value = value + step;
693 if (new_value > max)
694 new_value = max;
695
696 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, max));
697 if (itr->second.uState != SKILL_NEW)
698 itr->second.uState = SKILL_CHANGED;
699
700 UpdateSkillEnchantments(skill_id, value, new_value);
702 skill_id);
703 return true;
704 }
705
706 return false;
707}

References ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, Object::GetUInt32Value(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Object::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 
)
4708{
4709 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
4710 {
4711 if (m_items[i])
4712 {
4713 for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
4714 {
4715 uint32 ench_id = m_items[i]->GetEnchantmentId(EnchantmentSlot(slot));
4716 if (!ench_id)
4717 continue;
4718
4719 SpellItemEnchantmentEntry const* Enchant = sSpellItemEnchantmentStore.LookupEntry(ench_id);
4720 if (!Enchant)
4721 return;
4722
4723 if (Enchant->requiredSkill == skill_id)
4724 {
4725 // Checks if the enchantment needs to be applied or removed
4726 if (curr_value < Enchant->requiredSkillValue && new_value >= Enchant->requiredSkillValue)
4727 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), true);
4728 else if (new_value < Enchant->requiredSkillValue && curr_value >= Enchant->requiredSkillValue)
4729 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), false);
4730 }
4731
4732 // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements
4733 // rather than the gem requirements itself. If the socket has no color it is a prismatic socket.
4735 && !m_items[i]->GetTemplate()->Socket[slot - SOCK_ENCHANTMENT_SLOT].Color)
4736 {
4737 SpellItemEnchantmentEntry const* pPrismaticEnchant = sSpellItemEnchantmentStore.LookupEntry(m_items[i]->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT));
4738
4739 if (pPrismaticEnchant && pPrismaticEnchant->requiredSkill == skill_id)
4740 {
4741 if (curr_value < pPrismaticEnchant->requiredSkillValue && new_value >= pPrismaticEnchant->requiredSkillValue)
4742 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), true);
4743 else if (new_value < pPrismaticEnchant->requiredSkillValue && curr_value >= pPrismaticEnchant->requiredSkillValue)
4744 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), false);
4745 }
4746 }
4747 }
4748 }
4749 }
4750}
Definition: Socket.h:39

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 
)
872{
873 LOG_DEBUG("entities.player.skills",
874 "UpdateSkillPro(SkillId {}, Chance {:3.1f}%)", SkillId,
875 Chance / 10.0f);
876 if (!SkillId)
877 return false;
878
879 if (Chance <= 0) // speedup in 0 chance case
880 {
881 LOG_DEBUG("entities.player.skills",
882 "Player::UpdateSkillPro Chance={:3.1f}% missed",
883 Chance / 10.0f);
884 return false;
885 }
886
887 SkillStatusMap::iterator itr = mSkillStatus.find(SkillId);
888 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
889 return false;
890
891 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
892
893 uint32 data = GetUInt32Value(valueIndex);
894 uint16 SkillValue = SKILL_VALUE(data);
895 uint16 MaxValue = SKILL_MAX(data);
896
897 if (!MaxValue || !SkillValue || SkillValue >= MaxValue)
898 return false;
899
900 int32 Roll = irand(1, 1000);
901
902 if (Roll <= Chance)
903 {
904 uint32 new_value = SkillValue + step;
905 if (new_value > MaxValue)
906 new_value = MaxValue;
907
908 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, MaxValue));
909 if (itr->second.uState != SKILL_NEW)
910 itr->second.uState = SKILL_CHANGED;
911
912 for (size_t i = 0; i < bonusSkillLevelsSize; ++i)
913 {
914 uint32 bsl = bonusSkillLevels[i];
915 if (SkillValue < bsl && new_value >= bsl)
916 {
917 learnSkillRewardedSpells(SkillId, new_value);
918 break;
919 }
920 }
921 UpdateSkillEnchantments(SkillId, SkillValue, new_value);
923 SkillId);
924 LOG_DEBUG("entities.player.skills",
925 "Player::UpdateSkillPro Chance={:3.1f}% taken",
926 Chance / 10.0f);
927 return true;
928 }
929
930 LOG_DEBUG("entities.player.skills",
931 "Player::UpdateSkillPro Chance={:3.1f}% missed", Chance / 10.0f);
932 return false;
933}
int32 irand(int32 min, int32 max)
Definition: Random.cpp:37
static const size_t bonusSkillLevelsSize
Definition: PlayerUpdates.cpp:868
static uint32 bonusSkillLevels[]
Definition: PlayerUpdates.cpp:867
Definition: Group.h:142

References ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, bonusSkillLevels, bonusSkillLevelsSize, Object::GetUInt32Value(), irand(), learnSkillRewardedSpells(), LOG_DEBUG, MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Object::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

1036{
1037 uint16 maxconfskill = sWorld->GetConfigMaxSkillValue();
1038 uint32 maxSkill = GetMaxSkillValueForLevel();
1039
1040 bool alwaysMaxSkill =
1042
1043 for (SkillStatusMap::iterator itr = mSkillStatus.begin();
1044 itr != mSkillStatus.end(); ++itr)
1045 {
1046 if (itr->second.uState == SKILL_DELETED)
1047 continue;
1048
1049 uint32 pskill = itr->first;
1050 SkillRaceClassInfoEntry const* rcEntry =
1052 if (!rcEntry)
1053 continue;
1054
1055 if (GetSkillRangeType(rcEntry) != SKILL_RANGE_LEVEL)
1056 continue;
1057
1058 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
1059 uint32 data = GetUInt32Value(valueIndex);
1060 uint32 max = SKILL_MAX(data);
1061 uint32 val = SKILL_VALUE(data);
1062
1064 if (max != 1)
1065 {
1067 if (alwaysMaxSkill ||
1069 {
1070 SetUInt32Value(valueIndex,
1071 MAKE_SKILL_VALUE(maxSkill, maxSkill));
1072 if (itr->second.uState != SKILL_NEW)
1073 itr->second.uState = SKILL_CHANGED;
1074 }
1075 else if (max != maxconfskill)
1077 {
1078 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(val, maxSkill));
1079 if (itr->second.uState != SKILL_NEW)
1080 itr->second.uState = SKILL_CHANGED;
1081 }
1082 }
1083 }
1084}
@ CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL
Definition: IWorld.h:99

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, Object::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 ( )
1087{
1088 for (SkillStatusMap::iterator itr = mSkillStatus.begin();
1089 itr != mSkillStatus.end(); ++itr)
1090 {
1091 if (itr->second.uState == SKILL_DELETED)
1092 continue;
1093
1094 uint32 pskill = itr->first;
1095 if (IsProfessionOrRidingSkill(pskill))
1096 continue;
1097 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
1098 uint32 data = GetUInt32Value(valueIndex);
1099 uint32 max = SKILL_MAX(data);
1100
1101 if (max > 1)
1102 {
1103 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(max, max));
1104 if (itr->second.uState != SKILL_NEW)
1105 itr->second.uState = SKILL_CHANGED;
1106 }
1107 if (pskill == SKILL_DEFENSE)
1109 }
1110}

References Object::GetUInt32Value(), IsProfessionOrRidingSkill(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Object::SetUInt32Value(), SKILL_CHANGED, SKILL_DEFENSE, SKILL_DELETED, SKILL_MAX, SKILL_NEW, and UpdateDefenseBonusesMod().

Referenced by GiveLevel(), and misc_commandscript::HandleMaxSkillCommand().

◆ UpdateSoulboundTradeItems()

void Player::UpdateSoulboundTradeItems ( )
4137{
4138 std::lock_guard<std::mutex> guard(m_soulboundTradableLock);
4139 if (m_itemSoulboundTradeable.empty())
4140 return;
4141
4142 // also checks for garbage data
4143 for (ItemDurationList::iterator itr = m_itemSoulboundTradeable.begin(); itr != m_itemSoulboundTradeable.end();)
4144 {
4145 ASSERT(*itr);
4146 if ((*itr)->GetOwnerGUID() != GetGUID())
4147 {
4148 m_itemSoulboundTradeable.erase(itr++);
4149 continue;
4150 }
4151 if ((*itr)->CheckSoulboundTradeExpire())
4152 {
4153 m_itemSoulboundTradeable.erase(itr++);
4154 continue;
4155 }
4156 ++itr;
4157 }
4158}

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:279
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT
Definition: IWorld.h:277
@ CONFIG_CHATFLOOD_MESSAGE_DELAY
Definition: IWorld.h:276
@ CONFIG_CHATFLOOD_MESSAGE_COUNT
Definition: IWorld.h:275
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY
Definition: IWorld.h:278
std::array< ChatFloodThrottle, ChatFloodThrottle::MAX > m_chatFloodData
Definition: Player.h:2717
@ ADDON
Definition: Player.h:2267
@ REGULAR
Definition: Player.h:2266

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)
2146{
2147 uint32 curCount = GetSpecsCount();
2148 if (curCount == count)
2149 return;
2150
2151 if (m_activeSpec >= count)
2152 ActivateSpec(0);
2153
2154 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2155 CharacterDatabasePreparedStatement* stmt = nullptr;
2156
2157 // Copy spec data
2158 if (count > curCount)
2159 {
2160 _SaveActions(trans); // make sure the button list is cleaned up
2161 for (ActionButtonList::iterator itr = m_actionButtons.begin();
2162 itr != m_actionButtons.end(); ++itr)
2163 {
2164 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
2165 stmt->SetData(0, GetGUID().GetCounter());
2166 stmt->SetData(1, 1);
2167 stmt->SetData(2, itr->first);
2168 stmt->SetData(3, itr->second.GetAction());
2169 stmt->SetData(4, uint8(itr->second.GetType()));
2170 trans->Append(stmt);
2171 }
2172 }
2173 // Delete spec data for removed spec.
2174 else if (count < curCount)
2175 {
2176 _SaveActions(trans);
2177
2178 stmt = CharacterDatabase.GetPreparedStatement(
2180 stmt->SetData(0, m_activeSpec);
2181 stmt->SetData(1, GetGUID().GetCounter());
2182 trans->Append(stmt);
2183
2184 m_activeSpec = 0;
2185 }
2186
2187 CharacterDatabase.CommitTransaction(trans);
2188
2189 SetSpecsCount(count);
2190
2191 SendTalentsInfoData(false);
2192}
@ CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC
Definition: CharacterDatabase.h:454
void ActivateSpec(uint8 spec)
Definition: Player.cpp:14953
void SetSpecsCount(uint8 count)
Definition: Player.h:1698

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().

Referenced by Spell::EffectSpecCount().

◆ UpdateSpellCritChance()

void Player::UpdateSpellCritChance ( uint32  school)
830{
831 // For normal school set zero crit chance
832 if (school == SPELL_SCHOOL_NORMAL)
833 {
835 return;
836 }
837 // For others recalculate it from:
838 float crit = 0.0f;
839 // Crit from Intellect
841 // Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE
843 // Increase crit from SPELL_AURA_MOD_CRIT_PCT
845 // Increase crit by school from SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
847 // Increase crit from spell crit ratings
849
850 // Store crit value
852}
@ 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:5067
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5873
int32 GetTotalAuraModifierAreaExclusive(AuraType auratype) const
Definition: Unit.cpp:5802

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:12613
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:11855

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 ( )
1698{
1699 if (m_clientGUIDs.empty())
1700 return;
1701
1702 if (!IsInWorld())
1703 return;
1704
1705 UpdateData udata;
1706 WorldPacket packet;
1707 for (GuidUnorderedSet::iterator itr = m_clientGUIDs.begin();
1708 itr != m_clientGUIDs.end(); ++itr)
1709 {
1710 if ((*itr).IsCreatureOrVehicle())
1711 {
1712 Creature* creature = GetMap()->GetCreature(*itr);
1713 // Update fields of triggers, transformed units or unselectable
1714 // units (values dependent on GM state)
1715 if (!creature || (!creature->IsTrigger() &&
1716 !creature->HasAuraType(SPELL_AURA_TRANSFORM) &&
1718 continue;
1719
1721 creature->BuildValuesUpdateBlockForPlayer(&udata, this);
1723 }
1724 else if ((*itr).IsGameObject())
1725 {
1726 GameObject* go = GetMap()->GetGameObject(*itr);
1727 if (!go)
1728 continue;
1729
1731 go->BuildValuesUpdateBlockForPlayer(&udata, this);
1733 }
1734 }
1735
1736 if (!udata.HasData())
1737 return;
1738
1739 udata.BuildPacket(&packet);
1740 GetSession()->SendPacket(&packet);
1741}
@ UF_FLAG_PUBLIC
Definition: UpdateFieldFlags.h:27
bool IsTrigger() const
Definition: Creature.h:77
void RemoveFieldNotifyFlag(uint16 flag)
Definition: Object.h:189
void SetFieldNotifyFlag(uint16 flag)
Definition: Object.h:188
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)
1544{
1545 // After added to map seer must be a player - there is no possibility to
1546 // still have different seer (all charm auras must be already removed)
1547 if (mapChange && m_seer != this)
1548 {
1549 m_seer = this;
1550 }
1551
1552 Acore::VisibleNotifier notifierNoLarge(
1553 *this, mapChange,
1554 false); // visit only objects which are not large; default distance
1555 Cell::VisitAllObjects(m_seer, notifierNoLarge,
1557 notifierNoLarge.SendToSelf();
1558
1559 Acore::VisibleNotifier notifierLarge(
1560 *this, mapChange, true); // visit only large objects; maximum distance
1561 Cell::VisitAllObjects(m_seer, notifierLarge, GetSightRange());
1562 notifierLarge.SendToSelf();
1563
1564 if (mapChange)
1565 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
1566}
#define VISIBILITY_INC_FOR_GOBJECTS
Definition: ObjectDefines.h:28
float GetSightRange(WorldObject const *target=nullptr) const override
Definition: Player.cpp:16166
Position m_last_notify_position
Definition: Unit.h:2409
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:207
Definition: GridNotifiers.h:42

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 
)
1636{
1637 if (HaveAtClient(target))
1638 {
1639 if (!CanSeeOrDetect(target, false, true))
1640 {
1641 BeforeVisibilityDestroy<T>(target, this);
1642
1643 target->BuildOutOfRangeUpdateBlock(&data);
1644 m_clientGUIDs.erase(target->GetGUID());
1645 }
1646 }
1647 else
1648 {
1649 if (CanSeeOrDetect(target, false, true))
1650 {
1651 target->BuildCreateUpdateBlockForPlayer(&data, this);
1652 UpdateVisibilityOf_helper(m_clientGUIDs, target, visibleNow);
1653 }
1654 }
1655}
void UpdateVisibilityOf_helper(GuidUnorderedSet &s64, T *target, std::vector< Unit * > &)
Definition: PlayerUpdates.cpp:1589
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:11306

References WorldObject::CanSeeOrDetect(), HaveAtClient(), m_clientGUIDs, and UpdateVisibilityOf_helper().

◆ UpdateVisibilityOf() [2/2]

void Player::UpdateVisibilityOf ( WorldObject target)
1669{
1670 if (HaveAtClient(target))
1671 {
1672 if (!CanSeeOrDetect(target, false, true))
1673 {
1674 if (target->GetTypeId() == TYPEID_UNIT)
1676
1677 target->DestroyForPlayer(this);
1678 m_clientGUIDs.erase(target->GetGUID());
1679 }
1680 }
1681 else
1682 {
1683 if (CanSeeOrDetect(target, false, true))
1684 {
1685 target->SendUpdateToPlayer(this);
1686 m_clientGUIDs.insert(target->GetGUID());
1687
1688 // target aura duration for caster show only if target exist at
1689 // caster client send data at target visibility change (adding to
1690 // client)
1691 if (target->isType(TYPEMASK_UNIT))
1692 GetInitialVisiblePackets((Unit*) target);
1693 }
1694 }
1695}
void BeforeVisibilityDestroy< Creature >(Creature *t, Player *p)
Definition: PlayerUpdates.cpp:1627
void GetInitialVisiblePackets(Unit *target)
Definition: PlayerUpdates.cpp:1657

References BeforeVisibilityDestroy< Creature >(), WorldObject::CanSeeOrDetect(), Object::DestroyForPlayer(), Object::GetGUID(), GetInitialVisiblePackets(), Object::GetTypeId(), HaveAtClient(), Object::isType(), m_clientGUIDs, Object::SendUpdateToPlayer(), Object::ToCreature(), TYPEID_UNIT, and TYPEMASK_UNIT.

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 
)
936{
937 if (IsInFeralForm())
938 return; // always maximized SKILL_FERAL_COMBAT in fact
939
941 return; // use weapon but not skill up
942
943 if (victim->GetTypeId() == TYPEID_UNIT &&
946 return;
947
948 uint32 weapon_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_WEAPON);
949
950 Item* tmpitem = GetWeaponForAttack(attType, true);
951 if (item && item != tmpitem && !item->IsBroken())
952 {
953 tmpitem = item;
954 }
955
956 if (!tmpitem && attType == BASE_ATTACK)
957 {
958 // Keep unarmed & fist weapon skills in sync
959 UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
960 UpdateSkill(SKILL_FIST_WEAPONS, weapon_skill_gain);
961 }
962 else if (tmpitem && tmpitem->GetTemplate()->SubClass !=
964 {
965 switch (tmpitem->GetTemplate()->SubClass)
966 {
968 break;
970 UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
971 [[fallthrough]];
972 default:
973 UpdateSkill(tmpitem->GetSkill(), weapon_skill_gain);
974 break;
975 }
976 }
977
979}
@ CREATURE_FLAG_EXTRA_NO_SKILL_GAINS
Definition: CreatureData.h:67
@ ITEM_SUBCLASS_WEAPON_FIST
Definition: ItemTemplate.h:366
@ FORM_TREE
Definition: Unit.h:92
@ CONFIG_SKILL_GAIN_WEAPON
Definition: IWorld.h:272

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(), Object::GetTypeId(), GetWeaponForAttack(), Item::IsBroken(), Unit::IsInFeralForm(), ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_FIST, SKILL_FIST_WEAPONS, SKILL_UNARMED, ItemTemplate::SubClass, sWorld, Object::ToCreature(), TYPEID_UNIT, UpdateAllCritPercentages(), and UpdateSkill().

Referenced by UpdateCombatSkills().

◆ UpdateZone()

void Player::UpdateZone ( uint32  newZone,
uint32  newArea 
)
1209{
1210 if (!newZone)
1211 {
1212 return;
1213 }
1214
1215 if (m_zoneUpdateId != newZone)
1216 {
1217 sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1218 sOutdoorPvPMgr->HandlePlayerEnterZone(this, newZone);
1219 sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1220 sBattlefieldMgr->HandlePlayerEnterZone(this, newZone);
1221 SendInitWorldStates(newZone,
1222 newArea); // only if really enters to new zone, not
1223 // just area change, works strange...
1224 if (Guild* guild = GetGuild())
1225 guild->UpdateMemberData(this, GUILD_MEMBER_DATA_ZONEID, newZone);
1226 }
1227
1228 // group update
1229 if (GetGroup())
1231
1232 m_zoneUpdateId = newZone;
1234
1235 // zone changed, so area changed as well, update it
1236 UpdateArea(newArea);
1237
1238 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(newZone);
1239 if (!zone)
1240 return;
1241
1242 if (sWorld->getBoolConfig(CONFIG_WEATHER))
1243 {
1244 if (Weather* weather = WeatherMgr::FindWeather(zone->ID))
1245 weather->SendWeatherUpdateToPlayer(this);
1246 else if (!WeatherMgr::AddWeather(zone->ID))
1247 // send fine weather packet to remove old zone's weather
1249 }
1250
1251 sScriptMgr->OnPlayerUpdateZone(this, newZone, newArea);
1252
1253 // in PvP, any not controlled zone (except zone->team == 6, default case)
1254 // in PvE, only opposition team capital
1255 switch (zone->team)
1256 {
1257 case AREATEAM_ALLY:
1259 GetTeamId(true) != TEAM_ALLIANCE &&
1260 (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL);
1261 break;
1262 case AREATEAM_HORDE:
1264 GetTeamId(true) != TEAM_HORDE &&
1265 (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL);
1266 break;
1267 case AREATEAM_NONE:
1268 // overwrite for battlegrounds, maybe batter some zone flags but current
1269 // known not 100% fit to this
1270 pvpInfo.IsInHostileArea = sWorld->IsPvPRealm() || InBattleground() ||
1272 break;
1273 default: // 6 in fact
1274 pvpInfo.IsInHostileArea = false;
1275 break;
1276 }
1277
1278 // Treat players having a quest flagging for PvP as always in hostile area
1280
1281 if (zone->flags & AREA_FLAG_CAPITAL) // Is in a capital city
1282 {
1283 if (!pvpInfo.IsHostile || zone->IsSanctuary())
1285
1286 pvpInfo.IsInNoPvPArea = true;
1287 }
1288 else
1289 RemoveRestFlag(REST_FLAG_IN_CITY); // Recently left a capital city
1290
1292
1293 // remove items with area/map limitations (delete only for alive player to
1294 // allow back in ghost mode) if player resurrected at teleport this will be
1295 // applied in resurrect code
1296 if (IsAlive())
1297 DestroyZoneLimitedItem(true, newZone);
1298
1299 // check some item equip limitations (in result lost CanTitanGrip at talent
1300 // reset, for example)
1302
1303 // recent client version not send leave/join channel packets for built-in
1304 // local channels
1305 UpdateLocalChannels(newZone);
1306
1307 UpdateZoneDependentAuras(newZone);
1308}
@ REST_FLAG_IN_CITY
Definition: Player.h:808
@ GROUP_UPDATE_FULL
Definition: Group.h:120
@ GUILD_MEMBER_DATA_ZONEID
Definition: Guild.h:61
@ CONFIG_WEATHER
Definition: IWorld.h:98
@ AREATEAM_HORDE
Definition: DBCEnums.h:64
@ AREATEAM_NONE
Definition: DBCEnums.h:62
@ AREATEAM_ALLY
Definition: DBCEnums.h:63
@ AREA_FLAG_CAPITAL
Definition: DBCEnums.h:247
@ AREA_FLAG_WINTERGRASP
Definition: DBCEnums.h:263
Weather * AddWeather(uint32 zone_id)
Add a Weather object to the list.
Definition: WeatherMgr.cpp:68
void SendFineWeatherUpdateToPlayer(Player *player)
Definition: WeatherMgr.cpp:146
Weather * FindWeather(uint32 id)
Find a Weather object by the given zoneid.
Definition: WeatherMgr.cpp:51
void UpdateLocalChannels(uint32 newZone)
Definition: PlayerUpdates.cpp:464
void SendInitWorldStates(uint32 zone, uint32 area)
Definition: Player.cpp:8064
void DestroyZoneLimitedItem(bool update, uint32 new_zone)
Definition: PlayerStorage.cpp:3340
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)
1805{
1806 // Some spells applied at enter into zone (with subzones), aura removed in
1807 // UpdateAreaDependentAuras that called always at zone->area update
1808 SpellAreaForAreaMapBounds saBounds =
1809 sSpellMgr->GetSpellAreaForAreaMapBounds(newZone);
1810 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first;
1811 itr != saBounds.second; ++itr)
1812 if (itr->second->autocast &&
1813 itr->second->IsFitToRequirements(this, newZone, 0))
1814 if (!HasAura(itr->second->spellId))
1815 CastSpell(this, itr->second->spellId, true);
1816}

References Unit::CastSpell(), Unit::HasAura(), and sSpellMgr.

Referenced by AddQuest(), CompleteQuest(), WorldSession::HandlePlayerLoginFromDB(), IncompleteQuest(), RemoveActiveQuest(), RewardQuest(), and UpdateZone().

◆ VehicleSpellInitialize()

void Player::VehicleSpellInitialize ( )
9467{
9468 Creature* vehicle = GetVehicleCreatureBase();
9469 if (!vehicle)
9470 return;
9471
9472 uint8 cooldownCount = vehicle->m_CreatureSpellCooldowns.size();
9473
9474 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * 10 + 1 + 1 + cooldownCount * (4 + 2 + 4 + 4));
9475 data << vehicle->GetGUID(); // Guid
9476 data << uint16(0); // Pet Family (0 for all vehicles)
9477 data << uint32(vehicle->IsSummon() ? vehicle->ToTempSummon()->GetTimer() : 0); // Duration
9478 // The following three segments are read by the client as one uint32
9479 data << uint8(vehicle->GetReactState()); // React State
9480 data << uint8(0); // Command State
9481 data << uint16(0x800); // DisableActions (set for all vehicles)
9482
9483 for (uint32 i = 0; i < MAX_CREATURE_SPELLS; ++i)
9484 {
9485 uint32 spellId = vehicle->m_spells[i];
9486 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9487 if (!spellInfo)
9488 {
9489 data << uint16(0) << uint8(0) << uint8(i + 8);
9490 continue;
9491 }
9492
9493 ConditionList conditions = sConditionMgr->GetConditionsForVehicleSpell(vehicle->GetEntry(), spellId);
9494 if (!sConditionMgr->IsObjectMeetToConditions(this, vehicle, conditions))
9495 {
9496 LOG_DEBUG("condition", "VehicleSpellInitialize: conditions not met for Vehicle entry {} spell {}", vehicle->ToCreature()->GetEntry(), spellId);
9497 data << uint16(0) << uint8(0) << uint8(i + 8);
9498 continue;
9499 }
9500
9501 if (spellInfo->IsPassive())
9502 vehicle->CastSpell(vehicle, spellId, true);
9503
9504 data << uint32(MAKE_UNIT_ACTION_BUTTON(spellId, i + 8));
9505 }
9506
9508 data << uint32(0);
9509
9510 data << uint8(0); // Auras?
9511
9512 // Cooldowns
9513 data << uint8(cooldownCount);
9514
9515 uint32 curTime = GameTime::GetGameTimeMS().count();
9517
9518 for (CreatureSpellCooldowns::const_iterator itr = vehicle->m_CreatureSpellCooldowns.begin(); itr != vehicle->m_CreatureSpellCooldowns.end(); ++itr)
9519 {
9520 uint16 category = itr->second.category;
9521 uint32 cooldown = (itr->second.end > curTime) ? itr->second.end - curTime : 0;
9522
9523 data << uint32(itr->first); // spellid
9524 data << uint16(itr->second.category); // spell category
9525
9526 // send infinity cooldown in special format
9527 if (itr->second.end >= infTime)
9528 {
9529 data << uint32(1); // cooldown
9530 data << uint32(0x80000000); // category cooldown
9531 continue;
9532 }
9533
9534 data << uint32(category ? 0 : cooldown); // cooldown
9535 data << uint32(category ? cooldown : 0); // category cooldown
9536 }
9537
9538 GetSession()->SendPacket(&data);
9539}
static constexpr uint32 MAX_CREATURE_SPELLS
Definition: Unit.h:153
#define MAX_SPELL_CONTROL_BAR
Definition: Unit.h:160
uint32 m_spells[MAX_CREATURE_SPELLS]
Definition: Creature.h:242
uint32 GetTimer()
Definition: TemporarySummon.h:57
Creature * GetVehicleCreatureBase() const
Definition: Unit.cpp:18915
TempSummon * ToTempSummon()
Definition: Unit.h:2400
bool IsSummon() const
Definition: Unit.h:1410

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 
)
2904{
2905 if (!pItem)
2906 return;
2907
2908 // check also BIND_WHEN_PICKED_UP and BIND_QUEST_ITEM for .additem or .additemset case by GM (not binded at adding to inventory)
2910 pItem->SetBinding(true);
2911
2912 LOG_DEBUG("entities.player.items", "STORAGE: EquipItem slot = {}, item = {}", slot, pItem->GetEntry());
2913
2914 m_items[slot] = pItem;
2915 SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID());
2918 pItem->SetSlot(slot);
2919 pItem->SetContainer(nullptr);
2920
2921 if (slot < EQUIPMENT_SLOT_END)
2922 SetVisibleItemSlot(slot, pItem);
2923
2924 pItem->SetState(ITEM_CHANGED, this);
2925}

References BIND_QUEST_ITEM, BIND_WHEN_EQUIPED, 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.

9301{
9302 ASSERT(target);
9303
9304 bool isAddonMessage = language == LANG_ADDON;
9305
9306 if (!isAddonMessage) // if not addon data
9307 language = LANG_UNIVERSAL; // whispers should always be readable
9308
9309 std::string _text(text);
9310
9311 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_WHISPER, language, _text, target))
9312 {
9313 return;
9314 }
9315
9316 sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, target);
9317
9318 WorldPacket data;
9319 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, language, this, this, _text);
9320 target->GetSession()->SendPacket(&data);
9321
9322 // rest stuff shouldn't happen in case of addon message
9323 if (isAddonMessage)
9324 return;
9325
9326 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text);
9327 GetSession()->SendPacket(&data);
9328
9329 if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster())
9330 {
9331 SetAcceptWhispers(true);
9333 }
9334
9335 // announce afk or dnd message
9336 if (target->isAFK())
9337 {
9338 ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_AFK, target->GetName().c_str(), target->autoReplyMsg.c_str());
9339 }
9340 else if (target->isDND())
9341 {
9342 ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_DND, target->GetName().c_str(), target->autoReplyMsg.c_str());
9343 }
9344}
@ LANG_PLAYER_DND
Definition: Language.h:652
@ LANG_PLAYER_AFK
Definition: Language.h:653
@ LANG_COMMAND_WHISPERON
Definition: Language.h:330
@ CHAT_MSG_WHISPER_INFORM
Definition: SharedDefines.h:3133
@ CHAT_MSG_WHISPER
Definition: SharedDefines.h:3131
Language
Definition: SharedDefines.h:706
@ LANG_ADDON
Definition: SharedDefines.h:725
bool isAcceptWhispers() const
Definition: Player.h:1134

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.

9347{
9348 if (!target)
9349 {
9350 return;
9351 }
9352
9353 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
9354 if (!bct)
9355 {
9356 LOG_ERROR("entities.unit", "Player::Whisper: `broadcast_text` was not {} found", textId);
9357 return;
9358 }
9359
9361 WorldPacket data;
9362 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
9363 target->SendDirectMessage(&data);
9364}
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_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.

9251{
9252 std::string _text(text);
9253
9254 if (!sScriptMgr->CanPlayerUseChat(this, CHAT_MSG_YELL, language, _text))
9255 {
9256 return;
9257 }
9258
9259 sScriptMgr->OnPlayerChat(this, CHAT_MSG_YELL, language, _text);
9260
9261 WorldPacket data;
9262 ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, language, this, this, _text);
9263 SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), true);
9264}
@ CONFIG_LISTEN_RANGE_YELL
Definition: IWorld.h:195
@ CHAT_MSG_YELL
Definition: SharedDefines.h:3130

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.

9267{
9268 Talk(textId, CHAT_MSG_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
9269}

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_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_homebindO

◆ 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(), WorldSession::HandleSetSelectionOpcode(), 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