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

#include "ObjectMgr.h"

Classes

struct  GameobjectInstanceSavedState
 

Public Types

typedef std::unordered_map< uint32, Item * > ItemMap
 
typedef std::unordered_map< uint32, Quest * > QuestMap
 
typedef std::unordered_map< uint32, AreaTriggerAreaTriggerContainer
 
typedef std::unordered_map< uint32, AreaTriggerTeleportAreaTriggerTeleportContainer
 
typedef std::unordered_map< uint32, uint32AreaTriggerScriptContainer
 
typedef std::unordered_map< uint32, std::unordered_map< uint8, DungeonProgressionRequirements * > > DungeonProgressionRequirementsContainer
 
typedef std::unordered_map< uint32, RepRewardRateRepRewardRateContainer
 
typedef std::unordered_map< uint32, ReputationOnKillEntryRepOnKillContainer
 
typedef std::unordered_map< uint32, RepSpilloverTemplateRepSpilloverTemplateContainer
 
typedef std::unordered_map< uint32, PointOfInterestPointOfInterestContainer
 
typedef std::vector< std::string > ScriptNameContainer
 
typedef std::map< uint32, uint32CharacterConversionMap
 
typedef std::multimap< int32, uint32ExclusiveQuestGroups
 
typedef std::pair< ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator > ExclusiveQuestGroupsBounds
 

Public Member Functions

GameObjectTemplate const * GetGameObjectTemplate (uint32 entry)
 
bool IsGameObjectStaticTransport (uint32 entry)
 
GameObjectTemplateContainer const * GetGameObjectTemplates () const
 
int LoadReferenceVendor (int32 vendor, int32 item_id, std::set< uint32 > *skip_vendors)
 
void LoadGameObjectTemplate ()
 
void LoadGameObjectTemplateAddons ()
 
void AddGameobjectInfo (GameObjectTemplate *goinfo)
 
CreatureTemplate const * GetCreatureTemplate (uint32 entry)
 
CreatureTemplateContainer const * GetCreatureTemplates () const
 
CreatureModelInfo const * GetCreatureModelInfo (uint32 modelId) const
 
CreatureModelInfo const * GetCreatureModelRandomGender (CreatureModel *model, CreatureTemplate const *creatureTemplate) const
 
EquipmentInfo const * GetEquipmentInfo (uint32 entry, int8 &id)
 
CreatureAddon const * GetCreatureAddon (ObjectGuid::LowType lowguid)
 
GameObjectAddon const * GetGameObjectAddon (ObjectGuid::LowType lowguid)
 
GameObjectTemplateAddon const * GetGameObjectTemplateAddon (uint32 entry) const
 
CreatureAddon const * GetCreatureTemplateAddon (uint32 entry)
 
CreatureMovementData const * GetCreatureMovementOverride (ObjectGuid::LowType spawnId) const
 
ItemTemplate const * GetItemTemplate (uint32 entry)
 
ItemTemplateContainer const * GetItemTemplateStore () const
 
std::vector< ItemTemplate * > const * GetItemTemplateStoreFast () const
 
ItemSetNameEntry const * GetItemSetNameEntry (uint32 itemId)
 
InstanceTemplate const * GetInstanceTemplate (uint32 mapId)
 
PetLevelInfo const * GetPetLevelInfo (uint32 creature_id, uint8 level) const
 
PlayerClassInfo const * GetPlayerClassInfo (uint32 class_) const
 
void GetPlayerClassLevelInfo (uint32 class_, uint8 level, PlayerClassLevelInfo *info) const
 
PlayerInfo const * GetPlayerInfo (uint32 race, uint32 class_) const
 
void GetPlayerLevelInfo (uint32 race, uint32 class_, uint8 level, PlayerLevelInfo *info) const
 
uint32 GetNearestTaxiNode (float x, float y, float z, uint32 mapid, uint32 teamId)
 
void GetTaxiPath (uint32 source, uint32 destination, uint32 &path, uint32 &cost)
 
uint32 GetTaxiMountDisplayId (uint32 id, TeamId teamId, bool allowed_alt_team=false)
 
GameObjectQuestItemList const * GetGameObjectQuestItemList (uint32 id) const
 
GameObjectQuestItemMap const * GetGameObjectQuestItemMap () const
 
CreatureQuestItemList const * GetCreatureQuestItemList (uint32 id) const
 
CreatureQuestItemMap const * GetCreatureQuestItemMap () const
 
Quest const * GetQuestTemplate (uint32 quest_id) const
 
QuestMap const & GetQuestTemplates () const
 
uint32 GetQuestForAreaTrigger (uint32 Trigger_ID) const
 
bool IsTavernAreaTrigger (uint32 triggerID, uint32 faction) const
 
GossipText const * GetGossipText (uint32 Text_ID) const
 
AreaTrigger const * GetAreaTrigger (uint32 trigger) const
 
AreaTriggerTeleport const * GetAreaTriggerTeleport (uint32 trigger) const
 
DungeonProgressionRequirements const * GetAccessRequirement (uint32 mapid, Difficulty difficulty) const
 
AreaTriggerTeleport const * GetGoBackTrigger (uint32 Map) const
 
AreaTriggerTeleport const * GetMapEntranceTrigger (uint32 Map) const
 
AreaTriggerScriptContainer const & GetAllAreaTriggerScriptData () const
 
uint32 GetAreaTriggerScriptId (uint32 trigger_id)
 
SpellScriptsBounds GetSpellScriptsBounds (uint32 spell_id)
 
RepRewardRate const * GetRepRewardRate (uint32 factionId) const
 
ReputationOnKillEntry const * GetReputationOnKilEntry (uint32 id) const
 
int32 GetBaseReputationOf (FactionEntry const *factionEntry, uint8 race, uint8 playerClass)
 
RepSpilloverTemplate const * GetRepSpilloverTemplate (uint32 factionId) const
 
PointOfInterest const * GetPointOfInterest (uint32 id) const
 
QuestPOIVector const * GetQuestPOIVector (uint32 questId)
 
VehicleAccessoryList const * GetVehicleAccessoryList (Vehicle *veh) const
 
DungeonEncounterList const * GetDungeonEncounterList (uint32 mapId, Difficulty difficulty)
 
void LoadQuests ()
 
void LoadQuestMoneyRewards ()
 
void LoadQuestStartersAndEnders ()
 
void LoadGameobjectQuestStarters ()
 
void LoadGameobjectQuestEnders ()
 
void LoadCreatureQuestStarters ()
 
void LoadCreatureQuestEnders ()
 
QuestRelationsGetGOQuestRelationMap ()
 
QuestRelationsGetGOQuestInvolvedRelationMap ()
 
QuestRelationBounds GetGOQuestRelationBounds (uint32 go_entry)
 
QuestRelationBounds GetGOQuestInvolvedRelationBounds (uint32 go_entry)
 
QuestRelationsGetCreatureQuestRelationMap ()
 
QuestRelationsGetCreatureQuestInvolvedRelationMap ()
 
QuestRelationBounds GetCreatureQuestRelationBounds (uint32 creature_entry)
 
QuestRelationBounds GetCreatureQuestInvolvedRelationBounds (uint32 creature_entry)
 
void LoadEventScripts ()
 
void LoadSpellScripts ()
 
void LoadWaypointScripts ()
 
void LoadSpellScriptNames ()
 
void ValidateSpellScripts ()
 
void InitializeSpellInfoPrecomputedData ()
 
bool LoadModuleStrings ()
 
bool LoadModuleStringsLocale ()
 
bool LoadAcoreStrings ()
 
void LoadBroadcastTexts ()
 
void LoadBroadcastTextLocales ()
 
void LoadCreatureClassLevelStats ()
 
void LoadCreatureLocales ()
 
void LoadCreatureTemplates ()
 
void LoadCreatureTemplate (Field *fields, bool triggerHook=false)
 Loads a creature template from a database result. More...
 
void LoadCreatureTemplateModels ()
 
void LoadCreatureTemplateAddons ()
 
void LoadCreatureTemplateResistances ()
 
void LoadCreatureTemplateSpells ()
 
void LoadCreatureCustomIDs ()
 Load config option Creatures.CustomIDs into Store. More...
 
void CheckCreatureTemplate (CreatureTemplate const *cInfo)
 
void CheckCreatureMovement (char const *table, uint64 id, CreatureMovementData &creatureMovement)
 
void LoadGameObjectQuestItems ()
 
void LoadCreatureQuestItems ()
 
void LoadTempSummons ()
 
void LoadCreatures ()
 
void LoadLinkedRespawn ()
 
bool SetCreatureLinkedRespawn (ObjectGuid::LowType guid, ObjectGuid::LowType linkedGuid)
 
void LoadCreatureAddons ()
 
void LoadGameObjectAddons ()
 
void LoadCreatureModelInfo ()
 
void LoadEquipmentTemplates ()
 
void LoadCreatureMovementOverrides ()
 
void LoadGameObjectLocales ()
 
void LoadGameobjects ()
 
void LoadItemTemplates ()
 
void LoadItemLocales ()
 
void LoadItemSetNames ()
 
void LoadItemSetNameLocales ()
 
void LoadQuestLocales ()
 
void LoadNpcTextLocales ()
 
void LoadQuestOfferRewardLocale ()
 
void LoadQuestRequestItemsLocale ()
 
void LoadPageTextLocales ()
 
void LoadGossipMenuItemsLocales ()
 
void LoadPointOfInterestLocales ()
 
void LoadQuestGreetingsLocales ()
 
void LoadInstanceTemplate ()
 
void LoadInstanceEncounters ()
 
void LoadMailLevelRewards ()
 
void LoadMailServerTemplates ()
 
void LoadVehicleTemplateAccessories ()
 
void LoadVehicleAccessories ()
 
void LoadVehicleSeatAddon ()
 
void LoadGossipText ()
 
void LoadAreaTriggers ()
 
void LoadAreaTriggerTeleports ()
 
void LoadAccessRequirements ()
 
void LoadQuestAreaTriggers ()
 
void LoadQuestGreetings ()
 
void LoadAreaTriggerScripts ()
 
void LoadTavernAreaTriggers ()
 
void LoadGameObjectForQuests ()
 
void LoadPageTexts ()
 
PageText const * GetPageText (uint32 pageEntry)
 
void LoadPlayerInfo ()
 
void LoadPetLevelInfo ()
 
void LoadExplorationBaseXP ()
 
void LoadPetNames ()
 
void LoadPetNamesLocales ()
 
void LoadPetNumber ()
 
void LoadFishingBaseSkillLevel ()
 
void ChangeFishingBaseSkillLevel (uint32 entry, int32 skill)
 
void LoadReputationRewardRate ()
 
void LoadReputationOnKill ()
 
void LoadReputationSpilloverTemplate ()
 
void LoadPointsOfInterest ()
 
void LoadQuestPOI ()
 
void LoadNPCSpellClickSpells ()
 
void LoadGameTele ()
 
void LoadGossipMenu ()
 
void LoadGossipMenuItems ()
 
void LoadVendors ()
 
void LoadTrainerSpell ()
 
void AddSpellToTrainer (uint32 entry, uint32 spell, uint32 spellCost, uint32 reqSkill, uint32 reqSkillValue, uint32 reqLevel, uint32 reqSpell)
 
std::string GeneratePetName (uint32 entry)
 
std::string GeneratePetNameLocale (uint32 entry, LocaleConstant locale)
 
uint32 GetBaseXP (uint8 level)
 
uint32 GetXPForLevel (uint8 level) const
 
int32 GetFishingBaseSkillLevel (uint32 entry) const
 
void ReturnOrDeleteOldMails (bool serverUp)
 
CreatureBaseStats const * GetCreatureBaseStats (uint8 level, uint8 unitClass)
 
void SetHighestGuids ()
 
template<HighGuid type>
ObjectGuidGeneratorBaseGetGenerator ()
 
uint32 GenerateAuctionID ()
 
uint64 GenerateEquipmentSetGuid ()
 
uint32 GenerateMailID ()
 
uint32 GeneratePetNumber ()
 
ObjectGuid::LowType GenerateCreatureSpawnId ()
 
ObjectGuid::LowType GenerateGameObjectSpawnId ()
 
MailLevelReward const * GetMailLevelReward (uint32 level, uint32 raceMask)
 
CellObjectGuids const & GetCellObjectGuids (uint16 mapid, uint8 spawnMode, uint32 cell_id)
 
CellObjectGuidsMap const & GetMapObjectGuids (uint16 mapid, uint8 spawnMode)
 
std::vector< TempSummonData > const * GetSummonGroup (uint32 summonerId, SummonerType summonerType, uint8 group) const
 
ServerMailContainer const & GetAllServerMailStore () const
 
BroadcastText const * GetBroadcastText (uint32 id) const
 
CreatureDataContainer const & GetAllCreatureData () const
 
CreatureData const * GetCreatureData (ObjectGuid::LowType spawnId) const
 
CreatureDataNewOrExistCreatureData (ObjectGuid::LowType spawnId)
 
void DeleteCreatureData (ObjectGuid::LowType spawnId)
 
ObjectGuid GetLinkedRespawnGuid (ObjectGuid guid) const
 
GameObjectDataContainer const & GetAllGOData () const
 
GameObjectData const * GetGameObjectData (ObjectGuid::LowType spawnId) const
 
CreatureLocale const * GetCreatureLocale (uint32 entry) const
 
GameObjectLocale const * GetGameObjectLocale (uint32 entry) const
 
ItemLocale const * GetItemLocale (uint32 entry) const
 
ItemSetNameLocale const * GetItemSetNameLocale (uint32 entry) const
 
PageTextLocale const * GetPageTextLocale (uint32 entry) const
 
QuestLocale const * GetQuestLocale (uint32 entry) const
 
GossipMenuItemsLocale const * GetGossipMenuItemsLocale (uint32 entry) const
 
PointOfInterestLocale const * GetPointOfInterestLocale (uint32 poi_id) const
 
QuestOfferRewardLocale const * GetQuestOfferRewardLocale (uint32 entry) const
 
QuestRequestItemsLocale const * GetQuestRequestItemsLocale (uint32 entry) const
 
NpcTextLocale const * GetNpcTextLocale (uint32 entry) const
 
QuestGreeting const * GetQuestGreeting (TypeID type, uint32 id) const
 
GameObjectDataNewGOData (ObjectGuid::LowType guid)
 
void DeleteGOData (ObjectGuid::LowType guid)
 
ModuleString const * GetModuleString (std::string module, uint32 id) const
 
std::string const * GetModuleString (std::string module, uint32 id, LocaleConstant locale) const
 
AcoreString const * GetAcoreString (uint32 entry) const
 
char const * GetAcoreString (uint32 entry, LocaleConstant locale) const
 
char const * GetAcoreStringForDBCLocale (uint32 entry) const
 
LocaleConstant GetDBCLocaleIndex () const
 
void SetDBCLocaleIndex (LocaleConstant locale)
 
void AddCreatureToGrid (ObjectGuid::LowType guid, CreatureData const *data)
 
void RemoveCreatureFromGrid (ObjectGuid::LowType guid, CreatureData const *data)
 
void AddGameobjectToGrid (ObjectGuid::LowType guid, GameObjectData const *data)
 
void RemoveGameobjectFromGrid (ObjectGuid::LowType guid, GameObjectData const *data)
 
uint32 AddGOData (uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay=0, float rotation0=0, float rotation1=0, float rotation2=0, float rotation3=0)
 
uint32 AddCreData (uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay=0)
 
void LoadReservedPlayerNamesDB ()
 
void LoadReservedPlayerNamesDBC ()
 
bool IsReservedName (std::string_view name) const
 
void AddReservedPlayerName (std::string const &name)
 
void LoadProfanityNamesFromDB ()
 
void LoadProfanityNamesFromDBC ()
 
bool IsProfanityName (std::string_view name) const
 
void AddProfanityPlayerName (std::string const &name)
 
GameTele const * GetGameTele (uint32 id) const
 
GameTele const * GetGameTele (std::string_view name, bool exactSearch=false) const
 
GameTeleContainer const & GetGameTeleMap () const
 
bool AddGameTele (GameTele &data)
 
bool DeleteGameTele (std::string_view name)
 
TrainerSpellData const * GetNpcTrainerSpells (uint32 entry) const
 
VendorItemData const * GetNpcVendorItemList (uint32 entry) const
 
void AddVendorItem (uint32 entry, uint32 item, int32 maxcount, uint32 incrtime, uint32 extendedCost, bool persist=true)
 
bool RemoveVendorItem (uint32 entry, uint32 item, bool persist=true)
 
bool IsVendorItemValid (uint32 vendor_entry, uint32 item, int32 maxcount, uint32 ptime, uint32 ExtendedCost, Player *player=nullptr, std::set< uint32 > *skip_vendors=nullptr, uint32 ORnpcflag=0) const
 
void LoadScriptNames ()
 
ScriptNameContainerGetScriptNames ()
 
std::string const & GetScriptName (uint32 id) const
 
uint32 GetScriptId (std::string const &name)
 
SpellClickInfoMapBounds GetSpellClickInfoMapBounds (uint32 creature_id) const
 
GossipMenusMapBounds GetGossipMenusMapBounds (uint32 uiMenuId) const
 
GossipMenusMapBoundsNonConst GetGossipMenusMapBoundsNonConst (uint32 uiMenuId)
 
GossipMenuItemsMapBounds GetGossipMenuItemsMapBounds (uint32 uiMenuId) const
 
GossipMenuItemsMapBoundsNonConst GetGossipMenuItemsMapBoundsNonConst (uint32 uiMenuId)
 
void LoadFactionChangeAchievements ()
 
void LoadFactionChangeItems ()
 
void LoadFactionChangeQuests ()
 
void LoadFactionChangeReputations ()
 
void LoadFactionChangeSpells ()
 
void LoadFactionChangeTitles ()
 
bool IsTransportMap (uint32 mapId) const
 
VehicleSeatAddon const * GetVehicleSeatAddon (uint32 seatId) const
 
uint32 GetQuestMoneyReward (uint8 level, uint32 questMoneyDifficulty) const
 
void SendServerMail (Player *player, uint32 id, uint32 reqLevel, uint32 reqPlayTime, uint32 rewardMoneyA, uint32 rewardMoneyH, uint32 rewardItemA, uint32 rewardItemCountA, uint32 rewardItemH, uint32 rewardItemCountH, std::string subject, std::string body, uint8 active) const
 

Static Public Member Functions

static ObjectMgrinstance ()
 
static CreatureModel const * ChooseDisplayId (CreatureTemplate const *cinfo, CreatureData const *data=nullptr)
 
static void ChooseCreatureFlags (CreatureTemplate const *cinfo, uint32 &npcflag, uint32 &unit_flags, uint32 &dynamicflags, CreatureData const *data=nullptr)
 
static uint8 CheckPlayerName (std::string_view name, bool create=false)
 
static PetNameInvalidReason CheckPetName (std::string_view name)
 
static bool IsValidCharterName (std::string_view name)
 
static bool IsValidChannelName (std::string const &name)
 
static bool CheckDeclinedNames (std::wstring w_ownname, DeclinedName const &names)
 
static void AddLocaleString (std::string &&s, LocaleConstant locale, std::vector< std::string > &data)
 
static std::string_view GetLocaleString (std::vector< std::string > const &data, std::size_t locale)
 
static void GetLocaleString (const std::vector< std::string > &data, int loc_idx, std::string &value)
 

Public Attributes

ExclusiveQuestGroups mExclusiveQuestGroups
 
CharacterConversionMap FactionChangeAchievements
 
CharacterConversionMap FactionChangeItems
 
CharacterConversionMap FactionChangeQuests
 
CharacterConversionMap FactionChangeReputation
 
CharacterConversionMap FactionChangeSpells
 
CharacterConversionMap FactionChangeTitles
 

Private Types

enum  CreatureLinkedRespawnType {
  CREATURE_TO_CREATURE ,
  CREATURE_TO_GO ,
  GO_TO_GO ,
  GO_TO_CREATURE
}
 
typedef std::unordered_map< uint32, GossipTextGossipTextContainer
 
typedef std::unordered_map< uint32, uint32QuestAreaTriggerContainer
 
typedef std::unordered_map< uint32, uint32TavernAreaTriggerContainer
 
typedef std::set< std::wstring > ReservedNamesContainer
 
typedef std::set< std::wstring > ProfanityNamesContainer
 
typedef std::map< uint32, PetLevelInfo * > PetLevelInfoContainer
 
typedef std::vector< uint32PlayerXPperLevel
 
typedef std::map< uint32, uint32BaseXPContainer
 
typedef std::map< uint32, int32FishingBaseSkillContainer
 
typedef std::map< uint32, std::vector< std::string > > HalfNameContainer
 
typedef std::map< std::pair< uint32, LocaleConstant >, std::vector< std::string > > HalfNameContainerLocale
 
typedef std::unordered_map< uint32, ItemSetNameEntryItemSetNameContainer
 

Private Member Functions

 ObjectMgr ()
 
 ~ObjectMgr ()
 
template<HighGuid high>
ObjectGuidGeneratorBaseGetGuidSequenceGenerator ()
 
void LoadScripts (ScriptsType type)
 
void LoadQuestRelationsHelper (QuestRelations &map, std::string const &table, bool starter, bool go)
 
void PlayerCreateInfoAddItemHelper (uint32 race_, uint32 class_, uint32 itemId, int32 count)
 
void BuildPlayerLevelInfo (uint8 race, uint8 class_, uint8 level, PlayerLevelInfo *plinfo) const
 

Private Attributes

uint32 _auctionId
 
uint64 _equipmentSetGuid
 
uint32 _mailId
 
std::mutex _mailIdMutex
 
uint32 _hiPetNumber
 
std::mutex _hiPetNumberMutex
 
ObjectGuid::LowType _creatureSpawnId
 
ObjectGuid::LowType _gameObjectSpawnId
 
std::map< HighGuid, std::unique_ptr< ObjectGuidGeneratorBase > > _guidGenerators
 
QuestMap _questTemplates
 
std::vector< Quest * > _questTemplatesFast
 
QuestAreaTriggerContainer _questAreaTriggerStore
 
TavernAreaTriggerContainer _tavernAreaTriggerStore
 
GossipTextContainer _gossipTextStore
 
QuestGreetingContainer _questGreetingStore
 
AreaTriggerContainer _areaTriggerStore
 
AreaTriggerTeleportContainer _areaTriggerTeleportStore
 
AreaTriggerScriptContainer _areaTriggerScriptStore
 
DungeonProgressionRequirementsContainer _accessRequirementStore
 
DungeonEncounterContainer _dungeonEncounterStore
 
RepRewardRateContainer _repRewardRateStore
 
RepOnKillContainer _repOnKillStore
 
RepSpilloverTemplateContainer _repSpilloverTemplateStore
 
GossipMenusContainer _gossipMenusStore
 
GossipMenuItemsContainer _gossipMenuItemsStore
 
PointOfInterestContainer _pointsOfInterestStore
 
QuestPOIContainer _questPOIStore
 
QuestRelations _goQuestRelations
 
QuestRelations _goQuestInvolvedRelations
 
QuestRelations _creatureQuestRelations
 
QuestRelations _creatureQuestInvolvedRelations
 
ReservedNamesContainer _reservedNamesStore
 
ProfanityNamesContainer _profanityNamesStore
 
GameTeleContainer _gameTeleStore
 
ScriptNameContainer _scriptNamesStore
 
SpellClickInfoContainer _spellClickInfoStore
 
SpellScriptsContainer _spellScriptsStore
 
VehicleAccessoryContainer _vehicleTemplateAccessoryStore
 
VehicleAccessoryContainer _vehicleAccessoryStore
 
VehicleSeatAddonContainer _vehicleSeatAddonStore
 
LocaleConstant DBCLocaleIndex
 
PageTextContainer _pageTextStore
 
InstanceTemplateContainer _instanceTemplateStore
 
MailLevelRewardContainer _mailLevelRewardStore
 
CreatureBaseStatsContainer _creatureBaseStatsStore
 
PetLevelInfoContainer _petInfoStore
 
PlayerClassInfo_playerClassInfo [MAX_CLASSES]
 
PlayerInfo_playerInfo [MAX_RACES][MAX_CLASSES]
 
PlayerXPperLevel _playerXPperLevel
 
BaseXPContainer _baseXPTable
 
FishingBaseSkillContainer _fishingBaseForAreaStore
 
HalfNameContainer _petHalfName0
 
HalfNameContainer _petHalfName1
 
HalfNameContainerLocale _petHalfLocaleName0
 
HalfNameContainerLocale _petHalfLocaleName1
 
ItemSetNameContainer _itemSetNameStore
 
MapObjectGuids _mapObjectGuidsStore
 
CellObjectGuidsMap _emptyCellObjectGuidsMap
 
CellObjectGuids _emptyCellObjectGuids
 
CreatureDataContainer _creatureDataStore
 
CreatureTemplateContainer _creatureTemplateStore
 
CreatureCustomIDsContainer _creatureCustomIDsStore
 
std::vector< CreatureTemplate * > _creatureTemplateStoreFast
 
CreatureModelContainer _creatureModelStore
 
CreatureAddonContainer _creatureAddonStore
 
CreatureAddonContainer _creatureTemplateAddonStore
 
std::unordered_map< ObjectGuid::LowType, CreatureMovementData_creatureMovementOverrides
 
GameObjectAddonContainer _gameObjectAddonStore
 
GameObjectQuestItemMap _gameObjectQuestItemStore
 
CreatureQuestItemMap _creatureQuestItemStore
 
EquipmentInfoContainer _equipmentInfoStore
 
LinkedRespawnContainer _linkedRespawnStore
 
CreatureLocaleContainer _creatureLocaleStore
 
GameObjectDataContainer _gameObjectDataStore
 
GameObjectLocaleContainer _gameObjectLocaleStore
 
GameObjectTemplateContainer _gameObjectTemplateStore
 
GameObjectTemplateAddonContainer _gameObjectTemplateAddonStore
 
TempSummonDataContainer _tempSummonDataStore
 Stores temp summon data grouped by summoner's entry, summoner's type and group id. More...
 
BroadcastTextContainer _broadcastTextStore
 
ItemTemplateContainer _itemTemplateStore
 
std::vector< ItemTemplate * > _itemTemplateStoreFast
 
ItemLocaleContainer _itemLocaleStore
 
ItemSetNameLocaleContainer _itemSetNameLocaleStore
 
QuestLocaleContainer _questLocaleStore
 
QuestOfferRewardLocaleContainer _questOfferRewardLocaleStore
 
QuestRequestItemsLocaleContainer _questRequestItemsLocaleStore
 
NpcTextLocaleContainer _npcTextLocaleStore
 
PageTextLocaleContainer _pageTextLocaleStore
 
ModuleStringContainer _moduleStringStore
 
AcoreStringContainer _acoreStringStore
 
GossipMenuItemsLocaleContainer _gossipMenuItemsLocaleStore
 
PointOfInterestLocaleContainer _pointOfInterestLocaleStore
 
CacheVendorItemContainer _cacheVendorItemStore
 
CacheTrainerSpellContainer _cacheTrainerSpellStore
 
ServerMailContainer _serverMailStore
 
std::set< uint32_difficultyEntries [MAX_DIFFICULTY - 1]
 
std::set< uint32_hasDifficultyEntries [MAX_DIFFICULTY - 1]
 
std::set< uint32_transportMaps
 
QuestMoneyRewardStore _questMoneyRewards
 
std::vector< GameobjectInstanceSavedStateGameobjectInstanceSavedStateList
 

Friends

class PlayerDumpReader
 

Detailed Description

Member Typedef Documentation

◆ AreaTriggerContainer

typedef std::unordered_map<uint32, AreaTrigger> ObjectMgr::AreaTriggerContainer

◆ AreaTriggerScriptContainer

typedef std::unordered_map<uint32, uint32> ObjectMgr::AreaTriggerScriptContainer

◆ AreaTriggerTeleportContainer

◆ BaseXPContainer

typedef std::map<uint32, uint32> ObjectMgr::BaseXPContainer
private

◆ CharacterConversionMap

◆ DungeonProgressionRequirementsContainer

◆ ExclusiveQuestGroups

typedef std::multimap<int32, uint32> ObjectMgr::ExclusiveQuestGroups

◆ ExclusiveQuestGroupsBounds

typedef std::pair<ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator> ObjectMgr::ExclusiveQuestGroupsBounds

◆ FishingBaseSkillContainer

◆ GossipTextContainer

typedef std::unordered_map<uint32, GossipText> ObjectMgr::GossipTextContainer
private

◆ HalfNameContainer

typedef std::map<uint32, std::vector<std::string> > ObjectMgr::HalfNameContainer
private

◆ HalfNameContainerLocale

typedef std::map<std::pair<uint32, LocaleConstant>, std::vector<std::string> > ObjectMgr::HalfNameContainerLocale
private

◆ ItemMap

typedef std::unordered_map<uint32, Item*> ObjectMgr::ItemMap

◆ ItemSetNameContainer

typedef std::unordered_map<uint32, ItemSetNameEntry> ObjectMgr::ItemSetNameContainer
private

◆ PetLevelInfoContainer

◆ PlayerXPperLevel

typedef std::vector<uint32> ObjectMgr::PlayerXPperLevel
private

◆ PointOfInterestContainer

◆ ProfanityNamesContainer

typedef std::set<std::wstring> ObjectMgr::ProfanityNamesContainer
private

◆ QuestAreaTriggerContainer

typedef std::unordered_map<uint32, uint32> ObjectMgr::QuestAreaTriggerContainer
private

◆ QuestMap

typedef std::unordered_map<uint32, Quest*> ObjectMgr::QuestMap

◆ RepOnKillContainer

◆ RepRewardRateContainer

◆ RepSpilloverTemplateContainer

◆ ReservedNamesContainer

typedef std::set<std::wstring> ObjectMgr::ReservedNamesContainer
private

◆ ScriptNameContainer

typedef std::vector<std::string> ObjectMgr::ScriptNameContainer

◆ TavernAreaTriggerContainer

typedef std::unordered_map<uint32, uint32> ObjectMgr::TavernAreaTriggerContainer
private

Member Enumeration Documentation

◆ CreatureLinkedRespawnType

Enumerator
CREATURE_TO_CREATURE 
CREATURE_TO_GO 
GO_TO_GO 
GO_TO_CREATURE 
1615 {
1617 CREATURE_TO_GO, // Creature is dependant on GO
1618 GO_TO_GO,
1619 GO_TO_CREATURE, // GO is dependant on creature
1620 };
@ CREATURE_TO_GO
Definition: ObjectMgr.h:1617
@ CREATURE_TO_CREATURE
Definition: ObjectMgr.h:1616
@ GO_TO_GO
Definition: ObjectMgr.h:1618
@ GO_TO_CREATURE
Definition: ObjectMgr.h:1619

Constructor & Destructor Documentation

◆ ObjectMgr()

ObjectMgr::ObjectMgr ( )
private
299 :
300 _auctionId(1),
302 _mailId(1),
303 _hiPetNumber(1),
307{
308 for (uint8 i = 0; i < MAX_CLASSES; ++i)
309 {
310 _playerClassInfo[i] = nullptr;
311 for (uint8 j = 0; j < MAX_RACES; ++j)
312 _playerInfo[j][i] = nullptr;
313 }
314}
@ LOCALE_enUS
Definition: Common.h:66
std::uint8_t uint8
Definition: Define.h:109
#define MAX_RACES
Definition: SharedDefines.h:95
#define MAX_CLASSES
Definition: SharedDefines.h:155
PlayerInfo * _playerInfo[MAX_RACES][MAX_CLASSES]
Definition: ObjectMgr.h:1546
ObjectGuid::LowType _gameObjectSpawnId
Definition: ObjectMgr.h:1457
uint32 _mailId
Definition: ObjectMgr.h:1451
ObjectGuid::LowType _creatureSpawnId
Definition: ObjectMgr.h:1456
LocaleConstant DBCLocaleIndex
Definition: ObjectMgr.h:1524
PlayerClassInfo * _playerClassInfo[MAX_CLASSES]
Definition: ObjectMgr.h:1542
uint64 _equipmentSetGuid
Definition: ObjectMgr.h:1450
uint32 _auctionId
Definition: ObjectMgr.h:1449
uint32 _hiPetNumber
Definition: ObjectMgr.h:1453

References _playerClassInfo, _playerInfo, MAX_CLASSES, and MAX_RACES.

◆ ~ObjectMgr()

ObjectMgr::~ObjectMgr ( )
private
317{
318 for (QuestMap::iterator i = _questTemplates.begin(); i != _questTemplates.end(); ++i)
319 delete i->second;
320
321 for (PetLevelInfoContainer::iterator i = _petInfoStore.begin(); i != _petInfoStore.end(); ++i)
322 delete[] i->second;
323
324 // free only if loaded
325 for (int class_ = 0; class_ < MAX_CLASSES; ++class_)
326 {
327 if (_playerClassInfo[class_])
328 delete[] _playerClassInfo[class_]->levelInfo;
329 delete _playerClassInfo[class_];
330 }
331
332 for (int race = 0; race < MAX_RACES; ++race)
333 {
334 for (int class_ = 0; class_ < MAX_CLASSES; ++class_)
335 {
336 if (_playerInfo[race][class_])
337 delete[] _playerInfo[race][class_]->levelInfo;
338 delete _playerInfo[race][class_];
339 }
340 }
341
342 for (CacheVendorItemContainer::iterator itr = _cacheVendorItemStore.begin(); itr != _cacheVendorItemStore.end(); ++itr)
343 itr->second.Clear();
344
346
347 for (DungeonEncounterContainer::iterator itr = _dungeonEncounterStore.begin(); itr != _dungeonEncounterStore.end(); ++itr)
348 for (DungeonEncounterList::iterator encounterItr = itr->second.begin(); encounterItr != itr->second.end(); ++encounterItr)
349 delete *encounterItr;
350
351 for (DungeonProgressionRequirementsContainer::iterator itr = _accessRequirementStore.begin(); itr != _accessRequirementStore.end(); ++itr)
352 {
353 std::unordered_map<uint8, DungeonProgressionRequirements*> difficulties = itr->second;
354 for (auto difficultiesItr = difficulties.begin(); difficultiesItr != difficulties.end(); ++difficultiesItr)
355 {
356 for (auto questItr = difficultiesItr->second->quests.begin(); questItr != difficultiesItr->second->quests.end(); ++questItr)
357 {
358 delete* questItr;
359 }
360
361 for (auto achievementItr = difficultiesItr->second->achievements.begin(); achievementItr != difficultiesItr->second->achievements.end(); ++achievementItr)
362 {
363 delete* achievementItr;
364 }
365
366 for (auto itemsItr = difficultiesItr->second->items.begin(); itemsItr != difficultiesItr->second->items.end(); ++itemsItr)
367 {
368 delete* itemsItr;
369 }
370
371 delete difficultiesItr->second;
372 }
373 }
374}
PlayerClassLevelInfo * levelInfo
Definition: Player.h:304
PlayerLevelInfo * levelInfo
Definition: Player.h:358
CacheTrainerSpellContainer _cacheTrainerSpellStore
Definition: ObjectMgr.h:1607
PetLevelInfoContainer _petInfoStore
Definition: ObjectMgr.h:1540
QuestMap _questTemplates
Definition: ObjectMgr.h:1472
DungeonProgressionRequirementsContainer _accessRequirementStore
Definition: ObjectMgr.h:1486
DungeonEncounterContainer _dungeonEncounterStore
Definition: ObjectMgr.h:1487
CacheVendorItemContainer _cacheVendorItemStore
Definition: ObjectMgr.h:1606

References _accessRequirementStore, _cacheTrainerSpellStore, _cacheVendorItemStore, _dungeonEncounterStore, _petInfoStore, _playerClassInfo, _playerInfo, _questTemplates, PlayerClassInfo::levelInfo, PlayerInfo::levelInfo, MAX_CLASSES, and MAX_RACES.

Member Function Documentation

◆ AddCreatureToGrid()

void ObjectMgr::AddCreatureToGrid ( ObjectGuid::LowType  guid,
CreatureData const *  data 
)
2302{
2303 uint8 mask = data->spawnMask;
2304 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2305 {
2306 if (mask & 1)
2307 {
2308 CellCoord cellCoord = Acore::ComputeCellCoord(data->posX, data->posY);
2309 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][cellCoord.GetId()];
2310 cell_guids.creatures.insert(guid);
2311 }
2312 }
2313}
uint32 MAKE_PAIR32(uint16 l, uint16 h)
Definition: ObjectDefines.h:87
CellCoord ComputeCellCoord(float x, float y)
Definition: GridDefines.h:190
Definition: ObjectMgr.h:478
CellGuidSet creatures
Definition: ObjectMgr.h:479
MapObjectGuids _mapObjectGuidsStore
Definition: ObjectMgr.h:1567
uint32 GetId() const
Definition: GridDefines.h:147

References _mapObjectGuidsStore, Acore::ComputeCellCoord(), CellObjectGuids::creatures, CoordPair< LIMIT >::GetId(), MAKE_PAIR32(), CreatureData::mapid, CreatureData::posX, CreatureData::posY, and CreatureData::spawnMask.

Referenced by AddCreData(), and LoadCreatures().

◆ AddCreData()

uint32 ObjectMgr::AddCreData ( uint32  entry,
uint32  map,
float  x,
float  y,
float  z,
float  o,
uint32  spawntimedelay = 0 
)
2381{
2382 CreatureTemplate const* cInfo = GetCreatureTemplate(entry);
2383 if (!cInfo)
2384 return 0;
2385
2386 uint32 level = cInfo->minlevel == cInfo->maxlevel ? cInfo->minlevel : urand(cInfo->minlevel, cInfo->maxlevel); // Only used for extracting creature base stats
2387 CreatureBaseStats const* stats = GetCreatureBaseStats(level, cInfo->unit_class);
2388 Map* map = sMapMgr->CreateBaseMap(mapId);
2389 if (!map)
2390 return 0;
2391
2393 CreatureData& data = NewOrExistCreatureData(spawnId);
2394 data.spawnMask = spawnId;
2395 data.id1 = entry;
2396 data.id2 = 0;
2397 data.id3 = 0;
2398 data.mapid = mapId;
2399 data.displayid = 0;
2400 data.equipmentId = 0;
2401 data.posX = x;
2402 data.posY = y;
2403 data.posZ = z;
2404 data.orientation = o;
2405 data.spawntimesecs = spawntimedelay;
2406 data.wander_distance = 0;
2407 data.currentwaypoint = 0;
2408 data.curhealth = stats->GenerateHealth(cInfo);
2409 data.curmana = stats->GenerateMana(cInfo);
2410 data.movementType = cInfo->MovementType;
2411 data.spawnMask = 1;
2413 data.dbData = false;
2414 data.npcflag = cInfo->npcflag;
2415 data.unit_flags = cInfo->unit_flags;
2416 data.dynamicflags = cInfo->dynamicflags;
2417
2418 AddCreatureToGrid(spawnId, &data);
2419
2420 // Spawn if necessary (loaded grids only)
2421 if (!map->Instanceable() && !map->IsRemovalGrid(x, y))
2422 {
2423 Creature* creature = new Creature();
2424 if (!creature->LoadCreatureFromDB(spawnId, map, true, true))
2425 {
2426 LOG_ERROR("sql.sql", "AddCreature: Cannot add creature entry {} to map", entry);
2427 delete creature;
2428 return 0;
2429 }
2430 }
2431
2432 return spawnId;
2433}
#define LOG_ERROR(filterType__,...)
Definition: Log.h:157
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:44
std::uint32_t uint32
Definition: Define.h:107
#define sMapMgr
Definition: MapMgr.h:219
@ PHASEMASK_NORMAL
Definition: Object.h:60
Definition: Creature.h:43
bool LoadCreatureFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true, bool allowDuplicate=false)
Definition: Creature.cpp:1692
Definition: CreatureData.h:186
uint32 unit_flags
Definition: CreatureData.h:214
uint8 minlevel
Definition: CreatureData.h:195
uint8 maxlevel
Definition: CreatureData.h:196
uint32 MovementType
Definition: CreatureData.h:234
uint32 npcflag
Definition: CreatureData.h:199
uint32 unit_class
Definition: CreatureData.h:213
uint32 dynamicflags
Definition: CreatureData.h:216
Definition: CreatureData.h:303
uint32 GenerateMana(CreatureTemplate const *info) const
Definition: CreatureData.h:318
uint32 GenerateHealth(CreatureTemplate const *info) const
Definition: CreatureData.h:313
Definition: CreatureData.h:370
float wander_distance
Definition: CreatureData.h:384
uint32 phaseMask
Definition: CreatureData.h:376
uint32 spawntimesecs
Definition: CreatureData.h:383
uint32 dynamicflags
Definition: CreatureData.h:392
uint32 npcflag
Definition: CreatureData.h:390
bool dbData
Definition: CreatureData.h:394
uint32 displayid
Definition: CreatureData.h:377
uint8 movementType
Definition: CreatureData.h:388
uint8 spawnMask
Definition: CreatureData.h:389
uint32 unit_flags
Definition: CreatureData.h:391
uint32 id2
Definition: CreatureData.h:373
uint32 curhealth
Definition: CreatureData.h:386
float orientation
Definition: CreatureData.h:382
uint32 curmana
Definition: CreatureData.h:387
uint32 id3
Definition: CreatureData.h:374
float posY
Definition: CreatureData.h:380
float posX
Definition: CreatureData.h:379
int8 equipmentId
Definition: CreatureData.h:378
uint32 currentwaypoint
Definition: CreatureData.h:385
uint16 mapid
Definition: CreatureData.h:375
float posZ
Definition: CreatureData.h:381
uint32 id1
Definition: CreatureData.h:372
uint32 LowType
Definition: ObjectGuid.h:122
CreatureBaseStats const * GetCreatureBaseStats(uint8 level, uint8 unitClass)
Definition: ObjectMgr.cpp:9740
void AddCreatureToGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition: ObjectMgr.cpp:2301
ObjectGuid::LowType GenerateCreatureSpawnId()
Definition: ObjectMgr.cpp:7055
CreatureData & NewOrExistCreatureData(ObjectGuid::LowType spawnId)
Definition: ObjectMgr.h:1204
CreatureTemplate const * GetCreatureTemplate(uint32 entry)
Definition: ObjectMgr.cpp:10088
Definition: Map.h:311
bool IsRemovalGrid(float x, float y) const
Definition: Map.h:361
bool Instanceable() const
Definition: Map.h:445

References AddCreatureToGrid(), CreatureData::curhealth, CreatureData::curmana, CreatureData::currentwaypoint, CreatureData::dbData, CreatureData::displayid, CreatureTemplate::dynamicflags, CreatureData::dynamicflags, CreatureData::equipmentId, GenerateCreatureSpawnId(), CreatureBaseStats::GenerateHealth(), CreatureBaseStats::GenerateMana(), GetCreatureBaseStats(), GetCreatureTemplate(), CreatureData::id1, CreatureData::id2, CreatureData::id3, Map::Instanceable(), Map::IsRemovalGrid(), Creature::LoadCreatureFromDB(), LOG_ERROR, CreatureData::mapid, CreatureTemplate::maxlevel, CreatureTemplate::minlevel, CreatureTemplate::MovementType, CreatureData::movementType, NewOrExistCreatureData(), CreatureTemplate::npcflag, CreatureData::npcflag, CreatureData::orientation, CreatureData::phaseMask, PHASEMASK_NORMAL, CreatureData::posX, CreatureData::posY, CreatureData::posZ, sMapMgr, CreatureData::spawnMask, CreatureData::spawntimesecs, CreatureTemplate::unit_class, CreatureTemplate::unit_flags, CreatureData::unit_flags, urand(), and CreatureData::wander_distance.

◆ AddGameobjectInfo()

void ObjectMgr::AddGameobjectInfo ( GameObjectTemplate goinfo)

◆ AddGameobjectToGrid()

void ObjectMgr::AddGameobjectToGrid ( ObjectGuid::LowType  guid,
GameObjectData const *  data 
)
2605{
2606 uint8 mask = data->spawnMask;
2607 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2608 {
2609 if (mask & 1)
2610 {
2611 CellCoord cellCoord = Acore::ComputeCellCoord(data->posX, data->posY);
2612 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][cellCoord.GetId()];
2613 cell_guids.gameobjects.insert(guid);
2614 }
2615 }
2616}
CellGuidSet gameobjects
Definition: ObjectMgr.h:480

References _mapObjectGuidsStore, Acore::ComputeCellCoord(), CellObjectGuids::gameobjects, CoordPair< LIMIT >::GetId(), MAKE_PAIR32(), GameObjectData::mapid, GameObjectData::posX, GameObjectData::posY, and GameObjectData::spawnMask.

Referenced by AddGOData(), and LoadGameobjects().

◆ AddGameTele()

bool ObjectMgr::AddGameTele ( GameTele data)
8972{
8973 // find max id
8974 uint32 new_id = 0;
8975 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
8976 if (itr->first > new_id)
8977 new_id = itr->first;
8978
8979 // use next
8980 ++new_id;
8981
8982 if (!Utf8toWStr(tele.name, tele.wnameLow))
8983 return false;
8984
8985 wstrToLower(tele.wnameLow);
8986
8987 _gameTeleStore[new_id] = tele;
8988
8990
8991 stmt->SetData(0, new_id);
8992 stmt->SetData(1, tele.position_x);
8993 stmt->SetData(2, tele.position_y);
8994 stmt->SetData(3, tele.position_z);
8995 stmt->SetData(4, tele.orientation);
8996 stmt->SetData(5, uint16(tele.mapId));
8997 stmt->SetData(6, tele.name);
8998
8999 WorldDatabase.Execute(stmt);
9000
9001 return true;
9002}
bool Utf8toWStr(char const *utf8str, std::size_t csize, wchar_t *wstr, std::size_t &wsize)
Definition: Util.cpp:281
void wstrToLower(std::wstring &str)
Definition: Util.cpp:382
std::uint16_t uint16
Definition: Define.h:108
@ WORLD_INS_GAME_TELE
Definition: WorldDatabase.h:41
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition: DatabaseEnv.cpp:20
Definition: PreparedStatement.h:157
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition: PreparedStatement.h:77
GameTeleContainer _gameTeleStore
Definition: ObjectMgr.h:1512

References _gameTeleStore, GameTele::mapId, GameTele::name, GameTele::orientation, GameTele::position_x, GameTele::position_y, GameTele::position_z, PreparedStatementBase::SetData(), Utf8toWStr(), GameTele::wnameLow, WORLD_INS_GAME_TELE, WorldDatabase, and wstrToLower().

◆ AddGOData()

uint32 ObjectMgr::AddGOData ( uint32  entry,
uint32  map,
float  x,
float  y,
float  z,
float  o,
uint32  spawntimedelay = 0,
float  rotation0 = 0,
float  rotation1 = 0,
float  rotation2 = 0,
float  rotation3 = 0 
)
2330{
2331 GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
2332 if (!goinfo)
2333 return 0;
2334
2335 Map* map = sMapMgr->CreateBaseMap(mapId);
2336 if (!map)
2337 return 0;
2338
2340
2341 GameObjectData& data = NewGOData(spawnId);
2342 data.id = entry;
2343 data.mapid = mapId;
2344 data.posX = x;
2345 data.posY = y;
2346 data.posZ = z;
2347 data.orientation = o;
2348 data.rotation.x = rotation0;
2349 data.rotation.y = rotation1;
2350 data.rotation.z = rotation2;
2351 data.rotation.w = rotation3;
2352 data.spawntimesecs = spawntimedelay;
2353 data.animprogress = 100;
2354 data.spawnMask = 1;
2355 data.go_state = GO_STATE_READY;
2357 data.artKit = goinfo->type == GAMEOBJECT_TYPE_CAPTURE_POINT ? 21 : 0;
2358 data.dbData = false;
2359
2360 AddGameobjectToGrid(spawnId, &data);
2361
2362 // Spawn if necessary (loaded grids only)
2363 // We use spawn coords to spawn
2364 if (!map->Instanceable() && map->IsGridLoaded(x, y))
2365 {
2366 GameObject* go = sObjectMgr->IsGameObjectStaticTransport(data.id) ? new StaticTransport() : new GameObject();
2367 if (!go->LoadGameObjectFromDB(spawnId, map))
2368 {
2369 LOG_ERROR("sql.sql", "AddGOData: cannot add gameobject entry {} to map", entry);
2370 delete go;
2371 return 0;
2372 }
2373 }
2374
2375 LOG_DEBUG("maps", "AddGOData: spawnId {} entry {} map {} x {} y {} z {} o {}", spawnId, entry, mapId, x, y, z, o);
2376
2377 return spawnId;
2378}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:169
@ GAMEOBJECT_TYPE_CAPTURE_POINT
Definition: SharedDefines.h:1589
#define sObjectMgr
Definition: ObjectMgr.h:1635
@ GO_STATE_READY
Definition: GameObjectData.h:690
Definition: GameObject.h:120
bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition: GameObject.cpp:1125
Definition: GameObjectData.h:31
uint32 type
Definition: GameObjectData.h:33
Definition: GameObjectData.h:696
bool dbData
Definition: GameObjectData.h:712
float orientation
Definition: GameObjectData.h:704
float posZ
Definition: GameObjectData.h:703
uint8 artKit
Definition: GameObjectData.h:711
int32 spawntimesecs
Definition: GameObjectData.h:706
uint8 spawnMask
Definition: GameObjectData.h:710
G3D::Quat rotation
Definition: GameObjectData.h:705
uint32 animprogress
Definition: GameObjectData.h:708
uint16 mapid
Definition: GameObjectData.h:699
float posX
Definition: GameObjectData.h:701
uint32 phaseMask
Definition: GameObjectData.h:700
float posY
Definition: GameObjectData.h:702
uint32 id
Definition: GameObjectData.h:698
GOState go_state
Definition: GameObjectData.h:709
Definition: Transport.h:112
void AddGameobjectToGrid(ObjectGuid::LowType guid, GameObjectData const *data)
Definition: ObjectMgr.cpp:2604
GameObjectTemplate const * GetGameObjectTemplate(uint32 entry)
Definition: ObjectMgr.cpp:10064
ObjectGuid::LowType GenerateGameObjectSpawnId()
Definition: ObjectMgr.cpp:7065
GameObjectData & NewGOData(ObjectGuid::LowType guid)
Definition: ObjectMgr.h:1289
bool IsGridLoaded(float x, float y) const
Definition: Map.h:367

References AddGameobjectToGrid(), GameObjectData::animprogress, GameObjectData::artKit, GameObjectData::dbData, GAMEOBJECT_TYPE_CAPTURE_POINT, GenerateGameObjectSpawnId(), GetGameObjectTemplate(), GameObjectData::go_state, GO_STATE_READY, GameObjectData::id, Map::Instanceable(), Map::IsGridLoaded(), GameObject::LoadGameObjectFromDB(), LOG_DEBUG, LOG_ERROR, GameObjectData::mapid, NewGOData(), GameObjectData::orientation, GameObjectData::phaseMask, PHASEMASK_NORMAL, GameObjectData::posX, GameObjectData::posY, GameObjectData::posZ, GameObjectData::rotation, sMapMgr, sObjectMgr, GameObjectData::spawnMask, GameObjectData::spawntimesecs, and GameObjectTemplate::type.

◆ AddLocaleString()

◆ AddProfanityPlayerName()

void ObjectMgr::AddProfanityPlayerName ( std::string const &  name)
8340{
8341 if (!IsProfanityName(name))
8342 {
8343 std::wstring wstr;
8344 if (!Utf8toWStr(name, wstr))
8345 {
8346 LOG_ERROR("server", "Could not add invalid name to profanity player names: {}", name);
8347 return;
8348 }
8349 wstrToLower(wstr);
8350
8351 _profanityNamesStore.insert(wstr);
8352
8354 stmt->SetData(0, name);
8355 CharacterDatabase.Execute(stmt);
8356 }
8357}
@ CHAR_INS_PROFANITY_PLAYER_NAME
Definition: CharacterDatabase.h:518
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
ProfanityNamesContainer _profanityNamesStore
Definition: ObjectMgr.h:1510
bool IsProfanityName(std::string_view name) const
Definition: ObjectMgr.cpp:8324

References _profanityNamesStore, CHAR_INS_PROFANITY_PLAYER_NAME, CharacterDatabase, IsProfanityName(), LOG_ERROR, PreparedStatementBase::SetData(), Utf8toWStr(), and wstrToLower().

◆ AddReservedPlayerName()

void ObjectMgr::AddReservedPlayerName ( std::string const &  name)
8237{
8238 if (!IsReservedName(name))
8239 {
8240 std::wstring wstr;
8241 if (!Utf8toWStr(name, wstr))
8242 {
8243 LOG_ERROR("server", "Could not add invalid name to reserved player names: {}", name);
8244 return;
8245 }
8246 wstrToLower(wstr);
8247
8248 _reservedNamesStore.insert(wstr);
8249
8251 stmt->SetData(0, name);
8252 CharacterDatabase.Execute(stmt);
8253 }
8254}
@ CHAR_INS_RESERVED_PLAYER_NAME
Definition: CharacterDatabase.h:517
bool IsReservedName(std::string_view name) const
Definition: ObjectMgr.cpp:8221
ReservedNamesContainer _reservedNamesStore
Definition: ObjectMgr.h:1506

References _reservedNamesStore, CHAR_INS_RESERVED_PLAYER_NAME, CharacterDatabase, IsReservedName(), LOG_ERROR, PreparedStatementBase::SetData(), Utf8toWStr(), and wstrToLower().

◆ AddSpellToTrainer()

void ObjectMgr::AddSpellToTrainer ( uint32  entry,
uint32  spell,
uint32  spellCost,
uint32  reqSkill,
uint32  reqSkillValue,
uint32  reqLevel,
uint32  reqSpell 
)
9093{
9094 if (entry >= ACORE_TRAINER_START_REF)
9095 return;
9096
9097 CreatureTemplate const* cInfo = GetCreatureTemplate(entry);
9098 if (!cInfo)
9099 {
9100 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry for a non-existing creature template (Entry: {}), ignoring", entry);
9101 return;
9102 }
9103
9104 if (!(cInfo->npcflag & UNIT_NPC_FLAG_TRAINER))
9105 {
9106 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry for a creature template (Entry: {}) without trainer flag, ignoring", entry);
9107 return;
9108 }
9109
9110 SpellInfo const* spellinfo = sSpellMgr->GetSpellInfo(spell);
9111 if (!spellinfo)
9112 {
9113 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a non-existing spell (Spell: {}), ignoring", entry, spell);
9114 return;
9115 }
9116
9117 if (!SpellMgr::ComputeIsSpellValid(spellinfo))
9118 {
9119 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a broken spell (Spell: {}), ignoring", entry, spell);
9120 return;
9121 }
9122
9123 if (GetTalentSpellCost(spell))
9124 {
9125 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a non-existing spell (Spell: {}) which is a talent, ignoring", entry, spell);
9126 return;
9127 }
9128
9129 if (reqSpell && !sSpellMgr->GetSpellInfo(reqSpell))
9130 {
9131 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a non-existing reqSpell (Spell: {}), ignoring", entry, reqSpell);
9132 return;
9133 }
9134
9136
9137 TrainerSpell& trainerSpell = data.spellList[spell];
9138 trainerSpell.spell = spell;
9139 trainerSpell.spellCost = spellCost;
9140 trainerSpell.reqSkill = reqSkill;
9141 trainerSpell.reqSkillValue = reqSkillValue;
9142 trainerSpell.reqLevel = reqLevel;
9143 trainerSpell.reqSpell = reqSpell;
9144
9145 if (!trainerSpell.reqLevel)
9146 trainerSpell.reqLevel = spellinfo->SpellLevel;
9147
9148 // calculate learned spell for profession case when stored cast-spell
9149 trainerSpell.learnedSpell[0] = spell;
9150 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
9151 {
9152 if (spellinfo->Effects[i].Effect != SPELL_EFFECT_LEARN_SPELL)
9153 continue;
9154 if (trainerSpell.learnedSpell[0] == spell)
9155 trainerSpell.learnedSpell[0] = 0;
9156 // player must be able to cast spell on himself
9157 if (spellinfo->Effects[i].TargetA.GetTarget() != 0 && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_TARGET_ALLY
9158 && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_TARGET_ANY && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_CASTER)
9159 {
9160 LOG_ERROR("sql.sql", "Table `npc_trainer` has spell {} for trainer entry {} with learn effect which has incorrect target type, ignoring learn effect!", spell, entry);
9161 continue;
9162 }
9163
9164 trainerSpell.learnedSpell[i] = spellinfo->Effects[i].TriggerSpell;
9165
9166 if (trainerSpell.learnedSpell[i])
9167 {
9168 SpellInfo const* learnedSpellInfo = sSpellMgr->GetSpellInfo(trainerSpell.learnedSpell[i]);
9169 if (learnedSpellInfo && learnedSpellInfo->IsProfession())
9170 data.trainerType = 2;
9171 }
9172 }
9173
9174 return;
9175}
#define MAX_SPELL_EFFECTS
Definition: DBCStructure.h:1636
@ SPELL_EFFECT_LEARN_SPELL
Definition: SharedDefines.h:814
@ TARGET_UNIT_TARGET_ALLY
Definition: SharedDefines.h:1425
@ TARGET_UNIT_TARGET_ANY
Definition: SharedDefines.h:1429
@ TARGET_UNIT_CASTER
Definition: SharedDefines.h:1410
#define ACORE_TRAINER_START_REF
Definition: ObjectMgr.h:493
#define sSpellMgr
Definition: SpellMgr.h:825
@ UNIT_NPC_FLAG_TRAINER
Definition: UnitDefines.h:298
uint32 GetTalentSpellCost(uint32 spellId)
Definition: DBCStores.cpp:686
Definition: CreatureData.h:507
uint32 reqSkillValue
Definition: CreatureData.h:517
uint32 learnedSpell[3]
Definition: CreatureData.h:519
uint32 reqSpell
Definition: CreatureData.h:520
uint32 spellCost
Definition: CreatureData.h:515
uint32 reqSkill
Definition: CreatureData.h:516
uint32 reqLevel
Definition: CreatureData.h:518
uint32 spell
Definition: CreatureData.h:514
Definition: CreatureData.h:529
TrainerSpellMap spellList
Definition: CreatureData.h:533
uint32 trainerType
Definition: CreatureData.h:534
Definition: SpellInfo.h:316
uint32 SpellLevel
Definition: SpellInfo.h:360
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition: SpellInfo.h:393
bool IsProfession() const
Definition: SpellInfo.cpp:953
static bool ComputeIsSpellValid(SpellInfo const *spellInfo, bool msg=true)
Some checks for spells, to prevent adding deprecated/broken spells for trainers, spell book,...
Definition: SpellMgr.cpp:370

References _cacheTrainerSpellStore, ACORE_TRAINER_START_REF, SpellMgr::ComputeIsSpellValid(), SpellInfo::Effects, GetCreatureTemplate(), GetTalentSpellCost(), SpellInfo::IsProfession(), TrainerSpell::learnedSpell, LOG_ERROR, MAX_SPELL_EFFECTS, CreatureTemplate::npcflag, TrainerSpell::reqLevel, TrainerSpell::reqSkill, TrainerSpell::reqSkillValue, TrainerSpell::reqSpell, TrainerSpell::spell, SPELL_EFFECT_LEARN_SPELL, TrainerSpell::spellCost, SpellInfo::SpellLevel, TrainerSpellData::spellList, sSpellMgr, TARGET_UNIT_CASTER, TARGET_UNIT_TARGET_ALLY, TARGET_UNIT_TARGET_ANY, TrainerSpellData::trainerType, and UNIT_NPC_FLAG_TRAINER.

Referenced by LoadTrainerSpell().

◆ AddVendorItem()

void ObjectMgr::AddVendorItem ( uint32  entry,
uint32  item,
int32  maxcount,
uint32  incrtime,
uint32  extendedCost,
bool  persist = true 
)
9418{
9419 VendorItemData& vList = _cacheVendorItemStore[entry];
9420 vList.AddItem(item, maxcount, incrtime, extendedCost);
9421
9422 if (persist)
9423 {
9425
9426 stmt->SetData(0, entry);
9427 stmt->SetData(1, item);
9428 stmt->SetData(2, maxcount);
9429 stmt->SetData(3, incrtime);
9430 stmt->SetData(4, extendedCost);
9431
9432 WorldDatabase.Execute(stmt);
9433 }
9434}
@ WORLD_INS_NPC_VENDOR
Definition: WorldDatabase.h:43
Definition: CreatureData.h:469
void AddItem(uint32 item, int32 maxcount, uint32 ptime, uint32 ExtendedCost)
Definition: CreatureData.h:481

References _cacheVendorItemStore, VendorItemData::AddItem(), PreparedStatementBase::SetData(), WORLD_INS_NPC_VENDOR, and WorldDatabase.

◆ BuildPlayerLevelInfo()

void ObjectMgr::BuildPlayerLevelInfo ( uint8  race,
uint8  class_,
uint8  level,
PlayerLevelInfo plinfo 
) const
private
4333{
4334 // base data (last known level)
4335 *info = _playerInfo[race][_class]->levelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1];
4336
4337 // if conversion from uint32 to uint8 causes unexpected behaviour, change lvl to uint32
4338 for (uint8 lvl = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1; lvl < level; ++lvl)
4339 {
4340 switch (_class)
4341 {
4342 case CLASS_WARRIOR:
4343 info->stats[STAT_STRENGTH] += (lvl > 23 ? 2 : (lvl > 1 ? 1 : 0));
4344 info->stats[STAT_STAMINA] += (lvl > 23 ? 2 : (lvl > 1 ? 1 : 0));
4345 info->stats[STAT_AGILITY] += (lvl > 36 ? 1 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4346 info->stats[STAT_INTELLECT] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4347 info->stats[STAT_SPIRIT] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4348 break;
4349 case CLASS_PALADIN:
4350 info->stats[STAT_STRENGTH] += (lvl > 3 ? 1 : 0);
4351 info->stats[STAT_STAMINA] += (lvl > 33 ? 2 : (lvl > 1 ? 1 : 0));
4352 info->stats[STAT_AGILITY] += (lvl > 38 ? 1 : (lvl > 7 && !(lvl % 2) ? 1 : 0));
4353 info->stats[STAT_INTELLECT] += (lvl > 6 && (lvl % 2) ? 1 : 0);
4354 info->stats[STAT_SPIRIT] += (lvl > 7 ? 1 : 0);
4355 break;
4356 case CLASS_HUNTER:
4357 info->stats[STAT_STRENGTH] += (lvl > 4 ? 1 : 0);
4358 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4359 info->stats[STAT_AGILITY] += (lvl > 33 ? 2 : (lvl > 1 ? 1 : 0));
4360 info->stats[STAT_INTELLECT] += (lvl > 8 && (lvl % 2) ? 1 : 0);
4361 info->stats[STAT_SPIRIT] += (lvl > 38 ? 1 : (lvl > 9 && !(lvl % 2) ? 1 : 0));
4362 break;
4363 case CLASS_ROGUE:
4364 info->stats[STAT_STRENGTH] += (lvl > 5 ? 1 : 0);
4365 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4366 info->stats[STAT_AGILITY] += (lvl > 16 ? 2 : (lvl > 1 ? 1 : 0));
4367 info->stats[STAT_INTELLECT] += (lvl > 8 && !(lvl % 2) ? 1 : 0);
4368 info->stats[STAT_SPIRIT] += (lvl > 38 ? 1 : (lvl > 9 && !(lvl % 2) ? 1 : 0));
4369 break;
4370 case CLASS_PRIEST:
4371 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4372 info->stats[STAT_STAMINA] += (lvl > 5 ? 1 : 0);
4373 info->stats[STAT_AGILITY] += (lvl > 38 ? 1 : (lvl > 8 && (lvl % 2) ? 1 : 0));
4374 info->stats[STAT_INTELLECT] += (lvl > 22 ? 2 : (lvl > 1 ? 1 : 0));
4375 info->stats[STAT_SPIRIT] += (lvl > 3 ? 1 : 0);
4376 break;
4377 case CLASS_SHAMAN:
4378 info->stats[STAT_STRENGTH] += (lvl > 34 ? 1 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4379 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4380 info->stats[STAT_AGILITY] += (lvl > 7 && !(lvl % 2) ? 1 : 0);
4381 info->stats[STAT_INTELLECT] += (lvl > 5 ? 1 : 0);
4382 info->stats[STAT_SPIRIT] += (lvl > 4 ? 1 : 0);
4383 break;
4384 case CLASS_MAGE:
4385 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4386 info->stats[STAT_STAMINA] += (lvl > 5 ? 1 : 0);
4387 info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4388 info->stats[STAT_INTELLECT] += (lvl > 24 ? 2 : (lvl > 1 ? 1 : 0));
4389 info->stats[STAT_SPIRIT] += (lvl > 33 ? 2 : (lvl > 2 ? 1 : 0));
4390 break;
4391 case CLASS_WARLOCK:
4392 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4393 info->stats[STAT_STAMINA] += (lvl > 38 ? 2 : (lvl > 3 ? 1 : 0));
4394 info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4395 info->stats[STAT_INTELLECT] += (lvl > 33 ? 2 : (lvl > 2 ? 1 : 0));
4396 info->stats[STAT_SPIRIT] += (lvl > 38 ? 2 : (lvl > 3 ? 1 : 0));
4397 break;
4398 case CLASS_DRUID:
4399 info->stats[STAT_STRENGTH] += (lvl > 38 ? 2 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4400 info->stats[STAT_STAMINA] += (lvl > 32 ? 2 : (lvl > 4 ? 1 : 0));
4401 info->stats[STAT_AGILITY] += (lvl > 38 ? 2 : (lvl > 8 && (lvl % 2) ? 1 : 0));
4402 info->stats[STAT_INTELLECT] += (lvl > 38 ? 3 : (lvl > 4 ? 1 : 0));
4403 info->stats[STAT_SPIRIT] += (lvl > 38 ? 3 : (lvl > 5 ? 1 : 0));
4404 }
4405 }
4406}
@ CLASS_HUNTER
Definition: SharedDefines.h:143
@ CLASS_DRUID
Definition: SharedDefines.h:151
@ CLASS_SHAMAN
Definition: SharedDefines.h:147
@ CLASS_PRIEST
Definition: SharedDefines.h:145
@ CLASS_WARRIOR
Definition: SharedDefines.h:141
@ CLASS_WARLOCK
Definition: SharedDefines.h:149
@ CLASS_MAGE
Definition: SharedDefines.h:148
@ CLASS_PALADIN
Definition: SharedDefines.h:142
@ CLASS_ROGUE
Definition: SharedDefines.h:144
@ STAT_SPIRIT
Definition: SharedDefines.h:262
@ STAT_INTELLECT
Definition: SharedDefines.h:261
@ STAT_AGILITY
Definition: SharedDefines.h:259
@ STAT_STRENGTH
Definition: SharedDefines.h:258
@ STAT_STAMINA
Definition: SharedDefines.h:260
@ CONFIG_MAX_PLAYER_LEVEL
Definition: IWorld.h:236
#define sWorld
Definition: World.h:443

References _playerInfo, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CONFIG_MAX_PLAYER_LEVEL, PlayerInfo::levelInfo, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, PlayerLevelInfo::stats, and sWorld.

Referenced by GetPlayerLevelInfo().

◆ ChangeFishingBaseSkillLevel()

void ObjectMgr::ChangeFishingBaseSkillLevel ( uint32  entry,
int32  skill 
)
8791{
8792 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
8793 if (!fArea)
8794 {
8795 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
8796 return;
8797 }
8798
8799 _fishingBaseForAreaStore[entry] = skill;
8800
8801 LOG_INFO("server.loading", ">> Fishing base skill level of area {} changed to {}", entry, skill);
8802 LOG_INFO("server.loading", " ");
8803}
#define LOG_INFO(filterType__,...)
Definition: Log.h:165
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
FishingBaseSkillContainer _fishingBaseForAreaStore
Definition: ObjectMgr.h:1555
Definition: DBCStructure.h:518

References _fishingBaseForAreaStore, LOG_ERROR, LOG_INFO, and sAreaTableStore.

◆ CheckCreatureMovement()

void ObjectMgr::CheckCreatureMovement ( char const *  table,
uint64  id,
CreatureMovementData creatureMovement 
)
1246{
1247 if (creatureMovement.Ground >= CreatureGroundMovementType::Max)
1248 {
1249 LOG_ERROR("sql.sql", "`{}`.`Ground` wrong value ({}) for Id {}, setting to Run.", table, uint32(creatureMovement.Ground), id);
1250 creatureMovement.Ground = CreatureGroundMovementType::Run;
1251 }
1252
1253 if (creatureMovement.Flight >= CreatureFlightMovementType::Max)
1254 {
1255 LOG_ERROR("sql.sql", "`{}`.`Flight` wrong value ({}) for Id {}, setting to None.", table, uint32(creatureMovement.Flight), id);
1256 creatureMovement.Flight = CreatureFlightMovementType::None;
1257 }
1258
1259 if (creatureMovement.Chase >= CreatureChaseMovementType::Max)
1260 {
1261 LOG_ERROR("sql.sql", "`{}`.`Chase` wrong value ({}) for Id {}, setting to Run.", table, uint32(creatureMovement.Chase), id);
1262 creatureMovement.Chase = CreatureChaseMovementType::Run;
1263 }
1264
1265 if (creatureMovement.Random >= CreatureRandomMovementType::Max)
1266 {
1267 LOG_ERROR("sql.sql", "`{}`.`Random` wrong value ({}) for Id {}, setting to Walk.", table, uint32(creatureMovement.Random), id);
1268 creatureMovement.Random = CreatureRandomMovementType::Walk;
1269 }
1270}
CreatureRandomMovementType Random
Definition: CreatureData.h:127
CreatureFlightMovementType Flight
Definition: CreatureData.h:123
CreatureChaseMovementType Chase
Definition: CreatureData.h:126
CreatureGroundMovementType Ground
Definition: CreatureData.h:122

References CreatureMovementData::Chase, CreatureMovementData::Flight, CreatureMovementData::Ground, LOG_ERROR, and CreatureMovementData::Random.

Referenced by CheckCreatureTemplate(), and LoadCreatureMovementOverrides().

◆ CheckCreatureTemplate()

void ObjectMgr::CheckCreatureTemplate ( CreatureTemplate const *  cInfo)
962{
963 if (!cInfo)
964 return;
965
966 bool ok = true; // bool to allow continue outside this loop
967 for (uint32 diff = 0; diff < MAX_DIFFICULTY - 1 && ok; ++diff)
968 {
969 if (!cInfo->DifficultyEntry[diff])
970 continue;
971 ok = false; // will be set to true at the end of this loop again
972
973 CreatureTemplate const* difficultyInfo = GetCreatureTemplate(cInfo->DifficultyEntry[diff]);
974 if (!difficultyInfo)
975 {
976 LOG_ERROR("sql.sql", "Creature (Entry: {}) has `difficulty_entry_{}`={} but creature entry {} does not exist.",
977 cInfo->Entry, diff + 1, cInfo->DifficultyEntry[diff], cInfo->DifficultyEntry[diff]);
978 continue;
979 }
980
981 bool ok2 = true;
982 for (uint32 diff2 = 0; diff2 < MAX_DIFFICULTY - 1 && ok2; ++diff2)
983 {
984 ok2 = false;
985 if (_difficultyEntries[diff2].find(cInfo->Entry) != _difficultyEntries[diff2].end())
986 {
987 LOG_ERROR("sql.sql", "Creature (Entry: {}) is listed as `difficulty_entry_{}` of another creature, but itself lists {} in `difficulty_entry_{}`.",
988 cInfo->Entry, diff2 + 1, cInfo->DifficultyEntry[diff], diff + 1);
989 continue;
990 }
991
992 if (_difficultyEntries[diff2].find(cInfo->DifficultyEntry[diff]) != _difficultyEntries[diff2].end())
993 {
994 LOG_ERROR("sql.sql", "Creature (Entry: {}) already listed as `difficulty_entry_{}` for another entry.", cInfo->DifficultyEntry[diff], diff2 + 1);
995 continue;
996 }
997
998 if (_hasDifficultyEntries[diff2].find(cInfo->DifficultyEntry[diff]) != _hasDifficultyEntries[diff2].end())
999 {
1000 LOG_ERROR("sql.sql", "Creature (Entry: {}) has `difficulty_entry_{}`={} but creature entry {} has itself a value in `difficulty_entry_{}`.",
1001 cInfo->Entry, diff + 1, cInfo->DifficultyEntry[diff], cInfo->DifficultyEntry[diff], diff2 + 1);
1002 continue;
1003 }
1004 ok2 = true;
1005 }
1006 if (!ok2)
1007 continue;
1008
1009 if (cInfo->expansion > difficultyInfo->expansion)
1010 {
1011 LOG_ERROR("sql.sql", "Creature (Entry: {}, expansion {}) has different `expansion` in difficulty {} mode (Entry: {}, expansion {}).",
1012 cInfo->Entry, cInfo->expansion, diff + 1, cInfo->DifficultyEntry[diff], difficultyInfo->expansion);
1013 }
1014
1015 if (cInfo->faction != difficultyInfo->faction)
1016 {
1017 LOG_ERROR("sql.sql", "Creature (Entry: {}, faction {}) has different `faction` in difficulty {} mode (Entry: {}, faction {}).",
1018 cInfo->Entry, cInfo->faction, diff + 1, cInfo->DifficultyEntry[diff], difficultyInfo->faction);
1019 }
1020
1021 if (cInfo->unit_class != difficultyInfo->unit_class)
1022 {
1023 LOG_ERROR("sql.sql", "Creature (Entry: {}, class {}) has different `unit_class` in difficulty {} mode (Entry: {}, class {}).",
1024 cInfo->Entry, cInfo->unit_class, diff + 1, cInfo->DifficultyEntry[diff], difficultyInfo->unit_class);
1025 continue;
1026 }
1027
1028 if (cInfo->npcflag != difficultyInfo->npcflag)
1029 {
1030 LOG_ERROR("sql.sql", "Creature (Entry: {}) has different `npcflag` in difficulty {} mode (Entry: {}).", cInfo->Entry, diff + 1, cInfo->DifficultyEntry[diff]);
1031 continue;
1032 }
1033
1034 if (cInfo->family != difficultyInfo->family)
1035 {
1036 LOG_ERROR("sql.sql", "Creature (Entry: {}, family {}) has different `family` in difficulty {} mode (Entry: {}, family {}).",
1037 cInfo->Entry, cInfo->family, diff + 1, cInfo->DifficultyEntry[diff], difficultyInfo->family);
1038 }
1039
1040 if (cInfo->trainer_class != difficultyInfo->trainer_class)
1041 {
1042 LOG_ERROR("sql.sql", "Creature (Entry: {}) has different `trainer_class` in difficulty {} mode (Entry: {}).", cInfo->Entry, diff + 1, cInfo->DifficultyEntry[diff]);
1043 continue;
1044 }
1045
1046 if (cInfo->trainer_race != difficultyInfo->trainer_race)
1047 {
1048 LOG_ERROR("sql.sql", "Creature (Entry: {}) has different `trainer_race` in difficulty {} mode (Entry: {}).", cInfo->Entry, diff + 1, cInfo->DifficultyEntry[diff]);
1049 continue;
1050 }
1051
1052 if (cInfo->trainer_type != difficultyInfo->trainer_type)
1053 {
1054 LOG_ERROR("sql.sql", "Creature (Entry: {}) has different `trainer_type` in difficulty {} mode (Entry: {}).", cInfo->Entry, diff + 1, cInfo->DifficultyEntry[diff]);
1055 continue;
1056 }
1057
1058 if (cInfo->trainer_spell != difficultyInfo->trainer_spell)
1059 {
1060 LOG_ERROR("sql.sql", "Creature (Entry: {}) has different `trainer_spell` in difficulty {} mode (Entry: {}).", cInfo->Entry, diff + 1, cInfo->DifficultyEntry[diff]);
1061 continue;
1062 }
1063
1064 if (cInfo->type != difficultyInfo->type)
1065 {
1066 LOG_ERROR("sql.sql", "Creature (Entry: {}, type {}) has different `type` in difficulty {} mode (Entry: {}, type {}).",
1067 cInfo->Entry, cInfo->type, diff + 1, cInfo->DifficultyEntry[diff], difficultyInfo->type);
1068 }
1069
1070 if (!cInfo->VehicleId && difficultyInfo->VehicleId)
1071 {
1072 LOG_ERROR("sql.sql", "Creature (Entry: {}, VehicleId {}) has different `VehicleId` in difficulty {} mode (Entry: {}, VehicleId {}).",
1073 cInfo->Entry, cInfo->VehicleId, diff + 1, cInfo->DifficultyEntry[diff], difficultyInfo->VehicleId);
1074 }
1075
1076 // Xinef: check dmg school
1077 if (cInfo->dmgschool != difficultyInfo->dmgschool)
1078 {
1079 LOG_ERROR("sql.sql", "Creature (Entry: {}) has different `dmgschool` in difficulty {} mode (Entry: {})", cInfo->Entry, diff + 1, cInfo->DifficultyEntry[diff]);
1080 }
1081
1082 if (!difficultyInfo->AIName.empty())
1083 {
1084 LOG_ERROR("sql.sql", "Creature (Entry: {}) lists difficulty {} mode entry {} with `AIName` filled in. `AIName` of difficulty 0 mode creature is always used instead.",
1085 cInfo->Entry, diff + 1, cInfo->DifficultyEntry[diff]);
1086 continue;
1087 }
1088
1089 if (difficultyInfo->ScriptID)
1090 {
1091 LOG_ERROR("sql.sql", "Creature (Entry: {}) lists difficulty {} mode entry {} with `ScriptName` filled in. `ScriptName` of difficulty 0 mode creature is always used instead.",
1092 cInfo->Entry, diff + 1, cInfo->DifficultyEntry[diff]);
1093 continue;
1094 }
1095
1096 _hasDifficultyEntries[diff].insert(cInfo->Entry);
1097 _difficultyEntries[diff].insert(cInfo->DifficultyEntry[diff]);
1098 ok = true;
1099 }
1100
1101 if (!cInfo->AIName.empty() && !sCreatureAIRegistry->HasItem(cInfo->AIName))
1102 {
1103 LOG_ERROR("sql.sql", "Creature (Entry: {}) has non-registered `AIName` '{}' set, removing", cInfo->Entry, cInfo->AIName);
1104 const_cast<CreatureTemplate*>(cInfo)->AIName.clear();
1105 }
1106
1107 FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(cInfo->faction);
1108 if (!factionTemplate)
1109 LOG_ERROR("sql.sql", "Creature (Entry: {}) has non-existing faction template ({}).", cInfo->Entry, cInfo->faction);
1110
1111 for (int k = 0; k < MAX_KILL_CREDIT; ++k)
1112 {
1113 if (cInfo->KillCredit[k])
1114 {
1115 if (!GetCreatureTemplate(cInfo->KillCredit[k]))
1116 {
1117 LOG_ERROR("sql.sql", "Creature (Entry: {}) lists non-existing creature entry {} in `KillCredit{}`.", cInfo->Entry, cInfo->KillCredit[k], k + 1);
1118 const_cast<CreatureTemplate*>(cInfo)->KillCredit[k] = 0;
1119 }
1120 }
1121 }
1122
1123 if (!cInfo->Models.size())
1124 LOG_ERROR("sql.sql", "Creature (Entry: {}) does not have any existing display id in creature_template_model.", cInfo->Entry);
1125 else if (std::accumulate(cInfo->Models.begin(), cInfo->Models.end(), 0.0f, [](float sum, CreatureModel const& model) { return sum + model.Probability; }) <= 0.0f)
1126 LOG_ERROR("sql.sql", "Creature (Entry: {}) has zero total chance for all models in creature_template_model.", cInfo->Entry);
1127
1128 if (!cInfo->unit_class || ((1 << (cInfo->unit_class - 1)) & CLASSMASK_ALL_CREATURES) == 0)
1129 {
1130 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid unit_class ({}) in creature_template. Set to 1 (UNIT_CLASS_WARRIOR).", cInfo->Entry, cInfo->unit_class);
1131 const_cast<CreatureTemplate*>(cInfo)->unit_class = UNIT_CLASS_WARRIOR;
1132 }
1133
1134 if (cInfo->dmgschool >= MAX_SPELL_SCHOOL)
1135 {
1136 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid spell school value ({}) in `dmgschool`.", cInfo->Entry, cInfo->dmgschool);
1137 const_cast<CreatureTemplate*>(cInfo)->dmgschool = SPELL_SCHOOL_NORMAL;
1138 }
1139
1140 if (cInfo->BaseAttackTime == 0)
1141 const_cast<CreatureTemplate*>(cInfo)->BaseAttackTime = BASE_ATTACK_TIME;
1142
1143 if (cInfo->RangeAttackTime == 0)
1144 const_cast<CreatureTemplate*>(cInfo)->RangeAttackTime = BASE_ATTACK_TIME;
1145
1146 if ((cInfo->npcflag & UNIT_NPC_FLAG_TRAINER) && cInfo->trainer_type >= MAX_TRAINER_TYPE)
1147 LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong trainer type {}.", cInfo->Entry, cInfo->trainer_type);
1148
1149 if (cInfo->speed_walk == 0.0f)
1150 {
1151 LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong value ({}) in speed_walk, set to 1.", cInfo->Entry, cInfo->speed_walk);
1152 const_cast<CreatureTemplate*>(cInfo)->speed_walk = 1.0f;
1153 }
1154
1155 if (cInfo->speed_run == 0.0f)
1156 {
1157 LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong value ({}) in speed_run, set to 1.14286.", cInfo->Entry, cInfo->speed_run);
1158 const_cast<CreatureTemplate*>(cInfo)->speed_run = 1.14286f;
1159 }
1160
1161 if (cInfo->type && !sCreatureTypeStore.LookupEntry(cInfo->type))
1162 {
1163 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid creature type ({}) in `type`.", cInfo->Entry, cInfo->type);
1164 const_cast<CreatureTemplate*>(cInfo)->type = CREATURE_TYPE_HUMANOID;
1165 }
1166
1167 // must exist or used hidden but used in data horse case
1168 if (cInfo->family && !sCreatureFamilyStore.LookupEntry(cInfo->family) && cInfo->family != CREATURE_FAMILY_HORSE_CUSTOM)
1169 {
1170 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid creature family ({}) in `family`.", cInfo->Entry, cInfo->family);
1171 const_cast<CreatureTemplate*>(cInfo)->family = 0;
1172 }
1173
1174 CheckCreatureMovement("creature_template_movement", cInfo->Entry, const_cast<CreatureTemplate*>(cInfo)->Movement);
1175
1176 if (cInfo->HoverHeight < 0.0f)
1177 {
1178 LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong value ({}) in `HoverHeight`", cInfo->Entry, cInfo->HoverHeight);
1179 const_cast<CreatureTemplate*>(cInfo)->HoverHeight = 1.0f;
1180 }
1181
1182 if (cInfo->VehicleId)
1183 {
1184 VehicleEntry const* vehId = sVehicleStore.LookupEntry(cInfo->VehicleId);
1185 if (!vehId)
1186 {
1187 LOG_ERROR("sql.sql", "Creature (Entry: {}) has a non-existing VehicleId ({}). This *WILL* cause the client to freeze!", cInfo->Entry, cInfo->VehicleId);
1188 const_cast<CreatureTemplate*>(cInfo)->VehicleId = 0;
1189 }
1190 }
1191
1192 if (cInfo->PetSpellDataId)
1193 {
1194 CreatureSpellDataEntry const* spellDataId = sCreatureSpellDataStore.LookupEntry(cInfo->PetSpellDataId);
1195 if (!spellDataId)
1196 LOG_ERROR("sql.sql", "Creature (Entry: {}) has non-existing PetSpellDataId ({}).", cInfo->Entry, cInfo->PetSpellDataId);
1197 }
1198
1199 for (uint8 j = 0; j < MAX_CREATURE_SPELLS; ++j)
1200 {
1201 if (cInfo->spells[j] && !sSpellMgr->GetSpellInfo(cInfo->spells[j]))
1202 {
1203 LOG_ERROR("sql.sql", "Creature (Entry: {}) has non-existing Spell{} ({}), set to 0.", cInfo->Entry, j + 1, cInfo->spells[j]);
1204 const_cast<CreatureTemplate*>(cInfo)->spells[j] = 0;
1205 }
1206 }
1207
1208 if (cInfo->MovementType >= MAX_DB_MOTION_TYPE)
1209 {
1210 LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong movement generator type ({}), ignored and set to IDLE.", cInfo->Entry, cInfo->MovementType);
1211 const_cast<CreatureTemplate*>(cInfo)->MovementType = IDLE_MOTION_TYPE;
1212 }
1213
1214 if (cInfo->expansion > (MAX_EXPANSIONS - 1))
1215 {
1216 LOG_ERROR("sql.sql", "Table `creature_template` lists creature (Entry: {}) with expansion {}. Ignored and set to 0.", cInfo->Entry, cInfo->expansion);
1217 const_cast<CreatureTemplate*>(cInfo)->expansion = 0;
1218 }
1219
1220 if (uint32 badFlags = (cInfo->flags_extra & ~CREATURE_FLAG_EXTRA_DB_ALLOWED))
1221 {
1222 LOG_ERROR("sql.sql", "Table `creature_template` lists creature (Entry: {}) with disallowed `flags_extra` {}, removing incorrect flag.", cInfo->Entry, badFlags);
1223 const_cast<CreatureTemplate*>(cInfo)->flags_extra &= CREATURE_FLAG_EXTRA_DB_ALLOWED;
1224 }
1225
1226 const_cast<CreatureTemplate*>(cInfo)->DamageModifier *= Creature::_GetDamageMod(cInfo->rank);
1227
1228 // Hack for modules
1229 for (auto& itr : _creatureCustomIDsStore)
1230 {
1231 if (cInfo->Entry == itr)
1232 return;
1233 }
1234
1235 if ((cInfo->GossipMenuId && !(cInfo->npcflag & UNIT_NPC_FLAG_GOSSIP)) && !(cInfo->flags_extra & CREATURE_FLAG_EXTRA_MODULE))
1236 {
1237 LOG_ERROR("sql.sql", "Creature (Entry: {}) has assigned gossip menu {}, but npcflag does not include UNIT_NPC_FLAG_GOSSIP (1).", cInfo->Entry, cInfo->GossipMenuId);
1238 }
1239 else if ((!cInfo->GossipMenuId && (cInfo->npcflag & UNIT_NPC_FLAG_GOSSIP)) && !(cInfo->flags_extra & CREATURE_FLAG_EXTRA_MODULE))
1240 {
1241 LOG_INFO("sql.sql", "Creature (Entry: {}) has npcflag UNIT_NPC_FLAG_GOSSIP (1), but gossip menu is unassigned.", cInfo->Entry);
1242 }
1243}
spells
Definition: boss_krystallus.cpp:26
#define MAX_DIFFICULTY
Definition: DBCEnums.h:283
@ SPELL_SCHOOL_NORMAL
Definition: SharedDefines.h:283
constexpr auto MAX_SPELL_SCHOOL
Definition: SharedDefines.h:292
@ CREATURE_FAMILY_HORSE_CUSTOM
Definition: SharedDefines.h:2659
@ UNIT_CLASS_WARRIOR
Definition: SharedDefines.h:166
@ CREATURE_TYPE_HUMANOID
Definition: SharedDefines.h:2634
#define CLASSMASK_ALL_CREATURES
Definition: SharedDefines.h:172
@ MAX_EXPANSIONS
Definition: SharedDefines.h:56
#define MAX_TRAINER_TYPE
Definition: SharedDefines.h:2623
#define sCreatureAIRegistry
Definition: CreatureAIFactory.h:48
#define BASE_ATTACK_TIME
Definition: Unit.h:41
static constexpr uint32 MAX_CREATURE_SPELLS
Definition: Unit.h:45
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:294
@ CREATURE_FLAG_EXTRA_DB_ALLOWED
Definition: CreatureData.h:79
@ CREATURE_FLAG_EXTRA_MODULE
Definition: CreatureData.h:69
#define MAX_KILL_CREDIT
Definition: CreatureData.h:30
DBCStorage< VehicleEntry > sVehicleStore(VehicleEntryfmt)
DBCStorage< CreatureSpellDataEntry > sCreatureSpellDataStore(CreatureSpellDatafmt)
DBCStorage< CreatureFamilyEntry > sCreatureFamilyStore(CreatureFamilyfmt)
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
DBCStorage< CreatureTypeEntry > sCreatureTypeStore(CreatureTypefmt)
@ MAX_DB_MOTION_TYPE
Definition: MotionMaster.h:42
@ IDLE_MOTION_TYPE
Definition: MotionMaster.h:39
static float _GetDamageMod(int32 Rank)
Definition: Creature.cpp:1592
Definition: CreatureData.h:169
uint32 trainer_spell
Definition: CreatureData.h:219
uint32 trainer_class
Definition: CreatureData.h:220
uint32 type
Definition: CreatureData.h:222
uint32 trainer_race
Definition: CreatureData.h:221
uint32 ScriptID
Definition: CreatureData.h:247
uint32 VehicleId
Definition: CreatureData.h:230
CreatureMovementData Movement
Definition: CreatureData.h:235
uint32 faction
Definition: CreatureData.h:198
uint32 dmgschool
Definition: CreatureData.h:207
uint32 expansion
Definition: CreatureData.h:197
uint32 trainer_type
Definition: CreatureData.h:218
std::string AIName
Definition: CreatureData.h:233
uint32 family
Definition: CreatureData.h:217
std::set< uint32 > _difficultyEntries[MAX_DIFFICULTY - 1]
Definition: ObjectMgr.h:1611
CreatureCustomIDsContainer _creatureCustomIDsStore
Definition: ObjectMgr.h:1572
std::set< uint32 > _hasDifficultyEntries[MAX_DIFFICULTY - 1]
Definition: ObjectMgr.h:1612
void CheckCreatureMovement(char const *table, uint64 id, CreatureMovementData &creatureMovement)
Definition: ObjectMgr.cpp:1245
Definition: DBCStructure.h:809
Definition: DBCStructure.h:938
Definition: DBCStructure.h:2026

References _creatureCustomIDsStore, _difficultyEntries, Creature::_GetDamageMod(), _hasDifficultyEntries, CreatureTemplate::AIName, BASE_ATTACK_TIME, CreatureTemplate::BaseAttackTime, CheckCreatureMovement(), CLASSMASK_ALL_CREATURES, CREATURE_FAMILY_HORSE_CUSTOM, CREATURE_FLAG_EXTRA_DB_ALLOWED, CREATURE_FLAG_EXTRA_MODULE, CREATURE_TYPE_HUMANOID, CreatureTemplate::DifficultyEntry, CreatureTemplate::dmgschool, CreatureTemplate::Entry, CreatureTemplate::expansion, CreatureTemplate::faction, CreatureTemplate::family, CreatureTemplate::flags_extra, GetCreatureTemplate(), CreatureTemplate::GossipMenuId, CreatureTemplate::HoverHeight, IDLE_MOTION_TYPE, CreatureTemplate::KillCredit, LOG_ERROR, LOG_INFO, MAX_CREATURE_SPELLS, MAX_DB_MOTION_TYPE, MAX_DIFFICULTY, MAX_EXPANSIONS, MAX_KILL_CREDIT, MAX_SPELL_SCHOOL, MAX_TRAINER_TYPE, CreatureTemplate::Models, CreatureTemplate::Movement, CreatureTemplate::MovementType, CreatureTemplate::npcflag, CreatureTemplate::PetSpellDataId, CreatureTemplate::RangeAttackTime, CreatureTemplate::rank, sCreatureAIRegistry, sCreatureFamilyStore, sCreatureSpellDataStore, sCreatureTypeStore, CreatureTemplate::ScriptID, sFactionTemplateStore, CreatureTemplate::speed_run, CreatureTemplate::speed_walk, SPELL_SCHOOL_NORMAL, CreatureTemplate::spells, sSpellMgr, sVehicleStore, CreatureTemplate::trainer_class, CreatureTemplate::trainer_race, CreatureTemplate::trainer_spell, CreatureTemplate::trainer_type, CreatureTemplate::type, CreatureTemplate::unit_class, UNIT_CLASS_WARRIOR, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAG_TRAINER, and CreatureTemplate::VehicleId.

Referenced by LoadCreatureTemplates().

◆ CheckDeclinedNames()

bool ObjectMgr::CheckDeclinedNames ( std::wstring  w_ownname,
DeclinedName const &  names 
)
static
8806{
8807 // get main part of the name
8808 std::wstring mainpart = GetMainPartOfName(w_ownname, 0);
8809 // prepare flags
8810 bool x = true;
8811 bool y = true;
8812
8813 // check declined names
8814 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
8815 {
8816 std::wstring wname;
8817 if (!Utf8toWStr(names.name[i], wname))
8818 return false;
8819
8820 if (mainpart != GetMainPartOfName(wname, i + 1))
8821 x = false;
8822
8823 if (w_ownname != wname)
8824 y = false;
8825 }
8826 return (x || y);
8827}
std::wstring GetMainPartOfName(std::wstring const &wname, uint32_t declension)
Definition: Util.cpp:386
#define MAX_DECLINED_NAME_CASES
Definition: Unit.h:528

References GetMainPartOfName(), MAX_DECLINED_NAME_CASES, DeclinedName::name, and Utf8toWStr().

Referenced by WorldSession::HandlePetRename(), and WorldSession::HandleSetPlayerDeclinedNames().

◆ CheckPetName()

PetNameInvalidReason ObjectMgr::CheckPetName ( std::string_view  name)
static
8512{
8513 std::wstring wname;
8514 if (!Utf8toWStr(name, wname))
8515 return PET_NAME_INVALID;
8516
8517 if (wname.size() > MAX_PET_NAME)
8518 return PET_NAME_TOO_LONG;
8519
8520 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PET_NAME);
8521 if (wname.size() < minName)
8522 return PET_NAME_TOO_SHORT;
8523
8524 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PET_NAMES);
8525 if (!isValidString(wname, strictMask, false))
8527
8528 // Check Reserved Name
8529 if (sObjectMgr->IsReservedName(name))
8530 return PET_NAME_RESERVED;
8531
8532 // Check Profanity Name
8533 if (sObjectMgr->IsProfanityName(name))
8534 return PET_NAME_PROFANE;
8535
8536 return PET_NAME_SUCCESS;
8537}
@ PET_NAME_INVALID
Definition: SharedDefines.h:3660
@ PET_NAME_RESERVED
Definition: SharedDefines.h:3666
@ PET_NAME_SUCCESS
Definition: SharedDefines.h:3658
@ PET_NAME_MIXED_LANGUAGES
Definition: SharedDefines.h:3664
@ PET_NAME_TOO_SHORT
Definition: SharedDefines.h:3662
@ PET_NAME_TOO_LONG
Definition: SharedDefines.h:3663
@ PET_NAME_PROFANE
Definition: SharedDefines.h:3665
#define MAX_PET_NAME
Definition: ObjectMgr.h:685
bool isValidString(std::wstring wstr, uint32 strictMask, bool numericOrSpace, bool create=false)
Definition: ObjectMgr.cpp:8396
@ CONFIG_STRICT_PET_NAMES
Definition: IWorld.h:223
@ CONFIG_MIN_PET_NAME
Definition: IWorld.h:226

References CONFIG_MIN_PET_NAME, CONFIG_STRICT_PET_NAMES, isValidString(), MAX_PET_NAME, PET_NAME_INVALID, PET_NAME_MIXED_LANGUAGES, PET_NAME_PROFANE, PET_NAME_RESERVED, PET_NAME_SUCCESS, PET_NAME_TOO_LONG, PET_NAME_TOO_SHORT, sObjectMgr, sWorld, and Utf8toWStr().

Referenced by WorldSession::HandlePetRename().

◆ CheckPlayerName()

uint8 ObjectMgr::CheckPlayerName ( std::string_view  name,
bool  create = false 
)
static
8433{
8434 std::wstring wname;
8435
8436 // Check for invalid characters
8437 if (!Utf8toWStr(name, wname))
8439
8440 // Check for too long name
8441 if (wname.size() > MAX_PLAYER_NAME)
8442 return CHAR_NAME_TOO_LONG;
8443
8444 // Check for too short name
8445 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PLAYER_NAME);
8446 if (wname.size() < minName)
8447 return CHAR_NAME_TOO_SHORT;
8448
8449 // Check for mixed languages
8450 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PLAYER_NAMES);
8451 if (!isValidString(wname, strictMask, false, create))
8453
8454 // Check for three consecutive letters
8455 wstrToLower(wname);
8456 for (std::size_t i = 2; i < wname.size(); ++i)
8457 if (wname[i] == wname[i - 1] && wname[i] == wname[i - 2])
8459
8460 // Check Reserved Name
8461 if (sObjectMgr->IsReservedName(name))
8462 return CHAR_NAME_RESERVED;
8463
8464 // Check Profanity Name
8465 if (sObjectMgr->IsProfanityName(name))
8466 return CHAR_NAME_PROFANE;
8467
8468 return CHAR_NAME_SUCCESS;
8469}
@ CHAR_NAME_TOO_SHORT
Definition: SharedDefines.h:3422
@ CHAR_NAME_THREE_CONSECUTIVE
Definition: SharedDefines.h:3430
@ CHAR_NAME_INVALID_CHARACTER
Definition: SharedDefines.h:3424
@ CHAR_NAME_TOO_LONG
Definition: SharedDefines.h:3423
@ CHAR_NAME_RESERVED
Definition: SharedDefines.h:3427
@ CHAR_NAME_MIXED_LANGUAGES
Definition: SharedDefines.h:3425
@ CHAR_NAME_PROFANE
Definition: SharedDefines.h:3426
@ CHAR_NAME_SUCCESS
Definition: SharedDefines.h:3419
#define MAX_PLAYER_NAME
Definition: ObjectMgr.h:683
@ CONFIG_STRICT_PLAYER_NAMES
Definition: IWorld.h:220
@ CONFIG_MIN_PLAYER_NAME
Definition: IWorld.h:224

References CHAR_NAME_INVALID_CHARACTER, CHAR_NAME_MIXED_LANGUAGES, CHAR_NAME_PROFANE, CHAR_NAME_RESERVED, CHAR_NAME_SUCCESS, CHAR_NAME_THREE_CONSECUTIVE, CHAR_NAME_TOO_LONG, CHAR_NAME_TOO_SHORT, CONFIG_MIN_PLAYER_NAME, CONFIG_STRICT_PLAYER_NAMES, isValidString(), MAX_PLAYER_NAME, sObjectMgr, sWorld, Utf8toWStr(), and wstrToLower().

Referenced by character_commandscript::HandleCharacterRenameCommand(), WorldSession::HandleCharCreateOpcode(), WorldSession::HandleCharCustomizeCallback(), WorldSession::HandleCharFactionOrRaceChangeCallback(), WorldSession::HandleCharRenameOpcode(), PlayerDumpReader::LoadDump(), Player::LoadFromDB(), and character_commandscript::ValidatePDumpTarget().

◆ ChooseCreatureFlags()

void ObjectMgr::ChooseCreatureFlags ( CreatureTemplate const *  cinfo,
uint32 npcflag,
uint32 unit_flags,
uint32 dynamicflags,
CreatureData const *  data = nullptr 
)
static
1663{
1664 npcflag = cinfo->npcflag;
1665 unit_flags = cinfo->unit_flags;
1666 dynamicflags = cinfo->dynamicflags;
1667
1668 if (data)
1669 {
1670 if (data->npcflag)
1671 npcflag = data->npcflag;
1672
1673 if (data->unit_flags)
1674 unit_flags = data->unit_flags;
1675
1676 if (data->dynamicflags)
1677 dynamicflags = data->dynamicflags;
1678 }
1679}

References CreatureTemplate::dynamicflags, CreatureData::dynamicflags, CreatureTemplate::npcflag, CreatureData::npcflag, CreatureTemplate::unit_flags, and CreatureData::unit_flags.

Referenced by Creature::UpdateEntry().

◆ ChooseDisplayId()

CreatureModel const * ObjectMgr::ChooseDisplayId ( CreatureTemplate const *  cinfo,
CreatureData const *  data = nullptr 
)
static
1648{
1649 // Load creature model (display id)
1650 if (data && data->displayid)
1651 if (CreatureModel const* model = cinfo->GetModelWithDisplayId(data->displayid))
1652 return model;
1653
1654 if (!(cinfo->flags_extra & CREATURE_FLAG_EXTRA_TRIGGER))
1655 if (CreatureModel const* model = cinfo->GetRandomValidModel())
1656 return model;
1657
1658 // Triggers by default receive the invisible model
1659 return cinfo->GetFirstInvisibleModel();
1660}
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition: CreatureData.h:52

References CREATURE_FLAG_EXTRA_TRIGGER, CreatureData::displayid, CreatureTemplate::flags_extra, CreatureTemplate::GetFirstInvisibleModel(), CreatureTemplate::GetModelWithDisplayId(), and CreatureTemplate::GetRandomValidModel().

Referenced by npc_shattrath_daily_quest::DoAction(), Creature::GetNativeObjectScale(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraMounted(), AuraEffect::HandleAuraTransform(), Creature::InitEntry(), and SmartScript::ProcessAction().

◆ DeleteCreatureData()

void ObjectMgr::DeleteCreatureData ( ObjectGuid::LowType  spawnId)
8033{
8034 // remove mapid*cellid -> guid_set map
8035 CreatureData const* data = GetCreatureData(guid);
8036 if (data)
8037 RemoveCreatureFromGrid(guid, data);
8038
8039 _creatureDataStore.erase(guid);
8040}
CreatureDataContainer _creatureDataStore
Definition: ObjectMgr.h:1570
void RemoveCreatureFromGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition: ObjectMgr.cpp:2315
CreatureData const * GetCreatureData(ObjectGuid::LowType spawnId) const
Definition: ObjectMgr.h:1198

References _creatureDataStore, GetCreatureData(), and RemoveCreatureFromGrid().

◆ DeleteGameTele()

bool ObjectMgr::DeleteGameTele ( std::string_view  name)
9005{
9006 // explicit name case
9007 std::wstring wname;
9008 if (!Utf8toWStr(name, wname))
9009 return false;
9010
9011 // converting string that we try to find to lower case
9012 wstrToLower(wname);
9013
9014 for (GameTeleContainer::iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9015 {
9016 if (itr->second.wnameLow == wname)
9017 {
9019
9020 stmt->SetData(0, itr->second.name);
9021
9022 WorldDatabase.Execute(stmt);
9023
9024 _gameTeleStore.erase(itr);
9025 return true;
9026 }
9027 }
9028
9029 return false;
9030}
@ WORLD_DEL_GAME_TELE
Definition: WorldDatabase.h:42

References _gameTeleStore, PreparedStatementBase::SetData(), Utf8toWStr(), WORLD_DEL_GAME_TELE, WorldDatabase, and wstrToLower().

◆ DeleteGOData()

void ObjectMgr::DeleteGOData ( ObjectGuid::LowType  guid)
8043{
8044 // remove mapid*cellid -> guid_set map
8045 GameObjectData const* data = GetGameObjectData(guid);
8046 if (data)
8047 RemoveGameobjectFromGrid(guid, data);
8048
8049 _gameObjectDataStore.erase(guid);
8050}
GameObjectData const * GetGameObjectData(ObjectGuid::LowType spawnId) const
Definition: ObjectMgr.h:1215
GameObjectDataContainer _gameObjectDataStore
Definition: ObjectMgr.h:1584
void RemoveGameobjectFromGrid(ObjectGuid::LowType guid, GameObjectData const *data)
Definition: ObjectMgr.cpp:2618

References _gameObjectDataStore, GetGameObjectData(), and RemoveGameobjectFromGrid().

◆ GenerateAuctionID()

uint32 ObjectMgr::GenerateAuctionID ( )
7025{
7026 if (_auctionId >= 0xFFFFFFFE)
7027 {
7028 LOG_ERROR("server.worldserver", "Auctions ids overflow!! Can't continue, shutting down server. ");
7030 }
7031 return _auctionId++;
7032}
@ ERROR_EXIT_CODE
Definition: World.h:54
static void StopNow(uint8 exitcode)
Definition: World.h:253

References _auctionId, ERROR_EXIT_CODE, LOG_ERROR, and World::StopNow().

◆ GenerateCreatureSpawnId()

uint32 ObjectMgr::GenerateCreatureSpawnId ( )
7056{
7057 if (_creatureSpawnId >= uint32(0xFFFFFF))
7058 {
7059 LOG_ERROR("server.worldserver", "Creature spawn id overflow!! Can't continue, shutting down server. Search on forum for TCE00007 for more info.");
7061 }
7062 return _creatureSpawnId++;
7063}

References _creatureSpawnId, ERROR_EXIT_CODE, LOG_ERROR, and World::StopNow().

Referenced by AddCreData().

◆ GenerateEquipmentSetGuid()

uint64 ObjectMgr::GenerateEquipmentSetGuid ( )
7035{
7036 if (_equipmentSetGuid >= uint64(0xFFFFFFFFFFFFFFFELL))
7037 {
7038 LOG_ERROR("server.worldserver", "EquipmentSet guid overflow!! Can't continue, shutting down server. ");
7040 }
7041 return _equipmentSetGuid++;
7042}
std::uint64_t uint64
Definition: Define.h:106

References _equipmentSetGuid, ERROR_EXIT_CODE, LOG_ERROR, and World::StopNow().

◆ GenerateGameObjectSpawnId()

uint32 ObjectMgr::GenerateGameObjectSpawnId ( )
7066{
7067 if (_gameObjectSpawnId >= uint32(0xFFFFFF))
7068 {
7069 LOG_ERROR("server.worldserver", "GameObject spawn id overflow!! Can't continue, shutting down server. Search on forum for TCE00007 for more info. ");
7071 }
7072 return _gameObjectSpawnId++;
7073}

References _gameObjectSpawnId, ERROR_EXIT_CODE, LOG_ERROR, and World::StopNow().

Referenced by AddGOData().

◆ GenerateMailID()

uint32 ObjectMgr::GenerateMailID ( )
7045{
7046 if (_mailId >= 0xFFFFFFFE)
7047 {
7048 LOG_ERROR("server.worldserver", "Mail ids overflow!! Can't continue, shutting down server. ");
7050 }
7051 std::lock_guard<std::mutex> guard(_mailIdMutex);
7052 return _mailId++;
7053}
std::mutex _mailIdMutex
Definition: ObjectMgr.h:1452

References _mailId, _mailIdMutex, ERROR_EXIT_CODE, LOG_ERROR, and World::StopNow().

◆ GeneratePetName()

std::string ObjectMgr::GeneratePetName ( uint32  entry)
7532{
7533 std::vector<std::string>& list0 = _petHalfName0[entry];
7534 std::vector<std::string>& list1 = _petHalfName1[entry];
7535
7536 if (list0.empty() || list1.empty())
7537 {
7538 CreatureTemplate const* cinfo = GetCreatureTemplate(entry);
7539 char const* petname = GetPetName(cinfo->family, sWorld->GetDefaultDbcLocale());
7540 if (!petname)
7541 return cinfo->Name;
7542
7543 return std::string(petname);
7544 }
7545
7546 return *(list0.begin() + urand(0, list0.size() - 1)) + *(list1.begin() + urand(0, list1.size() - 1));
7547}
char const * GetPetName(uint32 petfamily, uint32 dbclang)
Definition: DBCStores.cpp:665
std::string Name
Definition: CreatureData.h:191
HalfNameContainer _petHalfName1
Definition: ObjectMgr.h:1559
HalfNameContainer _petHalfName0
Definition: ObjectMgr.h:1558

References _petHalfName0, _petHalfName1, CreatureTemplate::family, GetCreatureTemplate(), GetPetName(), CreatureTemplate::Name, sWorld, and urand().

Referenced by GeneratePetNameLocale().

◆ GeneratePetNameLocale()

std::string ObjectMgr::GeneratePetNameLocale ( uint32  entry,
LocaleConstant  locale 
)
7519{
7520 std::vector<std::string>& list0 = _petHalfLocaleName0[std::make_pair(entry, locale)];
7521 std::vector<std::string>& list1 = _petHalfLocaleName1[std::make_pair(entry, locale)];
7522
7523 if (list0.empty() || list1.empty())
7524 {
7525 return GeneratePetName(entry);
7526 }
7527
7528 return *(list0.begin() + urand(0, list0.size() - 1)) + *(list1.begin() + urand(0, list1.size() - 1));
7529}
HalfNameContainerLocale _petHalfLocaleName0
Definition: ObjectMgr.h:1561
HalfNameContainerLocale _petHalfLocaleName1
Definition: ObjectMgr.h:1562
std::string GeneratePetName(uint32 entry)
Definition: ObjectMgr.cpp:7531

References _petHalfLocaleName0, _petHalfLocaleName1, GeneratePetName(), and urand().

◆ GeneratePetNumber()

uint32 ObjectMgr::GeneratePetNumber ( )
7550{
7551 std::lock_guard<std::mutex> guard(_hiPetNumberMutex);
7552 return ++_hiPetNumber;
7553}
std::mutex _hiPetNumberMutex
Definition: ObjectMgr.h:1454

References _hiPetNumber, and _hiPetNumberMutex.

◆ GetAccessRequirement()

DungeonProgressionRequirements const * ObjectMgr::GetAccessRequirement ( uint32  mapid,
Difficulty  difficulty 
) const
inline
870 {
871 DungeonProgressionRequirementsContainer::const_iterator itr = _accessRequirementStore.find(mapid);
872 if (itr != _accessRequirementStore.end())
873 {
874 std::unordered_map<uint8, DungeonProgressionRequirements*> difficultiesProgressionRequirements = itr->second;
875 auto difficultiesItr = difficultiesProgressionRequirements.find(difficulty);
876 if (difficultiesItr != difficultiesProgressionRequirements.end())
877 {
878 return difficultiesItr->second;
879 }
880 }
881 return nullptr;
882 }

References _accessRequirementStore.

◆ GetAcoreString() [1/2]

AcoreString const * ObjectMgr::GetAcoreString ( uint32  entry) const
inline
1304 {
1305 AcoreStringContainer::const_iterator itr = _acoreStringStore.find(entry);
1306 if (itr == _acoreStringStore.end())
1307 return nullptr;
1308
1309 return &itr->second;
1310 }
AcoreStringContainer _acoreStringStore
Definition: ObjectMgr.h:1602

References _acoreStringStore.

Referenced by GetAcoreString(), and GetAcoreStringForDBCLocale().

◆ GetAcoreString() [2/2]

char const * ObjectMgr::GetAcoreString ( uint32  entry,
LocaleConstant  locale 
) const
8738{
8739 if (AcoreString const* ts = GetAcoreString(entry))
8740 {
8741 if (ts->Content.size() > std::size_t(locale) && !ts->Content[locale].empty())
8742 return ts->Content[locale].c_str();
8743
8744 return ts->Content[DEFAULT_LOCALE].c_str();
8745 }
8746
8747 LOG_ERROR("sql.sql", "Acore string entry {} not found in DB.", entry);
8748
8749 return "<error>";
8750}
#define DEFAULT_LOCALE
Definition: Common.h:79
Definition: ObjectMgr.h:501
AcoreString const * GetAcoreString(uint32 entry) const
Definition: ObjectMgr.h:1303

References AcoreString::Content, DEFAULT_LOCALE, GetAcoreString(), and LOG_ERROR.

◆ GetAcoreStringForDBCLocale()

char const * ObjectMgr::GetAcoreStringForDBCLocale ( uint32  entry) const
inline
1312{ return GetAcoreString(entry, DBCLocaleIndex); }

References DBCLocaleIndex, and GetAcoreString().

◆ GetAllAreaTriggerScriptData()

AreaTriggerScriptContainer const & ObjectMgr::GetAllAreaTriggerScriptData ( ) const
inline
887{ return _areaTriggerScriptStore; }
AreaTriggerScriptContainer _areaTriggerScriptStore
Definition: ObjectMgr.h:1485

References _areaTriggerScriptStore.

◆ GetAllCreatureData()

CreatureDataContainer const & ObjectMgr::GetAllCreatureData ( ) const
inline
1197{ return _creatureDataStore; }

References _creatureDataStore.

◆ GetAllGOData()

GameObjectDataContainer const & ObjectMgr::GetAllGOData ( ) const
inline
1214{ return _gameObjectDataStore; }

References _gameObjectDataStore.

◆ GetAllServerMailStore()

ServerMailContainer const & ObjectMgr::GetAllServerMailStore ( ) const
inline
1188{ return _serverMailStore; }
ServerMailContainer _serverMailStore
Definition: ObjectMgr.h:1609

References _serverMailStore.

◆ GetAreaTrigger()

AreaTrigger const * ObjectMgr::GetAreaTrigger ( uint32  trigger) const
inline
854 {
855 AreaTriggerContainer::const_iterator itr = _areaTriggerStore.find(trigger);
856 if (itr != _areaTriggerStore.end())
857 return &itr->second;
858 return nullptr;
859 }
AreaTriggerContainer _areaTriggerStore
Definition: ObjectMgr.h:1483

References _areaTriggerStore.

Referenced by GetGoBackTrigger(), LoadAreaTriggerScripts(), LoadAreaTriggerTeleports(), LoadQuestAreaTriggers(), and LoadTavernAreaTriggers().

◆ GetAreaTriggerScriptId()

uint32 ObjectMgr::GetAreaTriggerScriptId ( uint32  trigger_id)
8830{
8831 AreaTriggerScriptContainer::const_iterator i = _areaTriggerScriptStore.find(trigger_id);
8832 if (i != _areaTriggerScriptStore.end())
8833 return i->second;
8834 return 0;
8835}

References _areaTriggerScriptStore.

◆ GetAreaTriggerTeleport()

AreaTriggerTeleport const * ObjectMgr::GetAreaTriggerTeleport ( uint32  trigger) const
inline
862 {
863 AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.find(trigger);
864 if (itr != _areaTriggerTeleportStore.end())
865 return &itr->second;
866 return nullptr;
867 }
AreaTriggerTeleportContainer _areaTriggerTeleportStore
Definition: ObjectMgr.h:1484

References _areaTriggerTeleportStore.

◆ GetBaseReputationOf()

int32 ObjectMgr::GetBaseReputationOf ( FactionEntry const *  factionEntry,
uint8  race,
uint8  playerClass 
)
8844{
8845 if (!factionEntry)
8846 return 0;
8847
8848 uint32 raceMask = (1 << (race - 1));
8849 uint32 classMask = (1 << (playerClass - 1));
8850
8851 for (int i = 0; i < 4; i++)
8852 {
8853 if ((!factionEntry->BaseRepClassMask[i] ||
8854 factionEntry->BaseRepClassMask[i] & classMask) &&
8855 (!factionEntry->BaseRepRaceMask[i] ||
8856 factionEntry->BaseRepRaceMask[i] & raceMask))
8857 return factionEntry->BaseRepValue[i];
8858 }
8859
8860 return 0;
8861}

References FactionEntry::BaseRepClassMask, FactionEntry::BaseRepRaceMask, and FactionEntry::BaseRepValue.

◆ GetBaseXP()

uint32 ObjectMgr::GetBaseXP ( uint8  level)
7460{
7461 return _baseXPTable[level] ? _baseXPTable[level] : 0;
7462}
BaseXPContainer _baseXPTable
Definition: ObjectMgr.h:1552

References _baseXPTable.

◆ GetBroadcastText()

BroadcastText const * ObjectMgr::GetBroadcastText ( uint32  id) const
inline
1191 {
1192 BroadcastTextContainer::const_iterator itr = _broadcastTextStore.find(id);
1193 if (itr != _broadcastTextStore.end())
1194 return &itr->second;
1195 return nullptr;
1196 }
BroadcastTextContainer _broadcastTextStore
Definition: ObjectMgr.h:1591

References _broadcastTextStore.

Referenced by LoadGossipMenuItems(), LoadGossipText(), and LoadScripts().

◆ GetCellObjectGuids()

CellObjectGuids const & ObjectMgr::GetCellObjectGuids ( uint16  mapid,
uint8  spawnMode,
uint32  cell_id 
)
inline
1151 {
1152 MapObjectGuids::const_iterator itr1 = _mapObjectGuidsStore.find(MAKE_PAIR32(mapid, spawnMode));
1153 if (itr1 != _mapObjectGuidsStore.end())
1154 {
1155 CellObjectGuidsMap::const_iterator itr2 = itr1->second.find(cell_id);
1156 if (itr2 != itr1->second.end())
1157 return itr2->second;
1158 }
1159 return _emptyCellObjectGuids;
1160 }
CellObjectGuids _emptyCellObjectGuids
Definition: ObjectMgr.h:1569

References _emptyCellObjectGuids, _mapObjectGuidsStore, and MAKE_PAIR32().

◆ GetCreatureAddon()

CreatureAddon const * ObjectMgr::GetCreatureAddon ( ObjectGuid::LowType  lowguid)
1435{
1436 CreatureAddonContainer::const_iterator itr = _creatureAddonStore.find(lowguid);
1437 if (itr != _creatureAddonStore.end())
1438 return &(itr->second);
1439
1440 return nullptr;
1441}
CreatureAddonContainer _creatureAddonStore
Definition: ObjectMgr.h:1575

References _creatureAddonStore.

◆ GetCreatureBaseStats()

CreatureBaseStats const * ObjectMgr::GetCreatureBaseStats ( uint8  level,
uint8  unitClass 
)
9741{
9742 CreatureBaseStatsContainer::const_iterator it = _creatureBaseStatsStore.find(MAKE_PAIR16(level, unitClass));
9743
9744 if (it != _creatureBaseStatsStore.end())
9745 return &(it->second);
9746
9747 struct DefaultCreatureBaseStats : public CreatureBaseStats
9748 {
9749 DefaultCreatureBaseStats()
9750 {
9751 BaseArmor = 1;
9752 for (uint8 j = 0; j < MAX_EXPANSIONS; ++j)
9753 {
9754 BaseHealth[j] = 1;
9755 BaseDamage[j] = 0.0f;
9756 }
9757 BaseMana = 0;
9758 AttackPower = 0;
9759 RangedAttackPower = 0;
9760 }
9761 };
9762 static const DefaultCreatureBaseStats defStats;
9763 return &defStats;
9764}
uint16 MAKE_PAIR16(uint8 l, uint8 h)
Definition: ObjectDefines.h:82
CreatureBaseStatsContainer _creatureBaseStatsStore
Definition: ObjectMgr.h:1536

References _creatureBaseStatsStore, MAKE_PAIR16(), and MAX_EXPANSIONS.

Referenced by AddCreData().

◆ GetCreatureData()

CreatureData const * ObjectMgr::GetCreatureData ( ObjectGuid::LowType  spawnId) const
inline
1199 {
1200 CreatureDataContainer::const_iterator itr = _creatureDataStore.find(spawnId);
1201 if (itr == _creatureDataStore.end()) return nullptr;
1202 return &itr->second;
1203 }

References _creatureDataStore.

Referenced by DeleteCreatureData(), LoadCreatureAddons(), LoadCreatureMovementOverrides(), LoadLinkedRespawn(), and SetCreatureLinkedRespawn().

◆ GetCreatureLocale()

CreatureLocale const * ObjectMgr::GetCreatureLocale ( uint32  entry) const
inline
1222 {
1223 CreatureLocaleContainer::const_iterator itr = _creatureLocaleStore.find(entry);
1224 if (itr == _creatureLocaleStore.end()) return nullptr;
1225 return &itr->second;
1226 }
CreatureLocaleContainer _creatureLocaleStore
Definition: ObjectMgr.h:1583

References _creatureLocaleStore.

◆ GetCreatureModelInfo()

CreatureModelInfo const * ObjectMgr::GetCreatureModelInfo ( uint32  modelId) const
1639{
1640 CreatureModelContainer::const_iterator itr = _creatureModelStore.find(modelId);
1641 if (itr != _creatureModelStore.end())
1642 return &(itr->second);
1643
1644 return nullptr;
1645}
CreatureModelContainer _creatureModelStore
Definition: ObjectMgr.h:1574

References _creatureModelStore.

Referenced by GetCreatureModelRandomGender(), and LoadCreatureTemplateModels().

◆ GetCreatureModelRandomGender()

CreatureModelInfo const * ObjectMgr::GetCreatureModelRandomGender ( CreatureModel model,
CreatureTemplate const *  creatureTemplate 
) const
1682{
1683 CreatureModelInfo const* modelInfo = GetCreatureModelInfo(model->CreatureDisplayID);
1684 if (!modelInfo)
1685 return nullptr;
1686
1687 // If a model for another gender exists, 50% chance to use it
1688 if (modelInfo->modelid_other_gender != 0 && urand(0, 1) == 0)
1689 {
1690 CreatureModelInfo const* minfo_tmp = GetCreatureModelInfo(modelInfo->modelid_other_gender);
1691 if (!minfo_tmp)
1692 LOG_ERROR("sql.sql", "Model (Entry: {}) has modelid_other_gender {} not found in table `creature_model_info`. ", model->CreatureDisplayID, modelInfo->modelid_other_gender);
1693 else
1694 {
1695 // Model ID changed
1696 model->CreatureDisplayID = modelInfo->modelid_other_gender;
1697 if (creatureTemplate)
1698 {
1699 auto itr = std::find_if(creatureTemplate->Models.begin(), creatureTemplate->Models.end(), [&](CreatureModel const& templateModel)
1700 {
1701 return templateModel.CreatureDisplayID == modelInfo->modelid_other_gender;
1702 });
1703 if (itr != creatureTemplate->Models.end())
1704 *model = *itr;
1705 }
1706 return minfo_tmp;
1707 }
1708 }
1709
1710 return modelInfo;
1711}
uint32 CreatureDisplayID
Definition: CreatureData.h:179
Definition: CreatureData.h:398
uint32 modelid_other_gender
Definition: CreatureData.h:402
CreatureModelInfo const * GetCreatureModelInfo(uint32 modelId) const
Definition: ObjectMgr.cpp:1638

References CreatureModel::CreatureDisplayID, GetCreatureModelInfo(), LOG_ERROR, CreatureModelInfo::modelid_other_gender, CreatureTemplate::Models, and urand().

Referenced by GetTaxiMountDisplayId().

◆ GetCreatureMovementOverride()

CreatureMovementData const * ObjectMgr::GetCreatureMovementOverride ( ObjectGuid::LowType  spawnId) const
1453{
1455}
auto MapGetValuePtr(M &map, typename M::key_type const &key) -> decltype(AddressOrSelf(map.find(key) ->second))
Definition: Containers.h:206
std::unordered_map< ObjectGuid::LowType, CreatureMovementData > _creatureMovementOverrides
Definition: ObjectMgr.h:1577

References _creatureMovementOverrides, and Acore::Containers::MapGetValuePtr().

◆ GetCreatureQuestInvolvedRelationBounds()

QuestRelationBounds ObjectMgr::GetCreatureQuestInvolvedRelationBounds ( uint32  creature_entry)
inline
999 {
1000 return _creatureQuestInvolvedRelations.equal_range(creature_entry);
1001 }
QuestRelations _creatureQuestInvolvedRelations
Definition: ObjectMgr.h:1502

References _creatureQuestInvolvedRelations.

◆ GetCreatureQuestInvolvedRelationMap()

QuestRelations * ObjectMgr::GetCreatureQuestInvolvedRelationMap ( )
inline

◆ GetCreatureQuestItemList()

CreatureQuestItemList const * ObjectMgr::GetCreatureQuestItemList ( uint32  id) const
inline
817 {
818 CreatureQuestItemMap::const_iterator itr = _creatureQuestItemStore.find(id);
819 if (itr != _creatureQuestItemStore.end())
820 return &itr->second;
821 return nullptr;
822 }
CreatureQuestItemMap _creatureQuestItemStore
Definition: ObjectMgr.h:1580

References _creatureQuestItemStore.

◆ GetCreatureQuestItemMap()

CreatureQuestItemMap const * ObjectMgr::GetCreatureQuestItemMap ( ) const
inline
823{ return &_creatureQuestItemStore; }

References _creatureQuestItemStore.

◆ GetCreatureQuestRelationBounds()

QuestRelationBounds ObjectMgr::GetCreatureQuestRelationBounds ( uint32  creature_entry)
inline
994 {
995 return _creatureQuestRelations.equal_range(creature_entry);
996 }
QuestRelations _creatureQuestRelations
Definition: ObjectMgr.h:1501

References _creatureQuestRelations.

◆ GetCreatureQuestRelationMap()

QuestRelations * ObjectMgr::GetCreatureQuestRelationMap ( )
inline
984 {
986 }

References _creatureQuestRelations.

◆ GetCreatureTemplate()

◆ GetCreatureTemplateAddon()

CreatureAddon const * ObjectMgr::GetCreatureTemplateAddon ( uint32  entry)
1444{
1445 CreatureAddonContainer::const_iterator itr = _creatureTemplateAddonStore.find(entry);
1446 if (itr != _creatureTemplateAddonStore.end())
1447 return &(itr->second);
1448
1449 return nullptr;
1450}
CreatureAddonContainer _creatureTemplateAddonStore
Definition: ObjectMgr.h:1576

References _creatureTemplateAddonStore.

◆ GetCreatureTemplates()

CreatureTemplateContainer const * ObjectMgr::GetCreatureTemplates ( ) const
inline
764{ return &_creatureTemplateStore; }
CreatureTemplateContainer _creatureTemplateStore
Definition: ObjectMgr.h:1571

References _creatureTemplateStore.

◆ GetDBCLocaleIndex()

LocaleConstant ObjectMgr::GetDBCLocaleIndex ( ) const
inline
1313{ return DBCLocaleIndex; }

References DBCLocaleIndex.

◆ GetDungeonEncounterList()

DungeonEncounterList const * ObjectMgr::GetDungeonEncounterList ( uint32  mapId,
Difficulty  difficulty 
)
inline
938 {
939 std::unordered_map<uint32, DungeonEncounterList>::const_iterator itr = _dungeonEncounterStore.find(MAKE_PAIR32(mapId, difficulty));
940 if (itr != _dungeonEncounterStore.end())
941 return &itr->second;
942 return nullptr;
943 }

References _dungeonEncounterStore, and MAKE_PAIR32().

◆ GetEquipmentInfo()

EquipmentInfo const * ObjectMgr::GetEquipmentInfo ( uint32  entry,
int8 id 
)
1458{
1459 EquipmentInfoContainer::const_iterator itr = _equipmentInfoStore.find(entry);
1460 if (itr == _equipmentInfoStore.end())
1461 return nullptr;
1462
1463 if (itr->second.empty())
1464 return nullptr;
1465
1466 if (id == -1) // select a random element
1467 {
1468 EquipmentInfoContainerInternal::const_iterator ritr = itr->second.begin();
1469 std::advance(ritr, urand(0u, itr->second.size() - 1));
1470 id = std::distance(itr->second.begin(), ritr) + 1;
1471 return &ritr->second;
1472 }
1473 else
1474 {
1475 EquipmentInfoContainerInternal::const_iterator itr2 = itr->second.find(id);
1476 if (itr2 != itr->second.end())
1477 return &itr2->second;
1478 }
1479
1480 return nullptr;
1481}
EquipmentInfoContainer _equipmentInfoStore
Definition: ObjectMgr.h:1581

References _equipmentInfoStore, and urand().

Referenced by LoadCreatures().

◆ GetFishingBaseSkillLevel()

int32 ObjectMgr::GetFishingBaseSkillLevel ( uint32  entry) const
inline
1107 {
1108 FishingBaseSkillContainer::const_iterator itr = _fishingBaseForAreaStore.find(entry);
1109 return itr != _fishingBaseForAreaStore.end() ? itr->second : 0;
1110 }

References _fishingBaseForAreaStore.

◆ GetGameObjectAddon()

GameObjectAddon const * ObjectMgr::GetGameObjectAddon ( ObjectGuid::LowType  lowguid)
1426{
1427 GameObjectAddonContainer::const_iterator itr = _gameObjectAddonStore.find(lowguid);
1428 if (itr != _gameObjectAddonStore.end())
1429 return &(itr->second);
1430
1431 return nullptr;
1432}
GameObjectAddonContainer _gameObjectAddonStore
Definition: ObjectMgr.h:1578

References _gameObjectAddonStore.

◆ GetGameObjectData()

GameObjectData const * ObjectMgr::GetGameObjectData ( ObjectGuid::LowType  spawnId) const
inline
1216 {
1217 GameObjectDataContainer::const_iterator itr = _gameObjectDataStore.find(spawnId);
1218 if (itr == _gameObjectDataStore.end()) return nullptr;
1219 return &itr->second;
1220 }

References _gameObjectDataStore.

Referenced by DeleteGOData(), LoadGameObjectAddons(), LoadLinkedRespawn(), and LoadScripts().

◆ GetGameObjectLocale()

GameObjectLocale const * ObjectMgr::GetGameObjectLocale ( uint32  entry) const
inline
1228 {
1229 GameObjectLocaleContainer::const_iterator itr = _gameObjectLocaleStore.find(entry);
1230 if (itr == _gameObjectLocaleStore.end()) return nullptr;
1231 return &itr->second;
1232 }
GameObjectLocaleContainer _gameObjectLocaleStore
Definition: ObjectMgr.h:1585

References _gameObjectLocaleStore.

◆ GetGameObjectQuestItemList()

GameObjectQuestItemList const * ObjectMgr::GetGameObjectQuestItemList ( uint32  id) const
inline
808 {
809 GameObjectQuestItemMap::const_iterator itr = _gameObjectQuestItemStore.find(id);
810 if (itr != _gameObjectQuestItemStore.end())
811 return &itr->second;
812 return nullptr;
813 }
GameObjectQuestItemMap _gameObjectQuestItemStore
Definition: ObjectMgr.h:1579

References _gameObjectQuestItemStore.

◆ GetGameObjectQuestItemMap()

GameObjectQuestItemMap const * ObjectMgr::GetGameObjectQuestItemMap ( ) const
inline

◆ GetGameObjectTemplate()

GameObjectTemplate const * ObjectMgr::GetGameObjectTemplate ( uint32  entry)
10065{
10066 GameObjectTemplateContainer::const_iterator itr = _gameObjectTemplateStore.find(entry);
10067 if (itr != _gameObjectTemplateStore.end())
10068 return &(itr->second);
10069
10070 return nullptr;
10071}
GameObjectTemplateContainer _gameObjectTemplateStore
Definition: ObjectMgr.h:1586

References _gameObjectTemplateStore.

Referenced by AddGOData(), IsGameObjectStaticTransport(), LoadGameobjectQuestEnders(), LoadGameObjectQuestItems(), LoadGameobjectQuestStarters(), LoadGameobjects(), LoadQuests(), LoadScripts(), and LoadTempSummons().

◆ GetGameObjectTemplateAddon()

GameObjectTemplateAddon const * ObjectMgr::GetGameObjectTemplateAddon ( uint32  entry) const
10080{
10081 auto itr = _gameObjectTemplateAddonStore.find(entry);
10082 if (itr != _gameObjectTemplateAddonStore.end())
10083 return &itr->second;
10084
10085 return nullptr;
10086}
GameObjectTemplateAddonContainer _gameObjectTemplateAddonStore
Definition: ObjectMgr.h:1587

References _gameObjectTemplateAddonStore.

◆ GetGameObjectTemplates()

GameObjectTemplateContainer const * ObjectMgr::GetGameObjectTemplates ( ) const
inline

◆ GetGameTele() [1/2]

GameTele const * ObjectMgr::GetGameTele ( std::string_view  name,
bool  exactSearch = false 
) const
8949{
8950 // explicit name case
8951 std::wstring wname;
8952 if (!Utf8toWStr(name, wname))
8953 return nullptr;
8954
8955 // converting string that we try to find to lower case
8956 wstrToLower(wname);
8957
8958 // Alternative first GameTele what contains wnameLow as substring in case no GameTele location found
8959 const GameTele* alt = nullptr;
8960 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
8961 {
8962 if (itr->second.wnameLow == wname)
8963 return &itr->second;
8964 else if (!exactSearch && !alt && itr->second.wnameLow.find(wname) != std::wstring::npos)
8965 alt = &itr->second;
8966 }
8967
8968 return alt;
8969}
Definition: ObjectMgr.h:132

References _gameTeleStore, Utf8toWStr(), GameTele::wnameLow, and wstrToLower().

◆ GetGameTele() [2/2]

GameTele const * ObjectMgr::GetGameTele ( uint32  id) const
inline
1345 {
1346 GameTeleContainer::const_iterator itr = _gameTeleStore.find(id);
1347 if (itr == _gameTeleStore.end()) return nullptr;
1348 return &itr->second;
1349 }

References _gameTeleStore.

◆ GetGameTeleMap()

GameTeleContainer const & ObjectMgr::GetGameTeleMap ( ) const
inline
1351{ return _gameTeleStore; }

References _gameTeleStore.

◆ GetGenerator()

template<HighGuid type>
ObjectGuidGeneratorBase & ObjectMgr::GetGenerator ( )
inline
1120 {
1121 static_assert(ObjectGuidTraits<type>::Global, "Only global guid can be generated in ObjectMgr context");
1122 return GetGuidSequenceGenerator<type>();
1123 }
Definition: ObjectGuid.h:76

◆ GetGoBackTrigger()

AreaTriggerTeleport const * ObjectMgr::GetGoBackTrigger ( uint32  Map) const
6924{
6925 bool useParentDbValue = false;
6926 uint32 parentId = 0;
6927 MapEntry const* mapEntry = sMapStore.LookupEntry(Map);
6928 if (!mapEntry || mapEntry->entrance_map < 0)
6929 return nullptr;
6930
6931 if (mapEntry->IsDungeon())
6932 {
6933 InstanceTemplate const* iTemplate = sObjectMgr->GetInstanceTemplate(Map);
6934
6935 if (!iTemplate)
6936 return nullptr;
6937
6938 parentId = iTemplate->Parent;
6939 useParentDbValue = true;
6940 }
6941
6942 uint32 entrance_map = uint32(mapEntry->entrance_map);
6943 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
6944 if ((!useParentDbValue && itr->second.target_mapId == entrance_map) || (useParentDbValue && itr->second.target_mapId == parentId))
6945 {
6946 AreaTrigger const* atEntry = GetAreaTrigger(itr->first);
6947 if (atEntry && atEntry->map == Map)
6948 return &itr->second;
6949 }
6950 return nullptr;
6951}
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
Definition: ObjectMgr.h:420
uint32 map
Definition: ObjectMgr.h:422
AreaTrigger const * GetAreaTrigger(uint32 trigger) const
Definition: ObjectMgr.h:853
Definition: Map.h:272
uint32 Parent
Definition: Map.h:273
Definition: DBCStructure.h:1324
int32 entrance_map
Definition: DBCStructure.h:1339
bool IsDungeon() const
Definition: DBCStructure.h:1350

References _areaTriggerTeleportStore, MapEntry::entrance_map, GetAreaTrigger(), MapEntry::IsDungeon(), AreaTrigger::map, InstanceTemplate::Parent, sMapStore, and sObjectMgr.

◆ GetGOQuestInvolvedRelationBounds()

QuestRelationBounds ObjectMgr::GetGOQuestInvolvedRelationBounds ( uint32  go_entry)
inline
979 {
980 return _goQuestInvolvedRelations.equal_range(go_entry);
981 }
QuestRelations _goQuestInvolvedRelations
Definition: ObjectMgr.h:1500

References _goQuestInvolvedRelations.

◆ GetGOQuestInvolvedRelationMap()

QuestRelations * ObjectMgr::GetGOQuestInvolvedRelationMap ( )
inline
969 {
971 }

References _goQuestInvolvedRelations.

◆ GetGOQuestRelationBounds()

QuestRelationBounds ObjectMgr::GetGOQuestRelationBounds ( uint32  go_entry)
inline
974 {
975 return _goQuestRelations.equal_range(go_entry);
976 }
QuestRelations _goQuestRelations
Definition: ObjectMgr.h:1499

References _goQuestRelations.

◆ GetGOQuestRelationMap()

QuestRelations * ObjectMgr::GetGOQuestRelationMap ( )
inline
964 {
965 return &_goQuestRelations;
966 }

References _goQuestRelations.

◆ GetGossipMenuItemsLocale()

GossipMenuItemsLocale const * ObjectMgr::GetGossipMenuItemsLocale ( uint32  entry) const
inline
1258 {
1259 GossipMenuItemsLocaleContainer::const_iterator itr = _gossipMenuItemsLocaleStore.find(entry);
1260 if (itr == _gossipMenuItemsLocaleStore.end()) return nullptr;
1261 return &itr->second;
1262 }
GossipMenuItemsLocaleContainer _gossipMenuItemsLocaleStore
Definition: ObjectMgr.h:1603

References _gossipMenuItemsLocaleStore.

◆ GetGossipMenuItemsMapBounds()

GossipMenuItemsMapBounds ObjectMgr::GetGossipMenuItemsMapBounds ( uint32  uiMenuId) const
inline
1398 {
1399 return _gossipMenuItemsStore.equal_range(uiMenuId);
1400 }
GossipMenuItemsContainer _gossipMenuItemsStore
Definition: ObjectMgr.h:1494

References _gossipMenuItemsStore.

◆ GetGossipMenuItemsMapBoundsNonConst()

GossipMenuItemsMapBoundsNonConst ObjectMgr::GetGossipMenuItemsMapBoundsNonConst ( uint32  uiMenuId)
inline
1402 {
1403 return _gossipMenuItemsStore.equal_range(uiMenuId);
1404 }

References _gossipMenuItemsStore.

◆ GetGossipMenusMapBounds()

GossipMenusMapBounds ObjectMgr::GetGossipMenusMapBounds ( uint32  uiMenuId) const
inline
1388 {
1389 return _gossipMenusStore.equal_range(uiMenuId);
1390 }
GossipMenusContainer _gossipMenusStore
Definition: ObjectMgr.h:1493

References _gossipMenusStore.

◆ GetGossipMenusMapBoundsNonConst()

GossipMenusMapBoundsNonConst ObjectMgr::GetGossipMenusMapBoundsNonConst ( uint32  uiMenuId)
inline
1393 {
1394 return _gossipMenusStore.equal_range(uiMenuId);
1395 }

References _gossipMenusStore.

◆ GetGossipText()

GossipText const * ObjectMgr::GetGossipText ( uint32  Text_ID) const
5971{
5972 GossipTextContainer::const_iterator itr = _gossipTextStore.find(Text_ID);
5973 if (itr != _gossipTextStore.end())
5974 return &itr->second;
5975 return nullptr;
5976}
GossipTextContainer _gossipTextStore
Definition: ObjectMgr.h:1481

References _gossipTextStore.

Referenced by LoadGossipMenu().

◆ GetGuidSequenceGenerator()

template<HighGuid high>
ObjectGuidGeneratorBase & ObjectMgr::GetGuidSequenceGenerator ( )
inlineprivate
1462 {
1463 auto itr = _guidGenerators.find(high);
1464 if (itr == _guidGenerators.end())
1465 itr = _guidGenerators.insert(std::make_pair(high, std::unique_ptr<ObjectGuidGenerator<high>>(new ObjectGuidGenerator<high>()))).first;
1466
1467 return *itr->second;
1468 }
Definition: ObjectGuid.h:297
std::map< HighGuid, std::unique_ptr< ObjectGuidGeneratorBase > > _guidGenerators
Definition: ObjectMgr.h:1470

References _guidGenerators.

◆ GetInstanceTemplate()

InstanceTemplate const * ObjectMgr::GetInstanceTemplate ( uint32  mapId)
5877{
5878 InstanceTemplateContainer::const_iterator itr = _instanceTemplateStore.find(uint16(mapID));
5879 if (itr != _instanceTemplateStore.end())
5880 return &(itr->second);
5881
5882 return nullptr;
5883}
InstanceTemplateContainer _instanceTemplateStore
Definition: ObjectMgr.h:1527

References _instanceTemplateStore.

◆ GetItemLocale()

ItemLocale const * ObjectMgr::GetItemLocale ( uint32  entry) const
inline
1234 {
1235 ItemLocaleContainer::const_iterator itr = _itemLocaleStore.find(entry);
1236 if (itr == _itemLocaleStore.end()) return nullptr;
1237 return &itr->second;
1238 }
ItemLocaleContainer _itemLocaleStore
Definition: ObjectMgr.h:1594

References _itemLocaleStore.

◆ GetItemSetNameEntry()

ItemSetNameEntry const * ObjectMgr::GetItemSetNameEntry ( uint32  itemId)
inline
780 {
781 ItemSetNameContainer::iterator itr = _itemSetNameStore.find(itemId);
782 if (itr != _itemSetNameStore.end())
783 return &itr->second;
784 return nullptr;
785 }
ItemSetNameContainer _itemSetNameStore
Definition: ObjectMgr.h:1565

References _itemSetNameStore.

◆ GetItemSetNameLocale()

ItemSetNameLocale const * ObjectMgr::GetItemSetNameLocale ( uint32  entry) const
inline
1240 {
1241 ItemSetNameLocaleContainer::const_iterator itr = _itemSetNameLocaleStore.find(entry);
1242 if (itr == _itemSetNameLocaleStore.end())return nullptr;
1243 return &itr->second;
1244 }
ItemSetNameLocaleContainer _itemSetNameLocaleStore
Definition: ObjectMgr.h:1595

References _itemSetNameLocaleStore.

◆ GetItemTemplate()

ItemTemplate const * ObjectMgr::GetItemTemplate ( uint32  entry)
3272{
3273 return entry < _itemTemplateStoreFast.size() ? _itemTemplateStoreFast[entry] : nullptr;
3274}
std::vector< ItemTemplate * > _itemTemplateStoreFast
Definition: ObjectMgr.h:1593

References _itemTemplateStoreFast.

Referenced by LoadAccessRequirements(), LoadFactionChangeItems(), LoadItemTemplates(), LoadPlayerInfo(), and LoadScripts().

◆ GetItemTemplateStore()

ItemTemplateContainer const * ObjectMgr::GetItemTemplateStore ( ) const
inline
776{ return &_itemTemplateStore; }
ItemTemplateContainer _itemTemplateStore
Definition: ObjectMgr.h:1592

References _itemTemplateStore.

◆ GetItemTemplateStoreFast()

std::vector< ItemTemplate * > const * ObjectMgr::GetItemTemplateStoreFast ( ) const
inline
777{ return &_itemTemplateStoreFast; }

References _itemTemplateStoreFast.

◆ GetLinkedRespawnGuid()

ObjectGuid ObjectMgr::GetLinkedRespawnGuid ( ObjectGuid  guid) const
inline
1207 {
1208 LinkedRespawnContainer::const_iterator itr = _linkedRespawnStore.find(guid);
1209 if (itr == _linkedRespawnStore.end())
1210 return ObjectGuid::Empty;
1211 return itr->second;
1212 }
static ObjectGuid const Empty
Definition: ObjectGuid.h:120
LinkedRespawnContainer _linkedRespawnStore
Definition: ObjectMgr.h:1582

References _linkedRespawnStore, and ObjectGuid::Empty.

◆ GetLocaleString() [1/2]

static void ObjectMgr::GetLocaleString ( const std::vector< std::string > &  data,
int  loc_idx,
std::string &  value 
)
inlinestatic
1415 {
1416 if (data.size() > std::size_t(loc_idx) && !data[loc_idx].empty())
1417 value = data[loc_idx];
1418 }

◆ GetLocaleString() [2/2]

◆ GetMailLevelReward()

MailLevelReward const * ObjectMgr::GetMailLevelReward ( uint32  level,
uint32  raceMask 
)
inline
1138 {
1139 MailLevelRewardContainer::const_iterator map_itr = _mailLevelRewardStore.find(level);
1140 if (map_itr == _mailLevelRewardStore.end())
1141 return nullptr;
1142
1143 for (const auto & set_itr : map_itr->second)
1144 if (set_itr.raceMask & raceMask)
1145 return &set_itr;
1146
1147 return nullptr;
1148 }
MailLevelRewardContainer _mailLevelRewardStore
Definition: ObjectMgr.h:1534

References _mailLevelRewardStore.

◆ GetMapEntranceTrigger()

AreaTriggerTeleport const * ObjectMgr::GetMapEntranceTrigger ( uint32  Map) const

Searches for the areatrigger which teleports players to the given map

6957{
6958 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
6959 {
6960 if (itr->second.target_mapId == Map) // Id is used to determine correct Scarlet Monastery instance
6961 {
6962 // xinef: no need to check, already done at loading
6963 //AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first);
6964 //if (atEntry)
6965 return &itr->second;
6966 }
6967 }
6968 return nullptr;
6969}

References _areaTriggerTeleportStore.

◆ GetMapObjectGuids()

CellObjectGuidsMap const & ObjectMgr::GetMapObjectGuids ( uint16  mapid,
uint8  spawnMode 
)
inline
1163 {
1164 MapObjectGuids::const_iterator itr1 = _mapObjectGuidsStore.find(MAKE_PAIR32(mapid, spawnMode));
1165 if (itr1 != _mapObjectGuidsStore.end())
1166 return itr1->second;
1168 }
CellObjectGuidsMap _emptyCellObjectGuidsMap
Definition: ObjectMgr.h:1568

References _emptyCellObjectGuidsMap, _mapObjectGuidsStore, and MAKE_PAIR32().

◆ GetModuleString() [1/2]

ModuleString const * ObjectMgr::GetModuleString ( std::string  module,
uint32  id 
) const
inline
1293 {
1294 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
1295 ModuleStringContainer::const_iterator itr = _moduleStringStore.find(pairKey);
1296 if (itr == _moduleStringStore.end())
1297 return nullptr;
1298
1299 return &itr->second;
1300 }
ModuleStringContainer _moduleStringStore
Definition: ObjectMgr.h:1601

References _moduleStringStore.

Referenced by GetModuleString().

◆ GetModuleString() [2/2]

std::string const * ObjectMgr::GetModuleString ( std::string  module,
uint32  id,
LocaleConstant  locale 
) const
8689{
8690 ModuleString const* ms = GetModuleString(module, id);
8691 if (ms->Content.size())
8692 {
8693 if (ms->Content.size() > size_t(locale) && !ms->Content[locale].empty())
8694 return &ms->Content[locale];
8695
8696 return &ms->Content[DEFAULT_LOCALE];
8697 }
8698
8699 LOG_ERROR("sql.sql", "Module string module {} id {} not found in DB.", module, id);
8700
8701 return (std::string*)"error";
8702}
Definition: ObjectMgr.h:496
std::vector< std::string > Content
Definition: ObjectMgr.h:497
ModuleString const * GetModuleString(std::string module, uint32 id) const
Definition: ObjectMgr.h:1292

References ModuleString::Content, DEFAULT_LOCALE, GetModuleString(), and LOG_ERROR.

◆ GetNearestTaxiNode()

uint32 ObjectMgr::GetNearestTaxiNode ( float  x,
float  y,
float  z,
uint32  mapid,
uint32  teamId 
)
6541{
6542 bool found = false;
6543 float dist = 10000;
6544 uint32 id = 0;
6545
6546 for (uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i)
6547 {
6548 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(i);
6549
6550 if (!node || node->map_id != mapid || (!node->MountCreatureID[teamId == TEAM_ALLIANCE ? 1 : 0] && node->MountCreatureID[0] != 32981)) // dk flight
6551 continue;
6552
6553 uint8 field = (uint8)((i - 1) / 32);
6554 uint32 submask = 1 << ((i - 1) % 32);
6555
6556 // skip not taxi network nodes
6557 if (field >= TaxiMaskSize || (sTaxiNodesMask[field] & submask) == 0)
6558 {
6559 continue;
6560 }
6561
6562 float dist2 = (node->x - x) * (node->x - x) + (node->y - y) * (node->y - y) + (node->z - z) * (node->z - z);
6563 if (found)
6564 {
6565 if (dist2 < dist)
6566 {
6567 dist = dist2;
6568 id = i;
6569 }
6570 }
6571 else
6572 {
6573 found = true;
6574 dist = dist2;
6575 id = i;
6576 }
6577 }
6578
6579 return id;
6580}
static constexpr std::size_t TaxiMaskSize
Definition: DBCStructure.h:2247
@ TEAM_ALLIANCE
Definition: SharedDefines.h:760
TaxiMask sTaxiNodesMask
Definition: DBCStores.cpp:176
DBCStorage< TaxiNodesEntry > sTaxiNodesStore(TaxiNodesEntryfmt)
Definition: DBCStructure.h:1952
float z
Definition: DBCStructure.h:1957
uint32 map_id
Definition: DBCStructure.h:1954
float x
Definition: DBCStructure.h:1955
float y
Definition: DBCStructure.h:1956
uint32 MountCreatureID[2]
Definition: DBCStructure.h:1960

References TaxiNodesEntry::map_id, TaxiNodesEntry::MountCreatureID, sTaxiNodesMask, sTaxiNodesStore, TaxiMaskSize, TEAM_ALLIANCE, TaxiNodesEntry::x, TaxiNodesEntry::y, and TaxiNodesEntry::z.

◆ GetNpcTextLocale()

NpcTextLocale const * ObjectMgr::GetNpcTextLocale ( uint32  entry) const
inline
1282 {
1283 NpcTextLocaleContainer::const_iterator itr = _npcTextLocaleStore.find(entry);
1284 if (itr == _npcTextLocaleStore.end()) return nullptr;
1285 return &itr->second;
1286 }
NpcTextLocaleContainer _npcTextLocaleStore
Definition: ObjectMgr.h:1599

References _npcTextLocaleStore.

◆ GetNpcTrainerSpells()

TrainerSpellData const * ObjectMgr::GetNpcTrainerSpells ( uint32  entry) const
inline
1356 {
1357 CacheTrainerSpellContainer::const_iterator iter = _cacheTrainerSpellStore.find(entry);
1358 if (iter == _cacheTrainerSpellStore.end())
1359 return nullptr;
1360
1361 return &iter->second;
1362 }

References _cacheTrainerSpellStore.

◆ GetNpcVendorItemList()

VendorItemData const * ObjectMgr::GetNpcVendorItemList ( uint32  entry) const
inline
1365 {
1366 CacheVendorItemContainer::const_iterator iter = _cacheVendorItemStore.find(entry);
1367 if (iter == _cacheVendorItemStore.end())
1368 return nullptr;
1369
1370 return &iter->second;
1371 }

References _cacheVendorItemStore.

Referenced by IsVendorItemValid().

◆ GetPageText()

PageText const * ObjectMgr::GetPageText ( uint32  pageEntry)
5797{
5798 PageTextContainer::const_iterator itr = _pageTextStore.find(pageEntry);
5799 if (itr != _pageTextStore.end())
5800 return &(itr->second);
5801
5802 return nullptr;
5803}
PageTextContainer _pageTextStore
Definition: ObjectMgr.h:1526

References _pageTextStore.

Referenced by LoadGameObjectTemplate(), and LoadItemTemplates().

◆ GetPageTextLocale()

PageTextLocale const * ObjectMgr::GetPageTextLocale ( uint32  entry) const
inline
1246 {
1247 PageTextLocaleContainer::const_iterator itr = _pageTextLocaleStore.find(entry);
1248 if (itr == _pageTextLocaleStore.end()) return nullptr;
1249 return &itr->second;
1250 }
PageTextLocaleContainer _pageTextLocaleStore
Definition: ObjectMgr.h:1600

References _pageTextLocaleStore.

◆ GetPetLevelInfo()

PetLevelInfo const * ObjectMgr::GetPetLevelInfo ( uint32  creature_id,
uint8  level 
) const
3638{
3639 if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
3640 level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
3641
3642 PetLevelInfoContainer::const_iterator itr = _petInfoStore.find(creature_id);
3643 if (itr == _petInfoStore.end())
3644 return nullptr;
3645
3646 return &itr->second[level - 1]; // data for level 1 stored in [0] array element, ...
3647}

References _petInfoStore, CONFIG_MAX_PLAYER_LEVEL, and sWorld.

◆ GetPlayerClassInfo()

PlayerClassInfo const * ObjectMgr::GetPlayerClassInfo ( uint32  class_) const
inline
792 {
793 if (class_ >= MAX_CLASSES)
794 return nullptr;
795 return _playerClassInfo[class_];
796 }

References _playerClassInfo, and MAX_CLASSES.

◆ GetPlayerClassLevelInfo()

void ObjectMgr::GetPlayerClassLevelInfo ( uint32  class_,
uint8  level,
PlayerClassLevelInfo info 
) const
4305{
4306 if (level < 1 || class_ >= MAX_CLASSES)
4307 return;
4308
4309 PlayerClassInfo const* pInfo = _playerClassInfo[class_];
4310
4311 if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4312 level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
4313
4314 *info = pInfo->levelInfo[level - 1];
4315}
Definition: Player.h:301

References _playerClassInfo, CONFIG_MAX_PLAYER_LEVEL, PlayerClassInfo::levelInfo, MAX_CLASSES, and sWorld.

◆ GetPlayerInfo()

PlayerInfo const * ObjectMgr::GetPlayerInfo ( uint32  race,
uint32  class_ 
) const
10111{
10112 if (race >= MAX_RACES)
10113 return nullptr;
10114 if (class_ >= MAX_CLASSES)
10115 return nullptr;
10116 PlayerInfo const* info = _playerInfo[race][class_];
10117 if (!info)
10118 return nullptr;
10119 return info;
10120}
Definition: Player.h:340

References _playerInfo, MAX_CLASSES, and MAX_RACES.

◆ GetPlayerLevelInfo()

void ObjectMgr::GetPlayerLevelInfo ( uint32  race,
uint32  class_,
uint8  level,
PlayerLevelInfo info 
) const
4318{
4319 if (level < 1 || race >= MAX_RACES || class_ >= MAX_CLASSES)
4320 return;
4321
4322 PlayerInfo const* pInfo = _playerInfo[race][class_];
4323 if (!pInfo)
4324 return;
4325
4326 if (level <= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4327 *info = pInfo->levelInfo[level - 1];
4328 else
4329 BuildPlayerLevelInfo(race, class_, level, info);
4330}
void BuildPlayerLevelInfo(uint8 race, uint8 class_, uint8 level, PlayerLevelInfo *plinfo) const
Definition: ObjectMgr.cpp:4332

References _playerInfo, BuildPlayerLevelInfo(), CONFIG_MAX_PLAYER_LEVEL, PlayerInfo::levelInfo, MAX_CLASSES, and MAX_RACES.

◆ GetPointOfInterest()

PointOfInterest const * ObjectMgr::GetPointOfInterest ( uint32  id) const
inline
920 {
921 PointOfInterestContainer::const_iterator itr = _pointsOfInterestStore.find(id);
922 if (itr != _pointsOfInterestStore.end())
923 return &itr->second;
924 return nullptr;
925 }
PointOfInterestContainer _pointsOfInterestStore
Definition: ObjectMgr.h:1495

References _pointsOfInterestStore.

Referenced by LoadGossipMenuItems().

◆ GetPointOfInterestLocale()

PointOfInterestLocale const * ObjectMgr::GetPointOfInterestLocale ( uint32  poi_id) const
inline
1264 {
1265 PointOfInterestLocaleContainer::const_iterator itr = _pointOfInterestLocaleStore.find(poi_id);
1266 if (itr == _pointOfInterestLocaleStore.end()) return nullptr;
1267 return &itr->second;
1268 }
PointOfInterestLocaleContainer _pointOfInterestLocaleStore
Definition: ObjectMgr.h:1604

References _pointOfInterestLocaleStore.

◆ GetQuestForAreaTrigger()

uint32 ObjectMgr::GetQuestForAreaTrigger ( uint32  Trigger_ID) const
inline
833 {
834 QuestAreaTriggerContainer::const_iterator itr = _questAreaTriggerStore.find(Trigger_ID);
835 if (itr != _questAreaTriggerStore.end())
836 return itr->second;
837 return 0;
838 }
QuestAreaTriggerContainer _questAreaTriggerStore
Definition: ObjectMgr.h:1479

References _questAreaTriggerStore.

◆ GetQuestGreeting()

QuestGreeting const * ObjectMgr::GetQuestGreeting ( TypeID  type,
uint32  id 
) const
6271{
6272 uint8 typeIndex;
6273 if (type == TYPEID_UNIT)
6274 typeIndex = 0;
6275 else if (type == TYPEID_GAMEOBJECT)
6276 typeIndex = 1;
6277 else
6278 return nullptr;
6279
6280 std::pair<uint32, uint8> pairKey = std::make_pair(id, typeIndex);
6281 QuestGreetingContainer::const_iterator itr = _questGreetingStore.find(pairKey);
6282 if (itr == _questGreetingStore.end())
6283 return nullptr;
6284
6285 return &itr->second;
6286}
@ TYPEID_GAMEOBJECT
Definition: ObjectGuid.h:37
@ TYPEID_UNIT
Definition: ObjectGuid.h:35
QuestGreetingContainer _questGreetingStore
Definition: ObjectMgr.h:1482

References _questGreetingStore, TYPEID_GAMEOBJECT, and TYPEID_UNIT.

◆ GetQuestLocale()

QuestLocale const * ObjectMgr::GetQuestLocale ( uint32  entry) const
inline
1252 {
1253 QuestLocaleContainer::const_iterator itr = _questLocaleStore.find(entry);
1254 if (itr == _questLocaleStore.end()) return nullptr;
1255 return &itr->second;
1256 }
QuestLocaleContainer _questLocaleStore
Definition: ObjectMgr.h:1596

References _questLocaleStore.

◆ GetQuestMoneyReward()

uint32 ObjectMgr::GetQuestMoneyReward ( uint8  level,
uint32  questMoneyDifficulty 
) const
10247{
10248 if (questMoneyDifficulty < MAX_QUEST_MONEY_REWARDS)
10249 {
10250 auto const& itr = _questMoneyRewards.find(level);
10251 if (itr != _questMoneyRewards.end())
10252 {
10253 return itr->second.at(questMoneyDifficulty);
10254 }
10255 }
10256
10257 return 0;
10258}
static constexpr uint32 MAX_QUEST_MONEY_REWARDS
Definition: ObjectMgr.h:715
QuestMoneyRewardStore _questMoneyRewards
Definition: ObjectMgr.h:1624

References _questMoneyRewards, and MAX_QUEST_MONEY_REWARDS.

◆ GetQuestOfferRewardLocale()

QuestOfferRewardLocale const * ObjectMgr::GetQuestOfferRewardLocale ( uint32  entry) const
inline
1270 {
1271 auto itr = _questOfferRewardLocaleStore.find(entry);
1272 if (itr == _questOfferRewardLocaleStore.end()) return nullptr;
1273 return &itr->second;
1274 }
QuestOfferRewardLocaleContainer _questOfferRewardLocaleStore
Definition: ObjectMgr.h:1597

References _questOfferRewardLocaleStore.

◆ GetQuestPOIVector()

QuestPOIVector const * ObjectMgr::GetQuestPOIVector ( uint32  questId)
inline
928 {
929 QuestPOIContainer::const_iterator itr = _questPOIStore.find(questId);
930 if (itr != _questPOIStore.end())
931 return &itr->second;
932 return nullptr;
933 }
QuestPOIContainer _questPOIStore
Definition: ObjectMgr.h:1497

References _questPOIStore.

◆ GetQuestRequestItemsLocale()

QuestRequestItemsLocale const * ObjectMgr::GetQuestRequestItemsLocale ( uint32  entry) const
inline
1276 {
1277 auto itr = _questRequestItemsLocaleStore.find(entry);
1278 if (itr == _questRequestItemsLocaleStore.end()) return nullptr;
1279 return &itr->second;
1280 }
QuestRequestItemsLocaleContainer _questRequestItemsLocaleStore
Definition: ObjectMgr.h:1598

References _questRequestItemsLocaleStore.

◆ GetQuestTemplate()

Quest const * ObjectMgr::GetQuestTemplate ( uint32  quest_id) const
inline
826 {
827 return quest_id < _questTemplatesFast.size() ? _questTemplatesFast[quest_id] : nullptr;
828 }
std::vector< Quest * > _questTemplatesFast
Definition: ObjectMgr.h:1473

References _questTemplatesFast.

Referenced by LoadAccessRequirements(), LoadQuestAreaTriggers(), LoadQuests(), and LoadScripts().

◆ GetQuestTemplates()

QuestMap const & ObjectMgr::GetQuestTemplates ( ) const
inline
830{ return _questTemplates; }

References _questTemplates.

◆ GetRepRewardRate()

RepRewardRate const * ObjectMgr::GetRepRewardRate ( uint32  factionId) const
inline
892 {
893 RepRewardRateContainer::const_iterator itr = _repRewardRateStore.find(factionId);
894 if (itr != _repRewardRateStore.end())
895 return &itr->second;
896
897 return nullptr;
898 }
RepRewardRateContainer _repRewardRateStore
Definition: ObjectMgr.h:1489

References _repRewardRateStore.

◆ GetRepSpilloverTemplate()

RepSpilloverTemplate const * ObjectMgr::GetRepSpilloverTemplate ( uint32  factionId) const
inline
911 {
912 RepSpilloverTemplateContainer::const_iterator itr = _repSpilloverTemplateStore.find(factionId);
913 if (itr != _repSpilloverTemplateStore.end())
914 return &itr->second;
915
916 return nullptr;
917 }
RepSpilloverTemplateContainer _repSpilloverTemplateStore
Definition: ObjectMgr.h:1491

References _repSpilloverTemplateStore.

◆ GetReputationOnKilEntry()

ReputationOnKillEntry const * ObjectMgr::GetReputationOnKilEntry ( uint32  id) const
inline
901 {
902 RepOnKillContainer::const_iterator itr = _repOnKillStore.find(id);
903 if (itr != _repOnKillStore.end())
904 return &itr->second;
905 return nullptr;
906 }
RepOnKillContainer _repOnKillStore
Definition: ObjectMgr.h:1490

References _repOnKillStore.

◆ GetScriptId()

uint32 ObjectMgr::GetScriptId ( std::string const &  name)
9601{
9602 // use binary search to find the script name in the sorted vector
9603 // assume "" is the first element
9604 if (name.empty())
9605 return 0;
9606
9607 ScriptNameContainer::const_iterator itr = std::lower_bound(_scriptNamesStore.begin(), _scriptNamesStore.end(), name);
9608 if (itr == _scriptNamesStore.end() || (*itr != name))
9609 return 0;
9610
9611 return uint32(itr - _scriptNamesStore.begin());
9612}
ScriptNameContainer _scriptNamesStore
Definition: ObjectMgr.h:1514

References _scriptNamesStore.

Referenced by LoadAreaTriggerScripts(), LoadCreatures(), LoadCreatureTemplate(), LoadGameobjects(), LoadGameObjectTemplate(), and LoadSpellScriptNames().

◆ GetScriptName()

std::string const & ObjectMgr::GetScriptName ( uint32  id) const
9595{
9596 static std::string const empty = "";
9597 return (id < _scriptNamesStore.size()) ? _scriptNamesStore[id] : empty;
9598}

References _scriptNamesStore.

Referenced by ValidateSpellScripts().

◆ GetScriptNames()

ScriptNameContainer & ObjectMgr::GetScriptNames ( )
inline
1378{ return _scriptNamesStore; }

References _scriptNamesStore.

◆ GetSpellClickInfoMapBounds()

SpellClickInfoMapBounds ObjectMgr::GetSpellClickInfoMapBounds ( uint32  creature_id) const
inline
1383 {
1384 return _spellClickInfoStore.equal_range(creature_id);
1385 }
SpellClickInfoContainer _spellClickInfoStore
Definition: ObjectMgr.h:1516

References _spellClickInfoStore.

◆ GetSpellScriptsBounds()

SpellScriptsBounds ObjectMgr::GetSpellScriptsBounds ( uint32  spell_id)
8838{
8839 return SpellScriptsBounds(_spellScriptsStore.lower_bound(spell_id), _spellScriptsStore.upper_bound(spell_id));
8840}
std::pair< SpellScriptsContainer::iterator, SpellScriptsContainer::iterator > SpellScriptsBounds
Definition: ObjectMgr.h:388
SpellScriptsContainer _spellScriptsStore
Definition: ObjectMgr.h:1518

References _spellScriptsStore.

◆ GetSummonGroup()

std::vector< TempSummonData > const * ObjectMgr::GetSummonGroup ( uint32  summonerId,
SummonerType  summonerType,
uint8  group 
) const
inline

Gets temp summon data for all creatures of specified group.

Parameters
summonerIdSummoner's entry.
summonerTypeSummoner's type, see SummonerType for available types.
groupId of required group.
Returns
null if group was not found, otherwise reference to the creature group data
1180 {
1181 TempSummonDataContainer::const_iterator itr = _tempSummonDataStore.find(TempSummonGroupKey(summonerId, summonerType, group));
1182 if (itr != _tempSummonDataStore.end())
1183 return &itr->second;
1184
1185 return nullptr;
1186 }
Key for storing temp summon data in TempSummonDataContainer.
Definition: ObjectMgr.h:64
TempSummonDataContainer _tempSummonDataStore
Stores temp summon data grouped by summoner's entry, summoner's type and group id.
Definition: ObjectMgr.h:1589

References _tempSummonDataStore.

◆ GetTaxiMountDisplayId()

uint32 ObjectMgr::GetTaxiMountDisplayId ( uint32  id,
TeamId  teamId,
bool  allowed_alt_team = false 
)
6607{
6608 CreatureModel mountModel;
6609 CreatureTemplate const* mount_info = nullptr;
6610
6611 // select mount creature id
6612 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(id);
6613 if (node)
6614 {
6615 uint32 mount_entry = node->MountCreatureID[teamId == TEAM_ALLIANCE ? 1 : 0];
6616
6617 // Fix for Alliance not being able to use Acherus taxi
6618 // only one mount type for both sides
6619 if (mount_entry == 0 && allowed_alt_team)
6620 {
6621 // Simply reverse the selection. At least one team in theory should have a valid mount ID to choose.
6622 mount_entry = node->MountCreatureID[teamId];
6623 }
6624
6625 mount_info = GetCreatureTemplate(mount_entry);
6626 if (mount_info)
6627 {
6628 CreatureModel const* model = mount_info->GetRandomValidModel();
6629 if (!model)
6630 {
6631 LOG_ERROR("sql.sql", "No displayid found for the taxi mount with the entry {}! Can't load it!", mount_entry);
6632 return 0;
6633 }
6634 mountModel = *model;
6635 }
6636 }
6637
6638 // minfo is not actually used but the mount_id was updated
6639 GetCreatureModelRandomGender(&mountModel, mount_info);
6640
6641 return mountModel.CreatureDisplayID;
6642}
CreatureModel const * GetRandomValidModel() const
Definition: Creature.cpp:126
CreatureModelInfo const * GetCreatureModelRandomGender(CreatureModel *model, CreatureTemplate const *creatureTemplate) const
Definition: ObjectMgr.cpp:1681

References CreatureModel::CreatureDisplayID, GetCreatureModelRandomGender(), GetCreatureTemplate(), CreatureTemplate::GetRandomValidModel(), LOG_ERROR, TaxiNodesEntry::MountCreatureID, sTaxiNodesStore, and TEAM_ALLIANCE.

◆ GetTaxiPath()

void ObjectMgr::GetTaxiPath ( uint32  source,
uint32  destination,
uint32 path,
uint32 cost 
)
6583{
6584 TaxiPathSetBySource::iterator src_i = sTaxiPathSetBySource.find(source);
6585 if (src_i == sTaxiPathSetBySource.end())
6586 {
6587 path = 0;
6588 cost = 0;
6589 return;
6590 }
6591
6592 TaxiPathSetForSource& pathSet = src_i->second;
6593
6594 TaxiPathSetForSource::iterator dest_i = pathSet.find(destination);
6595 if (dest_i == pathSet.end())
6596 {
6597 path = 0;
6598 cost = 0;
6599 return;
6600 }
6601
6602 cost = dest_i->second->price;
6603 path = dest_i->second->ID;
6604}
std::map< uint32, TaxiPathEntry const * > TaxiPathSetForSource
Definition: DBCStructure.h:2241
TaxiPathSetBySource sTaxiPathSetBySource
Definition: DBCStores.cpp:183

References sTaxiPathSetBySource.

◆ GetVehicleAccessoryList()

VehicleAccessoryList const * ObjectMgr::GetVehicleAccessoryList ( Vehicle veh) const
10094{
10095 if (Creature* cre = veh->GetBase()->ToCreature())
10096 {
10097 // Give preference to GUID-based accessories
10098 VehicleAccessoryContainer::const_iterator itr = _vehicleAccessoryStore.find(cre->GetSpawnId());
10099 if (itr != _vehicleAccessoryStore.end())
10100 return &itr->second;
10101 }
10102
10103 // Otherwise return entry-based
10104 VehicleAccessoryContainer::const_iterator itr = _vehicleTemplateAccessoryStore.find(veh->GetCreatureEntry());
10105 if (itr != _vehicleTemplateAccessoryStore.end())
10106 return &itr->second;
10107 return nullptr;
10108}
Creature * ToCreature()
Definition: Object.h:205
Unit * GetBase() const
May be called from scripts.
Definition: Vehicle.h:37
uint32 GetCreatureEntry() const
Definition: Vehicle.h:39
VehicleAccessoryContainer _vehicleAccessoryStore
Definition: ObjectMgr.h:1521
VehicleAccessoryContainer _vehicleTemplateAccessoryStore
Definition: ObjectMgr.h:1520

References _vehicleAccessoryStore, _vehicleTemplateAccessoryStore, Vehicle::GetBase(), Vehicle::GetCreatureEntry(), and Object::ToCreature().

◆ GetVehicleSeatAddon()

VehicleSeatAddon const * ObjectMgr::GetVehicleSeatAddon ( uint32  seatId) const
inline
1437 {
1438 VehicleSeatAddonContainer::const_iterator itr = _vehicleSeatAddonStore.find(seatId);
1439 if (itr == _vehicleSeatAddonStore.end())
1440 return nullptr;
1441
1442 return &itr->second;
1443 }
VehicleSeatAddonContainer _vehicleSeatAddonStore
Definition: ObjectMgr.h:1522

References _vehicleSeatAddonStore.

◆ GetXPForLevel()

uint32 ObjectMgr::GetXPForLevel ( uint8  level) const
7465{
7466 if (level < _playerXPperLevel.size())
7467 return _playerXPperLevel[level];
7468 return 0;
7469}
PlayerXPperLevel _playerXPperLevel
Definition: ObjectMgr.h:1549

References _playerXPperLevel.

◆ InitializeSpellInfoPrecomputedData()

void ObjectMgr::InitializeSpellInfoPrecomputedData ( )
5744{
5745 uint32 limit = sSpellStore.GetNumRows();
5746 for(uint32 i = 0; i <= limit; ++i)
5747 if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i))
5748 {
5749 const_cast<SpellInfo*>(spellInfo)->SetStackableWithRanks(spellInfo->ComputeIsStackableWithRanks());
5750 const_cast<SpellInfo*>(spellInfo)->SetCritCapable(spellInfo->ComputeIsCritCapable());
5751 const_cast<SpellInfo*>(spellInfo)->SetSpellValid(SpellMgr::ComputeIsSpellValid(spellInfo, false));
5752 }
5753}
DBCStorage< SpellEntry > sSpellStore(SpellEntryfmt)

References SpellMgr::ComputeIsSpellValid(), sSpellMgr, and sSpellStore.

◆ instance()

ObjectMgr * ObjectMgr::instance ( )
static
377{
378 static ObjectMgr instance;
379 return &instance;
380}
Definition: ObjectMgr.h:722
static ObjectMgr * instance()
Definition: ObjectMgr.cpp:376

References instance().

Referenced by instance().

◆ IsGameObjectStaticTransport()

bool ObjectMgr::IsGameObjectStaticTransport ( uint32  entry)
10074{
10075 GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
10076 return goinfo && goinfo->type == GAMEOBJECT_TYPE_TRANSPORT;
10077}
@ GAMEOBJECT_TYPE_TRANSPORT
Definition: SharedDefines.h:1571

References GAMEOBJECT_TYPE_TRANSPORT, GetGameObjectTemplate(), and GameObjectTemplate::type.

◆ IsProfanityName()

bool ObjectMgr::IsProfanityName ( std::string_view  name) const
8325{
8326 // pussywizard
8327 if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
8328 return true;
8329
8330 std::wstring wstr;
8331 if (!Utf8toWStr (name, wstr))
8332 return false;
8333
8334 wstrToLower(wstr);
8335
8336 return _profanityNamesStore.find(wstr) != _profanityNamesStore.end();
8337}

References _profanityNamesStore, Utf8toWStr(), and wstrToLower().

Referenced by AddProfanityPlayerName().

◆ IsReservedName()

bool ObjectMgr::IsReservedName ( std::string_view  name) const
8222{
8223 // pussywizard
8224 if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
8225 return true;
8226
8227 std::wstring wstr;
8228 if (!Utf8toWStr (name, wstr))
8229 return false;
8230
8231 wstrToLower(wstr);
8232
8233 return _reservedNamesStore.find(wstr) != _reservedNamesStore.end();
8234}

References _reservedNamesStore, Utf8toWStr(), and wstrToLower().

Referenced by AddReservedPlayerName().

◆ IsTavernAreaTrigger()

bool ObjectMgr::IsTavernAreaTrigger ( uint32  triggerID,
uint32  faction 
) const
inline
841 {
842 auto itr = _tavernAreaTriggerStore.find(triggerID);
843 if (itr != _tavernAreaTriggerStore.end())
844 {
845 return (itr->second & faction) != 0;
846 }
847
848 return false;
849 }
TavernAreaTriggerContainer _tavernAreaTriggerStore
Definition: ObjectMgr.h:1480

References _tavernAreaTriggerStore.

◆ IsTransportMap()

bool ObjectMgr::IsTransportMap ( uint32  mapId) const
inline
1434{ return _transportMaps.count(mapId) != 0; }
std::set< uint32 > _transportMaps
Definition: ObjectMgr.h:1622

References _transportMaps.

◆ IsValidChannelName()

bool ObjectMgr::IsValidChannelName ( std::string const &  name)
static
8498{
8499 std::wstring wname;
8500 if (!Utf8toWStr(name, wname))
8501 return false;
8502
8503 if (wname.size() > MAX_CHANNEL_NAME)
8504 return false;
8505
8506 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_CHANNEL_NAMES);
8507
8508 return isValidString(wname, strictMask, true);
8509}
#define MAX_CHANNEL_NAME
Definition: ObjectMgr.h:687
@ CONFIG_STRICT_CHANNEL_NAMES
Definition: IWorld.h:222

References CONFIG_STRICT_CHANNEL_NAMES, isValidString(), MAX_CHANNEL_NAME, sWorld, and Utf8toWStr().

◆ IsValidCharterName()

bool ObjectMgr::IsValidCharterName ( std::string_view  name)
static
8472{
8473 std::wstring wname;
8474 if (!Utf8toWStr(name, wname))
8475 return false;
8476
8477 if (wname.size() > MAX_CHARTER_NAME)
8478 return false;
8479
8480 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_CHARTER_NAME);
8481 if (wname.size() < minName)
8482 return false;
8483
8484 // Check Reserved Name
8485 if (sObjectMgr->IsReservedName(name))
8486 return false;
8487
8488 // Check Profanity Name
8489 if (sObjectMgr->IsProfanityName(name))
8490 return false;
8491
8492 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_CHARTER_NAMES);
8493
8494 return isValidString(wname, strictMask, true);
8495}
#define MAX_CHARTER_NAME
Definition: ObjectMgr.h:686
@ CONFIG_MIN_CHARTER_NAME
Definition: IWorld.h:225
@ CONFIG_STRICT_CHARTER_NAMES
Definition: IWorld.h:221

References CONFIG_MIN_CHARTER_NAME, CONFIG_STRICT_CHARTER_NAMES, isValidString(), MAX_CHARTER_NAME, sObjectMgr, sWorld, and Utf8toWStr().

Referenced by WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandlePetitionRenameOpcode(), ArenaTeam::SetName(), and Guild::SetName().

◆ IsVendorItemValid()

bool ObjectMgr::IsVendorItemValid ( uint32  vendor_entry,
uint32  item,
int32  maxcount,
uint32  ptime,
uint32  ExtendedCost,
Player player = nullptr,
std::set< uint32 > *  skip_vendors = nullptr,
uint32  ORnpcflag = 0 
) const
9459{
9460 /*
9461 CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(vendor_entry);
9462 if (!cInfo)
9463 {
9464 if (player)
9465 ChatHandler(player->GetSession()).SendSysMessage(LANG_COMMAND_VENDORSELECTION);
9466 else
9467 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have data for not existed creature template (Entry: {}), ignore", vendor_entry);
9468 return false;
9469 }
9470
9471 if (!((cInfo->npcflag | ORnpcflag) & UNIT_NPC_FLAG_VENDOR))
9472 {
9473 if (!skip_vendors || skip_vendors->count(vendor_entry) == 0)
9474 {
9475 if (player)
9476 ChatHandler(player->GetSession()).SendSysMessage(LANG_COMMAND_VENDORSELECTION);
9477 else
9478 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have data for not creature template (Entry: {}) without vendor flag, ignore", vendor_entry);
9479
9480 if (skip_vendors)
9481 skip_vendors->insert(vendor_entry);
9482 }
9483 return false;
9484 }
9485 */
9486
9487 if (!sObjectMgr->GetItemTemplate(item_id))
9488 {
9489 if (player)
9491 else
9492 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` for Vendor (Entry: {}) have in item list non-existed item ({}), ignore", vendor_entry, item_id);
9493 return false;
9494 }
9495
9496 if (ExtendedCost && !sItemExtendedCostStore.LookupEntry(ExtendedCost))
9497 {
9498 if (player)
9500 else
9501 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have Item (Entry: {}) with wrong ExtendedCost ({}) for vendor ({}), ignore", item_id, ExtendedCost, vendor_entry);
9502 return false;
9503 }
9504
9505 if (maxcount > 0 && incrtime == 0)
9506 {
9507 if (player)
9508 ChatHandler(player->GetSession()).PSendSysMessage("MaxCount != 0 ({}) but IncrTime == 0", maxcount);
9509 else
9510 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` has `maxcount` ({}) for item {} of vendor (Entry: {}) but `incrtime`=0, ignore", maxcount, item_id, vendor_entry);
9511 return false;
9512 }
9513 else if (maxcount == 0 && incrtime > 0)
9514 {
9515 if (player)
9516 ChatHandler(player->GetSession()).PSendSysMessage("MaxCount == 0 but IncrTime<>= 0");
9517 else
9518 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` has `maxcount`=0 for item {} of vendor (Entry: {}) but `incrtime`<>0, ignore", item_id, vendor_entry);
9519 return false;
9520 }
9521
9522 VendorItemData const* vItems = GetNpcVendorItemList(vendor_entry);
9523 if (!vItems)
9524 return true; // later checks for non-empty lists
9525
9526 if (vItems->FindItemCostPair(item_id, ExtendedCost))
9527 {
9528 if (player)
9529 ChatHandler(player->GetSession()).PSendSysMessage(LANG_ITEM_ALREADY_IN_LIST, item_id, ExtendedCost);
9530 else
9531 LOG_ERROR("sql.sql", "Table `npc_vendor` has duplicate items {} (with extended cost {}) for vendor (Entry: {}), ignoring", item_id, ExtendedCost, vendor_entry);
9532 return false;
9533 }
9534
9535 return true;
9536}
@ LANG_ITEM_ALREADY_IN_LIST
Definition: Language.h:248
@ LANG_ITEM_NOT_FOUND
Definition: Language.h:245
@ LANG_EXTENDED_COST_NOT_EXIST
Definition: Language.h:372
DBCStorage< ItemExtendedCostEntry > sItemExtendedCostStore(ItemExtendedCostEntryfmt)
Definition: Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:210
VendorItem const * FindItemCostPair(uint32 item_id, uint32 extendedCost) const
Definition: Creature.cpp:110
WorldSession * GetSession() const
Definition: Player.h:1998
VendorItemData const * GetNpcVendorItemList(uint32 entry) const
Definition: ObjectMgr.h:1364

References VendorItemData::FindItemCostPair(), GetNpcVendorItemList(), Player::GetSession(), LANG_EXTENDED_COST_NOT_EXIST, LANG_ITEM_ALREADY_IN_LIST, LANG_ITEM_NOT_FOUND, LOG_ERROR, ChatHandler::PSendSysMessage(), sItemExtendedCostStore, and sObjectMgr.

Referenced by LoadReferenceVendor(), and LoadVendors().

◆ LoadAccessRequirements()

void ObjectMgr::LoadAccessRequirements ( )
6756{
6757 uint32 oldMSTime = getMSTime();
6758
6759 if (!_accessRequirementStore.empty())
6760 {
6761 for (DungeonProgressionRequirementsContainer::iterator itr = _accessRequirementStore.begin(); itr != _accessRequirementStore.end(); ++itr)
6762 {
6763 std::unordered_map<uint8, DungeonProgressionRequirements*> difficulties = itr->second;
6764 for (auto difficultiesItr = difficulties.begin(); difficultiesItr != difficulties.end(); ++difficultiesItr)
6765 {
6766 for (auto questItr = difficultiesItr->second->quests.begin(); questItr != difficultiesItr->second->quests.end(); ++questItr)
6767 {
6768 delete* questItr;
6769 }
6770
6771 for (auto achievementItr = difficultiesItr->second->achievements.begin(); achievementItr != difficultiesItr->second->achievements.end(); ++achievementItr)
6772 {
6773 delete* achievementItr;
6774 }
6775
6776 for (auto itemsItr = difficultiesItr->second->items.begin(); itemsItr != difficultiesItr->second->items.end(); ++itemsItr)
6777 {
6778 delete* itemsItr;
6779 }
6780
6781 delete difficultiesItr->second;
6782 }
6783 }
6784
6785 _accessRequirementStore.clear(); // need for reload case
6786 }
6787 // 0 1 2 3 4 5
6788 QueryResult access_template_result = WorldDatabase.Query("SELECT id, map_id, difficulty, min_level, max_level, min_avg_item_level FROM dungeon_access_template");
6789 if (!access_template_result)
6790 {
6791 LOG_WARN("server.loading", ">> Loaded 0 access requirement definitions. DB table `dungeon_access_template` is empty.");
6792 LOG_INFO("server.loading", " ");
6793 return;
6794 }
6795
6796 uint32 count = 0;
6797 uint32 countProgressionRequirements = 0;
6798
6799 do
6800 {
6801 Field* fields = access_template_result->Fetch();
6802
6803 //Get the common variables for the access requirements
6804 uint8 dungeon_access_id = fields[0].Get<uint8>();
6805 uint32 mapid = fields[1].Get<uint32>();
6806 uint8 difficulty = fields[2].Get<uint8>();
6807
6808 //Set up the access requirements
6810 ar->levelMin = fields[3].Get<uint8>();
6811 ar->levelMax = fields[4].Get<uint8>();
6812 ar->reqItemLevel = fields[5].Get<uint16>();
6813
6814 // 0 1 2 3 4 6
6815 QueryResult progression_requirements_results = WorldDatabase.Query("SELECT requirement_type, requirement_id, requirement_note, faction, priority, leader_only FROM dungeon_access_requirements where dungeon_access_id = {}", dungeon_access_id);
6816 if (progression_requirements_results)
6817 {
6818 do
6819 {
6820 Field* progression_requirement_row = progression_requirements_results->Fetch();
6821
6822 const uint8 requirement_type = progression_requirement_row[0].Get<uint8>();
6823 const uint32 requirement_id = progression_requirement_row[1].Get<uint32>();
6824 const std::string requirement_note = progression_requirement_row[2].Get<std::string>();
6825 const uint8 requirement_faction = progression_requirement_row[3].Get<uint8>();
6826 const uint8 requirement_priority = progression_requirement_row[4].IsNull() ? UINT8_MAX : progression_requirement_row[4].Get<uint8>();
6827 const bool requirement_checkLeaderOnly = progression_requirement_row[5].Get<bool>();
6828
6829 ProgressionRequirement* progression_requirement = new ProgressionRequirement();
6830 progression_requirement->id = requirement_id;
6831 progression_requirement->note = requirement_note;
6832 progression_requirement->faction = (TeamId)requirement_faction;
6833 progression_requirement->priority = requirement_priority;
6834 progression_requirement->checkLeaderOnly = requirement_checkLeaderOnly;
6835
6836 std::vector<ProgressionRequirement*>* currentRequirementsList = nullptr;
6837
6838 switch (requirement_type)
6839 {
6840 case 0:
6841 {
6842 //Achievement
6843 if (!sAchievementStore.LookupEntry(progression_requirement->id))
6844 {
6845 LOG_ERROR("sql.sql", "Required achievement {} for faction {} does not exist for map {} difficulty {}, remove or fix this achievement requirement.", progression_requirement->id, requirement_faction, mapid, difficulty);
6846 break;
6847 }
6848
6849 currentRequirementsList = &ar->achievements;
6850 break;
6851 }
6852 case 1:
6853 {
6854 //Quest
6855 if (!GetQuestTemplate(progression_requirement->id))
6856 {
6857 LOG_ERROR("sql.sql", "Required quest {} for faction {} does not exist for map {} difficulty {}, remove or fix this quest requirement.", progression_requirement->id, requirement_faction, mapid, difficulty);
6858 break;
6859 }
6860
6861 currentRequirementsList = &ar->quests;
6862 break;
6863 }
6864 case 2:
6865 {
6866 //Item
6867 ItemTemplate const* pProto = GetItemTemplate(progression_requirement->id);
6868 if (!pProto)
6869 {
6870 LOG_ERROR("sql.sql", "Required item {} for faction {} does not exist for map {} difficulty {}, remove or fix this item requirement.", progression_requirement->id, requirement_faction, mapid, difficulty);
6871 break;
6872 }
6873
6874 currentRequirementsList = &ar->items;
6875 break;
6876 }
6877 default:
6878 LOG_ERROR("sql.sql", "requirement_type of {} is not valid for map {} difficulty {}. Please use 0 for achievements, 1 for quest, 2 for items or remove this entry from the db.", requirement_type, mapid, difficulty);
6879 break;
6880 }
6881
6882 //Check if array is valid and delete the progression requirement
6883 if (!currentRequirementsList)
6884 {
6885 delete progression_requirement;
6886 continue;
6887 }
6888
6889 //Insert into the array
6890 if (currentRequirementsList->size() > requirement_priority)
6891 {
6892 currentRequirementsList->insert(currentRequirementsList->begin() + requirement_priority, progression_requirement);
6893 }
6894 else
6895 {
6896 currentRequirementsList->push_back(progression_requirement);
6897 }
6898
6899 } while (progression_requirements_results->NextRow());
6900 }
6901
6902 //Sort all arrays for priority
6903 auto sortFunction = [](const ProgressionRequirement* const a, const ProgressionRequirement* const b) {return a->priority > b->priority; };
6904 std::sort(ar->achievements.begin(), ar->achievements.end(), sortFunction);
6905 std::sort(ar->quests.begin(), ar->quests.end(), sortFunction);
6906 std::sort(ar->items.begin(), ar->items.end(), sortFunction);
6907
6908 countProgressionRequirements += ar->achievements.size();
6909 countProgressionRequirements += ar->quests.size();
6910 countProgressionRequirements += ar->items.size();
6911 count++;
6912
6913 _accessRequirementStore[mapid][difficulty] = ar;
6914 } while (access_template_result->NextRow());
6915
6916 LOG_INFO("server.loading", ">> Loaded {} Rows From dungeon_access_template And {} Rows From dungeon_access_requirements in {} ms", count, countProgressionRequirements, GetMSTimeDiffToNow(oldMSTime));
6917 LOG_INFO("server.loading", " ");
6918}
#define LOG_WARN(filterType__,...)
Definition: Log.h:161
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition: Timer.h:131
uint32 getMSTime()
Definition: Timer.h:103
TeamId
Definition: SharedDefines.h:759
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
std::shared_ptr< ResultSet > QueryResult
Definition: DatabaseEnvFwd.h:27
Class used to access individual fields of database query result.
Definition: Field.h:98
bool IsNull() const
Definition: Field.h:106
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition: Field.h:112
Definition: ItemTemplate.h:619
Definition: Player.h:938
uint32 priority
Definition: Player.h:942
Definition: Player.h:947
ItemTemplate const * GetItemTemplate(uint32 entry)
Definition: ObjectMgr.cpp:3271
Quest const * GetQuestTemplate(uint32 quest_id) const
Definition: ObjectMgr.h:825

References _accessRequirementStore, Field::Get(), GetItemTemplate(), getMSTime(), GetMSTimeDiffToNow(), GetQuestTemplate(), Field::IsNull(), LOG_ERROR, LOG_INFO, LOG_WARN, ProgressionRequirement::priority, sAchievementStore, and WorldDatabase.

◆ LoadAcoreStrings()

bool ObjectMgr::LoadAcoreStrings ( )
8705{
8706 uint32 oldMSTime = getMSTime();
8707
8708 _acoreStringStore.clear(); // for reload case
8709 QueryResult result = WorldDatabase.Query("SELECT entry, content_default, locale_koKR, locale_frFR, locale_deDE, locale_zhCN, locale_zhTW, locale_esES, locale_esMX, locale_ruRU FROM acore_string");
8710 if (!result)
8711 {
8712 LOG_WARN("server.loading", ">> Loaded 0 acore strings. DB table `acore_strings` is empty.");
8713 LOG_INFO("server.loading", " ");
8714 return false;
8715 }
8716
8717 do
8718 {
8719 Field* fields = result->Fetch();
8720
8721 uint32 entry = fields[0].Get<uint32>();
8722
8723 AcoreString& data = _acoreStringStore[entry];
8724
8725 data.Content.resize(DEFAULT_LOCALE + 1);
8726
8727 for (uint8 i = 0; i < TOTAL_LOCALES; ++i)
8728 AddLocaleString(fields[i + 1].Get<std::string>(), LocaleConstant(i), data.Content);
8729 } while (result->NextRow());
8730
8731 LOG_INFO("server.loading", ">> Loaded {} Acore Strings in {} ms", (uint32)_acoreStringStore.size(), GetMSTimeDiffToNow(oldMSTime));
8732 LOG_INFO("server.loading", " ");
8733
8734 return true;
8735}
LocaleConstant
Definition: Common.h:65
@ TOTAL_LOCALES
Definition: Common.h:76
static void AddLocaleString(std::string &&s, LocaleConstant locale, std::vector< std::string > &data)
Definition: ObjectMgr.cpp:382

References _acoreStringStore, AddLocaleString(), DEFAULT_LOCALE, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_INFO, LOG_WARN, TOTAL_LOCALES, and WorldDatabase.

◆ LoadAreaTriggers()

void ObjectMgr::LoadAreaTriggers ( )
6645{
6646 uint32 oldMSTime = getMSTime();
6647
6648 _areaTriggerStore.clear();
6649
6650 QueryResult result = WorldDatabase.Query("SELECT entry, map, x, y, z, radius, length, width, height, orientation FROM areatrigger");
6651
6652 if (!result)
6653 {
6654 LOG_WARN("server.loading", ">> Loaded 0 area trigger definitions. DB table `areatrigger` is empty.");
6655 LOG_INFO("server.loading", " ");
6656 return;
6657 }
6658
6659 uint32 count = 0;
6660
6661 do
6662 {
6663 Field* fields = result->Fetch();
6664
6665 ++count;
6666
6667 AreaTrigger at;
6668
6669 at.entry = fields[0].Get<uint32>();
6670 at.map = fields[1].Get<uint32>();
6671 at.x = fields[2].Get<float>();
6672 at.y = fields[3].Get<float>();
6673 at.z = fields[4].Get<float>();
6674 at.radius = fields[5].Get<float>();
6675 at.length = fields[6].Get<float>();
6676 at.width = fields[7].Get<float>();
6677 at.height = fields[8].Get<float>();
6678 at.orientation = fields[9].Get<float>();
6679
6680 MapEntry const* mapEntry = sMapStore.LookupEntry(at.map);
6681 if (!mapEntry)
6682 {
6683 LOG_ERROR("sql.sql", "Area trigger (ID:{}) map (ID: {}) does not exist in `Map.dbc`.", at.entry, at.map);
6684 continue;
6685 }
6686
6687 _areaTriggerStore[at.entry] = at;
6688 } while (result->NextRow());
6689
6690 LOG_INFO("server.loading", ">> Loaded {} Area Trigger Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6691 LOG_INFO("server.loading", " ");
6692}
float height
Definition: ObjectMgr.h:429
float x
Definition: ObjectMgr.h:423
float y
Definition: ObjectMgr.h:424
float orientation
Definition: ObjectMgr.h:430
float length
Definition: ObjectMgr.h:427
uint32 entry
Definition: ObjectMgr.h:421
float radius
Definition: ObjectMgr.h:426
float z
Definition: ObjectMgr.h:425
float width
Definition: ObjectMgr.h:428

References _areaTriggerStore, AreaTrigger::entry, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), AreaTrigger::height, AreaTrigger::length, LOG_ERROR, LOG_INFO, LOG_WARN, AreaTrigger::map, AreaTrigger::orientation, AreaTrigger::radius, sMapStore, AreaTrigger::width, WorldDatabase, AreaTrigger::x, AreaTrigger::y, and AreaTrigger::z.

◆ LoadAreaTriggerScripts()

void ObjectMgr::LoadAreaTriggerScripts ( )
6503{
6504 uint32 oldMSTime = getMSTime();
6505
6506 _areaTriggerScriptStore.clear(); // need for reload case
6507 QueryResult result = WorldDatabase.Query("SELECT entry, ScriptName FROM areatrigger_scripts");
6508
6509 if (!result)
6510 {
6511 LOG_WARN("server.loading", ">> Loaded 0 Areatrigger Scripts. DB Table `areatrigger_scripts` Is Empty.");
6512 LOG_INFO("server.loading", " ");
6513 return;
6514 }
6515
6516 uint32 count = 0;
6517
6518 do
6519 {
6520 ++count;
6521
6522 Field* fields = result->Fetch();
6523
6524 uint32 Trigger_ID = fields[0].Get<uint32>();
6525 std::string scriptName = fields[1].Get<std::string>();
6526
6527 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6528 if (!atEntry)
6529 {
6530 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6531 continue;
6532 }
6533 _areaTriggerScriptStore[Trigger_ID] = GetScriptId(scriptName);
6534 } while (result->NextRow());
6535
6536 LOG_INFO("server.loading", ">> Loaded {} Areatrigger Scripts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6537 LOG_INFO("server.loading", " ");
6538}
uint32 GetScriptId(std::string const &name)
Definition: ObjectMgr.cpp:9600

References _areaTriggerScriptStore, Field::Get(), GetAreaTrigger(), getMSTime(), GetMSTimeDiffToNow(), GetScriptId(), LOG_ERROR, LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadAreaTriggerTeleports()

void ObjectMgr::LoadAreaTriggerTeleports ( )
6695{
6696 uint32 oldMSTime = getMSTime();
6697
6698 _areaTriggerTeleportStore.clear(); // need for reload case
6699
6700 // 0 1 2 3 4 5
6701 QueryResult result = WorldDatabase.Query("SELECT ID, target_map, target_position_x, target_position_y, target_position_z, target_orientation FROM areatrigger_teleport");
6702
6703 if (!result)
6704 {
6705 LOG_WARN("server.loading", ">> Loaded 0 area trigger teleport definitions. DB table `areatrigger_teleport` is empty.");
6706 LOG_INFO("server.loading", " ");
6707 return;
6708 }
6709
6710 uint32 count = 0;
6711
6712 do
6713 {
6714 Field* fields = result->Fetch();
6715
6716 ++count;
6717
6718 uint32 Trigger_ID = fields[0].Get<uint32>();
6719
6721
6722 at.target_mapId = fields[1].Get<uint16>();
6723 at.target_X = fields[2].Get<float>();
6724 at.target_Y = fields[3].Get<float>();
6725 at.target_Z = fields[4].Get<float>();
6726 at.target_Orientation = fields[5].Get<float>();
6727
6728 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6729 if (!atEntry)
6730 {
6731 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6732 continue;
6733 }
6734
6735 MapEntry const* mapEntry = sMapStore.LookupEntry(at.target_mapId);
6736 if (!mapEntry)
6737 {
6738 LOG_ERROR("sql.sql", "Area trigger (ID:{}) target map (ID: {}) does not exist in `Map.dbc`.", Trigger_ID, at.target_mapId);
6739 continue;
6740 }
6741
6742 if (at.target_X == 0 && at.target_Y == 0 && at.target_Z == 0)
6743 {
6744 LOG_ERROR("sql.sql", "Area trigger (ID:{}) target coordinates not provided.", Trigger_ID);
6745 continue;
6746 }
6747
6748 _areaTriggerTeleportStore[Trigger_ID] = at;
6749 } while (result->NextRow());
6750
6751 LOG_INFO("server.loading", ">> Loaded {} Area Trigger Teleport Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6752 LOG_INFO("server.loading", " ");
6753}
Definition: ObjectMgr.h:411
uint32 target_mapId
Definition: ObjectMgr.h:412

References _areaTriggerTeleportStore, Field::Get(), GetAreaTrigger(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sMapStore, AreaTriggerTeleport::target_mapId, and WorldDatabase.

◆ LoadBroadcastTextLocales()

void ObjectMgr::LoadBroadcastTextLocales ( )
9700{
9701 uint32 oldMSTime = getMSTime();
9702
9703 // 0 1 2 3
9704 QueryResult result = WorldDatabase.Query("SELECT ID, locale, MaleText, FemaleText FROM broadcast_text_locale");
9705
9706 if (!result)
9707 {
9708 LOG_WARN("server.loading", ">> Loaded 0 broadcast text locales. DB table `broadcast_text_locale` is empty.");
9709 LOG_INFO("server.loading", " ");
9710 return;
9711 }
9712
9713 uint32 locales_count = 0;
9714 do
9715 {
9716 Field* fields = result->Fetch();
9717
9718 uint32 id = fields[0].Get<uint32>();
9719
9720 BroadcastTextContainer::iterator bct = _broadcastTextStore.find(id);
9721 if (bct == _broadcastTextStore.end())
9722 {
9723 LOG_ERROR("sql.sql", "BroadcastText (Id: {}) found in table `broadcast_text_locale` but does not exist in `broadcast_text`. Skipped!", id);
9724 continue;
9725 }
9726
9727 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
9728 if (locale == LOCALE_enUS)
9729 continue;
9730
9731 AddLocaleString(fields[2].Get<std::string>(), locale, bct->second.MaleText);
9732 AddLocaleString(fields[3].Get<std::string>(), locale, bct->second.FemaleText);
9733 locales_count++;
9734 } while (result->NextRow());
9735
9736 LOG_INFO("server.loading", ">> Loaded {} Broadcast Text Locales in {} ms", locales_count, GetMSTimeDiffToNow(oldMSTime));
9737 LOG_INFO("server.loading", " ");
9738}
LocaleConstant GetLocaleByName(const std::string &name)
Definition: Common.cpp:33

References _broadcastTextStore, AddLocaleString(), Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_ERROR, LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadBroadcastTexts()

void ObjectMgr::LoadBroadcastTexts ( )
9615{
9616 uint32 oldMSTime = getMSTime();
9617
9618 _broadcastTextStore.clear(); // for reload case
9619
9620 // 0 1 2 3 4 5 6 7 8 9 10 11 12
9621 QueryResult result = WorldDatabase.Query("SELECT ID, LanguageID, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3, SoundEntriesID, EmotesID, Flags FROM broadcast_text");
9622 if (!result)
9623 {
9624 LOG_WARN("server.loading", ">> Loaded 0 broadcast texts. DB table `broadcast_text` is empty.");
9625 LOG_INFO("server.loading", " ");
9626 return;
9627 }
9628
9629 _broadcastTextStore.rehash(result->GetRowCount());
9630
9631 do
9632 {
9633 Field* fields = result->Fetch();
9634
9635 BroadcastText bct;
9636
9637 bct.Id = fields[0].Get<uint32>();
9638 bct.LanguageID = fields[1].Get<uint32>();
9639 bct.MaleText[DEFAULT_LOCALE] = fields[2].Get<std::string>();
9640 bct.FemaleText[DEFAULT_LOCALE] = fields[3].Get<std::string>();
9641 bct.EmoteId1 = fields[4].Get<uint32>();
9642 bct.EmoteId2 = fields[5].Get<uint32>();
9643 bct.EmoteId3 = fields[6].Get<uint32>();
9644 bct.EmoteDelay1 = fields[7].Get<uint32>();
9645 bct.EmoteDelay2 = fields[8].Get<uint32>();
9646 bct.EmoteDelay3 = fields[9].Get<uint32>();
9647 bct.SoundEntriesId = fields[10].Get<uint32>();
9648 bct.EmotesID = fields[11].Get<uint32>();
9649 bct.Flags = fields[12].Get<uint32>();
9650
9651 if (bct.SoundEntriesId)
9652 {
9653 if (!sSoundEntriesStore.LookupEntry(bct.SoundEntriesId))
9654 {
9655 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has SoundEntriesId {} but sound does not exist.", bct.Id, bct.SoundEntriesId);
9656 bct.SoundEntriesId = 0;
9657 }
9658 }
9659
9661 {
9662 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` using Language {} but Language does not exist.", bct.Id, bct.LanguageID);
9664 }
9665
9666 if (bct.EmoteId1)
9667 {
9668 if (!sEmotesStore.LookupEntry(bct.EmoteId1))
9669 {
9670 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId1 {} but emote does not exist.", bct.Id, bct.EmoteId1);
9671 bct.EmoteId1 = 0;
9672 }
9673 }
9674
9675 if (bct.EmoteId2)
9676 {
9677 if (!sEmotesStore.LookupEntry(bct.EmoteId2))
9678 {
9679 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId2 {} but emote does not exist.", bct.Id, bct.EmoteId2);
9680 bct.EmoteId2 = 0;
9681 }
9682 }
9683
9684 if (bct.EmoteId3)
9685 {
9686 if (!sEmotesStore.LookupEntry(bct.EmoteId3))
9687 {
9688 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId3 {} but emote does not exist.", bct.Id, bct.EmoteId3);
9689 bct.EmoteId3 = 0;
9690 }
9691 }
9692
9693 _broadcastTextStore[bct.Id] = bct;
9694 } while (result->NextRow());
9695
9696 LOG_INFO("server.loading", ">> Loaded {} Broadcast Texts in {} ms", _broadcastTextStore.size(), GetMSTimeDiffToNow(oldMSTime));
9697}
@ LANG_UNIVERSAL
Definition: SharedDefines.h:735
LanguageDesc const * GetLanguageDescByID(uint32 lang)
Definition: ObjectMgr.cpp:253
DBCStorage< SoundEntriesEntry > sSoundEntriesStore(SoundEntriesfmt)
DBCStorage< EmotesEntry > sEmotesStore(EmotesEntryfmt)
Definition: ObjectMgr.h:434
uint32 EmoteDelay2
Definition: ObjectMgr.h:449
uint32 Id
Definition: ObjectMgr.h:441
std::vector< std::string > FemaleText
Definition: ObjectMgr.h:444
uint32 EmotesID
Definition: ObjectMgr.h:452
uint32 LanguageID
Definition: ObjectMgr.h:442
uint32 EmoteId2
Definition: ObjectMgr.h:446
uint32 EmoteDelay1
Definition: ObjectMgr.h:448
uint32 SoundEntriesId
Definition: ObjectMgr.h:451
std::vector< std::string > MaleText
Definition: ObjectMgr.h:443
uint32 EmoteId3
Definition: ObjectMgr.h:447
uint32 EmoteId1
Definition: ObjectMgr.h:445
uint32 EmoteDelay3
Definition: ObjectMgr.h:450
uint32 Flags
Definition: ObjectMgr.h:453

References _broadcastTextStore, DEFAULT_LOCALE, BroadcastText::EmoteDelay1, BroadcastText::EmoteDelay2, BroadcastText::EmoteDelay3, BroadcastText::EmoteId1, BroadcastText::EmoteId2, BroadcastText::EmoteId3, BroadcastText::EmotesID, BroadcastText::FemaleText, BroadcastText::Flags, Field::Get(), GetLanguageDescByID(), getMSTime(), GetMSTimeDiffToNow(), BroadcastText::Id, LANG_UNIVERSAL, BroadcastText::LanguageID, LOG_DEBUG, LOG_INFO, LOG_WARN, BroadcastText::MaleText, sEmotesStore, BroadcastText::SoundEntriesId, sSoundEntriesStore, and WorldDatabase.

◆ LoadCreatureAddons()

void ObjectMgr::LoadCreatureAddons ( )
1273{
1274 uint32 oldMSTime = getMSTime();
1275
1276 // 0 1 2 3 4 5 6 7
1277 QueryResult result = WorldDatabase.Query("SELECT guid, path_id, mount, bytes1, bytes2, emote, visibilityDistanceType, auras FROM creature_addon");
1278
1279 if (!result)
1280 {
1281 LOG_WARN("server.loading", ">> Loaded 0 creature addon definitions. DB table `creature_addon` is empty.");
1282 LOG_INFO("server.loading", " ");
1283 return;
1284 }
1285
1286 uint32 count = 0;
1287 do
1288 {
1289 Field* fields = result->Fetch();
1290
1291 ObjectGuid::LowType guid = fields[0].Get<uint32>();
1292
1293 CreatureData const* creData = GetCreatureData(guid);
1294 if (!creData)
1295 {
1296 LOG_ERROR("sql.sql", "Creature (GUID: {}) does not exist but has a record in `creature_addon`", guid);
1297 continue;
1298 }
1299
1300 CreatureAddon& creatureAddon = _creatureAddonStore[guid];
1301
1302 creatureAddon.path_id = fields[1].Get<uint32>();
1303 if (creData->movementType == WAYPOINT_MOTION_TYPE && !creatureAddon.path_id)
1304 {
1305 const_cast<CreatureData*>(creData)->movementType = IDLE_MOTION_TYPE;
1306 LOG_ERROR("sql.sql", "Creature (GUID {}) has movement type set to WAYPOINT_MOTION_TYPE but no path assigned", guid);
1307 }
1308
1309 creatureAddon.mount = fields[2].Get<uint32>();
1310 creatureAddon.bytes1 = fields[3].Get<uint32>();
1311 creatureAddon.bytes2 = fields[4].Get<uint32>();
1312 creatureAddon.emote = fields[5].Get<uint32>();
1313 creatureAddon.visibilityDistanceType = VisibilityDistanceType(fields[6].Get<uint8>());
1314
1315 for (std::string_view aura : Acore::Tokenize(fields[7].Get<std::string_view>(), ' ', false))
1316 {
1317 SpellInfo const* spellInfo = nullptr;
1318
1319 if (Optional<uint32> spellId = Acore::StringTo<uint32>(aura))
1320 {
1321 spellInfo = sSpellMgr->GetSpellInfo(*spellId);
1322 }
1323
1324 if (!spellInfo)
1325 {
1326 LOG_ERROR("sql.sql", "Creature (GUID: {}) has wrong spell '{}' defined in `auras` field in `creature_addon`.", guid, aura);
1327 continue;
1328 }
1329
1330 if (std::find(creatureAddon.auras.begin(), creatureAddon.auras.end(), spellInfo->Id) != creatureAddon.auras.end())
1331 {
1332 LOG_ERROR("sql.sql", "Creature (GUID: {}) has duplicate aura (spell {}) in `auras` field in `creature_addon`.", guid, spellInfo->Id);
1333 continue;
1334 }
1335
1336 if (spellInfo->GetDuration() > 0)
1337 {
1338 LOG_DEBUG/*ERROR*/("sql.sql", "Creature (Entry: {}) has temporary aura (spell {}) in `auras` field in `creature_template_addon`.", guid, spellInfo->Id);
1339 // continue;
1340 }
1341
1342 creatureAddon.auras.push_back(spellInfo->Id);
1343 }
1344
1345 if (creatureAddon.mount)
1346 {
1347 if (!sCreatureDisplayInfoStore.LookupEntry(creatureAddon.mount))
1348 {
1349 LOG_ERROR("sql.sql", "Creature (GUID: {}) has invalid displayInfoId ({}) for mount defined in `creature_addon`", guid, creatureAddon.mount);
1350 creatureAddon.mount = 0;
1351 }
1352 }
1353
1354 if (!sEmotesStore.LookupEntry(creatureAddon.emote))
1355 {
1356 LOG_ERROR("sql.sql", "Creature (GUID: {}) has invalid emote ({}) defined in `creature_addon`.", guid, creatureAddon.emote);
1357 creatureAddon.emote = 0;
1358 }
1359
1360 if (creatureAddon.visibilityDistanceType >= VisibilityDistanceType::Max)
1361 {
1362 LOG_ERROR("sql.sql", "Creature (GUID: {}) has invalid visibilityDistanceType ({}) defined in `creature_addon`.", guid, AsUnderlyingType(creatureAddon.visibilityDistanceType));
1363 creatureAddon.visibilityDistanceType = VisibilityDistanceType::Normal;
1364 }
1365
1366 ++count;
1367 } while (result->NextRow());
1368
1369 LOG_INFO("server.loading", ">> Loaded {} Creature Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1370 LOG_INFO("server.loading", " ");
1371}
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:24
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:619
VisibilityDistanceType
Definition: ObjectDefines.h:61
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
@ WAYPOINT_MOTION_TYPE
Definition: MotionMaster.h:41
std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
Definition: Tokenize.cpp:20
Definition: CreatureData.h:440
std::vector< uint32 > auras
Definition: CreatureData.h:446
uint32 mount
Definition: CreatureData.h:442
uint32 emote
Definition: CreatureData.h:445
uint32 path_id
Definition: CreatureData.h:441
VisibilityDistanceType visibilityDistanceType
Definition: CreatureData.h:447
uint32 bytes1
Definition: CreatureData.h:443
uint32 bytes2
Definition: CreatureData.h:444
uint32 Id
Definition: SpellInfo.h:320
int32 GetDuration() const
Definition: SpellInfo.cpp:2338

References _creatureAddonStore, AsUnderlyingType(), CreatureAddon::auras, CreatureAddon::bytes1, CreatureAddon::bytes2, CreatureAddon::emote, Field::Get(), GetCreatureData(), SpellInfo::GetDuration(), getMSTime(), GetMSTimeDiffToNow(), SpellInfo::Id, IDLE_MOTION_TYPE, LOG_DEBUG, LOG_ERROR, LOG_INFO, LOG_WARN, CreatureAddon::mount, CreatureAddon::path_id, sCreatureDisplayInfoStore, sEmotesStore, sSpellMgr, Acore::Tokenize(), CreatureAddon::visibilityDistanceType, WAYPOINT_MOTION_TYPE, and WorldDatabase.

◆ LoadCreatureClassLevelStats()

void ObjectMgr::LoadCreatureClassLevelStats ( )
9767{
9768 uint32 oldMSTime = getMSTime();
9769
9770 QueryResult result = WorldDatabase.Query("SELECT level, class, basehp0, basehp1, basehp2, basemana, basearmor, attackpower, rangedattackpower, damage_base, damage_exp1, damage_exp2 FROM creature_classlevelstats");
9771
9772 if (!result)
9773 {
9774 LOG_WARN("server.loading", ">> Loaded 0 creature base stats. DB table `creature_classlevelstats` is empty.");
9775 LOG_INFO("server.loading", " ");
9776 return;
9777 }
9778
9779 uint32 count = 0;
9780 do
9781 {
9782 Field* fields = result->Fetch();
9783
9784 uint8 Level = fields[0].Get<uint8>();
9785 uint8 Class = fields[1].Get<uint8>();
9786
9787 if (!Class || ((1 << (Class - 1)) & CLASSMASK_ALL_CREATURES) == 0)
9788 LOG_ERROR("sql.sql", "Creature base stats for level {} has invalid class {}", Level, Class);
9789
9790 CreatureBaseStats stats;
9791
9792 for (uint8 i = 0; i < MAX_EXPANSIONS; ++i)
9793 {
9794 stats.BaseHealth[i] = fields[2 + i].Get<uint32>();
9795
9796 if (stats.BaseHealth[i] == 0)
9797 {
9798 LOG_ERROR("sql.sql", "Creature base stats for class {}, level {} has invalid zero base HP[{}] - set to 1", Class, Level, i);
9799 stats.BaseHealth[i] = 1;
9800 }
9801
9802 // xinef: if no data is available, get them from lower expansions
9803 if (stats.BaseHealth[i] <= 1)
9804 {
9805 for (uint8 j = i; j > 0;)
9806 {
9807 --j;
9808 if (stats.BaseHealth[j] > 1)
9809 {
9810 stats.BaseHealth[i] = stats.BaseHealth[j];
9811 break;
9812 }
9813 }
9814 }
9815
9816 stats.BaseDamage[i] = fields[9 + i].Get<float>();
9817 if (stats.BaseDamage[i] < 0.0f)
9818 {
9819 LOG_ERROR("sql.sql", "Creature base stats for class {}, level {} has invalid negative base damage[{}] - set to 0.0", Class, Level, i);
9820 stats.BaseDamage[i] = 0.0f;
9821 }
9822 }
9823
9824 stats.BaseMana = fields[5].Get<uint32>();
9825 stats.BaseArmor = fields[6].Get<uint32>();
9826
9827 stats.AttackPower = fields[7].Get<uint32>();
9828 stats.RangedAttackPower = fields[8].Get<uint32>();
9829
9830 _creatureBaseStatsStore[MAKE_PAIR16(Level, Class)] = stats;
9831
9832 ++count;
9833 } while (result->NextRow());
9834
9835 CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
9836 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
9837 {
9838 for (uint16 lvl = itr->second.minlevel; lvl <= itr->second.maxlevel; ++lvl)
9839 {
9840 if (_creatureBaseStatsStore.find(MAKE_PAIR16(lvl, itr->second.unit_class)) == _creatureBaseStatsStore.end())
9841 LOG_ERROR("sql.sql", "Missing base stats for creature class {} level {}", itr->second.unit_class, lvl);
9842 }
9843 }
9844
9845 LOG_INFO("server.loading", ">> Loaded {} Creature Base Stats in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9846 LOG_INFO("server.loading", " ");
9847}
std::unordered_map< uint32, CreatureTemplate > CreatureTemplateContainer
Definition: CreatureData.h:292
uint32 BaseMana
Definition: CreatureData.h:305
float BaseDamage[MAX_EXPANSIONS]
Definition: CreatureData.h:309
uint32 RangedAttackPower
Definition: CreatureData.h:308
uint32 AttackPower
Definition: CreatureData.h:307
uint32 BaseHealth[MAX_EXPANSIONS]
Definition: CreatureData.h:304
float BaseArmor
Definition: CreatureData.h:306

References _creatureBaseStatsStore, CreatureBaseStats::AttackPower, CreatureBaseStats::BaseArmor, CreatureBaseStats::BaseDamage, CreatureBaseStats::BaseHealth, CreatureBaseStats::BaseMana, CLASSMASK_ALL_CREATURES, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, MAKE_PAIR16(), MAX_EXPANSIONS, CreatureBaseStats::RangedAttackPower, sObjectMgr, and WorldDatabase.

◆ LoadCreatureCustomIDs()

void ObjectMgr::LoadCreatureCustomIDs ( )

Load config option Creatures.CustomIDs into Store.

950{
951 // Hack for modules
952 std::string stringCreatureIds = sConfigMgr->GetOption<std::string>("Creatures.CustomIDs", "190010,55005,999991,25462,98888,601014,34567,34568");
953 std::vector<std::string_view> CustomCreatures = Acore::Tokenize(stringCreatureIds, ',', false);
954
955 for (auto& itr : CustomCreatures)
956 {
957 _creatureCustomIDsStore.push_back(Acore::StringTo<uint32>(itr).value());
958 }
959}
#define sConfigMgr
Definition: Config.h:74

References _creatureCustomIDsStore, sConfigMgr, and Acore::Tokenize().

◆ LoadCreatureLocales()

void ObjectMgr::LoadCreatureLocales ( )
394{
395 uint32 oldMSTime = getMSTime();
396
397 _creatureLocaleStore.clear(); // need for reload case
398
399 // 0 1 2 3
400 QueryResult result = WorldDatabase.Query("SELECT entry, locale, Name, Title FROM creature_template_locale");
401 if (!result)
402 return;
403
404 do
405 {
406 Field* fields = result->Fetch();
407
408 uint32 ID = fields[0].Get<uint32>();
409
410 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
411 if (locale == LOCALE_enUS)
412 continue;
413
415 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
416 AddLocaleString(fields[3].Get<std::string>(), locale, data.Title);
417 } while (result->NextRow());
418
419 LOG_INFO("server.loading", ">> Loaded {} Creature Locale Strings in {} ms", (unsigned long)_creatureLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
420}
Definition: CreatureData.h:343
std::vector< std::string > Title
Definition: CreatureData.h:345
std::vector< std::string > Name
Definition: CreatureData.h:344

References _creatureLocaleStore, AddLocaleString(), Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_INFO, CreatureLocale::Name, CreatureLocale::Title, and WorldDatabase.

◆ LoadCreatureModelInfo()

void ObjectMgr::LoadCreatureModelInfo ( )
1714{
1715 uint32 oldMSTime = getMSTime();
1716
1717 // 0 1 2 3 4
1718 QueryResult result = WorldDatabase.Query("SELECT DisplayID, BoundingRadius, CombatReach, Gender, DisplayID_Other_Gender FROM creature_model_info");
1719
1720 if (!result)
1721 {
1722 LOG_WARN("server.loading", ">> Loaded 0 creature model definitions. DB table `creature_model_info` is empty.");
1723 LOG_INFO("server.loading", " ");
1724 return;
1725 }
1726
1727 _creatureModelStore.rehash(result->GetRowCount());
1728 uint32 count = 0;
1729
1730 // List of ModelDataIDs that use Invisible models
1731 uint32 triggerCreatureModelDataID[14] = { 1731, 1752, 2206, 2296, 2372, 2382, 2481, 2512, 2513, 2611, 2636, 2790, 3230, 3274 };
1732
1733 do
1734 {
1735 Field* fields = result->Fetch();
1736
1737 uint32 displayId = fields[0].Get<uint32>();
1738 CreatureDisplayInfoEntry const* creatureDisplay = sCreatureDisplayInfoStore.LookupEntry(displayId);
1739 uint32 modelId = fields[0].Get<uint32>();
1740
1741 CreatureModelInfo& modelInfo = _creatureModelStore[modelId];
1742
1743 modelInfo.bounding_radius = fields[1].Get<float>();
1744 modelInfo.combat_reach = fields[2].Get<float>();
1745 modelInfo.gender = fields[3].Get<uint8>();
1746 modelInfo.modelid_other_gender = fields[4].Get<uint32>();
1747 modelInfo.is_trigger = false;
1748
1749 // Checks
1750
1751 if (!sCreatureDisplayInfoStore.LookupEntry(modelId))
1752 LOG_ERROR("sql.sql", "Table `creature_model_info` has model for not existed display id ({}).", modelId);
1753
1754 if (modelInfo.gender > GENDER_NONE)
1755 {
1756 LOG_ERROR("sql.sql", "Table `creature_model_info` has wrong gender ({}) for display id ({}).", uint32(modelInfo.gender), modelId);
1757 modelInfo.gender = GENDER_MALE;
1758 }
1759
1760 if (modelInfo.modelid_other_gender && !sCreatureDisplayInfoStore.LookupEntry(modelInfo.modelid_other_gender))
1761 {
1762 LOG_ERROR("sql.sql", "Table `creature_model_info` has not existed alt.gender model ({}) for existed display id ({}).", modelInfo.modelid_other_gender, modelId);
1763 modelInfo.modelid_other_gender = 0;
1764 }
1765
1766 if (modelInfo.combat_reach < 0.1f)
1767 modelInfo.combat_reach = DEFAULT_COMBAT_REACH;
1768
1769 if (CreatureModelDataEntry const* modelData = sCreatureModelDataStore.LookupEntry(creatureDisplay->ModelId))
1770 {
1771 for (uint32 i = 0; i < 14; i++)
1772 {
1773 if (modelData->Id == triggerCreatureModelDataID[i])
1774 {
1775 modelInfo.is_trigger = true;
1776 break;
1777 }
1778 }
1779 }
1780
1781 ++count;
1782 } while (result->NextRow());
1783
1784 LOG_INFO("server.loading", ">> Loaded {} Creature Model Based Info in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1785 LOG_INFO("server.loading", " ");
1786}
@ GENDER_MALE
Definition: SharedDefines.h:61
@ GENDER_NONE
Definition: SharedDefines.h:63
#define DEFAULT_COMBAT_REACH
Definition: ObjectDefines.h:46
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
Definition: DBCStructure.h:720
Definition: DBCStructure.h:774

References _creatureModelStore, DEFAULT_COMBAT_REACH, GENDER_MALE, GENDER_NONE, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sCreatureDisplayInfoStore, sCreatureModelDataStore, and WorldDatabase.

◆ LoadCreatureMovementOverrides()

void ObjectMgr::LoadCreatureMovementOverrides ( )
1562{
1563 uint32 oldMSTime = getMSTime();
1564
1566
1567 // Load the data from creature_movement_override and if NULL fallback to creature_template_movement
1568 QueryResult result = WorldDatabase.Query("SELECT cmo.SpawnId,"
1569 "COALESCE(cmo.Ground, ctm.Ground),"
1570 "COALESCE(cmo.Swim, ctm.Swim),"
1571 "COALESCE(cmo.Flight, ctm.Flight),"
1572 "COALESCE(cmo.Rooted, ctm.Rooted),"
1573 "COALESCE(cmo.Chase, ctm.Chase),"
1574 "COALESCE(cmo.Random, ctm.Random),"
1575 "COALESCE(cmo.InteractionPauseTimer, ctm.InteractionPauseTimer) "
1576 "FROM creature_movement_override AS cmo "
1577 "LEFT JOIN creature AS c ON c.guid = cmo.SpawnId "
1578 "LEFT JOIN creature_template_movement AS ctm ON ctm.CreatureId = c.id1");
1579 if (!result)
1580 {
1581 LOG_WARN("server.loading", ">> Loaded 0 creature movement overrides. DB table `creature_movement_override` is empty!");
1582 return;
1583 }
1584
1585 do
1586 {
1587 Field* fields = result->Fetch();
1588 ObjectGuid::LowType spawnId = fields[0].Get<uint32>();
1589 if (!GetCreatureData(spawnId))
1590 {
1591 LOG_ERROR("sql.sql", "Creature (GUID: {}) does not exist but has a record in `creature_movement_override`", spawnId);
1592 continue;
1593 }
1594
1596 if (!fields[1].IsNull())
1597 {
1598 movement.Ground = static_cast<CreatureGroundMovementType>(fields[1].Get<uint8>());
1599 }
1600
1601 if (!fields[2].IsNull())
1602 {
1603 movement.Swim = fields[2].Get<bool>();
1604 }
1605
1606 if (!fields[3].IsNull())
1607 {
1608 movement.Flight = static_cast<CreatureFlightMovementType>(fields[3].Get<uint8>());
1609 }
1610
1611 if (!fields[4].IsNull())
1612 {
1613 movement.Rooted = fields[4].Get<bool>();
1614 }
1615
1616 if (!fields[5].IsNull())
1617 {
1618 movement.Chase = static_cast<CreatureChaseMovementType>(fields[5].Get<uint8>());
1619 }
1620
1621 if (!fields[6].IsNull())
1622 {
1623 movement.Random = static_cast<CreatureRandomMovementType>(fields[6].Get<uint8>());
1624 }
1625
1626 if (!fields[7].IsNull())
1627 {
1628 movement.InteractionPauseTimer = fields[7].Get<uint32>();
1629 }
1630
1631 CheckCreatureMovement("creature_movement_override", spawnId, movement);
1632 } while (result->NextRow());
1633
1634 LOG_INFO("server.loading", ">> Loaded {} Movement Overrides in {} ms", _creatureMovementOverrides.size(), GetMSTimeDiffToNow(oldMSTime));
1635 LOG_INFO("server.loading", " ");
1636}
CreatureFlightMovementType
Definition: CreatureData.h:92
CreatureChaseMovementType
Definition: CreatureData.h:101
CreatureGroundMovementType
Definition: CreatureData.h:83
CreatureRandomMovementType
Definition: CreatureData.h:110
Definition: CreatureData.h:119
bool Swim
Definition: CreatureData.h:124
bool Rooted
Definition: CreatureData.h:125
uint32 InteractionPauseTimer
Definition: CreatureData.h:128

References _creatureMovementOverrides, CreatureMovementData::Chase, CheckCreatureMovement(), CreatureMovementData::Flight, Field::Get(), GetCreatureData(), getMSTime(), GetMSTimeDiffToNow(), CreatureMovementData::Ground, CreatureMovementData::InteractionPauseTimer, LOG_ERROR, LOG_INFO, LOG_WARN, CreatureMovementData::Random, CreatureMovementData::Rooted, CreatureMovementData::Swim, and WorldDatabase.

◆ LoadCreatureQuestEnders()

void ObjectMgr::LoadCreatureQuestEnders ( )
8140{
8141 LoadQuestRelationsHelper(_creatureQuestInvolvedRelations, "creature_questender", false, false);
8142
8143 for (QuestRelations::iterator itr = _creatureQuestInvolvedRelations.begin(); itr != _creatureQuestInvolvedRelations.end(); ++itr)
8144 {
8145 CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
8146 if (!cInfo)
8147 LOG_ERROR("sql.sql", "Table `creature_questender` have data for not existed creature entry ({}) and existed quest {}", itr->first, itr->second);
8148 else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
8149 LOG_ERROR("sql.sql", "Table `creature_questender` has creature entry ({}) for quest {}, but npcflag does not include UNIT_NPC_FLAG_QUESTGIVER", itr->first, itr->second);
8150 }
8151}
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:295
void LoadQuestRelationsHelper(QuestRelations &map, std::string const &table, bool starter, bool go)
Definition: ObjectMgr.cpp:8052

References _creatureQuestInvolvedRelations, GetCreatureTemplate(), LoadQuestRelationsHelper(), LOG_ERROR, CreatureTemplate::npcflag, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by LoadQuestStartersAndEnders().

◆ LoadCreatureQuestItems()

void ObjectMgr::LoadCreatureQuestItems ( )
10168{
10169 uint32 oldMSTime = getMSTime();
10170
10171 // 0 1 2
10172 QueryResult result = WorldDatabase.Query("SELECT CreatureEntry, ItemId, Idx FROM creature_questitem ORDER BY Idx ASC");
10173
10174 if (!result)
10175 {
10176 LOG_WARN("server.loading", ">> Loaded 0 creature quest items. DB table `creature_questitem` is empty.");
10177 return;
10178 }
10179
10180 uint32 count = 0;
10181 do
10182 {
10183 Field* fields = result->Fetch();
10184
10185 uint32 entry = fields[0].Get<uint32>();
10186 uint32 item = fields[1].Get<uint32>();
10187 uint32 idx = fields[2].Get<uint32>();
10188
10189 CreatureTemplate const* creatureInfo = GetCreatureTemplate(entry);
10190 if (!creatureInfo)
10191 {
10192 LOG_ERROR("sql.sql", "Table `creature_questitem` has data for nonexistent creature (entry: {}, idx: {}), skipped", entry, idx);
10193 continue;
10194 };
10195
10196 ItemEntry const* dbcData = sItemStore.LookupEntry(item);
10197 if (!dbcData)
10198 {
10199 LOG_ERROR("sql.sql", "Table `creature_questitem` has nonexistent item (ID: {}) in creature (entry: {}, idx: {}), skipped", item, entry, idx);
10200 continue;
10201 };
10202
10203 _creatureQuestItemStore[entry].push_back(item);
10204
10205 ++count;
10206 } while (result->NextRow());
10207
10208 LOG_INFO("server.loading", ">> Loaded {} Creature Quest Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10209 LOG_INFO("server.loading", " ");
10210}
DBCStorage< ItemEntry > sItemStore(Itemfmt)
Definition: DBCStructure.h:1139

References _creatureQuestItemStore, Field::Get(), GetCreatureTemplate(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sItemStore, and WorldDatabase.

◆ LoadCreatureQuestStarters()

void ObjectMgr::LoadCreatureQuestStarters ( )
8126{
8127 LoadQuestRelationsHelper(_creatureQuestRelations, "creature_queststarter", true, false);
8128
8129 for (QuestRelations::iterator itr = _creatureQuestRelations.begin(); itr != _creatureQuestRelations.end(); ++itr)
8130 {
8131 CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
8132 if (!cInfo)
8133 LOG_ERROR("sql.sql", "Table `creature_queststarter` have data for not existed creature entry ({}) and existed quest {}", itr->first, itr->second);
8134 else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
8135 LOG_ERROR("sql.sql", "Table `creature_queststarter` has creature entry ({}) for quest {}, but npcflag does not include UNIT_NPC_FLAG_QUESTGIVER", itr->first, itr->second);
8136 }
8137}

References _creatureQuestRelations, GetCreatureTemplate(), LoadQuestRelationsHelper(), LOG_ERROR, CreatureTemplate::npcflag, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by LoadQuestStartersAndEnders().

◆ LoadCreatures()

void ObjectMgr::LoadCreatures ( )
2107{
2108 uint32 oldMSTime = getMSTime();
2109
2110 // 0 1 2 3 4 5 6 7 8 9 10 11
2111 QueryResult result = WorldDatabase.Query("SELECT creature.guid, id1, id2, id3, map, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, wander_distance, "
2112 // 12 13 14 15 16 17 18 19 20 21 22
2113 "currentwaypoint, curhealth, curmana, MovementType, spawnMask, phaseMask, eventEntry, pool_entry, creature.npcflag, creature.unit_flags, creature.dynamicflags, "
2114 // 23
2115 "creature.ScriptName "
2116 "FROM creature "
2117 "LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid "
2118 "LEFT OUTER JOIN pool_creature ON creature.guid = pool_creature.guid");
2119
2120 if (!result)
2121 {
2122 LOG_WARN("server.loading", ">> Loaded 0 creatures. DB table `creature` is empty.");
2123 LOG_INFO("server.loading", " ");
2124 return;
2125 }
2126
2127 // Build single time for check spawnmask
2128 std::map<uint32, uint32> spawnMasks;
2129 for (uint32 i = 0; i < sMapStore.GetNumRows(); ++i)
2130 if (sMapStore.LookupEntry(i))
2131 for (int k = 0; k < MAX_DIFFICULTY; ++k)
2133 spawnMasks[i] |= (1 << k);
2134
2135 _creatureDataStore.rehash(result->GetRowCount());
2136 uint32 count = 0;
2137 do
2138 {
2139 Field* fields = result->Fetch();
2140
2141 ObjectGuid::LowType spawnId = fields[0].Get<uint32>();
2142 uint32 id1 = fields[1].Get<uint32>();
2143 uint32 id2 = fields[2].Get<uint32>();
2144 uint32 id3 = fields[3].Get<uint32>();
2145
2146 CreatureTemplate const* cInfo = GetCreatureTemplate(id1);
2147 if (!cInfo)
2148 {
2149 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with non existing creature entry {} in id1 field, skipped.", spawnId, id1);
2150 continue;
2151 }
2152 CreatureTemplate const* cInfo2 = GetCreatureTemplate(id2);
2153 if (!cInfo2 && id2)
2154 {
2155 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with non existing creature entry {} in id2 field, skipped.", spawnId, id2);
2156 continue;
2157 }
2158 CreatureTemplate const* cInfo3 = GetCreatureTemplate(id3);
2159 if (!cInfo3 && id3)
2160 {
2161 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with non existing creature entry {} in id3 field, skipped.", spawnId, id3);
2162 continue;
2163 }
2164 if (!id2 && id3)
2165 {
2166 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with creature entry {} in id3 field but no entry in id2 field, skipped.", spawnId, id3);
2167 continue;
2168 }
2169 CreatureData& data = _creatureDataStore[spawnId];
2170 data.id1 = id1;
2171 data.id2 = id2;
2172 data.id3 = id3;
2173 data.mapid = fields[4].Get<uint16>();
2174 data.equipmentId = fields[5].Get<int8>();
2175 data.posX = fields[6].Get<float>();
2176 data.posY = fields[7].Get<float>();
2177 data.posZ = fields[8].Get<float>();
2178 data.orientation = fields[9].Get<float>();
2179 data.spawntimesecs = fields[10].Get<uint32>();
2180 data.wander_distance = fields[11].Get<float>();
2181 data.currentwaypoint = fields[12].Get<uint32>();
2182 data.curhealth = fields[13].Get<uint32>();
2183 data.curmana = fields[14].Get<uint32>();
2184 data.movementType = fields[15].Get<uint8>();
2185 data.spawnMask = fields[16].Get<uint8>();
2186 data.phaseMask = fields[17].Get<uint32>();
2187 int16 gameEvent = fields[18].Get<int8>();
2188 uint32 PoolId = fields[19].Get<uint32>();
2189 data.npcflag = fields[20].Get<uint32>();
2190 data.unit_flags = fields[21].Get<uint32>();
2191 data.dynamicflags = fields[22].Get<uint32>();
2192 data.ScriptId = GetScriptId(fields[23].Get<std::string>());
2193
2194 if (!data.ScriptId)
2195 data.ScriptId = cInfo->ScriptID;
2196
2197 MapEntry const* mapEntry = sMapStore.LookupEntry(data.mapid);
2198 if (!mapEntry)
2199 {
2200 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that spawned at not existed map (Id: {}), skipped.", spawnId, data.mapid);
2201 continue;
2202 }
2203
2204 // pussywizard: 7 days means no reaspawn, so set it to 14 days, because manual id reset may be late
2205 if (mapEntry->IsRaid() && data.spawntimesecs >= 7 * DAY && data.spawntimesecs < 14 * DAY)
2206 data.spawntimesecs = 14 * DAY;
2207
2208 // Skip spawnMask check for transport maps
2209 if (!_transportMaps.count(data.mapid) && data.spawnMask & ~spawnMasks[data.mapid])
2210 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that have wrong spawn mask {} including not supported difficulty modes for map (Id: {}).",
2211 spawnId, data.spawnMask, data.mapid);
2212
2213 bool ok = true;
2214 for (uint32 diff = 0; diff < MAX_DIFFICULTY - 1 && ok; ++diff)
2215 {
2216 if ((_difficultyEntries[diff].find(data.id1) != _difficultyEntries[diff].end()) || (_difficultyEntries[diff].find(data.id2) != _difficultyEntries[diff].end()) || (_difficultyEntries[diff].find(data.id3) != _difficultyEntries[diff].end()))
2217 {
2218 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that listed as difficulty {} template (Entries: {}, {}, {}) in `creature_template`, skipped.",
2219 spawnId, diff + 1, data.id1, data.id2, data.id3);
2220 ok = false;
2221 }
2222 }
2223 if (!ok)
2224 continue;
2225
2226 // -1 random, 0 no equipment,
2227 if (data.equipmentId != 0)
2228 {
2229 if ((!GetEquipmentInfo(data.id1, data.equipmentId)) || (data.id2 && !GetEquipmentInfo(data.id2, data.equipmentId)) || (data.id3 && !GetEquipmentInfo(data.id3, data.equipmentId)))
2230 {
2231 LOG_ERROR("sql.sql", "Table `creature` have creature (Entries: {}, {}, {}) one or more with equipment_id {} not found in table `creature_equip_template`, set to no equipment.",
2232 data.id1, data.id2, data.id3, data.equipmentId);
2233 data.equipmentId = 0;
2234 }
2235 }
2236 if ((cInfo->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND) || (data.id2 && cInfo2->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND) || (data.id3 && cInfo3->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND))
2237 {
2238 if (!mapEntry->IsDungeon())
2239 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {} Entries: {}, {}, {}) with a `creature_template`.`flags_extra` in one or more entries including CREATURE_FLAG_EXTRA_INSTANCE_BIND but creature are not in instance.",
2240 spawnId, data.id1, data.id2, data.id3);
2241 }
2242 if (data.movementType >= MAX_DB_MOTION_TYPE)
2243 {
2244 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {} Entries: {}, {}, {}) with wrong movement generator type ({}), ignored and set to IDLE.", spawnId, data.id1, data.id2, data.id3, data.movementType);
2246 }
2247 if (data.wander_distance < 0.0f)
2248 {
2249 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {} Entries: {}, {}, {}) with `wander_distance`< 0, set to 0.", spawnId, data.id1, data.id2, data.id3);
2250 data.wander_distance = 0.0f;
2251 }
2252 else if (data.movementType == RANDOM_MOTION_TYPE)
2253 {
2254 if (data.wander_distance == 0.0f)
2255 {
2256 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {} Entries: {}, {}, {}) with `MovementType`=1 (random movement) but with `wander_distance`=0, replace by idle movement type (0).",
2257 spawnId, data.id1, data.id2, data.id3);
2259 }
2260 }
2261 else if (data.movementType == IDLE_MOTION_TYPE)
2262 {
2263 if (data.wander_distance != 0.0f)
2264 {
2265 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {} Entries: {}, {}, {}) with `MovementType`=0 (idle) have `wander_distance`<>0, set to 0.", spawnId, data.id1, data.id2, data.id3);
2266 data.wander_distance = 0.0f;
2267 }
2268 }
2269
2270 if (data.phaseMask == 0)
2271 {
2272 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {} Entries: {}, {}, {}) with `phaseMask`=0 (not visible for anyone), set to 1.", spawnId, data.id1, data.id2, data.id3);
2273 data.phaseMask = 1;
2274 }
2275
2277 {
2278 uint32 zoneId = sMapMgr->GetZoneId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
2279 uint32 areaId = sMapMgr->GetAreaId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
2280
2282
2283 stmt->SetData(0, zoneId);
2284 stmt->SetData(1, areaId);
2285 stmt->SetData(2, spawnId);
2286
2287 WorldDatabase.Execute(stmt);
2288 }
2289
2290 // Add to grid if not managed by the game event or pool system
2291 if (gameEvent == 0 && PoolId == 0)
2292 AddCreatureToGrid(spawnId, &data);
2293
2294 ++count;
2295 } while (result->NextRow());
2296
2297 LOG_INFO("server.loading", ">> Loaded {} Creatures in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2298 LOG_INFO("server.loading", " ");
2299}
constexpr auto DAY
Definition: Common.h:49
std::int8_t int8
Definition: Define.h:105
std::int16_t int16
Definition: Define.h:104
Difficulty
Definition: DBCEnums.h:266
@ CONFIG_CALCULATE_CREATURE_ZONE_AREA_DATA
Definition: IWorld.h:153
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition: CreatureData.h:45
MapDifficulty const * GetMapDifficultyData(uint32 mapId, Difficulty difficulty)
Definition: DBCStores.cpp:761
@ RANDOM_MOTION_TYPE
Definition: MotionMaster.h:40
@ WORLD_UPD_CREATURE_ZONE_AREA_DATA
Definition: WorldDatabase.h:99
uint32 flags_extra
Definition: CreatureData.h:246
uint32 ScriptId
Definition: CreatureData.h:393
EquipmentInfo const * GetEquipmentInfo(uint32 entry, int8 &id)
Definition: ObjectMgr.cpp:1457
bool IsRaid() const
Definition: DBCStructure.h:1353

References _creatureDataStore, _difficultyEntries, _transportMaps, AddCreatureToGrid(), CONFIG_CALCULATE_CREATURE_ZONE_AREA_DATA, CREATURE_FLAG_EXTRA_INSTANCE_BIND, CreatureData::curhealth, CreatureData::curmana, CreatureData::currentwaypoint, DAY, CreatureData::dynamicflags, CreatureData::equipmentId, CreatureTemplate::flags_extra, Field::Get(), GetCreatureTemplate(), GetEquipmentInfo(), GetMapDifficultyData(), getMSTime(), GetMSTimeDiffToNow(), GetScriptId(), CreatureData::id1, CreatureData::id2, CreatureData::id3, IDLE_MOTION_TYPE, MapEntry::IsDungeon(), MapEntry::IsRaid(), LOG_ERROR, LOG_INFO, LOG_WARN, CreatureData::mapid, MAX_DB_MOTION_TYPE, MAX_DIFFICULTY, CreatureData::movementType, CreatureData::npcflag, CreatureData::orientation, CreatureData::phaseMask, CreatureData::posX, CreatureData::posY, CreatureData::posZ, RANDOM_MOTION_TYPE, CreatureData::ScriptId, PreparedStatementBase::SetData(), sMapMgr, sMapStore, CreatureData::spawnMask, CreatureData::spawntimesecs, sWorld, CreatureData::unit_flags, CreatureData::wander_distance, WORLD_UPD_CREATURE_ZONE_AREA_DATA, and WorldDatabase.

◆ LoadCreatureTemplate()

void ObjectMgr::LoadCreatureTemplate ( Field fields,
bool  triggerHook = false 
)

Loads a creature template from a database result.

Parameters
fieldsDatabase result
triggerHookIf true, will trigger the OnAfterDatabaseLoadCreatureTemplates hook. Useful if you are not calling the hook yourself.
585{
586 uint32 entry = fields[0].Get<uint32>();
587
588 CreatureTemplate& creatureTemplate = _creatureTemplateStore[entry];
589
590 // enlarge the fast cache as necessary
591 if (_creatureTemplateStoreFast.size() < entry + 1)
592 {
593 _creatureTemplateStoreFast.resize(entry + 1, nullptr);
594 }
595
596 // load a pointer to this creatureTemplate into the fast cache
597 _creatureTemplateStoreFast[entry] = &creatureTemplate;
598
599 // build the creatureTemplate
600 creatureTemplate.Entry = entry;
601
602 for (uint8 i = 0; i < MAX_DIFFICULTY - 1; ++i)
603 {
604 creatureTemplate.DifficultyEntry[i] = fields[1 + i].Get<uint32>();
605 }
606
607 for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i)
608 {
609 creatureTemplate.KillCredit[i] = fields[4 + i].Get<uint32>();
610 }
611 creatureTemplate.Name = fields[6].Get<std::string>();
612 creatureTemplate.SubName = fields[7].Get<std::string>();
613 creatureTemplate.IconName = fields[8].Get<std::string>();
614 creatureTemplate.GossipMenuId = fields[9].Get<uint32>();
615 creatureTemplate.minlevel = fields[10].Get<uint8>();
616 creatureTemplate.maxlevel = fields[11].Get<uint8>();
617 creatureTemplate.expansion = uint32(fields[12].Get<int16>());
618 creatureTemplate.faction = uint32(fields[13].Get<uint16>());
619 creatureTemplate.npcflag = fields[14].Get<uint32>();
620 creatureTemplate.speed_walk = fields[15].Get<float>();
621 creatureTemplate.speed_run = fields[16].Get<float>();
622 creatureTemplate.speed_swim = fields[17].Get<float>();
623 creatureTemplate.speed_flight = fields[18].Get<float>();
624 creatureTemplate.detection_range = fields[19].Get<float>();
625 creatureTemplate.scale = fields[20].Get<float>();
626 creatureTemplate.rank = uint32(fields[21].Get<uint8>());
627 creatureTemplate.dmgschool = uint32(fields[22].Get<int8>());
628 creatureTemplate.DamageModifier = fields[23].Get<float>();
629 creatureTemplate.BaseAttackTime = fields[24].Get<uint32>();
630 creatureTemplate.RangeAttackTime = fields[25].Get<uint32>();
631 creatureTemplate.BaseVariance = fields[26].Get<float>();
632 creatureTemplate.RangeVariance = fields[27].Get<float>();
633 creatureTemplate.unit_class = uint32(fields[28].Get<uint8>());
634 creatureTemplate.unit_flags = fields[29].Get<uint32>();
635 creatureTemplate.unit_flags2 = fields[30].Get<uint32>();
636 creatureTemplate.dynamicflags = fields[31].Get<uint32>();
637 creatureTemplate.family = uint32(fields[32].Get<uint8>());
638 creatureTemplate.trainer_type = uint32(fields[33].Get<uint8>());
639 creatureTemplate.trainer_spell = fields[34].Get<uint32>();
640 creatureTemplate.trainer_class = uint32(fields[35].Get<uint8>());
641 creatureTemplate.trainer_race = uint32(fields[36].Get<uint8>());
642 creatureTemplate.type = uint32(fields[37].Get<uint8>());
643 creatureTemplate.type_flags = fields[38].Get<uint32>();
644 creatureTemplate.lootid = fields[39].Get<uint32>();
645 creatureTemplate.pickpocketLootId = fields[40].Get<uint32>();
646 creatureTemplate.SkinLootId = fields[41].Get<uint32>();
647
648 for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
649 {
650 creatureTemplate.resistance[i] = 0;
651 }
652
653 for (uint8 i = 0; i < MAX_CREATURE_SPELLS; ++i)
654 {
655 creatureTemplate.spells[i] = 0;
656 }
657
658 creatureTemplate.PetSpellDataId = fields[42].Get<uint32>();
659 creatureTemplate.VehicleId = fields[43].Get<uint32>();
660 creatureTemplate.mingold = fields[44].Get<uint32>();
661 creatureTemplate.maxgold = fields[45].Get<uint32>();
662 creatureTemplate.AIName = fields[46].Get<std::string>(); // stopped here, fix it
663 creatureTemplate.MovementType = uint32(fields[47].Get<uint8>());
664 if (!fields[48].IsNull())
665 {
666 creatureTemplate.Movement.Ground = static_cast<CreatureGroundMovementType>(fields[48].Get<uint8>());
667 }
668
669 creatureTemplate.Movement.Swim = fields[49].Get<bool>();
670 if (!fields[50].IsNull())
671 {
672 creatureTemplate.Movement.Flight = static_cast<CreatureFlightMovementType>(fields[50].Get<uint8>());
673 }
674
675 creatureTemplate.Movement.Rooted = fields[51].Get<bool>();
676 if (!fields[52].IsNull())
677 {
678 creatureTemplate.Movement.Chase = static_cast<CreatureChaseMovementType>(fields[52].Get<uint8>());
679 }
680 if (!fields[53].IsNull())
681 {
682 creatureTemplate.Movement.Random = static_cast<CreatureRandomMovementType>(fields[53].Get<uint8>());
683 }
684 if (!fields[54].IsNull())
685 {
686 creatureTemplate.Movement.InteractionPauseTimer = fields[54].Get<uint32>();
687 }
688
689 creatureTemplate.HoverHeight = fields[55].Get<float>();
690 creatureTemplate.ModHealth = fields[56].Get<float>();
691 creatureTemplate.ModMana = fields[57].Get<float>();
692 creatureTemplate.ModArmor = fields[58].Get<float>();
693 creatureTemplate.ModExperience = fields[59].Get<float>();
694 creatureTemplate.RacialLeader = fields[60].Get<bool>();
695 creatureTemplate.movementId = fields[61].Get<uint32>();
696 creatureTemplate.RegenHealth = fields[62].Get<bool>();
697 creatureTemplate.MechanicImmuneMask = fields[63].Get<uint32>();
698 creatureTemplate.SpellSchoolImmuneMask = fields[64].Get<uint8>();
699 creatureTemplate.flags_extra = fields[65].Get<uint32>();
700 creatureTemplate.ScriptID = GetScriptId(fields[66].Get<std::string>());
701
702 // useful if the creature template load is being triggered from outside this class
703 if (triggerHook)
704 {
705 sScriptMgr->OnAfterDatabaseLoadCreatureTemplates(_creatureTemplateStoreFast);
706 }
707}
@ SPELL_SCHOOL_HOLY
Definition: SharedDefines.h:284
#define sScriptMgr
Definition: ScriptMgr.h:709

References _creatureTemplateStore, _creatureTemplateStoreFast, Field::Get(), GetScriptId(), MAX_CREATURE_SPELLS, MAX_DIFFICULTY, MAX_KILL_CREDIT, MAX_SPELL_SCHOOL, SPELL_SCHOOL_HOLY, and sScriptMgr.

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplateAddons()

void ObjectMgr::LoadCreatureTemplateAddons ( )
854{
855 uint32 oldMSTime = getMSTime();
856
857 // 0 1 2 3 4 5 6 7
858 QueryResult result = WorldDatabase.Query("SELECT entry, path_id, mount, bytes1, bytes2, emote, visibilityDistanceType, auras FROM creature_template_addon");
859
860 if (!result)
861 {
862 LOG_WARN("server.loading", ">> Loaded 0 creature template addon definitions. DB table `creature_template_addon` is empty.");
863 LOG_INFO("server.loading", " ");
864 return;
865 }
866
867 uint32 count = 0;
868 do
869 {
870 Field* fields = result->Fetch();
871
872 uint32 entry = fields[0].Get<uint32>();
873
874 if (!sObjectMgr->GetCreatureTemplate(entry))
875 {
876 LOG_ERROR("sql.sql", "Creature template (Entry: {}) does not exist but has a record in `creature_template_addon`", entry);
877 continue;
878 }
879
880 CreatureAddon& creatureAddon = _creatureTemplateAddonStore[entry];
881
882 creatureAddon.path_id = fields[1].Get<uint32>();
883 creatureAddon.mount = fields[2].Get<uint32>();
884 creatureAddon.bytes1 = fields[3].Get<uint32>();
885 creatureAddon.bytes2 = fields[4].Get<uint32>();
886 creatureAddon.emote = fields[5].Get<uint32>();
887 creatureAddon.visibilityDistanceType = VisibilityDistanceType(fields[6].Get<uint8>());
888
889 for (std::string_view aura : Acore::Tokenize(fields[7].Get<std::string_view>(), ' ', false))
890 {
891 SpellInfo const* spellInfo = nullptr;
892
893 if (Optional<uint32> spellId = Acore::StringTo<uint32>(aura))
894 {
895 spellInfo = sSpellMgr->GetSpellInfo(*spellId);
896 }
897
898 if (!spellInfo)
899 {
900 LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong spell '{}' defined in `auras` field in `creature_template_addon`.", entry, aura);
901 continue;
902 }
903
904 if (std::find(creatureAddon.auras.begin(), creatureAddon.auras.end(), spellInfo->Id) != creatureAddon.auras.end())
905 {
906 LOG_ERROR("sql.sql", "Creature (Entry: {}) has duplicate aura (spell {}) in `auras` field in `creature_template_addon`.", entry, spellInfo->Id);
907 continue;
908 }
909
910 if (spellInfo->GetDuration() > 0)
911 {
912 LOG_DEBUG/*ERROR*/("sql.sql", "Creature (Entry: {}) has temporary aura (spell {}) in `auras` field in `creature_template_addon`.", entry, spellInfo->Id);
913 // continue;
914 }
915
916 creatureAddon.auras.push_back(spellInfo->Id);
917 }
918
919 if (creatureAddon.mount)
920 {
921 if (!sCreatureDisplayInfoStore.LookupEntry(creatureAddon.mount))
922 {
923 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid displayInfoId ({}) for mount defined in `creature_template_addon`", entry, creatureAddon.mount);
924 creatureAddon.mount = 0;
925 }
926 }
927
928 if (!sEmotesStore.LookupEntry(creatureAddon.emote))
929 {
930 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid emote ({}) defined in `creature_addon`.", entry, creatureAddon.emote);
931 creatureAddon.emote = 0;
932 }
933
934 if (creatureAddon.visibilityDistanceType >= VisibilityDistanceType::Max)
935 {
936 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid visibilityDistanceType ({}) defined in `creature_template_addon`.", entry, AsUnderlyingType(creatureAddon.visibilityDistanceType));
937 creatureAddon.visibilityDistanceType = VisibilityDistanceType::Normal;
938 }
939 ++count;
940 } while (result->NextRow());
941
942 LOG_INFO("server.loading", ">> Loaded {} Creature Template Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
943 LOG_INFO("server.loading", " ");
944}

References _creatureTemplateAddonStore, AsUnderlyingType(), CreatureAddon::auras, CreatureAddon::bytes1, CreatureAddon::bytes2, CreatureAddon::emote, Field::Get(), SpellInfo::GetDuration(), getMSTime(), GetMSTimeDiffToNow(), SpellInfo::Id, LOG_DEBUG, LOG_ERROR, LOG_INFO, LOG_WARN, CreatureAddon::mount, CreatureAddon::path_id, sCreatureDisplayInfoStore, sEmotesStore, sObjectMgr, sSpellMgr, Acore::Tokenize(), CreatureAddon::visibilityDistanceType, and WorldDatabase.

◆ LoadCreatureTemplateModels()

void ObjectMgr::LoadCreatureTemplateModels ( )
710{
711 uint32 oldMSTime = getMSTime();
712
713 // 0 1 2 3
714 QueryResult result = WorldDatabase.Query("SELECT CreatureID, CreatureDisplayID, DisplayScale, Probability FROM creature_template_model ORDER BY Idx ASC");
715
716 if (!result)
717 {
718 LOG_INFO("server.loading", ">> Loaded 0 creature template model definitions. DB table `creature_template_model` is empty.");
719 return;
720 }
721
722 uint32 count = 0;
723 do
724 {
725 Field* fields = result->Fetch();
726
727 uint32 creatureId = fields[0].Get<uint32>();
728 uint32 creatureDisplayId = fields[1].Get<uint32>();
729 float displayScale = fields[2].Get<float>();
730 float probability = fields[3].Get<float>();
731
732 CreatureTemplate const* cInfo = GetCreatureTemplate(creatureId);
733 if (!cInfo)
734 {
735 LOG_ERROR("sql.sql", "Creature template (Entry: {}) does not exist but has a record in `creature_template_model`", creatureId);
736 continue;
737 }
738
739 CreatureDisplayInfoEntry const* displayEntry = sCreatureDisplayInfoStore.LookupEntry(creatureDisplayId);
740 if (!displayEntry)
741 {
742 LOG_ERROR("sql.sql", "Creature (Entry: {}) lists non-existing CreatureDisplayID id ({}), this can crash the client.", creatureId, creatureDisplayId);
743 continue;
744 }
745
746 CreatureModelInfo const* modelInfo = GetCreatureModelInfo(creatureDisplayId);
747 if (!modelInfo)
748 LOG_ERROR("sql.sql", "No model data exist for `CreatureDisplayID` = {} listed by creature (Entry: {}).", creatureDisplayId, creatureId);
749
750 if (displayScale <= 0.0f)
751 displayScale = 1.0f;
752
753 const_cast<CreatureTemplate*>(cInfo)->Models.emplace_back(creatureDisplayId, displayScale, probability);
754
755 ++count;
756 } while (result->NextRow());
757
758 LOG_INFO("server.loading", ">> Loaded {} creature template models in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
759}
Models
Definition: boss_black_knight.cpp:95

References Field::Get(), GetCreatureModelInfo(), GetCreatureTemplate(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, sCreatureDisplayInfoStore, and WorldDatabase.

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplateResistances()

void ObjectMgr::LoadCreatureTemplateResistances ( )
762{
763 uint32 oldMSTime = getMSTime();
764
765 // 0 1 2
766 QueryResult result = WorldDatabase.Query("SELECT CreatureID, School, Resistance FROM creature_template_resistance");
767
768 if (!result)
769 {
770 LOG_WARN("server.loading", ">> Loaded 0 creature template resistance definitions. DB table `creature_template_resistance` is empty.");
771 LOG_INFO("server.loading", " ");
772 return;
773 }
774
775 uint32 count = 0;
776
777 do
778 {
779 Field* fields = result->Fetch();
780
781 uint32 creatureID = fields[0].Get<uint32>();
782 uint8 school = fields[1].Get<uint8>();
783
784 if (school == SPELL_SCHOOL_NORMAL || school >= MAX_SPELL_SCHOOL)
785 {
786 LOG_ERROR("sql.sql", "creature_template_resistance has resistance definitions for creature {} but this school {} doesn't exist", creatureID, school);
787 continue;
788 }
789
790 CreatureTemplateContainer::iterator itr = _creatureTemplateStore.find(creatureID);
791 if (itr == _creatureTemplateStore.end())
792 {
793 LOG_ERROR("sql.sql", "creature_template_resistance has resistance definitions for creature {} but this creature doesn't exist", creatureID);
794 continue;
795 }
796
797 CreatureTemplate& creatureTemplate = itr->second;
798 creatureTemplate.resistance[school] = fields[2].Get<int16>();
799
800 ++count;
801 } while (result->NextRow());
802
803 LOG_INFO("server.loading", ">> Loaded {} Creature Template Resistances in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
804 LOG_INFO("server.loading", " ");
805}
int32 resistance[MAX_SPELL_SCHOOL]
Definition: CreatureData.h:227

References _creatureTemplateStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, MAX_SPELL_SCHOOL, CreatureTemplate::resistance, SPELL_SCHOOL_NORMAL, and WorldDatabase.

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplates()

void ObjectMgr::LoadCreatureTemplates ( )
523{
524 uint32 oldMSTime = getMSTime();
525
526// 0 1 2 3 4 5 6 7 8
527 QueryResult result = WorldDatabase.Query("SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, name, subname, IconName, "
528// 9 10 11 12 13 14 15 16 17 18 19 20 21 22
529 "gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, speed_swim, speed_flight, detection_range, scale, `rank`, dmgschool, "
530// 23 24 25 26 27 28 29 30 31 32 33 34
531 "DamageModifier, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, "
532// 35 36 37 38 39 40 41
533 "trainer_class, trainer_race, type, type_flags, lootid, pickpocketloot, skinloot, "
534// 42 43 44 45 46 47 48 49 50 51
535 "PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, "
536// 52 53 54 55 56 57 58 59 60 61 62 63
537 "ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, "
538// 64 65 66
539 "spell_school_immune_mask, flags_extra, ScriptName "
540 "FROM creature_template ct LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId ORDER BY entry DESC;");
541
542 if (!result)
543 {
544 LOG_WARN("server.loading", ">> Loaded 0 creature template definitions. DB table `creature_template` is empty.");
545 return;
546 }
547
548 _creatureTemplateStore.rehash(result->GetRowCount());
550
551 uint32 count = 0;
552 do
553 {
554 Field* fields = result->Fetch();
555 LoadCreatureTemplate(fields);
556 ++count;
557 } while (result->NextRow());
558
559 // We load the creature models after loading but before checking
561
562 sScriptMgr->OnAfterDatabaseLoadCreatureTemplates(_creatureTemplateStoreFast);
563
566
567 // Checking needs to be done after loading because of the difficulty self referencing
568 for (CreatureTemplateContainer::iterator itr = _creatureTemplateStore.begin(); itr != _creatureTemplateStore.end(); ++itr)
569 {
570 CheckCreatureTemplate(&itr->second);
571 itr->second.InitializeQueryData();
572 }
573
574 LOG_INFO("server.loading", ">> Loaded {} Creature Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
575 LOG_INFO("server.loading", " ");
576}
void LoadCreatureTemplateResistances()
Definition: ObjectMgr.cpp:761
void LoadCreatureTemplateSpells()
Definition: ObjectMgr.cpp:807
void CheckCreatureTemplate(CreatureTemplate const *cInfo)
Definition: ObjectMgr.cpp:961
void LoadCreatureTemplate(Field *fields, bool triggerHook=false)
Loads a creature template from a database result.
Definition: ObjectMgr.cpp:584
void LoadCreatureTemplateModels()
Definition: ObjectMgr.cpp:709

References _creatureTemplateStore, _creatureTemplateStoreFast, CheckCreatureTemplate(), getMSTime(), GetMSTimeDiffToNow(), LoadCreatureTemplate(), LoadCreatureTemplateModels(), LoadCreatureTemplateResistances(), LoadCreatureTemplateSpells(), LOG_INFO, LOG_WARN, sScriptMgr, and WorldDatabase.

◆ LoadCreatureTemplateSpells()

void ObjectMgr::LoadCreatureTemplateSpells ( )
808{
809 uint32 oldMSTime = getMSTime();
810
811 // 0 1 2
812 QueryResult result = WorldDatabase.Query("SELECT CreatureID, `Index`, Spell FROM creature_template_spell");
813
814 if (!result)
815 {
816 LOG_WARN("server.loading", ">> Loaded 0 creature template spell definitions. DB table `creature_template_spell` is empty.");
817 LOG_INFO("server.loading", " ");
818 return;
819 }
820
821 uint32 count = 0;
822
823 do
824 {
825 Field* fields = result->Fetch();
826
827 uint32 creatureID = fields[0].Get<uint32>();
828 uint8 index = fields[1].Get<uint8>();
829
830 if (index >= MAX_CREATURE_SPELLS)
831 {
832 LOG_ERROR("sql.sql", "creature_template_spell has spell definitions for creature {} with a incorrect index {}", creatureID, index);
833 continue;
834 }
835
836 CreatureTemplateContainer::iterator itr = _creatureTemplateStore.find(creatureID);
837 if (itr == _creatureTemplateStore.end())
838 {
839 LOG_ERROR("sql.sql", "creature_template_spell has spell definitions for creature {} but this creature doesn't exist", creatureID);
840 continue;
841 }
842
843 CreatureTemplate& creatureTemplate = itr->second;
844 creatureTemplate.spells[index] = fields[2].Get<uint32>();
845
846 ++count;
847 } while (result->NextRow());
848
849 LOG_INFO("server.loading", ">> Loaded {} Creature Template Spells in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
850 LOG_INFO("server.loading", " ");
851}
uint32 spells[MAX_CREATURE_SPELLS]
Definition: CreatureData.h:228

References _creatureTemplateStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, MAX_CREATURE_SPELLS, CreatureTemplate::spells, and WorldDatabase.

Referenced by LoadCreatureTemplates().

◆ LoadEquipmentTemplates()

void ObjectMgr::LoadEquipmentTemplates ( )
1484{
1485 uint32 oldMSTime = getMSTime();
1486
1487 // 0 1 2 3 4
1488 QueryResult result = WorldDatabase.Query("SELECT CreatureID, ID, ItemID1, ItemID2, ItemID3 FROM creature_equip_template");
1489
1490 if (!result)
1491 {
1492 LOG_WARN("server.loading", ">> Loaded 0 creature equipment templates. DB table `creature_equip_template` is empty!");
1493 LOG_INFO("server.loading", " ");
1494 return;
1495 }
1496
1497 uint32 count = 0;
1498 do
1499 {
1500 Field* fields = result->Fetch();
1501
1502 uint32 entry = fields[0].Get<uint32>();
1503
1504 if (!sObjectMgr->GetCreatureTemplate(entry))
1505 {
1506 LOG_ERROR("sql.sql", "Creature template (CreatureID: {}) does not exist but has a record in `creature_equip_template`", entry);
1507 continue;
1508 }
1509
1510 uint8 id = fields[1].Get<uint8>();
1511 if (!id)
1512 {
1513 LOG_ERROR("sql.sql", "Creature equipment template with id 0 found for creature {}, skipped.", entry);
1514 continue;
1515 }
1516
1517 EquipmentInfo& equipmentInfo = _equipmentInfoStore[entry][id];
1518
1519 equipmentInfo.ItemEntry[0] = fields[2].Get<uint32>();
1520 equipmentInfo.ItemEntry[1] = fields[3].Get<uint32>();
1521 equipmentInfo.ItemEntry[2] = fields[4].Get<uint32>();
1522
1523 for (uint8 i = 0; i < MAX_EQUIPMENT_ITEMS; ++i)
1524 {
1525 if (!equipmentInfo.ItemEntry[i])
1526 continue;
1527
1528 ItemEntry const* dbcItem = sItemStore.LookupEntry(equipmentInfo.ItemEntry[i]);
1529
1530 if (!dbcItem)
1531 {
1532 LOG_ERROR("sql.sql", "Unknown item (ID={}) in creature_equip_template.ItemID{} for CreatureID = {} and ID = {}, forced to 0.",
1533 equipmentInfo.ItemEntry[i], i + 1, entry, id);
1534 equipmentInfo.ItemEntry[i] = 0;
1535 continue;
1536 }
1537
1538 if (dbcItem->InventoryType != INVTYPE_WEAPON &&
1539 dbcItem->InventoryType != INVTYPE_SHIELD &&
1540 dbcItem->InventoryType != INVTYPE_RANGED &&
1541 dbcItem->InventoryType != INVTYPE_2HWEAPON &&
1544 dbcItem->InventoryType != INVTYPE_HOLDABLE &&
1545 dbcItem->InventoryType != INVTYPE_THROWN &&
1547 {
1548 LOG_ERROR("sql.sql", "Item (ID={}) in creature_equip_template.ItemID{} for CreatureID = {} and ID = {} is not equipable in a hand, forced to 0.",
1549 equipmentInfo.ItemEntry[i], i + 1, entry, id);
1550 equipmentInfo.ItemEntry[i] = 0;
1551 }
1552 }
1553
1554 ++count;
1555 } while (result->NextRow());
1556
1557 LOG_INFO("server.loading", ">> Loaded {} Equipment Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1558 LOG_INFO("server.loading", " ");
1559}
@ INVTYPE_HOLDABLE
Definition: ItemTemplate.h:279
@ INVTYPE_RANGED
Definition: ItemTemplate.h:271
@ INVTYPE_THROWN
Definition: ItemTemplate.h:281
@ INVTYPE_RANGEDRIGHT
Definition: ItemTemplate.h:282
@ INVTYPE_WEAPON
Definition: ItemTemplate.h:269
@ INVTYPE_WEAPONMAINHAND
Definition: ItemTemplate.h:277
@ INVTYPE_WEAPONOFFHAND
Definition: ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition: ItemTemplate.h:273
@ INVTYPE_SHIELD
Definition: ItemTemplate.h:270
#define MAX_EQUIPMENT_ITEMS
Definition: CreatureData.h:35
Definition: CreatureData.h:360
uint32 ItemEntry[MAX_EQUIPMENT_ITEMS]
Definition: CreatureData.h:361
uint32 InventoryType
Definition: DBCStructure.h:1146

References _equipmentInfoStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), ItemEntry::InventoryType, INVTYPE_2HWEAPON, INVTYPE_HOLDABLE, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_SHIELD, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, EquipmentInfo::ItemEntry, LOG_ERROR, LOG_INFO, LOG_WARN, MAX_EQUIPMENT_ITEMS, sItemStore, sObjectMgr, and WorldDatabase.

◆ LoadEventScripts()

void ObjectMgr::LoadEventScripts ( )
5555{
5557
5558 std::set<uint32> evt_scripts;
5559 // Load all possible script entries from gameobjects
5560 GameObjectTemplateContainer const* gotc = sObjectMgr->GetGameObjectTemplates();
5561 for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
5562 if (uint32 eventId = itr->second.GetEventScriptId())
5563 evt_scripts.insert(eventId);
5564
5565 // Load all possible script entries from spells
5566 for (uint32 i = 1; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
5567 if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(i))
5568 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
5569 if (spell->Effects[j].Effect == SPELL_EFFECT_SEND_EVENT)
5570 if (spell->Effects[j].MiscValue)
5571 evt_scripts.insert(spell->Effects[j].MiscValue);
5572
5573 for (std::size_t path_idx = 0; path_idx < sTaxiPathNodesByPath.size(); ++path_idx)
5574 {
5575 for (std::size_t node_idx = 0; node_idx < sTaxiPathNodesByPath[path_idx].size(); ++node_idx)
5576 {
5577 TaxiPathNodeEntry const* node = sTaxiPathNodesByPath[path_idx][node_idx];
5578
5579 if (node->arrivalEventID)
5580 evt_scripts.insert(node->arrivalEventID);
5581
5582 if (node->departureEventID)
5583 evt_scripts.insert(node->departureEventID);
5584 }
5585 }
5586
5587 // Then check if all scripts are in above list of possible script entries
5588 for (ScriptMapMap::const_iterator itr = sEventScripts.begin(); itr != sEventScripts.end(); ++itr)
5589 {
5590 std::set<uint32>::const_iterator itr2 = evt_scripts.find(itr->first);
5591 if (itr2 == evt_scripts.end())
5592 LOG_ERROR("sql.sql", "Table `event_scripts` has script (Id: {}) not referring to any gameobject_template type 10 data2 field, type 3 data6 field, type 13 data 2 field or any spell effect {}",
5593 itr->first, SPELL_EFFECT_SEND_EVENT);
5594 }
5595}
@ SPELL_EFFECT_SEND_EVENT
Definition: SharedDefines.h:839
ScriptMapMap sEventScripts
Definition: ObjectMgr.cpp:60
@ SCRIPTS_EVENT
Definition: ObjectMgr.h:149
std::unordered_map< uint32, GameObjectTemplate > GameObjectTemplateContainer
Definition: GameObject.h:42
TaxiPathNodesByPath sTaxiPathNodesByPath
Definition: DBCStores.cpp:187
void LoadScripts(ScriptsType type)
Definition: ObjectMgr.cpp:5212
Definition: DBCStructure.h:1972
uint32 arrivalEventID
Definition: DBCStructure.h:1982
uint32 departureEventID
Definition: DBCStructure.h:1983

References TaxiPathNodeEntry::arrivalEventID, TaxiPathNodeEntry::departureEventID, LoadScripts(), LOG_ERROR, MAX_SPELL_EFFECTS, SCRIPTS_EVENT, sEventScripts, sObjectMgr, SPELL_EFFECT_SEND_EVENT, sSpellMgr, and sTaxiPathNodesByPath.

◆ LoadExplorationBaseXP()

void ObjectMgr::LoadExplorationBaseXP ( )
7432{
7433 uint32 oldMSTime = getMSTime();
7434
7435 QueryResult result = WorldDatabase.Query("SELECT level, basexp FROM exploration_basexp");
7436
7437 if (!result)
7438 {
7439 LOG_WARN("server.loading", ">> Loaded 0 BaseXP definitions. DB table `exploration_basexp` is empty.");
7440 LOG_INFO("server.loading", " ");
7441 return;
7442 }
7443
7444 uint32 count = 0;
7445
7446 do
7447 {
7448 Field* fields = result->Fetch();
7449 uint8 level = fields[0].Get<uint8>();
7450 uint32 basexp = fields[1].Get<int32>();
7451 _baseXPTable[level] = basexp;
7452 ++count;
7453 } while (result->NextRow());
7454
7455 LOG_INFO("server.loading", ">> Loaded {} BaseXP Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7456 LOG_INFO("server.loading", " ");
7457}
std::int32_t int32
Definition: Define.h:103

References _baseXPTable, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadFactionChangeAchievements()

void ObjectMgr::LoadFactionChangeAchievements ( )
9850{
9851 uint32 oldMSTime = getMSTime();
9852
9853 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_achievement");
9854
9855 if (!result)
9856 {
9857 LOG_WARN("server.loading", ">> Loaded 0 faction change achievement pairs. DB table `player_factionchange_achievement` is empty.");
9858 LOG_INFO("server.loading", " ");
9859 return;
9860 }
9861
9862 uint32 count = 0;
9863
9864 do
9865 {
9866 Field* fields = result->Fetch();
9867
9868 uint32 alliance = fields[0].Get<uint32>();
9869 uint32 horde = fields[1].Get<uint32>();
9870
9871 if (!sAchievementStore.LookupEntry(alliance))
9872 LOG_ERROR("sql.sql", "Achievement {} (alliance_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", alliance);
9873 else if (!sAchievementStore.LookupEntry(horde))
9874 LOG_ERROR("sql.sql", "Achievement {} (horde_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", horde);
9875 else
9876 FactionChangeAchievements[alliance] = horde;
9877
9878 ++count;
9879 } while (result->NextRow());
9880
9881 LOG_INFO("server.loading", ">> Loaded {} faction change achievement pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9882 LOG_INFO("server.loading", " ");
9883}
CharacterConversionMap FactionChangeAchievements
Definition: ObjectMgr.h:1420

References FactionChangeAchievements, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sAchievementStore, and WorldDatabase.

◆ LoadFactionChangeItems()

void ObjectMgr::LoadFactionChangeItems ( )
9886{
9887 uint32 oldMSTime = getMSTime();
9888
9889 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_items");
9890
9891 if (!result)
9892 {
9893 LOG_WARN("server.loading", ">> Loaded 0 faction change item pairs. DB table `player_factionchange_items` is empty.");
9894 LOG_INFO("server.loading", " ");
9895 return;
9896 }
9897
9898 uint32 count = 0;
9899
9900 do
9901 {
9902 Field* fields = result->Fetch();
9903
9904 uint32 alliance = fields[0].Get<uint32>();
9905 uint32 horde = fields[1].Get<uint32>();
9906
9907 if (!GetItemTemplate(alliance))
9908 LOG_ERROR("sql.sql", "Item {} (alliance_id) referenced in `player_factionchange_items` does not exist, pair skipped!", alliance);
9909 else if (!GetItemTemplate(horde))
9910 LOG_ERROR("sql.sql", "Item {} (horde_id) referenced in `player_factionchange_items` does not exist, pair skipped!", horde);
9911 else
9912 FactionChangeItems[alliance] = horde;
9913
9914 ++count;
9915 } while (result->NextRow());
9916
9917 LOG_INFO("server.loading", ">> Loaded {} faction change item pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9918 LOG_INFO("server.loading", " ");
9919}
CharacterConversionMap FactionChangeItems
Definition: ObjectMgr.h:1421

References FactionChangeItems, Field::Get(), GetItemTemplate(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadFactionChangeQuests()

void ObjectMgr::LoadFactionChangeQuests ( )
9922{
9923 uint32 oldMSTime = getMSTime();
9924
9925 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_quests");
9926
9927 if (!result)
9928 {
9929 LOG_WARN("server.loading", ">> Loaded 0 faction change quest pairs. DB table `player_factionchange_quests` is empty.");
9930 LOG_INFO("server.loading", " ");
9931 return;
9932 }
9933
9934 uint32 count = 0;
9935
9936 do
9937 {
9938 Field* fields = result->Fetch();
9939
9940 uint32 alliance = fields[0].Get<uint32>();
9941 uint32 horde = fields[1].Get<uint32>();
9942
9943 if (!sObjectMgr->GetQuestTemplate(alliance))
9944 LOG_ERROR("sql.sql", "Quest {} (alliance_id) referenced in `player_factionchange_quests` does not exist, pair skipped!", alliance);
9945 else if (!sObjectMgr->GetQuestTemplate(horde))
9946 LOG_ERROR("sql.sql", "Quest {} (horde_id) referenced in `player_factionchange_quests` does not exist, pair skipped!", horde);
9947 else
9948 FactionChangeQuests[alliance] = horde;
9949
9950 ++count;
9951 } while (result->NextRow());
9952
9953 LOG_INFO("server.loading", ">> Loaded {} faction change quest pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9954 LOG_INFO("server.loading", " ");
9955}
CharacterConversionMap FactionChangeQuests
Definition: ObjectMgr.h:1422

References FactionChangeQuests, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sObjectMgr, and WorldDatabase.

◆ LoadFactionChangeReputations()

void ObjectMgr::LoadFactionChangeReputations ( )
9958{
9959 uint32 oldMSTime = getMSTime();
9960
9961 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_reputations");
9962
9963 if (!result)
9964 {
9965 LOG_WARN("server.loading", ">> Loaded 0 faction change reputation pairs. DB table `player_factionchange_reputations` is empty.");
9966 LOG_INFO("server.loading", " ");
9967 return;
9968 }
9969
9970 uint32 count = 0;
9971
9972 do
9973 {
9974 Field* fields = result->Fetch();
9975
9976 uint32 alliance = fields[0].Get<uint32>();
9977 uint32 horde = fields[1].Get<uint32>();
9978
9979 if (!sFactionStore.LookupEntry(alliance))
9980 LOG_ERROR("sql.sql", "Reputation {} (alliance_id) referenced in `player_factionchange_reputations` does not exist, pair skipped!", alliance);
9981 else if (!sFactionStore.LookupEntry(horde))
9982 LOG_ERROR("sql.sql", "Reputation {} (horde_id) referenced in `player_factionchange_reputations` does not exist, pair skipped!", horde);
9983 else
9984 FactionChangeReputation[alliance] = horde;
9985
9986 ++count;
9987 } while (result->NextRow());
9988
9989 LOG_INFO("server.loading", ">> Loaded {} faction change reputation pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9990 LOG_INFO("server.loading", " ");
9991}
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
CharacterConversionMap FactionChangeReputation
Definition: ObjectMgr.h:1423

References FactionChangeReputation, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sFactionStore, and WorldDatabase.

◆ LoadFactionChangeSpells()

void ObjectMgr::LoadFactionChangeSpells ( )
9994{
9995 uint32 oldMSTime = getMSTime();
9996
9997 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_spells");
9998
9999 if (!result)
10000 {
10001 LOG_WARN("server.loading", ">> Loaded 0 faction change spell pairs. DB table `player_factionchange_spells` is empty.");
10002 LOG_INFO("server.loading", " ");
10003 return;
10004 }
10005
10006 uint32 count = 0;
10007
10008 do
10009 {
10010 Field* fields = result->Fetch();
10011
10012 uint32 alliance = fields[0].Get<uint32>();
10013 uint32 horde = fields[1].Get<uint32>();
10014
10015 if (!sSpellMgr->GetSpellInfo(alliance))
10016 LOG_ERROR("sql.sql", "Spell {} (alliance_id) referenced in `player_factionchange_spells` does not exist, pair skipped!", alliance);
10017 else if (!sSpellMgr->GetSpellInfo(horde))
10018 LOG_ERROR("sql.sql", "Spell {} (horde_id) referenced in `player_factionchange_spells` does not exist, pair skipped!", horde);
10019 else
10020 FactionChangeSpells[alliance] = horde;
10021
10022 ++count;
10023 } while (result->NextRow());
10024
10025 LOG_INFO("server.loading", ">> Loaded {} faction change spell pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10026 LOG_INFO("server.loading", " ");
10027}
CharacterConversionMap FactionChangeSpells
Definition: ObjectMgr.h:1424

References FactionChangeSpells, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sSpellMgr, and WorldDatabase.

◆ LoadFactionChangeTitles()

void ObjectMgr::LoadFactionChangeTitles ( )
10030{
10031 uint32 oldMSTime = getMSTime();
10032
10033 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_titles");
10034
10035 if (!result)
10036 {
10037 LOG_WARN("server.loading", ">> Loaded 0 faction change title pairs. DB table `player_factionchange_title` is empty.");
10038 return;
10039 }
10040
10041 uint32 count = 0;
10042
10043 do
10044 {
10045 Field* fields = result->Fetch();
10046
10047 uint32 alliance = fields[0].Get<uint32>();
10048 uint32 horde = fields[1].Get<uint32>();
10049
10050 if (!sCharTitlesStore.LookupEntry(alliance))
10051 LOG_ERROR("sql.sql", "Title {} (alliance_id) referenced in `player_factionchange_title` does not exist, pair skipped!", alliance);
10052 else if (!sCharTitlesStore.LookupEntry(horde))
10053 LOG_ERROR("sql.sql", "Title {} (horde_id) referenced in `player_factionchange_title` does not exist, pair skipped!", horde);
10054 else
10055 FactionChangeTitles[alliance] = horde;
10056
10057 ++count;
10058 } while (result->NextRow());
10059
10060 LOG_INFO("server.loading", ">> Loaded {} faction change title pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10061 LOG_INFO("server.loading", " ");
10062}
DBCStorage< CharTitlesEntry > sCharTitlesStore(CharTitlesEntryfmt)
CharacterConversionMap FactionChangeTitles
Definition: ObjectMgr.h:1425

References FactionChangeTitles, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sCharTitlesStore, and WorldDatabase.

◆ LoadFishingBaseSkillLevel()

void ObjectMgr::LoadFishingBaseSkillLevel ( )
8753{
8754 uint32 oldMSTime = getMSTime();
8755
8756 _fishingBaseForAreaStore.clear(); // for reload case
8757
8758 QueryResult result = WorldDatabase.Query("SELECT entry, skill FROM skill_fishing_base_level");
8759
8760 if (!result)
8761 {
8762 LOG_WARN("server.loading", ">> Loaded 0 areas for fishing base skill level. DB table `skill_fishing_base_level` is empty.");
8763 LOG_INFO("server.loading", " ");
8764 return;
8765 }
8766
8767 uint32 count = 0;
8768
8769 do
8770 {
8771 Field* fields = result->Fetch();
8772 uint32 entry = fields[0].Get<uint32>();
8773 int32 skill = fields[1].Get<int16>();
8774
8775 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
8776 if (!fArea)
8777 {
8778 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
8779 continue;
8780 }
8781
8782 _fishingBaseForAreaStore[entry] = skill;
8783 ++count;
8784 } while (result->NextRow());
8785
8786 LOG_INFO("server.loading", ">> Loaded {} areas for fishing base skill level in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8787 LOG_INFO("server.loading", " ");
8788}

References _fishingBaseForAreaStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sAreaTableStore, and WorldDatabase.

◆ LoadGameObjectAddons()

void ObjectMgr::LoadGameObjectAddons ( )
1374{
1375 uint32 oldMSTime = getMSTime();
1376
1377 // 0 1 2
1378 QueryResult result = WorldDatabase.Query("SELECT guid, invisibilityType, invisibilityValue FROM gameobject_addon");
1379
1380 if (!result)
1381 {
1382 LOG_WARN("server.loading", ">> Loaded 0 gameobject addon definitions. DB table `gameobject_addon` is empty.");
1383 LOG_INFO("server.loading", " ");
1384 return;
1385 }
1386
1387 uint32 count = 0;
1388 do
1389 {
1390 Field* fields = result->Fetch();
1391
1392 ObjectGuid::LowType guid = fields[0].Get<uint32>();
1393
1394 const GameObjectData* goData = GetGameObjectData(guid);
1395 if (!goData)
1396 {
1397 LOG_ERROR("sql.sql", "GameObject (GUID: {}) does not exist but has a record in `gameobject_addon`", guid);
1398 continue;
1399 }
1400
1401 GameObjectAddon& gameObjectAddon = _gameObjectAddonStore[guid];
1402 gameObjectAddon.invisibilityType = InvisibilityType(fields[1].Get<uint8>());
1403 gameObjectAddon.InvisibilityValue = fields[2].Get<uint32>();
1404
1405 if (gameObjectAddon.invisibilityType >= TOTAL_INVISIBILITY_TYPES)
1406 {
1407 LOG_ERROR("sql.sql", "GameObject (GUID: {}) has invalid InvisibilityType in `gameobject_addon`", guid);
1408 gameObjectAddon.invisibilityType = INVISIBILITY_GENERAL;
1409 gameObjectAddon.InvisibilityValue = 0;
1410 }
1411
1412 if (gameObjectAddon.invisibilityType && !gameObjectAddon.InvisibilityValue)
1413 {
1414 LOG_ERROR("sql.sql", "GameObject (GUID: {}) has InvisibilityType set but has no InvisibilityValue in `gameobject_addon`, set to 1", guid);
1415 gameObjectAddon.InvisibilityValue = 1;
1416 }
1417
1418 ++count;
1419 } while (result->NextRow());
1420
1421 LOG_INFO("server.loading", ">> Loaded {} Gameobject Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1422 LOG_INFO("server.loading", " ");
1423}
InvisibilityType
Definition: SharedDefines.h:1254
@ TOTAL_INVISIBILITY_TYPES
Definition: SharedDefines.h:1268
@ INVISIBILITY_GENERAL
Definition: SharedDefines.h:1255
Definition: GameObjectData.h:681
uint32 InvisibilityValue
Definition: GameObjectData.h:683
InvisibilityType invisibilityType
Definition: GameObjectData.h:682

References _gameObjectAddonStore, Field::Get(), GetGameObjectData(), getMSTime(), GetMSTimeDiffToNow(), INVISIBILITY_GENERAL, GameObjectAddon::invisibilityType, GameObjectAddon::InvisibilityValue, LOG_ERROR, LOG_INFO, LOG_WARN, TOTAL_INVISIBILITY_TYPES, and WorldDatabase.

◆ LoadGameObjectForQuests()

void ObjectMgr::LoadGameObjectForQuests ( )
8540{
8541 uint32 oldMSTime = getMSTime();
8542
8543 if (sObjectMgr->GetGameObjectTemplates()->empty())
8544 {
8545 LOG_WARN("server.loading", ">> Loaded 0 GameObjects for quests");
8546 LOG_INFO("server.loading", " ");
8547 return;
8548 }
8549
8550 uint32 count = 0;
8551
8552 // collect GO entries for GO that must activated
8553 GameObjectTemplateContainer* gotc = const_cast<GameObjectTemplateContainer*>(sObjectMgr->GetGameObjectTemplates());
8554 for (GameObjectTemplateContainer::iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
8555 {
8556 itr->second.IsForQuests = false;
8557 switch (itr->second.type)
8558 {
8560 itr->second.IsForQuests = true;
8561 ++count;
8562 break;
8564 {
8565 // scan GO chest with loot including quest items
8566 uint32 loot_id = (itr->second.GetLootId());
8567
8568 // find quest loot for GO
8569 if (itr->second.chest.questId || LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
8570 {
8571 itr->second.IsForQuests = true;
8572 ++count;
8573 }
8574 break;
8575 }
8577 {
8578 if (itr->second._generic.questID > 0) //quests objects
8579 {
8580 itr->second.IsForQuests = true;
8581 ++count;
8582 }
8583 break;
8584 }
8586 {
8587 if (itr->second.spellFocus.questID > 0) //quests objects
8588 {
8589 itr->second.IsForQuests = true;
8590 ++count;
8591 }
8592 break;
8593 }
8595 {
8596 if (itr->second.goober.questId > 0) //quests objects
8597 {
8598 itr->second.IsForQuests = true;
8599 ++count;
8600 }
8601 break;
8602 }
8603 default:
8604 break;
8605 }
8606 }
8607
8608 LOG_INFO("server.loading", ">> Loaded {} GameObjects for quests in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8609 LOG_INFO("server.loading", " ");
8610}
@ GAMEOBJECT_TYPE_SPELL_FOCUS
Definition: SharedDefines.h:1568
@ GAMEOBJECT_TYPE_GENERIC
Definition: SharedDefines.h:1565
@ GAMEOBJECT_TYPE_CHEST
Definition: SharedDefines.h:1563
@ GAMEOBJECT_TYPE_QUESTGIVER
Definition: SharedDefines.h:1562
@ GAMEOBJECT_TYPE_GOOBER
Definition: SharedDefines.h:1570
LootStore LootTemplates_Gameobject("gameobject_loot_template", "gameobject entry", true)
bool HaveQuestLootFor(uint32 loot_id) const
Definition: LootMgr.cpp:218

References GAMEOBJECT_TYPE_CHEST, GAMEOBJECT_TYPE_GENERIC, GAMEOBJECT_TYPE_GOOBER, GAMEOBJECT_TYPE_QUESTGIVER, GAMEOBJECT_TYPE_SPELL_FOCUS, getMSTime(), GetMSTimeDiffToNow(), LootStore::HaveQuestLootFor(), LOG_INFO, LOG_WARN, LootTemplates_Gameobject, and sObjectMgr.

◆ LoadGameObjectLocales()

void ObjectMgr::LoadGameObjectLocales ( )
7076{
7077 uint32 oldMSTime = getMSTime();
7078
7079 _gameObjectLocaleStore.clear(); // need for reload case
7080
7081 // 0 1 2 3
7082 QueryResult result = WorldDatabase.Query("SELECT entry, locale, name, castBarCaption FROM gameobject_template_locale");
7083 if (!result)
7084 return;
7085
7086 do
7087 {
7088 Field* fields = result->Fetch();
7089
7090 uint32 ID = fields[0].Get<uint32>();
7091
7092 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
7093 if (locale == LOCALE_enUS)
7094 continue;
7095
7097 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
7098 AddLocaleString(fields[3].Get<std::string>(), locale, data.CastBarCaption);
7099 } while (result->NextRow());
7100
7101 LOG_INFO("server.loading", ">> Loaded {} Gameobject Locale Strings in {} ms", (uint32)_gameObjectLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
7102}
Definition: GameObjectData.h:674
std::vector< std::string > Name
Definition: GameObjectData.h:675
std::vector< std::string > CastBarCaption
Definition: GameObjectData.h:676

References _gameObjectLocaleStore, AddLocaleString(), GameObjectLocale::CastBarCaption, Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_INFO, GameObjectLocale::Name, and WorldDatabase.

◆ LoadGameobjectQuestEnders()

void ObjectMgr::LoadGameobjectQuestEnders ( )
8112{
8113 LoadQuestRelationsHelper(_goQuestInvolvedRelations, "gameobject_questender", false, true);
8114
8115 for (QuestRelations::iterator itr = _goQuestInvolvedRelations.begin(); itr != _goQuestInvolvedRelations.end(); ++itr)
8116 {
8117 GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
8118 if (!goInfo)
8119 LOG_ERROR("sql.sql", "Table `gameobject_questender` have data for not existed gameobject entry ({}) and existed quest {}", itr->first, itr->second);
8120 else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
8121 LOG_ERROR("sql.sql", "Table `gameobject_questender` have data gameobject entry ({}) for quest {}, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
8122 }
8123}

References _goQuestInvolvedRelations, GAMEOBJECT_TYPE_QUESTGIVER, GetGameObjectTemplate(), LoadQuestRelationsHelper(), LOG_ERROR, and GameObjectTemplate::type.

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameObjectQuestItems()

void ObjectMgr::LoadGameObjectQuestItems ( )
10123{
10124 uint32 oldMSTime = getMSTime();
10125
10126 // 0 1 2
10127 QueryResult result = WorldDatabase.Query("SELECT GameObjectEntry, ItemId, Idx FROM gameobject_questitem ORDER BY Idx ASC");
10128
10129 if (!result)
10130 {
10131 LOG_WARN("server.loading", ">> Loaded 0 gameobject quest items. DB table `gameobject_questitem` is empty.");
10132 return;
10133 }
10134
10135 uint32 count = 0;
10136 do
10137 {
10138 Field* fields = result->Fetch();
10139
10140 uint32 entry = fields[0].Get<uint32>();
10141 uint32 item = fields[1].Get<uint32>();
10142 uint32 idx = fields[2].Get<uint32>();
10143
10144 GameObjectTemplate const* goInfo = GetGameObjectTemplate(entry);
10145 if (!goInfo)
10146 {
10147 LOG_ERROR("sql.sql", "Table `gameobject_questitem` has data for nonexistent gameobject (entry: {}, idx: {}), skipped", entry, idx);
10148 continue;
10149 };
10150
10151 ItemEntry const* dbcData = sItemStore.LookupEntry(item);
10152 if (!dbcData)
10153 {
10154 LOG_ERROR("sql.sql", "Table `gameobject_questitem` has nonexistent item (ID: {}) in gameobject (entry: {}, idx: {}), skipped", item, entry, idx);
10155 continue;
10156 };
10157
10158 _gameObjectQuestItemStore[entry].push_back(item);
10159
10160 ++count;
10161 } while (result->NextRow());
10162
10163 LOG_INFO("server.loading", ">> Loaded {} Gameobject Quest Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10164 LOG_INFO("server.loading", " ");
10165}

References _gameObjectQuestItemStore, Field::Get(), GetGameObjectTemplate(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sItemStore, and WorldDatabase.

◆ LoadGameobjectQuestStarters()

void ObjectMgr::LoadGameobjectQuestStarters ( )
8098{
8099 LoadQuestRelationsHelper(_goQuestRelations, "gameobject_queststarter", true, true);
8100
8101 for (QuestRelations::iterator itr = _goQuestRelations.begin(); itr != _goQuestRelations.end(); ++itr)
8102 {
8103 GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
8104 if (!goInfo)
8105 LOG_ERROR("sql.sql", "Table `gameobject_queststarter` have data for not existed gameobject entry ({}) and existed quest {}", itr->first, itr->second);
8106 else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
8107 LOG_ERROR("sql.sql", "Table `gameobject_queststarter` have data gameobject entry ({}) for quest {}, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
8108 }
8109}

References _goQuestRelations, GAMEOBJECT_TYPE_QUESTGIVER, GetGameObjectTemplate(), LoadQuestRelationsHelper(), LOG_ERROR, and GameObjectTemplate::type.

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameobjects()

void ObjectMgr::LoadGameobjects ( )
2436{
2437 uint32 oldMSTime = getMSTime();
2438
2439 // 0 1 2 3 4 5 6
2440 QueryResult result = WorldDatabase.Query("SELECT gameobject.guid, id, map, position_x, position_y, position_z, orientation, "
2441 // 7 8 9 10 11 12 13 14 15 16 17
2442 "rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state, spawnMask, phaseMask, eventEntry, pool_entry, "
2443 // 18
2444 "ScriptName "
2445 "FROM gameobject LEFT OUTER JOIN game_event_gameobject ON gameobject.guid = game_event_gameobject.guid "
2446 "LEFT OUTER JOIN pool_gameobject ON gameobject.guid = pool_gameobject.guid");
2447
2448 if (!result)
2449 {
2450 LOG_WARN("server.loading", ">> Loaded 0 gameobjects. DB table `gameobject` is empty.");
2451 LOG_INFO("server.loading", " ");
2452 return;
2453 }
2454
2455 // build single time for check spawnmask
2456 std::map<uint32, uint32> spawnMasks;
2457 for (uint32 i = 0; i < sMapStore.GetNumRows(); ++i)
2458 if (sMapStore.LookupEntry(i))
2459 for (int k = 0; k < MAX_DIFFICULTY; ++k)
2461 spawnMasks[i] |= (1 << k);
2462
2463 _gameObjectDataStore.rehash(result->GetRowCount());
2464 do
2465 {
2466 Field* fields = result->Fetch();
2467
2468 ObjectGuid::LowType guid = fields[0].Get<uint32>();
2469 uint32 entry = fields[1].Get<uint32>();
2470
2471 GameObjectTemplate const* gInfo = GetGameObjectTemplate(entry);
2472 if (!gInfo)
2473 {
2474 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {}) with non existing gameobject entry {}, skipped.", guid, entry);
2475 continue;
2476 }
2477
2478 if (!gInfo->displayId)
2479 {
2480 switch (gInfo->type)
2481 {
2484 break;
2485 default:
2486 LOG_ERROR("sql.sql", "Gameobject (GUID: {} Entry {} GoType: {}) doesn't have a displayId ({}), not loaded.", guid, entry, gInfo->type, gInfo->displayId);
2487 break;
2488 }
2489 }
2490
2491 if (gInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(gInfo->displayId))
2492 {
2493 LOG_ERROR("sql.sql", "Gameobject (GUID: {} Entry {} GoType: {}) has an invalid displayId ({}), not loaded.", guid, entry, gInfo->type, gInfo->displayId);
2494 continue;
2495 }
2496
2498
2499 data.id = entry;
2500 data.mapid = fields[2].Get<uint16>();
2501 data.posX = fields[3].Get<float>();
2502 data.posY = fields[4].Get<float>();
2503 data.posZ = fields[5].Get<float>();
2504 data.orientation = fields[6].Get<float>();
2505 data.rotation.x = fields[7].Get<float>();
2506 data.rotation.y = fields[8].Get<float>();
2507 data.rotation.z = fields[9].Get<float>();
2508 data.rotation.w = fields[10].Get<float>();
2509 data.spawntimesecs = fields[11].Get<int32>();
2510 data.ScriptId = GetScriptId(fields[18].Get<std::string>());
2511 if (!data.ScriptId)
2512 data.ScriptId = gInfo->ScriptId;
2513
2514 MapEntry const* mapEntry = sMapStore.LookupEntry(data.mapid);
2515 if (!mapEntry)
2516 {
2517 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) spawned on a non-existed map (Id: {}), skip", guid, data.id, data.mapid);
2518 continue;
2519 }
2520
2521 if (data.spawntimesecs == 0 && gInfo->IsDespawnAtAction())
2522 {
2523 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with `spawntimesecs` (0) value, but the gameobejct is marked as despawnable at action.", guid, data.id);
2524 }
2525
2526 data.animprogress = fields[12].Get<uint8>();
2527 data.artKit = 0;
2528
2529 uint32 go_state = fields[13].Get<uint8>();
2530 if (go_state >= MAX_GO_STATE)
2531 {
2532 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid `state` ({}) value, skip", guid, data.id, go_state);
2533 continue;
2534 }
2535 data.go_state = GOState(go_state);
2536
2537 data.spawnMask = fields[14].Get<uint8>();
2538
2539 if (!_transportMaps.count(data.mapid) && data.spawnMask & ~spawnMasks[data.mapid])
2540 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) that has wrong spawn mask {} including not supported difficulty modes for map (Id: {}), skip", guid, data.id, data.spawnMask, data.mapid);
2541
2542 data.phaseMask = fields[15].Get<uint32>();
2543 int16 gameEvent = fields[16].Get<int8>();
2544 uint32 PoolId = fields[17].Get<uint32>();
2545
2546 if (data.rotation.x < -1.0f || data.rotation.x > 1.0f)
2547 {
2548 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationX ({}) value, skip", guid, data.id, data.rotation.x);
2549 continue;
2550 }
2551
2552 if (data.rotation.y < -1.0f || data.rotation.y > 1.0f)
2553 {
2554 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationY ({}) value, skip", guid, data.id, data.rotation.y);
2555 continue;
2556 }
2557
2558 if (data.rotation.z < -1.0f || data.rotation.z > 1.0f)
2559 {
2560 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationZ ({}) value, skip", guid, data.id, data.rotation.z);
2561 continue;
2562 }
2563
2564 if (data.rotation.w < -1.0f || data.rotation.w > 1.0f)
2565 {
2566 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationW ({}) value, skip", guid, data.id, data.rotation.w);
2567 continue;
2568 }
2569
2570 if (!MapMgr::IsValidMapCoord(data.mapid, data.posX, data.posY, data.posZ, data.orientation))
2571 {
2572 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid coordinates, skip", guid, data.id);
2573 continue;
2574 }
2575
2576 if (data.phaseMask == 0)
2577 {
2578 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with `phaseMask`=0 (not visible for anyone), set to 1.", guid, data.id);
2579 data.phaseMask = 1;
2580 }
2581
2583 {
2584 uint32 zoneId = sMapMgr->GetZoneId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
2585 uint32 areaId = sMapMgr->GetAreaId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
2586
2588
2589 stmt->SetData(0, zoneId);
2590 stmt->SetData(1, areaId);
2591 stmt->SetData(2, guid);
2592
2593 WorldDatabase.Execute(stmt);
2594 }
2595
2596 if (gameEvent == 0 && PoolId == 0) // if not this is to be managed by GameEvent System or Pool system
2597 AddGameobjectToGrid(guid, &data);
2598 } while (result->NextRow());
2599
2600 LOG_INFO("server.loading", ">> Loaded {} Gameobjects in {} ms", (unsigned long)_gameObjectDataStore.size(), GetMSTimeDiffToNow(oldMSTime));
2601 LOG_INFO("server.loading", " ");
2602}
@ GAMEOBJECT_TYPE_TRAP
Definition: SharedDefines.h:1566
@ CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA
Definition: IWorld.h:154
#define MAX_GO_STATE
Definition: GameObjectData.h:27
GOState
Definition: GameObjectData.h:688
DBCStorage< GameObjectDisplayInfoEntry > sGameObjectDisplayInfoStore(GameObjectDisplayInfofmt)
@ WORLD_UPD_GAMEOBJECT_ZONE_AREA_DATA
Definition: WorldDatabase.h:100
uint32 ScriptId
Definition: GameObjectData.h:707
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition: MapMgr.h:89

References _gameObjectDataStore, _transportMaps, AddGameobjectToGrid(), GameObjectData::animprogress, GameObjectData::artKit, CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA, GAMEOBJECT_TYPE_SPELL_FOCUS, GAMEOBJECT_TYPE_TRAP, Field::Get(), GetGameObjectTemplate(), GetMapDifficultyData(), getMSTime(), GetMSTimeDiffToNow(), GetScriptId(), GameObjectData::go_state, GameObjectData::id, MapMgr::IsValidMapCoord(), LOG_ERROR, LOG_INFO, LOG_WARN, GameObjectData::mapid, MAX_DIFFICULTY, MAX_GO_STATE, GameObjectData::orientation, GameObjectData::phaseMask, GameObjectData::posX, GameObjectData::posY, GameObjectData::posZ, GameObjectData::rotation, GameObjectData::ScriptId, PreparedStatementBase::SetData(), sGameObjectDisplayInfoStore, sMapMgr, sMapStore, GameObjectData::spawnMask, GameObjectData::spawntimesecs, sWorld, WORLD_UPD_GAMEOBJECT_ZONE_AREA_DATA, and WorldDatabase.

◆ LoadGameObjectTemplate()

void ObjectMgr::LoadGameObjectTemplate ( )
7164{
7165 uint32 oldMSTime = getMSTime();
7166
7167 // 0 1 2 3 4 5 6 7
7168 QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, size, "
7169 // 8 9 10 11 12 13 14 15 16 17 18 19 20
7170 "Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, "
7171 // 21 22 23 24 25 26 27 28 29 30 31 32 33
7172 "Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, AIName, ScriptName "
7173 "FROM gameobject_template");
7174
7175 if (!result)
7176 {
7177 LOG_WARN("server.loading", ">> Loaded 0 gameobject definitions. DB table `gameobject_template` is empty.");
7178 LOG_INFO("server.loading", " ");
7179 return;
7180 }
7181
7182 _gameObjectTemplateStore.rehash(result->GetRowCount());
7183 uint32 count = 0;
7184 do
7185 {
7186 Field* fields = result->Fetch();
7187
7188 uint32 entry = fields[0].Get<uint32>();
7189
7191
7192 got.entry = entry;
7193 got.type = uint32(fields[1].Get<uint8>());
7194 got.displayId = fields[2].Get<uint32>();
7195 got.name = fields[3].Get<std::string>();
7196 got.IconName = fields[4].Get<std::string>();
7197 got.castBarCaption = fields[5].Get<std::string>();
7198 got.unk1 = fields[6].Get<std::string>();
7199 got.size = fields[7].Get<float>();
7200
7201 for (uint8 i = 0; i < MAX_GAMEOBJECT_DATA; ++i)
7202 got.raw.data[i] = fields[8 + i].Get<int32>(); // data1 and data6 can be -1
7203
7204 got.AIName = fields[32].Get<std::string>();
7205 got.ScriptId = GetScriptId(fields[33].Get<std::string>());
7206 got.IsForQuests = false;
7207
7208 // Checks
7209 if (!got.AIName.empty() && !sGameObjectAIRegistry->HasItem(got.AIName))
7210 {
7211 LOG_ERROR("sql.sql", "GameObject (Entry: {}) has non-registered `AIName` '{}' set, removing", got.entry, got.AIName);
7212 }
7213
7214 switch (got.type)
7215 {
7216 case GAMEOBJECT_TYPE_DOOR: //0
7217 {
7218 if (got.door.lockId)
7219 CheckGOLockId(&got, got.door.lockId, 1);
7220 CheckGONoDamageImmuneId(&got, got.door.noDamageImmune, 3);
7221 break;
7222 }
7223 case GAMEOBJECT_TYPE_BUTTON: //1
7224 {
7225 if (got.button.lockId)
7226 CheckGOLockId(&got, got.button.lockId, 1);
7227 CheckGONoDamageImmuneId(&got, got.button.noDamageImmune, 4);
7228 break;
7229 }
7231 {
7232 if (got.questgiver.lockId)
7233 CheckGOLockId(&got, got.questgiver.lockId, 0);
7234 CheckGONoDamageImmuneId(&got, got.questgiver.noDamageImmune, 5);
7235 break;
7236 }
7237 case GAMEOBJECT_TYPE_CHEST: //3
7238 {
7239 if (got.chest.lockId)
7240 CheckGOLockId(&got, got.chest.lockId, 0);
7241
7242 CheckGOConsumable(&got, got.chest.consumable, 3);
7243
7244 if (got.chest.linkedTrapId) // linked trap
7245 CheckGOLinkedTrapId(&got, got.chest.linkedTrapId, 7);
7246 break;
7247 }
7248 case GAMEOBJECT_TYPE_TRAP: //6
7249 {
7250 if (got.trap.lockId)
7251 CheckGOLockId(&got, got.trap.lockId, 0);
7252 break;
7253 }
7254 case GAMEOBJECT_TYPE_CHAIR: //7
7255 CheckAndFixGOChairHeightId(&got, got.chair.height, 1);
7256 break;
7258 {
7259 if (got.spellFocus.focusId)
7260 {
7261 if (!sSpellFocusObjectStore.LookupEntry(got.spellFocus.focusId))
7262 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data0={} but SpellFocus (Id: {}) not exist.",
7263 entry, got.type, got.spellFocus.focusId, got.spellFocus.focusId);
7264 }
7265
7266 if (got.spellFocus.linkedTrapId) // linked trap
7267 CheckGOLinkedTrapId(&got, got.spellFocus.linkedTrapId, 2);
7268 break;
7269 }
7270 case GAMEOBJECT_TYPE_GOOBER: //10
7271 {
7272 if (got.goober.lockId)
7273 CheckGOLockId(&got, got.goober.lockId, 0);
7274
7275 CheckGOConsumable(&got, got.goober.consumable, 3);
7276
7277 if (got.goober.pageId) // pageId
7278 {
7279 if (!GetPageText(got.goober.pageId))
7280 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data7={} but PageText (Entry {}) not exist.",
7281 entry, got.type, got.goober.pageId, got.goober.pageId);
7282 }
7283 CheckGONoDamageImmuneId(&got, got.goober.noDamageImmune, 11);
7284 if (got.goober.linkedTrapId) // linked trap
7285 CheckGOLinkedTrapId(&got, got.goober.linkedTrapId, 12);
7286 break;
7287 }
7289 {
7290 if (got.areadamage.lockId)
7291 CheckGOLockId(&got, got.areadamage.lockId, 0);
7292 break;
7293 }
7294 case GAMEOBJECT_TYPE_CAMERA: //13
7295 {
7296 if (got.camera.lockId)
7297 CheckGOLockId(&got, got.camera.lockId, 0);
7298 break;
7299 }
7301 {
7302 if (got.moTransport.taxiPathId)
7303 {
7304 if (got.moTransport.taxiPathId >= sTaxiPathNodesByPath.size() || sTaxiPathNodesByPath[got.moTransport.taxiPathId].empty())
7305 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data0={} but TaxiPath (Id: {}) not exist.",
7306 entry, got.type, got.moTransport.taxiPathId, got.moTransport.taxiPathId);
7307 }
7308 if (uint32 transportMap = got.moTransport.mapID)
7309 _transportMaps.insert(transportMap);
7310 break;
7311 }
7313 break;
7315 {
7316 // always must have spell
7317 CheckGOSpellId(&got, got.spellcaster.spellId, 0);
7318 break;
7319 }
7320 case GAMEOBJECT_TYPE_FLAGSTAND: //24
7321 {
7322 if (got.flagstand.lockId)
7323 CheckGOLockId(&got, got.flagstand.lockId, 0);
7324 CheckGONoDamageImmuneId(&got, got.flagstand.noDamageImmune, 5);
7325 break;
7326 }
7328 {
7329 if (got.fishinghole.lockId)
7330 CheckGOLockId(&got, got.fishinghole.lockId, 4);
7331 break;
7332 }
7333 case GAMEOBJECT_TYPE_FLAGDROP: //26
7334 {
7335 if (got.flagdrop.lockId)
7336 CheckGOLockId(&got, got.flagdrop.lockId, 0);
7337 CheckGONoDamageImmuneId(&got, got.flagdrop.noDamageImmune, 3);
7338 break;
7339 }
7341 CheckAndFixGOChairHeightId(&got, got.barberChair.chairheight, 0);
7342 break;
7343 }
7344
7345 ++count;
7346 } while (result->NextRow());
7347
7348 LOG_INFO("server.loading", ">> Loaded {} Game Object Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7349 LOG_INFO("server.loading", " ");
7350}
@ GAMEOBJECT_TYPE_CAMERA
Definition: SharedDefines.h:1573
@ GAMEOBJECT_TYPE_BUTTON
Definition: SharedDefines.h:1561
@ GAMEOBJECT_TYPE_MO_TRANSPORT
Definition: SharedDefines.h:1575
@ GAMEOBJECT_TYPE_SUMMONING_RITUAL
Definition: SharedDefines.h:1578
@ GAMEOBJECT_TYPE_FISHINGHOLE
Definition: SharedDefines.h:1585
@ GAMEOBJECT_TYPE_FLAGDROP
Definition: SharedDefines.h:1586
@ GAMEOBJECT_TYPE_SPELLCASTER
Definition: SharedDefines.h:1582
@ GAMEOBJECT_TYPE_FLAGSTAND
Definition: SharedDefines.h:1584
@ GAMEOBJECT_TYPE_CHAIR
Definition: SharedDefines.h:1567
@ GAMEOBJECT_TYPE_AREADAMAGE
Definition: SharedDefines.h:1572
@ GAMEOBJECT_TYPE_BARBER_CHAIR
Definition: SharedDefines.h:1592
@ GAMEOBJECT_TYPE_DOOR
Definition: SharedDefines.h:1560
#define MAX_GAMEOBJECT_DATA
Definition: SharedDefines.h:1599
void CheckGONoDamageImmuneId(GameObjectTemplate *goTemplate, uint32 dataN, uint32 N)
Definition: ObjectMgr.cpp:7144
void CheckGOSpellId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition: ObjectMgr.cpp:7123
void CheckAndFixGOChairHeightId(GameObjectTemplate const *goInfo, uint32 const &dataN, uint32 N)
Definition: ObjectMgr.cpp:7132
void CheckGOConsumable(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition: ObjectMgr.cpp:7153
void CheckGOLinkedTrapId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition: ObjectMgr.cpp:7113
void CheckGOLockId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition: ObjectMgr.cpp:7104
#define sGameObjectAIRegistry
Definition: GameObjectAIFactory.h:49
DBCStorage< SpellFocusObjectEntry > sSpellFocusObjectStore(SpellFocusObjectfmt)
PageText const * GetPageText(uint32 pageEntry)
Definition: ObjectMgr.cpp:5796

References _gameObjectTemplateStore, _transportMaps, CheckAndFixGOChairHeightId(), CheckGOConsumable(), CheckGOLinkedTrapId(), CheckGOLockId(), CheckGONoDamageImmuneId(), CheckGOSpellId(), GAMEOBJECT_TYPE_AREADAMAGE, GAMEOBJECT_TYPE_BARBER_CHAIR, GAMEOBJECT_TYPE_BUTTON, GAMEOBJECT_TYPE_CAMERA, GAMEOBJECT_TYPE_CHAIR, GAMEOBJECT_TYPE_CHEST, GAMEOBJECT_TYPE_DOOR, GAMEOBJECT_TYPE_FISHINGHOLE, GAMEOBJECT_TYPE_FLAGDROP, GAMEOBJECT_TYPE_FLAGSTAND, GAMEOBJECT_TYPE_GOOBER, GAMEOBJECT_TYPE_MO_TRANSPORT, GAMEOBJECT_TYPE_QUESTGIVER, GAMEOBJECT_TYPE_SPELL_FOCUS, GAMEOBJECT_TYPE_SPELLCASTER, GAMEOBJECT_TYPE_SUMMONING_RITUAL, GAMEOBJECT_TYPE_TRAP, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), GetPageText(), GetScriptId(), LOG_ERROR, LOG_INFO, LOG_WARN, MAX_GAMEOBJECT_DATA, sGameObjectAIRegistry, sSpellFocusObjectStore, sTaxiPathNodesByPath, and WorldDatabase.

◆ LoadGameObjectTemplateAddons()

void ObjectMgr::LoadGameObjectTemplateAddons ( )
7353{
7354 uint32 oldMSTime = getMSTime();
7355
7356 // 0 1 2 3 4 5 6 7 8
7357 QueryResult result = WorldDatabase.Query("SELECT entry, faction, flags, mingold, maxgold, artkit0, artkit1, artkit2, artkit3 FROM gameobject_template_addon");
7358
7359 if (!result)
7360 {
7361 LOG_WARN("server.loading", ">> Loaded 0 gameobject template addon definitions. DB table `gameobject_template_addon` is empty.");
7362 LOG_INFO("server.loading", " ");
7363 return;
7364 }
7365
7366 uint32 count = 0;
7367 do
7368 {
7369 Field* fields = result->Fetch();
7370
7371 uint32 entry = fields[0].Get<uint32>();
7372
7373 GameObjectTemplate const* got = sObjectMgr->GetGameObjectTemplate(entry);
7374 if (!got)
7375 {
7376 LOG_ERROR("sql.sql",
7377 "GameObject template (Entry: {}) does not exist but has a record in `gameobject_template_addon`",
7378 entry);
7379 continue;
7380 }
7381
7383 gameObjectAddon.faction = uint32(fields[1].Get<uint16>());
7384 gameObjectAddon.flags = fields[2].Get<uint32>();
7385 gameObjectAddon.mingold = fields[3].Get<uint32>();
7386 gameObjectAddon.maxgold = fields[4].Get<uint32>();
7387
7388 for (uint32 i = 0; i < gameObjectAddon.artKits.size(); i++)
7389 {
7390 uint32 artKitID = fields[5 + i].Get<uint32>();
7391 if (!artKitID)
7392 continue;
7393
7394 if (!sGameObjectArtKitStore.LookupEntry(artKitID))
7395 {
7396 LOG_ERROR("sql.sql", "GameObject (Entry: {}) has invalid `artkit{}` {} defined, set to zero instead.", entry, i, artKitID);
7397 continue;
7398 }
7399
7400 gameObjectAddon.artKits[i] = artKitID;
7401 }
7402
7403 // checks
7404 if (gameObjectAddon.faction && !sFactionTemplateStore.LookupEntry(gameObjectAddon.faction))
7405 LOG_ERROR("sql.sql",
7406 "GameObject (Entry: {}) has invalid faction ({}) defined in `gameobject_template_addon`.",
7407 entry, gameObjectAddon.faction);
7408
7409 if (gameObjectAddon.maxgold > 0)
7410 {
7411 switch (got->type)
7412 {
7415 break;
7416 default:
7417 LOG_ERROR("sql.sql",
7418 "GameObject (Entry {} GoType: {}) cannot be looted but has maxgold set in `gameobject_template_addon`.",
7419 entry, got->type);
7420 break;
7421 }
7422 }
7423
7424 ++count;
7425 } while (result->NextRow());
7426
7427 LOG_INFO("server.loading", ">> Loaded {} Game Object Template Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7428 LOG_INFO("server.loading", " ");
7429}
DBCStorage< GameObjectArtKitEntry > sGameObjectArtKitStore(GameObjectArtKitfmt)
Definition: GameObjectData.h:664
uint32 mingold
Definition: GameObjectData.h:668
uint32 flags
Definition: GameObjectData.h:667
uint32 faction
Definition: GameObjectData.h:666
std::array< uint32, 4 > artKits
Definition: GameObjectData.h:670
uint32 maxgold
Definition: GameObjectData.h:669

References _gameObjectTemplateAddonStore, GameObjectTemplateAddon::artKits, GameObjectTemplateAddon::faction, GameObjectTemplateAddon::flags, GAMEOBJECT_TYPE_CHEST, GAMEOBJECT_TYPE_FISHINGHOLE, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, GameObjectTemplateAddon::maxgold, GameObjectTemplateAddon::mingold, sFactionTemplateStore, sGameObjectArtKitStore, sObjectMgr, and WorldDatabase.

◆ LoadGameTele()

void ObjectMgr::LoadGameTele ( )
8893{
8894 uint32 oldMSTime = getMSTime();
8895
8896 _gameTeleStore.clear(); // for reload case
8897
8898 // 0 1 2 3 4 5 6
8899 QueryResult result = WorldDatabase.Query("SELECT id, position_x, position_y, position_z, orientation, map, name FROM game_tele");
8900
8901 if (!result)
8902 {
8903 LOG_WARN("server.loading", ">> Loaded 0 GameTeleports. DB table `game_tele` is empty!");
8904 LOG_INFO("server.loading", " ");
8905 return;
8906 }
8907
8908 uint32 count = 0;
8909
8910 do
8911 {
8912 Field* fields = result->Fetch();
8913
8914 uint32 id = fields[0].Get<uint32>();
8915
8916 GameTele gt;
8917
8918 gt.position_x = fields[1].Get<float>();
8919 gt.position_y = fields[2].Get<float>();
8920 gt.position_z = fields[3].Get<float>();
8921 gt.orientation = fields[4].Get<float>();
8922 gt.mapId = fields[5].Get<uint16>();
8923 gt.name = fields[6].Get<std::string>();
8924
8925 if (!MapMgr::IsValidMapCoord(gt.mapId, gt.position_x, gt.position_y, gt.position_z, gt.orientation))
8926 {
8927 LOG_ERROR("sql.sql", "Wrong position for id {} (name: {}) in `game_tele` table, ignoring.", id, gt.name);
8928 continue;
8929 }
8930
8931 if (!Utf8toWStr(gt.name, gt.wnameLow))
8932 {
8933 LOG_ERROR("sql.sql", "Wrong UTF8 name for id {} in `game_tele` table, ignoring.", id);
8934 continue;
8935 }
8936
8937 wstrToLower(gt.wnameLow);
8938
8939 _gameTeleStore[id] = gt;
8940
8941 ++count;
8942 } while (result->NextRow());
8943
8944 LOG_INFO("server.loading", ">> Loaded {} GameTeleports in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8945 LOG_INFO("server.loading", " ");
8946}
float position_x
Definition: ObjectMgr.h:133

References _gameTeleStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), MapMgr::IsValidMapCoord(), LOG_ERROR, LOG_INFO, LOG_WARN, GameTele::position_x, Utf8toWStr(), WorldDatabase, and wstrToLower().

◆ LoadGossipMenu()

void ObjectMgr::LoadGossipMenu ( )
9309{
9310 uint32 oldMSTime = getMSTime();
9311
9312 _gossipMenusStore.clear();
9313
9314 QueryResult result = WorldDatabase.Query("SELECT MenuID, TextID FROM gossip_menu");
9315
9316 if (!result)
9317 {
9318 LOG_WARN("server.loading", ">> Loaded 0 gossip_menu entries. DB table `gossip_menu` is empty!");
9319 LOG_INFO("server.loading", " ");
9320 return;
9321 }
9322
9323 do
9324 {
9325 Field* fields = result->Fetch();
9326
9327 GossipMenus gMenu;
9328
9329 gMenu.MenuID = fields[0].Get<uint32>();
9330 gMenu.TextID = fields[1].Get<uint32>();
9331
9332 if (!GetGossipText(gMenu.TextID))
9333 {
9334 LOG_ERROR("sql.sql", "Table gossip_menu entry {} are using non-existing TextID {}", gMenu.MenuID, gMenu.TextID);
9335 continue;
9336 }
9337
9338 _gossipMenusStore.insert(GossipMenusContainer::value_type(gMenu.MenuID, gMenu));
9339 } while (result->NextRow());
9340
9341 LOG_INFO("server.loading", ">> Loaded {} gossip_menu entries in {} ms", (uint32)_gossipMenusStore.size(), GetMSTimeDiffToNow(oldMSTime));
9342 LOG_INFO("server.loading", " ");
9343}
Definition: ObjectMgr.h:624
uint32 TextID
Definition: ObjectMgr.h:626
uint32 MenuID
Definition: ObjectMgr.h:625
GossipText const * GetGossipText(uint32 Text_ID) const
Definition: ObjectMgr.cpp:5970

References _gossipMenusStore, Field::Get(), GetGossipText(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, GossipMenus::MenuID, GossipMenus::TextID, and WorldDatabase.

◆ LoadGossipMenuItems()

void ObjectMgr::LoadGossipMenuItems ( )
9346{
9347 uint32 oldMSTime = getMSTime();
9348
9349 _gossipMenuItemsStore.clear();
9350
9351 QueryResult result = WorldDatabase.Query(
9352 // 0 1 2 3 4 5 6 7 8 9 10 11 12
9353 "SELECT MenuID, OptionID, OptionIcon, OptionText, OptionBroadcastTextID, OptionType, OptionNpcFlag, ActionMenuID, ActionPoiID, BoxCoded, BoxMoney, BoxText, BoxBroadcastTextID "
9354 "FROM gossip_menu_option ORDER BY MenuID, OptionID");
9355
9356 if (!result)
9357 {
9358 LOG_WARN("server.loading", ">> Loaded 0 gossip_menu_option IDs. DB table `gossip_menu_option` is empty!");
9359 LOG_INFO("server.loading", " ");
9360 return;
9361 }
9362
9363 do
9364 {
9365 Field* fields = result->Fetch();
9366
9367 GossipMenuItems gMenuItem;
9368
9369 gMenuItem.MenuID = fields[0].Get<uint32>();
9370 gMenuItem.OptionID = fields[1].Get<uint16>();
9371 gMenuItem.OptionIcon = fields[2].Get<uint32>();
9372 gMenuItem.OptionText = fields[3].Get<std::string>();
9373 gMenuItem.OptionBroadcastTextID = fields[4].Get<uint32>();
9374 gMenuItem.OptionType = fields[5].Get<uint8>();
9375 gMenuItem.OptionNpcFlag = fields[6].Get<uint32>();
9376 gMenuItem.ActionMenuID = fields[7].Get<uint32>();
9377 gMenuItem.ActionPoiID = fields[8].Get<uint32>();
9378 gMenuItem.BoxCoded = fields[9].Get<bool>();
9379 gMenuItem.BoxMoney = fields[10].Get<uint32>();
9380 gMenuItem.BoxText = fields[11].Get<std::string>();
9381 gMenuItem.BoxBroadcastTextID = fields[12].Get<uint32>();
9382
9383 if (gMenuItem.OptionIcon >= GOSSIP_ICON_MAX)
9384 {
9385 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has unknown icon id {}. Replacing with GOSSIP_ICON_CHAT", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.OptionIcon);
9386 gMenuItem.OptionIcon = GOSSIP_ICON_CHAT;
9387 }
9388
9390 {
9391 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has non-existing or incompatible OptionBroadcastTextID {}, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.OptionBroadcastTextID);
9392 gMenuItem.OptionBroadcastTextID = 0;
9393 }
9394
9395 if (gMenuItem.OptionType >= GOSSIP_OPTION_MAX)
9396 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has unknown option id {}. Option will not be used", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.OptionType);
9397
9398 if (gMenuItem.ActionPoiID && !GetPointOfInterest(gMenuItem.ActionPoiID))
9399 {
9400 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} use non-existing ActionPoiID {}, ignoring", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.ActionPoiID);
9401 gMenuItem.ActionPoiID = 0;
9402 }
9403
9404 if (gMenuItem.BoxBroadcastTextID && !GetBroadcastText(gMenuItem.BoxBroadcastTextID))
9405 {
9406 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has non-existing or incompatible BoxBroadcastTextID {}, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.BoxBroadcastTextID);
9407 gMenuItem.BoxBroadcastTextID = 0;
9408 }
9409
9410 _gossipMenuItemsStore.insert(GossipMenuItemsContainer::value_type(gMenuItem.MenuID, gMenuItem));
9411 } while (result->NextRow());
9412
9413 LOG_INFO("server.loading", ">> Loaded {} gossip_menu_option entries in {} ms", uint32(_gossipMenuItemsStore.size()), GetMSTimeDiffToNow(oldMSTime));
9414 LOG_INFO("server.loading", " ");
9415}
@ GOSSIP_ICON_CHAT
Definition: GossipDef.h:61
@ GOSSIP_ICON_MAX
Definition: GossipDef.h:82
@ GOSSIP_OPTION_MAX
Definition: GossipDef.h:56
Definition: ObjectMgr.h:606
uint8 OptionIcon
Definition: ObjectMgr.h:609
uint32 BoxBroadcastTextID
Definition: ObjectMgr.h:620
std::string OptionText
Definition: ObjectMgr.h:610
uint32 ActionMenuID
Definition: ObjectMgr.h:614
bool BoxCoded
Definition: ObjectMgr.h:616
uint32 MenuID
Definition: ObjectMgr.h:607
uint32 OptionNpcFlag
Definition: ObjectMgr.h:613
uint32 ActionPoiID
Definition: ObjectMgr.h:615
uint32 BoxMoney
Definition: ObjectMgr.h:617
std::string BoxText
Definition: ObjectMgr.h:618
uint32 OptionID
Definition: ObjectMgr.h:608
uint32 OptionType
Definition: ObjectMgr.h:612
uint32 OptionBroadcastTextID
Definition: ObjectMgr.h:611
PointOfInterest const * GetPointOfInterest(uint32 id) const
Definition: ObjectMgr.h:919
BroadcastText const * GetBroadcastText(uint32 id) const
Definition: ObjectMgr.h:1190

References _gossipMenuItemsStore, GossipMenuItems::ActionMenuID, GossipMenuItems::ActionPoiID, GossipMenuItems::BoxBroadcastTextID, GossipMenuItems::BoxCoded, GossipMenuItems::BoxMoney, GossipMenuItems::BoxText, Field::Get(), GetBroadcastText(), getMSTime(), GetMSTimeDiffToNow(), GetPointOfInterest(), GOSSIP_ICON_CHAT, GOSSIP_ICON_MAX, GOSSIP_OPTION_MAX, LOG_ERROR, LOG_INFO, LOG_WARN, GossipMenuItems::MenuID, GossipMenuItems::OptionBroadcastTextID, GossipMenuItems::OptionIcon, GossipMenuItems::OptionID, GossipMenuItems::OptionNpcFlag, GossipMenuItems::OptionText, GossipMenuItems::OptionType, and WorldDatabase.

◆ LoadGossipMenuItemsLocales()

void ObjectMgr::LoadGossipMenuItemsLocales ( )
423{
424 uint32 oldMSTime = getMSTime();
425
426 _gossipMenuItemsLocaleStore.clear(); // need for reload case
427
428 // 0 1 2 3 4
429 QueryResult result = WorldDatabase.Query("SELECT MenuID, OptionID, Locale, OptionText, BoxText FROM gossip_menu_option_locale");
430
431 if (!result)
432 return;
433
434 do
435 {
436 Field* fields = result->Fetch();
437
438 uint32 MenuID = fields[0].Get<uint32>();
439 uint16 OptionID = fields[1].Get<uint16>();
440
441 LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>());
442 if (locale == LOCALE_enUS)
443 continue;
444
446 AddLocaleString(fields[3].Get<std::string>(), locale, data.OptionText);
447 AddLocaleString(fields[4].Get<std::string>(), locale, data.BoxText);
448 } while (result->NextRow());
449
450 LOG_INFO("server.loading", ">> Loaded {} Gossip Menu Option Locale Strings in {} ms", (uint32)_gossipMenuItemsLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
451}
Definition: CreatureData.h:349
std::vector< std::string > BoxText
Definition: CreatureData.h:351
std::vector< std::string > OptionText
Definition: CreatureData.h:350

References _gossipMenuItemsLocaleStore, AddLocaleString(), GossipMenuItemsLocale::BoxText, Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_INFO, MAKE_PAIR32(), GossipMenuItemsLocale::OptionText, and WorldDatabase.

◆ LoadGossipText()

void ObjectMgr::LoadGossipText ( )
5979{
5980 uint32 oldMSTime = getMSTime();
5981
5982 QueryResult result = WorldDatabase.Query("SELECT ID, "
5983 "text0_0, text0_1, BroadcastTextID0, lang0, Probability0, em0_0, em0_1, em0_2, em0_3, em0_4, em0_5, "
5984 "text1_0, text1_1, BroadcastTextID1, lang1, Probability1, em1_0, em1_1, em1_2, em1_3, em1_4, em1_5, "
5985 "text2_0, text2_1, BroadcastTextID2, lang2, Probability2, em2_0, em2_1, em2_2, em2_3, em2_4, em2_5, "
5986 "text3_0, text3_1, BroadcastTextID3, lang3, Probability3, em3_0, em3_1, em3_2, em3_3, em3_4, em3_5, "
5987 "text4_0, text4_1, BroadcastTextID4, lang4, Probability4, em4_0, em4_1, em4_2, em4_3, em4_4, em4_5, "
5988 "text5_0, text5_1, BroadcastTextID5, lang5, Probability5, em5_0, em5_1, em5_2, em5_3, em5_4, em5_5, "
5989 "text6_0, text6_1, BroadcastTextID6, lang6, Probability6, em6_0, em6_1, em6_2, em6_3, em6_4, em6_5, "
5990 "text7_0, text7_1, BroadcastTextID7, lang7, Probability7, em7_0, em7_1, em7_2, em7_3, em7_4, em7_5 "
5991 "FROM npc_text");
5992
5993 if (!result)
5994 {
5995 LOG_WARN("server.loading", ">> Loaded 0 npc texts, table is empty!");
5996 LOG_INFO("server.loading", " ");
5997 return;
5998 }
5999
6000 _gossipTextStore.rehash(result->GetRowCount());
6001
6002 uint32 count = 0;
6003 uint8 cic;
6004
6005 do
6006 {
6007 cic = 0;
6008
6009 Field* fields = result->Fetch();
6010
6011 uint32 id = fields[cic++].Get<uint32>();
6012 if (!id)
6013 {
6014 LOG_ERROR("sql.sql", "Table `npc_text` has record wit reserved id 0, ignore.");
6015 continue;
6016 }
6017
6018 GossipText& gText = _gossipTextStore[id];
6019
6020 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6021 {
6022 gText.Options[i].Text_0 = fields[cic++].Get<std::string>();
6023 gText.Options[i].Text_1 = fields[cic++].Get<std::string>();
6024 gText.Options[i].BroadcastTextID = fields[cic++].Get<uint32>();
6025 gText.Options[i].Language = fields[cic++].Get<uint8>();
6026 gText.Options[i].Probability = fields[cic++].Get<float>();
6027
6028 for (uint8 j = 0; j < MAX_GOSSIP_TEXT_EMOTES; ++j)
6029 {
6030 gText.Options[i].Emotes[j]._Delay = fields[cic++].Get<uint16>();
6031 gText.Options[i].Emotes[j]._Emote = fields[cic++].Get<uint16>();
6032 }
6033 }
6034
6035 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; i++)
6036 {
6037 if (gText.Options[i].BroadcastTextID)
6038 {
6040 {
6041 LOG_ERROR("sql.sql", "GossipText (Id: {}) in table `npc_text` has non-existing or incompatible BroadcastTextID{} {}.", id, i, gText.Options[i].BroadcastTextID);
6042 gText.Options[i].BroadcastTextID = 0;
6043 }
6044 }
6045 }
6046
6047 count++;
6048 } while (result->NextRow());
6049
6050 LOG_INFO("server.loading", ">> Loaded {} Npc Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6051 LOG_INFO("server.loading", " ");
6052}
#define MAX_GOSSIP_TEXT_OPTIONS
Definition: NPCHandler.h:42
#define MAX_GOSSIP_TEXT_EMOTES
Definition: NPCHandler.h:30
uint32 _Emote
Definition: NPCHandler.h:26
uint32 _Delay
Definition: NPCHandler.h:27
std::string Text_0
Definition: NPCHandler.h:34
QEmote Emotes[MAX_GOSSIP_TEXT_EMOTES]
Definition: NPCHandler.h:39
uint32 Language
Definition: NPCHandler.h:37
float Probability
Definition: NPCHandler.h:38
uint32 BroadcastTextID
Definition: NPCHandler.h:36
std::string Text_1
Definition: NPCHandler.h:35
Definition: NPCHandler.h:45
GossipTextOption Options[MAX_GOSSIP_TEXT_OPTIONS]
Definition: NPCHandler.h:46

References QEmote::_Delay, QEmote::_Emote, _gossipTextStore, GossipTextOption::BroadcastTextID, GossipTextOption::Emotes, Field::Get(), GetBroadcastText(), getMSTime(), GetMSTimeDiffToNow(), GossipTextOption::Language, LOG_ERROR, LOG_INFO, LOG_WARN, MAX_GOSSIP_TEXT_EMOTES, MAX_GOSSIP_TEXT_OPTIONS, GossipText::Options, GossipTextOption::Probability, GossipTextOption::Text_0, GossipTextOption::Text_1, and WorldDatabase.

◆ LoadInstanceEncounters()

void ObjectMgr::LoadInstanceEncounters ( )
5886{
5887 uint32 oldMSTime = getMSTime();
5888
5889 // 0 1 2 3
5890 QueryResult result = WorldDatabase.Query("SELECT entry, creditType, creditEntry, lastEncounterDungeon FROM instance_encounters");
5891 if (!result)
5892 {
5893 LOG_WARN("server.loading", ">> Loaded 0 instance encounters, table is empty!");
5894 LOG_INFO("server.loading", " ");
5895 return;
5896 }
5897
5898 uint32 count = 0;
5899 std::map<uint32, DungeonEncounterEntry const*> dungeonLastBosses;
5900 do
5901 {
5902 Field* fields = result->Fetch();
5903 uint32 entry = fields[0].Get<uint32>();
5904 uint8 creditType = fields[1].Get<uint8>();
5905 uint32 creditEntry = fields[2].Get<uint32>();
5906 uint32 lastEncounterDungeon = fields[3].Get<uint16>();
5907 DungeonEncounterEntry const* dungeonEncounter = sDungeonEncounterStore.LookupEntry(entry);
5908 if (!dungeonEncounter)
5909 {
5910 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid encounter id {}, skipped!", entry);
5911 continue;
5912 }
5913
5914 if (lastEncounterDungeon && !sLFGMgr->GetLFGDungeonEntry(lastEncounterDungeon))
5915 {
5916 LOG_ERROR("sql.sql", "Table `instance_encounters` has an encounter {} ({}) marked as final for invalid dungeon id {}, skipped!", entry, dungeonEncounter->encounterName[0], lastEncounterDungeon);
5917 continue;
5918 }
5919
5920 std::map<uint32, DungeonEncounterEntry const*>::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon);
5921 if (lastEncounterDungeon)
5922 {
5923 if (itr != dungeonLastBosses.end())
5924 {
5925 LOG_ERROR("sql.sql", "Table `instance_encounters` specified encounter {} ({}) as last encounter but {} ({}) is already marked as one, skipped!", entry, dungeonEncounter->encounterName[0], itr->second->id, itr->second->encounterName[0]);
5926 continue;
5927 }
5928
5929 dungeonLastBosses[lastEncounterDungeon] = dungeonEncounter;
5930 }
5931
5932 switch (creditType)
5933 {
5935 {
5936 CreatureTemplate const* creatureInfo = GetCreatureTemplate(creditEntry);
5937 if (!creatureInfo)
5938 {
5939 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid creature (entry {}) linked to the encounter {} ({}), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
5940 continue;
5941 }
5942 const_cast<CreatureTemplate*>(creatureInfo)->flags_extra |= CREATURE_FLAG_EXTRA_DUNGEON_BOSS;
5943 break;
5944 }
5946 {
5947 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(creditEntry);
5948 if (!spellInfo)
5949 {
5950 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid spell (entry {}) linked to the encounter {} ({}), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
5951 continue;
5952 }
5953 const_cast<SpellInfo*>(spellInfo)->AttributesCu |= SPELL_ATTR0_CU_ENCOUNTER_REWARD;
5954 break;
5955 }
5956 default:
5957 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid credit type ({}) for encounter {} ({}), skipped!", creditType, entry, dungeonEncounter->encounterName[0]);
5958 continue;
5959 }
5960
5961 DungeonEncounterList& encounters = _dungeonEncounterStore[MAKE_PAIR32(dungeonEncounter->mapId, dungeonEncounter->difficulty)];
5962 encounters.push_back(new DungeonEncounter(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon));
5963 ++count;
5964 } while (result->NextRow());
5965
5966 LOG_INFO("server.loading", ">> Loaded {} Instance Encounters in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5967 LOG_INFO("server.loading", " ");
5968}
EncounterCreditType
Definition: Map.h:305
@ ENCOUNTER_CREDIT_KILL_CREATURE
Definition: Map.h:306
@ ENCOUNTER_CREDIT_CAST_SPELL
Definition: Map.h:307
std::list< DungeonEncounter const * > DungeonEncounterList
Definition: ObjectMgr.h:712
@ SPELL_ATTR0_CU_ENCOUNTER_REWARD
Definition: SpellInfo.h:207
#define sLFGMgr
Definition: LFGMgr.h:641
@ CREATURE_FLAG_EXTRA_DUNGEON_BOSS
Definition: CreatureData.h:73
DBCStorage< DungeonEncounterEntry > sDungeonEncounterStore(DungeonEncounterfmt)
Definition: ObjectMgr.h:702
Definition: DBCStructure.h:865

References _dungeonEncounterStore, CREATURE_FLAG_EXTRA_DUNGEON_BOSS, ENCOUNTER_CREDIT_CAST_SPELL, ENCOUNTER_CREDIT_KILL_CREATURE, Field::Get(), GetCreatureTemplate(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, MAKE_PAIR32(), sDungeonEncounterStore, sLFGMgr, SPELL_ATTR0_CU_ENCOUNTER_REWARD, sSpellMgr, and WorldDatabase.

◆ LoadInstanceTemplate()

void ObjectMgr::LoadInstanceTemplate ( )
5835{
5836 uint32 oldMSTime = getMSTime();
5837
5838 // 0 1 2 4
5839 QueryResult result = WorldDatabase.Query("SELECT map, parent, script, allowMount FROM instance_template");
5840
5841 if (!result)
5842 {
5843 LOG_WARN("server.loading", ">> Loaded 0 instance templates. DB table `page_text` is empty!");
5844 LOG_INFO("server.loading", " ");
5845 return;
5846 }
5847
5848 uint32 count = 0;
5849 do
5850 {
5851 Field* fields = result->Fetch();
5852
5853 uint16 mapID = fields[0].Get<uint16>();
5854
5855 if (!MapMgr::IsValidMAP(mapID, true))
5856 {
5857 LOG_ERROR("sql.sql", "ObjectMgr::LoadInstanceTemplate: bad mapid {} for template!", mapID);
5858 continue;
5859 }
5860
5861 InstanceTemplate instanceTemplate;
5862
5863 instanceTemplate.AllowMount = fields[3].Get<bool>();
5864 instanceTemplate.Parent = uint32(fields[1].Get<uint16>());
5865 instanceTemplate.ScriptId = sObjectMgr->GetScriptId(fields[2].Get<std::string>());
5866
5867 _instanceTemplateStore[mapID] = instanceTemplate;
5868
5869 ++count;
5870 } while (result->NextRow());
5871
5872 LOG_INFO("server.loading", ">> Loaded {} Instance Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5873 LOG_INFO("server.loading", " ");
5874}
bool AllowMount
Definition: Map.h:275
uint32 ScriptId
Definition: Map.h:274
static bool IsValidMAP(uint32 mapid, bool startUp)
Definition: MapMgr.cpp:309

References _instanceTemplateStore, InstanceTemplate::AllowMount, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), MapMgr::IsValidMAP(), LOG_ERROR, LOG_INFO, LOG_WARN, InstanceTemplate::Parent, InstanceTemplate::ScriptId, sObjectMgr, and WorldDatabase.

◆ LoadItemLocales()

void ObjectMgr::LoadItemLocales ( )
2633{
2634 uint32 oldMSTime = getMSTime();
2635
2636 _itemLocaleStore.clear(); // need for reload case
2637
2638 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name, Description FROM item_template_locale");
2639 if (!result)
2640 return;
2641
2642 do
2643 {
2644 Field* fields = result->Fetch();
2645
2646 uint32 ID = fields[0].Get<uint32>();
2647
2648 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
2649 if (locale == LOCALE_enUS)
2650 continue;
2651
2652 ItemLocale& data = _itemLocaleStore[ID];
2653 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
2654 AddLocaleString(fields[3].Get<std::string>(), locale, data.Description);
2655 } while (result->NextRow());
2656
2657 LOG_INFO("server.loading", ">> Loaded {} Item Locale Strings in {} ms", (uint32)_itemLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
2658}
Definition: ItemTemplate.h:838
std::vector< std::string > Description
Definition: ItemTemplate.h:840
std::vector< std::string > Name
Definition: ItemTemplate.h:839

References _itemLocaleStore, AddLocaleString(), ItemLocale::Description, Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_INFO, ItemLocale::Name, and WorldDatabase.

◆ LoadItemSetNameLocales()

void ObjectMgr::LoadItemSetNameLocales ( )
3277{
3278 uint32 oldMSTime = getMSTime();
3279
3280 _itemSetNameLocaleStore.clear(); // need for reload case
3281
3282 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name FROM item_set_names_locale");
3283
3284 if (!result)
3285 return;
3286
3287 do
3288 {
3289 Field* fields = result->Fetch();
3290
3291 uint32 ID = fields[0].Get<uint32>();
3292
3293 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
3294 if (locale == LOCALE_enUS)
3295 continue;
3296
3298 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
3299 } while (result->NextRow());
3300
3301 LOG_INFO("server.loading", ">> Loaded {} Item Set Name Locale Strings in {} ms", uint32(_itemSetNameLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
3302}
Definition: ItemTemplate.h:850
std::vector< std::string > Name
Definition: ItemTemplate.h:851

References _itemSetNameLocaleStore, AddLocaleString(), Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_INFO, ItemSetNameLocale::Name, and WorldDatabase.

◆ LoadItemSetNames()

void ObjectMgr::LoadItemSetNames ( )
3305{
3306 uint32 oldMSTime = getMSTime();
3307
3308 _itemSetNameStore.clear(); // needed for reload case
3309
3310 std::set<uint32> itemSetItems;
3311
3312 // fill item set member ids
3313 for (uint32 entryId = 0; entryId < sItemSetStore.GetNumRows(); ++entryId)
3314 {
3315 ItemSetEntry const* setEntry = sItemSetStore.LookupEntry(entryId);
3316 if (!setEntry)
3317 continue;
3318
3319 for (uint32 i = 0; i < MAX_ITEM_SET_ITEMS; ++i)
3320 if (setEntry->itemId[i])
3321 itemSetItems.insert(setEntry->itemId[i]);
3322 }
3323
3324 // 0 1 2
3325 QueryResult result = WorldDatabase.Query("SELECT `entry`, `name`, `InventoryType` FROM `item_set_names`");
3326
3327 if (!result)
3328 {
3329 LOG_WARN("server.loading", ">> Loaded 0 item set names. DB table `item_set_names` is empty.");
3330 LOG_INFO("server.loading", " ");
3331 return;
3332 }
3333
3334 _itemSetNameStore.rehash(result->GetRowCount());
3335 uint32 count = 0;
3336
3337 do
3338 {
3339 Field* fields = result->Fetch();
3340
3341 uint32 entry = fields[0].Get<uint32>();
3342 if (itemSetItems.find(entry) == itemSetItems.end())
3343 {
3344 LOG_ERROR("sql.sql", "Item set name (Entry: {}) not found in ItemSet.dbc, data useless.", entry);
3345 continue;
3346 }
3347
3348 ItemSetNameEntry& data = _itemSetNameStore[entry];
3349 data.name = fields[1].Get<std::string>();
3350
3351 uint32 invType = fields[2].Get<uint8>();
3352 if (invType >= MAX_INVTYPE)
3353 {
3354 LOG_ERROR("sql.sql", "Item set name (Entry: {}) has wrong InventoryType value ({})", entry, invType);
3355 invType = INVTYPE_NON_EQUIP;
3356 }
3357
3358 data.InventoryType = invType;
3359 itemSetItems.erase(entry);
3360 ++count;
3361 } while (result->NextRow());
3362
3363 if (!itemSetItems.empty())
3364 {
3365 ItemTemplate const* pProto;
3366 for (std::set<uint32>::iterator itr = itemSetItems.begin(); itr != itemSetItems.end(); ++itr)
3367 {
3368 uint32 entry = *itr;
3369 // add data from item_template if available
3370 pProto = sObjectMgr->GetItemTemplate(entry);
3371 if (pProto)
3372 {
3373 LOG_ERROR("sql.sql", "Item set part (Entry: {}) does not have entry in `item_set_names`, adding data from `item_template`.", entry);
3374 ItemSetNameEntry& data = _itemSetNameStore[entry];
3375 data.name = pProto->Name1;
3376 data.InventoryType = pProto->InventoryType;
3377 ++count;
3378 }
3379 else
3380 LOG_ERROR("sql.sql", "Item set part (Entry: {}) does not have entry in `item_set_names`, set will not display properly.", entry);
3381 }
3382 }
3383
3384 LOG_INFO("server.loading", ">> Loaded {} Item Set Names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3385 LOG_INFO("server.loading", " ");
3386}
#define MAX_ITEM_SET_ITEMS
Definition: DBCStructure.h:1227
@ INVTYPE_NON_EQUIP
Definition: ItemTemplate.h:256
#define MAX_INVTYPE
Definition: ItemTemplate.h:287
DBCStorage< ItemSetEntry > sItemSetStore(ItemSetEntryfmt)
std::string Name1
Definition: ItemTemplate.h:624
uint32 InventoryType
Definition: ItemTemplate.h:632
Definition: ItemTemplate.h:844
uint32 InventoryType
Definition: ItemTemplate.h:846
std::string name
Definition: ItemTemplate.h:845
Definition: DBCStructure.h:1231
uint32 itemId[MAX_ITEM_SET_ITEMS]
Definition: DBCStructure.h:1235

References _itemSetNameStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), ItemTemplate::InventoryType, ItemSetNameEntry::InventoryType, INVTYPE_NON_EQUIP, ItemSetEntry::itemId, LOG_ERROR, LOG_INFO, LOG_WARN, MAX_INVTYPE, MAX_ITEM_SET_ITEMS, ItemSetNameEntry::name, ItemTemplate::Name1, sItemSetStore, sObjectMgr, and WorldDatabase.

◆ LoadItemTemplates()

void ObjectMgr::LoadItemTemplates ( )
2661{
2662 uint32 oldMSTime = getMSTime();
2663
2664 // 0 1 2 3 4 5 6 7 8 9 10 11 12
2665 QueryResult result = WorldDatabase.Query("SELECT entry, class, subclass, SoundOverrideSubclass, name, displayid, Quality, Flags, FlagsExtra, BuyCount, BuyPrice, SellPrice, InventoryType, "
2666 // 13 14 15 16 17 18 19 20
2667 "AllowableClass, AllowableRace, ItemLevel, RequiredLevel, RequiredSkill, RequiredSkillRank, requiredspell, requiredhonorrank, "
2668 // 21 22 23 24 25 26 27 28
2669 "RequiredCityRank, RequiredReputationFaction, RequiredReputationRank, maxcount, stackable, ContainerSlots, StatsCount, stat_type1, "
2670 // 29 30 31 32 33 34 35 36 37 38
2671 "stat_value1, stat_type2, stat_value2, stat_type3, stat_value3, stat_type4, stat_value4, stat_type5, stat_value5, stat_type6, "
2672 // 39 40 41 42 43 44 45 46 47
2673 "stat_value6, stat_type7, stat_value7, stat_type8, stat_value8, stat_type9, stat_value9, stat_type10, stat_value10, "
2674 // 48 49 50 51 52 53 54 55 56 57 58
2675 "ScalingStatDistribution, ScalingStatValue, dmg_min1, dmg_max1, dmg_type1, dmg_min2, dmg_max2, dmg_type2, armor, holy_res, fire_res, "
2676 // 59 60 61 62 63 64 65 66 67 68
2677 "nature_res, frost_res, shadow_res, arcane_res, delay, ammo_type, RangedModRange, spellid_1, spelltrigger_1, spellcharges_1, "
2678 // 69 70 71 72 73 74 75
2679 "spellppmRate_1, spellcooldown_1, spellcategory_1, spellcategorycooldown_1, spellid_2, spelltrigger_2, spellcharges_2, "
2680 // 76 77 78 79 80 81 82
2681 "spellppmRate_2, spellcooldown_2, spellcategory_2, spellcategorycooldown_2, spellid_3, spelltrigger_3, spellcharges_3, "
2682 // 83 84 85 86 87 88 89
2683 "spellppmRate_3, spellcooldown_3, spellcategory_3, spellcategorycooldown_3, spellid_4, spelltrigger_4, spellcharges_4, "
2684 // 90 91 92 93 94 95 96
2685 "spellppmRate_4, spellcooldown_4, spellcategory_4, spellcategorycooldown_4, spellid_5, spelltrigger_5, spellcharges_5, "
2686 // 97 98 99 100 101 102 103 104 105
2687 "spellppmRate_5, spellcooldown_5, spellcategory_5, spellcategorycooldown_5, bonding, description, PageText, LanguageID, PageMaterial, "
2688 // 106 107 108 109 110 111 112 113 114 115 116 117
2689 "startquest, lockid, Material, sheath, RandomProperty, RandomSuffix, block, itemset, MaxDurability, area, Map, BagFamily, "
2690 // 118 119 120 121 122 123 124 125
2691 "TotemCategory, socketColor_1, socketContent_1, socketColor_2, socketContent_2, socketColor_3, socketContent_3, socketBonus, "
2692 // 126 127 128 129 130 131 132 133
2693 "GemProperties, RequiredDisenchantSkill, ArmorDamageModifier, duration, ItemLimitCategory, HolidayId, ScriptName, DisenchantID, "
2694 // 134 135 136
2695 "FoodType, minMoneyLoot, maxMoneyLoot, flagsCustom FROM item_template");
2696
2697 if (!result)
2698 {
2699 LOG_WARN("server.loading", ">> Loaded 0 item templates. DB table `item_template` is empty.");
2700 LOG_INFO("server.loading", " ");
2701 return;
2702 }
2703
2704 _itemTemplateStore.reserve(result->GetRowCount());
2705 uint32 count = 0;
2706 // original inspiration https://github.com/TrinityCore/TrinityCore/commit/0c44bd33ee7b42c924859139a9f4b04cf2b91261
2707 bool enforceDBCAttributes = sWorld->getBoolConfig(CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES);
2708
2709 do
2710 {
2711 Field* fields = result->Fetch();
2712
2713 uint32 entry = fields[0].Get<uint32>();
2714
2715 ItemTemplate& itemTemplate = _itemTemplateStore[entry];
2716
2717 itemTemplate.ItemId = entry;
2718 itemTemplate.Class = uint32(fields[1].Get<uint8>());
2719 itemTemplate.SubClass = uint32(fields[2].Get<uint8>());
2720 itemTemplate.SoundOverrideSubclass = int32(fields[3].Get<int8>());
2721 itemTemplate.Name1 = fields[4].Get<std::string>();
2722 itemTemplate.DisplayInfoID = fields[5].Get<uint32>();
2723 itemTemplate.Quality = uint32(fields[6].Get<uint8>());
2724 itemTemplate.Flags = ItemFlags(fields[7].Get<uint32>());
2725 itemTemplate.Flags2 = ItemFlags2(fields[8].Get<uint32>());
2726 itemTemplate.BuyCount = uint32(fields[9].Get<uint8>());
2727 itemTemplate.BuyPrice = int32(fields[10].Get<int64>() * sWorld->getRate((Rates)(RATE_BUYVALUE_ITEM_POOR + itemTemplate.Quality)));
2728 itemTemplate.SellPrice = uint32(fields[11].Get<uint32>() * sWorld->getRate((Rates)(RATE_SELLVALUE_ITEM_POOR + itemTemplate.Quality)));
2729 itemTemplate.InventoryType = uint32(fields[12].Get<uint8>());
2730 itemTemplate.AllowableClass = fields[13].Get<int32>();
2731 itemTemplate.AllowableRace = fields[14].Get<int32>();
2732 itemTemplate.ItemLevel = uint32(fields[15].Get<uint16>());
2733 itemTemplate.RequiredLevel = uint32(fields[16].Get<uint8>());
2734 itemTemplate.RequiredSkill = uint32(fields[17].Get<uint16>());
2735 itemTemplate.RequiredSkillRank = uint32(fields[18].Get<uint16>());
2736 itemTemplate.RequiredSpell = fields[19].Get<uint32>();
2737 itemTemplate.RequiredHonorRank = fields[20].Get<uint32>();
2738 itemTemplate.RequiredCityRank = fields[21].Get<uint32>();
2739 itemTemplate.RequiredReputationFaction = uint32(fields[22].Get<uint16>());
2740 itemTemplate.RequiredReputationRank = uint32(fields[23].Get<uint16>());
2741 itemTemplate.MaxCount = fields[24].Get<int32>();
2742 itemTemplate.Stackable = fields[25].Get<int32>();
2743 itemTemplate.ContainerSlots = uint32(fields[26].Get<uint8>());
2744 itemTemplate.StatsCount = uint32(fields[27].Get<uint8>());
2745
2746 for (uint8 i = 0; i < itemTemplate.StatsCount; ++i)
2747 {
2748 itemTemplate.ItemStat[i].ItemStatType = uint32(fields[28 + i * 2].Get<uint8>());
2749 itemTemplate.ItemStat[i].ItemStatValue = fields[29 + i * 2].Get<int32>();
2750 }
2751
2752 itemTemplate.ScalingStatDistribution = uint32(fields[48].Get<uint16>());
2753 itemTemplate.ScalingStatValue = fields[49].Get<int32>();
2754
2755 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2756 {
2757 itemTemplate.Damage[i].DamageMin = fields[50 + i * 3].Get<float>();
2758 itemTemplate.Damage[i].DamageMax = fields[51 + i * 3].Get<float>();
2759 itemTemplate.Damage[i].DamageType = uint32(fields[52 + i * 3].Get<uint8>());
2760 }
2761
2762 itemTemplate.Armor = fields[56].Get<uint32>();
2763 itemTemplate.HolyRes = fields[57].Get<int32>();
2764 itemTemplate.FireRes = fields[58].Get<int32>();
2765 itemTemplate.NatureRes = fields[59].Get<int32>();
2766 itemTemplate.FrostRes = fields[60].Get<int32>();
2767 itemTemplate.ShadowRes = fields[61].Get<int32>();
2768 itemTemplate.ArcaneRes = fields[62].Get<int32>();
2769 itemTemplate.Delay = uint32(fields[63].Get<uint16>());
2770 itemTemplate.AmmoType = uint32(fields[64].Get<uint8>());
2771 itemTemplate.RangedModRange = fields[65].Get<float>();
2772
2773 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
2774 {
2775 itemTemplate.Spells[i].SpellId = fields[66 + i * 7 ].Get<int32>();
2776 itemTemplate.Spells[i].SpellTrigger = uint32(fields[67 + i * 7].Get<uint8>());
2777 itemTemplate.Spells[i].SpellCharges = int32(fields[68 + i * 7].Get<int16>());
2778 itemTemplate.Spells[i].SpellPPMRate = fields[69 + i * 7].Get<float>();
2779 itemTemplate.Spells[i].SpellCooldown = fields[70 + i * 7].Get<int32>();
2780 itemTemplate.Spells[i].SpellCategory = uint32(fields[71 + i * 7].Get<uint16>());
2781 itemTemplate.Spells[i].SpellCategoryCooldown = fields[72 + i * 7].Get<int32>();
2782 }
2783
2784 itemTemplate.Bonding = uint32(fields[101].Get<uint8>());
2785 itemTemplate.Description = fields[102].Get<std::string>();
2786 itemTemplate.PageText = fields[103].Get<uint32>();
2787 itemTemplate.LanguageID = uint32(fields[104].Get<uint8>());
2788 itemTemplate.PageMaterial = uint32(fields[105].Get<uint8>());
2789 itemTemplate.StartQuest = fields[106].Get<uint32>();
2790 itemTemplate.LockID = fields[107].Get<uint32>();
2791 itemTemplate.Material = int32(fields[108].Get<int8>());
2792 itemTemplate.Sheath = uint32(fields[109].Get<uint8>());
2793 itemTemplate.RandomProperty = fields[110].Get<int32>();
2794 itemTemplate.RandomSuffix = fields[111].Get<int32>();
2795 itemTemplate.Block = fields[112].Get<uint32>();
2796 itemTemplate.ItemSet = fields[113].Get<uint32>();
2797 itemTemplate.MaxDurability = uint32(fields[114].Get<uint16>());
2798 itemTemplate.Area = fields[115].Get<uint32>();
2799 itemTemplate.Map = uint32(fields[116].Get<uint16>());
2800 itemTemplate.BagFamily = fields[117].Get<uint32>();
2801 itemTemplate.TotemCategory = fields[118].Get<uint32>();
2802
2803 for (uint8 i = 0; i < MAX_ITEM_PROTO_SOCKETS; ++i)
2804 {
2805 itemTemplate.Socket[i].Color = uint32(fields[119 + i * 2].Get<uint8>());
2806 itemTemplate.Socket[i].Content = fields[120 + i * 2].Get<uint32>();
2807 }
2808
2809 itemTemplate.socketBonus = fields[125].Get<uint32>();
2810 itemTemplate.GemProperties = fields[126].Get<uint32>();
2811 itemTemplate.RequiredDisenchantSkill = uint32(fields[127].Get<int16>());
2812 itemTemplate.ArmorDamageModifier = fields[128].Get<float>();
2813 itemTemplate.Duration = fields[129].Get<uint32>();
2814 itemTemplate.ItemLimitCategory = uint32(fields[130].Get<int16>());
2815 itemTemplate.HolidayId = fields[131].Get<uint32>();
2816 itemTemplate.ScriptId = sObjectMgr->GetScriptId(fields[132].Get<std::string>());
2817 itemTemplate.DisenchantID = fields[133].Get<uint32>();
2818 itemTemplate.FoodType = uint32(fields[134].Get<uint8>());
2819 itemTemplate.MinMoneyLoot = fields[135].Get<uint32>();
2820 itemTemplate.MaxMoneyLoot = fields[136].Get<uint32>();
2821 itemTemplate.FlagsCu = ItemFlagsCustom(fields[137].Get<uint32>());
2822
2823 // Checks
2824 ItemEntry const* dbcitem = sItemStore.LookupEntry(entry);
2825
2826 if (!dbcitem)
2827 {
2828 LOG_DEBUG("sql.sql", "Item (Entry: {}) does not exist in item.dbc! (not correct id?).", entry);
2829 continue;
2830 }
2831
2832 if (enforceDBCAttributes)
2833 {
2834 if (itemTemplate.Class != dbcitem->ClassID)
2835 {
2836 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Class value ({}), must be ({}).", entry, itemTemplate.Class, dbcitem->ClassID);
2837 itemTemplate.Class = dbcitem->ClassID;
2838 }
2839 if (itemTemplate.SubClass != dbcitem->SubclassID)
2840 {
2841 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Subclass value ({}) for class {}, must be ({}).", entry, itemTemplate.SubClass, itemTemplate.Class, dbcitem->SubclassID);
2842 itemTemplate.SubClass = dbcitem->SubclassID;
2843 }
2844 if (itemTemplate.SoundOverrideSubclass != dbcitem->SoundOverrideSubclassID)
2845 {
2846 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct SoundOverrideSubclass ({}), must be {}.", entry, itemTemplate.SoundOverrideSubclass, dbcitem->SoundOverrideSubclassID);
2847 itemTemplate.SoundOverrideSubclass = dbcitem->SoundOverrideSubclassID;
2848 }
2849 if (itemTemplate.Material != dbcitem->Material)
2850 {
2851 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct material ({}), must be {}.", entry, itemTemplate.Material, dbcitem->Material);
2852 itemTemplate.Material = dbcitem->Material;
2853 }
2854 if (itemTemplate.InventoryType != dbcitem->InventoryType)
2855 {
2856 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong InventoryType value ({}), must be {}.", entry, itemTemplate.InventoryType, dbcitem->InventoryType);
2857 itemTemplate.InventoryType = dbcitem->InventoryType;
2858 }
2859 if (itemTemplate.DisplayInfoID != dbcitem->DisplayInfoID)
2860 {
2861 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct display id ({}), must be {}.", entry, itemTemplate.DisplayInfoID, dbcitem->DisplayInfoID);
2862 itemTemplate.DisplayInfoID = dbcitem->DisplayInfoID;
2863 }
2864 if (itemTemplate.Sheath != dbcitem->SheatheType)
2865 {
2866 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Sheath ({}), must be {}.", entry, itemTemplate.Sheath, dbcitem->SheatheType);
2867 itemTemplate.Sheath = dbcitem->SheatheType;
2868 }
2869 }
2870
2871 if (itemTemplate.Quality >= MAX_ITEM_QUALITY)
2872 {
2873 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Quality value ({})", entry, itemTemplate.Quality);
2874 itemTemplate.Quality = ITEM_QUALITY_NORMAL;
2875 }
2876
2877 if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_HORDE))
2878 {
2879 if (FactionEntry const* faction = sFactionStore.LookupEntry(HORDE))
2880 if ((itemTemplate.AllowableRace & faction->BaseRepRaceMask[0]) == 0)
2881 LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `AllowableRace` races, not compatible with ITEM_FLAG2_FACTION_HORDE ({}) in Flags field, item cannot be equipped or used by these races.",
2882 entry, itemTemplate.AllowableRace, ITEM_FLAG2_FACTION_HORDE);
2883
2884 if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE))
2885 LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `Flags2` flags (ITEM_FLAG2_FACTION_ALLIANCE) and ITEM_FLAG2_FACTION_HORDE ({}) in Flags field, this is a wrong combination.",
2887 }
2888 else if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE))
2889 {
2890 if (FactionEntry const* faction = sFactionStore.LookupEntry(ALLIANCE))
2891 if ((itemTemplate.AllowableRace & faction->BaseRepRaceMask[0]) == 0)
2892 LOG_ERROR("sql.sql", "Item (Entry: {}) has value ({}) in `AllowableRace` races, not compatible with ITEM_FLAG2_FACTION_ALLIANCE ({}) in Flags field, item cannot be equipped or used by these races.",
2893 entry, itemTemplate.AllowableRace, ITEM_FLAG2_FACTION_ALLIANCE);
2894 }
2895
2896 if (itemTemplate.BuyCount <= 0)
2897 {
2898 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong BuyCount value ({}), set to default(1).", entry, itemTemplate.BuyCount);
2899 itemTemplate.BuyCount = 1;
2900 }
2901
2902 if (itemTemplate.RequiredSkill >= MAX_SKILL_TYPE)
2903 {
2904 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong RequiredSkill value ({})", entry, itemTemplate.RequiredSkill);
2905 itemTemplate.RequiredSkill = 0;
2906 }
2907
2908 {
2909 // can be used in equip slot, as page read use in inventory, or spell casting at use
2910 bool req = itemTemplate.InventoryType != INVTYPE_NON_EQUIP || itemTemplate.PageText;
2911 if (!req)
2912 for (uint8 j = 0; j < MAX_ITEM_PROTO_SPELLS; ++j)
2913 {
2914 if (itemTemplate.Spells[j].SpellId)
2915 {
2916 req = true;
2917 break;
2918 }
2919 }
2920
2921 if (req)
2922 {
2923 if (!(itemTemplate.AllowableClass & CLASSMASK_ALL_PLAYABLE))
2924 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have any playable classes ({}) in `AllowableClass` and can't be equipped or used.", entry, itemTemplate.AllowableClass);
2925
2926 if (!(itemTemplate.AllowableRace & RACEMASK_ALL_PLAYABLE))
2927 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have any playable races ({}) in `AllowableRace` and can't be equipped or used.", entry, itemTemplate.AllowableRace);
2928 }
2929 }
2930
2931 if (itemTemplate.RequiredSpell && !sSpellMgr->GetSpellInfo(itemTemplate.RequiredSpell))
2932 {
2933 LOG_ERROR("sql.sql", "Item (Entry: {}) has a wrong (non-existing) spell in RequiredSpell ({})", entry, itemTemplate.RequiredSpell);
2934 itemTemplate.RequiredSpell = 0;
2935 }
2936
2937 if (itemTemplate.RequiredReputationRank >= MAX_REPUTATION_RANK)
2938 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong reputation rank in RequiredReputationRank ({}), item can't be used.", entry, itemTemplate.RequiredReputationRank);
2939
2940 if (itemTemplate.RequiredReputationFaction)
2941 {
2942 if (!sFactionStore.LookupEntry(itemTemplate.RequiredReputationFaction))
2943 {
2944 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (not existing) faction in RequiredReputationFaction ({})", entry, itemTemplate.RequiredReputationFaction);
2945 itemTemplate.RequiredReputationFaction = 0;
2946 }
2947
2948 if (itemTemplate.RequiredReputationRank == MIN_REPUTATION_RANK)
2949 LOG_ERROR("sql.sql", "Item (Entry: {}) has min. reputation rank in RequiredReputationRank (0) but RequiredReputationFaction > 0, faction setting is useless.", entry);
2950 }
2951
2952 if (itemTemplate.MaxCount < -1)
2953 {
2954 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large negative in maxcount ({}), replace by value (-1) no storing limits.", entry, itemTemplate.MaxCount);
2955 itemTemplate.MaxCount = -1;
2956 }
2957
2958 if (itemTemplate.Stackable == 0)
2959 {
2960 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong value in stackable ({}), replace by default 1.", entry, itemTemplate.Stackable);
2961 itemTemplate.Stackable = 1;
2962 }
2963 else if (itemTemplate.Stackable < -1)
2964 {
2965 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large negative in stackable ({}), replace by value (-1) no stacking limits.", entry, itemTemplate.Stackable);
2966 itemTemplate.Stackable = -1;
2967 }
2968
2969 if (itemTemplate.ContainerSlots > MAX_BAG_SIZE)
2970 {
2971 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large value in ContainerSlots ({}), replace by hardcoded limit ({}).", entry, itemTemplate.ContainerSlots, MAX_BAG_SIZE);
2972 itemTemplate.ContainerSlots = MAX_BAG_SIZE;
2973 }
2974
2975 if (itemTemplate.StatsCount > MAX_ITEM_PROTO_STATS)
2976 {
2977 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large value in statscount ({}), replace by hardcoded limit ({}).", entry, itemTemplate.StatsCount, MAX_ITEM_PROTO_STATS);
2978 itemTemplate.StatsCount = MAX_ITEM_PROTO_STATS;
2979 }
2980
2981 for (uint8 j = 0; j < itemTemplate.StatsCount; ++j)
2982 {
2983 // for ItemStatValue != 0
2984 if (itemTemplate.ItemStat[j].ItemStatValue && itemTemplate.ItemStat[j].ItemStatType >= MAX_ITEM_MOD)
2985 {
2986 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (non-existing?) stat_type{} ({})", entry, j + 1, itemTemplate.ItemStat[j].ItemStatType);
2987 itemTemplate.ItemStat[j].ItemStatType = 0;
2988 }
2989
2990 switch (itemTemplate.ItemStat[j].ItemStatType)
2991 {
2993 LOG_ERROR("sql.sql", "Item (Entry: {}) has deprecated stat_type{} ({})", entry, j + 1, itemTemplate.ItemStat[j].ItemStatType);
2994 break;
2995 default:
2996 break;
2997 }
2998 }
2999
3000 for (uint8 j = 0; j < MAX_ITEM_PROTO_DAMAGES; ++j)
3001 {
3002 if (itemTemplate.Damage[j].DamageType >= MAX_SPELL_SCHOOL)
3003 {
3004 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong dmg_type{} ({})", entry, j + 1, itemTemplate.Damage[j].DamageType);
3005 itemTemplate.Damage[j].DamageType = 0;
3006 }
3007 }
3008
3009 // special format
3010 if ((itemTemplate.Spells[0].SpellId == 483) || (itemTemplate.Spells[0].SpellId == 55884))
3011 {
3012 // spell_1
3013 if (itemTemplate.Spells[0].SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
3014 {
3015 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong item spell trigger value in spelltrigger_{} ({}) for special learning format", entry, 0 + 1, itemTemplate.Spells[0].SpellTrigger);
3016 itemTemplate.Spells[0].SpellId = 0;
3017 itemTemplate.Spells[0].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3018 itemTemplate.Spells[1].SpellId = 0;
3019 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3020 }
3021
3022 // spell_2 have learning spell
3023 if (itemTemplate.Spells[1].SpellTrigger != ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
3024 {
3025 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong item spell trigger value in spelltrigger_{} ({}) for special learning format.", entry, 1 + 1, itemTemplate.Spells[1].SpellTrigger);
3026 itemTemplate.Spells[0].SpellId = 0;
3027 itemTemplate.Spells[1].SpellId = 0;
3028 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3029 }
3030 else if (!itemTemplate.Spells[1].SpellId)
3031 {
3032 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have an expected spell in spellid_{} in special learning format.", entry, 1 + 1);
3033 itemTemplate.Spells[0].SpellId = 0;
3034 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3035 }
3036 else if (itemTemplate.Spells[1].SpellId != -1)
3037 {
3038 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemTemplate.Spells[1].SpellId);
3039 if (!spellInfo && !DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, itemTemplate.Spells[1].SpellId, nullptr))
3040 {
3041 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (not existing) spell in spellid_{} ({})", entry, 1 + 1, itemTemplate.Spells[1].SpellId);
3042 itemTemplate.Spells[0].SpellId = 0;
3043 itemTemplate.Spells[1].SpellId = 0;
3044 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3045 }
3046 // allowed only in special format
3047 else if ((itemTemplate.Spells[1].SpellId == 483) || (itemTemplate.Spells[1].SpellId == 55884))
3048 {
3049 LOG_ERROR("sql.sql", "Item (Entry: {}) has broken spell in spellid_{} ({})", entry, 1 + 1, itemTemplate.Spells[1].SpellId);
3050 itemTemplate.Spells[0].SpellId = 0;
3051 itemTemplate.Spells[1].SpellId = 0;
3052 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3053 }
3054 }
3055
3056 // spell_3*, spell_4*, spell_5* is empty
3057 for (uint8 j = 2; j < MAX_ITEM_PROTO_SPELLS; ++j)
3058 {
3059 if (itemTemplate.Spells[j].SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
3060 {
3061 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong item spell trigger value in spelltrigger_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellTrigger);
3062 itemTemplate.Spells[j].SpellId = 0;
3063 itemTemplate.Spells[j].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3064 }
3065 else if (itemTemplate.Spells[j].SpellId != 0)
3066 {
3067 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong spell in spellid_{} ({}) for learning special format", entry, j + 1, itemTemplate.Spells[j].SpellId);
3068 itemTemplate.Spells[j].SpellId = 0;
3069 }
3070 }
3071 }
3072 // normal spell list
3073 else
3074 {
3075 for (uint8 j = 0; j < MAX_ITEM_PROTO_SPELLS; ++j)
3076 {
3077 if (itemTemplate.Spells[j].SpellTrigger >= MAX_ITEM_SPELLTRIGGER || itemTemplate.Spells[j].SpellTrigger == ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
3078 {
3079 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong item spell trigger value in spelltrigger_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellTrigger);
3080 itemTemplate.Spells[j].SpellId = 0;
3081 itemTemplate.Spells[j].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3082 }
3083
3084 if (itemTemplate.Spells[j].SpellId && itemTemplate.Spells[j].SpellId != -1)
3085 {
3086 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemTemplate.Spells[j].SpellId);
3087 if (!spellInfo && !DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, itemTemplate.Spells[j].SpellId, nullptr))
3088 {
3089 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (not existing) spell in spellid_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellId);
3090 itemTemplate.Spells[j].SpellId = 0;
3091 }
3092 // allowed only in special format
3093 else if ((itemTemplate.Spells[j].SpellId == 483) || (itemTemplate.Spells[j].SpellId == 55884))
3094 {
3095 LOG_ERROR("sql.sql", "Item (Entry: {}) has broken spell in spellid_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellId);
3096 itemTemplate.Spells[j].SpellId = 0;
3097 }
3098 }
3099 }
3100 }
3101
3102 if (itemTemplate.Bonding >= MAX_BIND_TYPE)
3103 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Bonding value ({})", entry, itemTemplate.Bonding);
3104
3105 if (itemTemplate.PageText && !GetPageText(itemTemplate.PageText))
3106 LOG_ERROR("sql.sql", "Item (Entry: {}) has non existing first page (Id:{})", entry, itemTemplate.PageText);
3107
3108 if (itemTemplate.LockID && !sLockStore.LookupEntry(itemTemplate.LockID))
3109 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong LockID ({})", entry, itemTemplate.LockID);
3110
3111 if (itemTemplate.RandomProperty)
3112 {
3113 // To be implemented later
3114 if (itemTemplate.RandomProperty == -1)
3115 itemTemplate.RandomProperty = 0;
3116
3117 else if (!sItemRandomPropertiesStore.LookupEntry(GetItemEnchantMod(itemTemplate.RandomProperty)))
3118 {
3119 LOG_ERROR("sql.sql", "Item (Entry: {}) has unknown (wrong or not listed in `item_enchantment_template`) RandomProperty ({})", entry, itemTemplate.RandomProperty);
3120 itemTemplate.RandomProperty = 0;
3121 }
3122 }
3123
3124 if (itemTemplate.RandomSuffix && !sItemRandomSuffixStore.LookupEntry(GetItemEnchantMod(itemTemplate.RandomSuffix)))
3125 {
3126 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong RandomSuffix ({})", entry, itemTemplate.RandomSuffix);
3127 itemTemplate.RandomSuffix = 0;
3128 }
3129
3130 if (itemTemplate.ItemSet && !sItemSetStore.LookupEntry(itemTemplate.ItemSet))
3131 {
3132 LOG_ERROR("sql.sql", "Item (Entry: {}) have wrong ItemSet ({})", entry, itemTemplate.ItemSet);
3133 itemTemplate.ItemSet = 0;
3134 }
3135
3136 if (itemTemplate.Area && !sAreaTableStore.LookupEntry(itemTemplate.Area))
3137 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Area ({})", entry, itemTemplate.Area);
3138
3139 if (itemTemplate.Map && !sMapStore.LookupEntry(itemTemplate.Map))
3140 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Map ({})", entry, itemTemplate.Map);
3141
3142 if (itemTemplate.BagFamily)
3143 {
3144 // check bits
3145 for (uint32 j = 0; j < sizeof(itemTemplate.BagFamily) * 8; ++j)
3146 {
3147 uint32 mask = 1 << j;
3148 if ((itemTemplate.BagFamily & mask) == 0)
3149 continue;
3150
3151 ItemBagFamilyEntry const* bf = sItemBagFamilyStore.LookupEntry(j + 1);
3152 if (!bf)
3153 {
3154 LOG_ERROR("sql.sql", "Item (Entry: {}) has bag family bit set not listed in ItemBagFamily.dbc, remove bit", entry);
3155 itemTemplate.BagFamily &= ~mask;
3156 continue;
3157 }
3158
3160 {
3161 CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(itemTemplate.ItemId);
3162 if (!ctEntry)
3163 {
3164 LOG_ERROR("sql.sql", "Item (Entry: {}) has currency bag family bit set in BagFamily but not listed in CurrencyTypes.dbc, remove bit", entry);
3165 itemTemplate.BagFamily &= ~mask;
3166 }
3167 }
3168 }
3169 }
3170
3171 if (itemTemplate.TotemCategory && !sTotemCategoryStore.LookupEntry(itemTemplate.TotemCategory))
3172 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong TotemCategory ({})", entry, itemTemplate.TotemCategory);
3173
3174 for (uint8 j = 0; j < MAX_ITEM_PROTO_SOCKETS; ++j)
3175 {
3176 if (itemTemplate.Socket[j].Color && (itemTemplate.Socket[j].Color & SOCKET_COLOR_ALL) != itemTemplate.Socket[j].Color)
3177 {
3178 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong socketColor_{} ({})", entry, j + 1, itemTemplate.Socket[j].Color);
3179 itemTemplate.Socket[j].Color = 0;
3180 }
3181 }
3182
3183 if (itemTemplate.GemProperties && !sGemPropertiesStore.LookupEntry(itemTemplate.GemProperties))
3184 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong GemProperties ({})", entry, itemTemplate.GemProperties);
3185
3186 if (itemTemplate.FoodType >= MAX_PET_DIET)
3187 {
3188 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong FoodType value ({})", entry, itemTemplate.FoodType);
3189 itemTemplate.FoodType = 0;
3190 }
3191
3192 if (itemTemplate.ItemLimitCategory && !sItemLimitCategoryStore.LookupEntry(itemTemplate.ItemLimitCategory))
3193 {
3194 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong LimitCategory value ({})", entry, itemTemplate.ItemLimitCategory);
3195 itemTemplate.ItemLimitCategory = 0;
3196 }
3197
3198 if (itemTemplate.HolidayId && !sHolidaysStore.LookupEntry(itemTemplate.HolidayId))
3199 {
3200 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong HolidayId value ({})", entry, itemTemplate.HolidayId);
3201 itemTemplate.HolidayId = 0;
3202 }
3203
3204 if (itemTemplate.HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME) && !itemTemplate.Duration)
3205 {
3206 LOG_ERROR("sql.sql", "Item (Entry {}) has flag ITEM_FLAGS_CU_DURATION_REAL_TIME but it does not have duration limit", entry);
3207 itemTemplate.FlagsCu = static_cast<ItemFlagsCustom>(static_cast<uint32>(itemTemplate.FlagsCu) & ~ITEM_FLAGS_CU_DURATION_REAL_TIME);
3208 }
3209
3210 // Fill categories map
3211 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
3212 if (itemTemplate.Spells[i].SpellId && itemTemplate.Spells[i].SpellCategory && itemTemplate.Spells[i].SpellCategoryCooldown)
3213 {
3214 SpellCategoryStore::iterator ct = sSpellsByCategoryStore.find(itemTemplate.Spells[i].SpellCategory);
3215 if (ct != sSpellsByCategoryStore.end())
3216 {
3217 ct->second.emplace(true, itemTemplate.Spells[i].SpellId);
3218 }
3219 else
3220 sSpellsByCategoryStore[itemTemplate.Spells[i].SpellCategory].emplace(true, itemTemplate.Spells[i].SpellId);
3221 }
3222
3223 ++count;
3224 } while (result->NextRow());
3225
3226 // pussywizard:
3227 {
3228 uint32 max = 0;
3229 for (ItemTemplateContainer::const_iterator itr = _itemTemplateStore.begin(); itr != _itemTemplateStore.end(); ++itr)
3230 if (itr->first > max)
3231 max = itr->first;
3232 if (max)
3233 {
3234 _itemTemplateStoreFast.clear();
3235 _itemTemplateStoreFast.resize(max + 1, nullptr);
3236 for (ItemTemplateContainer::iterator itr = _itemTemplateStore.begin(); itr != _itemTemplateStore.end(); ++itr)
3237 _itemTemplateStoreFast[itr->first] = &(itr->second);
3238 }
3239 }
3240
3241 for (ItemTemplateContainer::iterator itr = _itemTemplateStore.begin(); itr != _itemTemplateStore.end(); ++itr)
3242 itr->second.InitializeQueryData();
3243
3244 // Check if item templates for DBC referenced character start outfit are present
3245 std::set<uint32> notFoundOutfit;
3246 for (uint32 i = 1; i < sCharStartOutfitStore.GetNumRows(); ++i)
3247 {
3248 CharStartOutfitEntry const* entry = sCharStartOutfitStore.LookupEntry(i);
3249 if (!entry)
3250 continue;
3251
3252 for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j)
3253 {
3254 if (entry->ItemId[j] <= 0)
3255 continue;
3256
3257 uint32 item_id = entry->ItemId[j];
3258
3259 if (!GetItemTemplate(item_id))
3260 notFoundOutfit.insert(item_id);
3261 }
3262 }
3263
3264 for (std::set<uint32>::const_iterator itr = notFoundOutfit.begin(); itr != notFoundOutfit.end(); ++itr)
3265 LOG_ERROR("sql.sql", "Item (Entry: {}) does not exist in `item_template` but is referenced in `CharStartOutfit.dbc`", *itr);
3266
3267 LOG_INFO("server.loading", ">> Loaded {} Item Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3268 LOG_INFO("server.loading", " ");
3269}
#define MAX_OUTFIT_ITEMS
Definition: DBCStructure.h:616
#define MAX_REPUTATION_RANK
Definition: SharedDefines.h:245
#define MIN_REPUTATION_RANK
Definition: SharedDefines.h:244
#define MAX_PET_DIET
Definition: SharedDefines.h:3231
@ ITEM_QUALITY_NORMAL
Definition: SharedDefines.h:330
#define MAX_ITEM_QUALITY
Definition: SharedDefines.h:339
#define MAX_SKILL_TYPE
Definition: SharedDefines.h:3018
@ ALLIANCE
Definition: SharedDefines.h:768
@ HORDE
Definition: SharedDefines.h:767
#define CLASSMASK_ALL_PLAYABLE
Definition: SharedDefines.h:157
#define RACEMASK_ALL_PLAYABLE
Definition: SharedDefines.h:97
@ CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES
Definition: IWorld.h:138
Rates
Server rates.
Definition: IWorld.h:429
@ RATE_BUYVALUE_ITEM_POOR
Definition: IWorld.h:457
@ RATE_SELLVALUE_ITEM_POOR
Definition: IWorld.h:449
uint32 GetItemEnchantMod(int32 entry)
Definition: ItemEnchantmentMgr.cpp:83
ItemFlags2
Definition: ItemTemplate.h:182
@ ITEM_FLAG2_FACTION_HORDE
Definition: ItemTemplate.h:183
@ ITEM_FLAG2_FACTION_ALLIANCE
Definition: ItemTemplate.h:184
@ ITEM_SPELLTRIGGER_LEARN_SPELL_ID
Definition: ItemTemplate.h:88
@ ITEM_SPELLTRIGGER_ON_USE
Definition: ItemTemplate.h:77
@ BAG_FAMILY_MASK_CURRENCY_TOKENS
Definition: ItemTemplate.h:240
ItemFlags
Definition: ItemTemplate.h:146
@ ITEM_MOD_SPELL_HEALING_DONE
Definition: ItemTemplate.h:63
#define MAX_ITEM_PROTO_SOCKETS
Definition: ItemTemplate.h:614
#define MAX_ITEM_PROTO_DAMAGES
Definition: ItemTemplate.h:613
#define MAX_ITEM_PROTO_SPELLS
Definition: ItemTemplate.h:615
ItemFlagsCustom
Definition: ItemTemplate.h:218
@ ITEM_FLAGS_CU_DURATION_REAL_TIME
Definition: ItemTemplate.h:219
#define SOCKET_COLOR_ALL
Definition: ItemTemplate.h:252
#define MAX_BIND_TYPE
Definition: ItemTemplate.h:103
#define MAX_ITEM_SPELLTRIGGER
Definition: ItemTemplate.h:91
#define MAX_ITEM_PROTO_STATS
Definition: ItemTemplate.h:616
#define MAX_ITEM_MOD
Definition: ItemTemplate.h:73
#define MAX_BAG_SIZE
Definition: Bag.h:22
DBCStorage< ItemLimitCategoryEntry > sItemLimitCategoryStore(ItemLimitCategoryEntryfmt)
SpellCategoryStore sSpellsByCategoryStore
Definition: DBCStores.cpp:152
DBCStorage< CharStartOutfitEntry > sCharStartOutfitStore(CharStartOutfitEntryfmt)
DBCStorage< LockEntry > sLockStore(LockEntryfmt)
DBCStorage< ItemBagFamilyEntry > sItemBagFamilyStore(ItemBagFamilyfmt)
DBCStorage< HolidaysEntry > sHolidaysStore(Holidaysfmt)
DBCStorage< ItemRandomSuffixEntry > sItemRandomSuffixStore(ItemRandomSuffixfmt)
DBCStorage< TotemCategoryEntry > sTotemCategoryStore(TotemCategoryEntryfmt)
DBCStorage< GemPropertiesEntry > sGemPropertiesStore(GemPropertiesEntryfmt)
DBCStorage< ItemRandomPropertiesEntry > sItemRandomPropertiesStore(ItemRandomPropertiesfmt)
DBCStorage< CurrencyTypesEntry > sCurrencyTypesStore(CurrencyTypesfmt)
@ DISABLE_TYPE_SPELL
Definition: DisableMgr.h:27
bool IsDisabledFor(DisableType type, uint32 entry, Unit const *unit, uint8 flags)
Definition: DisableMgr.cpp:307
Definition: DBCStructure.h:619
int32 ItemId[MAX_OUTFIT_ITEMS]
Definition: DBCStructure.h:625
Definition: DBCStructure.h:834
Definition: DBCStructure.h:906
int32 SoundOverrideSubclassID
Definition: DBCStructure.h:1143
uint32 SheatheType
Definition: DBCStructure.h:1147
uint32 DisplayInfoID
Definition: DBCStructure.h:1145
uint32 ClassID
Definition: DBCStructure.h:1141
int32 Material
Definition: DBCStructure.h:1144
uint32 SubclassID
Definition: DBCStructure.h:1142
Definition: DBCStructure.h:1151

References _itemTemplateStore, _itemTemplateStoreFast, ALLIANCE, BAG_FAMILY_MASK_CURRENCY_TOKENS, ItemEntry::ClassID, CLASSMASK_ALL_PLAYABLE, CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES, DISABLE_TYPE_SPELL, ItemEntry::DisplayInfoID, Field::Get(), GetItemEnchantMod(), GetItemTemplate(), getMSTime(), GetMSTimeDiffToNow(), GetPageText(), HORDE, ItemEntry::InventoryType, INVTYPE_NON_EQUIP, DisableMgr::IsDisabledFor(), ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ITEM_FLAGS_CU_DURATION_REAL_TIME, ITEM_MOD_SPELL_HEALING_DONE, ITEM_QUALITY_NORMAL, ITEM_SPELLTRIGGER_LEARN_SPELL_ID, ITEM_SPELLTRIGGER_ON_USE, CharStartOutfitEntry::ItemId, LOG_DEBUG, LOG_ERROR, LOG_INFO, LOG_WARN, ItemEntry::Material, MAX_BAG_SIZE, MAX_BIND_TYPE, MAX_ITEM_MOD, MAX_ITEM_PROTO_DAMAGES, MAX_ITEM_PROTO_SOCKETS, MAX_ITEM_PROTO_SPELLS, MAX_ITEM_PROTO_STATS, MAX_ITEM_QUALITY, MAX_ITEM_SPELLTRIGGER, MAX_OUTFIT_ITEMS, MAX_PET_DIET, MAX_REPUTATION_RANK, MAX_SKILL_TYPE, MAX_SPELL_SCHOOL, MIN_REPUTATION_RANK, RACEMASK_ALL_PLAYABLE, RATE_BUYVALUE_ITEM_POOR, RATE_SELLVALUE_ITEM_POOR, sAreaTableStore, sCharStartOutfitStore, sCurrencyTypesStore, sFactionStore, sGemPropertiesStore, ItemEntry::SheatheType, sHolidaysStore, sItemBagFamilyStore, sItemLimitCategoryStore, sItemRandomPropertiesStore, sItemRandomSuffixStore, sItemSetStore, sItemStore, sLockStore, sMapStore, sObjectMgr, SOCKET_COLOR_ALL, ItemEntry::SoundOverrideSubclassID, sSpellMgr, sSpellsByCategoryStore, sTotemCategoryStore, ItemEntry::SubclassID, sWorld, and WorldDatabase.

◆ LoadLinkedRespawn()

void ObjectMgr::LoadLinkedRespawn ( )
1789{
1790 uint32 oldMSTime = getMSTime();
1791
1792 _linkedRespawnStore.clear();
1793 // 0 1 2
1794 QueryResult result = WorldDatabase.Query("SELECT guid, linkedGuid, linkType FROM linked_respawn ORDER BY guid ASC");
1795
1796 if (!result)
1797 {
1798 LOG_WARN("server.loading", ">> Loaded 0 linked respawns. DB table `linked_respawn` is empty.");
1799 LOG_INFO("server.loading", " ");
1800 return;
1801 }
1802
1803 do
1804 {
1805 Field* fields = result->Fetch();
1806
1807 ObjectGuid::LowType guidLow = fields[0].Get<uint32>();
1808 ObjectGuid::LowType linkedGuidLow = fields[1].Get<uint32>();
1809 uint8 linkType = fields[2].Get<uint8>();
1810
1811 ObjectGuid guid, linkedGuid;
1812 bool error = false;
1813 switch (linkType)
1814 {
1816 {
1817 const CreatureData* slave = GetCreatureData(guidLow);
1818 if (!slave)
1819 {
1820 LOG_ERROR("sql.sql", "LinkedRespawn: Creature (guid) {} not found in creature table", guidLow);
1821 error = true;
1822 break;
1823 }
1824
1825 const CreatureData* master = GetCreatureData(linkedGuidLow);
1826 if (!master)
1827 {
1828 LOG_ERROR("sql.sql", "LinkedRespawn: Creature (linkedGuid) {} not found in creature table", linkedGuidLow);
1829 error = true;
1830 break;
1831 }
1832
1833 MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
1834 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
1835 {
1836 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to Creature '{}' on an unpermitted map.", guidLow, linkedGuidLow);
1837 error = true;
1838 break;
1839 }
1840
1841 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
1842 {
1843 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to Creature '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
1844 error = true;
1845 break;
1846 }
1847
1848 guid = ObjectGuid::Create<HighGuid::Unit>(slave->id1, guidLow);
1849 linkedGuid = ObjectGuid::Create<HighGuid::Unit>(master->id1, linkedGuidLow);
1850 break;
1851 }
1852 case CREATURE_TO_GO:
1853 {
1854 const CreatureData* slave = GetCreatureData(guidLow);
1855 if (!slave)
1856 {
1857 LOG_ERROR("sql.sql", "LinkedRespawn: Creature (guid) {} not found in creature table", guidLow);
1858 error = true;
1859 break;
1860 }
1861
1862 const GameObjectData* master = GetGameObjectData(linkedGuidLow);
1863 if (!master)
1864 {
1865 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (linkedGuid) {} not found in gameobject table", linkedGuidLow);
1866 error = true;
1867 break;
1868 }
1869
1870 MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
1871 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
1872 {
1873 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to Gameobject '{}' on an unpermitted map.", guidLow, linkedGuidLow);
1874 error = true;
1875 break;
1876 }
1877
1878 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
1879 {
1880 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to Gameobject '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
1881 error = true;
1882 break;
1883 }
1884
1885 guid = ObjectGuid::Create<HighGuid::Unit>(slave->id1, guidLow);
1886 linkedGuid = ObjectGuid::Create<HighGuid::GameObject>(master->id, linkedGuidLow);
1887 break;
1888 }
1889 case GO_TO_GO:
1890 {
1891 const GameObjectData* slave = GetGameObjectData(guidLow);
1892 if (!slave)
1893 {
1894 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (guid) {} not found in gameobject table", guidLow);
1895 error = true;
1896 break;
1897 }
1898
1899 const GameObjectData* master = GetGameObjectData(linkedGuidLow);
1900 if (!master)
1901 {
1902 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (linkedGuid) {} not found in gameobject table", linkedGuidLow);
1903 error = true;
1904 break;
1905 }
1906
1907 MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
1908 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
1909 {
1910 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '{}' linking to Gameobject '{}' on an unpermitted map.", guidLow, linkedGuidLow);
1911 error = true;
1912 break;
1913 }
1914
1915 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
1916 {
1917 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '{}' linking to Gameobject '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
1918 error = true;
1919 break;
1920 }
1921
1922 guid = ObjectGuid::Create<HighGuid::GameObject>(slave->id, guidLow);
1923 linkedGuid = ObjectGuid::Create<HighGuid::GameObject>(master->id, linkedGuidLow);
1924 break;
1925 }
1926 case GO_TO_CREATURE:
1927 {
1928 const GameObjectData* slave = GetGameObjectData(guidLow);
1929 if (!slave)
1930 {
1931 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (guid) {} not found in gameobject table", guidLow);
1932 error = true;
1933 break;
1934 }
1935
1936 const CreatureData* master = GetCreatureData(linkedGuidLow);
1937 if (!master)
1938 {
1939 LOG_ERROR("sql.sql", "LinkedRespawn: Creature (linkedGuid) {} not found in creature table", linkedGuidLow);
1940 error = true;
1941 break;
1942 }
1943
1944 MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
1945 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
1946 {
1947 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '{}' linking to Creature '{}' on an unpermitted map.", guidLow, linkedGuidLow);
1948 error = true;
1949 break;
1950 }
1951
1952 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
1953 {
1954 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '{}' linking to Creature '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
1955 error = true;
1956 break;
1957 }
1958
1959 guid = ObjectGuid::Create<HighGuid::GameObject>(slave->id, guidLow);
1960 linkedGuid = ObjectGuid::Create<HighGuid::Unit>(master->id1, linkedGuidLow);
1961 break;
1962 }
1963 }
1964
1965 if (!error)
1966 _linkedRespawnStore[guid] = linkedGuid;
1967 } while (result->NextRow());
1968
1969 LOG_INFO("server.loading", ">> Loaded {} Linked Respawns In {} ms", uint64(_linkedRespawnStore.size()), GetMSTimeDiffToNow(oldMSTime));
1970 LOG_INFO("server.loading", " ");
1971}
Definition: ObjectGuid.h:118
bool Instanceable() const
Definition: DBCStructure.h:1352

References _linkedRespawnStore, CREATURE_TO_CREATURE, CREATURE_TO_GO, Field::Get(), GetCreatureData(), GetGameObjectData(), getMSTime(), GetMSTimeDiffToNow(), GO_TO_CREATURE, GO_TO_GO, GameObjectData::id, CreatureData::id1, MapEntry::Instanceable(), LOG_ERROR, LOG_INFO, LOG_WARN, CreatureData::mapid, GameObjectData::mapid, sMapStore, CreatureData::spawnMask, GameObjectData::spawnMask, and WorldDatabase.

◆ LoadMailLevelRewards()

void ObjectMgr::LoadMailLevelRewards ( )
9033{
9034 uint32 oldMSTime = getMSTime();
9035
9036 _mailLevelRewardStore.clear(); // for reload case
9037
9038 // 0 1 2 3
9039 QueryResult result = WorldDatabase.Query("SELECT level, raceMask, mailTemplateId, senderEntry FROM mail_level_reward");
9040
9041 if (!result)
9042 {
9043 LOG_WARN("server.loading", ">> Loaded 0 level dependent mail rewards. DB table `mail_level_reward` is empty.");
9044 LOG_INFO("server.loading", " ");
9045 return;
9046 }
9047
9048 uint32 count = 0;
9049
9050 do
9051 {
9052 Field* fields = result->Fetch();
9053
9054 uint8 level = fields[0].Get<uint8>();
9055 uint32 raceMask = fields[1].Get<uint32>();
9056 uint32 mailTemplateId = fields[2].Get<uint32>();
9057 uint32 senderEntry = fields[3].Get<uint32>();
9058
9059 if (level > MAX_LEVEL)
9060 {
9061 LOG_ERROR("sql.sql", "Table `mail_level_reward` have data for level {} that more supported by client ({}), ignoring.", level, MAX_LEVEL);
9062 continue;
9063 }
9064
9065 if (!(raceMask & RACEMASK_ALL_PLAYABLE))
9066 {
9067 LOG_ERROR("sql.sql", "Table `mail_level_reward` have raceMask ({}) for level {} that not include any player races, ignoring.", raceMask, level);
9068 continue;
9069 }
9070
9071 if (!sMailTemplateStore.LookupEntry(mailTemplateId))
9072 {
9073 LOG_ERROR("sql.sql", "Table `mail_level_reward` have invalid mailTemplateId ({}) for level {} that invalid not include any player races, ignoring.", mailTemplateId, level);
9074 continue;
9075 }
9076
9077 if (!GetCreatureTemplate(senderEntry))
9078 {
9079 LOG_ERROR("sql.sql", "Table `mail_level_reward` have not existed sender creature entry ({}) for level {} that invalid not include any player races, ignoring.", senderEntry, level);
9080 continue;
9081 }
9082
9083 _mailLevelRewardStore[level].push_back(MailLevelReward(raceMask, mailTemplateId, senderEntry));
9084
9085 ++count;
9086 } while (result->NextRow());
9087
9088 LOG_INFO("server.loading", ">> Loaded {} Level Dependent Mail Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9089 LOG_INFO("server.loading", " ");
9090}
#define MAX_LEVEL
Definition: DBCEnums.h:39
DBCStorage< MailTemplateEntry > sMailTemplateStore(MailTemplateEntryfmt)
Definition: ObjectMgr.h:543

References _mailLevelRewardStore, Field::Get(), GetCreatureTemplate(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, MAX_LEVEL, RACEMASK_ALL_PLAYABLE, sMailTemplateStore, and WorldDatabase.

◆ LoadMailServerTemplates()

void ObjectMgr::LoadMailServerTemplates ( )
10295{
10296 uint32 oldMSTime = getMSTime();
10297
10298 _serverMailStore.clear(); // for reload case
10299
10300 // 0 1 2 3 4 5 6 7 8 9 10 11
10301 QueryResult result = CharacterDatabase.Query("SELECT `id`, `reqLevel`, `reqPlayTime`, `moneyA`, `moneyH`, `itemA`, `itemCountA`, `itemH`,`itemCountH`, `subject`, `body`, `active` FROM `mail_server_template`");
10302 if (!result)
10303 {
10304 LOG_INFO("sql.sql", ">> Loaded 0 server mail rewards. DB table `mail_server_template` is empty.");
10305 LOG_INFO("server.loading", " ");
10306 return;
10307 }
10308
10309 _serverMailStore.rehash(result->GetRowCount());
10310
10311 do
10312 {
10313 Field* fields = result->Fetch();
10314
10315 uint32 id = fields[0].Get<uint32>();
10316
10317 ServerMail& servMail = _serverMailStore[id];
10318
10319 servMail.id = id;
10320 servMail.reqLevel = fields[1].Get<uint8>();
10321 servMail.reqPlayTime = fields[2].Get<uint32>();
10322 servMail.moneyA = fields[3].Get<uint32>();
10323 servMail.moneyH = fields[4].Get<uint32>();
10324 servMail.itemA = fields[5].Get<uint32>();
10325 servMail.itemCountA = fields[6].Get<uint32>();
10326 servMail.itemH = fields[7].Get<uint32>();
10327 servMail.itemCountH = fields[8].Get<uint32>();
10328 servMail.subject = fields[9].Get<std::string>();
10329 servMail.body = fields[10].Get<std::string>();
10330 servMail.active = fields[11].Get<uint8>();
10331
10332 if (servMail.reqLevel > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
10333 {
10334 LOG_ERROR("sql.sql", "Table `mail_server_template` has reqLevel {} but max level is {} for id {}, skipped.", servMail.reqLevel, sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL), servMail.id);
10335 return;
10336 }
10337
10338 if (servMail.moneyA > MAX_MONEY_AMOUNT || servMail.moneyH > MAX_MONEY_AMOUNT)
10339 {
10340 LOG_ERROR("sql.sql", "Table `mail_server_template` has moneyA {} or moneyH {} larger than MAX_MONEY_AMOUNT {} for id {}, skipped.", servMail.moneyA, servMail.moneyH, MAX_MONEY_AMOUNT, servMail.id);
10341 return;
10342 }
10343
10344 ItemTemplate const* itemTemplateA = sObjectMgr->GetItemTemplate(servMail.itemA);
10345 if (!itemTemplateA && servMail.itemA)
10346 {
10347 LOG_ERROR("sql.sql", "Table `mail_server_template` has invalid item in itemA {} for id {}, skipped.", servMail.itemA, servMail.id);
10348 return;
10349 }
10350 ItemTemplate const* itemTemplateH = sObjectMgr->GetItemTemplate(servMail.itemH);
10351 if (!itemTemplateH && servMail.itemH)
10352 {
10353 LOG_ERROR("sql.sql", "Table `mail_server_template` has invalid item in itemH {} for id {}, skipped.", servMail.itemH, servMail.id);
10354 return;
10355 }
10356
10357 if (!servMail.itemA && servMail.itemCountA)
10358 {
10359 LOG_ERROR("sql.sql", "Table `mail_server_template` has itemCountA {} with no ItemA, set to 0", servMail.itemCountA);
10360 servMail.itemCountA = 0;
10361 }
10362 if (!servMail.itemH && servMail.itemCountH)
10363 {
10364 LOG_ERROR("sql.sql", "Table `mail_server_template` has itemCountH {} with no ItemH, set to 0", servMail.itemCountH);
10365 servMail.itemCountH = 0;
10366 }
10367 } while (result->NextRow());
10368
10369 LOG_INFO("server.loading", ">> Loaded {} Mail Server Template in {} ms", _serverMailStore.size(), GetMSTimeDiffToNow(oldMSTime));
10370 LOG_INFO("server.loading", " ");
10371}
#define MAX_MONEY_AMOUNT
Definition: Player.h:935
Definition: Mail.h:214

References _serverMailStore, CharacterDatabase, CONFIG_MAX_PLAYER_LEVEL, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, MAX_MONEY_AMOUNT, sObjectMgr, and sWorld.

◆ LoadModuleStrings()

bool ObjectMgr::LoadModuleStrings ( )
8613{
8614 uint32 oldMSTime = getMSTime();
8615
8616 _moduleStringStore.clear(); // for reload case
8617 QueryResult result = WorldDatabase.Query("SELECT module, id, string FROM module_string");
8618 if (!result)
8619 {
8620 LOG_WARN("server.loading", ">> Loaded 0 module strings. DB table `module_string` is empty.");
8621 LOG_INFO("server.loading", " ");
8622 return false;
8623 }
8624
8625 do
8626 {
8627 Field* fields = result->Fetch();
8628
8629 std::string module = fields[0].Get<std::string>();
8630 uint32 id = fields[1].Get<uint32>();
8631
8632 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
8633 ModuleString& data = _moduleStringStore[pairKey];
8634
8635 AddLocaleString(fields[2].Get<std::string>(), LOCALE_enUS, data.Content);
8636 } while (result->NextRow());
8637
8638 LOG_INFO("server.loading", ">> Loaded {} Module Strings in {} ms", _moduleStringStore.size(), GetMSTimeDiffToNow(oldMSTime));
8639 LOG_INFO("server.loading", " ");
8640
8641 return true;
8642}

References _moduleStringStore, AddLocaleString(), ModuleString::Content, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadModuleStringsLocale()

bool ObjectMgr::LoadModuleStringsLocale ( )
8645{
8646 uint32 oldMSTime = getMSTime();
8647
8648 QueryResult result = WorldDatabase.Query("SELECT module, id, locale, string FROM module_string_locale");
8649 if (!result)
8650 {
8651 LOG_WARN("server.loading", ">> Loaded 0 module strings locale. DB table `module_string_locale` is empty.");
8652 LOG_INFO("server.loading", " ");
8653 return false;
8654 }
8655
8656 uint32 localeCount = 0;
8657 do
8658 {
8659 Field* fields = result->Fetch();
8660
8661 std::string module = fields[0].Get<std::string>();
8662 uint32 id = fields[1].Get<uint32>();
8663
8664 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
8665 ModuleString& data = _moduleStringStore[pairKey];
8666
8667 ModuleStringContainer::iterator ms = _moduleStringStore.find(pairKey);
8668 if (ms == _moduleStringStore.end())
8669 {
8670 LOG_ERROR("sql.sql", "ModuleString (Module: {} Id: {}) found in table `module_string_locale` but does not exist in `module_string`. Skipped!", module, id);
8671 continue;
8672 }
8673
8674 LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>());
8675 if (locale == LOCALE_enUS)
8676 continue;
8677
8678 AddLocaleString(fields[3].Get<std::string>(), locale, data.Content);
8679 localeCount++;
8680 } while (result->NextRow());
8681
8682 LOG_INFO("server.loading", ">> Loaded {} Module Strings Locales in {} ms", localeCount, GetMSTimeDiffToNow(oldMSTime));
8683 LOG_INFO("server.loading", " ");
8684
8685 return true;
8686}

References _moduleStringStore, AddLocaleString(), ModuleString::Content, Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_ERROR, LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadNPCSpellClickSpells()

void ObjectMgr::LoadNPCSpellClickSpells ( )
7966{
7967 uint32 oldMSTime = getMSTime();
7968
7969 _spellClickInfoStore.clear();
7970 // 0 1 2 3
7971 QueryResult result = WorldDatabase.Query("SELECT npc_entry, spell_id, cast_flags, user_type FROM npc_spellclick_spells");
7972
7973 if (!result)
7974 {
7975 LOG_WARN("server.loading", ">> Loaded 0 spellclick spells. DB table `npc_spellclick_spells` is empty.");
7976 LOG_INFO("server.loading", " ");
7977 return;
7978 }
7979
7980 uint32 count = 0;
7981
7982 do
7983 {
7984 Field* fields = result->Fetch();
7985
7986 uint32 npc_entry = fields[0].Get<uint32>();
7987 CreatureTemplate const* cInfo = GetCreatureTemplate(npc_entry);
7988 if (!cInfo)
7989 {
7990 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown creature_template {}. Skipping entry.", npc_entry);
7991 continue;
7992 }
7993
7994 uint32 spellid = fields[1].Get<uint32>();
7995 SpellInfo const* spellinfo = sSpellMgr->GetSpellInfo(spellid);
7996 if (!spellinfo)
7997 {
7998 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown spellid {}. Skipping entry.", spellid);
7999 continue;
8000 }
8001
8002 uint8 userType = fields[3].Get<uint16>();
8003 if (userType >= SPELL_CLICK_USER_MAX)
8004 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown user type {}. Skipping entry.", uint32(userType));
8005
8006 uint8 castFlags = fields[2].Get<uint8>();
8007 SpellClickInfo info;
8008 info.spellId = spellid;
8009 info.castFlags = castFlags;
8010 info.userType = SpellClickUserTypes(userType);
8011 _spellClickInfoStore.insert(SpellClickInfoContainer::value_type(npc_entry, info));
8012
8013 ++count;
8014 } while (result->NextRow());
8015
8016 // all spellclick data loaded, now we check if there are creatures with NPC_FLAG_SPELLCLICK but with no data
8017 // NOTE: It *CAN* be the other way around: no spellclick flag but with spellclick data, in case of creature-only vehicle accessories
8018 CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
8019 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
8020 {
8021 if ((itr->second.npcflag & UNIT_NPC_FLAG_SPELLCLICK) && _spellClickInfoStore.find(itr->second.Entry) == _spellClickInfoStore.end())
8022 {
8023 LOG_ERROR("sql.sql", "npc_spellclick_spells: Creature template {} has UNIT_NPC_FLAG_SPELLCLICK but no data in spellclick table! Removing flag", itr->second.Entry);
8024 const_cast<CreatureTemplate*>(&itr->second)->npcflag &= ~UNIT_NPC_FLAG_SPELLCLICK;
8025 }
8026 }
8027
8028 LOG_INFO("server.loading", ">> Loaded {} Spellclick Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8029 LOG_INFO("server.loading", " ");
8030}
SpellClickUserTypes
Definition: SharedDefines.h:680
@ SPELL_CLICK_USER_MAX
Definition: SharedDefines.h:685
@ UNIT_NPC_FLAG_SPELLCLICK
Definition: UnitDefines.h:318
Definition: ObjectMgr.h:398
uint32 spellId
Definition: ObjectMgr.h:399

References _spellClickInfoStore, Field::Get(), GetCreatureTemplate(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sObjectMgr, SPELL_CLICK_USER_MAX, SpellClickInfo::spellId, sSpellMgr, UNIT_NPC_FLAG_SPELLCLICK, and WorldDatabase.

◆ LoadNpcTextLocales()

void ObjectMgr::LoadNpcTextLocales ( )
6055{
6056 uint32 oldMSTime = getMSTime();
6057
6058 _npcTextLocaleStore.clear(); // need for reload case
6059
6060 QueryResult result = WorldDatabase.Query("SELECT ID, Locale, "
6061 // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
6062 "Text0_0, Text0_1, Text1_0, Text1_1, Text2_0, Text2_1, Text3_0, Text3_1, Text4_0, Text4_1, Text5_0, Text5_1, Text6_0, Text6_1, Text7_0, Text7_1 "
6063 "FROM npc_text_locale");
6064
6065 if (!result)
6066 return;
6067
6068 do
6069 {
6070 Field* fields = result->Fetch();
6071
6072 uint32 ID = fields[0].Get<uint32>();
6073
6074 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
6075 if (locale == LOCALE_enUS)
6076 continue;
6077
6079 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6080 {
6081 AddLocaleString(fields[2 + i * 2].Get<std::string>(), locale, data.Text_0[i]);
6082 AddLocaleString(fields[3 + i * 2].Get<std::string>(), locale, data.Text_1[i]);
6083 }
6084 } while (result->NextRow());
6085
6086 LOG_INFO("server.loading", ">> Loaded {} Npc Text Locale Strings in {} ms", (uint32)_npcTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6087}
Definition: NPCHandler.h:55
std::vector< std::vector< std::string > > Text_1
Definition: NPCHandler.h:59
std::vector< std::vector< std::string > > Text_0
Definition: NPCHandler.h:58

References _npcTextLocaleStore, AddLocaleString(), Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_INFO, MAX_GOSSIP_TEXT_OPTIONS, NpcTextLocale::Text_0, NpcTextLocale::Text_1, and WorldDatabase.

◆ LoadPageTextLocales()

void ObjectMgr::LoadPageTextLocales ( )
5806{
5807 uint32 oldMSTime = getMSTime();
5808
5809 _pageTextLocaleStore.clear(); // need for reload case
5810
5811 // 0 1 2
5812 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Text FROM page_text_locale");
5813
5814 if (!result)
5815 return;
5816
5817 do
5818 {
5819 Field* fields = result->Fetch();
5820
5821 uint32 ID = fields[0].Get<uint32>();
5822
5823 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
5824 if (locale == LOCALE_enUS)
5825 continue;
5826
5828 AddLocaleString(fields[2].Get<std::string>(), locale, data.Text);
5829 } while (result->NextRow());
5830
5831 LOG_INFO("server.loading", ">> Loaded {} Page Text Locale Strings in {} ms", (uint32)_pageTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
5832}
Definition: NPCHandler.h:50
std::vector< std::string > Text
Definition: NPCHandler.h:51

References _pageTextLocaleStore, AddLocaleString(), Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_INFO, PageTextLocale::Text, and WorldDatabase.

◆ LoadPageTexts()

void ObjectMgr::LoadPageTexts ( )
5756{
5757 uint32 oldMSTime = getMSTime();
5758
5759 // 0 1 2
5760 QueryResult result = WorldDatabase.Query("SELECT ID, Text, NextPageID FROM page_text");
5761
5762 if (!result)
5763 {
5764 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text` is empty!");
5765 LOG_INFO("server.loading", " ");
5766 return;
5767 }
5768
5769 uint32 count = 0;
5770 do
5771 {
5772 Field* fields = result->Fetch();
5773
5774 PageText& pageText = _pageTextStore[fields[0].Get<uint32>()];
5775
5776 pageText.Text = fields[1].Get<std::string>();
5777 pageText.NextPage = fields[2].Get<uint32>();
5778
5779 ++count;
5780 } while (result->NextRow());
5781
5782 for (PageTextContainer::const_iterator itr = _pageTextStore.begin(); itr != _pageTextStore.end(); ++itr)
5783 {
5784 if (itr->second.NextPage)
5785 {
5786 PageTextContainer::const_iterator itr2 = _pageTextStore.find(itr->second.NextPage);
5787 if (itr2 == _pageTextStore.end())
5788 LOG_ERROR("sql.sql", "Page text (Id: {}) has not existing next page (Id: {})", itr->first, itr->second.NextPage);
5789 }
5790 }
5791
5792 LOG_INFO("server.loading", ">> Loaded {} Page Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5793 LOG_INFO("server.loading", " ");
5794}
Definition: ObjectMgr.h:57
uint16 NextPage
Definition: ObjectMgr.h:59
std::string Text
Definition: ObjectMgr.h:58

References _pageTextStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, PageText::NextPage, PageText::Text, and WorldDatabase.

◆ LoadPetLevelInfo()

void ObjectMgr::LoadPetLevelInfo ( )
3545{
3546 uint32 oldMSTime = getMSTime();
3547
3548 // 0 1 2 3 4 5 6 7 8 9 10 11
3549 QueryResult result = WorldDatabase.Query("SELECT creature_entry, level, hp, mana, str, agi, sta, inte, spi, armor, min_dmg, max_dmg FROM pet_levelstats");
3550
3551 if (!result)
3552 {
3553 LOG_WARN("server.loading", ">> Loaded 0 level pet stats definitions. DB table `pet_levelstats` is empty.");
3554 LOG_INFO("server.loading", " ");
3555 return;
3556 }
3557
3558 uint32 count = 0;
3559
3560 do
3561 {
3562 Field* fields = result->Fetch();
3563
3564 uint32 creature_id = fields[0].Get<uint32>();
3565 if (!sObjectMgr->GetCreatureTemplate(creature_id))
3566 {
3567 LOG_ERROR("sql.sql", "Wrong creature id {} in `pet_levelstats` table, ignoring.", creature_id);
3568 continue;
3569 }
3570
3571 uint32 current_level = fields[1].Get<uint8>();
3572 if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
3573 {
3574 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
3575 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `pet_levelstats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
3576 else
3577 {
3578 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `pet_levelstats` table, ignoring.", current_level);
3579 ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
3580 }
3581 continue;
3582 }
3583 else if (current_level < 1)
3584 {
3585 LOG_ERROR("sql.sql", "Wrong (<1) level {} in `pet_levelstats` table, ignoring.", current_level);
3586 continue;
3587 }
3588
3589 PetLevelInfo*& pInfoMapEntry = _petInfoStore[creature_id];
3590
3591 if (!pInfoMapEntry)
3592 pInfoMapEntry = new PetLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
3593
3594 // data for level 1 stored in [0] array element, ...
3595 PetLevelInfo* pLevelInfo = &pInfoMapEntry[current_level - 1];
3596
3597 pLevelInfo->health = fields[2].Get<uint32>();
3598 pLevelInfo->mana = fields[3].Get<uint32>();
3599 pLevelInfo->armor = fields[9].Get<uint32>();
3600 pLevelInfo->min_dmg = fields[10].Get<uint32>();
3601 pLevelInfo->max_dmg = fields[11].Get<uint32>();
3602 for (uint8 i = 0; i < MAX_STATS; i++)
3603 {
3604 pLevelInfo->stats[i] = fields[i + 4].Get<uint32>();
3605 }
3606
3607 ++count;
3608 } while (result->NextRow());
3609
3610 // Fill gaps and check integrity
3611 for (PetLevelInfoContainer::iterator itr = _petInfoStore.begin(); itr != _petInfoStore.end(); ++itr)
3612 {
3613 PetLevelInfo* pInfo = itr->second;
3614
3615 // fatal error if no level 1 data
3616 if (!pInfo || pInfo[0].health == 0)
3617 {
3618 LOG_ERROR("sql.sql", "Creature {} does not have pet stats data for Level 1!", itr->first);
3619 exit(1);
3620 }
3621
3622 // fill level gaps
3623 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
3624 {
3625 if (pInfo[level].health == 0)
3626 {
3627 LOG_ERROR("sql.sql", "Creature {} has no data for Level {} pet stats data, using data of Level {}.", itr->first, level + 1, level);
3628 pInfo[level] = pInfo[level - 1];
3629 }
3630 }
3631 }
3632
3633 LOG_INFO("server.loading", ">> Loaded {} Level Pet Stats Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3634 LOG_INFO("server.loading", " ");
3635}
#define STRONG_MAX_LEVEL
Definition: DBCEnums.h:43
#define MAX_STATS
Definition: SharedDefines.h:265
Definition: ObjectMgr.h:528
uint32 max_dmg
Definition: ObjectMgr.h:539
uint32 mana
Definition: ObjectMgr.h:536
uint32 min_dmg
Definition: ObjectMgr.h:538
uint32 health
Definition: ObjectMgr.h:535
std::array< uint32, MAX_STATS > stats
Definition: ObjectMgr.h:534
uint32 armor
Definition: ObjectMgr.h:537

References _petInfoStore, PetLevelInfo::armor, CONFIG_MAX_PLAYER_LEVEL, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), PetLevelInfo::health, LOG_DEBUG, LOG_ERROR, LOG_INFO, LOG_WARN, PetLevelInfo::mana, PetLevelInfo::max_dmg, MAX_STATS, PetLevelInfo::min_dmg, sObjectMgr, PetLevelInfo::stats, STRONG_MAX_LEVEL, sWorld, and WorldDatabase.

◆ LoadPetNames()

void ObjectMgr::LoadPetNames ( )
7472{
7473 uint32 oldMSTime = getMSTime();
7474 // 0 1 2
7475 QueryResult result = WorldDatabase.Query("SELECT word, entry, half FROM pet_name_generation");
7476
7477 if (!result)
7478 {
7479 LOG_WARN("server.loading", ">> Loaded 0 pet name parts. DB table `pet_name_generation` is empty!");
7480 LOG_INFO("server.loading", " ");
7481 return;
7482 }
7483
7484 uint32 count = 0;
7485
7486 do
7487 {
7488 Field* fields = result->Fetch();
7489 std::string word = fields[0].Get<std::string>();
7490 uint32 entry = fields[1].Get<uint32>();
7491 bool half = fields[2].Get<bool>();
7492 if (half)
7493 _petHalfName1[entry].push_back(word);
7494 else
7495 _petHalfName0[entry].push_back(word);
7496 ++count;
7497 } while (result->NextRow());
7498
7499 LOG_INFO("server.loading", ">> Loaded {} Pet Name Parts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7500 LOG_INFO("server.loading", " ");
7501}

References _petHalfName0, _petHalfName1, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadPetNamesLocales()

void ObjectMgr::LoadPetNamesLocales ( )
454{
455 uint32 oldMSTime = getMSTime();
456
457 // 0 1 2 3
458 QueryResult result = WorldDatabase.Query("SELECT Locale, Word, Entry, Half FROM pet_name_generation_locale");
459
460 if (!result)
461 {
462 LOG_WARN("server.loading", ">> Loaded 0 pet name locales parts. DB table `pet_name_generation_locale` is empty!");
463 LOG_INFO("server.loading", " ");
464 return;
465 }
466
467 uint32 count = 0;
468
469 do
470 {
471 Field* fields = result->Fetch();
472 LocaleConstant locale = GetLocaleByName(fields[0].Get<std::string>());
473 std::string word = fields[1].Get<std::string>();
474
475 uint32 entry = fields[2].Get<uint32>();
476 bool half = fields[3].Get<bool>();
477 std::pair<uint32, LocaleConstant> pairkey = std::make_pair(entry, locale);
478 if (half)
479 {
480 _petHalfLocaleName1[pairkey].push_back(word);
481 }
482 else
483 {
484 _petHalfLocaleName0[pairkey].push_back(word);
485 }
486 ++count;
487 } while (result->NextRow());
488
489 LOG_INFO("server.loading", ">> Loaded {} Pet Name Locales Parts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
490 LOG_INFO("server.loading", " ");
491}

References _petHalfLocaleName0, _petHalfLocaleName1, Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadPetNumber()

void ObjectMgr::LoadPetNumber ( )
7504{
7505 uint32 oldMSTime = getMSTime();
7506
7507 QueryResult result = CharacterDatabase.Query("SELECT MAX(id) FROM character_pet");
7508 if (result)
7509 {
7510 Field* fields = result->Fetch();
7511 _hiPetNumber = fields[0].Get<uint32>() + 1;
7512 }
7513
7514 LOG_INFO("server.loading", ">> Loaded The Max Pet Number: {} in {} ms", _hiPetNumber - 1, GetMSTimeDiffToNow(oldMSTime));
7515 LOG_INFO("server.loading", " ");
7516}

References _hiPetNumber, CharacterDatabase, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), and LOG_INFO.

◆ LoadPlayerInfo()

void ObjectMgr::LoadPlayerInfo ( )
3684{
3685 // Load playercreate
3686 {
3687 uint32 oldMSTime = getMSTime();
3688 // 0 1 2 3 4 5 6
3689 QueryResult result = WorldDatabase.Query("SELECT race, class, map, zone, position_x, position_y, position_z, orientation FROM playercreateinfo");
3690
3691 if (!result)
3692 {
3693 LOG_INFO("server.loading", " ");
3694 LOG_WARN("server.loading", ">> Loaded 0 player create definitions. DB table `playercreateinfo` is empty.");
3695 exit(1);
3696 }
3697 else
3698 {
3699 uint32 count = 0;
3700
3701 do
3702 {
3703 Field* fields = result->Fetch();
3704
3705 uint32 current_race = fields[0].Get<uint8>();
3706 uint32 current_class = fields[1].Get<uint8>();
3707 uint32 mapId = fields[2].Get<uint16>();
3708 uint32 areaId = fields[3].Get<uint32>(); // zone
3709 float positionX = fields[4].Get<float>();
3710 float positionY = fields[5].Get<float>();
3711 float positionZ = fields[6].Get<float>();
3712 float orientation = fields[7].Get<float>();
3713
3714 if (current_race >= MAX_RACES)
3715 {
3716 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo` table, ignoring.", current_race);
3717 continue;
3718 }
3719
3720 ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(current_race);
3721 if (!rEntry)
3722 {
3723 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo` table, ignoring.", current_race);
3724 continue;
3725 }
3726
3727 if (current_class >= MAX_CLASSES)
3728 {
3729 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo` table, ignoring.", current_class);
3730 continue;
3731 }
3732
3733 if (!sChrClassesStore.LookupEntry(current_class))
3734 {
3735 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo` table, ignoring.", current_class);
3736 continue;
3737 }
3738
3739 // accept DB data only for valid position (and non instanceable)
3740 if (!MapMgr::IsValidMapCoord(mapId, positionX, positionY, positionZ, orientation))
3741 {
3742 LOG_ERROR("sql.sql", "Wrong home position for class {} race {} pair in `playercreateinfo` table, ignoring.", current_class, current_race);
3743 continue;
3744 }
3745
3746 if (sMapStore.LookupEntry(mapId)->Instanceable())
3747 {
3748 LOG_ERROR("sql.sql", "Home position in instanceable map for class {} race {} pair in `playercreateinfo` table, ignoring.", current_class, current_race);
3749 continue;
3750 }
3751
3752 PlayerInfo* info = new PlayerInfo();
3753 info->mapId = mapId;
3754 info->areaId = areaId;
3755 info->positionX = positionX;
3756 info->positionY = positionY;
3757 info->positionZ = positionZ;
3758 info->orientation = orientation;
3759 info->displayId_m = rEntry->model_m;
3760 info->displayId_f = rEntry->model_f;
3761 _playerInfo[current_race][current_class] = info;
3762
3763 ++count;
3764 } while (result->NextRow());
3765
3766 LOG_INFO("server.loading", ">> Loaded {} Player Create Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3767 LOG_INFO("server.loading", " ");
3768 }
3769 }
3770
3771 // Load playercreate items
3772 LOG_INFO("server.loading", "Loading Player Create Items Data...");
3773 {
3774 uint32 oldMSTime = getMSTime();
3775 // 0 1 2 3
3776 QueryResult result = WorldDatabase.Query("SELECT race, class, itemid, amount FROM playercreateinfo_item");
3777
3778 if (!result)
3779 {
3780 LOG_WARN("server.loading", ">> Loaded 0 Custom Player Create Items. DB Table `playercreateinfo_item` Is Empty.");
3781 LOG_INFO("server.loading", " ");
3782 }
3783 else
3784 {
3785 uint32 count = 0;
3786
3787 do
3788 {
3789 Field* fields = result->Fetch();
3790
3791 uint32 current_race = fields[0].Get<uint8>();
3792 if (current_race >= MAX_RACES)
3793 {
3794 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo_item` table, ignoring.", current_race);
3795 continue;
3796 }
3797
3798 uint32 current_class = fields[1].Get<uint8>();
3799 if (current_class >= MAX_CLASSES)
3800 {
3801 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo_item` table, ignoring.", current_class);
3802 continue;
3803 }
3804
3805 uint32 item_id = fields[2].Get<uint32>();
3806
3807 if (!GetItemTemplate(item_id))
3808 {
3809 LOG_ERROR("sql.sql", "Item id {} (race {} class {}) in `playercreateinfo_item` table but not listed in `item_template`, ignoring.", item_id, current_race, current_class);
3810 continue;
3811 }
3812
3813 int32 amount = fields[3].Get<int32>();
3814
3815 if (!amount)
3816 {
3817 LOG_ERROR("sql.sql", "Item id {} (class {} race {}) have amount == 0 in `playercreateinfo_item` table, ignoring.", item_id, current_race, current_class);
3818 continue;
3819 }
3820
3821 if (!current_race || !current_class)
3822 {
3823 uint32 min_race = current_race ? current_race : 1;
3824 uint32 max_race = current_race ? current_race + 1 : MAX_RACES;
3825 uint32 min_class = current_class ? current_class : 1;
3826 uint32 max_class = current_class ? current_class + 1 : MAX_CLASSES;
3827 for (uint32 r = min_race; r < max_race; ++r)
3828 for (uint32 c = min_class; c < max_class; ++c)
3829 PlayerCreateInfoAddItemHelper(r, c, item_id, amount);
3830 }
3831 else
3832 PlayerCreateInfoAddItemHelper(current_race, current_class, item_id, amount);
3833
3834 ++count;
3835 } while (result->NextRow());
3836
3837 LOG_INFO("server.loading", ">> Loaded {} Custom Player Create Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3838 LOG_INFO("server.loading", " ");
3839 }
3840 }
3841
3842 // Load playercreate skills
3843 LOG_INFO("server.loading", "Loading Player Create Skill Data...");
3844 {
3845 uint32 oldMSTime = getMSTime();
3846
3847 QueryResult result = WorldDatabase.Query("SELECT raceMask, classMask, skill, `rank` FROM playercreateinfo_skills");
3848
3849 if (!result)
3850 {
3851 LOG_WARN("server.loading", ">> Loaded 0 Player Create Skills. DB Table `playercreateinfo_skills` Is Empty.");
3852 }
3853 else
3854 {
3855 uint32 count = 0;
3856
3857 do
3858 {
3859 Field* fields = result->Fetch();
3860 uint32 raceMask = fields[0].Get<uint32>();
3861 uint32 classMask = fields[1].Get<uint32>();
3863 skill.SkillId = fields[2].Get<uint16>();
3864 skill.Rank = fields[3].Get<uint16>();
3865
3866 if (skill.Rank >= MAX_SKILL_STEP)
3867 {
3868 LOG_ERROR("sql.sql", "Skill rank value {} set for skill {} raceMask {} classMask {} is too high, max allowed value is {}", skill.Rank, skill.SkillId, raceMask, classMask, MAX_SKILL_STEP);
3869 continue;
3870 }
3871
3872 if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE))
3873 {
3874 LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_skills` table, ignoring.", raceMask);
3875 continue;
3876 }
3877
3878 if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE))
3879 {
3880 LOG_ERROR("sql.sql", "Wrong class mask {} in `playercreateinfo_skills` table, ignoring.", classMask);
3881 continue;
3882 }
3883
3884 if (!sSkillLineStore.LookupEntry(skill.SkillId))
3885 {
3886 LOG_ERROR("sql.sql", "Wrong skill id {} in `playercreateinfo_skills` table, ignoring.", skill.SkillId);
3887 continue;
3888 }
3889
3890 for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
3891 {
3892 if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask))
3893 {
3894 for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
3895 {
3896 if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
3897 {
3898 if (!GetSkillRaceClassInfo(skill.SkillId, raceIndex, classIndex))
3899 continue;
3900
3901 if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
3902 {
3903 info->skills.push_back(skill);
3904 ++count;
3905 }
3906 }
3907 }
3908 }
3909 }
3910 } while (result->NextRow());
3911
3912 LOG_INFO("server.loading", ">> Loaded {} Player Create Skills in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3913 LOG_INFO("server.loading", " ");
3914 }
3915 }
3916
3917 // Load playercreate spells
3918 LOG_INFO("server.loading", "Loading Player Create Spell Data...");
3919 {
3920 uint32 oldMSTime = getMSTime();
3921
3922 QueryResult result = WorldDatabase.Query("SELECT racemask, classmask, Spell FROM playercreateinfo_spell_custom");
3923
3924 if (!result)
3925 {
3926 LOG_WARN("server.loading", ">> Loaded 0 player create spells. DB table `playercreateinfo_spell_custom` is empty.");
3927 }
3928 else
3929 {
3930 uint32 count = 0;
3931
3932 do
3933 {
3934 Field* fields = result->Fetch();
3935 uint32 raceMask = fields[0].Get<uint32>();
3936 uint32 classMask = fields[1].Get<uint32>();
3937 uint32 spellId = fields[2].Get<uint32>();
3938
3939 if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE))
3940 {
3941 LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_spell_custom` table, ignoring.", raceMask);
3942 continue;
3943 }
3944
3945 if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE))
3946 {
3947 LOG_ERROR("sql.sql", "Wrong class mask {} in `playercreateinfo_spell_custom` table, ignoring.", classMask);
3948 continue;
3949 }
3950
3951 for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
3952 {
3953 if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask))
3954 {
3955 for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
3956 {
3957 if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
3958 {
3959 if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
3960 {
3961 info->customSpells.push_back(spellId);
3962 ++count;
3963 }
3964 }
3965 }
3966 }
3967 }
3968 } while (result->NextRow());
3969
3970 LOG_INFO("server.loading", ">> Loaded {} Custom Player Create Spells in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3971 LOG_INFO("server.loading", " ");
3972 }
3973 }
3974
3975 // Load playercreate cast spell
3976 LOG_INFO("server.loading", "Loading Player Create Cast Spell Data...");
3977 {
3978 uint32 oldMSTime = getMSTime();
3979
3980 QueryResult result = WorldDatabase.Query("SELECT raceMask, classMask, spell FROM playercreateinfo_cast_spell");
3981
3982 if (!result)
3983 {
3984 LOG_WARN("server.loading", ">> Loaded 0 Player Create Cast Spells. DB Table `playercreateinfo_cast_spell` Is Empty.");
3985 }
3986 else
3987 {
3988 uint32 count = 0;
3989
3990 do
3991 {
3992 Field* fields = result->Fetch();
3993 uint32 raceMask = fields[0].Get<uint32>();
3994 uint32 classMask = fields[1].Get<uint32>();
3995 uint32 spellId = fields[2].Get<uint32>();
3996
3997 if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE))
3998 {
3999 LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_cast_spell` table, ignoring.", raceMask);
4000 continue;
4001 }
4002
4003 if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE))
4004 {
4005 LOG_ERROR("sql.sql", "Wrong class mask {} in `playercreateinfo_cast_spell` table, ignoring.", classMask);
4006 continue;
4007 }
4008
4009 for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
4010 {
4011 if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask))
4012 {
4013 for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
4014 {
4015 if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
4016 {
4017 if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
4018 {
4019 info->castSpells.push_back(spellId);
4020 ++count;
4021 }
4022 }
4023 }
4024 }
4025 }
4026 } while (result->NextRow());
4027
4028 LOG_INFO("server.loading", ">> Loaded {} Player Create Cast Spells in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4029 LOG_INFO("server.loading", " ");
4030 }
4031 }
4032
4033 // Load playercreate actions
4034 LOG_INFO("server.loading", "Loading Player Create Action Data...");
4035 {
4036 uint32 oldMSTime = getMSTime();
4037
4038 // 0 1 2 3 4
4039 QueryResult result = WorldDatabase.Query("SELECT race, class, button, action, type FROM playercreateinfo_action");
4040
4041 if (!result)
4042 {
4043 LOG_WARN("server.loading", ">> Loaded 0 Player Create Actions. DB Table `playercreateinfo_action` Is Empty.");
4044 LOG_INFO("server.loading", " ");
4045 }
4046 else
4047 {
4048 uint32 count = 0;
4049
4050 do
4051 {
4052 Field* fields = result->Fetch();
4053
4054 uint32 current_race = fields[0].Get<uint8>();
4055 if (current_race >= MAX_RACES)
4056 {
4057 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo_action` table, ignoring.", current_race);
4058 continue;
4059 }
4060
4061 uint32 current_class = fields[1].Get<uint8>();
4062 if (current_class >= MAX_CLASSES)
4063 {
4064 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo_action` table, ignoring.", current_class);
4065 continue;
4066 }
4067
4068 if (PlayerInfo* info = _playerInfo[current_race][current_class])
4069 info->action.push_back(PlayerCreateInfoAction(fields[2].Get<uint16>(), fields[3].Get<uint32>(), fields[4].Get<uint16>()));
4070
4071 ++count;
4072 } while (result->NextRow());
4073
4074 LOG_INFO("server.loading", ">> Loaded {} Player Create Actions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4075 LOG_INFO("server.loading", " ");
4076 }
4077 }
4078
4079 // Loading levels data (class/race dependent)
4080 LOG_INFO("server.loading", "Loading Player Create Level Stats Data...");
4081 {
4082 struct RaceStats
4083 {
4084 int16 StatModifier[MAX_STATS];
4085 };
4086
4087 std::array<RaceStats, MAX_RACES> raceStatModifiers;
4088
4089 uint32 oldMSTime = getMSTime();
4090
4091 // 0 1 2 3 4 5
4092 QueryResult raceStatsResult = WorldDatabase.Query("SELECT Race, Strength, Agility, Stamina, Intellect, Spirit FROM player_race_stats");
4093
4094 if (!raceStatsResult)
4095 {
4096 LOG_WARN("server.loading", ">> Loaded 0 race stats definitions. DB table `player_race_stats` is empty.");
4097 LOG_INFO("server.loading", " ");
4098 exit(1);
4099 }
4100
4101 do
4102 {
4103 Field* fields = raceStatsResult->Fetch();
4104
4105 uint32 current_race = fields[0].Get<uint8>();
4106 if (current_race >= MAX_RACES)
4107 {
4108 LOG_ERROR("sql.sql", "Wrong race {} in `player_race_stats` table, ignoring.", current_race);
4109 continue;
4110 }
4111
4112 for (uint32 i = 0; i < MAX_STATS; ++i)
4113 raceStatModifiers[current_race].StatModifier[i] = fields[i + 1].Get<int16>();
4114
4115 } while (raceStatsResult->NextRow());
4116
4117 // 0 1 2 3 4 5 6 7 8
4118 QueryResult result = WorldDatabase.Query("SELECT Class, Level, Strength, Agility, Stamina, Intellect, Spirit, BaseHP, BaseMana FROM player_class_stats");
4119
4120 if (!result)
4121 {
4122 LOG_ERROR("server.loading", ">> Loaded 0 level stats definitions. DB table `player_class_stats` is empty.");
4123 exit(1);
4124 }
4125
4126 uint32 count = 0;
4127
4128 do
4129 {
4130 Field* fields = result->Fetch();
4131
4132 uint32 current_class = fields[0].Get<uint8>();
4133 if (current_class >= MAX_CLASSES)
4134 {
4135 LOG_ERROR("sql.sql", "Wrong class {} in `player_class_stats` table, ignoring.", current_class);
4136 continue;
4137 }
4138
4139 uint32 current_level = fields[1].Get<uint8>();
4140 if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4141 {
4142 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
4143 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `player_class_stats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
4144 else
4145 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `player_class_stats` table, ignoring.", current_level);
4146
4147 continue;
4148 }
4149
4150 for (std::size_t race = 0; race < raceStatModifiers.size(); ++race)
4151 {
4152 if (PlayerInfo* info = _playerInfo[race][current_class])
4153 {
4154 if (!info->levelInfo)
4155 info->levelInfo = new PlayerLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
4156
4157 PlayerLevelInfo& levelInfo = info->levelInfo[current_level - 1];
4158 for (int i = 0; i < MAX_STATS; ++i)
4159 levelInfo.stats[i] = fields[i + 2].Get<uint16>() + raceStatModifiers[race].StatModifier[i];
4160 }
4161 }
4162
4163 PlayerClassInfo* info = _playerClassInfo[current_class];
4164 if (!info)
4165 {
4166 info = new PlayerClassInfo();
4168 _playerClassInfo[current_class] = info;
4169 }
4170
4171 PlayerClassLevelInfo& levelInfo = info->levelInfo[current_level - 1];
4172
4173 levelInfo.basehealth = fields[7].Get<uint32>();
4174 levelInfo.basemana = fields[8].Get<uint32>();
4175
4176 ++count;
4177 } while (result->NextRow());
4178
4179 // Fill gaps and check integrity
4180 for (int race = 0; race < MAX_RACES; ++race)
4181 {
4182 // skip non existed races
4183 if (!sChrRacesStore.LookupEntry(race))
4184 continue;
4185
4186 for (int class_ = 0; class_ < MAX_CLASSES; ++class_)
4187 {
4188 // skip non existed classes
4189 if (!sChrClassesStore.LookupEntry(class_))
4190 continue;
4191
4192 PlayerClassInfo* pClassInfo = _playerClassInfo[class_];
4193 PlayerInfo* info = _playerInfo[race][class_];
4194 if (!info)
4195 continue;
4196
4197 // skip expansion races if not playing with expansion
4198 if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_THE_BURNING_CRUSADE && (race == RACE_BLOODELF || race == RACE_DRAENEI))
4199 continue;
4200
4201 // skip expansion classes if not playing with expansion
4203 continue;
4204
4205 // fatal error if no initial stats data
4206 if (!info->levelInfo || (info->levelInfo[sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL) - 1].stats[0] == 0 && class_ != CLASS_DEATH_KNIGHT) || (info->levelInfo[sWorld->getIntConfig(CONFIG_START_HEROIC_PLAYER_LEVEL) - 1].stats[0] == 0 && class_ == CLASS_DEATH_KNIGHT))
4207 {
4208 LOG_ERROR("sql.sql", "Race {} class {} initial level does not have stats data!", race, class_);
4209 exit(1);
4210 }
4211
4212 // fatal error if no initial health/mana data
4213 if (!pClassInfo->levelInfo || (pClassInfo->levelInfo[sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL) - 1].basehealth == 0 && class_ != CLASS_DEATH_KNIGHT) || (pClassInfo->levelInfo[sWorld->getIntConfig(CONFIG_START_HEROIC_PLAYER_LEVEL) - 1].basehealth == 0 && class_ == CLASS_DEATH_KNIGHT))
4214 {
4215 LOG_ERROR("sql.sql", "Class {} initial level does not have health/mana data!", class_);
4216 exit(1);
4217 }
4218
4219 // fill level gaps for stats
4220 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4221 {
4222 if ((info->levelInfo[level].stats[0] == 0 && class_ != CLASS_DEATH_KNIGHT) || (level >= sWorld->getIntConfig(CONFIG_START_HEROIC_PLAYER_LEVEL) && info->levelInfo[level].stats[0] == 0 && class_ == CLASS_DEATH_KNIGHT))
4223 {
4224 LOG_ERROR("sql.sql", "Race {} class {} level {} does not have stats data. Using stats data of level {}.", race, class_, level + 1, level);
4225 info->levelInfo[level] = info->levelInfo[level - 1];
4226 }
4227 }
4228
4229 // fill level gaps for health/mana
4230 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4231 {
4232 if ((pClassInfo->levelInfo[level].basehealth == 0 && class_ != CLASS_DEATH_KNIGHT) || (level >= sWorld->getIntConfig(CONFIG_START_HEROIC_PLAYER_LEVEL) && pClassInfo->levelInfo[level].basehealth == 0 && class_ == CLASS_DEATH_KNIGHT))
4233 {
4234 LOG_ERROR("sql.sql", "Class {} level {} does not have health/mana data. Using stats data of level {}.", class_, level + 1, level);
4235 pClassInfo->levelInfo[level] = pClassInfo->levelInfo[level - 1];
4236 }
4237 }
4238 }
4239 }
4240
4241 LOG_INFO("server.loading", ">> Loaded {} Level Stats Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4242 LOG_INFO("server.loading", " ");
4243 }
4244
4245 // Loading xp per level data
4246 LOG_INFO("server.loading", "Loading Player Create XP Data...");
4247 {
4248 uint32 oldMSTime = getMSTime();
4249
4250 _playerXPperLevel.resize(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
4251 for (uint8 level = 0; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4252 _playerXPperLevel[level] = 0;
4253
4254 // 0 1
4255 QueryResult result = WorldDatabase.Query("SELECT Level, Experience FROM player_xp_for_level");
4256
4257 if (!result)
4258 {
4259 LOG_WARN("server.loading", ">> Loaded 0 xp for level definitions. DB table `player_xp_for_level` is empty.");
4260 LOG_INFO("server.loading", " ");
4261 exit(1);
4262 }
4263
4264 uint32 count = 0;
4265
4266 do
4267 {
4268 Field* fields = result->Fetch();
4269
4270 uint32 current_level = fields[0].Get<uint8>();
4271 uint32 current_xp = fields[1].Get<uint32>();
4272
4273 if (current_level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4274 {
4275 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
4276 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `player_xp_for_level` table, ignoring.", STRONG_MAX_LEVEL, current_level);
4277 else
4278 {
4279 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `player_xp_for_levels` table, ignoring.", current_level);
4280 ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
4281 }
4282 continue;
4283 }
4284 //PlayerXPperLevel
4285 _playerXPperLevel[current_level] = current_xp;
4286 ++count;
4287 } while (result->NextRow());
4288
4289 // fill level gaps
4290 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4291 {
4292 if (_playerXPperLevel[level] == 0)
4293 {
4294 LOG_ERROR("sql.sql", "Level {} does not have XP for level data. Using data of level [{}] + 100.", level + 1, level);
4295 _playerXPperLevel[level] = _playerXPperLevel[level - 1] + 100;
4296 }
4297 }
4298
4299 LOG_INFO("server.loading", ">> Loaded {} XP For Level Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4300 LOG_INFO("server.loading", " ");
4301 }
4302}
#define MAX_SKILL_STEP
Definition: DBCStructure.h:1579
@ CLASS_DEATH_KNIGHT
Definition: SharedDefines.h:146
@ RACE_DRAENEI
Definition: SharedDefines.h:81
@ RACE_BLOODELF
Definition: SharedDefines.h:80
@ RACE_HUMAN
Definition: SharedDefines.h:71
@ EXPANSION_THE_BURNING_CRUSADE
Definition: SharedDefines.h:54
@ EXPANSION_WRATH_OF_THE_LICH_KING
Definition: SharedDefines.h:55
@ CONFIG_START_HEROIC_PLAYER_LEVEL
Definition: IWorld.h:239
@ CONFIG_START_PLAYER_LEVEL
Definition: IWorld.h:238
@ CONFIG_EXPANSION
Definition: IWorld.h:276
SkillRaceClassInfoEntry const * GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_)
Definition: DBCStores.cpp:895
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
DBCStorage< SkillLineEntry > sSkillLineStore(SkillLinefmt)
DBCStorage< ChrClassesEntry > sChrClassesStore(ChrClassesEntryfmt)
Definition: Player.h:294
uint32 basehealth
Definition: Player.h:296
uint32 basemana
Definition: Player.h:297
Definition: Player.h:308
std::array< uint32, MAX_STATS > stats
Definition: Player.h:314
Definition: Player.h:320
Definition: Player.h:332
uint16 SkillId
Definition: Player.h:333
float orientation
Definition: Player.h:349
uint16 displayId_m
Definition: Player.h:350
float positionX
Definition: Player.h:346
uint32 areaId
Definition: Player.h:345
float positionY
Definition: Player.h:347
float positionZ
Definition: Player.h:348
uint32 mapId
Definition: Player.h:344
uint16 displayId_f
Definition: Player.h:351
void PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count)
Definition: ObjectMgr.cpp:3649
Definition: DBCStructure.h:678
uint32 model_f
Definition: DBCStructure.h:684
uint32 model_m
Definition: DBCStructure.h:683

References _playerClassInfo, _playerInfo, _playerXPperLevel, PlayerInfo::areaId, PlayerClassLevelInfo::basehealth, PlayerClassLevelInfo::basemana, CLASS_DEATH_KNIGHT, CLASS_WARRIOR, CLASSMASK_ALL_PLAYABLE, CONFIG_EXPANSION, CONFIG_MAX_PLAYER_LEVEL, CONFIG_START_HEROIC_PLAYER_LEVEL, CONFIG_START_PLAYER_LEVEL, PlayerInfo::displayId_f, PlayerInfo::displayId_m, EXPANSION_THE_BURNING_CRUSADE, EXPANSION_WRATH_OF_THE_LICH_KING, Field::Get(), GetItemTemplate(), getMSTime(), GetMSTimeDiffToNow(), GetSkillRaceClassInfo(), MapMgr::IsValidMapCoord(), PlayerClassInfo::levelInfo, PlayerInfo::levelInfo, LOG_DEBUG, LOG_ERROR, LOG_INFO, LOG_WARN, PlayerInfo::mapId, MAX_CLASSES, MAX_RACES, MAX_SKILL_STEP, MAX_STATS, ChrRacesEntry::model_f, ChrRacesEntry::model_m, PlayerInfo::orientation, PlayerCreateInfoAddItemHelper(), PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, RACE_BLOODELF, RACE_DRAENEI, RACE_HUMAN, RACEMASK_ALL_PLAYABLE, sChrClassesStore, sChrRacesStore, PlayerCreateInfoSkill::SkillId, sMapStore, sSkillLineStore, PlayerLevelInfo::stats, STRONG_MAX_LEVEL, sWorld, and WorldDatabase.

◆ LoadPointOfInterestLocales()

void ObjectMgr::LoadPointOfInterestLocales ( )
494{
495 uint32 oldMSTime = getMSTime();
496
497 _pointOfInterestLocaleStore.clear(); // need for reload case
498
499 // 0 1 2
500 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name FROM points_of_interest_locale");
501
502 if (!result)
503 return;
504
505 do
506 {
507 Field* fields = result->Fetch();
508
509 uint32 ID = fields[0].Get<uint32>();
510
511 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
512 if (locale == LOCALE_enUS)
513 continue;
514
516 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
517 } while (result->NextRow());
518
519 LOG_INFO("server.loading", ">> Loaded {} Points Of Interest Locale Strings in {} ms", (uint32)_pointOfInterestLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
520}
Definition: CreatureData.h:355
std::vector< std::string > Name
Definition: CreatureData.h:356

References _pointOfInterestLocaleStore, AddLocaleString(), Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_INFO, PointOfInterestLocale::Name, and WorldDatabase.

◆ LoadPointsOfInterest()

void ObjectMgr::LoadPointsOfInterest ( )
7835{
7836 uint32 oldMSTime = getMSTime();
7837
7838 _pointsOfInterestStore.clear(); // need for reload case
7839
7840 uint32 count = 0;
7841
7842 // 0 1 2 3 4 5 6
7843 QueryResult result = WorldDatabase.Query("SELECT ID, PositionX, PositionY, Icon, Flags, Importance, Name FROM points_of_interest");
7844
7845 if (!result)
7846 {
7847 LOG_WARN("server.loading", ">> Loaded 0 Points of Interest definitions. DB table `points_of_interest` is empty.");
7848 LOG_INFO("server.loading", " ");
7849 return;
7850 }
7851
7852 do
7853 {
7854 Field* fields = result->Fetch();
7855
7856 uint32 point_id = fields[0].Get<uint32>();
7857
7858 PointOfInterest POI;
7859 POI.ID = point_id;
7860 POI.PositionX = fields[1].Get<float>();
7861 POI.PositionY = fields[2].Get<float>();
7862 POI.Icon = fields[3].Get<uint32>();
7863 POI.Flags = fields[4].Get<uint32>();
7864 POI.Importance = fields[5].Get<uint32>();
7865 POI.Name = fields[6].Get<std::string>();
7866
7867 if (!Acore::IsValidMapCoord(POI.PositionX, POI.PositionY))
7868 {
7869 LOG_ERROR("sql.sql", "Table `points_of_interest` (ID: {}) have invalid coordinates (X: {} Y: {}), ignored.", point_id, POI.PositionX, POI.PositionY);
7870 continue;
7871 }
7872
7873 _pointsOfInterestStore[point_id] = POI;
7874
7875 ++count;
7876 } while (result->NextRow());
7877
7878 LOG_INFO("server.loading", ">> Loaded {} Points of Interest Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7879 LOG_INFO("server.loading", " ");
7880}
bool IsValidMapCoord(float c)
Definition: GridDefines.h:215
Definition: ObjectMgr.h:588
uint32 ID
Definition: ObjectMgr.h:589

References _pointsOfInterestStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), PointOfInterest::ID, Acore::IsValidMapCoord(), LOG_ERROR, LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadProfanityNamesFromDB()

void ObjectMgr::LoadProfanityNamesFromDB ( )
8257{
8258 uint32 oldMSTime = getMSTime();
8259
8260 _profanityNamesStore.clear(); // need for reload case
8261
8262 QueryResult result = CharacterDatabase.Query("SELECT name FROM profanity_name");
8263
8264 if (!result)
8265 {
8266 LOG_WARN("server.loading", ">> Loaded 0 profanity names. DB table `profanity_name` is empty!");
8267 return;
8268 }
8269
8270 uint32 count = 0;
8271
8272 Field* fields;
8273 do
8274 {
8275 fields = result->Fetch();
8276 std::string name = fields[0].Get<std::string>();
8277
8278 std::wstring wstr;
8279 if (!Utf8toWStr (name, wstr))
8280 {
8281 LOG_ERROR("sql.sql", "Table `profanity_name` have invalid name: {}", name);
8282 continue;
8283 }
8284
8285 wstrToLower(wstr);
8286
8287 _profanityNamesStore.insert(wstr);
8288 ++count;
8289 } while (result->NextRow());
8290
8291 LOG_INFO("server.loading", ">> Loaded {} profanity names from DB in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8292}

References _profanityNamesStore, CharacterDatabase, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, Utf8toWStr(), and wstrToLower().

◆ LoadProfanityNamesFromDBC()

void ObjectMgr::LoadProfanityNamesFromDBC ( )
8295{
8296 if (!sWorld->getBoolConfig(CONFIG_STRICT_NAMES_PROFANITY))
8297 {
8298 LOG_WARN("server.loading", ">> Loaded 0 profanity names from DBC. Config option disabled.");
8299 return;
8300 }
8301
8302 uint32 oldMSTime = getMSTime();
8303
8304 uint32 count = 0;
8305
8306 for (NamesProfanityEntry const* profanityStore : sNamesProfanityStore)
8307 {
8308 std::wstring wstr;
8309
8310 Utf8toWStr(profanityStore->Pattern, wstr);
8311
8312 // DBC does not have clean entries, remove the junk.
8313 boost::algorithm::replace_all(wstr, "\\<", "");
8314 boost::algorithm::replace_all(wstr, "\\>", "");
8315
8316 _profanityNamesStore.insert(wstr);
8317 count++;
8318 }
8319
8320 LOG_INFO("server.loading", ">> Loaded {} profanity names from DBC in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8321 LOG_INFO("server.loading", " ");
8322}
@ CONFIG_STRICT_NAMES_PROFANITY
Definition: IWorld.h:182
DBCStorage< NamesProfanityEntry > sNamesProfanityStore(NamesProfanityfmt)
Definition: DBCStructure.h:1404

References _profanityNamesStore, CONFIG_STRICT_NAMES_PROFANITY, getMSTime(), GetMSTimeDiffToNow(), LOG_INFO, LOG_WARN, sNamesProfanityStore, sWorld, and Utf8toWStr().

◆ LoadQuestAreaTriggers()

void ObjectMgr::LoadQuestAreaTriggers ( )
6213{
6214 uint32 oldMSTime = getMSTime();
6215
6216 _questAreaTriggerStore.clear(); // need for reload case
6217
6218 QueryResult result = WorldDatabase.Query("SELECT id, quest FROM areatrigger_involvedrelation");
6219
6220 if (!result)
6221 {
6222 LOG_WARN("server.loading", ">> Loaded 0 quest trigger points. DB table `areatrigger_involvedrelation` is empty.");
6223 LOG_INFO("server.loading", " ");
6224 return;
6225 }
6226
6227 uint32 count = 0;
6228
6229 do
6230 {
6231 ++count;
6232
6233 Field* fields = result->Fetch();
6234
6235 uint32 trigger_ID = fields[0].Get<uint32>();
6236 uint32 quest_ID = fields[1].Get<uint32>();
6237
6238 AreaTrigger const* atEntry = GetAreaTrigger(trigger_ID);
6239 if (!atEntry)
6240 {
6241 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", trigger_ID);
6242 continue;
6243 }
6244
6245 Quest const* quest = GetQuestTemplate(quest_ID);
6246
6247 if (!quest)
6248 {
6249 LOG_ERROR("sql.sql", "Table `areatrigger_involvedrelation` has record (id: {}) for not existing quest {}", trigger_ID, quest_ID);
6250 continue;
6251 }
6252
6254 {
6255 LOG_ERROR("sql.sql", "Table `areatrigger_involvedrelation` has record (id: {}) for not quest {}, but quest not have specialflag QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT. Trigger or quest flags must be fixed, quest modified to require objective.", trigger_ID, quest_ID);
6256
6257 // this will prevent quest completing without objective
6258 const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
6259
6260 // continue; - quest modified to required objective and trigger can be allowed.
6261 }
6262
6263 _questAreaTriggerStore[trigger_ID] = quest_ID;
6264 } while (result->NextRow());
6265
6266 LOG_INFO("server.loading", ">> Loaded {} Quest Trigger Points in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6267 LOG_INFO("server.loading", " ");
6268}
@ QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT
Definition: QuestDef.h:161
Definition: QuestDef.h:210
bool HasSpecialFlag(uint32 flag) const
Definition: QuestDef.h:224

References _questAreaTriggerStore, Field::Get(), GetAreaTrigger(), getMSTime(), GetMSTimeDiffToNow(), GetQuestTemplate(), Quest::HasSpecialFlag(), LOG_ERROR, LOG_INFO, LOG_WARN, QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT, and WorldDatabase.

◆ LoadQuestGreetings()

void ObjectMgr::LoadQuestGreetings ( )
6289{
6290 uint32 oldMSTime = getMSTime();
6291
6292 _questGreetingStore.clear(); // For reload case
6293
6294 // 0 1 2 3 4
6295 QueryResult result = WorldDatabase.Query("SELECT ID, Type, GreetEmoteType, GreetEmoteDelay, Greeting FROM quest_greeting");
6296 if (!result)
6297 {
6298 LOG_WARN("server.loading", ">> Loaded 0 quest greetings. DB table `quest_greeting` is empty.");
6299 return;
6300 }
6301
6302 do
6303 {
6304 Field* fields = result->Fetch();
6305
6306 uint32 id = fields[0].Get<uint32>();
6307 uint8 type = fields[1].Get<uint8>();
6308 switch (type)
6309 {
6310 case 0: // Creature
6311 if (!sObjectMgr->GetCreatureTemplate(id))
6312 {
6313 LOG_ERROR("sql.sql", "Table `quest_greeting`: creature template entry {} does not exist.", id);
6314 continue;
6315 }
6316 break;
6317 case 1: // GameObject
6318 if (!sObjectMgr->GetGameObjectTemplate(id))
6319 {
6320 LOG_ERROR("sql.sql", "Table `quest_greeting`: gameobject template entry {} does not exist.", id);
6321 continue;
6322 }
6323 break;
6324 default:
6325 LOG_ERROR("sql.sql", "Table `quest_greeting` has unknown type {} for id {}, skipped.", type, id);
6326 continue;
6327 }
6328
6329 std::pair<uint32, uint8> pairKey = std::make_pair(id, type);
6330 QuestGreeting& data = _questGreetingStore[pairKey];
6331
6332 data.EmoteType = fields[2].Get<uint16>();
6333 data.EmoteDelay = fields[3].Get<uint32>();
6334 AddLocaleString(fields[4].Get<std::string>(), LOCALE_enUS, data.Greeting);
6335 }
6336 while (result->NextRow());
6337
6338 LOG_INFO("server.loading", ">> Loaded {} quest_greeting in {} ms", _questGreetingStore.size(), GetMSTimeDiffToNow(oldMSTime));
6339 LOG_INFO("server.loading", " ");
6340}
Definition: ObjectMgr.h:599
uint32 EmoteDelay
Definition: ObjectMgr.h:601
std::vector< std::string > Greeting
Definition: ObjectMgr.h:602
uint16 EmoteType
Definition: ObjectMgr.h:600

References _questGreetingStore, AddLocaleString(), QuestGreeting::EmoteDelay, QuestGreeting::EmoteType, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), QuestGreeting::Greeting, LOCALE_enUS, LOG_ERROR, LOG_INFO, LOG_WARN, sObjectMgr, and WorldDatabase.

◆ LoadQuestGreetingsLocales()

void ObjectMgr::LoadQuestGreetingsLocales ( )
6343{
6344 uint32 oldMSTime = getMSTime();
6345
6346 // 0 1 2 3
6347 QueryResult result = WorldDatabase.Query("SELECT ID, Type, Locale, Greeting FROM quest_greeting_locale");
6348 if (!result)
6349 {
6350 LOG_WARN("server.loading", ">> Loaded 0 quest_greeting locales. DB table `quest_greeting_locale` is empty.");
6351 return;
6352 }
6353
6354 uint32 localeCount = 0;
6355 do
6356 {
6357 Field* fields = result->Fetch();
6358
6359 uint32 id = fields[0].Get<uint32>();
6360 uint8 type = fields[1].Get<uint8>();
6361 switch (type)
6362 {
6363 case 0: // Creature
6364 if (!sObjectMgr->GetCreatureTemplate(id))
6365 {
6366 LOG_ERROR("sql.sql", "Table `quest_greeting_locale`: creature template entry {} does not exist.", id);
6367 continue;
6368 }
6369 break;
6370 case 1: // GameObject
6371 if (!sObjectMgr->GetGameObjectTemplate(id))
6372 {
6373 LOG_ERROR("sql.sql", "Table `quest_greeting_locale`: gameobject template entry {} does not exist.", id);
6374 continue;
6375 }
6376 break;
6377 default:
6378 continue;
6379 }
6380
6381 std::pair<uint32, uint8> pairKey = std::make_pair(id, type);
6382 QuestGreeting& data = _questGreetingStore[pairKey];
6383
6384 QuestGreetingContainer::iterator qgc = _questGreetingStore.find(pairKey);
6385 if (qgc == _questGreetingStore.end())
6386 {
6387 LOG_ERROR("sql.sql", "QuestGreeting (Id: {} Type: {}) found in table `quest_greeting_locale` but does not exist in `quest_greeting`. Skipped!", id, type);
6388 continue;
6389 }
6390
6391 LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>());
6392 if (locale == LOCALE_enUS)
6393 continue;
6394
6395 AddLocaleString(fields[3].Get<std::string>(), locale, data.Greeting);
6396 localeCount++;
6397 } while (result->NextRow());
6398
6399 LOG_INFO("server.loading", ">> Loaded {} quest greeting Locale Strings in {} ms", localeCount, GetMSTimeDiffToNow(oldMSTime));
6400 LOG_INFO("server.loading", " ");
6401}

References _questGreetingStore, AddLocaleString(), Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), QuestGreeting::Greeting, LOCALE_enUS, LOG_ERROR, LOG_INFO, LOG_WARN, sObjectMgr, and WorldDatabase.

◆ LoadQuestLocales()

void ObjectMgr::LoadQuestLocales ( )
5177{
5178 uint32 oldMSTime = getMSTime();
5179
5180 _questLocaleStore.clear(); // need for reload case
5181
5182 // 0 1 2 3 4 5 6 7 8 9 10
5183 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Title, Details, Objectives, EndText, CompletedText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4 FROM quest_template_locale");
5184
5185 if (!result)
5186 return;
5187
5188 do
5189 {
5190 Field* fields = result->Fetch();
5191
5192 uint32 ID = fields[0].Get<uint32>();
5193
5194 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
5195 if (locale == LOCALE_enUS)
5196 continue;
5197
5198 QuestLocale& data = _questLocaleStore[ID];
5199 AddLocaleString(fields[2].Get<std::string>(), locale, data.Title);
5200 AddLocaleString(fields[3].Get<std::string>(), locale, data.Details);
5201 AddLocaleString(fields[4].Get<std::string>(), locale, data.Objectives);
5202 AddLocaleString(fields[5].Get<std::string>(), locale, data.AreaDescription);
5203 AddLocaleString(fields[6].Get<std::string>(), locale, data.CompletedText);
5204
5205 for (uint8 i = 0; i < 4; ++i)
5206 AddLocaleString(fields[i + 7].Get<std::string>(), locale, data.ObjectiveText[i]);
5207 } while (result->NextRow());
5208
5209 LOG_INFO("server.loading", ">> Loaded {} Quest Locale Strings in {} ms", (uint32)_questLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
5210}
Definition: QuestDef.h:183
std::vector< std::string > AreaDescription
Definition: QuestDef.h:191
std::vector< std::string > CompletedText
Definition: QuestDef.h:192
std::vector< std::string > Title
Definition: QuestDef.h:186
std::vector< std::string > Objectives
Definition: QuestDef.h:188
std::vector< std::vector< std::string > > ObjectiveText
Definition: QuestDef.h:193
std::vector< std::string > Details
Definition: QuestDef.h:187

References _questLocaleStore, AddLocaleString(), QuestLocale::AreaDescription, QuestLocale::CompletedText, QuestLocale::Details, Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_INFO, QuestLocale::Objectives, QuestLocale::ObjectiveText, QuestLocale::Title, and WorldDatabase.

◆ LoadQuestMoneyRewards()

void ObjectMgr::LoadQuestMoneyRewards ( )
10213{
10214 uint32 oldMSTime = getMSTime();
10215
10216 _questMoneyRewards.clear();
10217
10218 // 0 1 2 3 4 5 6 7 8 9 10
10219 QueryResult result = WorldDatabase.Query("SELECT `Level`, Money0, Money1, Money2, Money3, Money4, Money5, Money6, Money7, Money8, Money9 FROM `quest_money_reward` ORDER BY `Level`");
10220 if (!result)
10221 {
10222 LOG_WARN("server.loading", ">> Loaded 0 quest money rewards. DB table `quest_money_reward` is empty.");
10223 return;
10224 }
10225
10226 uint32 count = 0;
10227 do
10228 {
10229 Field* fields = result->Fetch();
10230 uint32 Level = fields[0].Get<uint32>();
10231
10232 QuestMoneyRewardArray& questMoneyReward = _questMoneyRewards[Level];
10233 questMoneyReward.fill(0);
10234
10235 for (uint8 i = 0; i < MAX_QUEST_MONEY_REWARDS; ++i)
10236 {
10237 questMoneyReward[i] = fields[1 + i].Get<uint32>();
10238 ++count;
10239 }
10240 } while (result->NextRow());
10241
10242 LOG_INFO("server.loading", ">> Loaded {} Quest Money Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10243 LOG_INFO("server.loading", " ");
10244}
std::array< uint32, MAX_QUEST_MONEY_REWARDS > QuestMoneyRewardArray
Definition: ObjectMgr.h:716

References _questMoneyRewards, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_INFO, LOG_WARN, MAX_QUEST_MONEY_REWARDS, and WorldDatabase.

◆ LoadQuestOfferRewardLocale()

void ObjectMgr::LoadQuestOfferRewardLocale ( )
6404{
6405 uint32 oldMSTime = getMSTime();
6406
6407 _questOfferRewardLocaleStore.clear(); // need for reload case
6408
6409 // 0 1 2
6410 QueryResult result = WorldDatabase.Query("SELECT Id, locale, RewardText FROM quest_offer_reward_locale");
6411 if (!result)
6412 return;
6413
6414 do
6415 {
6416 Field* fields = result->Fetch();
6417
6418 uint32 id = fields[0].Get<uint32>();
6419 std::string localeName = fields[1].Get<std::string>();
6420
6421 LocaleConstant locale = GetLocaleByName(localeName);
6422 if (locale == LOCALE_enUS)
6423 continue;
6424
6426 AddLocaleString(fields[2].Get<std::string>(), locale, data.RewardText);
6427 } while (result->NextRow());
6428
6429 LOG_INFO("server.loading", ">> Loaded {} Quest Offer Reward Locale Strings in {} ms", _questOfferRewardLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6430}
Definition: QuestDef.h:202
std::vector< std::string > RewardText
Definition: QuestDef.h:203

References _questOfferRewardLocaleStore, AddLocaleString(), Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_INFO, QuestOfferRewardLocale::RewardText, and WorldDatabase.

◆ LoadQuestPOI()

void ObjectMgr::LoadQuestPOI ( )
7883{
7884 if (!sWorld->getBoolConfig(CONFIG_QUEST_POI_ENABLED))
7885 {
7886 LOG_INFO("server.loading", ">> Loaded 0 quest POI definitions. Disabled by config.");
7887 LOG_INFO("server.loading", " ");
7888 return;
7889 }
7890
7891 uint32 oldMSTime = getMSTime();
7892
7893 _questPOIStore.clear(); // need for reload case
7894
7895 uint32 count = 0;
7896
7897 // 0 1 2 3 4 5 6 7
7898 QueryResult result = WorldDatabase.Query("SELECT QuestID, id, ObjectiveIndex, MapID, WorldMapAreaId, Floor, Priority, Flags FROM quest_poi order by QuestID");
7899
7900 if (!result)
7901 {
7902 LOG_WARN("server.loading", ">> Loaded 0 quest POI definitions. DB table `quest_poi` is empty.");
7903 LOG_INFO("server.loading", " ");
7904 return;
7905 }
7906
7907 // 0 1 2 3
7908 QueryResult points = WorldDatabase.Query("SELECT QuestID, Idx1, X, Y FROM quest_poi_points ORDER BY QuestID DESC, Idx2");
7909
7910 std::vector<std::vector<std::vector<QuestPOIPoint> > > POIs;
7911
7912 if (points)
7913 {
7914 // The first result should have the highest questId
7915 Field* fields = points->Fetch();
7916 uint32 questIdMax = fields[0].Get<uint32>();
7917 POIs.resize(questIdMax + 1);
7918
7919 do
7920 {
7921 fields = points->Fetch();
7922
7923 uint32 questId = fields[0].Get<uint32>();
7924 uint32 id = fields[1].Get<uint32>();
7925 int32 x = fields[2].Get<int32>();
7926 int32 y = fields[3].Get<int32>();
7927
7928 if (POIs[questId].size() <= id + 1)
7929 POIs[questId].resize(id + 10);
7930
7931 QuestPOIPoint point(x, y);
7932 POIs[questId][id].push_back(point);
7933 } while (points->NextRow());
7934 }
7935
7936 do
7937 {
7938 Field* fields = result->Fetch();
7939
7940 uint32 questId = fields[0].Get<uint32>();
7941 uint32 id = fields[1].Get<uint32>();
7942 int32 objIndex = fields[2].Get<int32>();
7943 uint32 mapId = fields[3].Get<uint32>();
7944 uint32 WorldMapAreaId = fields[4].Get<uint32>();
7945 uint32 FloorId = fields[5].Get<uint32>();
7946 uint32 unk3 = fields[6].Get<uint32>();
7947 uint32 unk4 = fields[7].Get<uint32>();
7948
7949 QuestPOI POI(id, objIndex, mapId, WorldMapAreaId, FloorId, unk3, unk4);
7950 if (questId < POIs.size() && id < POIs[questId].size())
7951 {
7952 POI.points = POIs[questId][id];
7953 _questPOIStore[questId].push_back(POI);
7954 }
7955 else
7956 LOG_ERROR("sql.sql", "Table quest_poi references unknown quest points for quest {} POI id {}", questId, id);
7957
7958 ++count;
7959 } while (result->NextRow());
7960
7961 LOG_INFO("server.loading", ">> Loaded {} Quest POI definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7962 LOG_INFO("server.loading", " ");
7963}
@ CONFIG_QUEST_POI_ENABLED
Definition: IWorld.h:175
Definition: ObjectMgr.h:638
Definition: ObjectMgr.h:647

References _questPOIStore, CONFIG_QUEST_POI_ENABLED, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sWorld, and WorldDatabase.

◆ LoadQuestRelationsHelper()

void ObjectMgr::LoadQuestRelationsHelper ( QuestRelations map,
std::string const &  table,
bool  starter,
bool  go 
)
private
8053{
8054 uint32 oldMSTime = getMSTime();
8055
8056 map.clear(); // need for reload case
8057
8058 uint32 count = 0;
8059
8060 QueryResult result = WorldDatabase.Query("SELECT id, quest, pool_entry FROM {} qr LEFT JOIN pool_quest pq ON qr.quest = pq.entry", table);
8061
8062 if (!result)
8063 {
8064 LOG_WARN("server.loading", ">> Loaded 0 quest relations from `{}`, table is empty.", table);
8065 LOG_INFO("server.loading", " ");
8066 return;
8067 }
8068
8069 PooledQuestRelation* poolRelationMap = go ? &sPoolMgr->mQuestGORelation : &sPoolMgr->mQuestCreatureRelation;
8070 if (starter)
8071 poolRelationMap->clear();
8072
8073 do
8074 {
8075 uint32 id = result->Fetch()[0].Get<uint32>();
8076 uint32 quest = result->Fetch()[1].Get<uint32>();
8077 uint32 poolId = result->Fetch()[2].Get<uint32>();
8078
8079 if (_questTemplates.find(quest) == _questTemplates.end())
8080 {
8081 LOG_ERROR("sql.sql", "Table `{}`: Quest {} listed for entry {} does not exist.", table, quest, id);
8082 continue;
8083 }
8084
8085 if (!poolId || !starter)
8086 map.insert(QuestRelations::value_type(id, quest));
8087 else if (starter)
8088 poolRelationMap->insert(PooledQuestRelation::value_type(quest, id));
8089
8090 ++count;
8091 } while (result->NextRow());
8092
8093 LOG_INFO("server.loading", ">> Loaded {} Quest Relations From {} in {} ms", count, table, GetMSTimeDiffToNow(oldMSTime));
8094 LOG_INFO("server.loading", " ");
8095}
#define sPoolMgr
Definition: PoolMgr.h:163
std::multimap< uint32, uint32 > PooledQuestRelation
Definition: PoolMgr.h:98

References _questTemplates, getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sPoolMgr, and WorldDatabase.

Referenced by LoadCreatureQuestEnders(), LoadCreatureQuestStarters(), LoadGameobjectQuestEnders(), and LoadGameobjectQuestStarters().

◆ LoadQuestRequestItemsLocale()

void ObjectMgr::LoadQuestRequestItemsLocale ( )
6433{
6434 uint32 oldMSTime = getMSTime();
6435
6436 _questRequestItemsLocaleStore.clear(); // need for reload case
6437
6438 // 0 1 2
6439 QueryResult result = WorldDatabase.Query("SELECT Id, locale, CompletionText FROM quest_request_items_locale");
6440 if (!result)
6441 return;
6442
6443 do
6444 {
6445 Field* fields = result->Fetch();
6446
6447 uint32 id = fields[0].Get<uint32>();
6448 std::string localeName = fields[1].Get<std::string>();
6449
6450 LocaleConstant locale = GetLocaleByName(localeName);
6451 if (locale == LOCALE_enUS)
6452 continue;
6453
6455 AddLocaleString(fields[2].Get<std::string>(), locale, data.CompletionText);
6456 } while (result->NextRow());
6457
6458 LOG_INFO("server.loading", ">> Loaded {} Quest Request Items Locale Strings in {} ms", _questRequestItemsLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6459}
Definition: QuestDef.h:197
std::vector< std::string > CompletionText
Definition: QuestDef.h:198

References _questRequestItemsLocaleStore, AddLocaleString(), QuestRequestItemsLocale::CompletionText, Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_INFO, and WorldDatabase.

◆ LoadQuests()

void ObjectMgr::LoadQuests ( )
4409{
4410 uint32 oldMSTime = getMSTime();
4411
4412 // For reload case
4413 for (QuestMap::const_iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4414 delete itr->second;
4415 _questTemplates.clear();
4416
4417 mExclusiveQuestGroups.clear();
4418
4419 QueryResult result = WorldDatabase.Query("SELECT "
4420 //0 1 2 3 4 5 6 7 8
4421 "ID, QuestType, QuestLevel, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, TimeAllowed, AllowableRaces,"
4422 // 9 10 11 12
4423 "RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, "
4424 // 13 14 15 16 17 18 19 20
4425 "RewardNextQuest, RewardXPDifficulty, RewardMoney, RewardMoneyDifficulty, RewardDisplaySpell, RewardSpell, RewardHonor, RewardKillHonor, "
4426 // 21 22 23 24 25 26
4427 "StartItem, Flags, RewardTitle, RequiredPlayerKills, RewardTalents, RewardArenaPoints, "
4428 // 27 28 29 30 31 32 33 34
4429 "RewardItem1, RewardAmount1, RewardItem2, RewardAmount2, RewardItem3, RewardAmount3, RewardItem4, RewardAmount4, "
4430 // 35 36 37 38 39 40 41 42 43 44 45 46
4431 "RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemID6, RewardChoiceItemQuantity6, "
4432 // 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
4433 "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionID5, RewardFactionValue5, RewardFactionOverride5,"
4434 // 61 63 64 65
4435 "POIContinent, POIx, POIy, POIPriority, "
4436 // 66 67 68 69 70
4437 "LogTitle, LogDescription, QuestDescription, AreaDescription, QuestCompletionLog, "
4438 // 71 72 73 74 75 76 77 78
4439 "RequiredNpcOrGo1, RequiredNpcOrGo2, RequiredNpcOrGo3, RequiredNpcOrGo4, RequiredNpcOrGoCount1, RequiredNpcOrGoCount2, RequiredNpcOrGoCount3, RequiredNpcOrGoCount4, "
4440 // 79 80 81 82 83 84 85 86
4441 "ItemDrop1, ItemDrop2, ItemDrop3, ItemDrop4, ItemDropQuantity1, ItemDropQuantity2, ItemDropQuantity3, ItemDropQuantity4, "
4442 // 87 88 89 90 91 92 93 94 95 96 97 98
4443 "RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, "
4444 // 99 100 101 102 103
4445 "Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4"
4446 " FROM quest_template");
4447 if (!result)
4448 {
4449 LOG_WARN("server.loading", ">> Loaded 0 quests definitions. DB table `quest_template` is empty.");
4450 LOG_INFO("server.loading", " ");
4451 return;
4452 }
4453
4454 // create multimap previous quest for each existed quest
4455 // some quests can have many previous maps set by NextQuestId in previous quest
4456 // for example set of race quests can lead to single not race specific quest
4457 do
4458 {
4459 Field* fields = result->Fetch();
4460
4461 Quest* newQuest = new Quest(fields);
4462 _questTemplates[newQuest->GetQuestId()] = newQuest;
4463 } while (result->NextRow());
4464
4465 // pussywizard:
4466 {
4467 uint32 max = 0;
4468 for (QuestMap::const_iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4469 if (itr->first > max)
4470 max = itr->first;
4471 if (max)
4472 {
4473 _questTemplatesFast.clear();
4474 _questTemplatesFast.resize(max + 1, nullptr);
4475 for (QuestMap::iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4476 _questTemplatesFast[itr->first] = itr->second;
4477 }
4478 }
4479
4480 for (QuestMap::iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4481 itr->second->InitializeQueryData();
4482
4483 std::map<uint32, uint32> usedMailTemplates;
4484
4485 // Load `quest_details`
4486 // 0 1 2 3 4 5 6 7 8
4487 result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4 FROM quest_details");
4488
4489 if (!result)
4490 {
4491 LOG_WARN("server.loading", ">> Loaded 0 quest details. DB table `quest_details` is empty.");
4492 }
4493 else
4494 {
4495 do
4496 {
4497 Field* fields = result->Fetch();
4498 uint32 questId = fields[0].Get<uint32>();
4499
4500 auto itr = _questTemplates.find(questId);
4501 if (itr != _questTemplates.end())
4502 itr->second->LoadQuestDetails(fields);
4503 else
4504 LOG_ERROR("sql.sql", "Table `quest_details` has data for quest {} but such quest does not exist", questId);
4505 } while (result->NextRow());
4506 }
4507
4508 // Load `quest_request_items`
4509 // 0 1 2 3
4510 result = WorldDatabase.Query("SELECT ID, EmoteOnComplete, EmoteOnIncomplete, CompletionText FROM quest_request_items");
4511
4512 if (!result)
4513 {
4514 LOG_WARN("server.loading", ">> Loaded 0 quest request items. DB table `quest_request_items` is empty.");
4515 }
4516 else
4517 {
4518 do
4519 {
4520 Field* fields = result->Fetch();
4521 uint32 questId = fields[0].Get<uint32>();
4522
4523 auto itr = _questTemplates.find(questId);
4524 if (itr != _questTemplates.end())
4525 itr->second->LoadQuestRequestItems(fields);
4526 else
4527 LOG_ERROR("sql.sql", "Table `quest_request_items` has data for quest {} but such quest does not exist", questId);
4528 } while (result->NextRow());
4529 }
4530
4531 // Load `quest_offer_reward`
4532 // 0 1 2 3 4 5 6 7 8 9
4533 result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4, RewardText FROM quest_offer_reward");
4534
4535 if (!result)
4536 {
4537 LOG_WARN("server.loading", ">> Loaded 0 quest reward emotes. DB table `quest_offer_reward` is empty.");
4538 }
4539 else
4540 {
4541 do
4542 {
4543 Field* fields = result->Fetch();
4544 uint32 questId = fields[0].Get<uint32>();
4545
4546 auto itr = _questTemplates.find(questId);
4547 if (itr != _questTemplates.end())
4548 itr->second->LoadQuestOfferReward(fields);
4549 else
4550 LOG_ERROR("sql.sql", "Table `quest_offer_reward` has data for quest {} but such quest does not exist", questId);
4551 } while (result->NextRow());
4552 }
4553
4554 // Load `quest_template_addon`
4555 // 0 1 2 3 4 5 6 7 8
4556 result = WorldDatabase.Query("SELECT ID, MaxLevel, AllowableClasses, SourceSpellID, PrevQuestID, NextQuestID, ExclusiveGroup, RewardMailTemplateID, RewardMailDelay, "
4557 //9 10 11 12 13 14 15 16 17
4558 "RequiredSkillID, RequiredSkillPoints, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, ProvidedItemCount, RewardMailSenderEntry, SpecialFlags FROM quest_template_addon LEFT JOIN quest_mail_sender ON Id=QuestId");
4559
4560 if (!result)
4561 {
4562 LOG_WARN("server.loading", ">> Loaded 0 quest template addons. DB table `quest_template_addon` is empty.");
4563 }
4564 else
4565 {
4566 do
4567 {
4568 Field* fields = result->Fetch();
4569 uint32 questId = fields[0].Get<uint32>();
4570
4571 auto itr = _questTemplates.find(questId);
4572 if (itr != _questTemplates.end())
4573 itr->second->LoadQuestTemplateAddon(fields);
4574 else
4575 LOG_ERROR("sql.sql", "Table `quest_template_addon` has data for quest {} but such quest does not exist", questId);
4576 } while (result->NextRow());
4577 }
4578
4579 // Post processing
4580 for (QuestMap::iterator iter = _questTemplates.begin(); iter != _questTemplates.end(); ++iter)
4581 {
4582 // skip post-loading checks for disabled quests
4583 if (DisableMgr::IsDisabledFor(DISABLE_TYPE_QUEST, iter->first, nullptr))
4584 continue;
4585
4586 Quest* qinfo = iter->second;
4587
4588 // additional quest integrity checks (GO, creature_template and item_template must be loaded already)
4589
4590 if (qinfo->GetQuestMethod() >= 3)
4591 LOG_ERROR("sql.sql", "Quest {} has `Method` = {}, expected values are 0, 1 or 2.", qinfo->GetQuestId(), qinfo->GetQuestMethod());
4592
4594 {
4595 LOG_ERROR("sql.sql", "Quest {} has `SpecialFlags` = {} > max allowed value. Correct `SpecialFlags` to value <= {}",
4598 }
4599
4600 if (qinfo->Flags & QUEST_FLAGS_DAILY && qinfo->Flags & QUEST_FLAGS_WEEKLY)
4601 {
4602 LOG_ERROR("sql.sql", "Weekly Quest {} is marked as daily quest in `Flags`, removed daily flag.", qinfo->GetQuestId());
4603 qinfo->Flags &= ~QUEST_FLAGS_DAILY;
4604 }
4605
4606 if (qinfo->Flags & QUEST_FLAGS_DAILY)
4607 {
4609 {
4610 LOG_ERROR("sql.sql", "Daily Quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
4612 }
4613 }
4614
4615 if (qinfo->Flags & QUEST_FLAGS_WEEKLY)
4616 {
4618 {
4619 LOG_ERROR("sql.sql", "Weekly Quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
4621 }
4622 }
4623
4625 {
4627 {
4628 LOG_ERROR("sql.sql", "Monthly quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
4630 }
4631 }
4632
4633 if (qinfo->Flags & QUEST_FLAGS_TRACKING)
4634 {
4635 // at auto-reward can be rewarded only RewardChoiceItemId[0]
4636 for (int j = 1; j < QUEST_REWARD_CHOICES_COUNT; ++j )
4637 {
4638 if (uint32 id = qinfo->RewardChoiceItemId[j])
4639 {
4640 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but item from `RewardChoiceItemId{}` can't be rewarded with quest flag QUEST_FLAGS_TRACKING.",
4641 qinfo->GetQuestId(), j + 1, id, j + 1);
4642 // no changes, quest ignore this data
4643 }
4644 }
4645 }
4646
4647 // client quest log visual (area case)
4648 if (qinfo->ZoneOrSort > 0)
4649 {
4650 if (!sAreaTableStore.LookupEntry(qinfo->ZoneOrSort))
4651 {
4652 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} (zone case) but zone with this id does not exist.",
4653 qinfo->GetQuestId(), qinfo->ZoneOrSort);
4654 // no changes, quest not dependent from this value but can have problems at client
4655 }
4656 }
4657 // client quest log visual (sort case)
4658 if (qinfo->ZoneOrSort < 0)
4659 {
4660 QuestSortEntry const* qSort = sQuestSortStore.LookupEntry(-int32(qinfo->ZoneOrSort));
4661 if (!qSort)
4662 {
4663 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} (sort case) but quest sort with this id does not exist.",
4664 qinfo->GetQuestId(), qinfo->ZoneOrSort);
4665 // no changes, quest not dependent from this value but can have problems at client (note some may be 0, we must allow this so no check)
4666 }
4667 //check for proper RequiredSkillId value (skill case)
4668 if (uint32 skill_id = SkillByQuestSort(-int32(qinfo->ZoneOrSort)))
4669 {
4670 if (qinfo->RequiredSkillId != skill_id)
4671 {
4672 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} but `RequiredSkillId` does not have a corresponding value ({}).",
4673 qinfo->GetQuestId(), qinfo->ZoneOrSort, skill_id);
4674 //override, and force proper value here?
4675 }
4676 }
4677 }
4678
4679 // RequiredClasses, can be 0/CLASSMASK_ALL_PLAYABLE to allow any class
4680 if (qinfo->RequiredClasses)
4681 {
4683 {
4684 LOG_ERROR("sql.sql", "Quest {} does not contain any playable classes in `RequiredClasses` ({}), value set to 0 (all classes).", qinfo->GetQuestId(), qinfo->RequiredClasses);
4685 qinfo->RequiredClasses = 0;
4686 }
4687 }
4688 // AllowableRaces, can be 0/RACEMASK_ALL_PLAYABLE to allow any race
4689 if (qinfo->AllowableRaces)
4690 {
4691 if (!(qinfo->AllowableRaces & RACEMASK_ALL_PLAYABLE))
4692 {
4693 LOG_ERROR("sql.sql", "Quest {} does not contain any playable races in `AllowableRaces` ({}), value set to 0 (all races).", qinfo->GetQuestId(), qinfo->AllowableRaces);
4694 qinfo->AllowableRaces = 0;
4695 }
4696 }
4697 // RequiredSkillId, can be 0
4698 if (qinfo->RequiredSkillId)
4699 {
4700 if (!sSkillLineStore.LookupEntry(qinfo->RequiredSkillId))
4701 {
4702 LOG_ERROR("sql.sql", "Quest {} has `RequiredSkillId` = {} but this skill does not exist",
4703 qinfo->GetQuestId(), qinfo->RequiredSkillId);
4704 }
4705 }
4706
4707 if (qinfo->RequiredSkillPoints)
4708 {
4709 if (qinfo->RequiredSkillPoints > sWorld->GetConfigMaxSkillValue())
4710 {
4711 LOG_ERROR("sql.sql", "Quest {} has `RequiredSkillPoints` = {} but max possible skill is {}, quest can't be done.",
4712 qinfo->GetQuestId(), qinfo->RequiredSkillPoints, sWorld->GetConfigMaxSkillValue());
4713 // no changes, quest can't be done for this requirement
4714 }
4715 }
4716 // else Skill quests can have 0 skill level, this is ok
4717
4718 if (qinfo->RequiredFactionId2 && !sFactionStore.LookupEntry(qinfo->RequiredFactionId2))
4719 {
4720 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionId2` = {} but faction template {} does not exist, quest can't be done.",
4721 qinfo->GetQuestId(), qinfo->RequiredFactionId2, qinfo->RequiredFactionId2);
4722 // no changes, quest can't be done for this requirement
4723 }
4724
4725 if (qinfo->RequiredFactionId1 && !sFactionStore.LookupEntry(qinfo->RequiredFactionId1))
4726 {
4727 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionId1` = {} but faction template {} does not exist, quest can't be done.",
4728 qinfo->GetQuestId(), qinfo->RequiredFactionId1, qinfo->RequiredFactionId1);
4729 // no changes, quest can't be done for this requirement
4730 }
4731
4732 if (qinfo->RequiredMinRepFaction && !sFactionStore.LookupEntry(qinfo->RequiredMinRepFaction))
4733 {
4734 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepFaction` = {} but faction template {} does not exist, quest can't be done.",
4735 qinfo->GetQuestId(), qinfo->RequiredMinRepFaction, qinfo->RequiredMinRepFaction);
4736 // no changes, quest can't be done for this requirement
4737 }
4738
4739 if (qinfo->RequiredMaxRepFaction && !sFactionStore.LookupEntry(qinfo->RequiredMaxRepFaction))
4740 {
4741 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepFaction` = {} but faction template {} does not exist, quest can't be done.",
4742 qinfo->GetQuestId(), qinfo->RequiredMaxRepFaction, qinfo->RequiredMaxRepFaction);
4743 // no changes, quest can't be done for this requirement
4744 }
4745
4747 {
4748 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepValue` = {} but max reputation is {}, quest can't be done.",
4750 // no changes, quest can't be done for this requirement
4751 }
4752
4753 if (qinfo->RequiredMinRepValue && qinfo->RequiredMaxRepValue && qinfo->RequiredMaxRepValue <= qinfo->RequiredMinRepValue)
4754 {
4755 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepValue` = {} and `RequiredMinRepValue` = {}, quest can't be done.",
4756 qinfo->GetQuestId(), qinfo->RequiredMaxRepValue, qinfo->RequiredMinRepValue);
4757 // no changes, quest can't be done for this requirement
4758 }
4759
4760 if (!qinfo->RequiredFactionId1 && qinfo->RequiredFactionValue1 != 0)
4761 {
4762 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionValue1` = {} but `RequiredFactionId1` is 0, value has no effect",
4763 qinfo->GetQuestId(), qinfo->RequiredFactionValue1);
4764 // warning
4765 }
4766
4767 if (!qinfo->RequiredFactionId2 && qinfo->RequiredFactionValue2 != 0)
4768 {
4769 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionValue2` = {} but `RequiredFactionId2` is 0, value has no effect",
4770 qinfo->GetQuestId(), qinfo->RequiredFactionValue2);
4771 // warning
4772 }
4773
4774 if (!qinfo->RequiredMinRepFaction && qinfo->RequiredMinRepValue != 0)
4775 {
4776 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepValue` = {} but `RequiredMinRepFaction` is 0, value has no effect",
4777 qinfo->GetQuestId(), qinfo->RequiredMinRepValue);
4778 // warning
4779 }
4780
4781 if (!qinfo->RequiredMaxRepFaction && qinfo->RequiredMaxRepValue != 0)
4782 {
4783 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepValue` = {} but `RequiredMaxRepFaction` is 0, value has no effect",
4784 qinfo->GetQuestId(), qinfo->RequiredMaxRepValue);
4785 // warning
4786 }
4787
4788 if (qinfo->RewardTitleId && !sCharTitlesStore.LookupEntry(qinfo->RewardTitleId))
4789 {
4790 LOG_ERROR("sql.sql", "Quest {} has `RewardTitleId` = {} but CharTitle Id {} does not exist, quest can't be rewarded with title.",
4791 qinfo->GetQuestId(), qinfo->GetCharTitleId(), qinfo->GetCharTitleId());
4792 qinfo->RewardTitleId = 0;
4793 // quest can't reward this title
4794 }
4795
4796 if (qinfo->StartItem)
4797 {
4798 if (!sObjectMgr->GetItemTemplate(qinfo->StartItem))
4799 {
4800 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = {} but item with entry {} does not exist, quest can't be done.",
4801 qinfo->GetQuestId(), qinfo->StartItem, qinfo->StartItem);
4802 qinfo->StartItem = 0; // quest can't be done for this requirement
4803 }
4804 else if (qinfo->StartItemCount == 0)
4805 {
4806 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = {} but `StartItemCount` = 0, set to 1 but need fix in DB.",
4807 qinfo->GetQuestId(), qinfo->StartItem);
4808 qinfo->StartItemCount = 1; // update to 1 for allow quest work for backward compatibility with DB
4809 }
4810 }
4811 else if (qinfo->StartItemCount > 0)
4812 {
4813 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = 0 but `StartItemCount` = {}, useless value.",
4814 qinfo->GetQuestId(), qinfo->StartItemCount);
4815 qinfo->StartItemCount = 0; // no quest work changes in fact
4816 }
4817
4818 if (qinfo->SourceSpellid)
4819 {
4820 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->SourceSpellid);
4821 if (!spellInfo)
4822 {
4823 LOG_ERROR("sql.sql", "Quest {} has `SourceSpellid` = {} but spell {} doesn't exist, quest can't be done.",
4824 qinfo->GetQuestId(), qinfo->SourceSpellid, qinfo->SourceSpellid);
4825 qinfo->SourceSpellid = 0; // quest can't be done for this requirement
4826 }
4827 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
4828 {
4829 LOG_ERROR("sql.sql", "Quest {} has `SourceSpellid` = {} but spell {} is broken, quest can't be done.",
4830 qinfo->GetQuestId(), qinfo->SourceSpellid, qinfo->SourceSpellid);
4831 qinfo->SourceSpellid = 0; // quest can't be done for this requirement
4832 }
4833 }
4834
4835 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
4836 {
4837 uint32 id = qinfo->RequiredItemId[j];
4838 if (id)
4839 {
4840 if (qinfo->RequiredItemCount[j] == 0)
4841 {
4842 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = {} but `RequiredItemCount{}` = 0, quest can't be done.",
4843 qinfo->GetQuestId(), j + 1, id, j + 1);
4844 // no changes, quest can't be done for this requirement
4845 }
4846
4848
4849 if (!sObjectMgr->GetItemTemplate(id))
4850 {
4851 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = {} but item with entry {} does not exist, quest can't be done.",
4852 qinfo->GetQuestId(), j + 1, id, id);
4853 qinfo->RequiredItemCount[j] = 0; // prevent incorrect work of quest
4854 }
4855 }
4856 else if (qinfo->RequiredItemCount[j] > 0)
4857 {
4858 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = 0 but `RequiredItemCount{}` = {}, quest can't be done.",
4859 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RequiredItemCount[j]);
4860 qinfo->RequiredItemCount[j] = 0; // prevent incorrect work of quest
4861 }
4862 }
4863
4864 for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
4865 {
4866 uint32 id = qinfo->ItemDrop[j];
4867 if (id)
4868 {
4869 if (!sObjectMgr->GetItemTemplate(id))
4870 {
4871 LOG_ERROR("sql.sql", "Quest {} has `ItemDrop{}` = {} but item with entry {} does not exist, quest can't be done.",
4872 qinfo->GetQuestId(), j + 1, id, id);
4873 // no changes, quest can't be done for this requirement
4874 }
4875 }
4876 else
4877 {
4878 if (qinfo->ItemDropQuantity[j] > 0)
4879 {
4880 LOG_ERROR("sql.sql", "Quest {} has `ItemDrop{}` = 0 but `ItemDropQuantity{}` = {}.",
4881 qinfo->GetQuestId(), j + 1, j + 1, qinfo->ItemDropQuantity[j]);
4882 // no changes, quest ignore this data
4883 }
4884 }
4885 }
4886
4887 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
4888 {
4889 int32 id = qinfo->RequiredNpcOrGo[j];
4890 if (id < 0 && !sObjectMgr->GetGameObjectTemplate(-id))
4891 {
4892 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but gameobject {} does not exist, quest can't be done.",
4893 qinfo->GetQuestId(), j + 1, id, uint32(-id));
4894 qinfo->RequiredNpcOrGo[j] = 0; // quest can't be done for this requirement
4895 }
4896
4897 if (id > 0 && !sObjectMgr->GetCreatureTemplate(id))
4898 {
4899 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but creature with entry {} does not exist, quest can't be done.",
4900 qinfo->GetQuestId(), j + 1, id, uint32(id));
4901 qinfo->RequiredNpcOrGo[j] = 0; // quest can't be done for this requirement
4902 }
4903
4904 if (id)
4905 {
4906 // In fact SpeakTo and Kill are quite same: either you can speak to mob:SpeakTo or you can't:Kill/Cast
4907
4909
4910 if (!qinfo->RequiredNpcOrGoCount[j])
4911 {
4912 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but `RequiredNpcOrGoCount{}` = 0, quest can't be done.",
4913 qinfo->GetQuestId(), j + 1, id, j + 1);
4914 // no changes, quest can be incorrectly done, but we already report this
4915 }
4916 }
4917 else if (qinfo->RequiredNpcOrGoCount[j] > 0)
4918 {
4919 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = 0 but `RequiredNpcOrGoCount{}` = {}.",
4920 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RequiredNpcOrGoCount[j]);
4921 // no changes, quest ignore this data
4922 }
4923 }
4924
4925 for (uint8 j = 0; j < QUEST_REWARD_CHOICES_COUNT; ++j)
4926 {
4927 uint32 id = qinfo->RewardChoiceItemId[j];
4928 if (id)
4929 {
4930 if (!sObjectMgr->GetItemTemplate(id))
4931 {
4932 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but item with entry {} does not exist, quest will not reward this item.",
4933 qinfo->GetQuestId(), j + 1, id, id);
4934 qinfo->RewardChoiceItemId[j] = 0; // no changes, quest will not reward this
4935 }
4936
4937 if (!qinfo->RewardChoiceItemCount[j])
4938 {
4939 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but `RewardChoiceItemCount{}` = 0, quest can't be done.",
4940 qinfo->GetQuestId(), j + 1, id, j + 1);
4941 // no changes, quest can't be done
4942 }
4943 }
4944 else if (qinfo->RewardChoiceItemCount[j] > 0)
4945 {
4946 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = 0 but `RewardChoiceItemCount{}` = {}.",
4947 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardChoiceItemCount[j]);
4948 // no changes, quest ignore this data
4949 }
4950 }
4951
4952 for (uint8 j = 0; j < QUEST_REWARDS_COUNT; ++j)
4953 {
4954 if (!qinfo->RewardItemId[0] && qinfo->RewardItemId[j])
4955 {
4956 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId1` but has `RewardItem{}`. Reward item will not be loaded.",
4957 qinfo->GetQuestId(), j + 1);
4958 }
4959 if (!qinfo->RewardItemId[1] && j > 1 && qinfo->RewardItemId[j])
4960 {
4961 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId2` but has `RewardItem{}`. Reward item will not be loaded.",
4962 qinfo->GetQuestId(), j + 1);
4963 }
4964 if (!qinfo->RewardItemId[2] && j > 2 && qinfo->RewardItemId[j])
4965 {
4966 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId3` but has `RewardItem{}`. Reward item will not be loaded.",
4967 qinfo->GetQuestId(), j + 1);
4968 }
4969 }
4970
4971 for (uint8 j = 0; j < QUEST_REWARDS_COUNT; ++j)
4972 {
4973 uint32 id = qinfo->RewardItemId[j];
4974 if (id)
4975 {
4976 if (!sObjectMgr->GetItemTemplate(id))
4977 {
4978 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = {} but item with entry {} does not exist, quest will not reward this item.",
4979 qinfo->GetQuestId(), j + 1, id, id);
4980 qinfo->RewardItemId[j] = 0; // no changes, quest will not reward this item
4981 }
4982
4983 if (!qinfo->RewardItemIdCount[j])
4984 {
4985 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = {} but `RewardItemIdCount{}` = 0, quest will not reward this item.",
4986 qinfo->GetQuestId(), j + 1, id, j + 1);
4987 // no changes
4988 }
4989 }
4990 else if (qinfo->RewardItemIdCount[j] > 0)
4991 {
4992 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = 0 but `RewardItemIdCount{}` = {}.",
4993 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardItemIdCount[j]);
4994 // no changes, quest ignore this data
4995 }
4996 }
4997
4998 for (uint8 j = 0; j < QUEST_REPUTATIONS_COUNT; ++j)
4999 {
5000 if (qinfo->RewardFactionId[j])
5001 {
5002 if (std::abs(qinfo->RewardFactionValueId[j]) > 9)
5003 {
5004 LOG_ERROR("sql.sql", "Quest {} has RewardFactionValueId{} = {}. That is outside the range of valid values (-9 to 9).", qinfo->GetQuestId(), j + 1, qinfo->RewardFactionValueId[j]);
5005 }
5006 if (!sFactionStore.LookupEntry(qinfo->RewardFactionId[j]))
5007 {
5008 LOG_ERROR("sql.sql", "Quest {} has `RewardFactionId{}` = {} but raw faction (faction.dbc) {} does not exist, quest will not reward reputation for this faction.", qinfo->GetQuestId(), j + 1, qinfo->RewardFactionId[j], qinfo->RewardFactionId[j]);
5009 qinfo->RewardFactionId[j] = 0; // quest will not reward this
5010 }
5011 }
5012
5013 else if (qinfo->RewardFactionValueIdOverride[j] != 0)
5014 {
5015 LOG_ERROR("sql.sql", "Quest {} has `RewardFactionId{}` = 0 but `RewardFactionValueIdOverride{}` = {}.",
5016 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardFactionValueIdOverride[j]);
5017 // no changes, quest ignore this data
5018 }
5019 }
5020
5021 if (qinfo->RewardDisplaySpell)
5022 {
5023 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardDisplaySpell);
5024
5025 if (!spellInfo)
5026 {
5027 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} does not exist, spell removed as display reward.",
5028 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5029 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5030 }
5031
5032 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5033 {
5034 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is broken, quest will not have a spell reward.",
5035 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5036 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5037 }
5038
5039 else if (GetTalentSpellCost(qinfo->RewardDisplaySpell))
5040 {
5041 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is talent, quest will not have a spell reward.",
5042 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5043 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5044 }
5045 }
5046
5047 if (qinfo->RewardSpell > 0)
5048 {
5049 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardSpell);
5050
5051 if (!spellInfo)
5052 {
5053 LOG_ERROR("sql.sql", "Quest {} has `RewardSpell` = {} but spell {} does not exist, quest will not have a spell reward.",
5054 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5055 qinfo->RewardSpell = 0; // no spell will be casted on player
5056 }
5057
5058 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5059 {
5060 LOG_ERROR("sql.sql", "Quest {} has `RewardSpell` = {} but spell {} is broken, quest will not have a spell reward.",
5061 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5062 qinfo->RewardSpell = 0; // no spell will be casted on player
5063 }
5064
5065 else if (GetTalentSpellCost(qinfo->RewardSpell))
5066 {
5067 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is talent, quest will not have a spell reward.",
5068 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5069 qinfo->RewardSpell = 0; // no spell will be casted on player
5070 }
5071 }
5072
5073 if (qinfo->RewardMailTemplateId)
5074 {
5075 if (!sMailTemplateStore.LookupEntry(qinfo->RewardMailTemplateId))
5076 {
5077 LOG_ERROR("sql.sql", "Quest {} has `RewardMailTemplateId` = {} but mail template {} does not exist, quest will not have a mail reward.",
5078 qinfo->GetQuestId(), qinfo->RewardMailTemplateId, qinfo->RewardMailTemplateId);
5079 qinfo->RewardMailTemplateId = 0; // no mail will send to player
5080 qinfo->RewardMailDelay = 0; // no mail will send to player
5081 qinfo->RewardMailSenderEntry = 0;
5082 }
5083 else if (usedMailTemplates.find(qinfo->RewardMailTemplateId) != usedMailTemplates.end())
5084 {
5085 std::map<uint32, uint32>::const_iterator used_mt_itr = usedMailTemplates.find(qinfo->RewardMailTemplateId);
5086 LOG_ERROR("sql.sql", "Quest {} has `RewardMailTemplateId` = {} but mail template {} already used for quest {}, quest will not have a mail reward.",
5087 qinfo->GetQuestId(), qinfo->RewardMailTemplateId, qinfo->RewardMailTemplateId, used_mt_itr->second);
5088 qinfo->RewardMailTemplateId = 0; // no mail will send to player
5089 qinfo->RewardMailDelay = 0; // no mail will send to player
5090 qinfo->RewardMailSenderEntry = 0;
5091 }
5092 else
5093 usedMailTemplates[qinfo->RewardMailTemplateId] = qinfo->GetQuestId();
5094 }
5095
5096 if (qinfo->RewardNextQuest)
5097 {
5098 QuestMap::iterator qNextItr = _questTemplates.find(qinfo->RewardNextQuest);
5099 if (qNextItr == _questTemplates.end())
5100 {
5101 LOG_ERROR("sql.sql", "Quest {} has `RewardNextQuest` = {} but quest {} does not exist, quest chain will not work.",
5102 qinfo->GetQuestId(), qinfo->RewardNextQuest, qinfo->RewardNextQuest);
5103 qinfo->RewardNextQuest = 0;
5104 }
5105 else
5106 qNextItr->second->prevChainQuests.push_back(qinfo->GetQuestId());
5107 }
5108
5109 // fill additional data stores
5110 if (qinfo->PrevQuestId)
5111 {
5112 if (_questTemplates.find(std::abs(qinfo->GetPrevQuestId())) == _questTemplates.end())
5113 {
5114 LOG_ERROR("sql.sql", "Quest {} has PrevQuestId {}, but no such quest", qinfo->GetQuestId(), qinfo->GetPrevQuestId());
5115 }
5116 else
5117 {
5118 qinfo->prevQuests.push_back(qinfo->PrevQuestId);
5119 }
5120 }
5121
5122 if (qinfo->NextQuestId)
5123 {
5124 QuestMap::iterator qNextItr = _questTemplates.find(qinfo->GetNextQuestId());
5125 if (qNextItr == _questTemplates.end())
5126 {
5127 LOG_ERROR("sql.sql", "Quest {} has NextQuestId {}, but no such quest", qinfo->GetQuestId(), qinfo->GetNextQuestId());
5128 }
5129 else
5130 qNextItr->second->prevQuests.push_back(static_cast<int32>(qinfo->GetQuestId()));
5131 }
5132
5133 if (qinfo->ExclusiveGroup)
5134 mExclusiveQuestGroups.insert(std::pair<int32, uint32>(qinfo->ExclusiveGroup, qinfo->GetQuestId()));
5135 if (qinfo->TimeAllowed)
5137 if (qinfo->RequiredPlayerKills)
5139 }
5140
5141 // check QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT for spell with SPELL_EFFECT_QUEST_COMPLETE
5142 for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
5143 {
5144 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i);
5145 if (!spellInfo)
5146 continue;
5147
5148 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
5149 {
5150 if (spellInfo->Effects[j].Effect != SPELL_EFFECT_QUEST_COMPLETE)
5151 continue;
5152
5153 uint32 quest_id = spellInfo->Effects[j].MiscValue;
5154
5155 Quest const* quest = GetQuestTemplate(quest_id);
5156
5157 // some quest referenced in spells not exist (outdated spells)
5158 if (!quest)
5159 continue;
5160
5162 {
5163 LOG_ERROR("sql.sql", "Spell (id: {}) have SPELL_EFFECT_QUEST_COMPLETE for quest {}, but quest not have specialflag QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT. Quest flags must be fixed, quest modified to enable objective.", spellInfo->Id, quest_id);
5164
5165 // this will prevent quest completing without objective
5166 // xinef: remove this, leave error but do not break the quest
5167 // const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
5168 }
5169 }
5170 }
5171
5172 LOG_INFO("server.loading", ">> Loaded {} Quests Definitions in {} ms", (unsigned long)_questTemplates.size(), GetMSTimeDiffToNow(oldMSTime));
5173 LOG_INFO("server.loading", " ");
5174}
@ SPELL_EFFECT_QUEST_COMPLETE
Definition: SharedDefines.h:794
uint32 SkillByQuestSort(int32 QuestSort)
Definition: SharedDefines.h:3040
#define QUEST_REWARDS_COUNT
Definition: QuestDef.h:39
#define QUEST_ITEM_OBJECTIVES_COUNT
Definition: QuestDef.h:36
#define QUEST_OBJECTIVES_COUNT
Definition: QuestDef.h:35
@ QUEST_FLAGS_TRACKING
Definition: QuestDef.h:142
@ QUEST_FLAGS_DAILY
Definition: QuestDef.h:144
@ QUEST_FLAGS_WEEKLY
Definition: QuestDef.h:147
#define QUEST_REPUTATIONS_COUNT
Definition: QuestDef.h:41
#define QUEST_SOURCE_ITEM_IDS_COUNT
Definition: QuestDef.h:37
#define QUEST_REWARD_CHOICES_COUNT
Definition: QuestDef.h:38
@ QUEST_SPECIAL_FLAGS_CAST
Definition: QuestDef.h:165
@ QUEST_SPECIAL_FLAGS_TIMED
Definition: QuestDef.h:178
@ QUEST_SPECIAL_FLAGS_DELIVER
Definition: QuestDef.h:175
@ QUEST_SPECIAL_FLAGS_REPEATABLE
Definition: QuestDef.h:160
@ QUEST_SPECIAL_FLAGS_KILL
Definition: QuestDef.h:177
@ QUEST_SPECIAL_FLAGS_DB_ALLOWED
Definition: QuestDef.h:171
@ QUEST_SPECIAL_FLAGS_SPEAKTO
Definition: QuestDef.h:176
@ QUEST_SPECIAL_FLAGS_MONTHLY
Definition: QuestDef.h:164
@ QUEST_SPECIAL_FLAGS_PLAYER_KILL
Definition: QuestDef.h:179
DBCStorage< QuestSortEntry > sQuestSortStore(QuestSortEntryfmt)
@ DISABLE_TYPE_QUEST
Definition: DisableMgr.h:28
ExclusiveQuestGroups mExclusiveQuestGroups
Definition: ObjectMgr.h:1135
uint32 ItemDropQuantity[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition: QuestDef.h:303
uint32 RewardMailDelay
Definition: QuestDef.h:394
uint32 RewardMailSenderEntry
Definition: QuestDef.h:402
int32 RequiredNpcOrGo[QUEST_OBJECTIVES_COUNT]
Definition: QuestDef.h:304
uint32 RequiredMaxRepFaction
Definition: QuestDef.h:399
uint32 SourceSpellid
Definition: QuestDef.h:389
uint32 RequiredMinRepFaction
Definition: QuestDef.h:397
int32 RequiredFactionValue2
Definition: QuestDef.h:355
int32 RequiredFactionValue1
Definition: QuestDef.h:353
int32 ZoneOrSort
Definition: QuestDef.h:347
uint32 RequiredNpcOrGoCount[QUEST_OBJECTIVES_COUNT]
Definition: QuestDef.h:305
uint32 StartItemCount
Definition: QuestDef.h:401
void SetSpecialFlag(uint32 flag)
Definition: QuestDef.h:225
uint32 GetCharTitleId() const
Definition: QuestDef.h:253
uint32 RewardTitleId
Definition: QuestDef.h:359
uint32 RewardItemIdCount[QUEST_REWARDS_COUNT]
Definition: QuestDef.h:309
uint32 RewardChoiceItemId[QUEST_REWARD_CHOICES_COUNT]
Definition: QuestDef.h:306
uint32 NextQuestId
Definition: QuestDef.h:391
uint32 RewardMailTemplateId
Definition: QuestDef.h:393
uint32 ItemDrop[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition: QuestDef.h:302
int32 RewardFactionValueIdOverride[QUEST_REPUTATIONS_COUNT]
Definition: QuestDef.h:312
uint32 RequiredSkillPoints
Definition: QuestDef.h:396
int32 RewardSpell
Definition: QuestDef.h:378
uint32 RewardChoiceItemCount[QUEST_REWARD_CHOICES_COUNT]
Definition: QuestDef.h:307
uint32 AllowableRaces
Definition: QuestDef.h:351
uint32 RewardNextQuest
Definition: QuestDef.h:363
uint32 RequiredPlayerKills
Definition: QuestDef.h:360
int32 GetPrevQuestId() const
Definition: QuestDef.h:249
uint32 StartItem
Definition: QuestDef.h:365
uint32 GetQuestId() const
Definition: QuestDef.h:228
int32 RequiredMaxRepValue
Definition: QuestDef.h:400
uint32 RequiredClasses
Definition: QuestDef.h:388
uint32 Flags
Definition: QuestDef.h:358
uint32 RequiredItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition: QuestDef.h:301
uint32 TimeAllowed
Definition: QuestDef.h:357
uint32 RequiredFactionId1
Definition: QuestDef.h:352
uint32 RequiredFactionId2
Definition: QuestDef.h:354
PrevQuests prevQuests
Definition: QuestDef.h:324
uint32 RewardDisplaySpell
Definition: QuestDef.h:377
uint32 RequiredItemId[QUEST_ITEM_OBJECTIVES_COUNT]
Definition: QuestDef.h:300
int32 PrevQuestId
Definition: QuestDef.h:390
uint32 GetNextQuestId() const
Definition: QuestDef.h:250
uint32 RewardFactionId[QUEST_REPUTATIONS_COUNT]
Definition: QuestDef.h:310
int32 ExclusiveGroup
Definition: QuestDef.h:392
uint32 RequiredSkillId
Definition: QuestDef.h:395
int32 RewardFactionValueId[QUEST_REPUTATIONS_COUNT]
Definition: QuestDef.h:311
uint32 RewardItemId[QUEST_REWARDS_COUNT]
Definition: QuestDef.h:308
uint32 GetQuestMethod() const
Definition: QuestDef.h:229
int32 RequiredMinRepValue
Definition: QuestDef.h:398
uint32 SpecialFlags
Definition: QuestDef.h:403
static const int32 Reputation_Cap
Definition: ReputationMgr.h:67
Definition: DBCStructure.h:1444

References _questTemplates, _questTemplatesFast, Quest::AllowableRaces, CLASSMASK_ALL_PLAYABLE, SpellMgr::ComputeIsSpellValid(), DISABLE_TYPE_QUEST, SpellInfo::Effects, Quest::ExclusiveGroup, Quest::Flags, Field::Get(), Quest::GetCharTitleId(), GetGameObjectTemplate(), getMSTime(), GetMSTimeDiffToNow(), Quest::GetNextQuestId(), Quest::GetPrevQuestId(), Quest::GetQuestId(), Quest::GetQuestMethod(), GetQuestTemplate(), GetTalentSpellCost(), Quest::HasSpecialFlag(), SpellInfo::Id, DisableMgr::IsDisabledFor(), Quest::ItemDrop, Quest::ItemDropQuantity, LOG_ERROR, LOG_INFO, LOG_WARN, MAX_SPELL_EFFECTS, mExclusiveQuestGroups, Quest::NextQuestId, Quest::PrevQuestId, Quest::prevQuests, QUEST_FLAGS_DAILY, QUEST_FLAGS_TRACKING, QUEST_FLAGS_WEEKLY, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_REPUTATIONS_COUNT, QUEST_REWARD_CHOICES_COUNT, QUEST_REWARDS_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DB_ALLOWED, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_MONTHLY, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_SPECIAL_FLAGS_REPEATABLE, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_SPECIAL_FLAGS_TIMED, RACEMASK_ALL_PLAYABLE, ReputationMgr::Reputation_Cap, Quest::RequiredClasses, Quest::RequiredFactionId1, Quest::RequiredFactionId2, Quest::RequiredFactionValue1, Quest::RequiredFactionValue2, Quest::RequiredItemCount, Quest::RequiredItemId, Quest::RequiredMaxRepFaction, Quest::RequiredMaxRepValue, Quest::RequiredMinRepFaction, Quest::RequiredMinRepValue, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, Quest::RequiredPlayerKills, Quest::RequiredSkillId, Quest::RequiredSkillPoints, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, Quest::RewardDisplaySpell, Quest::RewardFactionId, Quest::RewardFactionValueId, Quest::RewardFactionValueIdOverride, Quest::RewardItemId, Quest::RewardItemIdCount, Quest::RewardMailDelay, Quest::RewardMailSenderEntry, Quest::RewardMailTemplateId, Quest::RewardNextQuest, Quest::RewardSpell, Quest::RewardTitleId, sAreaTableStore, sCharTitlesStore, Quest::SetSpecialFlag(), sFactionStore, SkillByQuestSort(), sMailTemplateStore, sObjectMgr, Quest::SourceSpellid, Quest::SpecialFlags, SPELL_EFFECT_QUEST_COMPLETE, sQuestSortStore, sSkillLineStore, sSpellMgr, Quest::StartItem, Quest::StartItemCount, sWorld, Quest::TimeAllowed, WorldDatabase, and Quest::ZoneOrSort.

◆ LoadQuestStartersAndEnders()

void ObjectMgr::LoadQuestStartersAndEnders ( )
inline
948 {
949 LOG_INFO("server.loading", "Loading GO Start Quest Data...");
951 LOG_INFO("server.loading", "Loading GO End Quest Data...");
953 LOG_INFO("server.loading", "Loading Creature Start Quest Data...");
955 LOG_INFO("server.loading", "Loading Creature End Quest Data...");
957 }
void LoadCreatureQuestEnders()
Definition: ObjectMgr.cpp:8139
void LoadGameobjectQuestEnders()
Definition: ObjectMgr.cpp:8111
void LoadGameobjectQuestStarters()
Definition: ObjectMgr.cpp:8097
void LoadCreatureQuestStarters()
Definition: ObjectMgr.cpp:8125

References LoadCreatureQuestEnders(), LoadCreatureQuestStarters(), LoadGameobjectQuestEnders(), LoadGameobjectQuestStarters(), and LOG_INFO.

◆ LoadReferenceVendor()

int ObjectMgr::LoadReferenceVendor ( int32  vendor,
int32  item_id,
std::set< uint32 > *  skip_vendors 
)
9219{
9220 // find all items from the reference vendor
9222 stmt->SetData(0, uint32(item));
9223 PreparedQueryResult result = WorldDatabase.Query(stmt);
9224
9225 if (!result)
9226 return 0;
9227
9228 uint32 count = 0;
9229 do
9230 {
9231 Field* fields = result->Fetch();
9232
9233 int32 item_id = fields[0].Get<int32>();
9234
9235 // if item is a negative, its a reference
9236 if (item_id < 0)
9237 count += LoadReferenceVendor(vendor, -item_id, skip_vendors);
9238 else
9239 {
9240 int32 maxcount = fields[1].Get<uint8>();
9241 uint32 incrtime = fields[2].Get<uint32>();
9242 uint32 ExtendedCost = fields[3].Get<uint32>();
9243
9244 if (!IsVendorItemValid(vendor, item_id, maxcount, incrtime, ExtendedCost, nullptr, skip_vendors))
9245 continue;
9246
9247 VendorItemData& vList = _cacheVendorItemStore[vendor];
9248
9249 vList.AddItem(item_id, maxcount, incrtime, ExtendedCost);
9250 ++count;
9251 }
9252 } while (result->NextRow());
9253
9254 return count;
9255}
@ WORLD_SEL_NPC_VENDOR_REF
Definition: WorldDatabase.h:45
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition: DatabaseEnvFwd.h:45
bool IsVendorItemValid(uint32 vendor_entry, uint32 item, int32 maxcount, uint32 ptime, uint32 ExtendedCost, Player *player=nullptr, std::set< uint32 > *skip_vendors=nullptr, uint32 ORnpcflag=0) const
Definition: ObjectMgr.cpp:9458
int LoadReferenceVendor(int32 vendor, int32 item_id, std::set< uint32 > *skip_vendors)
Definition: ObjectMgr.cpp:9218

References _cacheVendorItemStore, VendorItemData::AddItem(), Field::Get(), IsVendorItemValid(), LoadReferenceVendor(), PreparedStatementBase::SetData(), WORLD_SEL_NPC_VENDOR_REF, and WorldDatabase.

Referenced by LoadReferenceVendor(), and LoadVendors().

◆ LoadReputationOnKill()

void ObjectMgr::LoadReputationOnKill ( )
7644{
7645 uint32 oldMSTime = getMSTime();
7646
7647 // For reload case
7648 _repOnKillStore.clear();
7649
7650 uint32 count = 0;
7651
7652 // 0 1 2
7653 QueryResult result = WorldDatabase.Query("SELECT creature_id, RewOnKillRepFaction1, RewOnKillRepFaction2, "
7654 // 3 4 5 6 7 8 9
7655 "IsTeamAward1, MaxStanding1, RewOnKillRepValue1, IsTeamAward2, MaxStanding2, RewOnKillRepValue2, TeamDependent "
7656 "FROM creature_onkill_reputation");
7657
7658 if (!result)
7659 {
7660 LOG_WARN("server.loading", ">> Loaded 0 creature award reputation definitions. DB table `creature_onkill_reputation` is empty.");
7661 LOG_INFO("server.loading", " ");
7662 return;
7663 }
7664
7665 do
7666 {
7667 Field* fields = result->Fetch();
7668
7669 uint32 creature_id = fields[0].Get<uint32>();
7670
7671 ReputationOnKillEntry repOnKill;
7672 repOnKill.RepFaction1 = fields[1].Get<int16>();
7673 repOnKill.RepFaction2 = fields[2].Get<int16>();
7674 repOnKill.IsTeamAward1 = fields[3].Get<bool>();
7675 repOnKill.ReputationMaxCap1 = fields[4].Get<uint8>();
7676 repOnKill.RepValue1 = fields[5].Get<float>();
7677 repOnKill.IsTeamAward2 = fields[6].Get<bool>();
7678 repOnKill.ReputationMaxCap2 = fields[7].Get<uint8>();
7679 repOnKill.RepValue2 = fields[8].Get<float>();
7680 repOnKill.TeamDependent = fields[9].Get<uint8>();
7681
7682 if (!GetCreatureTemplate(creature_id))
7683 {
7684 LOG_ERROR("sql.sql", "Table `creature_onkill_reputation` have data for not existed creature entry ({}), skipped", creature_id);
7685 continue;
7686 }
7687
7688 if (repOnKill.RepFaction1)
7689 {
7690 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(repOnKill.RepFaction1);
7691 if (!factionEntry1)
7692 {
7693 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `creature_onkill_reputation`", repOnKill.RepFaction1);
7694 continue;
7695 }
7696 }
7697
7698 if (repOnKill.RepFaction2)
7699 {
7700 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(repOnKill.RepFaction2);
7701 if (!factionEntry2)
7702 {
7703 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `creature_onkill_reputation`", repOnKill.RepFaction2);
7704 continue;
7705 }
7706 }
7707
7708 _repOnKillStore[creature_id] = repOnKill;
7709
7710 ++count;
7711 } while (result->NextRow());
7712
7713 LOG_INFO("server.loading", ">> Loaded {} Creature Award Reputation Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7714 LOG_INFO("server.loading", " ");
7715}
Definition: ObjectMgr.h:568
uint32 RepFaction1
Definition: ObjectMgr.h:569

References _repOnKillStore, Field::Get(), GetCreatureTemplate(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, ReputationOnKillEntry::RepFaction1, sFactionStore, and WorldDatabase.

◆ LoadReputationRewardRate()

void ObjectMgr::LoadReputationRewardRate ( )
7556{
7557 uint32 oldMSTime = getMSTime();
7558
7559 _repRewardRateStore.clear(); // for reload case
7560
7561 uint32 count = 0; // 0 1 2 3 4 5 6 7
7562 QueryResult result = WorldDatabase.Query("SELECT faction, quest_rate, quest_daily_rate, quest_weekly_rate, quest_monthly_rate, quest_repeatable_rate, creature_rate, spell_rate FROM reputation_reward_rate");
7563 if (!result)
7564 {
7565 LOG_INFO("server.loading", ">> Loaded `reputation_reward_rate`, table is empty!");
7566 return;
7567 }
7568
7569 do
7570 {
7571 Field* fields = result->Fetch();
7572
7573 uint32 factionId = fields[0].Get<uint32>();
7574
7575 RepRewardRate repRate;
7576
7577 repRate.questRate = fields[1].Get<float>();
7578 repRate.questDailyRate = fields[2].Get<float>();
7579 repRate.questWeeklyRate = fields[3].Get<float>();
7580 repRate.questMonthlyRate = fields[4].Get<float>();
7581 repRate.questRepeatableRate = fields[5].Get<float>();
7582 repRate.creatureRate = fields[6].Get<float>();
7583 repRate.spellRate = fields[7].Get<float>();
7584
7585 FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
7586 if (!factionEntry)
7587 {
7588 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_reward_rate`", factionId);
7589 continue;
7590 }
7591
7592 if (repRate.questRate < 0.0f)
7593 {
7594 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_rate with invalid rate {}, skipping data for faction {}", repRate.questRate, factionId);
7595 continue;
7596 }
7597
7598 if (repRate.questDailyRate < 0.0f)
7599 {
7600 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_daily_rate with invalid rate {}, skipping data for faction {}", repRate.questDailyRate, factionId);
7601 continue;
7602 }
7603
7604 if (repRate.questWeeklyRate < 0.0f)
7605 {
7606 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_weekly_rate with invalid rate {}, skipping data for faction {}", repRate.questWeeklyRate, factionId);
7607 continue;
7608 }
7609
7610 if (repRate.questMonthlyRate < 0.0f)
7611 {
7612 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_monthly_rate with invalid rate {}, skipping data for faction {}", repRate.questMonthlyRate, factionId);
7613 continue;
7614 }
7615
7616 if (repRate.questRepeatableRate < 0.0f)
7617 {
7618 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_repeatable_rate with invalid rate {}, skipping data for faction {}", repRate.questRepeatableRate, factionId);
7619 continue;
7620 }
7621
7622 if (repRate.creatureRate < 0.0f)
7623 {
7624 LOG_ERROR("sql.sql", "Table reputation_reward_rate has creature_rate with invalid rate {}, skipping data for faction {}", repRate.creatureRate, factionId);
7625 continue;
7626 }
7627
7628 if (repRate.spellRate < 0.0f)
7629 {
7630 LOG_ERROR("sql.sql", "Table reputation_reward_rate has spell_rate with invalid rate {}, skipping data for faction {}", repRate.spellRate, factionId);
7631 continue;
7632 }
7633
7634 _repRewardRateStore[factionId] = repRate;
7635
7636 ++count;
7637 } while (result->NextRow());
7638
7639 LOG_INFO("server.loading", ">> Loaded {} Reputation Reward Rate in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7640 LOG_INFO("server.loading", " ");
7641}
Definition: ObjectMgr.h:557
float questRate
Definition: ObjectMgr.h:558

References _repRewardRateStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, RepRewardRate::questRate, sFactionStore, and WorldDatabase.

◆ LoadReputationSpilloverTemplate()

void ObjectMgr::LoadReputationSpilloverTemplate ( )
7718{
7719 uint32 oldMSTime = getMSTime();
7720
7721 _repSpilloverTemplateStore.clear(); // for reload case
7722
7723 uint32 count = 0; // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
7724 QueryResult result = WorldDatabase.Query("SELECT faction, faction1, rate_1, rank_1, faction2, rate_2, rank_2, faction3, rate_3, rank_3, faction4, rate_4, rank_4, faction5, rate_5, rank_5, faction6, rate_6, rank_6 FROM reputation_spillover_template");
7725
7726 if (!result)
7727 {
7728 LOG_INFO("server.loading", ">> Loaded `reputation_spillover_template`, table is empty.");
7729 LOG_INFO("server.loading", " ");
7730 return;
7731 }
7732
7733 do
7734 {
7735 Field* fields = result->Fetch();
7736
7737 uint32 factionId = fields[0].Get<uint16>();
7738
7739 RepSpilloverTemplate repTemplate;
7740
7741 repTemplate.faction[0] = fields[1].Get<uint16>();
7742 repTemplate.faction_rate[0] = fields[2].Get<float>();
7743 repTemplate.faction_rank[0] = fields[3].Get<uint8>();
7744 repTemplate.faction[1] = fields[4].Get<uint16>();
7745 repTemplate.faction_rate[1] = fields[5].Get<float>();
7746 repTemplate.faction_rank[1] = fields[6].Get<uint8>();
7747 repTemplate.faction[2] = fields[7].Get<uint16>();
7748 repTemplate.faction_rate[2] = fields[8].Get<float>();
7749 repTemplate.faction_rank[2] = fields[9].Get<uint8>();
7750 repTemplate.faction[3] = fields[10].Get<uint16>();
7751 repTemplate.faction_rate[3] = fields[11].Get<float>();
7752 repTemplate.faction_rank[3] = fields[12].Get<uint8>();
7753 repTemplate.faction[4] = fields[13].Get<uint16>();
7754 repTemplate.faction_rate[4] = fields[14].Get<float>();
7755 repTemplate.faction_rank[4] = fields[15].Get<uint8>();
7756 repTemplate.faction[5] = fields[16].Get<uint16>();
7757 repTemplate.faction_rate[5] = fields[17].Get<float>();
7758 repTemplate.faction_rank[5] = fields[18].Get<uint8>();
7759
7760 FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
7761
7762 if (!factionEntry)
7763 {
7764 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", factionId);
7765 continue;
7766 }
7767
7768 if (factionEntry->team == 0)
7769 {
7770 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} in `reputation_spillover_template` does not belong to any team, skipping", factionId);
7771 continue;
7772 }
7773
7774 for (uint32 i = 0; i < MAX_SPILLOVER_FACTIONS; ++i)
7775 {
7776 if (repTemplate.faction[i])
7777 {
7778 FactionEntry const* factionSpillover = sFactionStore.LookupEntry(repTemplate.faction[i]);
7779
7780 if (!factionSpillover)
7781 {
7782 LOG_ERROR("sql.sql", "Spillover faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template` for faction {}, skipping", repTemplate.faction[i], factionId);
7783 continue;
7784 }
7785
7786 if (factionSpillover->reputationListID < 0)
7787 {
7788 LOG_ERROR("sql.sql", "Spillover faction (faction.dbc) {} for faction {} in `reputation_spillover_template` can not be listed for client, and then useless, skipping", repTemplate.faction[i], factionId);
7789 continue;
7790 }
7791
7792 if (repTemplate.faction_rank[i] >= MAX_REPUTATION_RANK)
7793 {
7794 LOG_ERROR("sql.sql", "Rank {} used in `reputation_spillover_template` for spillover faction {} is not valid, skipping", repTemplate.faction_rank[i], repTemplate.faction[i]);
7795 continue;
7796 }
7797 }
7798 }
7799
7800 FactionEntry const* factionEntry0 = sFactionStore.LookupEntry(repTemplate.faction[0]);
7801 if (repTemplate.faction[0] && !factionEntry0)
7802 {
7803 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[0]);
7804 continue;
7805 }
7806 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(repTemplate.faction[1]);
7807 if (repTemplate.faction[1] && !factionEntry1)
7808 {
7809 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[1]);
7810 continue;
7811 }
7812 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(repTemplate.faction[2]);
7813 if (repTemplate.faction[2] && !factionEntry2)
7814 {
7815 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[2]);
7816 continue;
7817 }
7818 FactionEntry const* factionEntry3 = sFactionStore.LookupEntry(repTemplate.faction[3]);
7819 if (repTemplate.faction[3] && !factionEntry3)
7820 {
7821 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[3]);
7822 continue;
7823 }
7824
7825 _repSpilloverTemplateStore[factionId] = repTemplate;
7826
7827 ++count;
7828 } while (result->NextRow());
7829
7830 LOG_INFO("server.loading", ">> Loaded {} Reputation Spillover Template in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7831 LOG_INFO("server.loading", " ");
7832}
#define MAX_SPILLOVER_FACTIONS
Definition: SharedDefines.h:247
Definition: ObjectMgr.h:581
uint32 faction[MAX_SPILLOVER_FACTIONS]
Definition: ObjectMgr.h:582
int32 reputationListID
Definition: DBCStructure.h:908

References _repSpilloverTemplateStore, RepSpilloverTemplate::faction, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, MAX_REPUTATION_RANK, MAX_SPILLOVER_FACTIONS, FactionEntry::reputationListID, sFactionStore, and WorldDatabase.

◆ LoadReservedPlayerNamesDB()

void ObjectMgr::LoadReservedPlayerNamesDB ( )
8154{
8155 uint32 oldMSTime = getMSTime();
8156
8157 _reservedNamesStore.clear(); // need for reload case
8158
8159 QueryResult result = CharacterDatabase.Query("SELECT name FROM reserved_name");
8160
8161 if (!result)
8162 {
8163 LOG_WARN("server.loading", ">> Loaded 0 reserved names. DB table `reserved_name` is empty!");
8164 return;
8165 }
8166
8167 uint32 count = 0;
8168
8169 Field* fields;
8170 do
8171 {
8172 fields = result->Fetch();
8173 std::string name = fields[0].Get<std::string>();
8174
8175 std::wstring wstr;
8176 if (!Utf8toWStr (name, wstr))
8177 {
8178 LOG_ERROR("sql.sql", "Table `reserved_name` have invalid name: {}", name);
8179 continue;
8180 }
8181
8182 wstrToLower(wstr);
8183
8184 _reservedNamesStore.insert(wstr);
8185 ++count;
8186 } while (result->NextRow());
8187
8188 LOG_INFO("server.loading", ">> Loaded {} reserved names from DB in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8189}

References _reservedNamesStore, CharacterDatabase, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, Utf8toWStr(), and wstrToLower().

◆ LoadReservedPlayerNamesDBC()

void ObjectMgr::LoadReservedPlayerNamesDBC ( )
8192{
8193 if (!sWorld->getBoolConfig(CONFIG_STRICT_NAMES_RESERVED))
8194 {
8195 LOG_WARN("server.loading", ">> Loaded 0 reserved names from DBC. Config option disabled.");
8196 return;
8197 }
8198
8199 uint32 oldMSTime = getMSTime();
8200
8201 uint32 count = 0;
8202
8203 for (NamesReservedEntry const* reservedStore : sNamesReservedStore)
8204 {
8205 std::wstring wstr;
8206
8207 Utf8toWStr(reservedStore->Pattern, wstr);
8208
8209 // DBC does not have clean entries, remove the junk.
8210 boost::algorithm::replace_all(wstr, "\\<", "");
8211 boost::algorithm::replace_all(wstr, "\\>", "");
8212
8213 _reservedNamesStore.insert(wstr);
8214 count++;
8215 }
8216
8217 LOG_INFO("server.loading", ">> Loaded {} reserved names from DBC in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8218 LOG_INFO("server.loading", " ");
8219}
@ CONFIG_STRICT_NAMES_RESERVED
Definition: IWorld.h:181
DBCStorage< NamesReservedEntry > sNamesReservedStore(NamesReservedfmt)
Definition: DBCStructure.h:1397

References _reservedNamesStore, CONFIG_STRICT_NAMES_RESERVED, getMSTime(), GetMSTimeDiffToNow(), LOG_INFO, LOG_WARN, sNamesReservedStore, sWorld, and Utf8toWStr().

◆ LoadScriptNames()

void ObjectMgr::LoadScriptNames ( )
9539{
9540 uint32 oldMSTime = getMSTime();
9541
9542 // We insert an empty placeholder here so we can use the
9543 // script id 0 as dummy for "no script found".
9544 _scriptNamesStore.emplace_back("");
9545
9546 QueryResult result = WorldDatabase.Query(
9547 "SELECT DISTINCT(ScriptName) FROM achievement_criteria_data WHERE ScriptName <> '' AND type = 11 "
9548 "UNION "
9549 "SELECT DISTINCT(ScriptName) FROM battleground_template WHERE ScriptName <> '' "
9550 "UNION "
9551 "SELECT DISTINCT(ScriptName) FROM creature WHERE ScriptName <> '' "
9552 "UNION "
9553 "SELECT DISTINCT(ScriptName) FROM creature_template WHERE ScriptName <> '' "
9554 "UNION "
9555 "SELECT DISTINCT(ScriptName) FROM gameobject WHERE ScriptName <> '' "
9556 "UNION "
9557 "SELECT DISTINCT(ScriptName) FROM gameobject_template WHERE ScriptName <> '' "
9558 "UNION "
9559 "SELECT DISTINCT(ScriptName) FROM item_template WHERE ScriptName <> '' "
9560 "UNION "
9561 "SELECT DISTINCT(ScriptName) FROM areatrigger_scripts WHERE ScriptName <> '' "
9562 "UNION "
9563 "SELECT DISTINCT(ScriptName) FROM spell_script_names WHERE ScriptName <> '' "
9564 "UNION "
9565 "SELECT DISTINCT(ScriptName) FROM transports WHERE ScriptName <> '' "
9566 "UNION "
9567 "SELECT DISTINCT(ScriptName) FROM game_weather WHERE ScriptName <> '' "
9568 "UNION "
9569 "SELECT DISTINCT(ScriptName) FROM conditions WHERE ScriptName <> '' "
9570 "UNION "
9571 "SELECT DISTINCT(ScriptName) FROM outdoorpvp_template WHERE ScriptName <> '' "
9572 "UNION "
9573 "SELECT DISTINCT(script) FROM instance_template WHERE script <> ''");
9574
9575 if (!result)
9576 {
9577 LOG_INFO("server.loading", " ");
9578 LOG_ERROR("sql.sql", ">> Loaded empty set of Script Names!");
9579 return;
9580 }
9581
9582 _scriptNamesStore.reserve(result->GetRowCount() + 1);
9583
9584 do
9585 {
9586 _scriptNamesStore.push_back((*result)[0].Get<std::string>());
9587 } while (result->NextRow());
9588
9589 std::sort(_scriptNamesStore.begin(), _scriptNamesStore.end());
9590 LOG_INFO("server.loading", ">> Loaded {} ScriptNames in {} ms", _scriptNamesStore.size(), GetMSTimeDiffToNow(oldMSTime));
9591 LOG_INFO("server.loading", " ");
9592}

References _scriptNamesStore, getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, and WorldDatabase.

◆ LoadScripts()

void ObjectMgr::LoadScripts ( ScriptsType  type)
private
5213{
5214 uint32 oldMSTime = getMSTime();
5215
5216 ScriptMapMap* scripts = GetScriptsMapByType(type);
5217 if (!scripts)
5218 return;
5219
5220 std::string tableName = GetScriptsTableNameByType(type);
5221 if (tableName.empty())
5222 return;
5223
5224 if (sScriptMgr->IsScriptScheduled()) // function cannot be called when scripts are in use.
5225 return;
5226
5227 LOG_INFO("server.loading", "Loading {}...", tableName);
5228
5229 scripts->clear(); // need for reload support
5230
5231 bool isSpellScriptTable = (type == SCRIPTS_SPELL);
5232 // 0 1 2 3 4 5 6 7 8 9
5233 QueryResult result = WorldDatabase.Query("SELECT id, delay, command, datalong, datalong2, dataint, x, y, z, o{} FROM {}", isSpellScriptTable ? ", effIndex" : "", tableName);
5234
5235 if (!result)
5236 {
5237 LOG_WARN("server.loading", ">> Loaded 0 script definitions. DB table `{}` is empty!", tableName);
5238 LOG_INFO("server.loading", " ");
5239 return;
5240 }
5241
5242 uint32 count = 0;
5243
5244 do
5245 {
5246 Field* fields = result->Fetch();
5247 ScriptInfo tmp;
5248 tmp.type = type;
5249 tmp.id = fields[0].Get<uint32>();
5250 if (isSpellScriptTable)
5251 tmp.id |= fields[10].Get<uint8>() << 24;
5252 tmp.delay = fields[1].Get<uint32>();
5253 tmp.command = ScriptCommands(fields[2].Get<uint32>());
5254 tmp.Raw.nData[0] = fields[3].Get<uint32>();
5255 tmp.Raw.nData[1] = fields[4].Get<uint32>();
5256 tmp.Raw.nData[2] = fields[5].Get<int32>();
5257 tmp.Raw.fData[0] = fields[6].Get<float>();
5258 tmp.Raw.fData[1] = fields[7].Get<float>();
5259 tmp.Raw.fData[2] = fields[8].Get<float>();
5260 tmp.Raw.fData[3] = fields[9].Get<float>();
5261
5262 // generic command args check
5263 switch (tmp.command)
5264 {
5266 {
5268 {
5269 LOG_ERROR("sql.sql", "Table `{}` has invalid talk type (datalong = {}) in SCRIPT_COMMAND_TALK for script id {}",
5270 tableName, tmp.Talk.ChatType, tmp.id);
5271 continue;
5272 }
5274 {
5275 LOG_ERROR("sql.sql", "Table `{}` has invalid talk text id (dataint = {}) in SCRIPT_COMMAND_TALK for script id {}",
5276 tableName, tmp.Talk.TextID, tmp.id);
5277 continue;
5278 }
5279 break;
5280 }
5281
5283 {
5284 if (!sEmotesStore.LookupEntry(tmp.Emote.EmoteID))
5285 {
5286 LOG_ERROR("sql.sql", "Table `{}` has invalid emote id (datalong = {}) in SCRIPT_COMMAND_EMOTE for script id {}",
5287 tableName, tmp.Emote.EmoteID, tmp.id);
5288 continue;
5289 }
5290 break;
5291 }
5292
5294 {
5295 if (!sMapStore.LookupEntry(tmp.TeleportTo.MapID))
5296 {
5297 LOG_ERROR("sql.sql", "Table `{}` has invalid map (Id: {}) in SCRIPT_COMMAND_TELEPORT_TO for script id {}",
5298 tableName, tmp.TeleportTo.MapID, tmp.id);
5299 continue;
5300 }
5301
5303 {
5304 LOG_ERROR("sql.sql", "Table `{}` has invalid coordinates (X: {} Y: {} Z: {} O: {}) in SCRIPT_COMMAND_TELEPORT_TO for script id {}",
5305 tableName, tmp.TeleportTo.DestX, tmp.TeleportTo.DestY, tmp.TeleportTo.DestZ, tmp.TeleportTo.Orientation, tmp.id);
5306 continue;
5307 }
5308 break;
5309 }
5310
5312 {
5313 Quest const* quest = GetQuestTemplate(tmp.QuestExplored.QuestID);
5314 if (!quest)
5315 {
5316 LOG_ERROR("sql.sql", "Table `{}` has invalid quest (ID: {}) in SCRIPT_COMMAND_QUEST_EXPLORED in `datalong` for script id {}",
5317 tableName, tmp.QuestExplored.QuestID, tmp.id);
5318 continue;
5319 }
5320
5322 {
5323 LOG_ERROR("sql.sql", "Table `{}` has quest (ID: {}) in SCRIPT_COMMAND_QUEST_EXPLORED in `datalong` for script id {}, but quest not have specialflag QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT in quest flags. Script command or quest flags wrong. Quest modified to require objective.",
5324 tableName, tmp.QuestExplored.QuestID, tmp.id);
5325
5326 // this will prevent quest completing without objective
5327 const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
5328
5329 // continue; - quest objective requirement set and command can be allowed
5330 }
5331
5333 {
5334 LOG_ERROR("sql.sql", "Table `{}` has too large distance ({}) for exploring objective complete in `datalong2` in SCRIPT_COMMAND_QUEST_EXPLORED in `datalong` for script id {}",
5335 tableName, tmp.QuestExplored.Distance, tmp.id);
5336 continue;
5337 }
5338
5340 {
5341 LOG_ERROR("sql.sql", "Table `{}` has too large distance ({}) for exploring objective complete in `datalong2` in SCRIPT_COMMAND_QUEST_EXPLORED in `datalong` for script id {}, max distance is {} or 0 for disable distance check",
5343 continue;
5344 }
5345
5347 {
5348 LOG_ERROR("sql.sql", "Table `{}` has too small distance ({}) for exploring objective complete in `datalong2` in SCRIPT_COMMAND_QUEST_EXPLORED in `datalong` for script id {}, min distance is {} or 0 for disable distance check",
5349 tableName, tmp.QuestExplored.Distance, tmp.id, INTERACTION_DISTANCE);
5350 continue;
5351 }
5352
5353 break;
5354 }
5355
5357 {
5359 {
5360 LOG_ERROR("sql.sql", "Table `{}` has invalid creature (Entry: {}) in SCRIPT_COMMAND_KILL_CREDIT for script id {}",
5361 tableName, tmp.KillCredit.CreatureEntry, tmp.id);
5362 continue;
5363 }
5364 break;
5365 }
5366
5368 {
5370 if (!data)
5371 {
5372 LOG_ERROR("sql.sql", "Table `{}` has invalid gameobject (GUID: {}) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5373 tableName, tmp.RespawnGameobject.GOGuid, tmp.id);
5374 continue;
5375 }
5376
5377 GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
5378 if (!info)
5379 {
5380 LOG_ERROR("sql.sql", "Table `{}` has gameobject with invalid entry (GUID: {} Entry: {}) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5381 tableName, tmp.RespawnGameobject.GOGuid, data->id, tmp.id);
5382 continue;
5383 }
5384
5385 if (info->type == GAMEOBJECT_TYPE_FISHINGNODE ||
5387 info->type == GAMEOBJECT_TYPE_DOOR ||
5388 info->type == GAMEOBJECT_TYPE_BUTTON ||
5389 info->type == GAMEOBJECT_TYPE_TRAP)
5390 {
5391 LOG_ERROR("sql.sql", "Table `{}` have gameobject type ({}) unsupported by command SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5392 tableName, info->entry, tmp.id);
5393 continue;
5394 }
5395 break;
5396 }
5397
5399 {
5401 {
5402 LOG_ERROR("sql.sql", "Table `{}` has invalid coordinates (X: {} Y: {} Z: {} O: {}) in SCRIPT_COMMAND_TEMP_SUMMON_CREATURE for script id {}",
5404 continue;
5405 }
5406
5408 if (!GetCreatureTemplate(entry))
5409 {
5410 LOG_ERROR("sql.sql", "Table `{}` has invalid creature (Entry: {}) in SCRIPT_COMMAND_TEMP_SUMMON_CREATURE for script id {}",
5411 tableName, tmp.TempSummonCreature.CreatureEntry, tmp.id);
5412 continue;
5413 }
5414 break;
5415 }
5416
5419 {
5421 if (!data)
5422 {
5423 LOG_ERROR("sql.sql", "Table `{}` has invalid gameobject (GUID: {}) in {} for script id {}",
5424 tableName, tmp.ToggleDoor.GOGuid, GetScriptCommandName(tmp.command), tmp.id);
5425 continue;
5426 }
5427
5428 GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
5429 if (!info)
5430 {
5431 LOG_ERROR("sql.sql", "Table `{}` has gameobject with invalid entry (GUID: {} Entry: {}) in {} for script id {}",
5432 tableName, tmp.ToggleDoor.GOGuid, data->id, GetScriptCommandName(tmp.command), tmp.id);
5433 continue;
5434 }
5435
5436 if (info->type != GAMEOBJECT_TYPE_DOOR)
5437 {
5438 LOG_ERROR("sql.sql", "Table `{}` has gameobject type ({}) non supported by command {} for script id {}",
5439 tableName, info->entry, GetScriptCommandName(tmp.command), tmp.id);
5440 continue;
5441 }
5442
5443 break;
5444 }
5445
5447 {
5448 if (!sSpellMgr->GetSpellInfo(tmp.RemoveAura.SpellID))
5449 {
5450 LOG_ERROR("sql.sql", "Table `{}` using non-existent spell (id: {}) in SCRIPT_COMMAND_REMOVE_AURA for script id {}",
5451 tableName, tmp.RemoveAura.SpellID, tmp.id);
5452 continue;
5453 }
5454 if (tmp.RemoveAura.Flags & ~0x1) // 1 bits (0, 1)
5455 {
5456 LOG_ERROR("sql.sql", "Table `{}` using unknown flags in datalong2 ({}) in SCRIPT_COMMAND_REMOVE_AURA for script id {}",
5457 tableName, tmp.RemoveAura.Flags, tmp.id);
5458 continue;
5459 }
5460 break;
5461 }
5462
5464 {
5465 if (!sSpellMgr->GetSpellInfo(tmp.CastSpell.SpellID))
5466 {
5467 LOG_ERROR("sql.sql", "Table `{}` using non-existent spell (id: {}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5468 tableName, tmp.CastSpell.SpellID, tmp.id);
5469 continue;
5470 }
5471 if (tmp.CastSpell.Flags > 4) // targeting type
5472 {
5473 LOG_ERROR("sql.sql", "Table `{}` using unknown target in datalong2 ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5474 tableName, tmp.CastSpell.Flags, tmp.id);
5475 continue;
5476 }
5477 if (tmp.CastSpell.Flags != 4 && tmp.CastSpell.CreatureEntry & ~0x1) // 1 bit (0, 1)
5478 {
5479 LOG_ERROR("sql.sql", "Table `{}` using unknown flags in dataint ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5480 tableName, tmp.CastSpell.CreatureEntry, tmp.id);
5481 continue;
5482 }
5483 else if (tmp.CastSpell.Flags == 4 && !GetCreatureTemplate(tmp.CastSpell.CreatureEntry))
5484 {
5485 LOG_ERROR("sql.sql", "Table `{}` using invalid creature entry in dataint ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5486 tableName, tmp.CastSpell.CreatureEntry, tmp.id);
5487 continue;
5488 }
5489 break;
5490 }
5491
5493 {
5495 {
5496 LOG_ERROR("sql.sql", "Table `{}` has nonexistent item (entry: {}) in SCRIPT_COMMAND_CREATE_ITEM for script id {}",
5497 tableName, tmp.CreateItem.ItemEntry, tmp.id);
5498 continue;
5499 }
5500 if (!tmp.CreateItem.Amount)
5501 {
5502 LOG_ERROR("sql.sql", "Table `{}` SCRIPT_COMMAND_CREATE_ITEM but amount is {} for script id {}",
5503 tableName, tmp.CreateItem.Amount, tmp.id);
5504 continue;
5505 }
5506 break;
5507 }
5508 default:
5509 break;
5510 }
5511
5512 if (scripts->find(tmp.id) == scripts->end())
5513 {
5514 ScriptMap emptyMap;
5515 (*scripts)[tmp.id] = emptyMap;
5516 }
5517 (*scripts)[tmp.id].insert(std::pair<uint32, ScriptInfo>(tmp.delay, tmp));
5518
5519 ++count;
5520 } while (result->NextRow());
5521
5522 LOG_INFO("server.loading", ">> Loaded {} script definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5523 LOG_INFO("server.loading", " ");
5524}
@ GAMEOBJECT_TYPE_FISHINGNODE
Definition: SharedDefines.h:1577
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition: SharedDefines.h:3194
std::multimap< uint32, ScriptInfo > ScriptMap
Definition: ObjectMgr.h:385
ScriptMapMap * GetScriptsMapByType(ScriptsType type)
Definition: ObjectMgr.cpp:83
ScriptCommands
Definition: ObjectMgr.h:91
@ SCRIPT_COMMAND_EMOTE
Definition: ObjectMgr.h:93
@ SCRIPT_COMMAND_CREATE_ITEM
Definition: ObjectMgr.h:109
@ SCRIPT_COMMAND_CLOSE_DOOR
Definition: ObjectMgr.h:104
@ SCRIPT_COMMAND_CAST_SPELL
Definition: ObjectMgr.h:107
@ SCRIPT_COMMAND_RESPAWN_GAMEOBJECT
Definition: ObjectMgr.h:101
@ SCRIPT_COMMAND_QUEST_EXPLORED
Definition: ObjectMgr.h:99
@ SCRIPT_COMMAND_TALK
Definition: ObjectMgr.h:92
@ SCRIPT_COMMAND_OPEN_DOOR
Definition: ObjectMgr.h:103
@ SCRIPT_COMMAND_TELEPORT_TO
Definition: ObjectMgr.h:98
@ SCRIPT_COMMAND_TEMP_SUMMON_CREATURE
Definition: ObjectMgr.h:102
@ SCRIPT_COMMAND_KILL_CREDIT
Definition: ObjectMgr.h:100
@ SCRIPT_COMMAND_REMOVE_AURA
Definition: ObjectMgr.h:106
std::string GetScriptCommandName(ScriptCommands command)
Definition: ObjectMgr.cpp:103
std::map< uint32, ScriptMap > ScriptMapMap
Definition: ObjectMgr.h:386
std::string GetScriptsTableNameByType(ScriptsType type)
Definition: ObjectMgr.cpp:63
@ SCRIPTS_SPELL
Definition: ObjectMgr.h:148
#define DEFAULT_VISIBILITY_DISTANCE
Definition: ObjectDefines.h:40
#define INTERACTION_DISTANCE
Definition: ObjectDefines.h:24
@ CHAT_TYPE_WHISPER
Definition: CreatureData.h:425
uint32 entry
Definition: GameObjectData.h:32
Definition: ObjectMgr.h:190
float Orientation
Definition: ObjectMgr.h:250
uint32 Flags
Definition: ObjectMgr.h:207
struct ScriptInfo::@265::@273 TeleportTo
struct ScriptInfo::@265::@279 RemoveAura
struct ScriptInfo::@265::@274 QuestExplored
ScriptsType type
Definition: ObjectMgr.h:191
struct ScriptInfo::@265::@282 CreateItem
uint32 QuestID
Definition: ObjectMgr.h:255
int32 TextID
Definition: ObjectMgr.h:208
float DestX
Definition: ObjectMgr.h:229
uint32 ItemEntry
Definition: ObjectMgr.h:316
uint32 ChatType
Definition: ObjectMgr.h:206
uint32 id
Definition: ObjectMgr.h:192
uint32 delay
Definition: ObjectMgr.h:193
float fData[4]
Definition: ObjectMgr.h:201
struct ScriptInfo::@265::@277 TempSummonCreature
struct ScriptInfo::@265::@275 KillCredit
float PosY
Definition: ObjectMgr.h:278
ScriptCommands command
Definition: ObjectMgr.h:194
float DestY
Definition: ObjectMgr.h:230
uint32 MapID
Definition: ObjectMgr.h:243
struct ScriptInfo::@265::@276 RespawnGameobject
uint32 nData[3]
Definition: ObjectMgr.h:200
float PosZ
Definition: ObjectMgr.h:279
struct ScriptInfo::@265::@267 Raw
struct ScriptInfo::@265::@268 Talk
float PosX
Definition: ObjectMgr.h:277
uint32 Distance
Definition: ObjectMgr.h:256
uint32 SpellID
Definition: ObjectMgr.h:294
struct ScriptInfo::@265::@280 CastSpell
struct ScriptInfo::@265::@278 ToggleDoor
float DestZ
Definition: ObjectMgr.h:231
struct ScriptInfo::@265::@269 Emote
uint32 GOGuid
Definition: ObjectMgr.h:267
uint32 CreatureEntry
Definition: ObjectMgr.h:261
uint32 Amount
Definition: ObjectMgr.h:317
uint32 EmoteID
Definition: ObjectMgr.h:213

References ScriptInfo::Amount, ScriptInfo::CastSpell, CHAT_MSG_RAID_BOSS_WHISPER, CHAT_TYPE_WHISPER, ScriptInfo::ChatType, ScriptInfo::command, ScriptInfo::CreateItem, ScriptInfo::CreatureEntry, DEFAULT_VISIBILITY_DISTANCE, ScriptInfo::delay, ScriptInfo::DestX, ScriptInfo::DestY, ScriptInfo::DestZ, ScriptInfo::Distance, ScriptInfo::Emote, ScriptInfo::EmoteID, GameObjectTemplate::entry, ScriptInfo::fData, ScriptInfo::Flags, GAMEOBJECT_TYPE_BUTTON, GAMEOBJECT_TYPE_DOOR, GAMEOBJECT_TYPE_FISHINGHOLE, GAMEOBJECT_TYPE_FISHINGNODE, GAMEOBJECT_TYPE_TRAP, Field::Get(), GetBroadcastText(), GetCreatureTemplate(), GetGameObjectData(), GetGameObjectTemplate(), GetItemTemplate(), getMSTime(), GetMSTimeDiffToNow(), GetQuestTemplate(), GetScriptCommandName(), GetScriptsMapByType(), GetScriptsTableNameByType(), ScriptInfo::GOGuid, Quest::HasSpecialFlag(), GameObjectData::id, ScriptInfo::id, INTERACTION_DISTANCE, Acore::IsValidMapCoord(), ScriptInfo::ItemEntry, ScriptInfo::KillCredit, LOG_ERROR, LOG_INFO, LOG_WARN, ScriptInfo::MapID, ScriptInfo::nData, ScriptInfo::Orientation, ScriptInfo::PosX, ScriptInfo::PosY, ScriptInfo::PosZ, QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT, ScriptInfo::QuestExplored, ScriptInfo::QuestID, ScriptInfo::Raw, ScriptInfo::RemoveAura, ScriptInfo::RespawnGameobject, SCRIPT_COMMAND_CAST_SPELL, SCRIPT_COMMAND_CLOSE_DOOR, SCRIPT_COMMAND_CREATE_ITEM, SCRIPT_COMMAND_EMOTE, SCRIPT_COMMAND_KILL_CREDIT, SCRIPT_COMMAND_OPEN_DOOR, SCRIPT_COMMAND_QUEST_EXPLORED, SCRIPT_COMMAND_REMOVE_AURA, SCRIPT_COMMAND_RESPAWN_GAMEOBJECT, SCRIPT_COMMAND_TALK, SCRIPT_COMMAND_TELEPORT_TO, SCRIPT_COMMAND_TEMP_SUMMON_CREATURE, SCRIPTS_SPELL, sEmotesStore, sMapStore, ScriptInfo::SpellID, sScriptMgr, sSpellMgr, ScriptInfo::Talk, ScriptInfo::TeleportTo, ScriptInfo::TempSummonCreature, ScriptInfo::TextID, ScriptInfo::ToggleDoor, GameObjectTemplate::type, ScriptInfo::type, and WorldDatabase.

Referenced by LoadEventScripts(), LoadSpellScripts(), and LoadWaypointScripts().

◆ LoadSpellScriptNames()

void ObjectMgr::LoadSpellScriptNames ( )
5626{
5627 uint32 oldMSTime = getMSTime();
5628
5629 _spellScriptsStore.clear(); // need for reload case
5630
5631 QueryResult result = WorldDatabase.Query("SELECT spell_id, ScriptName FROM spell_script_names");
5632
5633 if (!result)
5634 {
5635 LOG_WARN("server.loading", ">> Loaded 0 spell script names. DB table `spell_script_names` is empty!");
5636 LOG_INFO("server.loading", " ");
5637 return;
5638 }
5639
5640 uint32 count = 0;
5641
5642 do
5643 {
5644 Field* fields = result->Fetch();
5645
5646 int32 spellId = fields[0].Get<int32>();
5647 std::string scriptName = fields[1].Get<std::string>();
5648
5649 bool allRanks = false;
5650 if (spellId <= 0)
5651 {
5652 allRanks = true;
5653 spellId = -spellId;
5654 }
5655
5656 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
5657 if (!spellInfo)
5658 {
5659 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) does not exist in `Spell.dbc`.", scriptName, fields[0].Get<int32>());
5660 continue;
5661 }
5662
5663 if (allRanks)
5664 {
5665 if (sSpellMgr->GetFirstSpellInChain(spellId) != uint32(spellId))
5666 {
5667 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) is not first rank of spell.", scriptName, fields[0].Get<int32>());
5668 continue;
5669 }
5670 while (spellInfo)
5671 {
5672 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
5673 spellInfo = spellInfo->GetNextRankSpell();
5674 }
5675 }
5676 else
5677 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
5678 ++count;
5679 } while (result->NextRow());
5680
5681 LOG_INFO("server.loading", ">> Loaded {} spell script names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5682 LOG_INFO("server.loading", " ");
5683}
SpellInfo const * GetNextRankSpell() const
Definition: SpellInfo.cpp:2513

References _spellScriptsStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), SpellInfo::GetNextRankSpell(), GetScriptId(), SpellInfo::Id, LOG_ERROR, LOG_INFO, LOG_WARN, sSpellMgr, and WorldDatabase.

◆ LoadSpellScripts()

void ObjectMgr::LoadSpellScripts ( )
5527{
5529
5530 // check ids
5531 for (ScriptMapMap::const_iterator itr = sSpellScripts.begin(); itr != sSpellScripts.end(); ++itr)
5532 {
5533 uint32 spellId = uint32(itr->first) & 0x00FFFFFF;
5534 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
5535
5536 if (!spellInfo)
5537 {
5538 LOG_ERROR("sql.sql", "Table `spell_scripts` has not existing spell (Id: {}) as script id", spellId);
5539 continue;
5540 }
5541
5542 SpellEffIndex i = SpellEffIndex((uint32(itr->first) >> 24) & 0x000000FF);
5543 if (uint32(i) >= MAX_SPELL_EFFECTS)
5544 {
5545 LOG_ERROR("sql.sql", "Table `spell_scripts` has too high effect index {} for spell (Id: {}) as script id", uint32(i), spellId);
5546 }
5547
5548 //check for correct spellEffect
5549 if (!spellInfo->Effects[i].Effect || (spellInfo->Effects[i].Effect != SPELL_EFFECT_SCRIPT_EFFECT && spellInfo->Effects[i].Effect != SPELL_EFFECT_DUMMY))
5550 LOG_ERROR("sql.sql", "Table `spell_scripts` - spell {} effect {} is not SPELL_EFFECT_SCRIPT_EFFECT or SPELL_EFFECT_DUMMY", spellId, uint32(i));
5551 }
5552}
SpellEffIndex
Definition: SharedDefines.h:30
@ SPELL_EFFECT_DUMMY
Definition: SharedDefines.h:781
@ SPELL_EFFECT_SCRIPT_EFFECT
Definition: SharedDefines.h:855
ScriptMapMap sSpellScripts
Definition: ObjectMgr.cpp:59

References SpellInfo::Effects, LoadScripts(), LOG_ERROR, MAX_SPELL_EFFECTS, SCRIPTS_SPELL, SPELL_EFFECT_DUMMY, SPELL_EFFECT_SCRIPT_EFFECT, sSpellMgr, and sSpellScripts.

◆ LoadTavernAreaTriggers()

void ObjectMgr::LoadTavernAreaTriggers ( )
6462{
6463 uint32 oldMSTime = getMSTime();
6464
6465 _tavernAreaTriggerStore.clear(); // need for reload case
6466
6467 QueryResult result = WorldDatabase.Query("SELECT id, faction FROM areatrigger_tavern");
6468
6469 if (!result)
6470 {
6471 LOG_WARN("server.loading", ">> Loaded 0 tavern triggers. DB table `areatrigger_tavern` is empty.");
6472 LOG_INFO("server.loading", " ");
6473 return;
6474 }
6475
6476 uint32 count = 0;
6477
6478 do
6479 {
6480 ++count;
6481
6482 Field* fields = result->Fetch();
6483
6484 uint32 Trigger_ID = fields[0].Get<uint32>();
6485
6486 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6487 if (!atEntry)
6488 {
6489 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6490 continue;
6491 }
6492
6493 uint32 faction = fields[1].Get<uint32>();
6494
6495 _tavernAreaTriggerStore.emplace(Trigger_ID, faction);
6496 } while (result->NextRow());
6497
6498 LOG_INFO("server.loading", ">> Loaded {} Tavern Triggers in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6499 LOG_INFO("server.loading", " ");
6500}

References _tavernAreaTriggerStore, Field::Get(), GetAreaTrigger(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadTempSummons()

void ObjectMgr::LoadTempSummons ( )
2021{
2022 uint32 oldMSTime = getMSTime();
2023
2024 // 0 1 2 3 4 5 6 7 8 9
2025 QueryResult result = WorldDatabase.Query("SELECT summonerId, summonerType, groupId, entry, position_x, position_y, position_z, orientation, summonType, summonTime FROM creature_summon_groups");
2026
2027 if (!result)
2028 {
2029 LOG_WARN("server.loading", ">> Loaded 0 temp summons. DB table `creature_summon_groups` is empty.");
2030 return;
2031 }
2032
2033 uint32 count = 0;
2034 do
2035 {
2036 Field* fields = result->Fetch();
2037
2038 uint32 summonerId = fields[0].Get<uint32>();
2039 SummonerType summonerType = SummonerType(fields[1].Get<uint8>());
2040 uint8 group = fields[2].Get<uint8>();
2041
2042 switch (summonerType)
2043 {
2045 if (!GetCreatureTemplate(summonerId))
2046 {
2047 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has summoner with non existing entry {} for creature summoner type, skipped.", summonerId);
2048 continue;
2049 }
2050 break;
2052 if (!GetGameObjectTemplate(summonerId))
2053 {
2054 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has summoner with non existing entry {} for gameobject summoner type, skipped.", summonerId);
2055 continue;
2056 }
2057 break;
2058 case SUMMONER_TYPE_MAP:
2059 if (!sMapStore.LookupEntry(summonerId))
2060 {
2061 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has summoner with non existing entry {} for map summoner type, skipped.", summonerId);
2062 continue;
2063 }
2064 break;
2065 default:
2066 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has unhandled summoner type {} for summoner {}, skipped.", summonerType, summonerId);
2067 continue;
2068 }
2069
2070 TempSummonData data;
2071 data.entry = fields[3].Get<uint32>();
2072
2073 if (!GetCreatureTemplate(data.entry))
2074 {
2075 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has creature in group [Summoner ID: {}, Summoner Type: {}, Group ID: {}] with non existing creature entry {}, skipped.", summonerId, summonerType, group, data.entry);
2076 continue;
2077 }
2078
2079 float posX = fields[4].Get<float>();
2080 float posY = fields[5].Get<float>();
2081 float posZ = fields[6].Get<float>();
2082 float orientation = fields[7].Get<float>();
2083
2084 data.pos.Relocate(posX, posY, posZ, orientation);
2085
2086 data.type = TempSummonType(fields[8].Get<uint8>());
2087
2089 {
2090 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has unhandled temp summon type {} in group [Summoner ID: {}, Summoner Type: {}, Group ID: {}] for creature entry {}, skipped.", data.type, summonerId, summonerType, group, data.entry);
2091 continue;
2092 }
2093
2094 data.time = fields[9].Get<uint32>();
2095
2096 TempSummonGroupKey key(summonerId, summonerType, group);
2097 _tempSummonDataStore[key].push_back(data);
2098
2099 ++count;
2100 } while (result->NextRow());
2101
2102 LOG_INFO("server.loading", ">> Loaded {} Temporary Summons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2103 LOG_INFO("server.loading", " ");
2104}
TempSummonType
Definition: Object.h:45
@ TEMPSUMMON_MANUAL_DESPAWN
Definition: Object.h:53
SummonerType
Definition: TemporarySummon.h:24
@ SUMMONER_TYPE_MAP
Definition: TemporarySummon.h:27
@ SUMMONER_TYPE_CREATURE
Definition: TemporarySummon.h:25
@ SUMMONER_TYPE_GAMEOBJECT
Definition: TemporarySummon.h:26
Stores data for temp summons.
Definition: TemporarySummon.h:32
TempSummonType type
Summon type, see TempSummonType for available types.
Definition: TemporarySummon.h:35
uint32 time
Despawn time, usable only with certain temp summon types.
Definition: TemporarySummon.h:36
uint32 entry
Entry of summoned creature.
Definition: TemporarySummon.h:33
Position pos
Position, where should be creature spawned.
Definition: TemporarySummon.h:34
void Relocate(float x, float y)
Definition: Position.h:72

References _tempSummonDataStore, TempSummonData::entry, Field::Get(), GetCreatureTemplate(), GetGameObjectTemplate(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, TempSummonData::pos, Position::Relocate(), sMapStore, SUMMONER_TYPE_CREATURE, SUMMONER_TYPE_GAMEOBJECT, SUMMONER_TYPE_MAP, TEMPSUMMON_MANUAL_DESPAWN, TempSummonData::time, TempSummonData::type, and WorldDatabase.

◆ LoadTrainerSpell()

void ObjectMgr::LoadTrainerSpell ( )
9178{
9179 uint32 oldMSTime = getMSTime();
9180
9181 // For reload case
9183
9184 QueryResult result = WorldDatabase.Query("SELECT b.ID, a.SpellID, a.MoneyCost, a.ReqSkillLine, a.ReqSkillRank, a.ReqLevel, a.ReqSpell FROM npc_trainer AS a "
9185 "INNER JOIN npc_trainer AS b ON a.ID = -(b.SpellID) "
9186 "UNION SELECT * FROM npc_trainer WHERE SpellID > 0");
9187
9188 if (!result)
9189 {
9190 LOG_WARN("server.loading", ">> Loaded 0 Trainers. DB table `npc_trainer` is empty!");
9191 LOG_INFO("server.loading", " ");
9192 return;
9193 }
9194
9195 uint32 count = 0;
9196
9197 do
9198 {
9199 Field* fields = result->Fetch();
9200
9201 uint32 entry = fields[0].Get<uint32>();
9202 uint32 spell = fields[1].Get<uint32>();
9203 uint32 spellCost = fields[2].Get<uint32>();
9204 uint32 reqSkill = fields[3].Get<uint16>();
9205 uint32 reqSkillValue = fields[4].Get<uint16>();
9206 uint32 reqLevel = fields[5].Get<uint8>();
9207 uint32 reqSpell = fields[6].Get<uint32>();
9208
9209 AddSpellToTrainer(entry, spell, spellCost, reqSkill, reqSkillValue, reqLevel, reqSpell);
9210
9211 ++count;
9212 } while (result->NextRow());
9213
9214 LOG_INFO("server.loading", ">> Loaded {} Trainers in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9215 LOG_INFO("server.loading", " ");
9216}
void AddSpellToTrainer(uint32 entry, uint32 spell, uint32 spellCost, uint32 reqSkill, uint32 reqSkillValue, uint32 reqLevel, uint32 reqSpell)
Definition: ObjectMgr.cpp:9092

References _cacheTrainerSpellStore, AddSpellToTrainer(), Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadVehicleAccessories()

void ObjectMgr::LoadVehicleAccessories ( )
3445{
3446 uint32 oldMSTime = getMSTime();
3447
3448 _vehicleAccessoryStore.clear(); // needed for reload case
3449
3450 uint32 count = 0;
3451
3452 // 0 1 2 3 4 5
3453 QueryResult result = WorldDatabase.Query("SELECT `guid`, `accessory_entry`, `seat_id`, `minion`, `summontype`, `summontimer` FROM `vehicle_accessory`");
3454
3455 if (!result)
3456 {
3457 LOG_WARN("server.loading", ">> Loaded 0 Vehicle Accessories in {} ms", GetMSTimeDiffToNow(oldMSTime));
3458 LOG_INFO("server.loading", " ");
3459 return;
3460 }
3461
3462 do
3463 {
3464 Field* fields = result->Fetch();
3465
3466 uint32 uiGUID = fields[0].Get<uint32>();
3467 uint32 uiAccessory = fields[1].Get<uint32>();
3468 int8 uiSeat = int8(fields[2].Get<int16>());
3469 bool bMinion = fields[3].Get<bool>();
3470 uint8 uiSummonType = fields[4].Get<uint8>();
3471 uint32 uiSummonTimer = fields[5].Get<uint32>();
3472
3473 if (!sObjectMgr->GetCreatureTemplate(uiAccessory))
3474 {
3475 LOG_ERROR("sql.sql", "Table `vehicle_accessory`: Accessory {} does not exist.", uiAccessory);
3476 continue;
3477 }
3478
3479 _vehicleAccessoryStore[uiGUID].push_back(VehicleAccessory(uiAccessory, uiSeat, bMinion, uiSummonType, uiSummonTimer));
3480
3481 ++count;
3482 } while (result->NextRow());
3483
3484 LOG_INFO("server.loading", ">> Loaded {} Vehicle Accessories in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3485 LOG_INFO("server.loading", " ");
3486}
Definition: VehicleDefines.h:115

References _vehicleAccessoryStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sObjectMgr, and WorldDatabase.

◆ LoadVehicleSeatAddon()

void ObjectMgr::LoadVehicleSeatAddon ( )
3489{
3490 uint32 oldMSTime = getMSTime();
3491
3492 _vehicleSeatAddonStore.clear(); // needed for reload case
3493
3494 uint32 count = 0;
3495
3496 // 0 1 2 3 4 5 6
3497 QueryResult result = WorldDatabase.Query("SELECT `SeatEntry`, `SeatOrientation`, `ExitParamX`, `ExitParamY`, `ExitParamZ`, `ExitParamO`, `ExitParamValue` FROM `vehicle_seat_addon`");
3498
3499 if (!result)
3500 {
3501 LOG_ERROR("server.loading", ">> Loaded 0 vehicle seat addons. DB table `vehicle_seat_addon` is empty.");
3502 return;
3503 }
3504
3505 do
3506 {
3507 Field* fields = result->Fetch();
3508
3509 uint32 seatID = fields[0].Get<uint32>();
3510 float orientation = fields[1].Get<float>();
3511 float exitX = fields[2].Get<float>();
3512 float exitY = fields[3].Get<float>();
3513 float exitZ = fields[4].Get<float>();
3514 float exitO = fields[5].Get<float>();
3515 uint8 exitParam = fields[6].Get<uint8>();
3516
3517 if (!sVehicleSeatStore.LookupEntry(seatID))
3518 {
3519 LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: %u does not exist in VehicleSeat.dbc. Skipping entry.", seatID);
3520 continue;
3521 }
3522
3523 // Sanitizing values
3524 if (orientation > float(M_PI * 2))
3525 {
3526 LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: %u is using invalid angle offset value (%f). Set Value to 0.", seatID, orientation);
3527 orientation = 0.0f;
3528 }
3529
3530 if (exitParam >= AsUnderlyingType(VehicleExitParameters::VehicleExitParamMax))
3531 {
3532 LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: %u is using invalid exit parameter value (%u). Setting to 0 (none).", seatID, exitParam);
3533 continue;
3534 }
3535
3536 _vehicleSeatAddonStore[seatID] = VehicleSeatAddon(orientation, exitX, exitY, exitZ, exitO, exitParam);
3537
3538 ++count;
3539 } while (result->NextRow());
3540
3541 LOG_INFO("server.loading", ">> Loaded %u Vehicle Seat Addon entries in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
3542}
DBCStorage< VehicleSeatEntry > sVehicleSeatStore(VehicleSeatEntryfmt)
Definition: VehicleDefines.h:86

References _vehicleSeatAddonStore, AsUnderlyingType(), Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, sVehicleSeatStore, and WorldDatabase.

◆ LoadVehicleTemplateAccessories()

void ObjectMgr::LoadVehicleTemplateAccessories ( )
3389{
3390 uint32 oldMSTime = getMSTime();
3391
3392 _vehicleTemplateAccessoryStore.clear(); // needed for reload case
3393
3394 uint32 count = 0;
3395
3396 // 0 1 2 3 4 5
3397 QueryResult result = WorldDatabase.Query("SELECT `entry`, `accessory_entry`, `seat_id`, `minion`, `summontype`, `summontimer` FROM `vehicle_template_accessory`");
3398
3399 if (!result)
3400 {
3401 LOG_WARN("server.loading", ">> Loaded 0 vehicle template accessories. DB table `vehicle_template_accessory` is empty.");
3402 LOG_INFO("server.loading", " ");
3403 return;
3404 }
3405
3406 do
3407 {
3408 Field* fields = result->Fetch();
3409
3410 uint32 uiEntry = fields[0].Get<uint32>();
3411 uint32 uiAccessory = fields[1].Get<uint32>();
3412 int8 uiSeat = int8(fields[2].Get<int8>());
3413 bool bMinion = fields[3].Get<bool>();
3414 uint8 uiSummonType = fields[4].Get<uint8>();
3415 uint32 uiSummonTimer = fields[5].Get<uint32>();
3416
3417 if (!sObjectMgr->GetCreatureTemplate(uiEntry))
3418 {
3419 LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: creature template entry {} does not exist.", uiEntry);
3420 continue;
3421 }
3422
3423 if (!sObjectMgr->GetCreatureTemplate(uiAccessory))
3424 {
3425 LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: Accessory {} does not exist.", uiAccessory);
3426 continue;
3427 }
3428
3429 if (_spellClickInfoStore.find(uiEntry) == _spellClickInfoStore.end())
3430 {
3431 LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: creature template entry {} has no data in npc_spellclick_spells", uiEntry);
3432 continue;
3433 }
3434
3435 _vehicleTemplateAccessoryStore[uiEntry].push_back(VehicleAccessory(uiAccessory, uiSeat, bMinion, uiSummonType, uiSummonTimer));
3436
3437 ++count;
3438 } while (result->NextRow());
3439
3440 LOG_INFO("server.loading", ">> Loaded {} Vehicle Template Accessories in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3441 LOG_INFO("server.loading", " ");
3442}

References _spellClickInfoStore, _vehicleTemplateAccessoryStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sObjectMgr, and WorldDatabase.

◆ LoadVendors()

void ObjectMgr::LoadVendors ( )
9258{
9259 uint32 oldMSTime = getMSTime();
9260
9261 // For reload case
9262 for (CacheVendorItemContainer::iterator itr = _cacheVendorItemStore.begin(); itr != _cacheVendorItemStore.end(); ++itr)
9263 itr->second.Clear();
9264 _cacheVendorItemStore.clear();
9265
9266 std::set<uint32> skip_vendors;
9267
9268 QueryResult result = WorldDatabase.Query("SELECT entry, item, maxcount, incrtime, ExtendedCost FROM npc_vendor ORDER BY entry, slot ASC, item, ExtendedCost");
9269 if (!result)
9270 {
9271 LOG_INFO("server.loading", " ");
9272 LOG_WARN("server.loading", ">> Loaded 0 Vendors. DB table `npc_vendor` is empty!");
9273 return;
9274 }
9275
9276 uint32 count = 0;
9277
9278 do
9279 {
9280 Field* fields = result->Fetch();
9281
9282 uint32 entry = fields[0].Get<uint32>();
9283 int32 item_id = fields[1].Get<int32>();
9284
9285 // if item is a negative, its a reference
9286 if (item_id < 0)
9287 count += LoadReferenceVendor(entry, -item_id, &skip_vendors);
9288 else
9289 {
9290 uint32 maxcount = fields[2].Get<uint8>();
9291 uint32 incrtime = fields[3].Get<uint32>();
9292 uint32 ExtendedCost = fields[4].Get<uint32>();
9293
9294 if (!IsVendorItemValid(entry, item_id, maxcount, incrtime, ExtendedCost, nullptr, &skip_vendors))
9295 continue;
9296
9297 VendorItemData& vList = _cacheVendorItemStore[entry];
9298
9299 vList.AddItem(item_id, maxcount, incrtime, ExtendedCost);
9300 ++count;
9301 }
9302 } while (result->NextRow());
9303
9304 LOG_INFO("server.loading", ">> Loaded {} Vendors in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9305 LOG_INFO("server.loading", " ");
9306}

References _cacheVendorItemStore, VendorItemData::AddItem(), Field::Get(), getMSTime(), GetMSTimeDiffToNow(), IsVendorItemValid(), LoadReferenceVendor(), LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadWaypointScripts()

void ObjectMgr::LoadWaypointScripts ( )
5599{
5601
5602 std::set<uint32> actionSet;
5603
5604 for (ScriptMapMap::const_iterator itr = sWaypointScripts.begin(); itr != sWaypointScripts.end(); ++itr)
5605 actionSet.insert(itr->first);
5606
5608 PreparedQueryResult result = WorldDatabase.Query(stmt);
5609
5610 if (result)
5611 {
5612 do
5613 {
5614 Field* fields = result->Fetch();
5615 uint32 action = fields[0].Get<uint32>();
5616
5617 actionSet.erase(action);
5618 } while (result->NextRow());
5619 }
5620
5621 for (std::set<uint32>::iterator itr = actionSet.begin(); itr != actionSet.end(); ++itr)
5622 LOG_ERROR("sql.sql", "There is no waypoint which links to the waypoint script {}", *itr);
5623}
ScriptMapMap sWaypointScripts
Definition: ObjectMgr.cpp:61
@ SCRIPTS_WAYPOINT
Definition: ObjectMgr.h:150
@ WORLD_SEL_WAYPOINT_DATA_ACTION
Definition: WorldDatabase.h:69

References Field::Get(), LoadScripts(), LOG_ERROR, SCRIPTS_WAYPOINT, sWaypointScripts, WORLD_SEL_WAYPOINT_DATA_ACTION, and WorldDatabase.

◆ NewGOData()

GameObjectData & ObjectMgr::NewGOData ( ObjectGuid::LowType  guid)
inline
1289{ return _gameObjectDataStore[guid]; }

References _gameObjectDataStore.

Referenced by AddGOData().

◆ NewOrExistCreatureData()

CreatureData & ObjectMgr::NewOrExistCreatureData ( ObjectGuid::LowType  spawnId)
inline
1204{ return _creatureDataStore[spawnId]; }

References _creatureDataStore.

Referenced by AddCreData().

◆ PlayerCreateInfoAddItemHelper()

void ObjectMgr::PlayerCreateInfoAddItemHelper ( uint32  race_,
uint32  class_,
uint32  itemId,
int32  count 
)
private
3650{
3651 if (!_playerInfo[race_][class_])
3652 return;
3653
3654 if (count > 0)
3655 _playerInfo[race_][class_]->item.push_back(PlayerCreateInfoItem(itemId, count));
3656 else
3657 {
3658 if (count < -1)
3659 LOG_ERROR("sql.sql", "Invalid count {} specified on item {} be removed from original player create info (use -1)!", count, itemId);
3660
3661 for (uint32 gender = 0; gender < GENDER_NONE; ++gender)
3662 {
3663 if (CharStartOutfitEntry const* entry = GetCharStartOutfitEntry(race_, class_, gender))
3664 {
3665 bool found = false;
3666 for (uint8 x = 0; x < MAX_OUTFIT_ITEMS; ++x)
3667 {
3668 if (entry->ItemId[x] > 0 && uint32(entry->ItemId[x]) == itemId)
3669 {
3670 found = true;
3671 const_cast<CharStartOutfitEntry*>(entry)->ItemId[x] = 0;
3672 break;
3673 }
3674 }
3675
3676 if (!found)
3677 LOG_ERROR("sql.sql", "Item {} specified to be removed from original create info not found in dbc!", itemId);
3678 }
3679 }
3680 }
3681}
CharStartOutfitEntry const * GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender)
Definition: DBCStores.cpp:842
Definition: Player.h:284
PlayerCreateInfoItems item
Definition: Player.h:352

References _playerInfo, GENDER_NONE, GetCharStartOutfitEntry(), PlayerInfo::item, LOG_ERROR, and MAX_OUTFIT_ITEMS.

Referenced by LoadPlayerInfo().

◆ RemoveCreatureFromGrid()

void ObjectMgr::RemoveCreatureFromGrid ( ObjectGuid::LowType  guid,
CreatureData const *  data 
)
2316{
2317 uint8 mask = data->spawnMask;
2318 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2319 {
2320 if (mask & 1)
2321 {
2322 CellCoord cellCoord = Acore::ComputeCellCoord(data->posX, data->posY);
2323 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][cellCoord.GetId()];
2324 cell_guids.creatures.erase(guid);
2325 }
2326 }
2327}

References _mapObjectGuidsStore, Acore::ComputeCellCoord(), CellObjectGuids::creatures, CoordPair< LIMIT >::GetId(), MAKE_PAIR32(), CreatureData::mapid, CreatureData::posX, CreatureData::posY, and CreatureData::spawnMask.

Referenced by DeleteCreatureData().

◆ RemoveGameobjectFromGrid()

void ObjectMgr::RemoveGameobjectFromGrid ( ObjectGuid::LowType  guid,
GameObjectData const *  data 
)
2619{
2620 uint8 mask = data->spawnMask;
2621 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2622 {
2623 if (mask & 1)
2624 {
2625 CellCoord cellCoord = Acore::ComputeCellCoord(data->posX, data->posY);
2626 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][cellCoord.GetId()];
2627 cell_guids.gameobjects.erase(guid);
2628 }
2629 }
2630}

References _mapObjectGuidsStore, Acore::ComputeCellCoord(), CellObjectGuids::gameobjects, CoordPair< LIMIT >::GetId(), MAKE_PAIR32(), GameObjectData::mapid, GameObjectData::posX, GameObjectData::posY, and GameObjectData::spawnMask.

Referenced by DeleteGOData().

◆ RemoveVendorItem()

bool ObjectMgr::RemoveVendorItem ( uint32  entry,
uint32  item,
bool  persist = true 
)
9437{
9438 CacheVendorItemContainer::iterator iter = _cacheVendorItemStore.find(entry);
9439 if (iter == _cacheVendorItemStore.end())
9440 return false;
9441
9442 if (!iter->second.RemoveItem(item))
9443 return false;
9444
9445 if (persist)
9446 {
9448
9449 stmt->SetData(0, entry);
9450 stmt->SetData(1, item);
9451
9452 WorldDatabase.Execute(stmt);
9453 }
9454
9455 return true;
9456}
@ WORLD_DEL_NPC_VENDOR
Definition: WorldDatabase.h:44

References _cacheVendorItemStore, PreparedStatementBase::SetData(), WORLD_DEL_NPC_VENDOR, and WorldDatabase.

◆ ReturnOrDeleteOldMails()

void ObjectMgr::ReturnOrDeleteOldMails ( bool  serverUp)
6090{
6091 uint32 oldMSTime = getMSTime();
6092
6093 time_t curTime = GameTime::GetGameTime().count();
6094
6096 stmt->SetData(0, uint32(curTime));
6097 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6098 if (!result)
6099 return;
6100
6101 std::map<uint32 /*messageId*/, MailItemInfoVec> itemsCache;
6102 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_EXPIRED_MAIL_ITEMS);
6103 stmt->SetData(0, uint32(curTime));
6104 if (PreparedQueryResult items = CharacterDatabase.Query(stmt))
6105 {
6106 MailItemInfo item;
6107 do
6108 {
6109 Field* fields = items->Fetch();
6110 item.item_guid = fields[0].Get<uint32>();
6111 item.item_template = fields[1].Get<uint32>();
6112 uint32 mailId = fields[2].Get<uint32>();
6113 itemsCache[mailId].push_back(item);
6114 } while (items->NextRow());
6115 }
6116
6117 uint32 deletedCount = 0;
6118 uint32 returnedCount = 0;
6119 do
6120 {
6121 Field* fields = result->Fetch();
6122 Mail* m = new Mail;
6123 m->messageID = fields[0].Get<uint32>();
6124 m->messageType = fields[1].Get<uint8>();
6125 m->sender = fields[2].Get<uint32>();
6126 m->receiver = fields[3].Get<uint32>();
6127 bool has_items = fields[4].Get<bool>();
6128 m->expire_time = time_t(fields[5].Get<uint32>());
6129 m->deliver_time = time_t(0);
6130 m->stationery = fields[6].Get<uint8>();
6131 m->checked = fields[7].Get<uint8>();
6132 m->mailTemplateId = fields[8].Get<int16>();
6133
6134 Player* player = nullptr;
6135 if (serverUp)
6137
6138 if (player) // don't modify mails of a logged in player
6139 {
6140 delete m;
6141 continue;
6142 }
6143
6144 // Delete or return mail
6145 if (has_items)
6146 {
6147 // read items from cache
6148 m->items.swap(itemsCache[m->messageID]);
6149
6150 // If it is mail from non-player, or if it's already return mail, it shouldn't be returned, but deleted
6151 if (!m->IsSentByPlayer() || m->IsSentByGM() || (m->IsCODPayment() || m->IsReturnedMail()))
6152 {
6153 for (auto const& mailedItem : m->items)
6154 {
6155 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
6156 stmt->SetData(0, mailedItem.item_guid);
6157 CharacterDatabase.Execute(stmt);
6158 }
6159
6160 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
6161 stmt->SetData(0, m->messageID);
6162 CharacterDatabase.Execute(stmt);
6163 }
6164 else
6165 {
6166 // Mail will be returned
6167 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_RETURNED);
6168 stmt->SetData(0, m->receiver);
6169 stmt->SetData(1, m->sender);
6170 stmt->SetData(2, uint32(curTime + 30 * DAY));
6171 stmt->SetData(3, uint32(curTime));
6173 stmt->SetData(5, m->messageID);
6174 CharacterDatabase.Execute(stmt);
6175 for (auto const& mailedItem : m->items)
6176 {
6177 // Update receiver in mail items for its proper delivery, and in instance_item for avoid lost item at sender delete
6178 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_ITEM_RECEIVER);
6179 stmt->SetData(0, m->sender);
6180 stmt->SetData(1, mailedItem.item_guid);
6181 CharacterDatabase.Execute(stmt);
6182
6183 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_OWNER);
6184 stmt->SetData(0, m->sender);
6185 stmt->SetData(1, mailedItem.item_guid);
6186 CharacterDatabase.Execute(stmt);
6187 }
6188
6189 // xinef: update global data
6190 sCharacterCache->IncreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->sender));
6191 sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver));
6192
6193 delete m;
6194 ++returnedCount;
6195 continue;
6196 }
6197 }
6198
6199 sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver));
6200
6201 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
6202 stmt->SetData(0, m->messageID);
6203 CharacterDatabase.Execute(stmt);
6204 delete m;
6205 ++deletedCount;
6206 } while (result->NextRow());
6207
6208 LOG_INFO("server.loading", ">> Processed {} expired mails: {} deleted and {} returned in {} ms", deletedCount + returnedCount, deletedCount, returnedCount, GetMSTimeDiffToNow(oldMSTime));
6209 LOG_INFO("server.loading", " ");
6210}
#define sCharacterCache
Definition: CharacterCache.h:83
std::vector< MailItemInfo > MailItemInfoVec
Definition: Mail.h:164
@ MAIL_CHECK_MASK_RETURNED
Definition: Mail.h:48
@ CHAR_UPD_ITEM_OWNER
Definition: CharacterDatabase.h:118
@ CHAR_DEL_ITEM_INSTANCE
Definition: CharacterDatabase.h:127
@ CHAR_UPD_MAIL_RETURNED
Definition: CharacterDatabase.h:116
@ CHAR_SEL_EXPIRED_MAIL
Definition: CharacterDatabase.h:114
@ CHAR_SEL_EXPIRED_MAIL_ITEMS
Definition: CharacterDatabase.h:115
@ CHAR_DEL_MAIL_BY_ID
Definition: CharacterDatabase.h:110
@ CHAR_DEL_MAIL_ITEM_BY_ID
Definition: CharacterDatabase.h:380
@ CHAR_UPD_MAIL_ITEM_RECEIVER
Definition: CharacterDatabase.h:117
Player * FindPlayerByLowGUID(ObjectGuid::LowType lowguid)
Definition: ObjectAccessor.cpp:251
Seconds GetGameTime()
Definition: GameTime.cpp:38
Definition: Player.h:1081
Definition: Mail.h:160
ObjectGuid::LowType item_guid
Definition: Mail.h:161
uint32 item_template
Definition: Mail.h:162
Definition: Mail.h:167
bool IsSentByGM() const
Definition: Mail.h:208
bool IsCODPayment() const
Definition: Mail.h:209
ObjectGuid::LowType receiver
Definition: Mail.h:173
uint8 messageType
Definition: Mail.h:169
bool IsSentByPlayer() const
Definition: Mail.h:207
uint32 messageID
Definition: Mail.h:168
time_t expire_time
Definition: Mail.h:178
uint32 sender
Definition: Mail.h:172
uint8 stationery
Definition: Mail.h:170
std::vector< MailItemInfo > items
Definition: Mail.h:176
time_t deliver_time
Definition: Mail.h:179
bool IsReturnedMail() const
Definition: Mail.h:210
uint32 checked
Definition: Mail.h:182
uint16 mailTemplateId
Definition: Mail.h:171

References CHAR_DEL_ITEM_INSTANCE, CHAR_DEL_MAIL_BY_ID, CHAR_DEL_MAIL_ITEM_BY_ID, CHAR_SEL_EXPIRED_MAIL, CHAR_SEL_EXPIRED_MAIL_ITEMS, CHAR_UPD_ITEM_OWNER, CHAR_UPD_MAIL_ITEM_RECEIVER, CHAR_UPD_MAIL_RETURNED, CharacterDatabase, Mail::checked, DAY, Mail::deliver_time, Mail::expire_time, ObjectAccessor::FindPlayerByLowGUID(), Field::Get(), GameTime::GetGameTime(), getMSTime(), GetMSTimeDiffToNow(), Mail::IsCODPayment(), Mail::IsReturnedMail(), Mail::IsSentByGM(), Mail::IsSentByPlayer(), MailItemInfo::item_guid, MailItemInfo::item_template, Mail::items, LOG_INFO, MAIL_CHECK_MASK_RETURNED, Mail::mailTemplateId, Mail::messageID, Mail::messageType, Mail::receiver, sCharacterCache, Mail::sender, PreparedStatementBase::SetData(), and Mail::stationery.

◆ SendServerMail()

void ObjectMgr::SendServerMail ( Player player,
uint32  id,
uint32  reqLevel,
uint32  reqPlayTime,
uint32  rewardMoneyA,
uint32  rewardMoneyH,
uint32  rewardItemA,
uint32  rewardItemCountA,
uint32  rewardItemH,
uint32  rewardItemCountH,
std::string  subject,
std::string  body,
uint8  active 
) const
10261{
10262 if (active)
10263 {
10264 if (player->GetLevel() < reqLevel)
10265 return;
10266
10267 if (player->GetTotalPlayedTime() < reqPlayTime)
10268 return;
10269
10270 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
10271
10273 MailDraft draft(subject, body);
10274
10275 draft.AddMoney(player->GetTeamId() == TEAM_ALLIANCE ? rewardMoneyA : rewardMoneyH);
10276 if (Item* mailItem = Item::CreateItem(player->GetTeamId() == TEAM_ALLIANCE ? rewardItemA : rewardItemH, player->GetTeamId() == TEAM_ALLIANCE ? rewardItemCountA : rewardItemCountH))
10277 {
10278 mailItem->SaveToDB(trans);
10279 draft.AddItem(mailItem);
10280 }
10281
10282 draft.SendMailTo(trans, MailReceiver(player), sender);
10283 CharacterDatabase.CommitTransaction(trans);
10284
10286 stmt->SetData(0, player->GetGUID().GetCounter());
10287 stmt->SetData(1, id);
10288 CharacterDatabase.Execute(stmt);
10289
10290 LOG_DEBUG("entities.player", "ObjectMgr::SendServerMail() Sent mail id {} to {}", id, player->GetGUID().ToString());
10291 }
10292}
@ MAIL_STATIONERY_GM
Definition: Mail.h:59
@ MAIL_NORMAL
Definition: Mail.h:37
@ CHAR_REP_MAIL_SERVER_CHARACTER
Definition: CharacterDatabase.h:85
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition: DatabaseEnvFwd.h:69
Definition: Item.h:220
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition: Item.cpp:1087
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:112
LowType GetCounter() const
Definition: ObjectGuid.h:145
std::string ToString() const
Definition: ObjectGuid.cpp:47
uint32 GetTotalPlayedTime()
Definition: Player.h:1203
TeamId GetTeamId(bool original=false) const
Definition: Player.h:2108
uint8 GetLevel() const
Definition: Unit.h:1024
Definition: Mail.h:83
Definition: Mail.h:105
Definition: Mail.h:119

References MailDraft::AddItem(), MailDraft::AddMoney(), CHAR_REP_MAIL_SERVER_CHARACTER, CharacterDatabase, Item::CreateItem(), ObjectGuid::GetCounter(), Object::GetGUID(), Unit::GetLevel(), Player::GetTeamId(), Player::GetTotalPlayedTime(), LOG_DEBUG, MAIL_NORMAL, MAIL_STATIONERY_GM, MailDraft::SendMailTo(), PreparedStatementBase::SetData(), TEAM_ALLIANCE, and ObjectGuid::ToString().

◆ SetCreatureLinkedRespawn()

bool ObjectMgr::SetCreatureLinkedRespawn ( ObjectGuid::LowType  guid,
ObjectGuid::LowType  linkedGuid 
)
1974{
1975 if (!guidLow)
1976 return false;
1977
1978 CreatureData const* master = GetCreatureData(guidLow);
1979 ObjectGuid guid = ObjectGuid::Create<HighGuid::Unit>(master->id1, guidLow);
1980
1981 if (!linkedGuidLow) // we're removing the linking
1982 {
1983 _linkedRespawnStore.erase(guid);
1985 stmt->SetData(0, guidLow);
1986 WorldDatabase.Execute(stmt);
1987 return true;
1988 }
1989
1990 CreatureData const* slave = GetCreatureData(linkedGuidLow);
1991 if (!slave)
1992 {
1993 LOG_ERROR("sql.sql", "Creature '{}' linking to non-existent creature '{}'.", guidLow, linkedGuidLow);
1994 return false;
1995 }
1996
1997 MapEntry const* map = sMapStore.LookupEntry(master->mapid);
1998 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
1999 {
2000 LOG_ERROR("sql.sql", "Creature '{}' linking to '{}' on an unpermitted map.", guidLow, linkedGuidLow);
2001 return false;
2002 }
2003
2004 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
2005 {
2006 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
2007 return false;
2008 }
2009
2010 ObjectGuid linkedGuid = ObjectGuid::Create<HighGuid::Unit>(slave->id1, linkedGuidLow);
2011
2012 _linkedRespawnStore[guid] = linkedGuid;
2014 stmt->SetData(0, guidLow);
2015 stmt->SetData(1, linkedGuidLow);
2016 WorldDatabase.Execute(stmt);
2017 return true;
2018}
@ WORLD_REP_CREATURE_LINKED_RESPAWN
Definition: WorldDatabase.h:33
@ WORLD_DEL_CRELINKED_RESPAWN
Definition: WorldDatabase.h:32

References _linkedRespawnStore, GetCreatureData(), CreatureData::id1, MapEntry::Instanceable(), LOG_ERROR, CreatureData::mapid, PreparedStatementBase::SetData(), sMapStore, CreatureData::spawnMask, WORLD_DEL_CRELINKED_RESPAWN, WORLD_REP_CREATURE_LINKED_RESPAWN, and WorldDatabase.

◆ SetDBCLocaleIndex()

void ObjectMgr::SetDBCLocaleIndex ( LocaleConstant  locale)
inline
1314{ DBCLocaleIndex = locale; }

References DBCLocaleIndex.

◆ SetHighestGuids()

void ObjectMgr::SetHighestGuids ( )
6972{
6973 QueryResult result = CharacterDatabase.Query("SELECT MAX(guid) FROM characters");
6974 if (result)
6975 GetGuidSequenceGenerator<HighGuid::Player>().Set((*result)[0].Get<uint32>() + 1);
6976
6977 result = CharacterDatabase.Query("SELECT MAX(guid) FROM item_instance");
6978 if (result)
6979 GetGuidSequenceGenerator<HighGuid::Item>().Set((*result)[0].Get<uint32>() + 1);
6980
6981 // Cleanup other tables from not existed guids ( >= _hiItemGuid)
6982 CharacterDatabase.Execute("DELETE FROM character_inventory WHERE item >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
6983 CharacterDatabase.Execute("DELETE FROM mail_items WHERE item_guid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
6984 CharacterDatabase.Execute("DELETE FROM auctionhouse WHERE itemguid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
6985 CharacterDatabase.Execute("DELETE FROM guild_bank_item WHERE item_guid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
6986
6987 result = WorldDatabase.Query("SELECT MAX(guid) FROM transports");
6988 if (result)
6989 GetGuidSequenceGenerator<HighGuid::Mo_Transport>().Set((*result)[0].Get<uint32>() + 1);
6990
6991 result = CharacterDatabase.Query("SELECT MAX(id) FROM auctionhouse");
6992 if (result)
6993 _auctionId = (*result)[0].Get<uint32>() + 1;
6994
6995 result = CharacterDatabase.Query("SELECT MAX(id) FROM mail");
6996 if (result)
6997 _mailId = (*result)[0].Get<uint32>() + 1;
6998
6999 result = CharacterDatabase.Query("SELECT MAX(arenateamid) FROM arena_team");
7000 if (result)
7001 sArenaTeamMgr->SetNextArenaTeamId((*result)[0].Get<uint32>() + 1);
7002
7003 result = CharacterDatabase.Query("SELECT MAX(fight_id) FROM log_arena_fights");
7004 if (result)
7005 sArenaTeamMgr->SetLastArenaLogId((*result)[0].Get<uint32>());
7006
7007 result = CharacterDatabase.Query("SELECT MAX(setguid) FROM character_equipmentsets");
7008 if (result)
7009 _equipmentSetGuid = (*result)[0].Get<uint64>() + 1;
7010
7011 result = CharacterDatabase.Query("SELECT MAX(guildId) FROM guild");
7012 if (result)
7013 sGuildMgr->SetNextGuildId((*result)[0].Get<uint32>() + 1);
7014
7015 result = WorldDatabase.Query("SELECT MAX(guid) FROM creature");
7016 if (result)
7017 _creatureSpawnId = (*result)[0].Get<uint32>() + 1;
7018
7019 result = WorldDatabase.Query("SELECT MAX(guid) FROM gameobject");
7020 if (result)
7021 _gameObjectSpawnId = (*result)[0].Get<uint32>() + 1;
7022}
#define sGuildMgr
Definition: GuildMgr.h:51
#define sArenaTeamMgr
Definition: ArenaTeamMgr.h:67

References _auctionId, _creatureSpawnId, _equipmentSetGuid, _gameObjectSpawnId, _mailId, CharacterDatabase, sArenaTeamMgr, sGuildMgr, and WorldDatabase.

◆ ValidateSpellScripts()

void ObjectMgr::ValidateSpellScripts ( )
5686{
5687 uint32 oldMSTime = getMSTime();
5688
5689 if (_spellScriptsStore.empty())
5690 {
5691 LOG_INFO("server.loading", ">> Validated 0 scripts.");
5692 LOG_INFO("server.loading", " ");
5693 return;
5694 }
5695
5696 uint32 count = 0;
5697
5698 for (SpellScriptsContainer::iterator itr = _spellScriptsStore.begin(); itr != _spellScriptsStore.end();)
5699 {
5700 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
5701 std::vector<std::pair<SpellScriptLoader*, SpellScriptsContainer::iterator> > SpellScriptLoaders;
5702 sScriptMgr->CreateSpellScriptLoaders(itr->first, SpellScriptLoaders);
5703 itr = _spellScriptsStore.upper_bound(itr->first);
5704
5705 for (std::vector<std::pair<SpellScriptLoader*, SpellScriptsContainer::iterator> >::iterator sitr = SpellScriptLoaders.begin(); sitr != SpellScriptLoaders.end(); ++sitr)
5706 {
5707 SpellScript* spellScript = sitr->first->GetSpellScript();
5708 AuraScript* auraScript = sitr->first->GetAuraScript();
5709 bool valid = true;
5710 if (!spellScript && !auraScript)
5711 {
5712 LOG_ERROR("sql.sql", "Functions GetSpellScript() and GetAuraScript() of script `{}` do not return objects - script skipped", GetScriptName(sitr->second->second));
5713 valid = false;
5714 }
5715 if (spellScript)
5716 {
5717 spellScript->_Init(&sitr->first->GetName(), spellInfo->Id);
5718 spellScript->_Register();
5719 if (!spellScript->_Validate(spellInfo))
5720 valid = false;
5721 delete spellScript;
5722 }
5723 if (auraScript)
5724 {
5725 auraScript->_Init(&sitr->first->GetName(), spellInfo->Id);
5726 auraScript->_Register();
5727 if (!auraScript->_Validate(spellInfo))
5728 valid = false;
5729 delete auraScript;
5730 }
5731 if (!valid)
5732 {
5733 _spellScriptsStore.erase(sitr->second);
5734 }
5735 }
5736 ++count;
5737 }
5738
5739 LOG_INFO("server.loading", ">> Validated {} scripts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5740 LOG_INFO("server.loading", " ");
5741}
std::string const & GetScriptName(uint32 id) const
Definition: ObjectMgr.cpp:9594
virtual void _Register()
Definition: SpellScript.cpp:45
virtual void _Init(std::string const *scriptname, uint32 spellId)
Definition: SpellScript.cpp:59
Definition: SpellScript.h:182
bool _Validate(SpellInfo const *entry) override
Definition: SpellScript.cpp:316
Definition: SpellScript.h:517
bool _Validate(SpellInfo const *entry) override
Definition: SpellScript.cpp:662

References _SpellScript::_Init(), _SpellScript::_Register(), _spellScriptsStore, SpellScript::_Validate(), AuraScript::_Validate(), getMSTime(), GetMSTimeDiffToNow(), GetScriptName(), SpellInfo::Id, LOG_ERROR, LOG_INFO, sScriptMgr, and sSpellMgr.

Friends And Related Function Documentation

◆ PlayerDumpReader

friend class PlayerDumpReader
friend

Member Data Documentation

◆ _accessRequirementStore

DungeonProgressionRequirementsContainer ObjectMgr::_accessRequirementStore
private

◆ _acoreStringStore

AcoreStringContainer ObjectMgr::_acoreStringStore
private

Referenced by GetAcoreString(), and LoadAcoreStrings().

◆ _areaTriggerScriptStore

AreaTriggerScriptContainer ObjectMgr::_areaTriggerScriptStore
private

◆ _areaTriggerStore

AreaTriggerContainer ObjectMgr::_areaTriggerStore
private

Referenced by GetAreaTrigger(), and LoadAreaTriggers().

◆ _areaTriggerTeleportStore

◆ _auctionId

uint32 ObjectMgr::_auctionId
private

◆ _baseXPTable

BaseXPContainer ObjectMgr::_baseXPTable
private

Referenced by GetBaseXP(), and LoadExplorationBaseXP().

◆ _broadcastTextStore

BroadcastTextContainer ObjectMgr::_broadcastTextStore
private

◆ _cacheTrainerSpellStore

CacheTrainerSpellContainer ObjectMgr::_cacheTrainerSpellStore
private

◆ _cacheVendorItemStore

◆ _creatureAddonStore

CreatureAddonContainer ObjectMgr::_creatureAddonStore
private

◆ _creatureBaseStatsStore

CreatureBaseStatsContainer ObjectMgr::_creatureBaseStatsStore
private

◆ _creatureCustomIDsStore

CreatureCustomIDsContainer ObjectMgr::_creatureCustomIDsStore
private

◆ _creatureDataStore

◆ _creatureLocaleStore

CreatureLocaleContainer ObjectMgr::_creatureLocaleStore
private

◆ _creatureModelStore

CreatureModelContainer ObjectMgr::_creatureModelStore
private

◆ _creatureMovementOverrides

std::unordered_map<ObjectGuid::LowType, CreatureMovementData> ObjectMgr::_creatureMovementOverrides
private

◆ _creatureQuestInvolvedRelations

◆ _creatureQuestItemStore

CreatureQuestItemMap ObjectMgr::_creatureQuestItemStore
private

◆ _creatureQuestRelations

QuestRelations ObjectMgr::_creatureQuestRelations
private

◆ _creatureSpawnId

ObjectGuid::LowType ObjectMgr::_creatureSpawnId
private

◆ _creatureTemplateAddonStore

CreatureAddonContainer ObjectMgr::_creatureTemplateAddonStore
private

◆ _creatureTemplateStore

◆ _creatureTemplateStoreFast

std::vector<CreatureTemplate*> ObjectMgr::_creatureTemplateStoreFast
private

◆ _difficultyEntries

std::set<uint32> ObjectMgr::_difficultyEntries[MAX_DIFFICULTY - 1]
private

◆ _dungeonEncounterStore

DungeonEncounterContainer ObjectMgr::_dungeonEncounterStore
private

◆ _emptyCellObjectGuids

CellObjectGuids ObjectMgr::_emptyCellObjectGuids
private

Referenced by GetCellObjectGuids().

◆ _emptyCellObjectGuidsMap

CellObjectGuidsMap ObjectMgr::_emptyCellObjectGuidsMap
private

Referenced by GetMapObjectGuids().

◆ _equipmentInfoStore

EquipmentInfoContainer ObjectMgr::_equipmentInfoStore
private

◆ _equipmentSetGuid

uint64 ObjectMgr::_equipmentSetGuid
private

◆ _fishingBaseForAreaStore

◆ _gameObjectAddonStore

GameObjectAddonContainer ObjectMgr::_gameObjectAddonStore
private

◆ _gameObjectDataStore

GameObjectDataContainer ObjectMgr::_gameObjectDataStore
private

◆ _gameObjectLocaleStore

GameObjectLocaleContainer ObjectMgr::_gameObjectLocaleStore
private

◆ _gameObjectQuestItemStore

GameObjectQuestItemMap ObjectMgr::_gameObjectQuestItemStore
private

◆ _gameObjectSpawnId

ObjectGuid::LowType ObjectMgr::_gameObjectSpawnId
private

◆ _gameObjectTemplateAddonStore

GameObjectTemplateAddonContainer ObjectMgr::_gameObjectTemplateAddonStore
private

◆ _gameObjectTemplateStore

GameObjectTemplateContainer ObjectMgr::_gameObjectTemplateStore
private

◆ _gameTeleStore

GameTeleContainer ObjectMgr::_gameTeleStore
private

◆ _goQuestInvolvedRelations

QuestRelations ObjectMgr::_goQuestInvolvedRelations
private

◆ _goQuestRelations

QuestRelations ObjectMgr::_goQuestRelations
private

◆ _gossipMenuItemsLocaleStore

GossipMenuItemsLocaleContainer ObjectMgr::_gossipMenuItemsLocaleStore
private

◆ _gossipMenuItemsStore

◆ _gossipMenusStore

GossipMenusContainer ObjectMgr::_gossipMenusStore
private

◆ _gossipTextStore

GossipTextContainer ObjectMgr::_gossipTextStore
private

Referenced by GetGossipText(), and LoadGossipText().

◆ _guidGenerators

std::map<HighGuid, std::unique_ptr<ObjectGuidGeneratorBase> > ObjectMgr::_guidGenerators
private

◆ _hasDifficultyEntries

std::set<uint32> ObjectMgr::_hasDifficultyEntries[MAX_DIFFICULTY - 1]
private

Referenced by CheckCreatureTemplate().

◆ _hiPetNumber

uint32 ObjectMgr::_hiPetNumber
private

Referenced by GeneratePetNumber(), and LoadPetNumber().

◆ _hiPetNumberMutex

std::mutex ObjectMgr::_hiPetNumberMutex
private

Referenced by GeneratePetNumber().

◆ _instanceTemplateStore

InstanceTemplateContainer ObjectMgr::_instanceTemplateStore
private

◆ _itemLocaleStore

ItemLocaleContainer ObjectMgr::_itemLocaleStore
private

Referenced by GetItemLocale(), and LoadItemLocales().

◆ _itemSetNameLocaleStore

ItemSetNameLocaleContainer ObjectMgr::_itemSetNameLocaleStore
private

◆ _itemSetNameStore

ItemSetNameContainer ObjectMgr::_itemSetNameStore
private

◆ _itemTemplateStore

ItemTemplateContainer ObjectMgr::_itemTemplateStore
private

◆ _itemTemplateStoreFast

std::vector<ItemTemplate*> ObjectMgr::_itemTemplateStoreFast
private

◆ _linkedRespawnStore

LinkedRespawnContainer ObjectMgr::_linkedRespawnStore
private

◆ _mailId

uint32 ObjectMgr::_mailId
private

Referenced by GenerateMailID(), and SetHighestGuids().

◆ _mailIdMutex

std::mutex ObjectMgr::_mailIdMutex
private

Referenced by GenerateMailID().

◆ _mailLevelRewardStore

MailLevelRewardContainer ObjectMgr::_mailLevelRewardStore
private

◆ _mapObjectGuidsStore

◆ _moduleStringStore

ModuleStringContainer ObjectMgr::_moduleStringStore
private

◆ _npcTextLocaleStore

NpcTextLocaleContainer ObjectMgr::_npcTextLocaleStore
private

◆ _pageTextLocaleStore

PageTextLocaleContainer ObjectMgr::_pageTextLocaleStore
private

◆ _pageTextStore

PageTextContainer ObjectMgr::_pageTextStore
private

Referenced by GetPageText(), and LoadPageTexts().

◆ _petHalfLocaleName0

HalfNameContainerLocale ObjectMgr::_petHalfLocaleName0
private

◆ _petHalfLocaleName1

HalfNameContainerLocale ObjectMgr::_petHalfLocaleName1
private

◆ _petHalfName0

HalfNameContainer ObjectMgr::_petHalfName0
private

Referenced by GeneratePetName(), and LoadPetNames().

◆ _petHalfName1

HalfNameContainer ObjectMgr::_petHalfName1
private

Referenced by GeneratePetName(), and LoadPetNames().

◆ _petInfoStore

PetLevelInfoContainer ObjectMgr::_petInfoStore
private

◆ _playerClassInfo

◆ _playerInfo

◆ _playerXPperLevel

PlayerXPperLevel ObjectMgr::_playerXPperLevel
private

Referenced by GetXPForLevel(), and LoadPlayerInfo().

◆ _pointOfInterestLocaleStore

PointOfInterestLocaleContainer ObjectMgr::_pointOfInterestLocaleStore
private

◆ _pointsOfInterestStore

PointOfInterestContainer ObjectMgr::_pointsOfInterestStore
private

◆ _profanityNamesStore

◆ _questAreaTriggerStore

QuestAreaTriggerContainer ObjectMgr::_questAreaTriggerStore
private

◆ _questGreetingStore

QuestGreetingContainer ObjectMgr::_questGreetingStore
private

◆ _questLocaleStore

QuestLocaleContainer ObjectMgr::_questLocaleStore
private

Referenced by GetQuestLocale(), and LoadQuestLocales().

◆ _questMoneyRewards

QuestMoneyRewardStore ObjectMgr::_questMoneyRewards
private

◆ _questOfferRewardLocaleStore

QuestOfferRewardLocaleContainer ObjectMgr::_questOfferRewardLocaleStore
private

◆ _questPOIStore

QuestPOIContainer ObjectMgr::_questPOIStore
private

Referenced by GetQuestPOIVector(), and LoadQuestPOI().

◆ _questRequestItemsLocaleStore

QuestRequestItemsLocaleContainer ObjectMgr::_questRequestItemsLocaleStore
private

◆ _questTemplates

QuestMap ObjectMgr::_questTemplates
private

◆ _questTemplatesFast

std::vector<Quest*> ObjectMgr::_questTemplatesFast
private

Referenced by GetQuestTemplate(), and LoadQuests().

◆ _repOnKillStore

RepOnKillContainer ObjectMgr::_repOnKillStore
private

◆ _repRewardRateStore

RepRewardRateContainer ObjectMgr::_repRewardRateStore
private

◆ _repSpilloverTemplateStore

RepSpilloverTemplateContainer ObjectMgr::_repSpilloverTemplateStore
private

◆ _reservedNamesStore

◆ _scriptNamesStore

ScriptNameContainer ObjectMgr::_scriptNamesStore
private

◆ _serverMailStore

ServerMailContainer ObjectMgr::_serverMailStore
private

◆ _spellClickInfoStore

◆ _spellScriptsStore

SpellScriptsContainer ObjectMgr::_spellScriptsStore
private

◆ _tavernAreaTriggerStore

TavernAreaTriggerContainer ObjectMgr::_tavernAreaTriggerStore
private

◆ _tempSummonDataStore

TempSummonDataContainer ObjectMgr::_tempSummonDataStore
private

Stores temp summon data grouped by summoner's entry, summoner's type and group id.

Referenced by GetSummonGroup(), and LoadTempSummons().

◆ _transportMaps

std::set<uint32> ObjectMgr::_transportMaps
private

◆ _vehicleAccessoryStore

VehicleAccessoryContainer ObjectMgr::_vehicleAccessoryStore
private

◆ _vehicleSeatAddonStore

VehicleSeatAddonContainer ObjectMgr::_vehicleSeatAddonStore
private

◆ _vehicleTemplateAccessoryStore

VehicleAccessoryContainer ObjectMgr::_vehicleTemplateAccessoryStore
private

◆ DBCLocaleIndex

LocaleConstant ObjectMgr::DBCLocaleIndex
private

◆ FactionChangeAchievements

CharacterConversionMap ObjectMgr::FactionChangeAchievements

◆ FactionChangeItems

CharacterConversionMap ObjectMgr::FactionChangeItems

Referenced by LoadFactionChangeItems().

◆ FactionChangeQuests

CharacterConversionMap ObjectMgr::FactionChangeQuests

Referenced by LoadFactionChangeQuests().

◆ FactionChangeReputation

CharacterConversionMap ObjectMgr::FactionChangeReputation

◆ FactionChangeSpells

CharacterConversionMap ObjectMgr::FactionChangeSpells

Referenced by LoadFactionChangeSpells().

◆ FactionChangeTitles

CharacterConversionMap ObjectMgr::FactionChangeTitles

Referenced by LoadFactionChangeTitles().

◆ GameobjectInstanceSavedStateList

std::vector<GameobjectInstanceSavedState> ObjectMgr::GameobjectInstanceSavedStateList
private

◆ mExclusiveQuestGroups

ExclusiveQuestGroups ObjectMgr::mExclusiveQuestGroups

Referenced by LoadQuests().