diff options
author | QAston <> | 2010-02-20 20:28:31 +0100 |
---|---|---|
committer | QAston <> | 2010-02-20 20:28:31 +0100 |
commit | 2e3f89b61fa33e83b8f70702777549e25e5fc481 (patch) | |
tree | 904060daaf9fb782a20e5b2aea3e9febe813de65 /src/game/Player.h | |
parent | 4cd4c4170f70a0715daad52b2f1831b6017d647a (diff) | |
parent | 8e146c309de73160252ae538689d28660273d459 (diff) |
*Move summon water elemental handler to correct place.
--HG--
branch : trunk
Diffstat (limited to 'src/game/Player.h')
-rw-r--r-- | src/game/Player.h | 5273 |
1 files changed, 2637 insertions, 2636 deletions
diff --git a/src/game/Player.h b/src/game/Player.h index d5c7caafc49..0c4404617d0 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1,2636 +1,2637 @@ -/* - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _PLAYER_H -#define _PLAYER_H - -#include "Common.h" -#include "ItemPrototype.h" -#include "Unit.h" -#include "Item.h" - -#include "Database/DatabaseEnv.h" -#include "NPCHandler.h" -#include "QuestDef.h" -#include "Group.h" -#include "Bag.h" -#include "WorldSession.h" -#include "Pet.h" -#include "MapReference.h" -#include "Util.h" // for Tokens typedef -#include "AchievementMgr.h" -#include "ReputationMgr.h" -#include "BattleGround.h" -#include "DBCEnums.h" - -#include<string> -#include<vector> - -struct Mail; -class Channel; -class DynamicObject; -class Creature; -class Pet; -class PlayerMenu; -class UpdateMask; -class SpellCastTargets; -class PlayerSocial; -class OutdoorPvP; - -typedef std::deque<Mail*> PlayerMails; - -#define PLAYER_MAX_SKILLS 127 -#define PLAYER_MAX_DAILY_QUESTS 25 - -// Note: SPELLMOD_* values is aura types in fact -enum SpellModType -{ - SPELLMOD_FLAT = 107, // SPELL_AURA_ADD_FLAT_MODIFIER - SPELLMOD_PCT = 108 // SPELL_AURA_ADD_PCT_MODIFIER -}; - -// 2^n values, Player::m_isunderwater is a bitmask. These are Trinity internal values, they are never send to any client -enum PlayerUnderwaterState -{ - UNDERWATER_NONE = 0x00, - UNDERWATER_INWATER = 0x01, // terrain type is water and player is afflicted by it - UNDERWATER_INLAVA = 0x02, // terrain type is lava and player is afflicted by it - UNDERWATER_INSLIME = 0x04, // terrain type is lava and player is afflicted by it - UNDERWARER_INDARKWATER = 0x08, // terrain type is dark water and player is afflicted by it - - UNDERWATER_EXIST_TIMERS = 0x10 -}; - -enum PlayerSpellState -{ - PLAYERSPELL_UNCHANGED = 0, - PLAYERSPELL_CHANGED = 1, - PLAYERSPELL_NEW = 2, - PLAYERSPELL_REMOVED = 3, - PLAYERSPELL_TEMPORARY = 4 -}; - -struct PlayerSpell -{ - PlayerSpellState state : 8; - bool active : 1; // show in spellbook - bool dependent : 1; // learned as result another spell learn, skill grow, quest reward, etc - bool disabled : 1; // first rank has been learned in result talent learn but currently talent unlearned, save max learned ranks -}; - -struct PlayerTalent -{ - PlayerSpellState state : 8; - uint8 spec : 8; -}; - -// Spell modifier (used for modify other spells) -struct SpellModifier -{ - SpellModifier(Aura * _ownerAura = NULL) : charges(0), ownerAura(_ownerAura) {} - SpellModOp op : 8; - SpellModType type : 8; - int16 charges : 16; - int32 value; - flag96 mask; - uint32 spellId; - Aura * const ownerAura; -}; - -typedef UNORDERED_MAP<uint32, PlayerTalent*> PlayerTalentMap; -typedef UNORDERED_MAP<uint32, PlayerSpell*> PlayerSpellMap; -typedef std::list<SpellModifier*> SpellModList; - -struct SpellCooldown -{ - time_t end; - uint16 itemid; -}; - -typedef std::map<uint32, SpellCooldown> SpellCooldowns; - -enum TrainerSpellState -{ - TRAINER_SPELL_GREEN = 0, - TRAINER_SPELL_RED = 1, - TRAINER_SPELL_GRAY = 2, - TRAINER_SPELL_GREEN_DISABLED = 10 // custom value, not send to client: formally green but learn not allowed -}; - -enum ActionButtonUpdateState -{ - ACTIONBUTTON_UNCHANGED = 0, - ACTIONBUTTON_CHANGED = 1, - ACTIONBUTTON_NEW = 2, - ACTIONBUTTON_DELETED = 3 -}; - -enum ActionButtonType -{ - ACTION_BUTTON_SPELL = 0x00, - ACTION_BUTTON_C = 0x01, // click? - ACTION_BUTTON_EQSET = 0x20, - ACTION_BUTTON_MACRO = 0x40, - ACTION_BUTTON_CMACRO = ACTION_BUTTON_C | ACTION_BUTTON_MACRO, - ACTION_BUTTON_ITEM = 0x80 -}; - -#define ACTION_BUTTON_ACTION(X) (uint32(X) & 0x00FFFFFF) -#define ACTION_BUTTON_TYPE(X) ((uint32(X) & 0xFF000000) >> 24) -#define MAX_ACTION_BUTTON_ACTION_VALUE (0x00FFFFFF+1) - -struct ActionButton -{ - ActionButton() : packedData(0), uState( ACTIONBUTTON_NEW ), canRemoveByClient(true){} - - uint32 packedData; - ActionButtonUpdateState uState; - bool canRemoveByClient; - - // helpers - ActionButtonType GetType() const { return ActionButtonType(ACTION_BUTTON_TYPE(packedData)); } - uint32 GetAction() const { return ACTION_BUTTON_ACTION(packedData); } - void SetActionAndType(uint32 action, ActionButtonType type) - { - uint32 newData = action | (uint32(type) << 24); - if (newData != packedData || uState == ACTIONBUTTON_DELETED) - { - packedData = newData; - if (uState != ACTIONBUTTON_NEW) - uState = ACTIONBUTTON_CHANGED; - } - } -}; - -#define MAX_ACTION_BUTTONS 144 //checked in 3.2.0 - -typedef std::map<uint8,ActionButton> ActionButtonList; - -struct PlayerCreateInfoItem -{ - PlayerCreateInfoItem(uint32 id, uint32 amount) : item_id(id), item_amount(amount) {} - - uint32 item_id; - uint32 item_amount; -}; - -typedef std::list<PlayerCreateInfoItem> PlayerCreateInfoItems; - -struct PlayerClassLevelInfo -{ - PlayerClassLevelInfo() : basehealth(0), basemana(0) {} - uint16 basehealth; - uint16 basemana; -}; - -struct PlayerClassInfo -{ - PlayerClassInfo() : levelInfo(NULL) { } - - PlayerClassLevelInfo* levelInfo; //[level-1] 0..MaxPlayerLevel-1 -}; - -struct PlayerLevelInfo -{ - PlayerLevelInfo() { for (uint8 i=0; i < MAX_STATS; ++i ) stats[i] = 0; } - - uint8 stats[MAX_STATS]; -}; - -typedef std::list<uint32> PlayerCreateInfoSpells; - -struct PlayerCreateInfoAction -{ - PlayerCreateInfoAction() : button(0), type(0), action(0) {} - PlayerCreateInfoAction(uint8 _button, uint32 _action, uint8 _type) : button(_button), type(_type), action(_action) {} - - uint8 button; - uint8 type; - uint32 action; -}; - -typedef std::list<PlayerCreateInfoAction> PlayerCreateInfoActions; - -struct PlayerInfo -{ - // existence checked by displayId != 0 // existence checked by displayId != 0 - PlayerInfo() : displayId_m(0),displayId_f(0),levelInfo(NULL) - { - } - - uint32 mapId; - uint32 zoneId; - float positionX; - float positionY; - float positionZ; - uint16 displayId_m; - uint16 displayId_f; - PlayerCreateInfoItems item; - PlayerCreateInfoSpells spell; - PlayerCreateInfoActions action; - - PlayerLevelInfo* levelInfo; //[level-1] 0..MaxPlayerLevel-1 -}; - -struct PvPInfo -{ - PvPInfo() : inHostileArea(false), inNoPvPArea(false), inFFAPvPArea(false), endTimer(0) {} - - bool inHostileArea; - bool inNoPvPArea; - bool inFFAPvPArea; - time_t endTimer; -}; - -struct DuelInfo -{ - DuelInfo() : initiator(NULL), opponent(NULL), startTimer(0), startTime(0), outOfBound(0) {} - - Player *initiator; - Player *opponent; - time_t startTimer; - time_t startTime; - time_t outOfBound; -}; - -struct Areas -{ - uint32 areaID; - uint32 areaFlag; - float x1; - float x2; - float y1; - float y2; -}; - -#define MAX_RUNES 6 -#define RUNE_COOLDOWN 5 // 5*2=10 sec - -enum RuneType -{ - RUNE_BLOOD = 0, - RUNE_UNHOLY = 1, - RUNE_FROST = 2, - RUNE_DEATH = 3, - NUM_RUNE_TYPES = 4 -}; - -struct RuneInfo -{ - uint8 BaseRune; - uint8 CurrentRune; - uint8 Cooldown; - AuraEffect const * ConvertAura; -}; - -struct Runes -{ - RuneInfo runes[MAX_RUNES]; - uint8 runeState; // mask of available runes - RuneType lastUsedRune; - - void SetRuneState(uint8 index, bool set = true) - { - if(set) - runeState |= (1 << index); // usable - else - runeState &= ~(1 << index); // on cooldown - } -}; - -struct EnchantDuration -{ - EnchantDuration() : item(NULL), slot(MAX_ENCHANTMENT_SLOT), leftduration(0) {}; - EnchantDuration(Item * _item, EnchantmentSlot _slot, uint32 _leftduration) : item(_item), slot(_slot), - leftduration(_leftduration){ assert(item); }; - - Item * item; - EnchantmentSlot slot; - uint32 leftduration; -}; - -typedef std::list<EnchantDuration> EnchantDurationList; -typedef std::list<Item*> ItemDurationList; - -enum LfgType -{ - LFG_TYPE_NONE = 0, - LFG_TYPE_DUNGEON = 1, - LFG_TYPE_RAID = 2, - LFG_TYPE_QUEST = 3, - LFG_TYPE_ZONE = 4, - LFG_TYPE_HEROIC_DUNGEON = 5, - LFG_TYPE_RANDOM_DUNGEON = 6 -}; - -enum LfgRoles -{ - LEADER = 0x01, - TANK = 0x02, - HEALER = 0x04, - DAMAGE = 0x08 -}; - -struct LookingForGroupSlot -{ - LookingForGroupSlot() : entry(0), type(0) {} - bool Empty() const { return !entry && !type; } - void Clear() { entry = 0; type = 0; } - void Set(uint32 _entry, uint32 _type ) { entry = _entry; type = _type; } - bool Is(uint32 _entry, uint32 _type) const { return entry == _entry && type == _type; } - bool canAutoJoin() const { return entry && (type == LFG_TYPE_DUNGEON || type == LFG_TYPE_HEROIC_DUNGEON); } - - uint32 entry; - uint32 type; -}; - -#define MAX_LOOKING_FOR_GROUP_SLOT 3 - -struct LookingForGroup -{ - LookingForGroup() {} - bool HaveInSlot(LookingForGroupSlot const& slot) const { return HaveInSlot(slot.entry, slot.type); } - bool HaveInSlot(uint32 _entry, uint32 _type) const - { - for (uint8 i = 0; i < MAX_LOOKING_FOR_GROUP_SLOT; ++i) - if(slots[i].Is(_entry, _type)) - return true; - return false; - } - - bool canAutoJoin() const - { - for (uint8 i = 0; i < MAX_LOOKING_FOR_GROUP_SLOT; ++i) - if(slots[i].canAutoJoin()) - return true; - return false; - } - - bool Empty() const - { - for (uint8 i = 0; i < MAX_LOOKING_FOR_GROUP_SLOT; ++i) - if(!slots[i].Empty()) - return false; - return more.Empty(); - } - - LookingForGroupSlot slots[MAX_LOOKING_FOR_GROUP_SLOT]; - LookingForGroupSlot more; - std::string comment; - uint8 roles; -}; - -enum PlayerMovementType -{ - MOVE_ROOT = 1, - MOVE_UNROOT = 2, - MOVE_WATER_WALK = 3, - MOVE_LAND_WALK = 4 -}; - -enum DrunkenState -{ - DRUNKEN_SOBER = 0, - DRUNKEN_TIPSY = 1, - DRUNKEN_DRUNK = 2, - DRUNKEN_SMASHED = 3 -}; - -#define MAX_DRUNKEN 4 - -enum PlayerFlags -{ - PLAYER_FLAGS_GROUP_LEADER = 0x00000001, - PLAYER_FLAGS_AFK = 0x00000002, - PLAYER_FLAGS_DND = 0x00000004, - PLAYER_FLAGS_GM = 0x00000008, - PLAYER_FLAGS_GHOST = 0x00000010, - PLAYER_FLAGS_RESTING = 0x00000020, - PLAYER_FLAGS_UNK7 = 0x00000040, - PLAYER_FLAGS_UNK8 = 0x00000080, // pre-3.0.3 PLAYER_FLAGS_FFA_PVP flag for FFA PVP state - PLAYER_FLAGS_CONTESTED_PVP = 0x00000100, // Player has been involved in a PvP combat and will be attacked by contested guards - PLAYER_FLAGS_IN_PVP = 0x00000200, - PLAYER_FLAGS_HIDE_HELM = 0x00000400, - PLAYER_FLAGS_HIDE_CLOAK = 0x00000800, - PLAYER_FLAGS_UNK13 = 0x00001000, // played long time - PLAYER_FLAGS_UNK14 = 0x00002000, // played too long time - PLAYER_FLAGS_UNK15 = 0x00004000, - PLAYER_FLAGS_DEVELOPER = 0x00008000, // <Dev> prefix for something? - PLAYER_FLAGS_UNK17 = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary - PLAYER_FLAGS_UNK18 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1) - PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually) - PLAYER_FLAGS_UNK20 = 0x00080000, - PLAYER_FLAGS_UNK21 = 0x00100000, - PLAYER_FLAGS_UNK22 = 0x00200000, - PLAYER_FLAGS_UNK23 = 0x00400000, - PLAYER_ALLOW_ONLY_ABILITY = 0x00800000, // used by bladestorm and killing spree - PLAYER_FLAGS_UNK25 = 0x01000000, // disabled all melee ability on tab include autoattack - - PLAYER_FLAGS_NO_XP_GAIN = 0x02000000 -}; - -// used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<<bit_index) without (-1) -// can't use enum for uint64 values -#define PLAYER_TITLE_DISABLED UI64LIT(0x0000000000000000) -#define PLAYER_TITLE_NONE UI64LIT(0x0000000000000001) -#define PLAYER_TITLE_PRIVATE UI64LIT(0x0000000000000002) // 1 -#define PLAYER_TITLE_CORPORAL UI64LIT(0x0000000000000004) // 2 -#define PLAYER_TITLE_SERGEANT_A UI64LIT(0x0000000000000008) // 3 -#define PLAYER_TITLE_MASTER_SERGEANT UI64LIT(0x0000000000000010) // 4 -#define PLAYER_TITLE_SERGEANT_MAJOR UI64LIT(0x0000000000000020) // 5 -#define PLAYER_TITLE_KNIGHT UI64LIT(0x0000000000000040) // 6 -#define PLAYER_TITLE_KNIGHT_LIEUTENANT UI64LIT(0x0000000000000080) // 7 -#define PLAYER_TITLE_KNIGHT_CAPTAIN UI64LIT(0x0000000000000100) // 8 -#define PLAYER_TITLE_KNIGHT_CHAMPION UI64LIT(0x0000000000000200) // 9 -#define PLAYER_TITLE_LIEUTENANT_COMMANDER UI64LIT(0x0000000000000400) // 10 -#define PLAYER_TITLE_COMMANDER UI64LIT(0x0000000000000800) // 11 -#define PLAYER_TITLE_MARSHAL UI64LIT(0x0000000000001000) // 12 -#define PLAYER_TITLE_FIELD_MARSHAL UI64LIT(0x0000000000002000) // 13 -#define PLAYER_TITLE_GRAND_MARSHAL UI64LIT(0x0000000000004000) // 14 -#define PLAYER_TITLE_SCOUT UI64LIT(0x0000000000008000) // 15 -#define PLAYER_TITLE_GRUNT UI64LIT(0x0000000000010000) // 16 -#define PLAYER_TITLE_SERGEANT_H UI64LIT(0x0000000000020000) // 17 -#define PLAYER_TITLE_SENIOR_SERGEANT UI64LIT(0x0000000000040000) // 18 -#define PLAYER_TITLE_FIRST_SERGEANT UI64LIT(0x0000000000080000) // 19 -#define PLAYER_TITLE_STONE_GUARD UI64LIT(0x0000000000100000) // 20 -#define PLAYER_TITLE_BLOOD_GUARD UI64LIT(0x0000000000200000) // 21 -#define PLAYER_TITLE_LEGIONNAIRE UI64LIT(0x0000000000400000) // 22 -#define PLAYER_TITLE_CENTURION UI64LIT(0x0000000000800000) // 23 -#define PLAYER_TITLE_CHAMPION UI64LIT(0x0000000001000000) // 24 -#define PLAYER_TITLE_LIEUTENANT_GENERAL UI64LIT(0x0000000002000000) // 25 -#define PLAYER_TITLE_GENERAL UI64LIT(0x0000000004000000) // 26 -#define PLAYER_TITLE_WARLORD UI64LIT(0x0000000008000000) // 27 -#define PLAYER_TITLE_HIGH_WARLORD UI64LIT(0x0000000010000000) // 28 -#define PLAYER_TITLE_GLADIATOR UI64LIT(0x0000000020000000) // 29 -#define PLAYER_TITLE_DUELIST UI64LIT(0x0000000040000000) // 30 -#define PLAYER_TITLE_RIVAL UI64LIT(0x0000000080000000) // 31 -#define PLAYER_TITLE_CHALLENGER UI64LIT(0x0000000100000000) // 32 -#define PLAYER_TITLE_SCARAB_LORD UI64LIT(0x0000000200000000) // 33 -#define PLAYER_TITLE_CONQUEROR UI64LIT(0x0000000400000000) // 34 -#define PLAYER_TITLE_JUSTICAR UI64LIT(0x0000000800000000) // 35 -#define PLAYER_TITLE_CHAMPION_OF_THE_NAARU UI64LIT(0x0000001000000000) // 36 -#define PLAYER_TITLE_MERCILESS_GLADIATOR UI64LIT(0x0000002000000000) // 37 -#define PLAYER_TITLE_OF_THE_SHATTERED_SUN UI64LIT(0x0000004000000000) // 38 -#define PLAYER_TITLE_HAND_OF_ADAL UI64LIT(0x0000008000000000) // 39 -#define PLAYER_TITLE_VENGEFUL_GLADIATOR UI64LIT(0x0000010000000000) // 40 - -#define MAX_TITLE_INDEX (3*64) // 3 uint64 fields - -// used in PLAYER_FIELD_BYTES values -enum PlayerFieldByteFlags -{ - PLAYER_FIELD_BYTE_TRACK_STEALTHED = 0x00000002, - PLAYER_FIELD_BYTE_RELEASE_TIMER = 0x00000008, // Display time till auto release spirit - PLAYER_FIELD_BYTE_NO_RELEASE_WINDOW = 0x00000010 // Display no "release spirit" window at all -}; - -// used in PLAYER_FIELD_BYTES2 values -enum PlayerFieldByte2Flags -{ - PLAYER_FIELD_BYTE2_NONE = 0x0000, - PLAYER_FIELD_BYTE2_INVISIBILITY_GLOW = 0x4000 -}; - -enum ActivateTaxiReplies -{ - ERR_TAXIOK = 0, - ERR_TAXIUNSPECIFIEDSERVERERROR = 1, - ERR_TAXINOSUCHPATH = 2, - ERR_TAXINOTENOUGHMONEY = 3, - ERR_TAXITOOFARAWAY = 4, - ERR_TAXINOVENDORNEARBY = 5, - ERR_TAXINOTVISITED = 6, - ERR_TAXIPLAYERBUSY = 7, - ERR_TAXIPLAYERALREADYMOUNTED = 8, - ERR_TAXIPLAYERSHAPESHIFTED = 9, - ERR_TAXIPLAYERMOVING = 10, - ERR_TAXISAMENODE = 11, - ERR_TAXINOTSTANDING = 12 -}; - -enum MirrorTimerType -{ - FATIGUE_TIMER = 0, - BREATH_TIMER = 1, - FIRE_TIMER = 2 -}; -#define MAX_TIMERS 3 -#define DISABLED_MIRROR_TIMER -1 - -// 2^n values -enum PlayerExtraFlags -{ - // gm abilities - PLAYER_EXTRA_GM_ON = 0x0001, - PLAYER_EXTRA_ACCEPT_WHISPERS = 0x0004, - PLAYER_EXTRA_TAXICHEAT = 0x0008, - PLAYER_EXTRA_GM_INVISIBLE = 0x0010, - PLAYER_EXTRA_GM_CHAT = 0x0020, // Show GM badge in chat messages - - // other states - PLAYER_EXTRA_PVP_DEATH = 0x0100 // store PvP death status until corpse creating. -}; - -// 2^n values -enum AtLoginFlags -{ - AT_LOGIN_NONE = 0x00, - AT_LOGIN_RENAME = 0x01, - AT_LOGIN_RESET_SPELLS = 0x02, - AT_LOGIN_RESET_TALENTS = 0x04, - AT_LOGIN_CUSTOMIZE = 0x08, - AT_LOGIN_RESET_PET_TALENTS = 0x10, - AT_LOGIN_FIRST = 0x20, -}; - -typedef std::map<uint32, QuestStatusData> QuestStatusMap; - -enum QuestSlotOffsets -{ - QUEST_ID_OFFSET = 0, - QUEST_STATE_OFFSET = 1, - QUEST_COUNTS_OFFSET = 2, - QUEST_TIME_OFFSET = 3 -}; - -#define MAX_QUEST_OFFSET 5 - -enum QuestSlotStateMask -{ - QUEST_STATE_NONE = 0x0000, - QUEST_STATE_COMPLETE = 0x0001, - QUEST_STATE_FAIL = 0x0002 -}; - -enum SkillUpdateState -{ - SKILL_UNCHANGED = 0, - SKILL_CHANGED = 1, - SKILL_NEW = 2, - SKILL_DELETED = 3 -}; - -struct SkillStatusData -{ - SkillStatusData(uint8 _pos, SkillUpdateState _uState) : pos(_pos), uState(_uState) - { - } - uint8 pos; - SkillUpdateState uState; -}; - -typedef UNORDERED_MAP<uint32, SkillStatusData> SkillStatusMap; - -class Quest; -class Spell; -class Item; -class WorldSession; - -enum PlayerSlots -{ - // first slot for item stored (in any way in player m_items data) - PLAYER_SLOT_START = 0, - // last+1 slot for item stored (in any way in player m_items data) - PLAYER_SLOT_END = 150, - PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START) -}; - -#define INVENTORY_SLOT_BAG_0 255 - -enum EquipmentSlots // 19 slots -{ - EQUIPMENT_SLOT_START = 0, - EQUIPMENT_SLOT_HEAD = 0, - EQUIPMENT_SLOT_NECK = 1, - EQUIPMENT_SLOT_SHOULDERS = 2, - EQUIPMENT_SLOT_BODY = 3, - EQUIPMENT_SLOT_CHEST = 4, - EQUIPMENT_SLOT_WAIST = 5, - EQUIPMENT_SLOT_LEGS = 6, - EQUIPMENT_SLOT_FEET = 7, - EQUIPMENT_SLOT_WRISTS = 8, - EQUIPMENT_SLOT_HANDS = 9, - EQUIPMENT_SLOT_FINGER1 = 10, - EQUIPMENT_SLOT_FINGER2 = 11, - EQUIPMENT_SLOT_TRINKET1 = 12, - EQUIPMENT_SLOT_TRINKET2 = 13, - EQUIPMENT_SLOT_BACK = 14, - EQUIPMENT_SLOT_MAINHAND = 15, - EQUIPMENT_SLOT_OFFHAND = 16, - EQUIPMENT_SLOT_RANGED = 17, - EQUIPMENT_SLOT_TABARD = 18, - EQUIPMENT_SLOT_END = 19 -}; - -enum InventorySlots // 4 slots -{ - INVENTORY_SLOT_BAG_START = 19, - INVENTORY_SLOT_BAG_END = 23 -}; - -enum InventoryPackSlots // 16 slots -{ - INVENTORY_SLOT_ITEM_START = 23, - INVENTORY_SLOT_ITEM_END = 39 -}; - -enum BankItemSlots // 28 slots -{ - BANK_SLOT_ITEM_START = 39, - BANK_SLOT_ITEM_END = 67 -}; - -enum BankBagSlots // 7 slots -{ - BANK_SLOT_BAG_START = 67, - BANK_SLOT_BAG_END = 74 -}; - -enum BuyBackSlots // 12 slots -{ - // stored in m_buybackitems - BUYBACK_SLOT_START = 74, - BUYBACK_SLOT_END = 86 -}; - -enum KeyRingSlots // 32 slots -{ - KEYRING_SLOT_START = 86, - KEYRING_SLOT_END = 118 -}; - -enum CurrencyTokenSlots // 32 slots -{ - CURRENCYTOKEN_SLOT_START = 118, - CURRENCYTOKEN_SLOT_END = 150 -}; - -enum EquipmentSetUpdateState -{ - EQUIPMENT_SET_UNCHANGED = 0, - EQUIPMENT_SET_CHANGED = 1, - EQUIPMENT_SET_NEW = 2, - EQUIPMENT_SET_DELETED = 3 -}; - -struct EquipmentSet -{ - EquipmentSet() : Guid(0), state(EQUIPMENT_SET_NEW) - { - for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) - Items[i] = 0; - } - - uint64 Guid; - std::string Name; - std::string IconName; - uint32 Items[EQUIPMENT_SLOT_END]; - EquipmentSetUpdateState state; -}; - -#define MAX_EQUIPMENT_SET_INDEX 10 // client limit - -typedef std::map<uint32, EquipmentSet> EquipmentSets; - -struct ItemPosCount -{ - ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) {} - bool isContainedIn(std::vector<ItemPosCount> const& vec) const; - uint16 pos; - uint32 count; -}; -typedef std::vector<ItemPosCount> ItemPosCountVec; - -enum TradeSlots -{ - TRADE_SLOT_COUNT = 7, - TRADE_SLOT_TRADED_COUNT = 6, - TRADE_SLOT_NONTRADED = 6 -}; - -enum TransferAbortReason -{ - TRANSFER_ABORT_NONE = 0x00, - TRANSFER_ABORT_ERROR = 0x01, - TRANSFER_ABORT_MAX_PLAYERS = 0x02, // Transfer Aborted: instance is full - TRANSFER_ABORT_NOT_FOUND = 0x03, // Transfer Aborted: instance not found - TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x04, // You have entered too many instances recently. - TRANSFER_ABORT_ZONE_IN_COMBAT = 0x06, // Unable to zone in while an encounter is in progress. - TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x07, // You must have <TBC,WotLK> expansion installed to access this area. - TRANSFER_ABORT_DIFFICULTY = 0x08, // <Normal,Heroic,Epic> difficulty mode is not available for %s. - TRANSFER_ABORT_UNIQUE_MESSAGE = 0x09, // Until you've escaped TLK's grasp, you cannot leave this place! - TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x0A, // Additional instances cannot be launched, please try again later. - TRANSFER_ABORT_NEED_GROUP = 0x0B, // 3.1 - TRANSFER_ABORT_NOT_FOUND2 = 0x0C, // 3.1 - TRANSFER_ABORT_NOT_FOUND3 = 0x0D, // 3.1 - TRANSFER_ABORT_NOT_FOUND4 = 0x0E, // 3.2 - TRANSFER_ABORT_REALM_ONLY = 0x0F, // All players on party must be from the same realm. - TRANSFER_ABORT_MAP_NOT_ALLOWED = 0x10, // Map can't be entered at this time. -}; - -enum InstanceResetWarningType -{ - RAID_INSTANCE_WARNING_HOURS = 1, // WARNING! %s is scheduled to reset in %d hour(s). - RAID_INSTANCE_WARNING_MIN = 2, // WARNING! %s is scheduled to reset in %d minute(s)! - RAID_INSTANCE_WARNING_MIN_SOON = 3, // WARNING! %s is scheduled to reset in %d minute(s). Please exit the zone or you will be returned to your bind location! - RAID_INSTANCE_WELCOME = 4, // Welcome to %s. This raid instance is scheduled to reset in %s. - RAID_INSTANCE_EXPIRED = 5 -}; - -// PLAYER_FIELD_ARENA_TEAM_INFO_1_1 offsets -enum ArenaTeamInfoType -{ - ARENA_TEAM_ID = 0, - ARENA_TEAM_TYPE = 1, // new in 3.2 - team type? - ARENA_TEAM_MEMBER = 2, // 0 - captain, 1 - member - ARENA_TEAM_GAMES_WEEK = 3, - ARENA_TEAM_GAMES_SEASON = 4, - ARENA_TEAM_WINS_SEASON = 5, - ARENA_TEAM_PERSONAL_RATING = 6, - ARENA_TEAM_END = 7 -}; - -class InstanceSave; - -enum RestType -{ - REST_TYPE_NO = 0, - REST_TYPE_IN_TAVERN = 1, - REST_TYPE_IN_CITY = 2 -}; - -enum DuelCompleteType -{ - DUEL_INTERUPTED = 0, - DUEL_WON = 1, - DUEL_FLED = 2 -}; - -enum TeleportToOptions -{ - TELE_TO_GM_MODE = 0x01, - TELE_TO_NOT_LEAVE_TRANSPORT = 0x02, - TELE_TO_NOT_LEAVE_COMBAT = 0x04, - TELE_TO_NOT_UNSUMMON_PET = 0x08, - TELE_TO_SPELL = 0x10, -}; - -/// Type of environmental damages -enum EnviromentalDamage -{ - DAMAGE_EXHAUSTED = 0, - DAMAGE_DROWNING = 1, - DAMAGE_FALL = 2, - DAMAGE_LAVA = 3, - DAMAGE_SLIME = 4, - DAMAGE_FIRE = 5, - DAMAGE_FALL_TO_VOID = 6 // custom case for fall without durability loss -}; - -enum PlayedTimeIndex -{ - PLAYED_TIME_TOTAL = 0, - PLAYED_TIME_LEVEL = 1 -}; - -#define MAX_PLAYED_TIME_INDEX 2 - -// used at player loading query list preparing, and later result selection -enum PlayerLoginQueryIndex -{ - PLAYER_LOGIN_QUERY_LOADFROM = 0, - PLAYER_LOGIN_QUERY_LOADGROUP = 1, - PLAYER_LOGIN_QUERY_LOADBOUNDINSTANCES = 2, - PLAYER_LOGIN_QUERY_LOADAURAS = 3, - PLAYER_LOGIN_QUERY_LOADSPELLS = 4, - PLAYER_LOGIN_QUERY_LOADQUESTSTATUS = 5, - PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS = 6, - PLAYER_LOGIN_QUERY_LOADREPUTATION = 7, - PLAYER_LOGIN_QUERY_LOADINVENTORY = 8, - PLAYER_LOGIN_QUERY_LOADACTIONS = 9, - PLAYER_LOGIN_QUERY_LOADMAILCOUNT = 10, - PLAYER_LOGIN_QUERY_LOADMAILDATE = 11, - PLAYER_LOGIN_QUERY_LOADSOCIALLIST = 12, - PLAYER_LOGIN_QUERY_LOADHOMEBIND = 13, - PLAYER_LOGIN_QUERY_LOADSPELLCOOLDOWNS = 14, - PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES = 15, - PLAYER_LOGIN_QUERY_LOADGUILD = 16, - PLAYER_LOGIN_QUERY_LOADARENAINFO = 17, - PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS = 18, - PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS = 19, - PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS = 20, - PLAYER_LOGIN_QUERY_LOADBGDATA = 21, - PLAYER_LOGIN_QUERY_LOADGLYPHS = 22, - PLAYER_LOGIN_QUERY_LOADTALENTS = 23, - PLAYER_LOGIN_QUERY_LOADACCOUNTDATA = 24, - PLAYER_LOGIN_QUERY_LOADSKILLS = 25, - MAX_PLAYER_LOGIN_QUERY = 26 -}; - -enum PlayerDelayedOperations -{ - DELAYED_SAVE_PLAYER = 0x01, - DELAYED_RESURRECT_PLAYER = 0x02, - DELAYED_SPELL_CAST_DESERTER = 0x04, - DELAYED_BG_MOUNT_RESTORE = 0x08, ///< Flag to restore mount state after teleport from BG - DELAYED_BG_TAXI_RESTORE = 0x10, ///< Flag to restore taxi state after teleport from BG - DELAYED_END -}; - -// Player summoning auto-decline time (in secs) -#define MAX_PLAYER_SUMMON_DELAY (2*MINUTE) -#define MAX_MONEY_AMOUNT (0x7FFFFFFF-1) - -struct InstancePlayerBind -{ - InstanceSave *save; - bool perm; - /* permanent PlayerInstanceBinds are created in Raid/Heroic instances for players - that aren't already permanently bound when they are inside when a boss is killed - or when they enter an instance that the group leader is permanently bound to. */ - InstancePlayerBind() : save(NULL), perm(false) {} -}; - -struct AccessRequirement -{ - uint8 levelMin; - uint8 levelMax; - uint8 heroicLevelMin; - uint32 item; - uint32 item2; - uint32 heroicKey; - uint32 heroicKey2; - uint32 quest; - std::string questFailedText; - uint32 heroicQuest; - std::string heroicQuestFailedText; -}; - -class PlayerTaxi -{ - public: - PlayerTaxi(); - ~PlayerTaxi() {} - // Nodes - void InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint8 level); - void LoadTaxiMask(const char* data); - - bool IsTaximaskNodeKnown(uint32 nodeidx) const - { - uint8 field = uint8((nodeidx - 1) / 32); - uint32 submask = 1<<((nodeidx-1)%32); - return (m_taximask[field] & submask) == submask; - } - bool SetTaximaskNode(uint32 nodeidx) - { - uint8 field = uint8((nodeidx - 1) / 32); - uint32 submask = 1<<((nodeidx-1)%32); - if ((m_taximask[field] & submask) != submask ) - { - m_taximask[field] |= submask; - return true; - } - else - return false; - } - void AppendTaximaskTo(ByteBuffer& data,bool all); - - // Destinations - bool LoadTaxiDestinationsFromString(const std::string& values, uint32 team); - std::string SaveTaxiDestinationsToString(); - - void ClearTaxiDestinations() { m_TaxiDestinations.clear(); } - void AddTaxiDestination(uint32 dest) { m_TaxiDestinations.push_back(dest); } - uint32 GetTaxiSource() const { return m_TaxiDestinations.empty() ? 0 : m_TaxiDestinations.front(); } - uint32 GetTaxiDestination() const { return m_TaxiDestinations.size() < 2 ? 0 : m_TaxiDestinations[1]; } - uint32 GetCurrentTaxiPath() const; - uint32 NextTaxiDestination() - { - m_TaxiDestinations.pop_front(); - return GetTaxiDestination(); - } - bool empty() const { return m_TaxiDestinations.empty(); } - - friend std::ostringstream& operator<< (std::ostringstream& ss, PlayerTaxi const& taxi); - private: - TaxiMask m_taximask; - std::deque<uint32> m_TaxiDestinations; -}; - -std::ostringstream& operator<< (std::ostringstream& ss, PlayerTaxi const& taxi); - -class Player; - -/// Holder for BattleGround data -struct BGData -{ - BGData() : bgInstanceID(0), bgTypeID(BATTLEGROUND_TYPE_NONE), bgAfkReportedCount(0), bgAfkReportedTimer(0), - bgTeam(0), mountSpell(0) { ClearTaxiPath(); } - - uint32 bgInstanceID; ///< This variable is set to bg->m_InstanceID, - /// when player is teleported to BG - (it is battleground's GUID) - BattleGroundTypeId bgTypeID; - - std::set<uint32> bgAfkReporter; - uint8 bgAfkReportedCount; - time_t bgAfkReportedTimer; - - uint32 bgTeam; ///< What side the player will be added to - - uint32 mountSpell; - uint32 taxiPath[2]; - - WorldLocation joinPos; ///< From where player entered BG - - void ClearTaxiPath() { taxiPath[0] = taxiPath[1] = 0; } - bool HasTaxiPath() const { return taxiPath[0] && taxiPath[1]; } -}; - -class Player : public Unit, public GridObject<Player> -{ - friend class WorldSession; - friend void Item::AddToUpdateQueueOf(Player *player); - friend void Item::RemoveFromUpdateQueueOf(Player *player); - public: - explicit Player (WorldSession *session); - ~Player ( ); - - void CleanupsBeforeDelete(bool finalCleanup = true); - - static UpdateMask updateVisualBits; - static void InitVisibleBits(); - - void AddToWorld(); - void RemoveFromWorld(); - - bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0); - void TeleportOutOfMap(Map *oldMap); - - bool TeleportTo(WorldLocation const &loc, uint32 options = 0) - { - return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options); - } - - bool TeleportToBGEntryPoint(); - - void SetSummonPoint(uint32 mapid, float x, float y, float z) - { - m_summon_expire = time(NULL) + MAX_PLAYER_SUMMON_DELAY; - m_summon_mapid = mapid; - m_summon_x = x; - m_summon_y = y; - m_summon_z = z; - } - void SummonIfPossible(bool agree); - - bool Create( uint32 guidlow, const std::string& name, uint8 race, uint8 class_, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair, uint8 outfitId ); - - void Update( uint32 time ); - - static bool BuildEnumData( QueryResult_AutoPtr result, WorldPacket * p_data ); - - void SetInWater(bool apply); - - bool IsInWater() const { return m_isInWater; } - bool IsUnderWater() const; - bool IsFalling() { return GetPositionZ() < m_lastFallZ; } - - void SendInitialPacketsBeforeAddToMap(); - void SendInitialPacketsAfterAddToMap(); - void SendTransferAborted(uint32 mapid, uint8 reason, uint8 arg = 0); - void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time); - - Creature* GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask); - bool CanInteractWithNPCs(bool alive = true) const; - GameObject* GetGameObjectIfCanInteractWith(uint64 guid, GameobjectTypes type) const; - - bool ToggleAFK(); - bool ToggleDND(); - bool isAFK() const { return HasFlag(PLAYER_FLAGS,PLAYER_FLAGS_AFK); } - bool isDND() const { return HasFlag(PLAYER_FLAGS,PLAYER_FLAGS_DND); } - uint8 chatTag() const; - std::string afkMsg; - std::string dndMsg; - - uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const* newSkin=NULL); - - PlayerSocial *GetSocial() { return m_social; } - - PlayerTaxi m_taxi; - void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(), getClass(), getLevel()); } - bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc = NULL, uint32 spellid = 0); - bool ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid = 0); - void CleanupAfterTaxiFlight(); - void ContinueTaxiFlight(); - // mount_id can be used in scripting calls - bool isAcceptWhispers() const { return m_ExtraFlags & PLAYER_EXTRA_ACCEPT_WHISPERS; } - void SetAcceptWhispers(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_ACCEPT_WHISPERS; else m_ExtraFlags &= ~PLAYER_EXTRA_ACCEPT_WHISPERS; } - bool isGameMaster() const { return m_ExtraFlags & PLAYER_EXTRA_GM_ON; } - void SetGameMaster(bool on); - bool isGMChat() const { return GetSession()->GetSecurity() >= SEC_MODERATOR && (m_ExtraFlags & PLAYER_EXTRA_GM_CHAT); } - void SetGMChat(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_GM_CHAT; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_CHAT; } - bool isTaxiCheater() const { return m_ExtraFlags & PLAYER_EXTRA_TAXICHEAT; } - void SetTaxiCheater(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_TAXICHEAT; else m_ExtraFlags &= ~PLAYER_EXTRA_TAXICHEAT; } - bool isGMVisible() const { return !(m_ExtraFlags & PLAYER_EXTRA_GM_INVISIBLE); } - void SetGMVisible(bool on); - void SetPvPDeath(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_PVP_DEATH; else m_ExtraFlags &= ~PLAYER_EXTRA_PVP_DEATH; } - - void GiveXP(uint32 xp, Unit* victim); - void GiveLevel(uint8 level); - - void InitStatsForLevel(bool reapplyMods = false); - - // Played Time Stuff - time_t m_logintime; - time_t m_Last_tick; - uint32 m_Played_time[MAX_PLAYED_TIME_INDEX]; - uint32 GetTotalPlayedTime() { return m_Played_time[PLAYED_TIME_TOTAL]; } - uint32 GetLevelPlayedTime() { return m_Played_time[PLAYED_TIME_LEVEL]; } - - void setDeathState(DeathState s); // overwrite Unit::setDeathState - - void InnEnter (int time,uint32 mapid, float x,float y,float z) - { - inn_pos_mapid = mapid; - inn_pos_x = x; - inn_pos_y = y; - inn_pos_z = z; - time_inn_enter = time; - } - - float GetRestBonus() const { return m_rest_bonus; } - void SetRestBonus(float rest_bonus_new); - - RestType GetRestType() const { return rest_type; } - void SetRestType(RestType n_r_type) { rest_type = n_r_type; } - - uint32 GetInnPosMapId() const { return inn_pos_mapid; } - float GetInnPosX() const { return inn_pos_x; } - float GetInnPosY() const { return inn_pos_y; } - float GetInnPosZ() const { return inn_pos_z; } - - int GetTimeInnEnter() const { return time_inn_enter; } - void UpdateInnerTime (int time) { time_inn_enter = time; } - - Pet* GetPet() const; - Pet* SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 despwtime); - void RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent = false); - uint32 GetPhaseMaskForSpawn() const; // used for proper set phase for DB at GM-mode creature/GO spawn - - void Say(const std::string& text, const uint32 language); - void Yell(const std::string& text, const uint32 language); - void TextEmote(const std::string& text); - void Whisper(const std::string& text, const uint32 language,uint64 receiver); - void BuildPlayerChat(WorldPacket *data, uint8 msgtype, const std::string& text, uint32 language) const; - - /*********************************************************/ - /*** STORAGE SYSTEM ***/ - /*********************************************************/ - - void SetVirtualItemSlot( uint8 i, Item* item); - void SetSheath( SheathState sheathed ); // overwrite Unit version - uint8 FindEquipSlot( ItemPrototype const* proto, uint32 slot, bool swap ) const; - uint32 GetItemCount( uint32 item, bool inBankAlso = false, Item* skipItem = NULL ) const; - Item* GetItemByGuid( uint64 guid ) const; - Item* GetItemByEntry( uint32 entry ) const; - Item* GetItemByPos( uint16 pos ) const; - Item* GetItemByPos( uint8 bag, uint8 slot ) const; - inline Item* GetUseableItemByPos( uint8 bag, uint8 slot ) const //Does additional check for disarmed weapons - { - if (!CanUseAttackType(GetAttackBySlot(slot))) - return NULL; - return GetItemByPos(bag, slot); - } - Item* GetWeaponForAttack(WeaponAttackType attackType, bool useable = false) const; - Item* GetShield(bool useable = false) const; - static uint8 GetAttackBySlot( uint8 slot ); // MAX_ATTACK if not weapon slot - std::vector<Item *> &GetItemUpdateQueue() { return m_itemUpdateQueue; } - static bool IsInventoryPos( uint16 pos ) { return IsInventoryPos(pos >> 8,pos & 255); } - static bool IsInventoryPos( uint8 bag, uint8 slot ); - static bool IsEquipmentPos( uint16 pos ) { return IsEquipmentPos(pos >> 8,pos & 255); } - static bool IsEquipmentPos( uint8 bag, uint8 slot ); - static bool IsBagPos( uint16 pos ); - static bool IsBankPos( uint16 pos ) { return IsBankPos(pos >> 8,pos & 255); } - static bool IsBankPos( uint8 bag, uint8 slot ); - bool IsValidPos( uint16 pos ) { return IsBankPos(pos >> 8,pos & 255); } - bool IsValidPos( uint8 bag, uint8 slot ); - uint8 GetBankBagSlotCount() const { return GetByteValue(PLAYER_BYTES_2, 2); } - void SetBankBagSlotCount(uint8 count) { SetByteValue(PLAYER_BYTES_2, 2, count); } - bool HasItemCount( uint32 item, uint32 count, bool inBankAlso = false ) const; - bool HasItemFitToSpellReqirements(SpellEntry const* spellInfo, Item const* ignoreItem = NULL); - bool CanNoReagentCast(SpellEntry 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; - uint8 CountItemWithLimitCategory(uint32 limitCategory, Item* skipItem = NULL) const; - uint8 CanTakeMoreSimilarItems(Item* pItem) const { return _CanTakeMoreSimilarItems(pItem->GetEntry(),pItem->GetCount(),pItem); } - uint8 CanTakeMoreSimilarItems(uint32 entry, uint32 count) const { return _CanTakeMoreSimilarItems(entry,count,NULL); } - uint8 CanStoreNewItem( uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 item, uint32 count, uint32* no_space_count = NULL ) const - { - return _CanStoreItem(bag, slot, dest, item, count, NULL, false, no_space_count ); - } - uint8 CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec& dest, Item *pItem, bool swap = false ) const - { - if(!pItem) - return EQUIP_ERR_ITEM_NOT_FOUND; - uint32 count = pItem->GetCount(); - return _CanStoreItem( bag, slot, dest, pItem->GetEntry(), count, pItem, swap, NULL ); - - } - uint8 CanStoreItems( Item **pItem,int count) const; - uint8 CanEquipNewItem( uint8 slot, uint16 &dest, uint32 item, bool swap ) const; - uint8 CanEquipItem( uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading = true ) const; - - uint8 CanEquipUniqueItem( Item * pItem, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1 ) const; - uint8 CanEquipUniqueItem( ItemPrototype const* itemProto, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1 ) const; - uint8 CanUnequipItems( uint32 item, uint32 count ) const; - uint8 CanUnequipItem( uint16 src, bool swap ) const; - uint8 CanBankItem( uint8 bag, uint8 slot, ItemPosCountVec& dest, Item *pItem, bool swap, bool not_loading = true ) const; - uint8 CanUseItem( Item *pItem, bool not_loading = true ) const; - bool HasItemTotemCategory( uint32 TotemCategory ) const; - bool CanUseItem( ItemPrototype const *pItem ); - uint8 CanUseAmmo( uint32 item ) const; - Item* StoreNewItem( ItemPosCountVec const& pos, uint32 item, bool update,int32 randomPropertyId = 0 ); - Item* StoreItem( ItemPosCountVec const& pos, Item *pItem, bool update ); - Item* EquipNewItem( uint16 pos, uint32 item, bool update ); - Item* EquipItem( 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) { AutoStoreLoot(NULL_BAG,NULL_SLOT,loot_id,store,broadcast); } - - uint8 _CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item* pItem, uint32* no_space_count = NULL) const; - uint8 _CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 entry, uint32 count, Item *pItem = NULL, bool swap = false, uint32* no_space_count = NULL ) const; - - void ApplyEquipCooldown( Item * pItem ); - void SetAmmo( uint32 item ); - void RemoveAmmo(); - float GetAmmoDPS() const { return m_ammoDPS; } - bool CheckAmmoCompatibility(const ItemPrototype *ammo_proto) const; - void QuickEquipItem( uint16 pos, Item *pItem); - void VisualizeItem( uint8 slot, Item *pItem); - void SetVisibleItemSlot(uint8 slot, Item *pItem); - Item* BankItem( ItemPosCountVec const& dest, Item *pItem, bool update ) - { - return StoreItem( dest, pItem, update); - } - Item* BankItem( uint16 pos, Item *pItem, bool update ); - void RemoveItem( uint8 bag, uint8 slot, bool update ); - void MoveItemFromInventory(uint8 bag, uint8 slot, bool update); - // in trade, auction, guild bank, mail.... - void MoveItemToInventory(ItemPosCountVec const& dest, Item* pItem, bool update, bool in_characterInventoryDB = false); - // in trade, guild bank, mail.... - 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 ); - Item* GetItemFromBuyBackSlot( uint32 slot ); - void RemoveItemFromBuyBackSlot( uint32 slot, bool del ); - uint32 GetMaxKeyringSize() const { return KEYRING_SLOT_END-KEYRING_SLOT_START; } - void SendEquipError( uint8 msg, Item* pItem, Item *pItem2 ); - void SendBuyError( uint8 msg, Creature* pCreature, uint32 item, uint32 param ); - void SendSellError( uint8 msg, Creature* pCreature, uint64 guid, uint32 param ); - void AddWeaponProficiency(uint32 newflag) { m_WeaponProficiency |= newflag; } - void AddArmorProficiency(uint32 newflag) { m_ArmorProficiency |= newflag; } - uint32 GetWeaponProficiency() const { return m_WeaponProficiency; } - uint32 GetArmorProficiency() const { return m_ArmorProficiency; } - bool IsUseEquipedWeapon( bool mainhand ) const - { - // disarm applied only to mainhand weapon - return !IsInFeralForm() && (!mainhand || !HasFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISARMED) ); - } - bool IsTwoHandUsed() const - { - Item* mainItem = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); - return mainItem && mainItem->GetProto()->InventoryType == INVTYPE_2HWEAPON && !CanTitanGrip(); - } - void SendNewItem( Item *item, uint32 count, bool received, bool created, bool broadcast = false ); - bool BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint8 bag, uint8 slot); - - float GetReputationPriceDiscount( Creature const* pCreature ) const; - Player* GetTrader() const { return pTrader; } - void ClearTrade(); - void TradeCancel(bool sendback); - - void UpdateEnchantTime(uint32 time); - void UpdateItemDuration(uint32 time, bool realtimeonly=false); - void AddEnchantmentDurations(Item *item); - void RemoveEnchantmentDurations(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 SendEnchantmentDurations(); - void BuildEnchantmentsInfoData(WorldPacket *data); - void AddItemDurations(Item *item); - void RemoveItemDurations(Item *item); - void SendItemDurations(); - void LoadCorpse(); - void LoadPet(); - - uint32 m_stableSlots; - - /*********************************************************/ - /*** GOSSIP SYSTEM ***/ - /*********************************************************/ - - void PrepareGossipMenu(WorldObject *pSource, uint32 menuId = 0); - void SendPreparedGossip(WorldObject *pSource); - void OnGossipSelect(WorldObject *pSource, uint32 gossipListId, uint32 menuId); - - uint32 GetGossipTextId(uint32 menuId); - uint32 GetGossipTextId(WorldObject *pSource); - uint32 GetDefaultGossipMenuForSource(WorldObject *pSource); - - /*********************************************************/ - /*** QUEST SYSTEM ***/ - /*********************************************************/ - - int32 GetQuestLevel( Quest const* pQuest ) const { return pQuest && (pQuest->GetQuestLevel() > 0) ? pQuest->GetQuestLevel() : getLevel(); } - - void PrepareQuestMenu( uint64 guid ); - void SendPreparedQuest( uint64 guid ); - bool IsActiveQuest( uint32 quest_id ) const; - Quest const *GetNextQuest( uint64 guid, Quest const *pQuest ); - bool CanSeeStartQuest( Quest const *pQuest ); - bool CanTakeQuest( Quest const *pQuest, bool msg ); - bool CanAddQuest( Quest const *pQuest, bool msg ); - bool CanCompleteQuest( uint32 quest_id ); - bool CanCompleteRepeatableQuest(Quest const *pQuest); - bool CanRewardQuest( Quest const *pQuest, bool msg ); - bool CanRewardQuest( Quest const *pQuest, uint32 reward, bool msg ); - void AddQuest( Quest const *pQuest, Object *questGiver ); - void CompleteQuest( uint32 quest_id ); - void IncompleteQuest( uint32 quest_id ); - void RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver, bool announce = true ); - void FailQuest( uint32 quest_id ); - bool SatisfyQuestSkillOrClass( Quest const* qInfo, bool msg ); - bool SatisfyQuestLevel( Quest const* qInfo, bool msg ); - bool SatisfyQuestLog( bool msg ); - bool SatisfyQuestPreviousQuest( Quest const* qInfo, bool msg ); - bool SatisfyQuestRace( Quest const* qInfo, bool msg ); - bool SatisfyQuestReputation( Quest const* qInfo, bool msg ); - bool SatisfyQuestStatus( Quest const* qInfo, bool msg ); - bool SatisfyQuestTimed( Quest const* qInfo, bool msg ); - bool SatisfyQuestExclusiveGroup( Quest const* qInfo, bool msg ); - bool SatisfyQuestNextChain( Quest const* qInfo, bool msg ); - bool SatisfyQuestPrevChain( Quest const* qInfo, bool msg ); - bool SatisfyQuestDay( Quest const* qInfo, bool msg ); - bool GiveQuestSourceItem( Quest const *pQuest ); - bool TakeQuestSourceItem( uint32 quest_id, bool msg ); - bool GetQuestRewardStatus( uint32 quest_id ) const; - QuestStatus GetQuestStatus( uint32 quest_id ) const; - void SetQuestStatus( uint32 quest_id, QuestStatus status ); - - void SetDailyQuestStatus( uint32 quest_id ); - void ResetDailyQuestStatus(); - - uint16 FindQuestSlot( uint32 quest_id ) const; - uint32 GetQuestSlotQuestId(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_ID_OFFSET); } - uint32 GetQuestSlotState(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_STATE_OFFSET); } - uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const { return (uint16)(GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET) >> (counter * 16)); } - uint32 GetQuestSlotTime(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_TIME_OFFSET); } - void SetQuestSlot(uint16 slot, uint32 quest_id, uint32 timer = 0) - { - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_ID_OFFSET, quest_id); - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_STATE_OFFSET, 0); - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET, 0); - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET + 1, 0); - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_TIME_OFFSET, timer); - } - void SetQuestSlotCounter(uint16 slot, uint8 counter, uint16 count) - { - uint64 val = GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET); - val &= ~((uint64)0xFFFF << (counter * 16)); - val |= ((uint64)count << (counter * 16)); - SetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET, val); - } - void SetQuestSlotState(uint16 slot, uint32 state) { SetFlag(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_STATE_OFFSET, state); } - void RemoveQuestSlotState(uint16 slot, uint32 state) { RemoveFlag(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_STATE_OFFSET, state); } - void SetQuestSlotTimer(uint16 slot, uint32 timer) { SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_TIME_OFFSET, timer); } - void SwapQuestSlot(uint16 slot1, uint16 slot2) - { - for (int i = 0; i < MAX_QUEST_OFFSET; ++i) - { - uint32 temp1 = GetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET * slot1 + i); - uint32 temp2 = GetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET * slot2 + i); - - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET * slot1 + i, temp2); - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET * slot2 + i, temp1); - } - } - uint32 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( CreatureInfo const* cInfo, uint64 guid ); - void KilledMonsterCredit( uint32 entry, uint64 guid ); - void CastedCreatureOrGO( uint32 entry, uint64 guid, uint32 spell_id ); - void TalkedToCreature( uint32 entry, uint64 guid ); - void MoneyChanged( uint32 value ); - void ReputationChanged(FactionEntry const* factionEntry ); - void ReputationChanged2(FactionEntry const* factionEntry ); - bool HasQuestForItem( uint32 itemid ) const; - bool HasQuestForGO(int32 GOId) const; - void UpdateForQuestWorldObjects(); - bool CanShareQuest(uint32 quest_id) const; - - void SendQuestComplete( uint32 quest_id ); - void SendQuestReward( Quest const *pQuest, uint32 XP, Object* questGiver ); - void SendQuestFailed( uint32 quest_id ); - void SendQuestTimerFailed( uint32 quest_id ); - void SendCanTakeQuestResponse( uint32 msg ); - void SendQuestConfirmAccept(Quest const* pQuest, Player* pReceiver); - void SendPushToPartyResponse( Player *pPlayer, uint32 msg ); - void SendQuestUpdateAddItem( Quest const* pQuest, uint32 item_idx, uint32 count ); - void SendQuestUpdateAddCreatureOrGo( Quest const* pQuest, uint64 guid, uint32 creatureOrGO_idx, uint32 old_count, uint32 add_count ); - - uint64 GetDivider() { return m_divider; } - void SetDivider( uint64 guid ) { m_divider = guid; } - - uint32 GetInGameTime() { return m_ingametime; } - - void SetInGameTime( uint32 time ) { m_ingametime = time; } - - void AddTimedQuest( uint32 quest_id ) { m_timedquests.insert(quest_id); } - void RemoveTimedQuest( uint32 quest_id ) { m_timedquests.erase(quest_id); } - - /*********************************************************/ - /*** LOAD SYSTEM ***/ - /*********************************************************/ - - bool LoadFromDB(uint32 guid, SqlQueryHolder *holder); - bool isBeingLoaded() const { return GetSession()->PlayerLoading();} - - bool MinimalLoadFromDB(QueryResult_AutoPtr result, uint32 guid); - static bool LoadValuesArrayFromDB(Tokens& data,uint64 guid); - static uint32 GetUInt32ValueFromArray(Tokens const& data, uint16 index); - static float GetFloatValueFromArray(Tokens const& data, uint16 index); - static uint32 GetUInt32ValueFromDB(uint16 index, uint64 guid); - static float GetFloatValueFromDB(uint16 index, uint64 guid); - static uint32 GetZoneIdFromDB(uint64 guid); - static uint32 GetLevelFromDB(uint64 guid); - static bool LoadPositionFromDB(uint32& mapid, float& x,float& y,float& z,float& o, bool& in_flight, uint64 guid); - - /*********************************************************/ - /*** SAVE SYSTEM ***/ - /*********************************************************/ - - void SaveToDB(); - void SaveInventoryAndGoldToDB(); // fast save function for item/money cheating preventing - void SaveGoldToDB(); - void SaveDataFieldToDB(); - static bool SaveValuesArrayInDB(Tokens const& data,uint64 guid); - static void SetUInt32ValueInArray(Tokens& data,uint16 index, uint32 value); - static void SetFloatValueInArray(Tokens& data,uint16 index, float value); - static void SetUInt32ValueInDB(uint16 index, uint32 value, uint64 guid); - static void SetFloatValueInDB(uint16 index, float value, uint64 guid); - static void Customize(uint64 guid, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair); - static void SavePositionInDB(uint32 mapid, float x,float y,float z,float o,uint32 zone,uint64 guid); - - bool m_mailsLoaded; - bool m_mailsUpdated; - - void SetBindPoint(uint64 guid); - void SendTalentWipeConfirm(uint64 guid); - void SendPetSkillWipeConfirm(); - void CalcRage( uint32 damage,bool attacker ); - void RegenerateAll(); - void Regenerate(Powers power); - void RegenerateHealth(); - void setRegenTimerCount(uint32 time) {m_regenTimerCount = time;} - void setWeaponChangeTimer(uint32 time) {m_weaponChangeTimer = time;} - - uint32 GetMoney() { return GetUInt32Value (PLAYER_FIELD_COINAGE); } - void ModifyMoney( int32 d ) - { - d = GetSession()->HandleOnGetMoney(d); - if(d < 0) - SetMoney (GetMoney() > uint32(-d) ? GetMoney() + d : 0); - else - SetMoney (GetMoney() < uint32(MAX_MONEY_AMOUNT - d) ? GetMoney() + d : MAX_MONEY_AMOUNT); - - // "At Gold Limit" - if(GetMoney() >= MAX_MONEY_AMOUNT) - SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD,NULL,NULL); - } - void SetMoney( uint32 value ) - { - SetUInt32Value (PLAYER_FIELD_COINAGE, value); - MoneyChanged( value ); - UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED); - } - - QuestStatusMap& getQuestStatusMap() { return mQuestStatus; }; - - const uint64& GetSelection( ) const { return m_curSelection; } - Unit *GetSelectedUnit() const; - Player *GetSelectedPlayer() const; - void SetSelection(const uint64 &guid) { m_curSelection = guid; SetUInt64Value(UNIT_FIELD_TARGET, guid); } - - uint8 GetComboPoints() { return m_comboPoints; } - const uint64& GetComboTarget() const { return m_comboTarget; } - - void AddComboPoints(Unit* target, int8 count, Spell * spell = NULL); - void GainSpellComboPoints(int8 count); - void ClearComboPoints(); - void SendComboPoints(); - - void SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError = 0, uint32 item_guid = 0, uint32 item_count = 0); - void SendNewMail(); - void UpdateNextMailTimeAndUnreads(); - void AddNewMailDeliverTime(time_t deliver_time); - bool IsMailsLoaded() const { return m_mailsLoaded; } - - void RemoveMail(uint32 id); - - void AddMail(Mail* mail) { m_mail.push_front(mail);}// for call from WorldSession::SendMailTo - uint32 GetMailSize() { return m_mail.size();} - Mail* GetMail(uint32 id); - - PlayerMails::iterator GetMailBegin() { return m_mail.begin();} - PlayerMails::iterator GetMailEnd() { return m_mail.end();} - - /*********************************************************/ - /*** MAILED ITEMS SYSTEM ***/ - /*********************************************************/ - - uint8 unReadMails; - time_t m_nextMailDelivereTime; - - typedef UNORDERED_MAP<uint32, Item*> ItemMap; - - ItemMap mMitems; //template defined in objectmgr.cpp - - Item* GetMItem(uint32 id) - { - ItemMap::const_iterator itr = mMitems.find(id); - return itr != mMitems.end() ? itr->second : NULL; - } - - void AddMItem(Item* it) - { - ASSERT( it ); - //assert deleted, because items can be added before loading - mMitems[it->GetGUIDLow()] = it; - } - - bool RemoveMItem(uint32 id) - { - return mMitems.erase(id) ? true : false; - } - - void PetSpellInitialize(); - void CharmSpellInitialize(); - void PossessSpellInitialize(); - void VehicleSpellInitialize(); - void SendRemoveControlBar(); - bool HasSpell(uint32 spell) const; - bool HasActiveSpell(uint32 spell) const; // show in spellbook - TrainerSpellState GetTrainerSpellState(TrainerSpell const* trainer_spell) const; - bool IsSpellFitByClassAndRace( uint32 spell_id ) const; - bool IsNeedCastPassiveSpellAtLearn(SpellEntry const* spellInfo) const; - - void SendProficiency(uint8 pr1, uint32 pr2); - void SendInitialSpells(); - bool addSpell(uint32 spell_id, bool active, bool learning, bool dependent, bool disabled); - void learnSpell(uint32 spell_id, bool dependent); - void removeSpell(uint32 spell_id, bool disabled = false, bool learn_low_rank = true); - void resetSpells(bool myClassOnly = false); - void learnDefaultSpells(); - void learnQuestRewardedSpells(); - void learnQuestRewardedSpells(Quest const* quest); - void learnSpellHighRank(uint32 spellid); - void AddTemporarySpell(uint32 spellId); - void RemoveTemporarySpell(uint32 spellId); - void SetReputation(uint32 factionentry, uint32 value); - uint32 GetReputation(uint32 factionentry); - std::string GetGuildName(); - uint32 GetFreeTalentPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS1); } - void SetFreeTalentPoints(uint32 points) { SetUInt32Value(PLAYER_CHARACTER_POINTS1,points); } - bool resetTalents(bool no_cost = false); - uint32 resetTalentsCost() const; - void InitTalentForLevel(); - void BuildPlayerTalentsInfoData(WorldPacket *data); - void BuildPetTalentsInfoData(WorldPacket *data); - void SendTalentsInfoData(bool pet); - void LearnTalent(uint32 talentId, uint32 talentRank); - void LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank); - - bool AddTalent(uint32 spell, uint8 spec, bool learning); - bool HasTalent(uint32 spell_id, uint8 spec) const; - - uint32 CalculateTalentsPoints() const; - - // Dual Spec - void UpdateSpecCount(uint8 count); - uint32 GetActiveSpec() { return m_activeSpec; } - void SetActiveSpec(uint8 spec){ m_activeSpec = spec; } - uint8 GetSpecsCount() { return m_specsCount; } - void SetSpecsCount(uint8 count) { m_specsCount = count; } - void ActivateSpec(uint8 spec); - - void InitGlyphsForLevel(); - void SetGlyphSlot(uint8 slot, uint32 slottype) { SetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot, slottype); } - uint32 GetGlyphSlot(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot); } - void SetGlyph(uint8 slot, uint32 glyph) - { - m_Glyphs[m_activeSpec][slot] = glyph; - SetUInt32Value(PLAYER_FIELD_GLYPHS_1 + slot, glyph); - } - uint32 GetGlyph(uint8 slot) { return m_Glyphs[m_activeSpec][slot]; } - - uint32 GetFreePrimaryProfessionPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS2); } - void SetFreePrimaryProfessions(uint16 profs) { SetUInt32Value(PLAYER_CHARACTER_POINTS2, profs); } - void InitPrimaryProfessions(); - - PlayerSpellMap const& GetSpellMap() const { return m_spells; } - PlayerSpellMap & GetSpellMap() { return m_spells; } - - SpellCooldowns const& GetSpellCooldownMap() const { return m_spellCooldowns; } - - void AddSpellMod(SpellModifier* mod, bool apply); - bool IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mod, Spell * spell = NULL); - template <class T> T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell * spell = NULL); - void RemoveSpellMods(Spell * spell); - void RestoreSpellMods(Spell * spell); - void DropModCharge(SpellModifier * mod, Spell * spell); - void SetSpellModTakingSpell(Spell* spell, bool apply); - - static uint32 const infinityCooldownDelay = MONTH; // used for set "infinity cooldowns" for spells and check - static uint32 const infinityCooldownDelayCheck = MONTH/2; - bool HasSpellCooldown(uint32 spell_id) const - { - SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id); - return itr != m_spellCooldowns.end() && itr->second.end > time(NULL); - } - uint32 GetSpellCooldownDelay(uint32 spell_id) const - { - SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id); - time_t t = time(NULL); - return itr != m_spellCooldowns.end() && itr->second.end > t ? itr->second.end - t : 0; - } - void AddSpellAndCategoryCooldowns(SpellEntry const* spellInfo, uint32 itemId, Spell* spell = NULL, bool infinityCooldown = false ); - void AddSpellCooldown(uint32 spell_id, uint32 itemid, time_t end_time); - void SendCooldownEvent(SpellEntry const *spellInfo, uint32 itemId = 0, Spell* spell = NULL); - void ProhibitSpellScholl(SpellSchoolMask idSchoolMask, uint32 unTimeMs ); - void RemoveSpellCooldown(uint32 spell_id, bool update = false); - void RemoveSpellCategoryCooldown(uint32 cat, bool update = false); - void SendClearCooldown( uint32 spell_id, Unit* target ); - - void RemoveCategoryCooldown(uint32 cat); - void RemoveArenaSpellCooldowns(); - void RemoveAllSpellCooldown(); - void _LoadSpellCooldowns(QueryResult_AutoPtr result); - void _SaveSpellCooldowns(); - void SetLastPotionId(uint32 item_id) { m_lastPotionId = item_id; } - void UpdatePotionCooldown(Spell* spell = NULL); - - void setResurrectRequestData(uint64 guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana) - { - m_resurrectGUID = guid; - m_resurrectMap = mapId; - m_resurrectX = X; - m_resurrectY = Y; - m_resurrectZ = Z; - m_resurrectHealth = health; - m_resurrectMana = mana; - } - void clearResurrectRequestData() { setResurrectRequestData(0,0,0.0f,0.0f,0.0f,0,0); } - bool isRessurectRequestedBy(uint64 guid) const { return m_resurrectGUID == guid; } - bool isRessurectRequested() const { return m_resurrectGUID != 0; } - void ResurectUsingRequestData(); - - int getCinematic() - { - return m_cinematic; - } - void setCinematic(int cine) - { - m_cinematic = cine; - } - - ActionButton* addActionButton(uint8 button, uint32 action, uint8 type); - void removeActionButton(uint8 button); - void SendInitialActionButtons() const { SendActionButtons(0); } - void SendActionButtons(uint32 state) const; - - PvPInfo pvpInfo; - void UpdatePvPState(bool onlyFFA = false); - void SetPvP(bool state) - { - Unit::SetPvP(state); - for (ControlList::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr) - (*itr)->SetPvP(state); - } - void UpdatePvP(bool state, bool override=false); - void UpdateZone(uint32 newZone,uint32 newArea); - void UpdateArea(uint32 newArea); - - void UpdateZoneDependentAuras( uint32 zone_id ); // zones - void UpdateAreaDependentAuras( uint32 area_id ); // subzones - - void UpdateAfkReport(time_t currTime); - void UpdatePvPFlag(time_t currTime); - void UpdateContestedPvP(uint32 currTime); - void SetContestedPvPTimer(uint32 newTime) {m_contestedPvPTimer = newTime;} - void ResetContestedPvP() - { - clearUnitState(UNIT_STAT_ATTACK_PLAYER); - RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_CONTESTED_PVP); - m_contestedPvPTimer = 0; - } - - /** todo: -maybe move UpdateDuelFlag+DuelComplete to independent DuelHandler.. **/ - DuelInfo *duel; - void UpdateDuelFlag(time_t currTime); - void CheckDuelDistance(time_t currTime); - void DuelComplete(DuelCompleteType type); - void SendDuelCountdown(uint32 counter); - - bool IsGroupVisibleFor(Player* p) const; - bool IsInSameGroupWith(Player const* p) const; - bool IsInSameRaidWith(Player const* p) const { return p==this || (GetGroup() != NULL && GetGroup() == p->GetGroup()); } - void UninviteFromGroup(); - static void RemoveFromGroup(Group* group, uint64 guid); - void RemoveFromGroup() { RemoveFromGroup(GetGroup(),GetGUID()); } - void SendUpdateToOutOfRangeGroupMembers(); - - void SetInGuild(uint32 GuildId) { SetUInt32Value(PLAYER_GUILDID, GuildId); } - void SetRank(uint32 rankId){ SetUInt32Value(PLAYER_GUILDRANK, rankId); } - void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; } - uint32 GetGuildId() { return GetUInt32Value(PLAYER_GUILDID); } - static uint32 GetGuildIdFromDB(uint64 guid); - uint32 GetRank(){ return GetUInt32Value(PLAYER_GUILDRANK); } - static uint32 GetRankFromDB(uint64 guid); - int GetGuildIdInvited() { return m_GuildIdInvited; } - static void RemovePetitionsAndSigns(uint64 guid, uint32 type); - - // Arena Team - void SetInArenaTeam(uint32 ArenaTeamId, uint8 slot, uint8 type) - { - SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + ARENA_TEAM_ID, ArenaTeamId); - SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + ARENA_TEAM_TYPE, type); - } - uint32 GetArenaTeamId(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END)); } - static uint32 GetArenaTeamIdFromDB(uint64 guid, uint8 slot); - void SetArenaTeamIdInvited(uint32 ArenaTeamId) { m_ArenaTeamIdInvited = ArenaTeamId; } - uint32 GetArenaTeamIdInvited() { return m_ArenaTeamIdInvited; } - static void LeaveAllArenaTeams(uint64 guid); - - Difficulty GetDifficulty(bool isRaid) const { return isRaid ? m_raidDifficulty : m_dungeonDifficulty; } - Difficulty GetDungeonDifficulty() const { return m_dungeonDifficulty; } - Difficulty GetRaidDifficulty() const { return m_raidDifficulty; } - void SetDungeonDifficulty(Difficulty dungeon_difficulty) { m_dungeonDifficulty = dungeon_difficulty; } - void SetRaidDifficulty(Difficulty raid_difficulty) { m_raidDifficulty = raid_difficulty; } - - 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 { return GetBaseSkillValue(SKILL_DEFENSE); } - uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const; - - uint32 GetSpellByProto(ItemPrototype *proto); - - float GetHealthBonusFromStamina(); - float GetManaBonusFromIntellect(); - - bool UpdateStats(Stats stat); - bool UpdateAllStats(); - void UpdateResistances(uint32 school); - void UpdateArmor(); - void UpdateMaxHealth(); - void UpdateMaxPower(Powers power); - void ApplyFeralAPBonus(int32 amount, bool apply); - void UpdateAttackPowerAndDamage(bool ranged = false); - void UpdateShieldBlockValue(); - void UpdateDamagePhysical(WeaponAttackType attType); - 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& min_damage, float& max_damage); - - void UpdateDefenseBonusesMod(); - inline void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);} - float GetMeleeCritFromAgility(); - float GetDodgeFromAgility(); - float GetSpellCritFromIntellect(); - float OCTRegenHPPerSpirit(); - float OCTRegenMPPerSpirit(); - float GetRatingCoefficient(CombatRating cr) const; - float GetRatingBonusValue(CombatRating cr) const; - uint32 GetBaseSpellPowerBonus() { return m_baseSpellPower; } - - 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(); - - const uint64& GetLootGUID() const { return m_lootGuid; } - void SetLootGUID(const uint64 &guid) { m_lootGuid = guid; } - - void RemovedInsignia(Player* looterPlr); - - WorldSession* GetSession() const { return m_session; } - void SetSession(WorldSession *s) { m_session = s; } - - void BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target ) const; - void DestroyForPlayer( Player *target, bool anim = false ) const; - void SendLogXPGain(uint32 GivenXP,Unit* victim,uint32 RestXP); - - // notifiers - 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); - void ResetInstances(uint8 method, bool isRaid); - void SendResetInstanceSuccess(uint32 MapId); - void SendResetInstanceFailed(uint32 reason, uint32 MapId); - void SendResetFailedNotify(uint32 mapid); - - virtual bool SetPosition(float x, float y, float z, float orientation, bool teleport = false); - bool SetPosition(const Position &pos, bool teleport = false) { return SetPosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); } - void UpdateUnderwaterState( Map * m, float x, float y, float z ); - - void SendMessageToSet(WorldPacket *data, bool self);// overwrite Object::SendMessageToSet - void SendMessageToSetInRange(WorldPacket *data, float fist, bool self);// overwrite Object::SendMessageToSetInRange - void SendMessageToSetInRange(WorldPacket *data, float dist, bool self, bool own_team_only); - - void SendTeleportAckMsg(); - - static void DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmChars = true); - - Corpse *GetCorpse() const; - void SpawnCorpseBones(); - void CreateCorpse(); - bool FallGround(uint8 FallMode = 0); - void KillPlayer(); - uint32 GetResurrectionSpellId(); - void ResurrectPlayer(float restore_percent, bool applySickness = false); - void BuildPlayerRepop(); - void RepopAtGraveyard(); - - 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() - { - StopMirrorTimer(FATIGUE_TIMER); - StopMirrorTimer(BREATH_TIMER); - StopMirrorTimer(FIRE_TIMER); - } - - void SetMovement(PlayerMovementType pType); - - void JoinedChannel(Channel *c); - void LeftChannel(Channel *c); - void CleanupChannels(); - void UpdateLocalChannels( uint32 newZone ); - void LeaveLFGChannel(); - - void UpdateDefense(); - void UpdateWeaponSkill (WeaponAttackType attType); - void UpdateCombatSkills(Unit *pVictim, WeaponAttackType attType, bool defence); - - void SetSkill(uint32 id, uint16 currVal, uint16 maxVal); - uint16 GetMaxSkillValue(uint32 skill) const; // max + perm. bonus + temp bonus - uint16 GetPureMaxSkillValue(uint32 skill) const; // max - uint16 GetSkillValue(uint32 skill) const; // skill value + perm. bonus + temp bonus - uint16 GetBaseSkillValue(uint32 skill) const; // skill value + perm. bonus - uint16 GetPureSkillValue(uint32 skill) const; // skill value - int16 GetSkillPermBonusValue(uint32 skill) const; - int16 GetSkillTempBonusValue(uint32 skill) const; - bool HasSkill(uint32 skill) const; - void learnSkillRewardedSpells(uint32 id, uint32 value); - - WorldLocation& GetTeleportDest() { return m_teleport_dest; } - bool IsBeingTeleported() const { return mSemaphoreTeleport_Near || mSemaphoreTeleport_Far; } - bool IsBeingTeleportedNear() const { return mSemaphoreTeleport_Near; } - bool IsBeingTeleportedFar() const { return mSemaphoreTeleport_Far; } - void SetSemaphoreTeleportNear(bool semphsetting) { mSemaphoreTeleport_Near = semphsetting; } - void SetSemaphoreTeleportFar(bool semphsetting) { mSemaphoreTeleport_Far = semphsetting; } - void ProcessDelayedOperations(); - - void CheckExploreSystem(void); - - static uint32 TeamForRace(uint8 race); - uint32 GetTeam() const { return m_team; } - TeamId GetTeamId() const { return m_team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; } - static uint32 getFactionForRace(uint8 race); - void setFactionForRace(uint8 race); - - void InitDisplayIds(); - - bool IsAtGroupRewardDistance(WorldObject const* pRewardSource) const; - bool RewardPlayerAndGroupAtKill(Unit* pVictim); - void RewardPlayerAndGroupAtEvent(uint32 creature_id,WorldObject* pRewardSource); - bool isHonorOrXPTarget(Unit* pVictim); - - ReputationMgr& GetReputationMgr() { return m_reputationMgr; } - ReputationMgr const& GetReputationMgr() const { return m_reputationMgr; } - ReputationRank GetReputationRank(uint32 faction_id) const; - void RewardReputation(Unit *pVictim, float rate); - void RewardReputation(Quest const *pQuest); - - void UpdateSkillsForLevel(); - void UpdateSkillsToMaxSkillsForLevel(); // for .levelup - void ModifySkillBonus(uint32 skillid,int32 val, bool talent); - - /*********************************************************/ - /*** PVP SYSTEM ***/ - /*********************************************************/ - void UpdateHonorFields(); - bool RewardHonor(Unit *pVictim, uint32 groupsize, float honor = -1, bool pvptoken = false); - uint32 GetHonorPoints() { return GetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY); } - uint32 GetArenaPoints() { return GetUInt32Value(PLAYER_FIELD_ARENA_CURRENCY); } - void ModifyHonorPoints( int32 value ); - void ModifyArenaPoints( int32 value ); - uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot); - - //End of PvP System - - inline SpellCooldowns GetSpellCooldowns() const { return m_spellCooldowns; } - - void SetDrunkValue(uint16 newDrunkValue, uint32 itemid=0); - uint16 GetDrunkValue() const { return m_drunk; } - static DrunkenState GetDrunkenstateByValue(uint16 value); - - uint32 GetDeathTimer() const { return m_deathTimer; } - uint32 GetCorpseReclaimDelay(bool pvp) const; - void UpdateCorpseReclaimDelay(); - void SendCorpseReclaimDelay(bool load = false); - - uint32 GetShieldBlockValue() const; // overwrite Unit version (virtual) - bool CanParry() const { return m_canParry; } - void SetCanParry(bool value); - bool CanBlock() const { return m_canBlock; } - void SetCanBlock(bool value); - bool CanTitanGrip() const { return m_canTitanGrip; } - void SetCanTitanGrip(bool value) { m_canTitanGrip = value; } - bool CanTameExoticPets() const { return isGameMaster() || HasAuraType(SPELL_AURA_ALLOW_TAME_PET_TYPE); } - - void SetRegularAttackTime(); - void SetBaseModValue(BaseModGroup modGroup, BaseModType modType, float value) { m_auraBaseMod[modGroup][modType] = 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 { return m_auraBaseMod[modGroup][FLAT_MOD] + m_auraBaseMod[modGroup][PCT_MOD]; } - void _ApplyAllStatBonuses(); - void _RemoveAllStatBonuses(); - - 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(ItemPrototype const *proto,uint8 slot,bool apply, bool only_level_scale = false); - 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(SpellEntry 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, ItemPrototype const * proto); - - void SendEquipmentSetList(); - void SetEquipmentSet(uint32 index, EquipmentSet eqset); - void DeleteEquipmentSet(uint64 setGuid); - - void SendInitWorldStates(uint32 zone, uint32 area); - void SendUpdateWorldState(uint32 Field, uint32 Value); - void SendDirectMessage(WorldPacket *data); - - void SendAurasForTarget(Unit *target); - - PlayerMenu* PlayerTalkClass; - std::vector<ItemSetEffect *> ItemSetEff; - - void SendLoot(uint64 guid, LootType loot_type); - void SendLootRelease( uint64 guid ); - void SendNotifyLootItemRemoved(uint8 lootSlot); - void SendNotifyLootMoneyRemoved(); - - /*********************************************************/ - /*** BATTLEGROUND SYSTEM ***/ - /*********************************************************/ - - bool InBattleGround() const { return m_bgData.bgInstanceID != 0; } - bool InArena() const; - uint32 GetBattleGroundId() const { return m_bgData.bgInstanceID; } - BattleGroundTypeId GetBattleGroundTypeId() const { return m_bgData.bgTypeID; } - BattleGround* GetBattleGround() const; - - bool InBattleGroundQueue() const - { - for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) - if (m_bgBattleGroundQueueID[i].bgQueueTypeId != BATTLEGROUND_QUEUE_NONE) - return true; - return false; - } - - BattleGroundQueueTypeId GetBattleGroundQueueTypeId(uint32 index) const { return m_bgBattleGroundQueueID[index].bgQueueTypeId; } - uint32 GetBattleGroundQueueIndex(BattleGroundQueueTypeId bgQueueTypeId) const - { - for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) - if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId) - return i; - return PLAYER_MAX_BATTLEGROUND_QUEUES; - } - bool IsInvitedForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId) const - { - for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) - if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId) - return m_bgBattleGroundQueueID[i].invitedToInstance != 0; - return false; - } - bool InBattleGroundQueueForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId) const - { - return GetBattleGroundQueueIndex(bgQueueTypeId) < PLAYER_MAX_BATTLEGROUND_QUEUES; - } - - void SetBattleGroundId(uint32 val, BattleGroundTypeId bgTypeId) - { - m_bgData.bgInstanceID = val; - m_bgData.bgTypeID = bgTypeId; - } - uint32 AddBattleGroundQueueId(BattleGroundQueueTypeId val) - { - for (uint8 i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) - { - if (m_bgBattleGroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE || m_bgBattleGroundQueueID[i].bgQueueTypeId == val) - { - m_bgBattleGroundQueueID[i].bgQueueTypeId = val; - m_bgBattleGroundQueueID[i].invitedToInstance = 0; - return i; - } - } - return PLAYER_MAX_BATTLEGROUND_QUEUES; - } - bool HasFreeBattleGroundQueueId() - { - for (uint8 i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) - if (m_bgBattleGroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE) - return true; - return false; - } - void RemoveBattleGroundQueueId(BattleGroundQueueTypeId val) - { - for (uint8 i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) - { - if (m_bgBattleGroundQueueID[i].bgQueueTypeId == val) - { - m_bgBattleGroundQueueID[i].bgQueueTypeId = BATTLEGROUND_QUEUE_NONE; - m_bgBattleGroundQueueID[i].invitedToInstance = 0; - return; - } - } - } - void SetInviteForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId, uint32 instanceId) - { - for (uint8 i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) - if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId) - m_bgBattleGroundQueueID[i].invitedToInstance = instanceId; - } - bool IsInvitedForBattleGroundInstance(uint32 instanceId) const - { - for (uint8 i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) - if (m_bgBattleGroundQueueID[i].invitedToInstance == instanceId) - return true; - return false; - } - WorldLocation const& GetBattleGroundEntryPoint() const { return m_bgData.joinPos; } - void SetBattleGroundEntryPoint(); - - void SetBGTeam(uint32 team) { m_bgData.bgTeam = team; } - uint32 GetBGTeam() const { return m_bgData.bgTeam ? m_bgData.bgTeam : GetTeam(); } - - void LeaveBattleground(bool teleportToEntryPoint = true); - bool CanJoinToBattleground() const; - bool CanReportAfkDueToLimit(); - void ReportedAfkBy(Player* reporter); - void ClearAfkReports() { m_bgData.bgAfkReporter.clear(); } - - bool GetBGAccessByLevel(BattleGroundTypeId bgTypeId) const; - bool isTotalImmunity(); - bool CanUseBattleGroundObject(); - bool isTotalImmune(); - bool CanCaptureTowerPoint(); - - /*********************************************************/ - /*** OUTDOOR PVP SYSTEM ***/ - /*********************************************************/ - - OutdoorPvP * GetOutdoorPvP() const; - // returns true if the player is in active state for outdoor pvp objective capturing, false otherwise - bool IsOutdoorPvPActive(); - - /*********************************************************/ - /*** REST SYSTEM ***/ - /*********************************************************/ - - bool isRested() const { return GetRestTime() >= 10*IN_MILISECONDS; } - uint32 GetXPRestBonus(uint32 xp); - uint32 GetRestTime() const { return m_restTime;} - void SetRestTime(uint32 v) { m_restTime = v;} - - /*********************************************************/ - /*** ENVIROMENTAL SYSTEM ***/ - /*********************************************************/ - - uint32 EnvironmentalDamage(EnviromentalDamage type, uint32 damage); - - /*********************************************************/ - /*** FLOOD FILTER SYSTEM ***/ - /*********************************************************/ - - void UpdateSpeakTime(); - bool CanSpeak() const; - void ChangeSpeakTime(int utime); - - /*********************************************************/ - /*** VARIOUS SYSTEMS ***/ - /*********************************************************/ - void UpdateFallInformationIfNeed(MovementInfo const& minfo,uint16 opcode); - Unit *m_mover; - WorldObject *m_seer; - void SetFallInformation(uint32 time, float z) - { - m_lastFallTime = time; - m_lastFallZ = z; - } - void HandleFall(MovementInfo const& movementInfo); - - bool IsKnowHowFlyIn(uint32 mapid, uint32 zone) const; - - void SetClientControl(Unit* target, uint8 allowMove); - - void SetMover(Unit* target) - { - m_mover->m_movedPlayer = NULL; - m_mover = target; - m_mover->m_movedPlayer = this; - } - void SetSeer(WorldObject *target) { m_seer = target; } - void SetViewpoint(WorldObject *target, bool apply); - WorldObject* GetViewpoint() const; - void StopCastingCharm(); - void StopCastingBindSight(); - - uint32 GetSaveTimer() const { return m_nextSave; } - void SetSaveTimer(uint32 timer) { m_nextSave = timer; } - - // Recall position - uint32 m_recallMap; - float m_recallX; - float m_recallY; - float m_recallZ; - float m_recallO; - void SaveRecallPosition(); - - // Homebind coordinates - uint32 m_homebindMapId; - uint16 m_homebindZoneId; - float m_homebindX; - float m_homebindY; - float m_homebindZ; - - WorldLocation GetStartPosition() const; - - // currently visible objects at player client - typedef std::set<uint64> ClientGUIDs; - ClientGUIDs m_clientGUIDs; - - bool HaveAtClient(WorldObject const* u) const { return u==this || m_clientGUIDs.find(u->GetGUID())!=m_clientGUIDs.end(); } - - bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList = false, bool is3dDistance = true) const; - bool IsVisibleInGridForPlayer(Player const* pl) const; - bool IsVisibleGloballyFor(Player* pl) const; - - void UpdateVisibilityOf(WorldObject* target); - void SendInitialVisiblePackets(Unit* target); - - template<class T> - void UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& visibleNow); - - // Stealth detection system - void HandleStealthedUnitsDetection(); - - uint8 m_forced_speed_changes[MAX_MOVE_TYPE]; - - bool HasAtLoginFlag(AtLoginFlags f) const { return m_atLoginFlags & f; } - void SetAtLoginFlag(AtLoginFlags f) { m_atLoginFlags |= f; } - void RemoveAtLoginFlag(AtLoginFlags f, bool in_db_also = false); - - LookingForGroup m_lookingForGroup; - - // Temporarily removed pet cache - uint32 GetTemporaryUnsummonedPetNumber() const { return m_temporaryUnsummonedPetNumber; } - void SetTemporaryUnsummonedPetNumber(uint32 petnumber) { m_temporaryUnsummonedPetNumber = petnumber; } - void UnsummonPetTemporaryIfAny(); - void ResummonPetTemporaryUnSummonedIfAny(); - bool IsPetNeedBeTemporaryUnsummoned() const { return !IsInWorld() || !isAlive() || IsMounted() /*+in flight*/; } - - void SendCinematicStart(uint32 CinematicSequenceId); - void SendMovieStart(uint32 MovieId); - - /*********************************************************/ - /*** INSTANCE SYSTEM ***/ - /*********************************************************/ - - typedef UNORDERED_MAP< uint32 /*mapId*/, InstancePlayerBind > BoundInstancesMap; - - void UpdateHomebindTime(uint32 time); - - uint32 m_HomebindTimer; - bool m_InstanceValid; - // permanent binds and solo binds by difficulty - BoundInstancesMap m_boundInstances[MAX_DIFFICULTY]; - InstancePlayerBind* GetBoundInstance(uint32 mapid, Difficulty difficulty); - BoundInstancesMap& GetBoundInstances(Difficulty difficulty) { return m_boundInstances[difficulty]; } - InstanceSave * GetInstanceSave(uint32 mapid, bool raid); - void UnbindInstance(uint32 mapid, Difficulty difficulty, bool unload = false); - void UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficulty, bool unload = false); - InstancePlayerBind* BindToInstance(InstanceSave *save, bool permanent, bool load = false); - void SendRaidInfo(); - void SendSavedInstances(); - static void ConvertInstancesToGroup(Player *player, Group *group = NULL, uint64 player_guid = 0); - bool Satisfy(AccessRequirement const*, uint32 target_map, bool report = false); - - // last used pet number (for BG's) - uint32 GetLastPetNumber() const { return m_lastpetnumber; } - void SetLastPetNumber(uint32 petnumber) { m_lastpetnumber = petnumber; } - - /*********************************************************/ - /*** GROUP SYSTEM ***/ - /*********************************************************/ - - Group * GetGroupInvite() { return m_groupInvite; } - void SetGroupInvite(Group *group) { m_groupInvite = group; } - Group * GetGroup() { return m_group.getTarget(); } - const Group * GetGroup() const { return (const Group*)m_group.getTarget(); } - GroupReference& GetGroupRef() { return m_group; } - void SetGroup(Group *group, int8 subgroup = -1); - uint8 GetSubGroup() const { return m_group.getSubGroup(); } - uint32 GetGroupUpdateFlag() const { return m_groupUpdateMask; } - void SetGroupUpdateFlag(uint32 flag) { m_groupUpdateMask |= flag; } - const uint64& GetAuraUpdateMaskForRaid() const { return m_auraRaidUpdateMask; } - void SetAuraUpdateMaskForRaid(uint8 slot) { m_auraRaidUpdateMask |= (uint64(1) << slot); } - Player* GetNextRandomRaidMember(float radius); - PartyResult CanUninviteFromGroup() const; - // BattleGround Group System - void SetBattleGroundRaid(Group *group, int8 subgroup = -1); - void RemoveFromBattleGroundRaid(); - Group * GetOriginalGroup() { return m_originalGroup.getTarget(); } - GroupReference& GetOriginalGroupRef() { return m_originalGroup; } - uint8 GetOriginalSubGroup() const { return m_originalGroup.getSubGroup(); } - void SetOriginalGroup(Group *group, int8 subgroup = -1); - - MapReference &GetMapRef() { return m_mapRef; } - - // Set map to player and add reference - void SetMap(Map * map); - void ResetMap(); - - bool isAllowedToLoot(Creature* creature); - - DeclinedName const* GetDeclinedNames() const { return m_declinedname; } - uint8 GetRunesState() const { return m_runes->runeState; } - RuneType GetBaseRune(uint8 index) const { return RuneType(m_runes->runes[index].BaseRune); } - RuneType GetCurrentRune(uint8 index) const { return RuneType(m_runes->runes[index].CurrentRune); } - uint8 GetRuneCooldown(uint8 index) const { return m_runes->runes[index].Cooldown; } - bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const; - RuneType GetLastUsedRune() { return m_runes->lastUsedRune; } - void SetLastUsedRune(RuneType type) { m_runes->lastUsedRune = type; } - void SetBaseRune(uint8 index, RuneType baseRune) { m_runes->runes[index].BaseRune = baseRune; } - void SetCurrentRune(uint8 index, RuneType currentRune) { m_runes->runes[index].CurrentRune = currentRune; } - void SetRuneCooldown(uint8 index, uint8 cooldown) { m_runes->runes[index].Cooldown = cooldown; m_runes->SetRuneState(index, (cooldown == 0) ? true : false); } - void SetRuneConvertAura(uint8 index, AuraEffect const * aura) { m_runes->runes[index].ConvertAura = aura; } - void AddRuneByAuraEffect(uint8 index, RuneType newType, AuraEffect const * aura) { SetRuneConvertAura(index, aura); ConvertRune(index, newType); } - 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(); - - AchievementMgr& GetAchievementMgr() { return m_achievementMgr; } - void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1 = 0, uint32 miscvalue2 = 0, Unit *unit = NULL, uint32 time = 0); - void CompletedAchievement(AchievementEntry const* entry); - - bool HasTitle(uint32 bitIndex); - bool HasTitle(CharTitlesEntry const* title) { return HasTitle(title->bit_index); } - void SetTitle(CharTitlesEntry const* title, bool lost = false); - - //bool isActiveObject() const { return true; } - bool canSeeSpellClickOn(Creature const* creature) const; - uint32 GetActionButtonSpell(uint8 button) const - { - ActionButtonList::const_iterator ab = m_actionButtons.find(button); - return ab != m_actionButtons.end() && ab->second.uState != ACTIONBUTTON_DELETED && ab->second.GetType() == ACTION_BUTTON_SPELL ? ab->second.GetAction() : 0; - } - - uint32 GetChampioningFaction() const { return m_ChampioningFaction; } - void SetChampioningFaction(uint32 faction) { m_ChampioningFaction = faction; } -Spell * m_spellModTakingSpell; - protected: - uint32 m_AreaID; - uint32 m_regenTimerCount; - float m_powerFraction[MAX_POWERS]; - uint32 m_contestedPvPTimer; - - /*********************************************************/ - /*** BATTLEGROUND SYSTEM ***/ - /*********************************************************/ - - /* - this is an array of BG queues (BgTypeIDs) in which is player - */ - struct BgBattleGroundQueueID_Rec - { - BattleGroundQueueTypeId bgQueueTypeId; - uint32 invitedToInstance; - }; - - BgBattleGroundQueueID_Rec m_bgBattleGroundQueueID[PLAYER_MAX_BATTLEGROUND_QUEUES]; - BGData m_bgData; - - /*********************************************************/ - /*** QUEST SYSTEM ***/ - /*********************************************************/ - - //We allow only one timed quest active at the same time. Below can then be simple value instead of set. - std::set<uint32> m_timedquests; - - uint64 m_divider; - uint32 m_ingametime; - - /*********************************************************/ - /*** LOAD SYSTEM ***/ - /*********************************************************/ - - void _LoadActions(QueryResult_AutoPtr result, bool startup); - void _LoadAuras(QueryResult_AutoPtr result, uint32 timediff); - void _LoadGlyphAuras(); - void _LoadBoundInstances(QueryResult_AutoPtr result); - void _LoadInventory(QueryResult_AutoPtr result, uint32 timediff); - void _LoadMailInit(QueryResult_AutoPtr resultUnread, QueryResult_AutoPtr resultDelivery); - void _LoadMail(); - void _LoadMailedItems(Mail *mail); - void _LoadQuestStatus(QueryResult_AutoPtr result); - void _LoadDailyQuestStatus(QueryResult_AutoPtr result); - void _LoadGroup(QueryResult_AutoPtr result); - void _LoadSkills(QueryResult_AutoPtr result); - void _LoadSpells(QueryResult_AutoPtr result); - void _LoadFriendList(QueryResult_AutoPtr result); - bool _LoadHomeBind(QueryResult_AutoPtr result); - void _LoadDeclinedNames(QueryResult_AutoPtr result); - void _LoadArenaTeamInfo(QueryResult_AutoPtr result); - void _LoadEquipmentSets(QueryResult_AutoPtr result); - void _LoadBGData(QueryResult_AutoPtr result); - void _LoadGlyphs(QueryResult_AutoPtr result); - void _LoadTalents(QueryResult_AutoPtr result); - - /*********************************************************/ - /*** SAVE SYSTEM ***/ - /*********************************************************/ - - void _SaveActions(); - void _SaveAuras(); - void _SaveInventory(); - void _SaveMail(); - void _SaveQuestStatus(); - void _SaveDailyQuestStatus(); - void _SaveSkills(); - void _SaveSpells(); - void _SaveEquipmentSets(); - void _SaveBGData(); - void _SaveGlyphs(); - void _SaveTalents(); - - void _SetCreateBits(UpdateMask *updateMask, Player *target) const; - void _SetUpdateBits(UpdateMask *updateMask, Player *target) const; - - /*********************************************************/ - /*** ENVIRONMENTAL SYSTEM ***/ - /*********************************************************/ - void HandleSobering(); - void SendMirrorTimer(MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen); - void StopMirrorTimer(MirrorTimerType Type); - void HandleDrowning(uint32 time_diff); - int32 getMaxTimer(MirrorTimerType timer); - - /*********************************************************/ - /*** HONOR SYSTEM ***/ - /*********************************************************/ - time_t m_lastHonorUpdateTime; - - void outDebugValues() const; - uint64 m_lootGuid; - - uint32 m_team; - uint32 m_nextSave; - time_t m_speakTime; - uint32 m_speakCount; - Difficulty m_dungeonDifficulty; - Difficulty m_raidDifficulty; - - uint32 m_atLoginFlags; - - Item* m_items[PLAYER_SLOTS_COUNT]; - uint32 m_currentBuybackSlot; - - std::vector<Item*> m_itemUpdateQueue; - bool m_itemUpdateQueueBlocked; - - uint32 m_ExtraFlags; - uint64 m_curSelection; - - uint64 m_comboTarget; - int8 m_comboPoints; - - QuestStatusMap mQuestStatus; - - SkillStatusMap mSkillStatus; - - uint32 m_GuildIdInvited; - uint32 m_ArenaTeamIdInvited; - - PlayerMails m_mail; - PlayerSpellMap m_spells; - PlayerTalentMap *m_talents[MAX_TALENT_SPECS]; - uint32 m_lastPotionId; // last used health/mana potion in combat, that block next potion use - - 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]; - int16 m_baseRatingValue[MAX_COMBAT_RATING]; - uint16 m_baseSpellPower; - uint16 m_baseFeralAP; - uint16 m_baseManaRegen; - uint16 m_baseHealthRegen; - - SpellModList m_spellMods[MAX_SPELLMOD]; - //uint32 m_pad; -// Spell * m_spellModTakingSpell; // Spell for which charges are dropped in spell::finish - - EnchantDurationList m_enchantDuration; - ItemDurationList m_itemDuration; - - void ResetTimeSync(); - void SendTimeSync(); - - uint64 m_resurrectGUID; - uint32 m_resurrectMap; - float m_resurrectX, m_resurrectY, m_resurrectZ; - uint32 m_resurrectHealth, m_resurrectMana; - - WorldSession *m_session; - - typedef std::list<Channel*> JoinedChannelsList; - JoinedChannelsList m_channels; - - int m_cinematic; - - Player *pTrader; - bool acceptTrade; - uint64 tradeItems[TRADE_SLOT_COUNT]; - uint32 tradeGold; - - bool m_DailyQuestChanged; - time_t m_lastDailyQuestTime; - - uint32 m_drunkTimer; - uint16 m_drunk; - uint32 m_weaponChangeTimer; - - uint32 m_zoneUpdateId; - uint32 m_zoneUpdateTimer; - uint32 m_areaUpdateId; - - uint32 m_deathTimer; - time_t m_deathExpireTime; - - uint32 m_restTime; - - uint32 m_WeaponProficiency; - uint32 m_ArmorProficiency; - bool m_canParry; - bool m_canBlock; - bool m_canTitanGrip; - uint8 m_swingErrorMsg; - float m_ammoDPS; - - ////////////////////Rest System///////////////////// - int time_inn_enter; - uint32 inn_pos_mapid; - float inn_pos_x; - float inn_pos_y; - float inn_pos_z; - float m_rest_bonus; - RestType rest_type; - ////////////////////Rest System///////////////////// - uint32 m_resetTalentsCost; - time_t m_resetTalentsTime; - uint32 m_usedTalentCount; - uint32 m_questRewardTalentCount; - - // Social - PlayerSocial *m_social; - - // Groups - GroupReference m_group; - GroupReference m_originalGroup; - Group *m_groupInvite; - uint32 m_groupUpdateMask; - uint64 m_auraRaidUpdateMask; - - // last used pet number (for BG's) - uint32 m_lastpetnumber; - - // Player summoning - time_t m_summon_expire; - uint32 m_summon_mapid; - float m_summon_x; - float m_summon_y; - float m_summon_z; - - DeclinedName *m_declinedname; - Runes *m_runes; - EquipmentSets m_EquipmentSets; - private: - // internal common parts for CanStore/StoreItem functions - uint8 _CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountVec& dest, ItemPrototype const *pProto, uint32& count, bool swap, Item *pSrcItem ) const; - uint8 _CanStoreItem_InBag( uint8 bag, ItemPosCountVec& dest, ItemPrototype const *pProto, uint32& count, bool merge, bool non_specialized, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot ) const; - uint8 _CanStoreItem_InInventorySlots( uint8 slot_begin, uint8 slot_end, ItemPosCountVec& dest, ItemPrototype 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 ); - - void UpdateKnownCurrencies(uint32 itemId, bool apply); - int32 CalculateReputationGain(uint32 creatureOrQuestLevel, int32 rep, int32 faction, bool for_quest); - void AdjustQuestReqItemCount( Quest const* pQuest, QuestStatusData& questStatusData ); - - bool IsCanDelayTeleport() const { return m_bCanDelayTeleport; } - void SetCanDelayTeleport(bool setting) { m_bCanDelayTeleport = setting; } - bool IsHasDelayedTeleport() const { return m_bHasDelayedTeleport; } - void SetDelayedTeleportFlag(bool setting) { m_bHasDelayedTeleport = setting; } - - void ScheduleDelayedOperation(uint32 operation) - { - if(operation < DELAYED_END) - m_DelayedOperations |= operation; - } - - MapReference m_mapRef; - - void UpdateCharmedAI(); - UnitAI *i_AI; - - uint32 m_lastFallTime; - float m_lastFallZ; - - int32 m_MirrorTimer[MAX_TIMERS]; - uint8 m_MirrorTimerFlags; - uint8 m_MirrorTimerFlagsLast; - bool m_isInWater; - - // Current teleport data - WorldLocation m_teleport_dest; - uint32 m_teleport_options; - bool mSemaphoreTeleport_Near; - bool mSemaphoreTeleport_Far; - - uint32 m_DelayedOperations; - bool m_bCanDelayTeleport; - bool m_bHasDelayedTeleport; - - uint32 m_DetectInvTimer; - - // Temporary removed pet cache - uint32 m_temporaryUnsummonedPetNumber; - uint32 m_oldpetspell; - - AchievementMgr m_achievementMgr; - ReputationMgr m_reputationMgr; - - SpellCooldowns m_spellCooldowns; - - uint32 m_ChampioningFaction; - - uint32 m_timeSyncCount; - uint32 m_timeSyncTimer; -}; - -void AddItemsSetItem(Player*player,Item *item); -void RemoveItemsSetItem(Player*player,ItemPrototype const *proto); - -// "the bodies of template functions must be made available in a header file" -template <class T> T Player::ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell * spell) -{ - SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId); - if (!spellInfo) return 0; - float totalmul = 1.0f; - int32 totalflat = 0; - - // Drop charges for triggering spells instead of triggered ones - if (m_spellModTakingSpell) - spell = m_spellModTakingSpell; - - for (SpellModList::iterator itr = m_spellMods[op].begin(); itr != m_spellMods[op].end(); ++itr) - { - SpellModifier *mod = *itr; - - // Charges can be set only for mods with auras - if (!mod->ownerAura) - assert(mod->charges == 0); - - if(!IsAffectedBySpellmod(spellInfo,mod,spell)) - continue; - - if (mod->type == SPELLMOD_FLAT) - totalflat += mod->value; - else if (mod->type == SPELLMOD_PCT) - { - // skip percent mods for null basevalue (most important for spell mods with charges ) - if(basevalue == T(0)) - continue; - - // special case (skip >10sec spell casts for instant cast setting) - if( mod->op==SPELLMOD_CASTING_TIME && basevalue >= T(10000) && mod->value <= -100) - continue; - - totalmul *= 1.0f + (float)mod->value / 100.0f; - } - - DropModCharge(mod, spell); - } - float diff = (float)basevalue * (totalmul - 1.0f) + (float)totalflat; - basevalue = T((float)basevalue + diff); - return T(diff); -} -#endif +/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _PLAYER_H
+#define _PLAYER_H
+
+#include "Common.h"
+#include "ItemPrototype.h"
+#include "Unit.h"
+#include "Item.h"
+
+#include "Database/DatabaseEnv.h"
+#include "NPCHandler.h"
+#include "QuestDef.h"
+#include "Group.h"
+#include "Bag.h"
+#include "WorldSession.h"
+#include "Pet.h"
+#include "MapReference.h"
+#include "Util.h" // for Tokens typedef
+#include "AchievementMgr.h"
+#include "ReputationMgr.h"
+#include "BattleGround.h"
+#include "DBCEnums.h"
+
+#include<string>
+#include<vector>
+
+struct Mail;
+class Channel;
+class DynamicObject;
+class Creature;
+class Pet;
+class PlayerMenu;
+class UpdateMask;
+class SpellCastTargets;
+class PlayerSocial;
+class OutdoorPvP;
+
+typedef std::deque<Mail*> PlayerMails;
+
+#define PLAYER_MAX_SKILLS 127
+#define PLAYER_MAX_DAILY_QUESTS 25
+
+// Note: SPELLMOD_* values is aura types in fact
+enum SpellModType
+{
+ SPELLMOD_FLAT = 107, // SPELL_AURA_ADD_FLAT_MODIFIER
+ SPELLMOD_PCT = 108 // SPELL_AURA_ADD_PCT_MODIFIER
+};
+
+// 2^n values, Player::m_isunderwater is a bitmask. These are Trinity internal values, they are never send to any client
+enum PlayerUnderwaterState
+{
+ UNDERWATER_NONE = 0x00,
+ UNDERWATER_INWATER = 0x01, // terrain type is water and player is afflicted by it
+ UNDERWATER_INLAVA = 0x02, // terrain type is lava and player is afflicted by it
+ UNDERWATER_INSLIME = 0x04, // terrain type is lava and player is afflicted by it
+ UNDERWARER_INDARKWATER = 0x08, // terrain type is dark water and player is afflicted by it
+
+ UNDERWATER_EXIST_TIMERS = 0x10
+};
+
+enum PlayerSpellState
+{
+ PLAYERSPELL_UNCHANGED = 0,
+ PLAYERSPELL_CHANGED = 1,
+ PLAYERSPELL_NEW = 2,
+ PLAYERSPELL_REMOVED = 3,
+ PLAYERSPELL_TEMPORARY = 4
+};
+
+struct PlayerSpell
+{
+ PlayerSpellState state : 8;
+ bool active : 1; // show in spellbook
+ bool dependent : 1; // learned as result another spell learn, skill grow, quest reward, etc
+ bool disabled : 1; // first rank has been learned in result talent learn but currently talent unlearned, save max learned ranks
+};
+
+struct PlayerTalent
+{
+ PlayerSpellState state : 8;
+ uint8 spec : 8;
+};
+
+// Spell modifier (used for modify other spells)
+struct SpellModifier
+{
+ SpellModifier(Aura * _ownerAura = NULL) : charges(0), ownerAura(_ownerAura) {}
+ SpellModOp op : 8;
+ SpellModType type : 8;
+ int16 charges : 16;
+ int32 value;
+ flag96 mask;
+ uint32 spellId;
+ Aura * const ownerAura;
+};
+
+typedef UNORDERED_MAP<uint32, PlayerTalent*> PlayerTalentMap;
+typedef UNORDERED_MAP<uint32, PlayerSpell*> PlayerSpellMap;
+typedef std::list<SpellModifier*> SpellModList;
+
+struct SpellCooldown
+{
+ time_t end;
+ uint16 itemid;
+};
+
+typedef std::map<uint32, SpellCooldown> SpellCooldowns;
+
+enum TrainerSpellState
+{
+ TRAINER_SPELL_GREEN = 0,
+ TRAINER_SPELL_RED = 1,
+ TRAINER_SPELL_GRAY = 2,
+ TRAINER_SPELL_GREEN_DISABLED = 10 // custom value, not send to client: formally green but learn not allowed
+};
+
+enum ActionButtonUpdateState
+{
+ ACTIONBUTTON_UNCHANGED = 0,
+ ACTIONBUTTON_CHANGED = 1,
+ ACTIONBUTTON_NEW = 2,
+ ACTIONBUTTON_DELETED = 3
+};
+
+enum ActionButtonType
+{
+ ACTION_BUTTON_SPELL = 0x00,
+ ACTION_BUTTON_C = 0x01, // click?
+ ACTION_BUTTON_EQSET = 0x20,
+ ACTION_BUTTON_MACRO = 0x40,
+ ACTION_BUTTON_CMACRO = ACTION_BUTTON_C | ACTION_BUTTON_MACRO,
+ ACTION_BUTTON_ITEM = 0x80
+};
+
+#define ACTION_BUTTON_ACTION(X) (uint32(X) & 0x00FFFFFF)
+#define ACTION_BUTTON_TYPE(X) ((uint32(X) & 0xFF000000) >> 24)
+#define MAX_ACTION_BUTTON_ACTION_VALUE (0x00FFFFFF+1)
+
+struct ActionButton
+{
+ ActionButton() : packedData(0), uState( ACTIONBUTTON_NEW ), canRemoveByClient(true){}
+
+ uint32 packedData;
+ ActionButtonUpdateState uState;
+ bool canRemoveByClient;
+
+ // helpers
+ ActionButtonType GetType() const { return ActionButtonType(ACTION_BUTTON_TYPE(packedData)); }
+ uint32 GetAction() const { return ACTION_BUTTON_ACTION(packedData); }
+ void SetActionAndType(uint32 action, ActionButtonType type)
+ {
+ uint32 newData = action | (uint32(type) << 24);
+ if (newData != packedData || uState == ACTIONBUTTON_DELETED)
+ {
+ packedData = newData;
+ if (uState != ACTIONBUTTON_NEW)
+ uState = ACTIONBUTTON_CHANGED;
+ }
+ }
+};
+
+#define MAX_ACTION_BUTTONS 144 //checked in 3.2.0
+
+typedef std::map<uint8,ActionButton> ActionButtonList;
+
+struct PlayerCreateInfoItem
+{
+ PlayerCreateInfoItem(uint32 id, uint32 amount) : item_id(id), item_amount(amount) {}
+
+ uint32 item_id;
+ uint32 item_amount;
+};
+
+typedef std::list<PlayerCreateInfoItem> PlayerCreateInfoItems;
+
+struct PlayerClassLevelInfo
+{
+ PlayerClassLevelInfo() : basehealth(0), basemana(0) {}
+ uint16 basehealth;
+ uint16 basemana;
+};
+
+struct PlayerClassInfo
+{
+ PlayerClassInfo() : levelInfo(NULL) { }
+
+ PlayerClassLevelInfo* levelInfo; //[level-1] 0..MaxPlayerLevel-1
+};
+
+struct PlayerLevelInfo
+{
+ PlayerLevelInfo() { for (uint8 i=0; i < MAX_STATS; ++i ) stats[i] = 0; }
+
+ uint8 stats[MAX_STATS];
+};
+
+typedef std::list<uint32> PlayerCreateInfoSpells;
+
+struct PlayerCreateInfoAction
+{
+ PlayerCreateInfoAction() : button(0), type(0), action(0) {}
+ PlayerCreateInfoAction(uint8 _button, uint32 _action, uint8 _type) : button(_button), type(_type), action(_action) {}
+
+ uint8 button;
+ uint8 type;
+ uint32 action;
+};
+
+typedef std::list<PlayerCreateInfoAction> PlayerCreateInfoActions;
+
+struct PlayerInfo
+{
+ // existence checked by displayId != 0 // existence checked by displayId != 0
+ PlayerInfo() : displayId_m(0),displayId_f(0),levelInfo(NULL)
+ {
+ }
+
+ uint32 mapId;
+ uint32 zoneId;
+ float positionX;
+ float positionY;
+ float positionZ;
+ uint16 displayId_m;
+ uint16 displayId_f;
+ PlayerCreateInfoItems item;
+ PlayerCreateInfoSpells spell;
+ PlayerCreateInfoActions action;
+
+ PlayerLevelInfo* levelInfo; //[level-1] 0..MaxPlayerLevel-1
+};
+
+struct PvPInfo
+{
+ PvPInfo() : inHostileArea(false), inNoPvPArea(false), inFFAPvPArea(false), endTimer(0) {}
+
+ bool inHostileArea;
+ bool inNoPvPArea;
+ bool inFFAPvPArea;
+ time_t endTimer;
+};
+
+struct DuelInfo
+{
+ DuelInfo() : initiator(NULL), opponent(NULL), startTimer(0), startTime(0), outOfBound(0) {}
+
+ Player *initiator;
+ Player *opponent;
+ time_t startTimer;
+ time_t startTime;
+ time_t outOfBound;
+};
+
+struct Areas
+{
+ uint32 areaID;
+ uint32 areaFlag;
+ float x1;
+ float x2;
+ float y1;
+ float y2;
+};
+
+#define MAX_RUNES 6
+#define RUNE_COOLDOWN 10000
+
+enum RuneType
+{
+ RUNE_BLOOD = 0,
+ RUNE_UNHOLY = 1,
+ RUNE_FROST = 2,
+ RUNE_DEATH = 3,
+ NUM_RUNE_TYPES = 4
+};
+
+struct RuneInfo
+{
+ uint8 BaseRune;
+ uint8 CurrentRune;
+ uint32 Cooldown;
+ AuraEffect const * ConvertAura;
+};
+
+struct Runes
+{
+ RuneInfo runes[MAX_RUNES];
+ uint8 runeState; // mask of available runes
+ RuneType lastUsedRune;
+
+ void SetRuneState(uint8 index, bool set = true)
+ {
+ if(set)
+ runeState |= (1 << index); // usable
+ else
+ runeState &= ~(1 << index); // on cooldown
+ }
+};
+
+struct EnchantDuration
+{
+ EnchantDuration() : item(NULL), slot(MAX_ENCHANTMENT_SLOT), leftduration(0) {};
+ EnchantDuration(Item * _item, EnchantmentSlot _slot, uint32 _leftduration) : item(_item), slot(_slot),
+ leftduration(_leftduration){ assert(item); };
+
+ Item * item;
+ EnchantmentSlot slot;
+ uint32 leftduration;
+};
+
+typedef std::list<EnchantDuration> EnchantDurationList;
+typedef std::list<Item*> ItemDurationList;
+
+enum LfgType
+{
+ LFG_TYPE_NONE = 0,
+ LFG_TYPE_DUNGEON = 1,
+ LFG_TYPE_RAID = 2,
+ LFG_TYPE_QUEST = 3,
+ LFG_TYPE_ZONE = 4,
+ LFG_TYPE_HEROIC_DUNGEON = 5,
+ LFG_TYPE_RANDOM_DUNGEON = 6
+};
+
+enum LfgRoles
+{
+ LEADER = 0x01,
+ TANK = 0x02,
+ HEALER = 0x04,
+ DAMAGE = 0x08
+};
+
+struct LookingForGroupSlot
+{
+ LookingForGroupSlot() : entry(0), type(0) {}
+ bool Empty() const { return !entry && !type; }
+ void Clear() { entry = 0; type = 0; }
+ void Set(uint32 _entry, uint32 _type ) { entry = _entry; type = _type; }
+ bool Is(uint32 _entry, uint32 _type) const { return entry == _entry && type == _type; }
+ bool canAutoJoin() const { return entry && (type == LFG_TYPE_DUNGEON || type == LFG_TYPE_HEROIC_DUNGEON); }
+
+ uint32 entry;
+ uint32 type;
+};
+
+#define MAX_LOOKING_FOR_GROUP_SLOT 3
+
+struct LookingForGroup
+{
+ LookingForGroup() {}
+ bool HaveInSlot(LookingForGroupSlot const& slot) const { return HaveInSlot(slot.entry, slot.type); }
+ bool HaveInSlot(uint32 _entry, uint32 _type) const
+ {
+ for (uint8 i = 0; i < MAX_LOOKING_FOR_GROUP_SLOT; ++i)
+ if(slots[i].Is(_entry, _type))
+ return true;
+ return false;
+ }
+
+ bool canAutoJoin() const
+ {
+ for (uint8 i = 0; i < MAX_LOOKING_FOR_GROUP_SLOT; ++i)
+ if(slots[i].canAutoJoin())
+ return true;
+ return false;
+ }
+
+ bool Empty() const
+ {
+ for (uint8 i = 0; i < MAX_LOOKING_FOR_GROUP_SLOT; ++i)
+ if(!slots[i].Empty())
+ return false;
+ return more.Empty();
+ }
+
+ LookingForGroupSlot slots[MAX_LOOKING_FOR_GROUP_SLOT];
+ LookingForGroupSlot more;
+ std::string comment;
+ uint8 roles;
+};
+
+enum PlayerMovementType
+{
+ MOVE_ROOT = 1,
+ MOVE_UNROOT = 2,
+ MOVE_WATER_WALK = 3,
+ MOVE_LAND_WALK = 4
+};
+
+enum DrunkenState
+{
+ DRUNKEN_SOBER = 0,
+ DRUNKEN_TIPSY = 1,
+ DRUNKEN_DRUNK = 2,
+ DRUNKEN_SMASHED = 3
+};
+
+#define MAX_DRUNKEN 4
+
+enum PlayerFlags
+{
+ PLAYER_FLAGS_GROUP_LEADER = 0x00000001,
+ PLAYER_FLAGS_AFK = 0x00000002,
+ PLAYER_FLAGS_DND = 0x00000004,
+ PLAYER_FLAGS_GM = 0x00000008,
+ PLAYER_FLAGS_GHOST = 0x00000010,
+ PLAYER_FLAGS_RESTING = 0x00000020,
+ PLAYER_FLAGS_UNK7 = 0x00000040,
+ PLAYER_FLAGS_UNK8 = 0x00000080, // pre-3.0.3 PLAYER_FLAGS_FFA_PVP flag for FFA PVP state
+ PLAYER_FLAGS_CONTESTED_PVP = 0x00000100, // Player has been involved in a PvP combat and will be attacked by contested guards
+ PLAYER_FLAGS_IN_PVP = 0x00000200,
+ PLAYER_FLAGS_HIDE_HELM = 0x00000400,
+ PLAYER_FLAGS_HIDE_CLOAK = 0x00000800,
+ PLAYER_FLAGS_UNK13 = 0x00001000, // played long time
+ PLAYER_FLAGS_UNK14 = 0x00002000, // played too long time
+ PLAYER_FLAGS_UNK15 = 0x00004000,
+ PLAYER_FLAGS_DEVELOPER = 0x00008000, // <Dev> prefix for something?
+ PLAYER_FLAGS_UNK17 = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary
+ PLAYER_FLAGS_UNK18 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1)
+ PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually)
+ PLAYER_FLAGS_UNK20 = 0x00080000,
+ PLAYER_FLAGS_UNK21 = 0x00100000,
+ PLAYER_FLAGS_UNK22 = 0x00200000,
+ PLAYER_FLAGS_UNK23 = 0x00400000,
+ PLAYER_ALLOW_ONLY_ABILITY = 0x00800000, // used by bladestorm and killing spree
+ PLAYER_FLAGS_UNK25 = 0x01000000, // disabled all melee ability on tab include autoattack
+
+ PLAYER_FLAGS_NO_XP_GAIN = 0x02000000
+};
+
+// used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<<bit_index) without (-1)
+// can't use enum for uint64 values
+#define PLAYER_TITLE_DISABLED UI64LIT(0x0000000000000000)
+#define PLAYER_TITLE_NONE UI64LIT(0x0000000000000001)
+#define PLAYER_TITLE_PRIVATE UI64LIT(0x0000000000000002) // 1
+#define PLAYER_TITLE_CORPORAL UI64LIT(0x0000000000000004) // 2
+#define PLAYER_TITLE_SERGEANT_A UI64LIT(0x0000000000000008) // 3
+#define PLAYER_TITLE_MASTER_SERGEANT UI64LIT(0x0000000000000010) // 4
+#define PLAYER_TITLE_SERGEANT_MAJOR UI64LIT(0x0000000000000020) // 5
+#define PLAYER_TITLE_KNIGHT UI64LIT(0x0000000000000040) // 6
+#define PLAYER_TITLE_KNIGHT_LIEUTENANT UI64LIT(0x0000000000000080) // 7
+#define PLAYER_TITLE_KNIGHT_CAPTAIN UI64LIT(0x0000000000000100) // 8
+#define PLAYER_TITLE_KNIGHT_CHAMPION UI64LIT(0x0000000000000200) // 9
+#define PLAYER_TITLE_LIEUTENANT_COMMANDER UI64LIT(0x0000000000000400) // 10
+#define PLAYER_TITLE_COMMANDER UI64LIT(0x0000000000000800) // 11
+#define PLAYER_TITLE_MARSHAL UI64LIT(0x0000000000001000) // 12
+#define PLAYER_TITLE_FIELD_MARSHAL UI64LIT(0x0000000000002000) // 13
+#define PLAYER_TITLE_GRAND_MARSHAL UI64LIT(0x0000000000004000) // 14
+#define PLAYER_TITLE_SCOUT UI64LIT(0x0000000000008000) // 15
+#define PLAYER_TITLE_GRUNT UI64LIT(0x0000000000010000) // 16
+#define PLAYER_TITLE_SERGEANT_H UI64LIT(0x0000000000020000) // 17
+#define PLAYER_TITLE_SENIOR_SERGEANT UI64LIT(0x0000000000040000) // 18
+#define PLAYER_TITLE_FIRST_SERGEANT UI64LIT(0x0000000000080000) // 19
+#define PLAYER_TITLE_STONE_GUARD UI64LIT(0x0000000000100000) // 20
+#define PLAYER_TITLE_BLOOD_GUARD UI64LIT(0x0000000000200000) // 21
+#define PLAYER_TITLE_LEGIONNAIRE UI64LIT(0x0000000000400000) // 22
+#define PLAYER_TITLE_CENTURION UI64LIT(0x0000000000800000) // 23
+#define PLAYER_TITLE_CHAMPION UI64LIT(0x0000000001000000) // 24
+#define PLAYER_TITLE_LIEUTENANT_GENERAL UI64LIT(0x0000000002000000) // 25
+#define PLAYER_TITLE_GENERAL UI64LIT(0x0000000004000000) // 26
+#define PLAYER_TITLE_WARLORD UI64LIT(0x0000000008000000) // 27
+#define PLAYER_TITLE_HIGH_WARLORD UI64LIT(0x0000000010000000) // 28
+#define PLAYER_TITLE_GLADIATOR UI64LIT(0x0000000020000000) // 29
+#define PLAYER_TITLE_DUELIST UI64LIT(0x0000000040000000) // 30
+#define PLAYER_TITLE_RIVAL UI64LIT(0x0000000080000000) // 31
+#define PLAYER_TITLE_CHALLENGER UI64LIT(0x0000000100000000) // 32
+#define PLAYER_TITLE_SCARAB_LORD UI64LIT(0x0000000200000000) // 33
+#define PLAYER_TITLE_CONQUEROR UI64LIT(0x0000000400000000) // 34
+#define PLAYER_TITLE_JUSTICAR UI64LIT(0x0000000800000000) // 35
+#define PLAYER_TITLE_CHAMPION_OF_THE_NAARU UI64LIT(0x0000001000000000) // 36
+#define PLAYER_TITLE_MERCILESS_GLADIATOR UI64LIT(0x0000002000000000) // 37
+#define PLAYER_TITLE_OF_THE_SHATTERED_SUN UI64LIT(0x0000004000000000) // 38
+#define PLAYER_TITLE_HAND_OF_ADAL UI64LIT(0x0000008000000000) // 39
+#define PLAYER_TITLE_VENGEFUL_GLADIATOR UI64LIT(0x0000010000000000) // 40
+
+#define MAX_TITLE_INDEX (3*64) // 3 uint64 fields
+
+// used in PLAYER_FIELD_BYTES values
+enum PlayerFieldByteFlags
+{
+ PLAYER_FIELD_BYTE_TRACK_STEALTHED = 0x00000002,
+ PLAYER_FIELD_BYTE_RELEASE_TIMER = 0x00000008, // Display time till auto release spirit
+ PLAYER_FIELD_BYTE_NO_RELEASE_WINDOW = 0x00000010 // Display no "release spirit" window at all
+};
+
+// used in PLAYER_FIELD_BYTES2 values
+enum PlayerFieldByte2Flags
+{
+ PLAYER_FIELD_BYTE2_NONE = 0x0000,
+ PLAYER_FIELD_BYTE2_INVISIBILITY_GLOW = 0x4000
+};
+
+enum ActivateTaxiReplies
+{
+ ERR_TAXIOK = 0,
+ ERR_TAXIUNSPECIFIEDSERVERERROR = 1,
+ ERR_TAXINOSUCHPATH = 2,
+ ERR_TAXINOTENOUGHMONEY = 3,
+ ERR_TAXITOOFARAWAY = 4,
+ ERR_TAXINOVENDORNEARBY = 5,
+ ERR_TAXINOTVISITED = 6,
+ ERR_TAXIPLAYERBUSY = 7,
+ ERR_TAXIPLAYERALREADYMOUNTED = 8,
+ ERR_TAXIPLAYERSHAPESHIFTED = 9,
+ ERR_TAXIPLAYERMOVING = 10,
+ ERR_TAXISAMENODE = 11,
+ ERR_TAXINOTSTANDING = 12
+};
+
+enum MirrorTimerType
+{
+ FATIGUE_TIMER = 0,
+ BREATH_TIMER = 1,
+ FIRE_TIMER = 2
+};
+#define MAX_TIMERS 3
+#define DISABLED_MIRROR_TIMER -1
+
+// 2^n values
+enum PlayerExtraFlags
+{
+ // gm abilities
+ PLAYER_EXTRA_GM_ON = 0x0001,
+ PLAYER_EXTRA_ACCEPT_WHISPERS = 0x0004,
+ PLAYER_EXTRA_TAXICHEAT = 0x0008,
+ PLAYER_EXTRA_GM_INVISIBLE = 0x0010,
+ PLAYER_EXTRA_GM_CHAT = 0x0020, // Show GM badge in chat messages
+
+ // other states
+ PLAYER_EXTRA_PVP_DEATH = 0x0100 // store PvP death status until corpse creating.
+};
+
+// 2^n values
+enum AtLoginFlags
+{
+ AT_LOGIN_NONE = 0x00,
+ AT_LOGIN_RENAME = 0x01,
+ AT_LOGIN_RESET_SPELLS = 0x02,
+ AT_LOGIN_RESET_TALENTS = 0x04,
+ AT_LOGIN_CUSTOMIZE = 0x08,
+ AT_LOGIN_RESET_PET_TALENTS = 0x10,
+ AT_LOGIN_FIRST = 0x20,
+};
+
+typedef std::map<uint32, QuestStatusData> QuestStatusMap;
+
+enum QuestSlotOffsets
+{
+ QUEST_ID_OFFSET = 0,
+ QUEST_STATE_OFFSET = 1,
+ QUEST_COUNTS_OFFSET = 2,
+ QUEST_TIME_OFFSET = 3
+};
+
+#define MAX_QUEST_OFFSET 5
+
+enum QuestSlotStateMask
+{
+ QUEST_STATE_NONE = 0x0000,
+ QUEST_STATE_COMPLETE = 0x0001,
+ QUEST_STATE_FAIL = 0x0002
+};
+
+enum SkillUpdateState
+{
+ SKILL_UNCHANGED = 0,
+ SKILL_CHANGED = 1,
+ SKILL_NEW = 2,
+ SKILL_DELETED = 3
+};
+
+struct SkillStatusData
+{
+ SkillStatusData(uint8 _pos, SkillUpdateState _uState) : pos(_pos), uState(_uState)
+ {
+ }
+ uint8 pos;
+ SkillUpdateState uState;
+};
+
+typedef UNORDERED_MAP<uint32, SkillStatusData> SkillStatusMap;
+
+class Quest;
+class Spell;
+class Item;
+class WorldSession;
+
+enum PlayerSlots
+{
+ // first slot for item stored (in any way in player m_items data)
+ PLAYER_SLOT_START = 0,
+ // last+1 slot for item stored (in any way in player m_items data)
+ PLAYER_SLOT_END = 150,
+ PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START)
+};
+
+#define INVENTORY_SLOT_BAG_0 255
+
+enum EquipmentSlots // 19 slots
+{
+ EQUIPMENT_SLOT_START = 0,
+ EQUIPMENT_SLOT_HEAD = 0,
+ EQUIPMENT_SLOT_NECK = 1,
+ EQUIPMENT_SLOT_SHOULDERS = 2,
+ EQUIPMENT_SLOT_BODY = 3,
+ EQUIPMENT_SLOT_CHEST = 4,
+ EQUIPMENT_SLOT_WAIST = 5,
+ EQUIPMENT_SLOT_LEGS = 6,
+ EQUIPMENT_SLOT_FEET = 7,
+ EQUIPMENT_SLOT_WRISTS = 8,
+ EQUIPMENT_SLOT_HANDS = 9,
+ EQUIPMENT_SLOT_FINGER1 = 10,
+ EQUIPMENT_SLOT_FINGER2 = 11,
+ EQUIPMENT_SLOT_TRINKET1 = 12,
+ EQUIPMENT_SLOT_TRINKET2 = 13,
+ EQUIPMENT_SLOT_BACK = 14,
+ EQUIPMENT_SLOT_MAINHAND = 15,
+ EQUIPMENT_SLOT_OFFHAND = 16,
+ EQUIPMENT_SLOT_RANGED = 17,
+ EQUIPMENT_SLOT_TABARD = 18,
+ EQUIPMENT_SLOT_END = 19
+};
+
+enum InventorySlots // 4 slots
+{
+ INVENTORY_SLOT_BAG_START = 19,
+ INVENTORY_SLOT_BAG_END = 23
+};
+
+enum InventoryPackSlots // 16 slots
+{
+ INVENTORY_SLOT_ITEM_START = 23,
+ INVENTORY_SLOT_ITEM_END = 39
+};
+
+enum BankItemSlots // 28 slots
+{
+ BANK_SLOT_ITEM_START = 39,
+ BANK_SLOT_ITEM_END = 67
+};
+
+enum BankBagSlots // 7 slots
+{
+ BANK_SLOT_BAG_START = 67,
+ BANK_SLOT_BAG_END = 74
+};
+
+enum BuyBackSlots // 12 slots
+{
+ // stored in m_buybackitems
+ BUYBACK_SLOT_START = 74,
+ BUYBACK_SLOT_END = 86
+};
+
+enum KeyRingSlots // 32 slots
+{
+ KEYRING_SLOT_START = 86,
+ KEYRING_SLOT_END = 118
+};
+
+enum CurrencyTokenSlots // 32 slots
+{
+ CURRENCYTOKEN_SLOT_START = 118,
+ CURRENCYTOKEN_SLOT_END = 150
+};
+
+enum EquipmentSetUpdateState
+{
+ EQUIPMENT_SET_UNCHANGED = 0,
+ EQUIPMENT_SET_CHANGED = 1,
+ EQUIPMENT_SET_NEW = 2,
+ EQUIPMENT_SET_DELETED = 3
+};
+
+struct EquipmentSet
+{
+ EquipmentSet() : Guid(0), state(EQUIPMENT_SET_NEW)
+ {
+ for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ Items[i] = 0;
+ }
+
+ uint64 Guid;
+ std::string Name;
+ std::string IconName;
+ uint32 Items[EQUIPMENT_SLOT_END];
+ EquipmentSetUpdateState state;
+};
+
+#define MAX_EQUIPMENT_SET_INDEX 10 // client limit
+
+typedef std::map<uint32, EquipmentSet> EquipmentSets;
+
+struct ItemPosCount
+{
+ ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) {}
+ bool isContainedIn(std::vector<ItemPosCount> const& vec) const;
+ uint16 pos;
+ uint32 count;
+};
+typedef std::vector<ItemPosCount> ItemPosCountVec;
+
+enum TradeSlots
+{
+ TRADE_SLOT_COUNT = 7,
+ TRADE_SLOT_TRADED_COUNT = 6,
+ TRADE_SLOT_NONTRADED = 6
+};
+
+enum TransferAbortReason
+{
+ TRANSFER_ABORT_NONE = 0x00,
+ TRANSFER_ABORT_ERROR = 0x01,
+ TRANSFER_ABORT_MAX_PLAYERS = 0x02, // Transfer Aborted: instance is full
+ TRANSFER_ABORT_NOT_FOUND = 0x03, // Transfer Aborted: instance not found
+ TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x04, // You have entered too many instances recently.
+ TRANSFER_ABORT_ZONE_IN_COMBAT = 0x06, // Unable to zone in while an encounter is in progress.
+ TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x07, // You must have <TBC,WotLK> expansion installed to access this area.
+ TRANSFER_ABORT_DIFFICULTY = 0x08, // <Normal,Heroic,Epic> difficulty mode is not available for %s.
+ TRANSFER_ABORT_UNIQUE_MESSAGE = 0x09, // Until you've escaped TLK's grasp, you cannot leave this place!
+ TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x0A, // Additional instances cannot be launched, please try again later.
+ TRANSFER_ABORT_NEED_GROUP = 0x0B, // 3.1
+ TRANSFER_ABORT_NOT_FOUND2 = 0x0C, // 3.1
+ TRANSFER_ABORT_NOT_FOUND3 = 0x0D, // 3.1
+ TRANSFER_ABORT_NOT_FOUND4 = 0x0E, // 3.2
+ TRANSFER_ABORT_REALM_ONLY = 0x0F, // All players on party must be from the same realm.
+ TRANSFER_ABORT_MAP_NOT_ALLOWED = 0x10, // Map can't be entered at this time.
+};
+
+enum InstanceResetWarningType
+{
+ RAID_INSTANCE_WARNING_HOURS = 1, // WARNING! %s is scheduled to reset in %d hour(s).
+ RAID_INSTANCE_WARNING_MIN = 2, // WARNING! %s is scheduled to reset in %d minute(s)!
+ RAID_INSTANCE_WARNING_MIN_SOON = 3, // WARNING! %s is scheduled to reset in %d minute(s). Please exit the zone or you will be returned to your bind location!
+ RAID_INSTANCE_WELCOME = 4, // Welcome to %s. This raid instance is scheduled to reset in %s.
+ RAID_INSTANCE_EXPIRED = 5
+};
+
+// PLAYER_FIELD_ARENA_TEAM_INFO_1_1 offsets
+enum ArenaTeamInfoType
+{
+ ARENA_TEAM_ID = 0,
+ ARENA_TEAM_TYPE = 1, // new in 3.2 - team type?
+ ARENA_TEAM_MEMBER = 2, // 0 - captain, 1 - member
+ ARENA_TEAM_GAMES_WEEK = 3,
+ ARENA_TEAM_GAMES_SEASON = 4,
+ ARENA_TEAM_WINS_SEASON = 5,
+ ARENA_TEAM_PERSONAL_RATING = 6,
+ ARENA_TEAM_END = 7
+};
+
+class InstanceSave;
+
+enum RestType
+{
+ REST_TYPE_NO = 0,
+ REST_TYPE_IN_TAVERN = 1,
+ REST_TYPE_IN_CITY = 2
+};
+
+enum DuelCompleteType
+{
+ DUEL_INTERUPTED = 0,
+ DUEL_WON = 1,
+ DUEL_FLED = 2
+};
+
+enum TeleportToOptions
+{
+ TELE_TO_GM_MODE = 0x01,
+ TELE_TO_NOT_LEAVE_TRANSPORT = 0x02,
+ TELE_TO_NOT_LEAVE_COMBAT = 0x04,
+ TELE_TO_NOT_UNSUMMON_PET = 0x08,
+ TELE_TO_SPELL = 0x10,
+};
+
+/// Type of environmental damages
+enum EnviromentalDamage
+{
+ DAMAGE_EXHAUSTED = 0,
+ DAMAGE_DROWNING = 1,
+ DAMAGE_FALL = 2,
+ DAMAGE_LAVA = 3,
+ DAMAGE_SLIME = 4,
+ DAMAGE_FIRE = 5,
+ DAMAGE_FALL_TO_VOID = 6 // custom case for fall without durability loss
+};
+
+enum PlayedTimeIndex
+{
+ PLAYED_TIME_TOTAL = 0,
+ PLAYED_TIME_LEVEL = 1
+};
+
+#define MAX_PLAYED_TIME_INDEX 2
+
+// used at player loading query list preparing, and later result selection
+enum PlayerLoginQueryIndex
+{
+ PLAYER_LOGIN_QUERY_LOADFROM = 0,
+ PLAYER_LOGIN_QUERY_LOADGROUP = 1,
+ PLAYER_LOGIN_QUERY_LOADBOUNDINSTANCES = 2,
+ PLAYER_LOGIN_QUERY_LOADAURAS = 3,
+ PLAYER_LOGIN_QUERY_LOADSPELLS = 4,
+ PLAYER_LOGIN_QUERY_LOADQUESTSTATUS = 5,
+ PLAYER_LOGIN_QUERY_LOADDAILYQUESTSTATUS = 6,
+ PLAYER_LOGIN_QUERY_LOADREPUTATION = 7,
+ PLAYER_LOGIN_QUERY_LOADINVENTORY = 8,
+ PLAYER_LOGIN_QUERY_LOADACTIONS = 9,
+ PLAYER_LOGIN_QUERY_LOADMAILCOUNT = 10,
+ PLAYER_LOGIN_QUERY_LOADMAILDATE = 11,
+ PLAYER_LOGIN_QUERY_LOADSOCIALLIST = 12,
+ PLAYER_LOGIN_QUERY_LOADHOMEBIND = 13,
+ PLAYER_LOGIN_QUERY_LOADSPELLCOOLDOWNS = 14,
+ PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES = 15,
+ PLAYER_LOGIN_QUERY_LOADGUILD = 16,
+ PLAYER_LOGIN_QUERY_LOADARENAINFO = 17,
+ PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS = 18,
+ PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS = 19,
+ PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS = 20,
+ PLAYER_LOGIN_QUERY_LOADBGDATA = 21,
+ PLAYER_LOGIN_QUERY_LOADGLYPHS = 22,
+ PLAYER_LOGIN_QUERY_LOADTALENTS = 23,
+ PLAYER_LOGIN_QUERY_LOADACCOUNTDATA = 24,
+ PLAYER_LOGIN_QUERY_LOADSKILLS = 25,
+ MAX_PLAYER_LOGIN_QUERY = 26
+};
+
+enum PlayerDelayedOperations
+{
+ DELAYED_SAVE_PLAYER = 0x01,
+ DELAYED_RESURRECT_PLAYER = 0x02,
+ DELAYED_SPELL_CAST_DESERTER = 0x04,
+ DELAYED_BG_MOUNT_RESTORE = 0x08, ///< Flag to restore mount state after teleport from BG
+ DELAYED_BG_TAXI_RESTORE = 0x10, ///< Flag to restore taxi state after teleport from BG
+ DELAYED_END
+};
+
+// Player summoning auto-decline time (in secs)
+#define MAX_PLAYER_SUMMON_DELAY (2*MINUTE)
+#define MAX_MONEY_AMOUNT (0x7FFFFFFF-1)
+
+struct InstancePlayerBind
+{
+ InstanceSave *save;
+ bool perm;
+ /* permanent PlayerInstanceBinds are created in Raid/Heroic instances for players
+ that aren't already permanently bound when they are inside when a boss is killed
+ or when they enter an instance that the group leader is permanently bound to. */
+ InstancePlayerBind() : save(NULL), perm(false) {}
+};
+
+struct AccessRequirement
+{
+ uint8 levelMin;
+ uint8 levelMax;
+ uint8 heroicLevelMin;
+ uint32 item;
+ uint32 item2;
+ uint32 heroicKey;
+ uint32 heroicKey2;
+ uint32 quest;
+ std::string questFailedText;
+ uint32 heroicQuest;
+ std::string heroicQuestFailedText;
+};
+
+class PlayerTaxi
+{
+ public:
+ PlayerTaxi();
+ ~PlayerTaxi() {}
+ // Nodes
+ void InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint8 level);
+ void LoadTaxiMask(const char* data);
+
+ bool IsTaximaskNodeKnown(uint32 nodeidx) const
+ {
+ uint8 field = uint8((nodeidx - 1) / 32);
+ uint32 submask = 1<<((nodeidx-1)%32);
+ return (m_taximask[field] & submask) == submask;
+ }
+ bool SetTaximaskNode(uint32 nodeidx)
+ {
+ uint8 field = uint8((nodeidx - 1) / 32);
+ uint32 submask = 1<<((nodeidx-1)%32);
+ if ((m_taximask[field] & submask) != submask )
+ {
+ m_taximask[field] |= submask;
+ return true;
+ }
+ else
+ return false;
+ }
+ void AppendTaximaskTo(ByteBuffer& data,bool all);
+
+ // Destinations
+ bool LoadTaxiDestinationsFromString(const std::string& values, uint32 team);
+ std::string SaveTaxiDestinationsToString();
+
+ void ClearTaxiDestinations() { m_TaxiDestinations.clear(); }
+ void AddTaxiDestination(uint32 dest) { m_TaxiDestinations.push_back(dest); }
+ uint32 GetTaxiSource() const { return m_TaxiDestinations.empty() ? 0 : m_TaxiDestinations.front(); }
+ uint32 GetTaxiDestination() const { return m_TaxiDestinations.size() < 2 ? 0 : m_TaxiDestinations[1]; }
+ uint32 GetCurrentTaxiPath() const;
+ uint32 NextTaxiDestination()
+ {
+ m_TaxiDestinations.pop_front();
+ return GetTaxiDestination();
+ }
+ bool empty() const { return m_TaxiDestinations.empty(); }
+
+ friend std::ostringstream& operator<< (std::ostringstream& ss, PlayerTaxi const& taxi);
+ private:
+ TaxiMask m_taximask;
+ std::deque<uint32> m_TaxiDestinations;
+};
+
+std::ostringstream& operator<< (std::ostringstream& ss, PlayerTaxi const& taxi);
+
+class Player;
+
+/// Holder for BattleGround data
+struct BGData
+{
+ BGData() : bgInstanceID(0), bgTypeID(BATTLEGROUND_TYPE_NONE), bgAfkReportedCount(0), bgAfkReportedTimer(0),
+ bgTeam(0), mountSpell(0) { ClearTaxiPath(); }
+
+ uint32 bgInstanceID; ///< This variable is set to bg->m_InstanceID,
+ /// when player is teleported to BG - (it is battleground's GUID)
+ BattleGroundTypeId bgTypeID;
+
+ std::set<uint32> bgAfkReporter;
+ uint8 bgAfkReportedCount;
+ time_t bgAfkReportedTimer;
+
+ uint32 bgTeam; ///< What side the player will be added to
+
+ uint32 mountSpell;
+ uint32 taxiPath[2];
+
+ WorldLocation joinPos; ///< From where player entered BG
+
+ void ClearTaxiPath() { taxiPath[0] = taxiPath[1] = 0; }
+ bool HasTaxiPath() const { return taxiPath[0] && taxiPath[1]; }
+};
+
+class Player : public Unit, public GridObject<Player>
+{
+ friend class WorldSession;
+ friend void Item::AddToUpdateQueueOf(Player *player);
+ friend void Item::RemoveFromUpdateQueueOf(Player *player);
+ public:
+ explicit Player (WorldSession *session);
+ ~Player ( );
+
+ void CleanupsBeforeDelete(bool finalCleanup = true);
+
+ static UpdateMask updateVisualBits;
+ static void InitVisibleBits();
+
+ void AddToWorld();
+ void RemoveFromWorld();
+
+ bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0);
+ void TeleportOutOfMap(Map *oldMap);
+
+ bool TeleportTo(WorldLocation const &loc, uint32 options = 0)
+ {
+ return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options);
+ }
+
+ bool TeleportToBGEntryPoint();
+
+ void SetSummonPoint(uint32 mapid, float x, float y, float z)
+ {
+ m_summon_expire = time(NULL) + MAX_PLAYER_SUMMON_DELAY;
+ m_summon_mapid = mapid;
+ m_summon_x = x;
+ m_summon_y = y;
+ m_summon_z = z;
+ }
+ void SummonIfPossible(bool agree);
+
+ bool Create( uint32 guidlow, const std::string& name, uint8 race, uint8 class_, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair, uint8 outfitId );
+
+ void Update( uint32 time );
+
+ static bool BuildEnumData( QueryResult_AutoPtr result, WorldPacket * p_data );
+
+ void SetInWater(bool apply);
+
+ bool IsInWater() const { return m_isInWater; }
+ bool IsUnderWater() const;
+ bool IsFalling() { return GetPositionZ() < m_lastFallZ; }
+
+ void SendInitialPacketsBeforeAddToMap();
+ void SendInitialPacketsAfterAddToMap();
+ void SendTransferAborted(uint32 mapid, uint8 reason, uint8 arg = 0);
+ void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time);
+
+ Creature* GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask);
+ bool CanInteractWithNPCs(bool alive = true) const;
+ GameObject* GetGameObjectIfCanInteractWith(uint64 guid, GameobjectTypes type) const;
+
+ bool ToggleAFK();
+ bool ToggleDND();
+ bool isAFK() const { return HasFlag(PLAYER_FLAGS,PLAYER_FLAGS_AFK); }
+ bool isDND() const { return HasFlag(PLAYER_FLAGS,PLAYER_FLAGS_DND); }
+ uint8 chatTag() const;
+ std::string afkMsg;
+ std::string dndMsg;
+
+ uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const* newSkin=NULL);
+
+ PlayerSocial *GetSocial() { return m_social; }
+
+ PlayerTaxi m_taxi;
+ void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(), getClass(), getLevel()); }
+ bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc = NULL, uint32 spellid = 0);
+ bool ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid = 0);
+ void CleanupAfterTaxiFlight();
+ void ContinueTaxiFlight();
+ // mount_id can be used in scripting calls
+ bool isAcceptWhispers() const { return m_ExtraFlags & PLAYER_EXTRA_ACCEPT_WHISPERS; }
+ void SetAcceptWhispers(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_ACCEPT_WHISPERS; else m_ExtraFlags &= ~PLAYER_EXTRA_ACCEPT_WHISPERS; }
+ bool isGameMaster() const { return m_ExtraFlags & PLAYER_EXTRA_GM_ON; }
+ void SetGameMaster(bool on);
+ bool isGMChat() const { return GetSession()->GetSecurity() >= SEC_MODERATOR && (m_ExtraFlags & PLAYER_EXTRA_GM_CHAT); }
+ void SetGMChat(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_GM_CHAT; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_CHAT; }
+ bool isTaxiCheater() const { return m_ExtraFlags & PLAYER_EXTRA_TAXICHEAT; }
+ void SetTaxiCheater(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_TAXICHEAT; else m_ExtraFlags &= ~PLAYER_EXTRA_TAXICHEAT; }
+ bool isGMVisible() const { return !(m_ExtraFlags & PLAYER_EXTRA_GM_INVISIBLE); }
+ void SetGMVisible(bool on);
+ void SetPvPDeath(bool on) { if(on) m_ExtraFlags |= PLAYER_EXTRA_PVP_DEATH; else m_ExtraFlags &= ~PLAYER_EXTRA_PVP_DEATH; }
+
+ void GiveXP(uint32 xp, Unit* victim);
+ void GiveLevel(uint8 level);
+
+ void InitStatsForLevel(bool reapplyMods = false);
+
+ // Played Time Stuff
+ time_t m_logintime;
+ time_t m_Last_tick;
+ uint32 m_Played_time[MAX_PLAYED_TIME_INDEX];
+ uint32 GetTotalPlayedTime() { return m_Played_time[PLAYED_TIME_TOTAL]; }
+ uint32 GetLevelPlayedTime() { return m_Played_time[PLAYED_TIME_LEVEL]; }
+
+ void setDeathState(DeathState s); // overwrite Unit::setDeathState
+
+ void InnEnter (int time,uint32 mapid, float x,float y,float z)
+ {
+ inn_pos_mapid = mapid;
+ inn_pos_x = x;
+ inn_pos_y = y;
+ inn_pos_z = z;
+ time_inn_enter = time;
+ }
+
+ float GetRestBonus() const { return m_rest_bonus; }
+ void SetRestBonus(float rest_bonus_new);
+
+ RestType GetRestType() const { return rest_type; }
+ void SetRestType(RestType n_r_type) { rest_type = n_r_type; }
+
+ uint32 GetInnPosMapId() const { return inn_pos_mapid; }
+ float GetInnPosX() const { return inn_pos_x; }
+ float GetInnPosY() const { return inn_pos_y; }
+ float GetInnPosZ() const { return inn_pos_z; }
+
+ int GetTimeInnEnter() const { return time_inn_enter; }
+ void UpdateInnerTime (int time) { time_inn_enter = time; }
+
+ Pet* GetPet() const;
+ Pet* SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 despwtime);
+ void RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent = false);
+ uint32 GetPhaseMaskForSpawn() const; // used for proper set phase for DB at GM-mode creature/GO spawn
+
+ void Say(const std::string& text, const uint32 language);
+ void Yell(const std::string& text, const uint32 language);
+ void TextEmote(const std::string& text);
+ void Whisper(const std::string& text, const uint32 language,uint64 receiver);
+ void BuildPlayerChat(WorldPacket *data, uint8 msgtype, const std::string& text, uint32 language) const;
+
+ /*********************************************************/
+ /*** STORAGE SYSTEM ***/
+ /*********************************************************/
+
+ void SetVirtualItemSlot( uint8 i, Item* item);
+ void SetSheath( SheathState sheathed ); // overwrite Unit version
+ uint8 FindEquipSlot( ItemPrototype const* proto, uint32 slot, bool swap ) const;
+ uint32 GetItemCount( uint32 item, bool inBankAlso = false, Item* skipItem = NULL ) const;
+ Item* GetItemByGuid( uint64 guid ) const;
+ Item* GetItemByEntry( uint32 entry ) const;
+ Item* GetItemByPos( uint16 pos ) const;
+ Item* GetItemByPos( uint8 bag, uint8 slot ) const;
+ inline Item* GetUseableItemByPos( uint8 bag, uint8 slot ) const //Does additional check for disarmed weapons
+ {
+ if (!CanUseAttackType(GetAttackBySlot(slot)))
+ return NULL;
+ return GetItemByPos(bag, slot);
+ }
+ Item* GetWeaponForAttack(WeaponAttackType attackType, bool useable = false) const;
+ Item* GetShield(bool useable = false) const;
+ static uint8 GetAttackBySlot( uint8 slot ); // MAX_ATTACK if not weapon slot
+ std::vector<Item *> &GetItemUpdateQueue() { return m_itemUpdateQueue; }
+ static bool IsInventoryPos( uint16 pos ) { return IsInventoryPos(pos >> 8,pos & 255); }
+ static bool IsInventoryPos( uint8 bag, uint8 slot );
+ static bool IsEquipmentPos( uint16 pos ) { return IsEquipmentPos(pos >> 8,pos & 255); }
+ static bool IsEquipmentPos( uint8 bag, uint8 slot );
+ static bool IsBagPos( uint16 pos );
+ static bool IsBankPos( uint16 pos ) { return IsBankPos(pos >> 8,pos & 255); }
+ static bool IsBankPos( uint8 bag, uint8 slot );
+ bool IsValidPos( uint16 pos ) { return IsBankPos(pos >> 8,pos & 255); }
+ bool IsValidPos( uint8 bag, uint8 slot );
+ uint8 GetBankBagSlotCount() const { return GetByteValue(PLAYER_BYTES_2, 2); }
+ void SetBankBagSlotCount(uint8 count) { SetByteValue(PLAYER_BYTES_2, 2, count); }
+ bool HasItemCount( uint32 item, uint32 count, bool inBankAlso = false ) const;
+ bool HasItemFitToSpellReqirements(SpellEntry const* spellInfo, Item const* ignoreItem = NULL);
+ bool CanNoReagentCast(SpellEntry 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;
+ uint8 CountItemWithLimitCategory(uint32 limitCategory, Item* skipItem = NULL) const;
+ uint8 CanTakeMoreSimilarItems(Item* pItem) const { return _CanTakeMoreSimilarItems(pItem->GetEntry(),pItem->GetCount(),pItem); }
+ uint8 CanTakeMoreSimilarItems(uint32 entry, uint32 count) const { return _CanTakeMoreSimilarItems(entry,count,NULL); }
+ uint8 CanStoreNewItem( uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 item, uint32 count, uint32* no_space_count = NULL ) const
+ {
+ return _CanStoreItem(bag, slot, dest, item, count, NULL, false, no_space_count );
+ }
+ uint8 CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec& dest, Item *pItem, bool swap = false ) const
+ {
+ if(!pItem)
+ return EQUIP_ERR_ITEM_NOT_FOUND;
+ uint32 count = pItem->GetCount();
+ return _CanStoreItem( bag, slot, dest, pItem->GetEntry(), count, pItem, swap, NULL );
+
+ }
+ uint8 CanStoreItems( Item **pItem,int count) const;
+ uint8 CanEquipNewItem( uint8 slot, uint16 &dest, uint32 item, bool swap ) const;
+ uint8 CanEquipItem( uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading = true ) const;
+
+ uint8 CanEquipUniqueItem( Item * pItem, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1 ) const;
+ uint8 CanEquipUniqueItem( ItemPrototype const* itemProto, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1 ) const;
+ uint8 CanUnequipItems( uint32 item, uint32 count ) const;
+ uint8 CanUnequipItem( uint16 src, bool swap ) const;
+ uint8 CanBankItem( uint8 bag, uint8 slot, ItemPosCountVec& dest, Item *pItem, bool swap, bool not_loading = true ) const;
+ uint8 CanUseItem( Item *pItem, bool not_loading = true ) const;
+ bool HasItemTotemCategory( uint32 TotemCategory ) const;
+ bool CanUseItem( ItemPrototype const *pItem );
+ uint8 CanUseAmmo( uint32 item ) const;
+ Item* StoreNewItem( ItemPosCountVec const& pos, uint32 item, bool update,int32 randomPropertyId = 0 );
+ Item* StoreItem( ItemPosCountVec const& pos, Item *pItem, bool update );
+ Item* EquipNewItem( uint16 pos, uint32 item, bool update );
+ Item* EquipItem( 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) { AutoStoreLoot(NULL_BAG,NULL_SLOT,loot_id,store,broadcast); }
+
+ uint8 _CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item* pItem, uint32* no_space_count = NULL) const;
+ uint8 _CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 entry, uint32 count, Item *pItem = NULL, bool swap = false, uint32* no_space_count = NULL ) const;
+
+ void ApplyEquipCooldown( Item * pItem );
+ void SetAmmo( uint32 item );
+ void RemoveAmmo();
+ float GetAmmoDPS() const { return m_ammoDPS; }
+ bool CheckAmmoCompatibility(const ItemPrototype *ammo_proto) const;
+ void QuickEquipItem( uint16 pos, Item *pItem);
+ void VisualizeItem( uint8 slot, Item *pItem);
+ void SetVisibleItemSlot(uint8 slot, Item *pItem);
+ Item* BankItem( ItemPosCountVec const& dest, Item *pItem, bool update )
+ {
+ return StoreItem( dest, pItem, update);
+ }
+ Item* BankItem( uint16 pos, Item *pItem, bool update );
+ void RemoveItem( uint8 bag, uint8 slot, bool update );
+ void MoveItemFromInventory(uint8 bag, uint8 slot, bool update);
+ // in trade, auction, guild bank, mail....
+ void MoveItemToInventory(ItemPosCountVec const& dest, Item* pItem, bool update, bool in_characterInventoryDB = false);
+ // in trade, guild bank, mail....
+ 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 );
+ Item* GetItemFromBuyBackSlot( uint32 slot );
+ void RemoveItemFromBuyBackSlot( uint32 slot, bool del );
+ uint32 GetMaxKeyringSize() const { return KEYRING_SLOT_END-KEYRING_SLOT_START; }
+ void SendEquipError( uint8 msg, Item* pItem, Item *pItem2 );
+ void SendBuyError( uint8 msg, Creature* pCreature, uint32 item, uint32 param );
+ void SendSellError( uint8 msg, Creature* pCreature, uint64 guid, uint32 param );
+ void AddWeaponProficiency(uint32 newflag) { m_WeaponProficiency |= newflag; }
+ void AddArmorProficiency(uint32 newflag) { m_ArmorProficiency |= newflag; }
+ uint32 GetWeaponProficiency() const { return m_WeaponProficiency; }
+ uint32 GetArmorProficiency() const { return m_ArmorProficiency; }
+ bool IsUseEquipedWeapon( bool mainhand ) const
+ {
+ // disarm applied only to mainhand weapon
+ return !IsInFeralForm() && (!mainhand || !HasFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISARMED) );
+ }
+ bool IsTwoHandUsed() const
+ {
+ Item* mainItem = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
+ return mainItem && mainItem->GetProto()->InventoryType == INVTYPE_2HWEAPON && !CanTitanGrip();
+ }
+ void SendNewItem( Item *item, uint32 count, bool received, bool created, bool broadcast = false );
+ bool BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint8 bag, uint8 slot);
+
+ float GetReputationPriceDiscount( Creature const* pCreature ) const;
+ Player* GetTrader() const { return pTrader; }
+ void ClearTrade();
+ void TradeCancel(bool sendback);
+
+ void UpdateEnchantTime(uint32 time);
+ void UpdateItemDuration(uint32 time, bool realtimeonly=false);
+ void AddEnchantmentDurations(Item *item);
+ void RemoveEnchantmentDurations(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 SendEnchantmentDurations();
+ void BuildEnchantmentsInfoData(WorldPacket *data);
+ void AddItemDurations(Item *item);
+ void RemoveItemDurations(Item *item);
+ void SendItemDurations();
+ void LoadCorpse();
+ void LoadPet();
+
+ uint32 m_stableSlots;
+
+ /*********************************************************/
+ /*** GOSSIP SYSTEM ***/
+ /*********************************************************/
+
+ void PrepareGossipMenu(WorldObject *pSource, uint32 menuId = 0);
+ void SendPreparedGossip(WorldObject *pSource);
+ void OnGossipSelect(WorldObject *pSource, uint32 gossipListId, uint32 menuId);
+
+ uint32 GetGossipTextId(uint32 menuId);
+ uint32 GetGossipTextId(WorldObject *pSource);
+ uint32 GetDefaultGossipMenuForSource(WorldObject *pSource);
+
+ /*********************************************************/
+ /*** QUEST SYSTEM ***/
+ /*********************************************************/
+
+ int32 GetQuestLevel( Quest const* pQuest ) const { return pQuest && (pQuest->GetQuestLevel() > 0) ? pQuest->GetQuestLevel() : getLevel(); }
+
+ void PrepareQuestMenu( uint64 guid );
+ void SendPreparedQuest( uint64 guid );
+ bool IsActiveQuest( uint32 quest_id ) const;
+ Quest const *GetNextQuest( uint64 guid, Quest const *pQuest );
+ bool CanSeeStartQuest( Quest const *pQuest );
+ bool CanTakeQuest( Quest const *pQuest, bool msg );
+ bool CanAddQuest( Quest const *pQuest, bool msg );
+ bool CanCompleteQuest( uint32 quest_id );
+ bool CanCompleteRepeatableQuest(Quest const *pQuest);
+ bool CanRewardQuest( Quest const *pQuest, bool msg );
+ bool CanRewardQuest( Quest const *pQuest, uint32 reward, bool msg );
+ void AddQuest( Quest const *pQuest, Object *questGiver );
+ void CompleteQuest( uint32 quest_id );
+ void IncompleteQuest( uint32 quest_id );
+ void RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver, bool announce = true );
+ void FailQuest( uint32 quest_id );
+ bool SatisfyQuestSkillOrClass( Quest const* qInfo, bool msg );
+ bool SatisfyQuestLevel( Quest const* qInfo, bool msg );
+ bool SatisfyQuestLog( bool msg );
+ bool SatisfyQuestPreviousQuest( Quest const* qInfo, bool msg );
+ bool SatisfyQuestRace( Quest const* qInfo, bool msg );
+ bool SatisfyQuestReputation( Quest const* qInfo, bool msg );
+ bool SatisfyQuestStatus( Quest const* qInfo, bool msg );
+ bool SatisfyQuestTimed( Quest const* qInfo, bool msg );
+ bool SatisfyQuestExclusiveGroup( Quest const* qInfo, bool msg );
+ bool SatisfyQuestNextChain( Quest const* qInfo, bool msg );
+ bool SatisfyQuestPrevChain( Quest const* qInfo, bool msg );
+ bool SatisfyQuestDay( Quest const* qInfo, bool msg );
+ bool GiveQuestSourceItem( Quest const *pQuest );
+ bool TakeQuestSourceItem( uint32 quest_id, bool msg );
+ bool GetQuestRewardStatus( uint32 quest_id ) const;
+ QuestStatus GetQuestStatus( uint32 quest_id ) const;
+ void SetQuestStatus( uint32 quest_id, QuestStatus status );
+
+ void SetDailyQuestStatus( uint32 quest_id );
+ void ResetDailyQuestStatus();
+
+ uint16 FindQuestSlot( uint32 quest_id ) const;
+ uint32 GetQuestSlotQuestId(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_ID_OFFSET); }
+ uint32 GetQuestSlotState(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_STATE_OFFSET); }
+ uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const { return (uint16)(GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET) >> (counter * 16)); }
+ uint32 GetQuestSlotTime(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_TIME_OFFSET); }
+ void SetQuestSlot(uint16 slot, uint32 quest_id, uint32 timer = 0)
+ {
+ SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_ID_OFFSET, quest_id);
+ SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_STATE_OFFSET, 0);
+ SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET, 0);
+ SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET + 1, 0);
+ SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_TIME_OFFSET, timer);
+ }
+ void SetQuestSlotCounter(uint16 slot, uint8 counter, uint16 count)
+ {
+ uint64 val = GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET);
+ val &= ~((uint64)0xFFFF << (counter * 16));
+ val |= ((uint64)count << (counter * 16));
+ SetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET, val);
+ }
+ void SetQuestSlotState(uint16 slot, uint32 state) { SetFlag(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_STATE_OFFSET, state); }
+ void RemoveQuestSlotState(uint16 slot, uint32 state) { RemoveFlag(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_STATE_OFFSET, state); }
+ void SetQuestSlotTimer(uint16 slot, uint32 timer) { SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_TIME_OFFSET, timer); }
+ void SwapQuestSlot(uint16 slot1, uint16 slot2)
+ {
+ for (int i = 0; i < MAX_QUEST_OFFSET; ++i)
+ {
+ uint32 temp1 = GetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET * slot1 + i);
+ uint32 temp2 = GetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET * slot2 + i);
+
+ SetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET * slot1 + i, temp2);
+ SetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET * slot2 + i, temp1);
+ }
+ }
+ uint32 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( CreatureInfo const* cInfo, uint64 guid );
+ void KilledMonsterCredit( uint32 entry, uint64 guid );
+ void CastedCreatureOrGO( uint32 entry, uint64 guid, uint32 spell_id );
+ void TalkedToCreature( uint32 entry, uint64 guid );
+ void MoneyChanged( uint32 value );
+ void ReputationChanged(FactionEntry const* factionEntry );
+ void ReputationChanged2(FactionEntry const* factionEntry );
+ bool HasQuestForItem( uint32 itemid ) const;
+ bool HasQuestForGO(int32 GOId) const;
+ void UpdateForQuestWorldObjects();
+ bool CanShareQuest(uint32 quest_id) const;
+
+ void SendQuestComplete( uint32 quest_id );
+ void SendQuestReward( Quest const *pQuest, uint32 XP, Object* questGiver );
+ void SendQuestFailed( uint32 quest_id );
+ void SendQuestTimerFailed( uint32 quest_id );
+ void SendCanTakeQuestResponse( uint32 msg );
+ void SendQuestConfirmAccept(Quest const* pQuest, Player* pReceiver);
+ void SendPushToPartyResponse( Player *pPlayer, uint32 msg );
+ void SendQuestUpdateAddItem( Quest const* pQuest, uint32 item_idx, uint32 count );
+ void SendQuestUpdateAddCreatureOrGo( Quest const* pQuest, uint64 guid, uint32 creatureOrGO_idx, uint32 old_count, uint32 add_count );
+
+ uint64 GetDivider() { return m_divider; }
+ void SetDivider( uint64 guid ) { m_divider = guid; }
+
+ uint32 GetInGameTime() { return m_ingametime; }
+
+ void SetInGameTime( uint32 time ) { m_ingametime = time; }
+
+ void AddTimedQuest( uint32 quest_id ) { m_timedquests.insert(quest_id); }
+ void RemoveTimedQuest( uint32 quest_id ) { m_timedquests.erase(quest_id); }
+
+ /*********************************************************/
+ /*** LOAD SYSTEM ***/
+ /*********************************************************/
+
+ bool LoadFromDB(uint32 guid, SqlQueryHolder *holder);
+ bool isBeingLoaded() const { return GetSession()->PlayerLoading();}
+
+ bool MinimalLoadFromDB(QueryResult_AutoPtr result, uint32 guid);
+ static bool LoadValuesArrayFromDB(Tokens& data,uint64 guid);
+ static uint32 GetUInt32ValueFromArray(Tokens const& data, uint16 index);
+ static float GetFloatValueFromArray(Tokens const& data, uint16 index);
+ static uint32 GetUInt32ValueFromDB(uint16 index, uint64 guid);
+ static float GetFloatValueFromDB(uint16 index, uint64 guid);
+ static uint32 GetZoneIdFromDB(uint64 guid);
+ static uint32 GetLevelFromDB(uint64 guid);
+ static bool LoadPositionFromDB(uint32& mapid, float& x,float& y,float& z,float& o, bool& in_flight, uint64 guid);
+
+ /*********************************************************/
+ /*** SAVE SYSTEM ***/
+ /*********************************************************/
+
+ void SaveToDB();
+ void SaveInventoryAndGoldToDB(); // fast save function for item/money cheating preventing
+ void SaveGoldToDB();
+ void SaveDataFieldToDB();
+ static bool SaveValuesArrayInDB(Tokens const& data,uint64 guid);
+ static void SetUInt32ValueInArray(Tokens& data,uint16 index, uint32 value);
+ static void SetFloatValueInArray(Tokens& data,uint16 index, float value);
+ static void SetUInt32ValueInDB(uint16 index, uint32 value, uint64 guid);
+ static void SetFloatValueInDB(uint16 index, float value, uint64 guid);
+ static void Customize(uint64 guid, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair);
+ static void SavePositionInDB(uint32 mapid, float x,float y,float z,float o,uint32 zone,uint64 guid);
+
+ bool m_mailsLoaded;
+ bool m_mailsUpdated;
+
+ void SetBindPoint(uint64 guid);
+ void SendTalentWipeConfirm(uint64 guid);
+ void SendPetSkillWipeConfirm();
+ void CalcRage( uint32 damage,bool attacker );
+ void RegenerateAll();
+ void Regenerate(Powers power);
+ void RegenerateHealth();
+ void setRegenTimerCount(uint32 time) {m_regenTimerCount = time;}
+ void setWeaponChangeTimer(uint32 time) {m_weaponChangeTimer = time;}
+
+ uint32 GetMoney() { return GetUInt32Value (PLAYER_FIELD_COINAGE); }
+ void ModifyMoney( int32 d )
+ {
+ d = GetSession()->HandleOnGetMoney(d);
+ if(d < 0)
+ SetMoney (GetMoney() > uint32(-d) ? GetMoney() + d : 0);
+ else
+ SetMoney (GetMoney() < uint32(MAX_MONEY_AMOUNT - d) ? GetMoney() + d : MAX_MONEY_AMOUNT);
+
+ // "At Gold Limit"
+ if(GetMoney() >= MAX_MONEY_AMOUNT)
+ SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD,NULL,NULL);
+ }
+ void SetMoney( uint32 value )
+ {
+ SetUInt32Value (PLAYER_FIELD_COINAGE, value);
+ MoneyChanged( value );
+ UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED);
+ }
+
+ QuestStatusMap& getQuestStatusMap() { return mQuestStatus; };
+
+ const uint64& GetSelection( ) const { return m_curSelection; }
+ Unit *GetSelectedUnit() const;
+ Player *GetSelectedPlayer() const;
+ void SetSelection(const uint64 &guid) { m_curSelection = guid; SetUInt64Value(UNIT_FIELD_TARGET, guid); }
+
+ uint8 GetComboPoints() { return m_comboPoints; }
+ const uint64& GetComboTarget() const { return m_comboTarget; }
+
+ void AddComboPoints(Unit* target, int8 count, Spell * spell = NULL);
+ void GainSpellComboPoints(int8 count);
+ void ClearComboPoints();
+ void SendComboPoints();
+
+ void SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError = 0, uint32 item_guid = 0, uint32 item_count = 0);
+ void SendNewMail();
+ void UpdateNextMailTimeAndUnreads();
+ void AddNewMailDeliverTime(time_t deliver_time);
+ bool IsMailsLoaded() const { return m_mailsLoaded; }
+
+ void RemoveMail(uint32 id);
+
+ void AddMail(Mail* mail) { m_mail.push_front(mail);}// for call from WorldSession::SendMailTo
+ uint32 GetMailSize() { return m_mail.size();}
+ Mail* GetMail(uint32 id);
+
+ PlayerMails::iterator GetMailBegin() { return m_mail.begin();}
+ PlayerMails::iterator GetMailEnd() { return m_mail.end();}
+
+ /*********************************************************/
+ /*** MAILED ITEMS SYSTEM ***/
+ /*********************************************************/
+
+ uint8 unReadMails;
+ time_t m_nextMailDelivereTime;
+
+ typedef UNORDERED_MAP<uint32, Item*> ItemMap;
+
+ ItemMap mMitems; //template defined in objectmgr.cpp
+
+ Item* GetMItem(uint32 id)
+ {
+ ItemMap::const_iterator itr = mMitems.find(id);
+ return itr != mMitems.end() ? itr->second : NULL;
+ }
+
+ void AddMItem(Item* it)
+ {
+ ASSERT( it );
+ //assert deleted, because items can be added before loading
+ mMitems[it->GetGUIDLow()] = it;
+ }
+
+ bool RemoveMItem(uint32 id)
+ {
+ return mMitems.erase(id) ? true : false;
+ }
+
+ void PetSpellInitialize();
+ void CharmSpellInitialize();
+ void PossessSpellInitialize();
+ void VehicleSpellInitialize();
+ void SendRemoveControlBar();
+ bool HasSpell(uint32 spell) const;
+ bool HasActiveSpell(uint32 spell) const; // show in spellbook
+ TrainerSpellState GetTrainerSpellState(TrainerSpell const* trainer_spell) const;
+ bool IsSpellFitByClassAndRace( uint32 spell_id ) const;
+ bool IsNeedCastPassiveSpellAtLearn(SpellEntry const* spellInfo) const;
+
+ void SendProficiency(uint8 pr1, uint32 pr2);
+ void SendInitialSpells();
+ bool addSpell(uint32 spell_id, bool active, bool learning, bool dependent, bool disabled);
+ void learnSpell(uint32 spell_id, bool dependent);
+ void removeSpell(uint32 spell_id, bool disabled = false, bool learn_low_rank = true);
+ void resetSpells(bool myClassOnly = false);
+ void learnDefaultSpells();
+ void learnQuestRewardedSpells();
+ void learnQuestRewardedSpells(Quest const* quest);
+ void learnSpellHighRank(uint32 spellid);
+ void AddTemporarySpell(uint32 spellId);
+ void RemoveTemporarySpell(uint32 spellId);
+ void SetReputation(uint32 factionentry, uint32 value);
+ uint32 GetReputation(uint32 factionentry);
+ std::string GetGuildName();
+ uint32 GetFreeTalentPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS1); }
+ void SetFreeTalentPoints(uint32 points) { SetUInt32Value(PLAYER_CHARACTER_POINTS1,points); }
+ bool resetTalents(bool no_cost = false);
+ uint32 resetTalentsCost() const;
+ void InitTalentForLevel();
+ void BuildPlayerTalentsInfoData(WorldPacket *data);
+ void BuildPetTalentsInfoData(WorldPacket *data);
+ void SendTalentsInfoData(bool pet);
+ void LearnTalent(uint32 talentId, uint32 talentRank);
+ void LearnPetTalent(uint64 petGuid, uint32 talentId, uint32 talentRank);
+
+ bool AddTalent(uint32 spell, uint8 spec, bool learning);
+ bool HasTalent(uint32 spell_id, uint8 spec) const;
+
+ uint32 CalculateTalentsPoints() const;
+
+ // Dual Spec
+ void UpdateSpecCount(uint8 count);
+ uint32 GetActiveSpec() { return m_activeSpec; }
+ void SetActiveSpec(uint8 spec){ m_activeSpec = spec; }
+ uint8 GetSpecsCount() { return m_specsCount; }
+ void SetSpecsCount(uint8 count) { m_specsCount = count; }
+ void ActivateSpec(uint8 spec);
+
+ void InitGlyphsForLevel();
+ void SetGlyphSlot(uint8 slot, uint32 slottype) { SetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot, slottype); }
+ uint32 GetGlyphSlot(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot); }
+ void SetGlyph(uint8 slot, uint32 glyph)
+ {
+ m_Glyphs[m_activeSpec][slot] = glyph;
+ SetUInt32Value(PLAYER_FIELD_GLYPHS_1 + slot, glyph);
+ }
+ uint32 GetGlyph(uint8 slot) { return m_Glyphs[m_activeSpec][slot]; }
+
+ uint32 GetFreePrimaryProfessionPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS2); }
+ void SetFreePrimaryProfessions(uint16 profs) { SetUInt32Value(PLAYER_CHARACTER_POINTS2, profs); }
+ void InitPrimaryProfessions();
+
+ PlayerSpellMap const& GetSpellMap() const { return m_spells; }
+ PlayerSpellMap & GetSpellMap() { return m_spells; }
+
+ SpellCooldowns const& GetSpellCooldownMap() const { return m_spellCooldowns; }
+
+ void AddSpellMod(SpellModifier* mod, bool apply);
+ bool IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mod, Spell * spell = NULL);
+ template <class T> T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell * spell = NULL);
+ void RemoveSpellMods(Spell * spell);
+ void RestoreSpellMods(Spell * spell);
+ void DropModCharge(SpellModifier * mod, Spell * spell);
+ void SetSpellModTakingSpell(Spell* spell, bool apply);
+
+ static uint32 const infinityCooldownDelay = MONTH; // used for set "infinity cooldowns" for spells and check
+ static uint32 const infinityCooldownDelayCheck = MONTH/2;
+ bool HasSpellCooldown(uint32 spell_id) const
+ {
+ SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
+ return itr != m_spellCooldowns.end() && itr->second.end > time(NULL);
+ }
+ uint32 GetSpellCooldownDelay(uint32 spell_id) const
+ {
+ SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
+ time_t t = time(NULL);
+ return itr != m_spellCooldowns.end() && itr->second.end > t ? itr->second.end - t : 0;
+ }
+ void AddSpellAndCategoryCooldowns(SpellEntry const* spellInfo, uint32 itemId, Spell* spell = NULL, bool infinityCooldown = false );
+ void AddSpellCooldown(uint32 spell_id, uint32 itemid, time_t end_time);
+ void SendCooldownEvent(SpellEntry const *spellInfo, uint32 itemId = 0, Spell* spell = NULL);
+ void ProhibitSpellScholl(SpellSchoolMask idSchoolMask, uint32 unTimeMs );
+ void RemoveSpellCooldown(uint32 spell_id, bool update = false);
+ void RemoveSpellCategoryCooldown(uint32 cat, bool update = false);
+ void SendClearCooldown( uint32 spell_id, Unit* target );
+
+ void RemoveCategoryCooldown(uint32 cat);
+ void RemoveArenaSpellCooldowns();
+ void RemoveAllSpellCooldown();
+ void _LoadSpellCooldowns(QueryResult_AutoPtr result);
+ void _SaveSpellCooldowns();
+ void SetLastPotionId(uint32 item_id) { m_lastPotionId = item_id; }
+ void UpdatePotionCooldown(Spell* spell = NULL);
+
+ void setResurrectRequestData(uint64 guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
+ {
+ m_resurrectGUID = guid;
+ m_resurrectMap = mapId;
+ m_resurrectX = X;
+ m_resurrectY = Y;
+ m_resurrectZ = Z;
+ m_resurrectHealth = health;
+ m_resurrectMana = mana;
+ }
+ void clearResurrectRequestData() { setResurrectRequestData(0,0,0.0f,0.0f,0.0f,0,0); }
+ bool isRessurectRequestedBy(uint64 guid) const { return m_resurrectGUID == guid; }
+ bool isRessurectRequested() const { return m_resurrectGUID != 0; }
+ void ResurectUsingRequestData();
+
+ int getCinematic()
+ {
+ return m_cinematic;
+ }
+ void setCinematic(int cine)
+ {
+ m_cinematic = cine;
+ }
+
+ ActionButton* addActionButton(uint8 button, uint32 action, uint8 type);
+ void removeActionButton(uint8 button);
+ void SendInitialActionButtons() const { SendActionButtons(0); }
+ void SendActionButtons(uint32 state) const;
+
+ PvPInfo pvpInfo;
+ void UpdatePvPState(bool onlyFFA = false);
+ void SetPvP(bool state)
+ {
+ Unit::SetPvP(state);
+ for (ControlList::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
+ (*itr)->SetPvP(state);
+ }
+ void UpdatePvP(bool state, bool override=false);
+ void UpdateZone(uint32 newZone,uint32 newArea);
+ void UpdateArea(uint32 newArea);
+
+ void UpdateZoneDependentAuras( uint32 zone_id ); // zones
+ void UpdateAreaDependentAuras( uint32 area_id ); // subzones
+
+ void UpdateAfkReport(time_t currTime);
+ void UpdatePvPFlag(time_t currTime);
+ void UpdateContestedPvP(uint32 currTime);
+ void SetContestedPvPTimer(uint32 newTime) {m_contestedPvPTimer = newTime;}
+ void ResetContestedPvP()
+ {
+ clearUnitState(UNIT_STAT_ATTACK_PLAYER);
+ RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_CONTESTED_PVP);
+ m_contestedPvPTimer = 0;
+ }
+
+ /** todo: -maybe move UpdateDuelFlag+DuelComplete to independent DuelHandler.. **/
+ DuelInfo *duel;
+ void UpdateDuelFlag(time_t currTime);
+ void CheckDuelDistance(time_t currTime);
+ void DuelComplete(DuelCompleteType type);
+ void SendDuelCountdown(uint32 counter);
+
+ bool IsGroupVisibleFor(Player* p) const;
+ bool IsInSameGroupWith(Player const* p) const;
+ bool IsInSameRaidWith(Player const* p) const { return p==this || (GetGroup() != NULL && GetGroup() == p->GetGroup()); }
+ void UninviteFromGroup();
+ static void RemoveFromGroup(Group* group, uint64 guid);
+ void RemoveFromGroup() { RemoveFromGroup(GetGroup(),GetGUID()); }
+ void SendUpdateToOutOfRangeGroupMembers();
+
+ void SetInGuild(uint32 GuildId) { SetUInt32Value(PLAYER_GUILDID, GuildId); }
+ void SetRank(uint32 rankId){ SetUInt32Value(PLAYER_GUILDRANK, rankId); }
+ void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; }
+ uint32 GetGuildId() { return GetUInt32Value(PLAYER_GUILDID); }
+ static uint32 GetGuildIdFromDB(uint64 guid);
+ uint32 GetRank(){ return GetUInt32Value(PLAYER_GUILDRANK); }
+ static uint32 GetRankFromDB(uint64 guid);
+ int GetGuildIdInvited() { return m_GuildIdInvited; }
+ static void RemovePetitionsAndSigns(uint64 guid, uint32 type);
+
+ // Arena Team
+ void SetInArenaTeam(uint32 ArenaTeamId, uint8 slot, uint8 type)
+ {
+ SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + ARENA_TEAM_ID, ArenaTeamId);
+ SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + ARENA_TEAM_TYPE, type);
+ }
+ uint32 GetArenaTeamId(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END)); }
+ static uint32 GetArenaTeamIdFromDB(uint64 guid, uint8 slot);
+ void SetArenaTeamIdInvited(uint32 ArenaTeamId) { m_ArenaTeamIdInvited = ArenaTeamId; }
+ uint32 GetArenaTeamIdInvited() { return m_ArenaTeamIdInvited; }
+ static void LeaveAllArenaTeams(uint64 guid);
+
+ Difficulty GetDifficulty(bool isRaid) const { return isRaid ? m_raidDifficulty : m_dungeonDifficulty; }
+ Difficulty GetDungeonDifficulty() const { return m_dungeonDifficulty; }
+ Difficulty GetRaidDifficulty() const { return m_raidDifficulty; }
+ void SetDungeonDifficulty(Difficulty dungeon_difficulty) { m_dungeonDifficulty = dungeon_difficulty; }
+ void SetRaidDifficulty(Difficulty raid_difficulty) { m_raidDifficulty = raid_difficulty; }
+
+ 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 { return GetBaseSkillValue(SKILL_DEFENSE); }
+ uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const;
+
+ uint32 GetSpellByProto(ItemPrototype *proto);
+
+ float GetHealthBonusFromStamina();
+ float GetManaBonusFromIntellect();
+
+ bool UpdateStats(Stats stat);
+ bool UpdateAllStats();
+ void UpdateResistances(uint32 school);
+ void UpdateArmor();
+ void UpdateMaxHealth();
+ void UpdateMaxPower(Powers power);
+ void ApplyFeralAPBonus(int32 amount, bool apply);
+ void UpdateAttackPowerAndDamage(bool ranged = false);
+ void UpdateShieldBlockValue();
+ void UpdateDamagePhysical(WeaponAttackType attType);
+ 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& min_damage, float& max_damage);
+
+ void UpdateDefenseBonusesMod();
+ inline void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);}
+ float GetMeleeCritFromAgility();
+ float GetDodgeFromAgility();
+ float GetSpellCritFromIntellect();
+ float OCTRegenHPPerSpirit();
+ float OCTRegenMPPerSpirit();
+ float GetRatingCoefficient(CombatRating cr) const;
+ float GetRatingBonusValue(CombatRating cr) const;
+ uint32 GetBaseSpellPowerBonus() { return m_baseSpellPower; }
+
+ 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();
+
+ const uint64& GetLootGUID() const { return m_lootGuid; }
+ void SetLootGUID(const uint64 &guid) { m_lootGuid = guid; }
+
+ void RemovedInsignia(Player* looterPlr);
+
+ WorldSession* GetSession() const { return m_session; }
+ void SetSession(WorldSession *s) { m_session = s; }
+
+ void BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target ) const;
+ void DestroyForPlayer( Player *target, bool anim = false ) const;
+ void SendLogXPGain(uint32 GivenXP,Unit* victim,uint32 RestXP);
+
+ // notifiers
+ 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);
+ void ResetInstances(uint8 method, bool isRaid);
+ void SendResetInstanceSuccess(uint32 MapId);
+ void SendResetInstanceFailed(uint32 reason, uint32 MapId);
+ void SendResetFailedNotify(uint32 mapid);
+
+ virtual bool SetPosition(float x, float y, float z, float orientation, bool teleport = false);
+ bool SetPosition(const Position &pos, bool teleport = false) { return SetPosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); }
+ void UpdateUnderwaterState( Map * m, float x, float y, float z );
+
+ void SendMessageToSet(WorldPacket *data, bool self);// overwrite Object::SendMessageToSet
+ void SendMessageToSetInRange(WorldPacket *data, float fist, bool self);// overwrite Object::SendMessageToSetInRange
+ void SendMessageToSetInRange(WorldPacket *data, float dist, bool self, bool own_team_only);
+
+ void SendTeleportAckMsg();
+
+ static void DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmChars = true);
+
+ Corpse *GetCorpse() const;
+ void SpawnCorpseBones();
+ void CreateCorpse();
+ bool FallGround(uint8 FallMode = 0);
+ void KillPlayer();
+ uint32 GetResurrectionSpellId();
+ void ResurrectPlayer(float restore_percent, bool applySickness = false);
+ void BuildPlayerRepop();
+ void RepopAtGraveyard();
+
+ 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()
+ {
+ StopMirrorTimer(FATIGUE_TIMER);
+ StopMirrorTimer(BREATH_TIMER);
+ StopMirrorTimer(FIRE_TIMER);
+ }
+
+ void SetMovement(PlayerMovementType pType);
+
+ void JoinedChannel(Channel *c);
+ void LeftChannel(Channel *c);
+ void CleanupChannels();
+ void UpdateLocalChannels( uint32 newZone );
+ void LeaveLFGChannel();
+
+ void UpdateDefense();
+ void UpdateWeaponSkill (WeaponAttackType attType);
+ void UpdateCombatSkills(Unit *pVictim, WeaponAttackType attType, bool defence);
+
+ void SetSkill(uint32 id, uint16 currVal, uint16 maxVal);
+ uint16 GetMaxSkillValue(uint32 skill) const; // max + perm. bonus + temp bonus
+ uint16 GetPureMaxSkillValue(uint32 skill) const; // max
+ uint16 GetSkillValue(uint32 skill) const; // skill value + perm. bonus + temp bonus
+ uint16 GetBaseSkillValue(uint32 skill) const; // skill value + perm. bonus
+ uint16 GetPureSkillValue(uint32 skill) const; // skill value
+ int16 GetSkillPermBonusValue(uint32 skill) const;
+ int16 GetSkillTempBonusValue(uint32 skill) const;
+ bool HasSkill(uint32 skill) const;
+ void learnSkillRewardedSpells(uint32 id, uint32 value);
+
+ WorldLocation& GetTeleportDest() { return m_teleport_dest; }
+ bool IsBeingTeleported() const { return mSemaphoreTeleport_Near || mSemaphoreTeleport_Far; }
+ bool IsBeingTeleportedNear() const { return mSemaphoreTeleport_Near; }
+ bool IsBeingTeleportedFar() const { return mSemaphoreTeleport_Far; }
+ void SetSemaphoreTeleportNear(bool semphsetting) { mSemaphoreTeleport_Near = semphsetting; }
+ void SetSemaphoreTeleportFar(bool semphsetting) { mSemaphoreTeleport_Far = semphsetting; }
+ void ProcessDelayedOperations();
+
+ void CheckExploreSystem(void);
+
+ static uint32 TeamForRace(uint8 race);
+ uint32 GetTeam() const { return m_team; }
+ TeamId GetTeamId() const { return m_team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; }
+ static uint32 getFactionForRace(uint8 race);
+ void setFactionForRace(uint8 race);
+
+ void InitDisplayIds();
+
+ bool IsAtGroupRewardDistance(WorldObject const* pRewardSource) const;
+ bool RewardPlayerAndGroupAtKill(Unit* pVictim);
+ void RewardPlayerAndGroupAtEvent(uint32 creature_id,WorldObject* pRewardSource);
+ bool isHonorOrXPTarget(Unit* pVictim);
+
+ ReputationMgr& GetReputationMgr() { return m_reputationMgr; }
+ ReputationMgr const& GetReputationMgr() const { return m_reputationMgr; }
+ ReputationRank GetReputationRank(uint32 faction_id) const;
+ void RewardReputation(Unit *pVictim, float rate);
+ void RewardReputation(Quest const *pQuest);
+
+ void UpdateSkillsForLevel();
+ void UpdateSkillsToMaxSkillsForLevel(); // for .levelup
+ void ModifySkillBonus(uint32 skillid,int32 val, bool talent);
+
+ /*********************************************************/
+ /*** PVP SYSTEM ***/
+ /*********************************************************/
+ void UpdateHonorFields();
+ bool RewardHonor(Unit *pVictim, uint32 groupsize, float honor = -1, bool pvptoken = false);
+ uint32 GetHonorPoints() { return GetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY); }
+ uint32 GetArenaPoints() { return GetUInt32Value(PLAYER_FIELD_ARENA_CURRENCY); }
+ void ModifyHonorPoints( int32 value );
+ void ModifyArenaPoints( int32 value );
+ uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot);
+
+ //End of PvP System
+
+ inline SpellCooldowns GetSpellCooldowns() const { return m_spellCooldowns; }
+
+ void SetDrunkValue(uint16 newDrunkValue, uint32 itemid=0);
+ uint16 GetDrunkValue() const { return m_drunk; }
+ static DrunkenState GetDrunkenstateByValue(uint16 value);
+
+ uint32 GetDeathTimer() const { return m_deathTimer; }
+ uint32 GetCorpseReclaimDelay(bool pvp) const;
+ void UpdateCorpseReclaimDelay();
+ void SendCorpseReclaimDelay(bool load = false);
+
+ uint32 GetShieldBlockValue() const; // overwrite Unit version (virtual)
+ bool CanParry() const { return m_canParry; }
+ void SetCanParry(bool value);
+ bool CanBlock() const { return m_canBlock; }
+ void SetCanBlock(bool value);
+ bool CanTitanGrip() const { return m_canTitanGrip; }
+ void SetCanTitanGrip(bool value) { m_canTitanGrip = value; }
+ bool CanTameExoticPets() const { return isGameMaster() || HasAuraType(SPELL_AURA_ALLOW_TAME_PET_TYPE); }
+
+ void SetRegularAttackTime();
+ void SetBaseModValue(BaseModGroup modGroup, BaseModType modType, float value) { m_auraBaseMod[modGroup][modType] = 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 { return m_auraBaseMod[modGroup][FLAT_MOD] + m_auraBaseMod[modGroup][PCT_MOD]; }
+ void _ApplyAllStatBonuses();
+ void _RemoveAllStatBonuses();
+
+ 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(ItemPrototype const *proto,uint8 slot,bool apply, bool only_level_scale = false);
+ 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(SpellEntry 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, ItemPrototype const * proto);
+
+ void SendEquipmentSetList();
+ void SetEquipmentSet(uint32 index, EquipmentSet eqset);
+ void DeleteEquipmentSet(uint64 setGuid);
+
+ void SendInitWorldStates(uint32 zone, uint32 area);
+ void SendUpdateWorldState(uint32 Field, uint32 Value);
+ void SendDirectMessage(WorldPacket *data);
+
+ void SendAurasForTarget(Unit *target);
+
+ PlayerMenu* PlayerTalkClass;
+ std::vector<ItemSetEffect *> ItemSetEff;
+
+ void SendLoot(uint64 guid, LootType loot_type);
+ void SendLootRelease( uint64 guid );
+ void SendNotifyLootItemRemoved(uint8 lootSlot);
+ void SendNotifyLootMoneyRemoved();
+
+ /*********************************************************/
+ /*** BATTLEGROUND SYSTEM ***/
+ /*********************************************************/
+
+ bool InBattleGround() const { return m_bgData.bgInstanceID != 0; }
+ bool InArena() const;
+ uint32 GetBattleGroundId() const { return m_bgData.bgInstanceID; }
+ BattleGroundTypeId GetBattleGroundTypeId() const { return m_bgData.bgTypeID; }
+ BattleGround* GetBattleGround() const;
+
+ bool InBattleGroundQueue() const
+ {
+ for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId != BATTLEGROUND_QUEUE_NONE)
+ return true;
+ return false;
+ }
+
+ BattleGroundQueueTypeId GetBattleGroundQueueTypeId(uint32 index) const { return m_bgBattleGroundQueueID[index].bgQueueTypeId; }
+ uint32 GetBattleGroundQueueIndex(BattleGroundQueueTypeId bgQueueTypeId) const
+ {
+ for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
+ return i;
+ return PLAYER_MAX_BATTLEGROUND_QUEUES;
+ }
+ bool IsInvitedForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId) const
+ {
+ for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
+ return m_bgBattleGroundQueueID[i].invitedToInstance != 0;
+ return false;
+ }
+ bool InBattleGroundQueueForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId) const
+ {
+ return GetBattleGroundQueueIndex(bgQueueTypeId) < PLAYER_MAX_BATTLEGROUND_QUEUES;
+ }
+
+ void SetBattleGroundId(uint32 val, BattleGroundTypeId bgTypeId)
+ {
+ m_bgData.bgInstanceID = val;
+ m_bgData.bgTypeID = bgTypeId;
+ }
+ uint32 AddBattleGroundQueueId(BattleGroundQueueTypeId val)
+ {
+ for (uint8 i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
+ {
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE || m_bgBattleGroundQueueID[i].bgQueueTypeId == val)
+ {
+ m_bgBattleGroundQueueID[i].bgQueueTypeId = val;
+ m_bgBattleGroundQueueID[i].invitedToInstance = 0;
+ return i;
+ }
+ }
+ return PLAYER_MAX_BATTLEGROUND_QUEUES;
+ }
+ bool HasFreeBattleGroundQueueId()
+ {
+ for (uint8 i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE)
+ return true;
+ return false;
+ }
+ void RemoveBattleGroundQueueId(BattleGroundQueueTypeId val)
+ {
+ for (uint8 i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
+ {
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId == val)
+ {
+ m_bgBattleGroundQueueID[i].bgQueueTypeId = BATTLEGROUND_QUEUE_NONE;
+ m_bgBattleGroundQueueID[i].invitedToInstance = 0;
+ return;
+ }
+ }
+ }
+ void SetInviteForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId, uint32 instanceId)
+ {
+ for (uint8 i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
+ if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
+ m_bgBattleGroundQueueID[i].invitedToInstance = instanceId;
+ }
+ bool IsInvitedForBattleGroundInstance(uint32 instanceId) const
+ {
+ for (uint8 i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
+ if (m_bgBattleGroundQueueID[i].invitedToInstance == instanceId)
+ return true;
+ return false;
+ }
+ WorldLocation const& GetBattleGroundEntryPoint() const { return m_bgData.joinPos; }
+ void SetBattleGroundEntryPoint();
+
+ void SetBGTeam(uint32 team) { m_bgData.bgTeam = team; }
+ uint32 GetBGTeam() const { return m_bgData.bgTeam ? m_bgData.bgTeam : GetTeam(); }
+
+ void LeaveBattleground(bool teleportToEntryPoint = true);
+ bool CanJoinToBattleground() const;
+ bool CanReportAfkDueToLimit();
+ void ReportedAfkBy(Player* reporter);
+ void ClearAfkReports() { m_bgData.bgAfkReporter.clear(); }
+
+ bool GetBGAccessByLevel(BattleGroundTypeId bgTypeId) const;
+ bool isTotalImmunity();
+ bool CanUseBattleGroundObject();
+ bool isTotalImmune();
+ bool CanCaptureTowerPoint();
+
+ /*********************************************************/
+ /*** OUTDOOR PVP SYSTEM ***/
+ /*********************************************************/
+
+ OutdoorPvP * GetOutdoorPvP() const;
+ // returns true if the player is in active state for outdoor pvp objective capturing, false otherwise
+ bool IsOutdoorPvPActive();
+
+ /*********************************************************/
+ /*** REST SYSTEM ***/
+ /*********************************************************/
+
+ bool isRested() const { return GetRestTime() >= 10*IN_MILISECONDS; }
+ uint32 GetXPRestBonus(uint32 xp);
+ uint32 GetRestTime() const { return m_restTime;}
+ void SetRestTime(uint32 v) { m_restTime = v;}
+
+ /*********************************************************/
+ /*** ENVIROMENTAL SYSTEM ***/
+ /*********************************************************/
+
+ uint32 EnvironmentalDamage(EnviromentalDamage type, uint32 damage);
+
+ /*********************************************************/
+ /*** FLOOD FILTER SYSTEM ***/
+ /*********************************************************/
+
+ void UpdateSpeakTime();
+ bool CanSpeak() const;
+ void ChangeSpeakTime(int utime);
+
+ /*********************************************************/
+ /*** VARIOUS SYSTEMS ***/
+ /*********************************************************/
+ void UpdateFallInformationIfNeed(MovementInfo const& minfo,uint16 opcode);
+ Unit *m_mover;
+ WorldObject *m_seer;
+ void SetFallInformation(uint32 time, float z)
+ {
+ m_lastFallTime = time;
+ m_lastFallZ = z;
+ }
+ void HandleFall(MovementInfo const& movementInfo);
+
+ bool IsKnowHowFlyIn(uint32 mapid, uint32 zone) const;
+
+ void SetClientControl(Unit* target, uint8 allowMove);
+
+ void SetMover(Unit* target)
+ {
+ m_mover->m_movedPlayer = NULL;
+ m_mover = target;
+ m_mover->m_movedPlayer = this;
+ }
+ void SetSeer(WorldObject *target) { m_seer = target; }
+ void SetViewpoint(WorldObject *target, bool apply);
+ WorldObject* GetViewpoint() const;
+ void StopCastingCharm();
+ void StopCastingBindSight();
+
+ uint32 GetSaveTimer() const { return m_nextSave; }
+ void SetSaveTimer(uint32 timer) { m_nextSave = timer; }
+
+ // Recall position
+ uint32 m_recallMap;
+ float m_recallX;
+ float m_recallY;
+ float m_recallZ;
+ float m_recallO;
+ void SaveRecallPosition();
+
+ // Homebind coordinates
+ uint32 m_homebindMapId;
+ uint16 m_homebindZoneId;
+ float m_homebindX;
+ float m_homebindY;
+ float m_homebindZ;
+
+ WorldLocation GetStartPosition() const;
+
+ // currently visible objects at player client
+ typedef std::set<uint64> ClientGUIDs;
+ ClientGUIDs m_clientGUIDs;
+
+ bool HaveAtClient(WorldObject const* u) const { return u==this || m_clientGUIDs.find(u->GetGUID())!=m_clientGUIDs.end(); }
+
+ bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList = false, bool is3dDistance = true) const;
+ bool IsVisibleInGridForPlayer(Player const* pl) const;
+ bool IsVisibleGloballyFor(Player* pl) const;
+
+ void UpdateVisibilityOf(WorldObject* target);
+ void SendInitialVisiblePackets(Unit* target);
+
+ template<class T>
+ void UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& visibleNow);
+
+ // Stealth detection system
+ void HandleStealthedUnitsDetection();
+
+ uint8 m_forced_speed_changes[MAX_MOVE_TYPE];
+
+ bool HasAtLoginFlag(AtLoginFlags f) const { return m_atLoginFlags & f; }
+ void SetAtLoginFlag(AtLoginFlags f) { m_atLoginFlags |= f; }
+ void RemoveAtLoginFlag(AtLoginFlags f, bool in_db_also = false);
+
+ LookingForGroup m_lookingForGroup;
+
+ // Temporarily removed pet cache
+ uint32 GetTemporaryUnsummonedPetNumber() const { return m_temporaryUnsummonedPetNumber; }
+ void SetTemporaryUnsummonedPetNumber(uint32 petnumber) { m_temporaryUnsummonedPetNumber = petnumber; }
+ void UnsummonPetTemporaryIfAny();
+ void ResummonPetTemporaryUnSummonedIfAny();
+ bool IsPetNeedBeTemporaryUnsummoned() const { return !IsInWorld() || !isAlive() || IsMounted() /*+in flight*/; }
+
+ void SendCinematicStart(uint32 CinematicSequenceId);
+ void SendMovieStart(uint32 MovieId);
+
+ /*********************************************************/
+ /*** INSTANCE SYSTEM ***/
+ /*********************************************************/
+
+ typedef UNORDERED_MAP< uint32 /*mapId*/, InstancePlayerBind > BoundInstancesMap;
+
+ void UpdateHomebindTime(uint32 time);
+
+ uint32 m_HomebindTimer;
+ bool m_InstanceValid;
+ // permanent binds and solo binds by difficulty
+ BoundInstancesMap m_boundInstances[MAX_DIFFICULTY];
+ InstancePlayerBind* GetBoundInstance(uint32 mapid, Difficulty difficulty);
+ BoundInstancesMap& GetBoundInstances(Difficulty difficulty) { return m_boundInstances[difficulty]; }
+ InstanceSave * GetInstanceSave(uint32 mapid, bool raid);
+ void UnbindInstance(uint32 mapid, Difficulty difficulty, bool unload = false);
+ void UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficulty, bool unload = false);
+ InstancePlayerBind* BindToInstance(InstanceSave *save, bool permanent, bool load = false);
+ void SendRaidInfo();
+ void SendSavedInstances();
+ static void ConvertInstancesToGroup(Player *player, Group *group = NULL, uint64 player_guid = 0);
+ bool Satisfy(AccessRequirement const*, uint32 target_map, bool report = false);
+
+ // last used pet number (for BG's)
+ uint32 GetLastPetNumber() const { return m_lastpetnumber; }
+ void SetLastPetNumber(uint32 petnumber) { m_lastpetnumber = petnumber; }
+
+ /*********************************************************/
+ /*** GROUP SYSTEM ***/
+ /*********************************************************/
+
+ Group * GetGroupInvite() { return m_groupInvite; }
+ void SetGroupInvite(Group *group) { m_groupInvite = group; }
+ Group * GetGroup() { return m_group.getTarget(); }
+ const Group * GetGroup() const { return (const Group*)m_group.getTarget(); }
+ GroupReference& GetGroupRef() { return m_group; }
+ void SetGroup(Group *group, int8 subgroup = -1);
+ uint8 GetSubGroup() const { return m_group.getSubGroup(); }
+ uint32 GetGroupUpdateFlag() const { return m_groupUpdateMask; }
+ void SetGroupUpdateFlag(uint32 flag) { m_groupUpdateMask |= flag; }
+ const uint64& GetAuraUpdateMaskForRaid() const { return m_auraRaidUpdateMask; }
+ void SetAuraUpdateMaskForRaid(uint8 slot) { m_auraRaidUpdateMask |= (uint64(1) << slot); }
+ Player* GetNextRandomRaidMember(float radius);
+ PartyResult CanUninviteFromGroup() const;
+ // BattleGround Group System
+ void SetBattleGroundRaid(Group *group, int8 subgroup = -1);
+ void RemoveFromBattleGroundRaid();
+ Group * GetOriginalGroup() { return m_originalGroup.getTarget(); }
+ GroupReference& GetOriginalGroupRef() { return m_originalGroup; }
+ uint8 GetOriginalSubGroup() const { return m_originalGroup.getSubGroup(); }
+ void SetOriginalGroup(Group *group, int8 subgroup = -1);
+
+ MapReference &GetMapRef() { return m_mapRef; }
+
+ // Set map to player and add reference
+ void SetMap(Map * map);
+ void ResetMap();
+
+ bool isAllowedToLoot(Creature* creature);
+
+ DeclinedName const* GetDeclinedNames() const { return m_declinedname; }
+ uint8 GetRunesState() const { return m_runes->runeState; }
+ RuneType GetBaseRune(uint8 index) const { return RuneType(m_runes->runes[index].BaseRune); }
+ RuneType GetCurrentRune(uint8 index) const { return RuneType(m_runes->runes[index].CurrentRune); }
+ uint32 GetRuneCooldown(uint8 index) const { return m_runes->runes[index].Cooldown; }
+ uint32 GetRuneBaseCooldown(uint8 index);
+ bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const;
+ RuneType GetLastUsedRune() { return m_runes->lastUsedRune; }
+ void SetLastUsedRune(RuneType type) { m_runes->lastUsedRune = type; }
+ void SetBaseRune(uint8 index, RuneType baseRune) { m_runes->runes[index].BaseRune = baseRune; }
+ void SetCurrentRune(uint8 index, RuneType currentRune) { m_runes->runes[index].CurrentRune = currentRune; }
+ void SetRuneCooldown(uint8 index, uint32 cooldown) { m_runes->runes[index].Cooldown = cooldown; m_runes->SetRuneState(index, (cooldown == 0) ? true : false); }
+ void SetRuneConvertAura(uint8 index, AuraEffect const * aura) { m_runes->runes[index].ConvertAura = aura; }
+ void AddRuneByAuraEffect(uint8 index, RuneType newType, AuraEffect const * aura) { SetRuneConvertAura(index, aura); ConvertRune(index, newType); }
+ 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();
+
+ AchievementMgr& GetAchievementMgr() { return m_achievementMgr; }
+ void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1 = 0, uint32 miscvalue2 = 0, Unit *unit = NULL, uint32 time = 0);
+ void CompletedAchievement(AchievementEntry const* entry);
+
+ bool HasTitle(uint32 bitIndex);
+ bool HasTitle(CharTitlesEntry const* title) { return HasTitle(title->bit_index); }
+ void SetTitle(CharTitlesEntry const* title, bool lost = false);
+
+ //bool isActiveObject() const { return true; }
+ bool canSeeSpellClickOn(Creature const* creature) const;
+ uint32 GetActionButtonSpell(uint8 button) const
+ {
+ ActionButtonList::const_iterator ab = m_actionButtons.find(button);
+ return ab != m_actionButtons.end() && ab->second.uState != ACTIONBUTTON_DELETED && ab->second.GetType() == ACTION_BUTTON_SPELL ? ab->second.GetAction() : 0;
+ }
+
+ uint32 GetChampioningFaction() const { return m_ChampioningFaction; }
+ void SetChampioningFaction(uint32 faction) { m_ChampioningFaction = faction; }
+Spell * m_spellModTakingSpell;
+ protected:
+ uint32 m_AreaID;
+ uint32 m_regenTimerCount;
+ float m_powerFraction[MAX_POWERS];
+ uint32 m_contestedPvPTimer;
+
+ /*********************************************************/
+ /*** BATTLEGROUND SYSTEM ***/
+ /*********************************************************/
+
+ /*
+ this is an array of BG queues (BgTypeIDs) in which is player
+ */
+ struct BgBattleGroundQueueID_Rec
+ {
+ BattleGroundQueueTypeId bgQueueTypeId;
+ uint32 invitedToInstance;
+ };
+
+ BgBattleGroundQueueID_Rec m_bgBattleGroundQueueID[PLAYER_MAX_BATTLEGROUND_QUEUES];
+ BGData m_bgData;
+
+ /*********************************************************/
+ /*** QUEST SYSTEM ***/
+ /*********************************************************/
+
+ //We allow only one timed quest active at the same time. Below can then be simple value instead of set.
+ std::set<uint32> m_timedquests;
+
+ uint64 m_divider;
+ uint32 m_ingametime;
+
+ /*********************************************************/
+ /*** LOAD SYSTEM ***/
+ /*********************************************************/
+
+ void _LoadActions(QueryResult_AutoPtr result, bool startup);
+ void _LoadAuras(QueryResult_AutoPtr result, uint32 timediff);
+ void _LoadGlyphAuras();
+ void _LoadBoundInstances(QueryResult_AutoPtr result);
+ void _LoadInventory(QueryResult_AutoPtr result, uint32 timediff);
+ void _LoadMailInit(QueryResult_AutoPtr resultUnread, QueryResult_AutoPtr resultDelivery);
+ void _LoadMail();
+ void _LoadMailedItems(Mail *mail);
+ void _LoadQuestStatus(QueryResult_AutoPtr result);
+ void _LoadDailyQuestStatus(QueryResult_AutoPtr result);
+ void _LoadGroup(QueryResult_AutoPtr result);
+ void _LoadSkills(QueryResult_AutoPtr result);
+ void _LoadSpells(QueryResult_AutoPtr result);
+ void _LoadFriendList(QueryResult_AutoPtr result);
+ bool _LoadHomeBind(QueryResult_AutoPtr result);
+ void _LoadDeclinedNames(QueryResult_AutoPtr result);
+ void _LoadArenaTeamInfo(QueryResult_AutoPtr result);
+ void _LoadEquipmentSets(QueryResult_AutoPtr result);
+ void _LoadBGData(QueryResult_AutoPtr result);
+ void _LoadGlyphs(QueryResult_AutoPtr result);
+ void _LoadTalents(QueryResult_AutoPtr result);
+
+ /*********************************************************/
+ /*** SAVE SYSTEM ***/
+ /*********************************************************/
+
+ void _SaveActions();
+ void _SaveAuras();
+ void _SaveInventory();
+ void _SaveMail();
+ void _SaveQuestStatus();
+ void _SaveDailyQuestStatus();
+ void _SaveSkills();
+ void _SaveSpells();
+ void _SaveEquipmentSets();
+ void _SaveBGData();
+ void _SaveGlyphs();
+ void _SaveTalents();
+
+ void _SetCreateBits(UpdateMask *updateMask, Player *target) const;
+ void _SetUpdateBits(UpdateMask *updateMask, Player *target) const;
+
+ /*********************************************************/
+ /*** ENVIRONMENTAL SYSTEM ***/
+ /*********************************************************/
+ void HandleSobering();
+ void SendMirrorTimer(MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen);
+ void StopMirrorTimer(MirrorTimerType Type);
+ void HandleDrowning(uint32 time_diff);
+ int32 getMaxTimer(MirrorTimerType timer);
+
+ /*********************************************************/
+ /*** HONOR SYSTEM ***/
+ /*********************************************************/
+ time_t m_lastHonorUpdateTime;
+
+ void outDebugValues() const;
+ uint64 m_lootGuid;
+
+ uint32 m_team;
+ uint32 m_nextSave;
+ time_t m_speakTime;
+ uint32 m_speakCount;
+ Difficulty m_dungeonDifficulty;
+ Difficulty m_raidDifficulty;
+
+ uint32 m_atLoginFlags;
+
+ Item* m_items[PLAYER_SLOTS_COUNT];
+ uint32 m_currentBuybackSlot;
+
+ std::vector<Item*> m_itemUpdateQueue;
+ bool m_itemUpdateQueueBlocked;
+
+ uint32 m_ExtraFlags;
+ uint64 m_curSelection;
+
+ uint64 m_comboTarget;
+ int8 m_comboPoints;
+
+ QuestStatusMap mQuestStatus;
+
+ SkillStatusMap mSkillStatus;
+
+ uint32 m_GuildIdInvited;
+ uint32 m_ArenaTeamIdInvited;
+
+ PlayerMails m_mail;
+ PlayerSpellMap m_spells;
+ PlayerTalentMap *m_talents[MAX_TALENT_SPECS];
+ uint32 m_lastPotionId; // last used health/mana potion in combat, that block next potion use
+
+ 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];
+ int16 m_baseRatingValue[MAX_COMBAT_RATING];
+ uint16 m_baseSpellPower;
+ uint16 m_baseFeralAP;
+ uint16 m_baseManaRegen;
+ uint16 m_baseHealthRegen;
+
+ SpellModList m_spellMods[MAX_SPELLMOD];
+ //uint32 m_pad;
+// Spell * m_spellModTakingSpell; // Spell for which charges are dropped in spell::finish
+
+ EnchantDurationList m_enchantDuration;
+ ItemDurationList m_itemDuration;
+
+ void ResetTimeSync();
+ void SendTimeSync();
+
+ uint64 m_resurrectGUID;
+ uint32 m_resurrectMap;
+ float m_resurrectX, m_resurrectY, m_resurrectZ;
+ uint32 m_resurrectHealth, m_resurrectMana;
+
+ WorldSession *m_session;
+
+ typedef std::list<Channel*> JoinedChannelsList;
+ JoinedChannelsList m_channels;
+
+ int m_cinematic;
+
+ Player *pTrader;
+ bool acceptTrade;
+ uint64 tradeItems[TRADE_SLOT_COUNT];
+ uint32 tradeGold;
+
+ bool m_DailyQuestChanged;
+ time_t m_lastDailyQuestTime;
+
+ uint32 m_drunkTimer;
+ uint16 m_drunk;
+ uint32 m_weaponChangeTimer;
+
+ uint32 m_zoneUpdateId;
+ uint32 m_zoneUpdateTimer;
+ uint32 m_areaUpdateId;
+
+ uint32 m_deathTimer;
+ time_t m_deathExpireTime;
+
+ uint32 m_restTime;
+
+ uint32 m_WeaponProficiency;
+ uint32 m_ArmorProficiency;
+ bool m_canParry;
+ bool m_canBlock;
+ bool m_canTitanGrip;
+ uint8 m_swingErrorMsg;
+ float m_ammoDPS;
+
+ ////////////////////Rest System/////////////////////
+ int time_inn_enter;
+ uint32 inn_pos_mapid;
+ float inn_pos_x;
+ float inn_pos_y;
+ float inn_pos_z;
+ float m_rest_bonus;
+ RestType rest_type;
+ ////////////////////Rest System/////////////////////
+ uint32 m_resetTalentsCost;
+ time_t m_resetTalentsTime;
+ uint32 m_usedTalentCount;
+ uint32 m_questRewardTalentCount;
+
+ // Social
+ PlayerSocial *m_social;
+
+ // Groups
+ GroupReference m_group;
+ GroupReference m_originalGroup;
+ Group *m_groupInvite;
+ uint32 m_groupUpdateMask;
+ uint64 m_auraRaidUpdateMask;
+
+ // last used pet number (for BG's)
+ uint32 m_lastpetnumber;
+
+ // Player summoning
+ time_t m_summon_expire;
+ uint32 m_summon_mapid;
+ float m_summon_x;
+ float m_summon_y;
+ float m_summon_z;
+
+ DeclinedName *m_declinedname;
+ Runes *m_runes;
+ EquipmentSets m_EquipmentSets;
+ private:
+ // internal common parts for CanStore/StoreItem functions
+ uint8 _CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountVec& dest, ItemPrototype const *pProto, uint32& count, bool swap, Item *pSrcItem ) const;
+ uint8 _CanStoreItem_InBag( uint8 bag, ItemPosCountVec& dest, ItemPrototype const *pProto, uint32& count, bool merge, bool non_specialized, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot ) const;
+ uint8 _CanStoreItem_InInventorySlots( uint8 slot_begin, uint8 slot_end, ItemPosCountVec& dest, ItemPrototype 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 );
+
+ void UpdateKnownCurrencies(uint32 itemId, bool apply);
+ int32 CalculateReputationGain(uint32 creatureOrQuestLevel, int32 rep, int32 faction, bool for_quest);
+ void AdjustQuestReqItemCount( Quest const* pQuest, QuestStatusData& questStatusData );
+
+ bool IsCanDelayTeleport() const { return m_bCanDelayTeleport; }
+ void SetCanDelayTeleport(bool setting) { m_bCanDelayTeleport = setting; }
+ bool IsHasDelayedTeleport() const { return m_bHasDelayedTeleport; }
+ void SetDelayedTeleportFlag(bool setting) { m_bHasDelayedTeleport = setting; }
+
+ void ScheduleDelayedOperation(uint32 operation)
+ {
+ if(operation < DELAYED_END)
+ m_DelayedOperations |= operation;
+ }
+
+ MapReference m_mapRef;
+
+ void UpdateCharmedAI();
+ UnitAI *i_AI;
+
+ uint32 m_lastFallTime;
+ float m_lastFallZ;
+
+ int32 m_MirrorTimer[MAX_TIMERS];
+ uint8 m_MirrorTimerFlags;
+ uint8 m_MirrorTimerFlagsLast;
+ bool m_isInWater;
+
+ // Current teleport data
+ WorldLocation m_teleport_dest;
+ uint32 m_teleport_options;
+ bool mSemaphoreTeleport_Near;
+ bool mSemaphoreTeleport_Far;
+
+ uint32 m_DelayedOperations;
+ bool m_bCanDelayTeleport;
+ bool m_bHasDelayedTeleport;
+
+ uint32 m_DetectInvTimer;
+
+ // Temporary removed pet cache
+ uint32 m_temporaryUnsummonedPetNumber;
+ uint32 m_oldpetspell;
+
+ AchievementMgr m_achievementMgr;
+ ReputationMgr m_reputationMgr;
+
+ SpellCooldowns m_spellCooldowns;
+
+ uint32 m_ChampioningFaction;
+
+ uint32 m_timeSyncCount;
+ uint32 m_timeSyncTimer;
+};
+
+void AddItemsSetItem(Player*player,Item *item);
+void RemoveItemsSetItem(Player*player,ItemPrototype const *proto);
+
+// "the bodies of template functions must be made available in a header file"
+template <class T> T Player::ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell * spell)
+{
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId);
+ if (!spellInfo) return 0;
+ float totalmul = 1.0f;
+ int32 totalflat = 0;
+
+ // Drop charges for triggering spells instead of triggered ones
+ if (m_spellModTakingSpell)
+ spell = m_spellModTakingSpell;
+
+ for (SpellModList::iterator itr = m_spellMods[op].begin(); itr != m_spellMods[op].end(); ++itr)
+ {
+ SpellModifier *mod = *itr;
+
+ // Charges can be set only for mods with auras
+ if (!mod->ownerAura)
+ assert(mod->charges == 0);
+
+ if(!IsAffectedBySpellmod(spellInfo,mod,spell))
+ continue;
+
+ if (mod->type == SPELLMOD_FLAT)
+ totalflat += mod->value;
+ else if (mod->type == SPELLMOD_PCT)
+ {
+ // skip percent mods for null basevalue (most important for spell mods with charges )
+ if(basevalue == T(0))
+ continue;
+
+ // special case (skip >10sec spell casts for instant cast setting)
+ if( mod->op==SPELLMOD_CASTING_TIME && basevalue >= T(10000) && mod->value <= -100)
+ continue;
+
+ totalmul *= 1.0f + (float)mod->value / 100.0f;
+ }
+
+ DropModCharge(mod, spell);
+ }
+ float diff = (float)basevalue * (totalmul - 1.0f) + (float)totalflat;
+ basevalue = T((float)basevalue + diff);
+ return T(diff);
+}
+#endif
|