diff options
Diffstat (limited to 'src/game/Pet.h')
-rw-r--r-- | src/game/Pet.h | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/src/game/Pet.h b/src/game/Pet.h new file mode 100644 index 00000000000..f7866cbe0fc --- /dev/null +++ b/src/game/Pet.h @@ -0,0 +1,245 @@ +/* + * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.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 MANGOSSERVER_PET_H +#define MANGOSSERVER_PET_H + +#include "ObjectDefines.h" +#include "Creature.h" +#include "Unit.h" + +enum PetType +{ + SUMMON_PET = 0, + HUNTER_PET = 1, + GUARDIAN_PET = 2, + MINI_PET = 3, + MAX_PET_TYPE = 4 +}; + +extern char const* petTypeSuffix[MAX_PET_TYPE]; + +enum PetSaveMode +{ + PET_SAVE_AS_DELETED =-1, + PET_SAVE_AS_CURRENT = 0, + PET_SAVE_IN_STABLE_SLOT_1 = 1, + PET_SAVE_IN_STABLE_SLOT_2 = 2, + PET_SAVE_NOT_IN_SLOT = 3 +}; + +enum HappinessState +{ + UNHAPPY = 1, + CONTENT = 2, + HAPPY = 3 +}; + +enum LoyaltyLevel +{ + REBELLIOUS = 1, + UNRULY = 2, + SUBMISSIVE = 3, + DEPENDABLE = 4, + FAITHFUL = 5, + BEST_FRIEND = 6 +}; + +enum PetSpellState +{ + PETSPELL_UNCHANGED = 0, + PETSPELL_CHANGED = 1, + PETSPELL_NEW = 2, + PETSPELL_REMOVED = 3 +}; + +enum PetSpellType +{ + PETSPELL_NORMAL = 0, + PETSPELL_FAMILY = 1, +}; + +struct PetSpell +{ + uint16 slotId; + uint16 active; + PetSpellState state : 16; + PetSpellType type : 16; +}; + +enum ActionFeedback +{ + FEEDBACK_NONE = 0, + FEEDBACK_PET_DEAD = 1, + FEEDBACK_NOTHING_TO_ATT = 2, + FEEDBACK_CANT_ATT_TARGET = 3 +}; + +enum PetTalk +{ + PET_TALK_SPECIAL_SPELL = 0, + PET_TALK_ATTACK = 1 +}; + +typedef HM_NAMESPACE::hash_map<uint16, PetSpell*> PetSpellMap; +typedef std::map<uint32,uint32> TeachSpellMap; +typedef std::vector<uint32> AutoSpellList; + +#define HAPPINESS_LEVEL_SIZE 333000 + +extern const uint32 LevelUpLoyalty[6]; +extern const uint32 LevelStartLoyalty[6]; + +#define ACTIVE_SPELLS_MAX 4 + +#define OWNER_MAX_DISTANCE 100 + +#define PET_FOLLOW_DIST 1 +#define PET_FOLLOW_ANGLE (M_PI/2) + +class Pet : public Creature +{ + public: + explicit Pet(PetType type = MAX_PET_TYPE); + virtual ~Pet(); + + void AddToWorld(); + void RemoveFromWorld(); + + PetType getPetType() const { return m_petType; } + void setPetType(PetType type) { m_petType = type; } + bool isControlled() const { return getPetType()==SUMMON_PET || getPetType()==HUNTER_PET; } + bool isTemporarySummoned() const { return m_duration > 0; } + + bool Create (uint32 guidlow, Map *map, uint32 Entry, uint32 pet_number); + bool CreateBaseAtCreature( Creature* creature ); + bool LoadPetFromDB( Unit* owner,uint32 petentry = 0,uint32 petnumber = 0, bool current = false ); + void SavePetToDB(PetSaveMode mode); + void Remove(PetSaveMode mode, bool returnreagent = false); + static void DeleteFromDB(uint32 guidlow); + + void setDeathState(DeathState s); // overwrite virtual Creature::setDeathState and Unit::setDeathState + void Update(uint32 diff); // overwrite virtual Creature::Update and Unit::Update + + uint8 GetPetAutoSpellSize() const { return m_autospells.size(); } + uint32 GetPetAutoSpellOnPos(uint8 pos) const + { + if (pos >= m_autospells.size()) + return 0; + else + return m_autospells[pos]; + } + + void RegenerateFocus(); + void LooseHappiness(); + void TickLoyaltyChange(); + void ModifyLoyalty(int32 addvalue); + HappinessState GetHappinessState(); + uint32 GetMaxLoyaltyPoints(uint32 level); + uint32 GetStartLoyaltyPoints(uint32 level); + void KillLoyaltyBonus(uint32 level); + uint32 GetLoyaltyLevel() { return GetByteValue(UNIT_FIELD_BYTES_1, 1); } + void SetLoyaltyLevel(LoyaltyLevel level); + void GivePetXP(uint32 xp); + void GivePetLevel(uint32 level); + bool InitStatsForLevel(uint32 level); + bool HaveInDiet(ItemPrototype const* item) const; + uint32 GetCurrentFoodBenefitLevel(uint32 itemlevel); + void SetDuration(int32 dur) { m_duration = dur; } + + int32 GetBonusDamage() { return m_bonusdamage; } + void SetBonusDamage(int32 damage) { m_bonusdamage = damage; } + + bool UpdateStats(Stats stat); + bool UpdateAllStats(); + void UpdateResistances(uint32 school); + void UpdateArmor(); + void UpdateMaxHealth(); + void UpdateMaxPower(Powers power); + void UpdateAttackPowerAndDamage(bool ranged = false); + void UpdateDamagePhysical(WeaponAttackType attType); + + bool CanTakeMoreActiveSpells(uint32 SpellIconID); + void ToggleAutocast(uint32 spellid, bool apply); + bool HasTPForSpell(uint32 spellid); + int32 GetTPForSpell(uint32 spellid); + + bool HasSpell(uint32 spell) const; + void AddTeachSpell(uint32 learned_id, uint32 source_id) { m_teachspells[learned_id] = source_id; } + + void LearnPetPassives(); + void CastPetAuras(bool current); + void CastPetAura(PetAura const* aura); + + void _LoadSpellCooldowns(); + void _SaveSpellCooldowns(); + void _LoadAuras(uint32 timediff); + void _SaveAuras(); + void _LoadSpells(); + void _SaveSpells(); + + bool addSpell(uint16 spell_id,uint16 active = ACT_DECIDE, PetSpellState state = PETSPELL_NEW, uint16 slot_id=0xffff, PetSpellType type = PETSPELL_NORMAL); + bool learnSpell(uint16 spell_id); + void removeSpell(uint16 spell_id); + bool _removeSpell(uint16 spell_id); + + PetSpellMap m_spells; + TeachSpellMap m_teachspells; + AutoSpellList m_autospells; + + void InitPetCreateSpells(); + void CheckLearning(uint32 spellid); + uint32 resetTalentsCost() const; + + void SetTP(int32 TP); + int32 GetDispTP(); + + int32 m_TrainingPoints; + uint32 m_resetTalentsCost; + time_t m_resetTalentsTime; + + uint64 GetAuraUpdateMask() { return m_auraUpdateMask; } + void SetAuraUpdateMask(uint8 slot) { m_auraUpdateMask |= (uint64(1) << slot); } + void ResetAuraUpdateMask() { m_auraUpdateMask = 0; } + + DeclinedName const* GetDeclinedNames() const { return m_declinedname; } + + bool m_removed; // prevent overwrite pet state in DB at next Pet::Update if pet already removed(saved) + protected: + uint32 m_regenTimer; + uint32 m_happinessTimer; + uint32 m_loyaltyTimer; + PetType m_petType; + int32 m_duration; // time until unsummon (used mostly for summoned guardians and not used for controlled pets) + int32 m_loyaltyPoints; + int32 m_bonusdamage; + uint64 m_auraUpdateMask; + + DeclinedName *m_declinedname; + + private: + void SaveToDB(uint32, uint8) // overwrited of Creature::SaveToDB - don't must be called + { + assert(false); + } + void DeleteFromDB() // overwrited of Creature::DeleteFromDB - don't must be called + { + assert(false); + } +}; +#endif |