diff options
| author | Meji <alvaromegias_46@hotmail.com> | 2021-10-03 21:20:45 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-03 21:20:45 +0200 |
| commit | 0cfd14d2a0a52ceb0d8203c31c7c6c487775bcee (patch) | |
| tree | c131dfb62ba3bde90a9bb05c93ae5a2813f62190 /src/server/game/Entities | |
| parent | b1c0d069e1eba2f7b43ada8032b954bff630b68d (diff) | |
Core/BattlePets: Misc fixes (#26990)
* Define BattlePetBreedQuality enum class.
* Check the quality of the battle pet species in battle_pet_quality table to avoid invalid values.
* Set CurrentBattlePetBreedQuality and WildBattlePetLevel update fields with the data of the summoned battle pet.
* Added function to calculate the WildBattlePetLevel of wild battle pets according to their spawn zone.
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 16 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 3 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 9 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 32 |
5 files changed, 46 insertions, 15 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 162fd6fc1f0..ef6c5385fda 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1620,6 +1620,20 @@ void Creature::UpdateLevelDependantStats() SetStatFlatModifier(UNIT_MOD_ARMOR, BASE_VALUE, armor); } +void Creature::SelectWildBattlePetLevel() +{ + if (IsWildBattlePet()) + { + uint8 wildBattlePetLevel = WILD_BATTLE_PET_DEFAULT_LEVEL; + + if (AreaTableEntry const* areaTable = sAreaTableStore.LookupEntry(GetZoneId())) + if (areaTable->WildBattlePetLevelMin > 0) + wildBattlePetLevel = urand(areaTable->WildBattlePetLevelMin, areaTable->WildBattlePetLevelMax); + + SetWildBattlePetLevel(wildBattlePetLevel); + } +} + float Creature::_GetHealthMod(int32 Rank) { switch (Rank) // define rates for each elite rank @@ -1804,6 +1818,8 @@ bool Creature::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap, SetSpawnHealth(); + SelectWildBattlePetLevel(); + // checked at creature_template loading m_defaultMovementType = MovementGeneratorType(data->movementType); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index cab9b45e783..2aa3fa395c3 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -54,6 +54,8 @@ typedef std::list<VendorItemCount> VendorItemCounts; #define MAX_VENDOR_ITEMS 150 // Limitation in 4.x.x item count in SMSG_LIST_INVENTORY +static constexpr uint8 WILD_BATTLE_PET_DEFAULT_LEVEL = 1; + //used for handling non-repeatable random texts typedef std::vector<uint8> CreatureTextRepeatIds; typedef std::unordered_map<uint8, CreatureTextRepeatIds> CreatureTextRepeatGroup; @@ -81,6 +83,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool LoadCreaturesAddon(); void SelectLevel(); void UpdateLevelDependantStats(); + void SelectWildBattlePetLevel(); void LoadEquipment(int8 id = 1, bool force = false); void SetSpawnHealth(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 17818b4c33c..99660ed918c 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2622,6 +2622,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void SetArenaFaction(uint8 arenaFaction) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::ArenaFaction), arenaFaction); } void ApplyModFakeInebriation(int32 mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::FakeInebriation), mod, apply); } void SetVirtualPlayerRealm(uint32 virtualRealmAddress) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::VirtualPlayerRealm), virtualRealmAddress); } + void SetCurrentBattlePetBreedQuality(uint8 battlePetBreedQuality) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::CurrentBattlePetBreedQuality), battlePetBreedQuality); } void AddHeirloom(int32 itemId, uint32 flags) { diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e86156cc3bf..86db8294fcb 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -22,6 +22,7 @@ #include "Battleground.h" #include "BattlegroundPackets.h" #include "BattlegroundScore.h" +#include "BattlePetMgr.h" #include "CellImpl.h" #include "CharacterCache.h" #include "ChatPackets.h" @@ -5823,7 +5824,13 @@ void Unit::SetMinion(Minion *minion, bool apply) { SetCritterGUID(minion->GetGUID()); if (Player const* thisPlayer = ToPlayer()) - minion->SetBattlePetCompanionGUID(thisPlayer->m_activePlayerData->SummonedBattlePetGUID); + { + if (BattlePetMgr::BattlePet const* pet = thisPlayer->GetSession()->GetBattlePetMgr()->GetPet(thisPlayer->m_activePlayerData->SummonedBattlePetGUID)) + { + minion->SetBattlePetCompanionGUID(thisPlayer->m_activePlayerData->SummonedBattlePetGUID); + minion->SetWildBattlePetLevel(pet->PacketInfo.Level); + } + } } // PvP, FFAPvP diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 67746b97bc9..810f1de1413 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1065,20 +1065,21 @@ class TC_GAME_API Unit : public WorldObject void AddNpcFlag2(NPCFlags2 flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags, 1), flags); } void RemoveNpcFlag2(NPCFlags2 flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags, 1), flags); } void SetNpcFlags2(NPCFlags2 flags) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::NpcFlags, 1), flags); } - bool IsVendor() const { return HasNpcFlag(UNIT_NPC_FLAG_VENDOR); } - bool IsTrainer() const { return HasNpcFlag(UNIT_NPC_FLAG_TRAINER); } - bool IsQuestGiver() const { return HasNpcFlag(UNIT_NPC_FLAG_QUESTGIVER); } - bool IsGossip() const { return HasNpcFlag(UNIT_NPC_FLAG_GOSSIP); } - bool IsTaxi() const { return HasNpcFlag(UNIT_NPC_FLAG_FLIGHTMASTER); } - bool IsGuildMaster() const { return HasNpcFlag(UNIT_NPC_FLAG_PETITIONER); } - bool IsBattleMaster() const { return HasNpcFlag(UNIT_NPC_FLAG_BATTLEMASTER); } - bool IsBanker() const { return HasNpcFlag(UNIT_NPC_FLAG_BANKER); } - bool IsInnkeeper() const { return HasNpcFlag(UNIT_NPC_FLAG_INNKEEPER); } - bool IsSpiritHealer() const { return HasNpcFlag(UNIT_NPC_FLAG_SPIRITHEALER); } - bool IsSpiritGuide() const { return HasNpcFlag(UNIT_NPC_FLAG_SPIRITGUIDE); } - bool IsTabardDesigner()const{ return HasNpcFlag(UNIT_NPC_FLAG_TABARDDESIGNER); } - bool IsAuctioner() const { return HasNpcFlag(UNIT_NPC_FLAG_AUCTIONEER); } - bool IsArmorer() const { return HasNpcFlag(UNIT_NPC_FLAG_REPAIR); } + bool IsVendor() const { return HasNpcFlag(UNIT_NPC_FLAG_VENDOR); } + bool IsTrainer() const { return HasNpcFlag(UNIT_NPC_FLAG_TRAINER); } + bool IsQuestGiver() const { return HasNpcFlag(UNIT_NPC_FLAG_QUESTGIVER); } + bool IsGossip() const { return HasNpcFlag(UNIT_NPC_FLAG_GOSSIP); } + bool IsTaxi() const { return HasNpcFlag(UNIT_NPC_FLAG_FLIGHTMASTER); } + bool IsGuildMaster() const { return HasNpcFlag(UNIT_NPC_FLAG_PETITIONER); } + bool IsBattleMaster() const { return HasNpcFlag(UNIT_NPC_FLAG_BATTLEMASTER); } + bool IsBanker() const { return HasNpcFlag(UNIT_NPC_FLAG_BANKER); } + bool IsInnkeeper() const { return HasNpcFlag(UNIT_NPC_FLAG_INNKEEPER); } + bool IsSpiritHealer() const { return HasNpcFlag(UNIT_NPC_FLAG_SPIRITHEALER); } + bool IsSpiritGuide() const { return HasNpcFlag(UNIT_NPC_FLAG_SPIRITGUIDE); } + bool IsTabardDesigner() const { return HasNpcFlag(UNIT_NPC_FLAG_TABARDDESIGNER); } + bool IsAuctioner() const { return HasNpcFlag(UNIT_NPC_FLAG_AUCTIONEER); } + bool IsArmorer() const { return HasNpcFlag(UNIT_NPC_FLAG_REPAIR); } + bool IsWildBattlePet() const { return HasNpcFlag(UNIT_NPC_FLAG_WILD_BATTLE_PET); } bool IsServiceProvider() const; bool IsSpiritService() const { return HasNpcFlag(NPCFlags(UNIT_NPC_FLAG_SPIRITHEALER | UNIT_NPC_FLAG_SPIRITGUIDE)); } bool IsCritter() const { return GetCreatureType() == CREATURE_TYPE_CRITTER; } @@ -1296,6 +1297,9 @@ class TC_GAME_API Unit : public WorldObject Pet* CreateTamedPetFrom(uint32 creatureEntry, uint32 spell_id = 0); bool InitTamedPet(Pet* pet, uint8 level, uint32 spell_id); + void SetWildBattlePetLevel(uint32 wildBattlePetLevel) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::WildBattlePetLevel), wildBattlePetLevel); } + uint32 GetWildBattlePetLevel() const { return m_unitData->WildBattlePetLevel; } + // aura apply/remove helpers - you should better not use these Aura* _TryStackingOrRefreshingExistingAura(AuraCreateInfo& createInfo); void _AddAura(UnitAura* aura, Unit* caster); |
