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::unordered_map< ObjectGuid::LowType, std::vector< float > > CreatureSparringContainer
 
typedef std::multimap< int32, uint32ExclusiveQuestGroups
 
typedef std::pair< ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator > ExclusiveQuestGroupsBounds
 
typedef std::unordered_map< uint32, std::vector< uint32 > > BreadcrumbQuestMap
 

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
 
uint32 GetModelForTotem (SummonSlot totemSlot, Races race) const
 
uint32 GetModelForShapeshift (ShapeshiftForm form, Player *player) 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)
 
uint32 GetNearestTaxiNode (WorldLocation const &loc, 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.
 
void LoadCreatureTemplateModels ()
 
void LoadCreatureTemplateAddons ()
 
void LoadCreatureTemplateResistances ()
 
void LoadCreatureTemplateSpells ()
 
void LoadCreatureCustomIDs ()
 Load config option Creatures.CustomIDs into Store.
 
void CheckCreatureTemplate (CreatureTemplate const *cInfo)
 
void CheckCreatureMovement (char const *table, uint64 id, CreatureMovementData &creatureMovement)
 
void LoadGameObjectQuestItems ()
 
void LoadCreatureQuestItems ()
 
void LoadTempSummons ()
 
void LoadGameObjectSummons ()
 
void LoadSpawnGroupTemplates ()
 
void LoadSpawnGroups ()
 
void LoadCreatures ()
 
void LoadCreatureSparring ()
 
void LoadLinkedRespawn ()
 
bool SetCreatureLinkedRespawn (ObjectGuid::LowType guid, ObjectGuid::LowType linkedGuid)
 
void LoadCreatureAddons ()
 
void LoadGameObjectAddons ()
 
void LoadCreatureModelInfo ()
 
void LoadPlayerTotemModels ()
 
void LoadPlayerShapeshiftModels ()
 
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 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 LoadTrainers ()
 
void LoadCreatureDefaultTrainers ()
 
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 ()
 
std::vector< uint32 > const * GetBreadcrumbsForQuest (uint32 questId) const
 
MailLevelReward const * GetMailLevelReward (uint32 level, uint32 raceMask)
 
CellObjectGuids const & GetGridObjectGuids (uint16 mapid, uint8 spawnMode, uint32 gridId)
 
CellObjectGuidsMap const & GetMapObjectGuids (uint16 mapid, uint8 spawnMode)
 
std::vector< TempSummonData > const * GetSummonGroup (uint32 summonerId, SummonerType summonerType, uint8 group) const
 
std::vector< GameObjectSummonData > const * GetGameObjectSummonGroup (uint32 summonerId, SummonerType summonerType, uint8 group) const
 
BroadcastText const * GetBroadcastText (uint32 id) const
 
CreatureDataContainer const & GetAllCreatureData () const
 
CreatureData const * GetCreatureData (ObjectGuid::LowType spawnId) const
 
CreatureSparringContainer const & GetSparringData () const
 
CreatureDataNewOrExistCreatureData (ObjectGuid::LowType spawnId)
 
CreatureData const * LoadCreatureDataFromDB (ObjectGuid::LowType spawnId)
 Loads a single creature spawn entry from the database into the data store cache.
 
void DeleteCreatureData (ObjectGuid::LowType spawnId)
 
ObjectGuid GetLinkedRespawnGuid (ObjectGuid guid) const
 
GameObjectDataContainer const & GetAllGOData () const
 
GameObjectData const * GetGameObjectData (ObjectGuid::LowType spawnId) const
 
SpawnData const * GetSpawnData (SpawnObjectType type, ObjectGuid::LowType spawnId) const
 
SpawnGroupTemplateData const * GetSpawnGroupData (uint32 groupId) const
 
SpawnGroupTemplateData const * GetDefaultSpawnGroup () const
 
SpawnGroupTemplateData const * GetLegacySpawnGroup () const
 
std::pair< SpawnGroupLinkContainer::const_iterator, SpawnGroupLinkContainer::const_iterator > GetSpawnDataForGroup (uint32 groupId) const
 
void OnDeleteSpawnData (SpawnData const *data)
 
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)
 
GameObjectData const * LoadGameObjectDataFromDB (ObjectGuid::LowType spawnId)
 Loads a single gameobject spawn entry from the database into the data store cache.
 
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
 
std::string GetAcoreString (uint32 entry, LocaleConstant locale) const
 
std::string 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)
 
ObjectGuid::LowType 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)
 
ObjectGuid::LowType 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)
 
Trainer::TrainerGetTrainer (uint32 creatureId)
 
std::vector< Trainer::Trainer const * > const & GetClassTrainers (uint8 classId) const
 
VendorItemData const * GetNpcVendorItemList (uint32 entry) const
 
void AddVendorItem (uint32 entry, uint32 item, uint32 maxcount, uint32 incrtime, uint32 extendedCost, bool persist=true)
 
bool RemoveVendorItem (uint32 entry, uint32 item, bool persist=true)
 
bool IsVendorItemValid (uint32 vendor_entry, uint32 item, uint32 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
 

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
 
BreadcrumbQuestMap _breadcrumbsForQuest
 
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
 
CreatureSparringContainer _creatureSparringStore
 
MailLevelRewardContainer _mailLevelRewardStore
 
CreatureBaseStatsContainer _creatureBaseStatsStore
 
PetLevelInfoContainer _petInfoStore
 
PlayerClassInfo_playerClassInfo [MAX_CLASSES]
 
std::vector< std::vector< PlayerInfo * > > _playerInfo
 
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
 
SpawnGroupDataContainer _spawnGroupDataStore
 
SpawnGroupLinkContainer _spawnGroupMapStore
 
GameObjectLocaleContainer _gameObjectLocaleStore
 
GameObjectTemplateContainer _gameObjectTemplateStore
 
GameObjectTemplateAddonContainer _gameObjectTemplateAddonStore
 
TempSummonDataContainer _tempSummonDataStore
 Stores temp summon data grouped by summoner's entry, summoner's type and group id.
 
GameObjectSummonDataContainer _goSummonDataStore
 Stores gameobject summon data grouped by summoner's entry, summoner's type and group id.
 
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
 
std::unordered_map< uint32, Trainer::Trainer_trainers
 
std::unordered_map< uint8, std::vector< Trainer::Trainer const * > > _classTrainers
 
std::unordered_map< uint32, uint32_creatureDefaultTrainers
 
std::set< uint32_difficultyEntries [MAX_DIFFICULTY - 1]
 
std::set< uint32_hasDifficultyEntries [MAX_DIFFICULTY - 1]
 
std::set< uint32_transportMaps
 
PlayerTotemModelMap _playerTotemModel
 
PlayerShapeshiftModelMap _playerShapeshiftModel
 
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

◆ BreadcrumbQuestMap

typedef std::unordered_map<uint32, std::vector<uint32> > ObjectMgr::BreadcrumbQuestMap

◆ CharacterConversionMap

◆ CreatureSparringContainer

typedef std::unordered_map<ObjectGuid::LowType, std::vector<float> > ObjectMgr::CreatureSparringContainer

◆ 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 
1699 {
1701 CREATURE_TO_GO, // Creature is dependant on GO
1702 GO_TO_GO,
1703 GO_TO_CREATURE, // GO is dependant on creature
1704 };
@ CREATURE_TO_GO
Definition ObjectMgr.h:1701
@ CREATURE_TO_CREATURE
Definition ObjectMgr.h:1700
@ GO_TO_GO
Definition ObjectMgr.h:1702
@ GO_TO_CREATURE
Definition ObjectMgr.h:1703

Constructor & Destructor Documentation

◆ ObjectMgr()

ObjectMgr::ObjectMgr ( )
private
300 :
301 _auctionId(1),
303 _mailId(1),
304 _hiPetNumber(1),
308{
309 for (uint8 i = 0; i < MAX_CLASSES; ++i)
310 {
311 _playerClassInfo[i] = nullptr;
312 }
313
314 // Initialize default spawn groups
317}
@ LOCALE_enUS
Definition Common.h:118
std::uint8_t uint8
Definition Define.h:109
#define MAX_CLASSES
Definition SharedDefines.h:140
SpawnGroupFlags
Definition SpawnData.h:42
@ SPAWNGROUP_FLAG_COMPATIBILITY_MODE
Definition SpawnData.h:45
@ SPAWNGROUP_FLAG_SYSTEM
Definition SpawnData.h:44
constexpr uint32 SPAWNGROUP_MAP_UNSET
Definition SpawnData.h:55
SpawnGroupDataContainer _spawnGroupDataStore
Definition ObjectMgr.h:1665
ObjectGuid::LowType _gameObjectSpawnId
Definition ObjectMgr.h:1535
uint32 _mailId
Definition ObjectMgr.h:1529
ObjectGuid::LowType _creatureSpawnId
Definition ObjectMgr.h:1534
LocaleConstant DBCLocaleIndex
Definition ObjectMgr.h:1602
PlayerClassInfo * _playerClassInfo[MAX_CLASSES]
Definition ObjectMgr.h:1622
uint64 _equipmentSetGuid
Definition ObjectMgr.h:1528
uint32 _auctionId
Definition ObjectMgr.h:1527
uint32 _hiPetNumber
Definition ObjectMgr.h:1531

References _playerClassInfo, _spawnGroupDataStore, MAX_CLASSES, SPAWNGROUP_FLAG_COMPATIBILITY_MODE, SPAWNGROUP_FLAG_SYSTEM, and SPAWNGROUP_MAP_UNSET.

◆ ~ObjectMgr()

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

References _accessRequirementStore, _cacheVendorItemStore, _dungeonEncounterStore, _petInfoStore, _playerClassInfo, _playerInfo, _questTemplates, PlayerClassInfo::levelInfo, MAX_CLASSES, and sRaceMgr.

Member Function Documentation

◆ AddCreatureToGrid()

void ObjectMgr::AddCreatureToGrid ( ObjectGuid::LowType  guid,
CreatureData const *  data 
)
2721{
2722 uint8 mask = data->spawnMask;
2723 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2724 {
2725 if (mask & 1)
2726 {
2727 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2728 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2729 cell_guids.creatures.insert(guid);
2730 }
2731 }
2732}
uint32 MAKE_PAIR32(uint16 l, uint16 h)
Definition ObjectDefines.h:88
MapObjectGuids _mapObjectGuidsStore
Definition ObjectMgr.h:1647
GridCoord ComputeGridCoord(float x, float y)
Definition GridDefines.h:185
Definition ObjectMgr.h:479
CellGuidSet creatures
Definition ObjectMgr.h:480
Definition GridDefines.h:88
uint32 GetId() const
Definition GridDefines.h:150

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

Referenced by AddCreData(), and LoadCreatures().

◆ AddCreData()

ObjectGuid::LowType ObjectMgr::AddCreData ( uint32  entry,
uint32  map,
float  x,
float  y,
float  z,
float  o,
uint32  spawntimedelay = 0 
)
2802{
2803 CreatureTemplate const* cInfo = GetCreatureTemplate(entry);
2804 if (!cInfo)
2805 return 0;
2806
2807 uint32 level = cInfo->minlevel == cInfo->maxlevel ? cInfo->minlevel : urand(cInfo->minlevel, cInfo->maxlevel); // Only used for extracting creature base stats
2808 CreatureBaseStats const* stats = GetCreatureBaseStats(level, cInfo->unit_class);
2809 Map* map = sMapMgr->CreateBaseMap(mapId);
2810 if (!map)
2811 return 0;
2812
2814 CreatureData& data = NewOrExistCreatureData(spawnId);
2815 data.spawnId = spawnId;
2816 data.spawnMask = spawnId;
2817 data.id1 = entry;
2818 data.id2 = 0;
2819 data.id3 = 0;
2820 data.mapid = mapId;
2821 data.displayid = 0;
2822 data.equipmentId = 0;
2823 data.posX = x;
2824 data.posY = y;
2825 data.posZ = z;
2826 data.orientation = o;
2827 data.spawntimesecs = spawntimedelay;
2828 data.wander_distance = 0;
2829 data.currentwaypoint = 0;
2830 data.curhealth = stats->GenerateHealth(cInfo);
2831 data.curmana = stats->GenerateMana(cInfo);
2832 data.movementType = cInfo->MovementType;
2833 data.spawnMask = 1;
2835 data.dbData = false;
2836 data.npcflag = cInfo->npcflag;
2837 data.unit_flags = cInfo->unit_flags;
2838 data.dynamicflags = cInfo->dynamicflags;
2839
2840 AddCreatureToGrid(spawnId, &data);
2841
2842 // Spawn if necessary (loaded grids only)
2843 if (!map->Instanceable() && map->IsGridLoaded(x, y))
2844 {
2845 Creature* creature = new Creature();
2846 if (!creature->LoadCreatureFromDB(spawnId, map, true, true))
2847 {
2848 LOG_ERROR("sql.sql", "AddCreature: Cannot add creature entry {} to map", entry);
2849 delete creature;
2850 return 0;
2851 }
2852 }
2853
2854 return spawnId;
2855}
std::uint32_t uint32
Definition Define.h:107
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
#define sMapMgr
Definition MapMgr.h:220
@ PHASEMASK_NORMAL
Definition Object.h:63
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
Definition Creature.h:47
bool LoadCreatureFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true, bool allowDuplicate=false)
Definition Creature.cpp:1679
Definition Map.h:166
bool IsGridLoaded(GridCoord const &gridCoord) const
Definition Map.cpp:203
bool Instanceable() const
Definition Map.h:296
uint32 LowType
Definition ObjectGuid.h:122
CreatureBaseStats const * GetCreatureBaseStats(uint8 level, uint8 unitClass)
Definition ObjectMgr.cpp:10644
void AddCreatureToGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition ObjectMgr.cpp:2720
ObjectGuid::LowType GenerateCreatureSpawnId()
Definition ObjectMgr.cpp:7716
CreatureData & NewOrExistCreatureData(ObjectGuid::LowType spawnId)
Definition ObjectMgr.h:1244
CreatureTemplate const * GetCreatureTemplate(uint32 entry)
Definition ObjectMgr.cpp:11009
Definition CreatureData.h:298
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:378
uint32 spawntimesecs
Definition CreatureData.h:377
uint32 dynamicflags
Definition CreatureData.h:385
uint32 npcflag
Definition CreatureData.h:383
uint32 displayid
Definition CreatureData.h:375
uint8 movementType
Definition CreatureData.h:382
uint32 unit_flags
Definition CreatureData.h:384
uint32 id2
Definition CreatureData.h:373
uint32 curhealth
Definition CreatureData.h:380
uint32 curmana
Definition CreatureData.h:381
uint32 id3
Definition CreatureData.h:374
int8 equipmentId
Definition CreatureData.h:376
uint32 currentwaypoint
Definition CreatureData.h:379
uint32 id1
Definition CreatureData.h:372
Definition CreatureData.h:187
uint32 unit_flags
Definition CreatureData.h:214
uint8 minlevel
Definition CreatureData.h:196
uint8 maxlevel
Definition CreatureData.h:197
uint32 MovementType
Definition CreatureData.h:230
uint32 npcflag
Definition CreatureData.h:200
uint32 unit_class
Definition CreatureData.h:213
uint32 dynamicflags
Definition CreatureData.h:216
float posX
Definition SpawnData.h:71
float posY
Definition SpawnData.h:72
uint32 phaseMask
Definition SpawnData.h:70
uint8 spawnMask
Definition SpawnData.h:75
bool dbData
Definition SpawnData.h:77
ObjectGuid::LowType spawnId
Definition SpawnData.h:68
float orientation
Definition SpawnData.h:74
uint16 mapid
Definition SpawnData.h:69
float posZ
Definition SpawnData.h:73

References AddCreatureToGrid(), CreatureData::curhealth, CreatureData::curmana, CreatureData::currentwaypoint, SpawnData::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::IsGridLoaded(), Creature::LoadCreatureFromDB(), LOG_ERROR, SpawnData::mapid, CreatureTemplate::maxlevel, CreatureTemplate::minlevel, CreatureTemplate::MovementType, CreatureData::movementType, NewOrExistCreatureData(), CreatureTemplate::npcflag, CreatureData::npcflag, SpawnData::orientation, SpawnData::phaseMask, PHASEMASK_NORMAL, SpawnData::posX, SpawnData::posY, SpawnData::posZ, sMapMgr, SpawnData::spawnId, SpawnData::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 
)
3173{
3174 uint8 mask = data->spawnMask;
3175 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
3176 {
3177 if (mask & 1)
3178 {
3179 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
3180 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
3181 cell_guids.gameobjects.insert(guid);
3182 }
3183 }
3184}
CellGuidSet gameobjects
Definition ObjectMgr.h:481

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

Referenced by AddGOData(), and LoadGameobjects().

◆ AddGameTele()

bool ObjectMgr::AddGameTele ( GameTele data)
9814{
9815 // find max id
9816 uint32 new_id = 0;
9817 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9818 if (itr->first > new_id)
9819 new_id = itr->first;
9820
9821 // use next
9822 ++new_id;
9823
9824 if (!Utf8toWStr(tele.name, tele.wnameLow))
9825 return false;
9826
9827 wstrToLower(tele.wnameLow);
9828
9829 _gameTeleStore[new_id] = tele;
9830
9832
9833 stmt->SetData(0, new_id);
9834 stmt->SetData(1, tele.position_x);
9835 stmt->SetData(2, tele.position_y);
9836 stmt->SetData(3, tele.position_z);
9837 stmt->SetData(4, tele.orientation);
9838 stmt->SetData(5, uint16(tele.mapId));
9839 stmt->SetData(6, tele.name);
9840
9841 WorldDatabase.Execute(stmt);
9842
9843 return true;
9844}
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition DatabaseEnv.cpp:20
std::uint16_t uint16
Definition Define.h:108
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
@ WORLD_INS_GAME_TELE
Definition WorldDatabase.h:41
GameTeleContainer _gameTeleStore
Definition ObjectMgr.h:1590
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157

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

ObjectGuid::LowType 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 
)
2749{
2750 GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
2751 if (!goinfo)
2752 return 0;
2753
2754 Map* map = sMapMgr->CreateBaseMap(mapId);
2755 if (!map)
2756 return 0;
2757
2759
2760 GameObjectData& data = NewGOData(spawnId);
2761 data.spawnId = spawnId;
2762 data.id = entry;
2763 data.mapid = mapId;
2764 data.posX = x;
2765 data.posY = y;
2766 data.posZ = z;
2767 data.orientation = o;
2768 data.rotation.x = rotation0;
2769 data.rotation.y = rotation1;
2770 data.rotation.z = rotation2;
2771 data.rotation.w = rotation3;
2772 data.spawntimesecs = spawntimedelay;
2773 data.animprogress = 100;
2774 data.spawnMask = 1;
2775 data.go_state = GO_STATE_READY;
2777 data.artKit = goinfo->type == GAMEOBJECT_TYPE_CAPTURE_POINT ? 21 : 0;
2778 data.dbData = false;
2779 data.spawnGroupId = 0;
2780
2781 AddGameobjectToGrid(spawnId, &data);
2782
2783 // Spawn if necessary (loaded grids only)
2784 // We use spawn coords to spawn
2785 if (!map->Instanceable() && map->IsGridLoaded(x, y))
2786 {
2788 if (!go->LoadGameObjectFromDB(spawnId, map))
2789 {
2790 LOG_ERROR("sql.sql", "AddGOData: cannot add gameobject entry {} to map", entry);
2791 delete go;
2792 return 0;
2793 }
2794 }
2795
2796 LOG_DEBUG("maps", "AddGOData: spawnId {} entry {} map {} x {} y {} z {} o {}", spawnId, entry, mapId, x, y, z, o);
2797
2798 return spawnId;
2799}
@ GO_STATE_READY
Definition GameObjectData.h:709
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
@ GAMEOBJECT_TYPE_CAPTURE_POINT
Definition SharedDefines.h:1593
Definition GameObject.h:120
virtual bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition GameObject.cpp:1099
void AddGameobjectToGrid(ObjectGuid::LowType guid, GameObjectData const *data)
Definition ObjectMgr.cpp:3172
GameObjectTemplate const * GetGameObjectTemplate(uint32 entry)
Definition ObjectMgr.cpp:10985
ObjectGuid::LowType GenerateGameObjectSpawnId()
Definition ObjectMgr.cpp:7726
GameObjectData & NewGOData(ObjectGuid::LowType guid)
Definition ObjectMgr.h:1359
bool IsGameObjectStaticTransport(uint32 entry)
Definition ObjectMgr.cpp:10994
Definition Transport.h:115
Definition GameObjectData.h:715
uint8 artKit
Definition GameObjectData.h:722
int32 spawntimesecs
Definition GameObjectData.h:719
G3D::Quat rotation
Definition GameObjectData.h:718
uint32 animprogress
Definition GameObjectData.h:720
uint32 id
Definition GameObjectData.h:717
GOState go_state
Definition GameObjectData.h:721
Definition GameObjectData.h:32
uint32 type
Definition GameObjectData.h:34
uint32 spawnGroupId
Definition SpawnData.h:78

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

◆ AddLocaleString()

◆ AddProfanityPlayerName()

void ObjectMgr::AddProfanityPlayerName ( std::string const &  name)
9181{
9182 if (!IsProfanityName(name))
9183 {
9184 std::wstring wstr;
9185 if (!Utf8toWStr(name, wstr))
9186 {
9187 LOG_ERROR("server", "Could not add invalid name to profanity player names: {}", name);
9188 return;
9189 }
9190 wstrToLower(wstr);
9191
9192 _profanityNamesStore.insert(wstr);
9193
9195 stmt->SetData(0, name);
9196 CharacterDatabase.Execute(stmt);
9197 }
9198}
@ CHAR_INS_PROFANITY_PLAYER_NAME
Definition CharacterDatabase.h:523
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
ProfanityNamesContainer _profanityNamesStore
Definition ObjectMgr.h:1588
bool IsProfanityName(std::string_view name) const
Definition ObjectMgr.cpp:9165

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

◆ AddReservedPlayerName()

void ObjectMgr::AddReservedPlayerName ( std::string const &  name)
9078{
9079 if (!IsReservedName(name))
9080 {
9081 std::wstring wstr;
9082 if (!Utf8toWStr(name, wstr))
9083 {
9084 LOG_ERROR("server", "Could not add invalid name to reserved player names: {}", name);
9085 return;
9086 }
9087 wstrToLower(wstr);
9088
9089 _reservedNamesStore.insert(wstr);
9090
9092 stmt->SetData(0, name);
9093 CharacterDatabase.Execute(stmt);
9094 }
9095}
@ CHAR_INS_RESERVED_PLAYER_NAME
Definition CharacterDatabase.h:522
bool IsReservedName(std::string_view name) const
Definition ObjectMgr.cpp:9062
ReservedNamesContainer _reservedNamesStore
Definition ObjectMgr.h:1584

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

◆ AddVendorItem()

void ObjectMgr::AddVendorItem ( uint32  entry,
uint32  item,
uint32  maxcount,
uint32  incrtime,
uint32  extendedCost,
bool  persist = true 
)
10322{
10323 VendorItemData& vList = _cacheVendorItemStore[entry];
10324 vList.AddItem(item, maxcount, incrtime, extendedCost);
10325
10326 if (persist)
10327 {
10329
10330 stmt->SetData(0, entry);
10331 stmt->SetData(1, item);
10332 stmt->SetData(2, maxcount);
10333 stmt->SetData(3, incrtime);
10334 stmt->SetData(4, extendedCost);
10335
10336 WorldDatabase.Execute(stmt);
10337 }
10338}
@ WORLD_INS_NPC_VENDOR
Definition WorldDatabase.h:43
Definition CreatureData.h:460
void AddItem(uint32 item, int32 maxcount, uint32 ptime, uint32 ExtendedCost)
Definition CreatureData.h:472

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
4943{
4944 // base data (last known level)
4945 *info = _playerInfo[race][_class]->levelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1];
4946
4947 // if conversion from uint32 to uint8 causes unexpected behaviour, change lvl to uint32
4948 for (uint8 lvl = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1; lvl < level; ++lvl)
4949 {
4950 switch (_class)
4951 {
4952 case CLASS_WARRIOR:
4953 info->stats[STAT_STRENGTH] += (lvl > 23 ? 2 : (lvl > 1 ? 1 : 0));
4954 info->stats[STAT_STAMINA] += (lvl > 23 ? 2 : (lvl > 1 ? 1 : 0));
4955 info->stats[STAT_AGILITY] += (lvl > 36 ? 1 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4956 info->stats[STAT_INTELLECT] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4957 info->stats[STAT_SPIRIT] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4958 break;
4959 case CLASS_PALADIN:
4960 info->stats[STAT_STRENGTH] += (lvl > 3 ? 1 : 0);
4961 info->stats[STAT_STAMINA] += (lvl > 33 ? 2 : (lvl > 1 ? 1 : 0));
4962 info->stats[STAT_AGILITY] += (lvl > 38 ? 1 : (lvl > 7 && !(lvl % 2) ? 1 : 0));
4963 info->stats[STAT_INTELLECT] += (lvl > 6 && (lvl % 2) ? 1 : 0);
4964 info->stats[STAT_SPIRIT] += (lvl > 7 ? 1 : 0);
4965 break;
4966 case CLASS_HUNTER:
4967 info->stats[STAT_STRENGTH] += (lvl > 4 ? 1 : 0);
4968 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4969 info->stats[STAT_AGILITY] += (lvl > 33 ? 2 : (lvl > 1 ? 1 : 0));
4970 info->stats[STAT_INTELLECT] += (lvl > 8 && (lvl % 2) ? 1 : 0);
4971 info->stats[STAT_SPIRIT] += (lvl > 38 ? 1 : (lvl > 9 && !(lvl % 2) ? 1 : 0));
4972 break;
4973 case CLASS_ROGUE:
4974 info->stats[STAT_STRENGTH] += (lvl > 5 ? 1 : 0);
4975 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4976 info->stats[STAT_AGILITY] += (lvl > 16 ? 2 : (lvl > 1 ? 1 : 0));
4977 info->stats[STAT_INTELLECT] += (lvl > 8 && !(lvl % 2) ? 1 : 0);
4978 info->stats[STAT_SPIRIT] += (lvl > 38 ? 1 : (lvl > 9 && !(lvl % 2) ? 1 : 0));
4979 break;
4980 case CLASS_PRIEST:
4981 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4982 info->stats[STAT_STAMINA] += (lvl > 5 ? 1 : 0);
4983 info->stats[STAT_AGILITY] += (lvl > 38 ? 1 : (lvl > 8 && (lvl % 2) ? 1 : 0));
4984 info->stats[STAT_INTELLECT] += (lvl > 22 ? 2 : (lvl > 1 ? 1 : 0));
4985 info->stats[STAT_SPIRIT] += (lvl > 3 ? 1 : 0);
4986 break;
4987 case CLASS_SHAMAN:
4988 info->stats[STAT_STRENGTH] += (lvl > 34 ? 1 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4989 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4990 info->stats[STAT_AGILITY] += (lvl > 7 && !(lvl % 2) ? 1 : 0);
4991 info->stats[STAT_INTELLECT] += (lvl > 5 ? 1 : 0);
4992 info->stats[STAT_SPIRIT] += (lvl > 4 ? 1 : 0);
4993 break;
4994 case CLASS_MAGE:
4995 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4996 info->stats[STAT_STAMINA] += (lvl > 5 ? 1 : 0);
4997 info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4998 info->stats[STAT_INTELLECT] += (lvl > 24 ? 2 : (lvl > 1 ? 1 : 0));
4999 info->stats[STAT_SPIRIT] += (lvl > 33 ? 2 : (lvl > 2 ? 1 : 0));
5000 break;
5001 case CLASS_WARLOCK:
5002 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
5003 info->stats[STAT_STAMINA] += (lvl > 38 ? 2 : (lvl > 3 ? 1 : 0));
5004 info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
5005 info->stats[STAT_INTELLECT] += (lvl > 33 ? 2 : (lvl > 2 ? 1 : 0));
5006 info->stats[STAT_SPIRIT] += (lvl > 38 ? 2 : (lvl > 3 ? 1 : 0));
5007 break;
5008 case CLASS_DRUID:
5009 info->stats[STAT_STRENGTH] += (lvl > 38 ? 2 : (lvl > 6 && (lvl % 2) ? 1 : 0));
5010 info->stats[STAT_STAMINA] += (lvl > 32 ? 2 : (lvl > 4 ? 1 : 0));
5011 info->stats[STAT_AGILITY] += (lvl > 38 ? 2 : (lvl > 8 && (lvl % 2) ? 1 : 0));
5012 info->stats[STAT_INTELLECT] += (lvl > 38 ? 3 : (lvl > 4 ? 1 : 0));
5013 info->stats[STAT_SPIRIT] += (lvl > 38 ? 3 : (lvl > 5 ? 1 : 0));
5014 }
5015 }
5016}
@ CLASS_HUNTER
Definition SharedDefines.h:128
@ CLASS_DRUID
Definition SharedDefines.h:136
@ CLASS_SHAMAN
Definition SharedDefines.h:132
@ CLASS_PRIEST
Definition SharedDefines.h:130
@ CLASS_WARRIOR
Definition SharedDefines.h:126
@ CLASS_WARLOCK
Definition SharedDefines.h:134
@ CLASS_MAGE
Definition SharedDefines.h:133
@ CLASS_PALADIN
Definition SharedDefines.h:127
@ CLASS_ROGUE
Definition SharedDefines.h:129
@ STAT_SPIRIT
Definition SharedDefines.h:250
@ STAT_INTELLECT
Definition SharedDefines.h:249
@ STAT_AGILITY
Definition SharedDefines.h:247
@ STAT_STRENGTH
Definition SharedDefines.h:246
@ STAT_STAMINA
Definition SharedDefines.h:248
@ CONFIG_MAX_PLAYER_LEVEL
Definition WorldConfig.h:194
#define sWorld
Definition World.h:317

References _playerInfo, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CONFIG_MAX_PLAYER_LEVEL, 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 
)
9633{
9634 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
9635 if (!fArea)
9636 {
9637 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
9638 return;
9639 }
9640
9641 _fishingBaseForAreaStore[entry] = skill;
9642
9643 LOG_INFO("server.loading", ">> Fishing base skill level of area {} changed to {}", entry, skill);
9644 LOG_INFO("server.loading", " ");
9645}
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
#define LOG_INFO(filterType__,...)
Definition Log.h:153
FishingBaseSkillContainer _fishingBaseForAreaStore
Definition ObjectMgr.h:1635
Definition DBCStructure.h:519

References _fishingBaseForAreaStore, LOG_ERROR, LOG_INFO, and sAreaTableStore.

◆ CheckCreatureMovement()

void ObjectMgr::CheckCreatureMovement ( char const *  table,
uint64  id,
CreatureMovementData creatureMovement 
)
1236{
1237 if (creatureMovement.Ground >= CreatureGroundMovementType::Max)
1238 {
1239 LOG_ERROR("sql.sql", "`{}`.`Ground` wrong value ({}) for Id {}, setting to Run.", table, uint32(creatureMovement.Ground), id);
1240 creatureMovement.Ground = CreatureGroundMovementType::Run;
1241 }
1242
1243 if (creatureMovement.Flight >= CreatureFlightMovementType::Max)
1244 {
1245 LOG_ERROR("sql.sql", "`{}`.`Flight` wrong value ({}) for Id {}, setting to None.", table, uint32(creatureMovement.Flight), id);
1246 creatureMovement.Flight = CreatureFlightMovementType::None;
1247 }
1248
1249 if (creatureMovement.Chase >= CreatureChaseMovementType::Max)
1250 {
1251 LOG_ERROR("sql.sql", "`{}`.`Chase` wrong value ({}) for Id {}, setting to Run.", table, uint32(creatureMovement.Chase), id);
1252 creatureMovement.Chase = CreatureChaseMovementType::Run;
1253 }
1254
1255 if (creatureMovement.Random >= CreatureRandomMovementType::Max)
1256 {
1257 LOG_ERROR("sql.sql", "`{}`.`Random` wrong value ({}) for Id {}, setting to Walk.", table, uint32(creatureMovement.Random), id);
1258 creatureMovement.Random = CreatureRandomMovementType::Walk;
1259 }
1260}
CreatureRandomMovementType Random
Definition CreatureData.h:128
CreatureFlightMovementType Flight
Definition CreatureData.h:124
CreatureChaseMovementType Chase
Definition CreatureData.h:127
CreatureGroundMovementType Ground
Definition CreatureData.h:123

References CreatureMovementData::Chase, CreatureMovementData::Flight, CreatureMovementData::Ground, LOG_ERROR, Max, None, CreatureMovementData::Random, Run, and Walk.

Referenced by CheckCreatureTemplate(), and LoadCreatureMovementOverrides().

◆ CheckCreatureTemplate()

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

References _creatureCustomIDsStore, _difficultyEntries, Creature::_GetDamageMod(), _hasDifficultyEntries, CreatureTemplate::AIName, BASE_ATTACK_TIME, CreatureTemplate::BaseAttackTime, CheckCreatureMovement(), CLASS_WARRIOR, CLASSMASK_ALL_CREATURES, CREATURE_FAMILY_NOT_SPECIFIED, 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_DEBUG, LOG_ERROR, LOG_INFO, MAX_CREATURE_SPELLS, MAX_DB_MOTION_TYPE, MAX_DIFFICULTY, MAX_EXPANSIONS, MAX_KILL_CREDIT, MAX_SPELL_SCHOOL, CreatureTemplate::Models, CreatureTemplate::Movement, CreatureTemplate::MovementType, CreatureTemplate::npcflag, CreatureTemplate::PetSpellDataId, CreatureModel::Probability, 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::type, CreatureTemplate::unit_class, UNIT_NPC_FLAG_GOSSIP, and CreatureTemplate::VehicleId.

Referenced by LoadCreatureTemplates().

◆ CheckDeclinedNames()

bool ObjectMgr::CheckDeclinedNames ( std::wstring  w_ownname,
DeclinedName const &  names 
)
static
9648{
9649 // get main part of the name
9650 std::wstring mainpart = GetMainPartOfName(w_ownname, 0);
9651 // prepare flags
9652 bool x = true;
9653 bool y = true;
9654
9655 // check declined names
9656 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
9657 {
9658 std::wstring wname;
9659 if (!Utf8toWStr(names.name[i], wname))
9660 return false;
9661
9662 if (mainpart != GetMainPartOfName(wname, i + 1))
9663 x = false;
9664
9665 if (w_ownname != wname)
9666 y = false;
9667 }
9668 return (x || y);
9669}
#define MAX_DECLINED_NAME_CASES
Definition Unit.h:546
std::wstring GetMainPartOfName(std::wstring const &wname, uint32_t declension)
Definition Util.cpp:386

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
9353{
9354 std::wstring wname;
9355 if (!Utf8toWStr(name, wname))
9356 return PET_NAME_INVALID;
9357
9358 if (wname.size() > MAX_PET_NAME)
9359 return PET_NAME_TOO_LONG;
9360
9361 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PET_NAME);
9362 if (wname.size() < minName)
9363 return PET_NAME_TOO_SHORT;
9364
9365 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PET_NAMES);
9366 if (!isValidString(wname, strictMask, false))
9368
9369 // Check Reserved Name
9370 if (sObjectMgr->IsReservedName(name))
9371 return PET_NAME_RESERVED;
9372
9373 // Check Profanity Name
9374 if (sObjectMgr->IsProfanityName(name))
9375 return PET_NAME_PROFANE;
9376
9377 return PET_NAME_SUCCESS;
9378}
bool isValidString(std::wstring wstr, uint32 strictMask, bool numericOrSpace, bool create=false)
Definition ObjectMgr.cpp:9237
#define sObjectMgr
Definition ObjectMgr.h:1723
#define MAX_PET_NAME
Definition ObjectMgr.h:687
@ PET_NAME_INVALID
Definition SharedDefines.h:3916
@ PET_NAME_RESERVED
Definition SharedDefines.h:3922
@ PET_NAME_SUCCESS
Definition SharedDefines.h:3914
@ PET_NAME_MIXED_LANGUAGES
Definition SharedDefines.h:3920
@ PET_NAME_TOO_SHORT
Definition SharedDefines.h:3918
@ PET_NAME_TOO_LONG
Definition SharedDefines.h:3919
@ PET_NAME_PROFANE
Definition SharedDefines.h:3921
@ CONFIG_STRICT_PET_NAMES
Definition WorldConfig.h:181
@ CONFIG_MIN_PET_NAME
Definition WorldConfig.h:184

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
9274{
9275 std::wstring wname;
9276
9277 // Check for invalid characters
9278 if (!Utf8toWStr(name, wname))
9280
9281 // Check for too long name
9282 if (wname.size() > MAX_PLAYER_NAME)
9283 return CHAR_NAME_TOO_LONG;
9284
9285 // Check for too short name
9286 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PLAYER_NAME);
9287 if (wname.size() < minName)
9288 return CHAR_NAME_TOO_SHORT;
9289
9290 // Check for mixed languages
9291 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PLAYER_NAMES);
9292 if (!isValidString(wname, strictMask, false, create))
9294
9295 // Check for three consecutive letters
9296 wstrToLower(wname);
9297 for (std::size_t i = 2; i < wname.size(); ++i)
9298 if (wname[i] == wname[i - 1] && wname[i] == wname[i - 2])
9300
9301 // Check Reserved Name
9302 if (sObjectMgr->IsReservedName(name))
9303 return CHAR_NAME_RESERVED;
9304
9305 // Check Profanity Name
9306 if (sObjectMgr->IsProfanityName(name))
9307 return CHAR_NAME_PROFANE;
9308
9309 return CHAR_NAME_SUCCESS;
9310}
#define MAX_PLAYER_NAME
Definition ObjectMgr.h:685
@ CHAR_NAME_TOO_SHORT
Definition SharedDefines.h:3671
@ CHAR_NAME_THREE_CONSECUTIVE
Definition SharedDefines.h:3679
@ CHAR_NAME_INVALID_CHARACTER
Definition SharedDefines.h:3673
@ CHAR_NAME_TOO_LONG
Definition SharedDefines.h:3672
@ CHAR_NAME_RESERVED
Definition SharedDefines.h:3676
@ CHAR_NAME_MIXED_LANGUAGES
Definition SharedDefines.h:3674
@ CHAR_NAME_PROFANE
Definition SharedDefines.h:3675
@ CHAR_NAME_SUCCESS
Definition SharedDefines.h:3668
@ CONFIG_STRICT_PLAYER_NAMES
Definition WorldConfig.h:178
@ CONFIG_MIN_PLAYER_NAME
Definition WorldConfig.h:182

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
1660{
1661 npcflag = cinfo->npcflag;
1662 unit_flags = cinfo->unit_flags;
1663 dynamicflags = cinfo->dynamicflags;
1664
1665 if (data)
1666 {
1667 if (data->npcflag)
1668 npcflag = data->npcflag;
1669
1670 if (data->unit_flags)
1671 unit_flags = data->unit_flags;
1672
1673 if (data->dynamicflags)
1674 dynamicflags = data->dynamicflags;
1675 }
1676}

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
1645{
1646 // Load creature model (display id)
1647 if (data && data->displayid)
1648 if (CreatureModel const* model = cinfo->GetModelWithDisplayId(data->displayid))
1649 return model;
1650
1651 if (!cinfo->HasFlagsExtra(CREATURE_FLAG_EXTRA_TRIGGER))
1652 if (CreatureModel const* model = cinfo->GetRandomValidModel())
1653 return model;
1654
1655 // Triggers by default receive the invisible model
1656 return cinfo->GetFirstInvisibleModel();
1657}
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition CreatureData.h:53

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

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)
8694{
8695 // remove mapid*cellid -> guid_set map
8696 CreatureData const* data = GetCreatureData(guid);
8697 if (data)
8698 RemoveCreatureFromGrid(guid, data);
8699
8700 _creatureDataStore.erase(guid);
8701}
CreatureDataContainer _creatureDataStore
Definition ObjectMgr.h:1650
void RemoveCreatureFromGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition ObjectMgr.cpp:2734
CreatureData const * GetCreatureData(ObjectGuid::LowType spawnId) const
Definition ObjectMgr.h:1235

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

◆ DeleteGameTele()

bool ObjectMgr::DeleteGameTele ( std::string_view  name)
9847{
9848 // explicit name case
9849 std::wstring wname;
9850 if (!Utf8toWStr(name, wname))
9851 return false;
9852
9853 // converting string that we try to find to lower case
9854 wstrToLower(wname);
9855
9856 for (GameTeleContainer::iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9857 {
9858 if (itr->second.wnameLow == wname)
9859 {
9861
9862 stmt->SetData(0, itr->second.name);
9863
9864 WorldDatabase.Execute(stmt);
9865
9866 _gameTeleStore.erase(itr);
9867 return true;
9868 }
9869 }
9870
9871 return false;
9872}
@ 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)
8704{
8705 // remove mapid*cellid -> guid_set map
8706 GameObjectData const* data = GetGameObjectData(guid);
8707 if (data)
8708 RemoveGameobjectFromGrid(guid, data);
8709
8710 _gameObjectDataStore.erase(guid);
8711}
GameObjectData const * GetGameObjectData(ObjectGuid::LowType spawnId) const
Definition ObjectMgr.h:1270
GameObjectDataContainer _gameObjectDataStore
Definition ObjectMgr.h:1664
void RemoveGameobjectFromGrid(ObjectGuid::LowType guid, GameObjectData const *data)
Definition ObjectMgr.cpp:3186

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

◆ GenerateAuctionID()

uint32 ObjectMgr::GenerateAuctionID ( )
7686{
7687 if (_auctionId >= 0xFFFFFFFE)
7688 {
7689 LOG_ERROR("server.worldserver", "Auctions ids overflow!! Can't continue, shutting down server. ");
7691 }
7692 return _auctionId++;
7693}
static void StopNow(uint8 exitcode)
Definition World.h:188
@ ERROR_EXIT_CODE
Definition World.h:54

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

◆ GenerateCreatureSpawnId()

uint32 ObjectMgr::GenerateCreatureSpawnId ( )
7717{
7718 if (_creatureSpawnId >= uint32(0xFFFFFF))
7719 {
7720 LOG_ERROR("server.worldserver", "Creature spawn id overflow!! Can't continue, shutting down server. Search on forum for TCE00007 for more info.");
7722 }
7723 return _creatureSpawnId++;
7724}

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

Referenced by AddCreData().

◆ GenerateEquipmentSetGuid()

uint64 ObjectMgr::GenerateEquipmentSetGuid ( )
7696{
7697 if (_equipmentSetGuid >= uint64(0xFFFFFFFFFFFFFFFELL))
7698 {
7699 LOG_ERROR("server.worldserver", "EquipmentSet guid overflow!! Can't continue, shutting down server. ");
7701 }
7702 return _equipmentSetGuid++;
7703}
std::uint64_t uint64
Definition Define.h:106

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

◆ GenerateGameObjectSpawnId()

uint32 ObjectMgr::GenerateGameObjectSpawnId ( )
7727{
7728 if (_gameObjectSpawnId >= uint32(0xFFFFFF))
7729 {
7730 LOG_ERROR("server.worldserver", "GameObject spawn id overflow!! Can't continue, shutting down server. Search on forum for TCE00007 for more info. ");
7732 }
7733 return _gameObjectSpawnId++;
7734}

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

Referenced by AddGOData().

◆ GenerateMailID()

uint32 ObjectMgr::GenerateMailID ( )
7706{
7707 if (_mailId >= 0xFFFFFFFE)
7708 {
7709 LOG_ERROR("server.worldserver", "Mail ids overflow!! Can't continue, shutting down server. ");
7711 }
7712 std::lock_guard<std::mutex> guard(_mailIdMutex);
7713 return _mailId++;
7714}
std::mutex _mailIdMutex
Definition ObjectMgr.h:1530

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

◆ GeneratePetName()

std::string ObjectMgr::GeneratePetName ( uint32  entry)
8193{
8194 std::vector<std::string>& list0 = _petHalfName0[entry];
8195 std::vector<std::string>& list1 = _petHalfName1[entry];
8196
8197 if (list0.empty() || list1.empty())
8198 {
8199 CreatureTemplate const* cinfo = GetCreatureTemplate(entry);
8200 char const* petname = GetPetName(cinfo->family, sWorld->GetDefaultDbcLocale());
8201 if (!petname)
8202 return cinfo->Name;
8203
8204 return std::string(petname);
8205 }
8206
8207 return *(list0.begin() + urand(0, list0.size() - 1)) + *(list1.begin() + urand(0, list1.size() - 1));
8208}
char const * GetPetName(uint32 petfamily, uint32 dbclang)
Definition DBCStores.cpp:665
HalfNameContainer _petHalfName1
Definition ObjectMgr.h:1639
HalfNameContainer _petHalfName0
Definition ObjectMgr.h:1638
std::string Name
Definition CreatureData.h:192

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

Referenced by GeneratePetNameLocale().

◆ GeneratePetNameLocale()

std::string ObjectMgr::GeneratePetNameLocale ( uint32  entry,
LocaleConstant  locale 
)
8180{
8181 std::vector<std::string>& list0 = _petHalfLocaleName0[std::make_pair(entry, locale)];
8182 std::vector<std::string>& list1 = _petHalfLocaleName1[std::make_pair(entry, locale)];
8183
8184 if (list0.empty() || list1.empty())
8185 {
8186 return GeneratePetName(entry);
8187 }
8188
8189 return *(list0.begin() + urand(0, list0.size() - 1)) + *(list1.begin() + urand(0, list1.size() - 1));
8190}
HalfNameContainerLocale _petHalfLocaleName0
Definition ObjectMgr.h:1641
HalfNameContainerLocale _petHalfLocaleName1
Definition ObjectMgr.h:1642
std::string GeneratePetName(uint32 entry)
Definition ObjectMgr.cpp:8192

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

◆ GeneratePetNumber()

uint32 ObjectMgr::GeneratePetNumber ( )
8211{
8212 std::lock_guard<std::mutex> guard(_hiPetNumberMutex);
8213 return ++_hiPetNumber;
8214}
std::mutex _hiPetNumberMutex
Definition ObjectMgr.h:1532

References _hiPetNumber, and _hiPetNumberMutex.

◆ GetAccessRequirement()

DungeonProgressionRequirements const * ObjectMgr::GetAccessRequirement ( uint32  mapid,
Difficulty  difficulty 
) const
inline
883 {
884 DungeonProgressionRequirementsContainer::const_iterator itr = _accessRequirementStore.find(mapid);
885 if (itr != _accessRequirementStore.end())
886 {
887 std::unordered_map<uint8, DungeonProgressionRequirements*> difficultiesProgressionRequirements = itr->second;
888 auto difficultiesItr = difficultiesProgressionRequirements.find(difficulty);
889 if (difficultiesItr != difficultiesProgressionRequirements.end())
890 {
891 return difficultiesItr->second;
892 }
893 }
894 return nullptr;
895 }

References _accessRequirementStore.

◆ GetAcoreString() [1/2]

AcoreString const * ObjectMgr::GetAcoreString ( uint32  entry) const
inline
1389 {
1390 AcoreStringContainer::const_iterator itr = _acoreStringStore.find(entry);
1391 if (itr == _acoreStringStore.end())
1392 return nullptr;
1393
1394 return &itr->second;
1395 }
AcoreStringContainer _acoreStringStore
Definition ObjectMgr.h:1686

References _acoreStringStore.

Referenced by GetAcoreString(), and GetAcoreStringForDBCLocale().

◆ GetAcoreString() [2/2]

std::string ObjectMgr::GetAcoreString ( uint32  entry,
LocaleConstant  locale 
) const
9579{
9580 AcoreString const* as = GetAcoreString(entry);
9581 if (as && !as->Content.empty())
9582 {
9583 if (as->Content.size() > std::size_t(locale) && !as->Content[locale].empty())
9584 return as->Content[locale];
9585
9586 return as->Content[DEFAULT_LOCALE];
9587 }
9588
9589 std::string msg = Acore::StringFormat("No entry for acore_string ({}) in DB.", entry);
9590 LOG_ERROR("sql.sql", msg);
9591 return msg;
9592}
#define DEFAULT_LOCALE
Definition Common.h:131
AcoreString const * GetAcoreString(uint32 entry) const
Definition ObjectMgr.h:1388
std::string StringFormat(FormatStringView fmt, Args &&... args)
Default AC string format function.
Definition StringFormat.h:44
Definition ObjectMgr.h:502
std::vector< std::string > Content
Definition ObjectMgr.h:503

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

◆ GetAcoreStringForDBCLocale()

std::string ObjectMgr::GetAcoreStringForDBCLocale ( uint32  entry) const
inline
1397{ return GetAcoreString(entry, DBCLocaleIndex); }

References DBCLocaleIndex, and GetAcoreString().

◆ GetAllAreaTriggerScriptData()

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

References _areaTriggerScriptStore.

◆ GetAllCreatureData()

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

References _creatureDataStore.

◆ GetAllGOData()

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

References _gameObjectDataStore.

◆ GetAreaTrigger()

AreaTrigger const * ObjectMgr::GetAreaTrigger ( uint32  trigger) const
inline
867 {
868 AreaTriggerContainer::const_iterator itr = _areaTriggerStore.find(trigger);
869 if (itr != _areaTriggerStore.end())
870 return &itr->second;
871 return nullptr;
872 }
AreaTriggerContainer _areaTriggerStore
Definition ObjectMgr.h:1561

References _areaTriggerStore.

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

◆ GetAreaTriggerScriptId()

uint32 ObjectMgr::GetAreaTriggerScriptId ( uint32  trigger_id)
9672{
9673 AreaTriggerScriptContainer::const_iterator i = _areaTriggerScriptStore.find(trigger_id);
9674 if (i != _areaTriggerScriptStore.end())
9675 return i->second;
9676 return 0;
9677}

References _areaTriggerScriptStore.

◆ GetAreaTriggerTeleport()

AreaTriggerTeleport const * ObjectMgr::GetAreaTriggerTeleport ( uint32  trigger) const
inline
875 {
876 AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.find(trigger);
877 if (itr != _areaTriggerTeleportStore.end())
878 return &itr->second;
879 return nullptr;
880 }
AreaTriggerTeleportContainer _areaTriggerTeleportStore
Definition ObjectMgr.h:1562

References _areaTriggerTeleportStore.

◆ GetBaseReputationOf()

int32 ObjectMgr::GetBaseReputationOf ( FactionEntry const *  factionEntry,
uint8  race,
uint8  playerClass 
)
9686{
9687 if (!factionEntry)
9688 return 0;
9689
9690 uint32 raceMask = (1 << (race - 1));
9691 uint32 classMask = (1 << (playerClass - 1));
9692
9693 for (int i = 0; i < 4; i++)
9694 {
9695 if ((!factionEntry->BaseRepClassMask[i] ||
9696 factionEntry->BaseRepClassMask[i] & classMask) &&
9697 (!factionEntry->BaseRepRaceMask[i] ||
9698 factionEntry->BaseRepRaceMask[i] & raceMask))
9699 return factionEntry->BaseRepValue[i];
9700 }
9701
9702 return 0;
9703}

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

◆ GetBaseXP()

uint32 ObjectMgr::GetBaseXP ( uint8  level)
8121{
8122 return _baseXPTable[level] ? _baseXPTable[level] : 0;
8123}
BaseXPContainer _baseXPTable
Definition ObjectMgr.h:1632

References _baseXPTable.

◆ GetBreadcrumbsForQuest()

std::vector< uint32 > const * ObjectMgr::GetBreadcrumbsForQuest ( uint32  questId) const
inline
1159 {
1160 auto itr = _breadcrumbsForQuest.find(questId);
1161 if (itr != _breadcrumbsForQuest.end())
1162 return &itr->second;
1163
1164 return nullptr;
1165 }
BreadcrumbQuestMap _breadcrumbsForQuest
Definition ObjectMgr.h:1156

References _breadcrumbsForQuest.

◆ GetBroadcastText()

BroadcastText const * ObjectMgr::GetBroadcastText ( uint32  id) const
inline
1228 {
1229 BroadcastTextContainer::const_iterator itr = _broadcastTextStore.find(id);
1230 if (itr != _broadcastTextStore.end())
1231 return &itr->second;
1232 return nullptr;
1233 }
BroadcastTextContainer _broadcastTextStore
Definition ObjectMgr.h:1675

References _broadcastTextStore.

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

◆ GetClassTrainers()

std::vector< Trainer::Trainer const * > const & ObjectMgr::GetClassTrainers ( uint8  classId) const
inline
1441{ return _classTrainers.at(classId); }
std::unordered_map< uint8, std::vector< Trainer::Trainer const * > > _classTrainers
Definition ObjectMgr.h:1692

References _classTrainers.

◆ GetCreatureAddon()

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

References _creatureAddonStore.

◆ GetCreatureBaseStats()

CreatureBaseStats const * ObjectMgr::GetCreatureBaseStats ( uint8  level,
uint8  unitClass 
)
10645{
10646 CreatureBaseStatsContainer::const_iterator it = _creatureBaseStatsStore.find(MAKE_PAIR16(level, unitClass));
10647
10648 if (it != _creatureBaseStatsStore.end())
10649 return &(it->second);
10650
10651 struct DefaultCreatureBaseStats : public CreatureBaseStats
10652 {
10653 DefaultCreatureBaseStats()
10654 {
10655 BaseArmor = 1;
10656 for (uint8 j = 0; j < MAX_EXPANSIONS; ++j)
10657 {
10658 BaseHealth[j] = 1;
10659 BaseDamage[j] = 0.0f;
10660 }
10661 BaseMana = 0;
10662 AttackPower = 0;
10663 RangedAttackPower = 0;
10664 Strength = 0;
10665 Agility = 0;
10666 Stamina = 0;
10667 Intellect = 0;
10668 Spirit = 0;
10669 }
10670 };
10671 static const DefaultCreatureBaseStats defStats;
10672 return &defStats;
10673}
uint16 MAKE_PAIR16(uint8 l, uint8 h)
Definition ObjectDefines.h:83
CreatureBaseStatsContainer _creatureBaseStatsStore
Definition ObjectMgr.h:1616

References _creatureBaseStatsStore, MAKE_PAIR16(), and MAX_EXPANSIONS.

Referenced by AddCreData().

◆ GetCreatureData()

CreatureData const * ObjectMgr::GetCreatureData ( ObjectGuid::LowType  spawnId) const
inline
1236 {
1237 CreatureDataContainer::const_iterator itr = _creatureDataStore.find(spawnId);
1238 if (itr == _creatureDataStore.end()) return nullptr;
1239 return &itr->second;
1240 }

References _creatureDataStore.

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

◆ GetCreatureLocale()

CreatureLocale const * ObjectMgr::GetCreatureLocale ( uint32  entry) const
inline
1292 {
1293 CreatureLocaleContainer::const_iterator itr = _creatureLocaleStore.find(entry);
1294 if (itr == _creatureLocaleStore.end()) return nullptr;
1295 return &itr->second;
1296 }
CreatureLocaleContainer _creatureLocaleStore
Definition ObjectMgr.h:1663

References _creatureLocaleStore.

◆ GetCreatureModelInfo()

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

References _creatureModelStore.

Referenced by GetCreatureModelRandomGender(), and LoadCreatureTemplateModels().

◆ GetCreatureModelRandomGender()

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

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
1450{
1452}
std::unordered_map< ObjectGuid::LowType, CreatureMovementData > _creatureMovementOverrides
Definition ObjectMgr.h:1657
auto MapGetValuePtr(M &map, typename M::key_type const &key) -> decltype(AddressOrSelf(map.find(key) ->second))
Definition Containers.h:216

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

◆ GetCreatureQuestInvolvedRelationBounds()

QuestRelationBounds ObjectMgr::GetCreatureQuestInvolvedRelationBounds ( uint32  creature_entry)
inline
1012 {
1013 return _creatureQuestInvolvedRelations.equal_range(creature_entry);
1014 }
QuestRelations _creatureQuestInvolvedRelations
Definition ObjectMgr.h:1580

References _creatureQuestInvolvedRelations.

◆ GetCreatureQuestInvolvedRelationMap()

QuestRelations * ObjectMgr::GetCreatureQuestInvolvedRelationMap ( )
inline
1002 {
1004 }

References _creatureQuestInvolvedRelations.

◆ GetCreatureQuestItemList()

CreatureQuestItemList const * ObjectMgr::GetCreatureQuestItemList ( uint32  id) const
inline
830 {
831 CreatureQuestItemMap::const_iterator itr = _creatureQuestItemStore.find(id);
832 if (itr != _creatureQuestItemStore.end())
833 return &itr->second;
834 return nullptr;
835 }
CreatureQuestItemMap _creatureQuestItemStore
Definition ObjectMgr.h:1660

References _creatureQuestItemStore.

◆ GetCreatureQuestItemMap()

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

References _creatureQuestItemStore.

◆ GetCreatureQuestRelationBounds()

QuestRelationBounds ObjectMgr::GetCreatureQuestRelationBounds ( uint32  creature_entry)
inline
1007 {
1008 return _creatureQuestRelations.equal_range(creature_entry);
1009 }
QuestRelations _creatureQuestRelations
Definition ObjectMgr.h:1579

References _creatureQuestRelations.

◆ GetCreatureQuestRelationMap()

QuestRelations * ObjectMgr::GetCreatureQuestRelationMap ( )
inline
997 {
999 }

References _creatureQuestRelations.

◆ GetCreatureTemplate()

◆ GetCreatureTemplateAddon()

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

References _creatureTemplateAddonStore.

◆ GetCreatureTemplates()

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

References _creatureTemplateStore.

Referenced by LoadCreatureClassLevelStats(), and LoadNPCSpellClickSpells().

◆ GetDBCLocaleIndex()

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

References DBCLocaleIndex.

◆ GetDefaultSpawnGroup()

SpawnGroupTemplateData const * ObjectMgr::GetDefaultSpawnGroup ( ) const
inline
1283{ return &_spawnGroupDataStore.at(0); }

References _spawnGroupDataStore.

◆ GetDungeonEncounterList()

DungeonEncounterList const * ObjectMgr::GetDungeonEncounterList ( uint32  mapId,
Difficulty  difficulty 
)
inline
951 {
952 std::unordered_map<uint32, DungeonEncounterList>::const_iterator itr = _dungeonEncounterStore.find(MAKE_PAIR32(mapId, difficulty));
953 if (itr != _dungeonEncounterStore.end())
954 return &itr->second;
955 return nullptr;
956 }

References _dungeonEncounterStore, and MAKE_PAIR32().

◆ GetEquipmentInfo()

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

References _equipmentInfoStore, and urand().

Referenced by LoadCreatureDataFromDB(), and LoadCreatures().

◆ GetFishingBaseSkillLevel()

int32 ObjectMgr::GetFishingBaseSkillLevel ( uint32  entry) const
inline
1125 {
1126 FishingBaseSkillContainer::const_iterator itr = _fishingBaseForAreaStore.find(entry);
1127 return itr != _fishingBaseForAreaStore.end() ? itr->second : 0;
1128 }

References _fishingBaseForAreaStore.

◆ GetGameObjectAddon()

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

References _gameObjectAddonStore.

◆ GetGameObjectData()

GameObjectData const * ObjectMgr::GetGameObjectData ( ObjectGuid::LowType  spawnId) const
inline
1271 {
1272 GameObjectDataContainer::const_iterator itr = _gameObjectDataStore.find(spawnId);
1273 if (itr == _gameObjectDataStore.end()) return nullptr;
1274 return &itr->second;
1275 }

References _gameObjectDataStore.

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

◆ GetGameObjectLocale()

GameObjectLocale const * ObjectMgr::GetGameObjectLocale ( uint32  entry) const
inline
1298 {
1299 GameObjectLocaleContainer::const_iterator itr = _gameObjectLocaleStore.find(entry);
1300 if (itr == _gameObjectLocaleStore.end()) return nullptr;
1301 return &itr->second;
1302 }
GameObjectLocaleContainer _gameObjectLocaleStore
Definition ObjectMgr.h:1667

References _gameObjectLocaleStore.

◆ GetGameObjectQuestItemList()

GameObjectQuestItemList const * ObjectMgr::GetGameObjectQuestItemList ( uint32  id) const
inline
821 {
822 GameObjectQuestItemMap::const_iterator itr = _gameObjectQuestItemStore.find(id);
823 if (itr != _gameObjectQuestItemStore.end())
824 return &itr->second;
825 return nullptr;
826 }
GameObjectQuestItemMap _gameObjectQuestItemStore
Definition ObjectMgr.h:1659

References _gameObjectQuestItemStore.

◆ GetGameObjectQuestItemMap()

GameObjectQuestItemMap const * ObjectMgr::GetGameObjectQuestItemMap ( ) const
inline

◆ GetGameObjectSummonGroup()

std::vector< GameObjectSummonData > const * ObjectMgr::GetGameObjectSummonGroup ( uint32  summonerId,
SummonerType  summonerType,
uint8  group 
) const
inline
1219 {
1220 GameObjectSummonDataContainer::const_iterator itr = _goSummonDataStore.find(TempSummonGroupKey(summonerId, summonerType, group));
1221 if (itr != _goSummonDataStore.end())
1222 return &itr->second;
1223
1224 return nullptr;
1225 }
GameObjectSummonDataContainer _goSummonDataStore
Stores gameobject summon data grouped by summoner's entry, summoner's type and group id.
Definition ObjectMgr.h:1673
Key for storing temp summon data in TempSummonDataContainer.
Definition ObjectMgr.h:65

References _goSummonDataStore.

◆ GetGameObjectTemplate()

GameObjectTemplate const * ObjectMgr::GetGameObjectTemplate ( uint32  entry)
10986{
10987 GameObjectTemplateContainer::const_iterator itr = _gameObjectTemplateStore.find(entry);
10988 if (itr != _gameObjectTemplateStore.end())
10989 return &(itr->second);
10990
10991 return nullptr;
10992}
GameObjectTemplateContainer _gameObjectTemplateStore
Definition ObjectMgr.h:1668

References _gameObjectTemplateStore.

Referenced by AddGOData(), IsGameObjectStaticTransport(), LoadGameObjectDataFromDB(), LoadGameobjectQuestEnders(), LoadGameObjectQuestItems(), LoadGameobjectQuestStarters(), LoadGameobjects(), LoadGameObjectSummons(), LoadGameObjectTemplateAddons(), LoadQuestGreetings(), LoadQuestGreetingsLocales(), LoadQuests(), LoadScripts(), and LoadTempSummons().

◆ GetGameObjectTemplateAddon()

GameObjectTemplateAddon const * ObjectMgr::GetGameObjectTemplateAddon ( uint32  entry) const
11001{
11002 auto itr = _gameObjectTemplateAddonStore.find(entry);
11003 if (itr != _gameObjectTemplateAddonStore.end())
11004 return &itr->second;
11005
11006 return nullptr;
11007}
GameObjectTemplateAddonContainer _gameObjectTemplateAddonStore
Definition ObjectMgr.h:1669

References _gameObjectTemplateAddonStore.

◆ GetGameObjectTemplates()

GameObjectTemplateContainer const * ObjectMgr::GetGameObjectTemplates ( ) const
inline

◆ GetGameTele() [1/2]

GameTele const * ObjectMgr::GetGameTele ( std::string_view  name,
bool  exactSearch = false 
) const
9791{
9792 // explicit name case
9793 std::wstring wname;
9794 if (!Utf8toWStr(name, wname))
9795 return nullptr;
9796
9797 // converting string that we try to find to lower case
9798 wstrToLower(wname);
9799
9800 // Alternative first GameTele what contains wnameLow as substring in case no GameTele location found
9801 const GameTele* alt = nullptr;
9802 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9803 {
9804 if (itr->second.wnameLow == wname)
9805 return &itr->second;
9806 else if (!exactSearch && !alt && itr->second.wnameLow.find(wname) != std::wstring::npos)
9807 alt = &itr->second;
9808 }
9809
9810 return alt;
9811}
Definition ObjectMgr.h:133

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

◆ GetGameTele() [2/2]

GameTele const * ObjectMgr::GetGameTele ( uint32  id) const
inline
1430 {
1431 GameTeleContainer::const_iterator itr = _gameTeleStore.find(id);
1432 if (itr == _gameTeleStore.end()) return nullptr;
1433 return &itr->second;
1434 }

References _gameTeleStore.

◆ GetGameTeleMap()

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

References _gameTeleStore.

◆ GetGenerator()

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

◆ GetGoBackTrigger()

AreaTriggerTeleport const * ObjectMgr::GetGoBackTrigger ( uint32  Map) const
7585{
7586 bool useParentDbValue = false;
7587 uint32 parentId = 0;
7588 MapEntry const* mapEntry = sMapStore.LookupEntry(Map);
7589 if (!mapEntry || mapEntry->entrance_map < 0)
7590 return nullptr;
7591
7592 if (mapEntry->IsDungeon())
7593 {
7594 InstanceTemplate const* iTemplate = sObjectMgr->GetInstanceTemplate(Map);
7595
7596 if (!iTemplate)
7597 return nullptr;
7598
7599 parentId = iTemplate->Parent;
7600 useParentDbValue = true;
7601 }
7602
7603 uint32 entrance_map = uint32(mapEntry->entrance_map);
7604 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
7605 if ((!useParentDbValue && itr->second.target_mapId == entrance_map) || (useParentDbValue && itr->second.target_mapId == parentId))
7606 {
7607 AreaTrigger const* atEntry = GetAreaTrigger(itr->first);
7608 if (atEntry && atEntry->map == Map)
7609 return &itr->second;
7610 }
7611 return nullptr;
7612}
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
AreaTrigger const * GetAreaTrigger(uint32 trigger) const
Definition ObjectMgr.h:866
Definition ObjectMgr.h:421
uint32 map
Definition ObjectMgr.h:423
Definition Map.h:124
uint32 Parent
Definition Map.h:125
Definition DBCStructure.h:1325
int32 entrance_map
Definition DBCStructure.h:1340
bool IsDungeon() const
Definition DBCStructure.h:1351

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

◆ GetGOQuestInvolvedRelationBounds()

QuestRelationBounds ObjectMgr::GetGOQuestInvolvedRelationBounds ( uint32  go_entry)
inline
992 {
993 return _goQuestInvolvedRelations.equal_range(go_entry);
994 }
QuestRelations _goQuestInvolvedRelations
Definition ObjectMgr.h:1578

References _goQuestInvolvedRelations.

◆ GetGOQuestInvolvedRelationMap()

QuestRelations * ObjectMgr::GetGOQuestInvolvedRelationMap ( )
inline
982 {
984 }

References _goQuestInvolvedRelations.

◆ GetGOQuestRelationBounds()

QuestRelationBounds ObjectMgr::GetGOQuestRelationBounds ( uint32  go_entry)
inline
987 {
988 return _goQuestRelations.equal_range(go_entry);
989 }
QuestRelations _goQuestRelations
Definition ObjectMgr.h:1577

References _goQuestRelations.

◆ GetGOQuestRelationMap()

QuestRelations * ObjectMgr::GetGOQuestRelationMap ( )
inline
977 {
978 return &_goQuestRelations;
979 }

References _goQuestRelations.

◆ GetGossipMenuItemsLocale()

GossipMenuItemsLocale const * ObjectMgr::GetGossipMenuItemsLocale ( uint32  entry) const
inline
1328 {
1329 GossipMenuItemsLocaleContainer::const_iterator itr = _gossipMenuItemsLocaleStore.find(entry);
1330 if (itr == _gossipMenuItemsLocaleStore.end()) return nullptr;
1331 return &itr->second;
1332 }
GossipMenuItemsLocaleContainer _gossipMenuItemsLocaleStore
Definition ObjectMgr.h:1687

References _gossipMenuItemsLocaleStore.

◆ GetGossipMenuItemsMapBounds()

GossipMenuItemsMapBounds ObjectMgr::GetGossipMenuItemsMapBounds ( uint32  uiMenuId) const
inline
1477 {
1478 return _gossipMenuItemsStore.equal_range(uiMenuId);
1479 }
GossipMenuItemsContainer _gossipMenuItemsStore
Definition ObjectMgr.h:1572

References _gossipMenuItemsStore.

◆ GetGossipMenuItemsMapBoundsNonConst()

GossipMenuItemsMapBoundsNonConst ObjectMgr::GetGossipMenuItemsMapBoundsNonConst ( uint32  uiMenuId)
inline
1481 {
1482 return _gossipMenuItemsStore.equal_range(uiMenuId);
1483 }

References _gossipMenuItemsStore.

◆ GetGossipMenusMapBounds()

GossipMenusMapBounds ObjectMgr::GetGossipMenusMapBounds ( uint32  uiMenuId) const
inline
1467 {
1468 return _gossipMenusStore.equal_range(uiMenuId);
1469 }
GossipMenusContainer _gossipMenusStore
Definition ObjectMgr.h:1571

References _gossipMenusStore.

◆ GetGossipMenusMapBoundsNonConst()

GossipMenusMapBoundsNonConst ObjectMgr::GetGossipMenusMapBoundsNonConst ( uint32  uiMenuId)
inline
1472 {
1473 return _gossipMenusStore.equal_range(uiMenuId);
1474 }

References _gossipMenusStore.

◆ GetGossipText()

GossipText const * ObjectMgr::GetGossipText ( uint32  Text_ID) const
6627{
6628 GossipTextContainer::const_iterator itr = _gossipTextStore.find(Text_ID);
6629 if (itr != _gossipTextStore.end())
6630 return &itr->second;
6631 return nullptr;
6632}
GossipTextContainer _gossipTextStore
Definition ObjectMgr.h:1559

References _gossipTextStore.

Referenced by LoadGossipMenu().

◆ GetGridObjectGuids()

CellObjectGuids const & ObjectMgr::GetGridObjectGuids ( uint16  mapid,
uint8  spawnMode,
uint32  gridId 
)
inline
1181 {
1182 MapObjectGuids::const_iterator itr1 = _mapObjectGuidsStore.find(MAKE_PAIR32(mapid, spawnMode));
1183 if (itr1 != _mapObjectGuidsStore.end())
1184 {
1185 CellObjectGuidsMap::const_iterator itr2 = itr1->second.find(gridId);
1186 if (itr2 != itr1->second.end())
1187 return itr2->second;
1188 }
1189 return _emptyCellObjectGuids;
1190 }
CellObjectGuids _emptyCellObjectGuids
Definition ObjectMgr.h:1649

References _emptyCellObjectGuids, _mapObjectGuidsStore, and MAKE_PAIR32().

◆ GetGuidSequenceGenerator()

template<HighGuid high>
ObjectGuidGeneratorBase & ObjectMgr::GetGuidSequenceGenerator ( )
inlineprivate
1540 {
1541 auto itr = _guidGenerators.find(high);
1542 if (itr == _guidGenerators.end())
1543 itr = _guidGenerators.insert(std::make_pair(high, std::unique_ptr<ObjectGuidGenerator<high>>(new ObjectGuidGenerator<high>()))).first;
1544
1545 return *itr->second;
1546 }
Definition ObjectGuid.h:297
std::map< HighGuid, std::unique_ptr< ObjectGuidGeneratorBase > > _guidGenerators
Definition ObjectMgr.h:1548

References _guidGenerators.

◆ GetInstanceTemplate()

InstanceTemplate const * ObjectMgr::GetInstanceTemplate ( uint32  mapId)
6533{
6534 InstanceTemplateContainer::const_iterator itr = _instanceTemplateStore.find(uint16(mapID));
6535 if (itr != _instanceTemplateStore.end())
6536 return &(itr->second);
6537
6538 return nullptr;
6539}
InstanceTemplateContainer _instanceTemplateStore
Definition ObjectMgr.h:1605

References _instanceTemplateStore.

◆ GetItemLocale()

ItemLocale const * ObjectMgr::GetItemLocale ( uint32  entry) const
inline
1304 {
1305 ItemLocaleContainer::const_iterator itr = _itemLocaleStore.find(entry);
1306 if (itr == _itemLocaleStore.end()) return nullptr;
1307 return &itr->second;
1308 }
ItemLocaleContainer _itemLocaleStore
Definition ObjectMgr.h:1678

References _itemLocaleStore.

◆ GetItemSetNameEntry()

ItemSetNameEntry const * ObjectMgr::GetItemSetNameEntry ( uint32  itemId)
inline
792 {
793 ItemSetNameContainer::iterator itr = _itemSetNameStore.find(itemId);
794 if (itr != _itemSetNameStore.end())
795 return &itr->second;
796 return nullptr;
797 }
ItemSetNameContainer _itemSetNameStore
Definition ObjectMgr.h:1645

References _itemSetNameStore.

◆ GetItemSetNameLocale()

ItemSetNameLocale const * ObjectMgr::GetItemSetNameLocale ( uint32  entry) const
inline
1310 {
1311 ItemSetNameLocaleContainer::const_iterator itr = _itemSetNameLocaleStore.find(entry);
1312 if (itr == _itemSetNameLocaleStore.end())return nullptr;
1313 return &itr->second;
1314 }
ItemSetNameLocaleContainer _itemSetNameLocaleStore
Definition ObjectMgr.h:1679

References _itemSetNameLocaleStore.

◆ GetItemTemplate()

ItemTemplate const * ObjectMgr::GetItemTemplate ( uint32  entry)
3872{
3873 return entry < _itemTemplateStoreFast.size() ? _itemTemplateStoreFast[entry] : nullptr;
3874}
std::vector< ItemTemplate * > _itemTemplateStoreFast
Definition ObjectMgr.h:1677

References _itemTemplateStoreFast.

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

◆ GetItemTemplateStore()

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

References _itemTemplateStore.

◆ GetItemTemplateStoreFast()

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

References _itemTemplateStoreFast.

◆ GetLegacySpawnGroup()

SpawnGroupTemplateData const * ObjectMgr::GetLegacySpawnGroup ( ) const
inline
1284{ return &_spawnGroupDataStore.at(1); }

References _spawnGroupDataStore.

◆ GetLinkedRespawnGuid()

ObjectGuid ObjectMgr::GetLinkedRespawnGuid ( ObjectGuid  guid) const
inline
1262 {
1263 LinkedRespawnContainer::const_iterator itr = _linkedRespawnStore.find(guid);
1264 if (itr == _linkedRespawnStore.end())
1265 return ObjectGuid::Empty;
1266 return itr->second;
1267 }
static ObjectGuid const Empty
Definition ObjectGuid.h:120
LinkedRespawnContainer _linkedRespawnStore
Definition ObjectMgr.h:1662

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
1494 {
1495 if (data.size() > std::size_t(loc_idx) && !data[loc_idx].empty())
1496 value = data[loc_idx];
1497 }

◆ GetLocaleString() [2/2]

◆ GetMailLevelReward()

MailLevelReward const * ObjectMgr::GetMailLevelReward ( uint32  level,
uint32  raceMask 
)
inline
1168 {
1169 MailLevelRewardContainer::const_iterator map_itr = _mailLevelRewardStore.find(level);
1170 if (map_itr == _mailLevelRewardStore.end())
1171 return nullptr;
1172
1173 for (const auto & set_itr : map_itr->second)
1174 if (set_itr.raceMask & raceMask)
1175 return &set_itr;
1176
1177 return nullptr;
1178 }
MailLevelRewardContainer _mailLevelRewardStore
Definition ObjectMgr.h:1614

References _mailLevelRewardStore.

◆ GetMapEntranceTrigger()

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

Searches for the areatrigger which teleports players to the given map

7618{
7619 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
7620 {
7621 if (itr->second.target_mapId == Map) // Id is used to determine correct Scarlet Monastery instance
7622 {
7623 // xinef: no need to check, already done at loading
7624 //AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first);
7625 //if (atEntry)
7626 return &itr->second;
7627 }
7628 }
7629 return nullptr;
7630}

References _areaTriggerTeleportStore.

◆ GetMapObjectGuids()

CellObjectGuidsMap const & ObjectMgr::GetMapObjectGuids ( uint16  mapid,
uint8  spawnMode 
)
inline
1193 {
1194 MapObjectGuids::const_iterator itr1 = _mapObjectGuidsStore.find(MAKE_PAIR32(mapid, spawnMode));
1195 if (itr1 != _mapObjectGuidsStore.end())
1196 return itr1->second;
1198 }
CellObjectGuidsMap _emptyCellObjectGuidsMap
Definition ObjectMgr.h:1648

References _emptyCellObjectGuidsMap, _mapObjectGuidsStore, and MAKE_PAIR32().

◆ GetModelForShapeshift()

uint32 ObjectMgr::GetModelForShapeshift ( ShapeshiftForm  form,
Player player 
) const
1890{
1891 uint8 customizationID;
1892
1893 if (player->GetTeamId() == TEAM_ALLIANCE)
1894 customizationID = player->GetByteValue(PLAYER_BYTES, 3); // Use Hair Color
1895 else
1896 customizationID = player->GetByteValue(PLAYER_BYTES, 0); // Use Skin Color
1897
1898 // getGender() tracks the active display model; real gender lives in PLAYER_BYTES_3
1900
1901 auto itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), customizationID, gender));
1902 if (itr != _playerShapeshiftModel.end())
1903 return itr->second; // Explicit combination
1904
1905 itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), customizationID, GENDER_NONE));
1906 if (itr != _playerShapeshiftModel.end())
1907 return itr->second; // Combination applied to both genders
1908
1909 itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), 255, gender));
1910 if (itr != _playerShapeshiftModel.end())
1911 return itr->second; // Default gender-dependent model
1912
1913 itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), 255, GENDER_NONE));
1914 if (itr != _playerShapeshiftModel.end())
1915 return itr->second; // Last resort
1916
1917 LOG_DEBUG("entities.player", "ShapeshiftForm {} with RaceID ({}) have no shapeshift model data defined, using fallback data.", form, player->getRace());
1918 return 0;
1919}
@ PLAYER_BYTES_3_OFFSET_GENDER
Definition Player.h:513
@ GENDER_NONE
Definition SharedDefines.h:63
@ TEAM_ALLIANCE
Definition SharedDefines.h:748
@ PLAYER_BYTES_3
Definition UpdateFields.h:183
@ PLAYER_BYTES
Definition UpdateFields.h:181
PlayerShapeshiftModelMap _playerShapeshiftModel
Definition ObjectMgr.h:1710
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition Object.cpp:312
TeamId GetTeamId(bool original=false) const
Definition Player.h:2128
uint8 getRace(bool original=false) const
Definition Unit.cpp:17048

References _playerShapeshiftModel, GENDER_NONE, Object::GetByteValue(), Unit::getRace(), Player::GetTeamId(), LOG_DEBUG, PLAYER_BYTES, PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_GENDER, and TEAM_ALLIANCE.

◆ GetModelForTotem()

uint32 ObjectMgr::GetModelForTotem ( SummonSlot  totemSlot,
Races  race 
) const
1835{
1836 auto itr = _playerTotemModel.find(std::make_pair(totemSlot, race));
1837 if (itr != _playerTotemModel.end())
1838 return itr->second;
1839
1840 LOG_ERROR("misc", "TotemSlot {} with RaceID ({}) have no totem model data defined, set to default model.", totemSlot, race);
1841 return 0;
1842}
PlayerTotemModelMap _playerTotemModel
Definition ObjectMgr.h:1708

References _playerTotemModel, and LOG_ERROR.

◆ GetModuleString() [1/2]

ModuleString const * ObjectMgr::GetModuleString ( std::string  module,
uint32  id 
) const
inline
1378 {
1379 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
1380 ModuleStringContainer::const_iterator itr = _moduleStringStore.find(pairKey);
1381 if (itr == _moduleStringStore.end())
1382 return nullptr;
1383
1384 return &itr->second;
1385 }
ModuleStringContainer _moduleStringStore
Definition ObjectMgr.h:1685

References _moduleStringStore.

Referenced by GetModuleString().

◆ GetModuleString() [2/2]

std::string const * ObjectMgr::GetModuleString ( std::string  module,
uint32  id,
LocaleConstant  locale 
) const
9530{
9531 ModuleString const* ms = GetModuleString(module, id);
9532 if (ms && !ms->Content.empty())
9533 {
9534 if (ms->Content.size() > size_t(locale) && !ms->Content[locale].empty())
9535 return &ms->Content[locale];
9536
9537 return &ms->Content[DEFAULT_LOCALE];
9538 }
9539
9540 LOG_ERROR("sql.sql", "Module string module {} id {} not found in DB.", module, id);
9541
9542 return (std::string*)"error";
9543}
ModuleString const * GetModuleString(std::string module, uint32 id) const
Definition ObjectMgr.h:1377
Definition ObjectMgr.h:497
std::vector< std::string > Content
Definition ObjectMgr.h:498

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

◆ GetNearestTaxiNode() [1/2]

uint32 ObjectMgr::GetNearestTaxiNode ( float  x,
float  y,
float  z,
uint32  mapid,
uint32  teamId 
)
7202{
7203 bool found = false;
7204 float dist = 10000;
7205 uint32 id = 0;
7206
7207 for (uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i)
7208 {
7209 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(i);
7210
7211 if (!node || node->map_id != mapid || (!node->MountCreatureID[teamId == TEAM_ALLIANCE ? 1 : 0] && node->MountCreatureID[0] != 32981)) // dk flight
7212 continue;
7213
7214 uint8 field = (uint8)((i - 1) / 32);
7215 uint32 submask = 1 << ((i - 1) % 32);
7216
7217 // skip not taxi network nodes
7218 if (field >= TaxiMaskSize || (sTaxiNodesMask[field] & submask) == 0)
7219 {
7220 continue;
7221 }
7222
7223 float dist2 = (node->x - x) * (node->x - x) + (node->y - y) * (node->y - y) + (node->z - z) * (node->z - z);
7224 if (found)
7225 {
7226 if (dist2 < dist)
7227 {
7228 dist = dist2;
7229 id = i;
7230 }
7231 }
7232 else
7233 {
7234 found = true;
7235 dist = dist2;
7236 id = i;
7237 }
7238 }
7239
7240 return id;
7241}
TaxiMask sTaxiNodesMask
Definition DBCStores.cpp:176
DBCStorage< TaxiNodesEntry > sTaxiNodesStore(TaxiNodesEntryfmt)
static constexpr std::size_t TaxiMaskSize
Definition DBCStructure.h:2248
Definition DBCStructure.h:1953
float z
Definition DBCStructure.h:1958
uint32 map_id
Definition DBCStructure.h:1955
float x
Definition DBCStructure.h:1956
float y
Definition DBCStructure.h:1957
uint32 MountCreatureID[2]
Definition DBCStructure.h:1961

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

Referenced by GetNearestTaxiNode().

◆ GetNearestTaxiNode() [2/2]

uint32 ObjectMgr::GetNearestTaxiNode ( WorldLocation const &  loc,
uint32  teamId 
)
7197{
7198 return GetNearestTaxiNode(loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetMapId(), teamId);
7199}
uint32 GetNearestTaxiNode(float x, float y, float z, uint32 mapid, uint32 teamId)
Definition ObjectMgr.cpp:7201

References WorldLocation::GetMapId(), GetNearestTaxiNode(), Position::GetPositionX(), Position::GetPositionY(), and Position::GetPositionZ().

◆ GetNpcTextLocale()

NpcTextLocale const * ObjectMgr::GetNpcTextLocale ( uint32  entry) const
inline
1352 {
1353 NpcTextLocaleContainer::const_iterator itr = _npcTextLocaleStore.find(entry);
1354 if (itr == _npcTextLocaleStore.end()) return nullptr;
1355 return &itr->second;
1356 }
NpcTextLocaleContainer _npcTextLocaleStore
Definition ObjectMgr.h:1683

References _npcTextLocaleStore.

◆ GetNpcVendorItemList()

VendorItemData const * ObjectMgr::GetNpcVendorItemList ( uint32  entry) const
inline
1444 {
1445 CacheVendorItemContainer::const_iterator iter = _cacheVendorItemStore.find(entry);
1446 if (iter == _cacheVendorItemStore.end())
1447 return nullptr;
1448
1449 return &iter->second;
1450 }

References _cacheVendorItemStore.

Referenced by IsVendorItemValid().

◆ GetPageText()

PageText const * ObjectMgr::GetPageText ( uint32  pageEntry)
6449{
6450 PageTextContainer::const_iterator itr = _pageTextStore.find(pageEntry);
6451 if (itr != _pageTextStore.end())
6452 return &(itr->second);
6453
6454 return nullptr;
6455}
PageTextContainer _pageTextStore
Definition ObjectMgr.h:1604

References _pageTextStore.

Referenced by LoadGameObjectTemplate(), and LoadItemTemplates().

◆ GetPageTextLocale()

PageTextLocale const * ObjectMgr::GetPageTextLocale ( uint32  entry) const
inline
1316 {
1317 PageTextLocaleContainer::const_iterator itr = _pageTextLocaleStore.find(entry);
1318 if (itr == _pageTextLocaleStore.end()) return nullptr;
1319 return &itr->second;
1320 }
PageTextLocaleContainer _pageTextLocaleStore
Definition ObjectMgr.h:1684

References _pageTextLocaleStore.

◆ GetPetLevelInfo()

PetLevelInfo const * ObjectMgr::GetPetLevelInfo ( uint32  creature_id,
uint8  level 
) const
4238{
4239 if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4240 level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
4241
4242 PetLevelInfoContainer::const_iterator itr = _petInfoStore.find(creature_id);
4243 if (itr == _petInfoStore.end())
4244 return nullptr;
4245
4246 return &itr->second[level - 1]; // data for level 1 stored in [0] array element, ...
4247}

References _petInfoStore, CONFIG_MAX_PLAYER_LEVEL, and sWorld.

◆ GetPlayerClassInfo()

PlayerClassInfo const * ObjectMgr::GetPlayerClassInfo ( uint32  class_) const
inline
804 {
805 if (class_ >= MAX_CLASSES)
806 return nullptr;
807 return _playerClassInfo[class_];
808 }

References _playerClassInfo, and MAX_CLASSES.

◆ GetPlayerClassLevelInfo()

void ObjectMgr::GetPlayerClassLevelInfo ( uint32  class_,
uint8  level,
PlayerClassLevelInfo info 
) const
4915{
4916 if (level < 1 || class_ >= MAX_CLASSES)
4917 return;
4918
4919 PlayerClassInfo const* pInfo = _playerClassInfo[class_];
4920
4921 if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4922 level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
4923
4924 *info = pInfo->levelInfo[level - 1];
4925}
Definition Player.h:283

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

◆ GetPlayerInfo()

PlayerInfo const * ObjectMgr::GetPlayerInfo ( uint32  race,
uint32  class_ 
) const
11032{
11033 if (race >= sRaceMgr->GetMaxRaces())
11034 return nullptr;
11035 if (class_ >= MAX_CLASSES)
11036 return nullptr;
11037 PlayerInfo const* info = _playerInfo[race][class_];
11038 if (!info)
11039 return nullptr;
11040 return info;
11041}
Definition Player.h:322

References _playerInfo, MAX_CLASSES, and sRaceMgr.

◆ GetPlayerLevelInfo()

void ObjectMgr::GetPlayerLevelInfo ( uint32  race,
uint32  class_,
uint8  level,
PlayerLevelInfo info 
) const
4928{
4929 if (level < 1 || race >= sRaceMgr->GetMaxRaces() || class_ >= MAX_CLASSES)
4930 return;
4931
4932 PlayerInfo const* pInfo = _playerInfo[race][class_];
4933 if (!pInfo)
4934 return;
4935
4936 if (level <= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4937 *info = pInfo->levelInfo[level - 1];
4938 else
4939 BuildPlayerLevelInfo(race, class_, level, info);
4940}
void BuildPlayerLevelInfo(uint8 race, uint8 class_, uint8 level, PlayerLevelInfo *plinfo) const
Definition ObjectMgr.cpp:4942
PlayerLevelInfo * levelInfo
Definition Player.h:340

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

◆ GetPointOfInterest()

PointOfInterest const * ObjectMgr::GetPointOfInterest ( uint32  id) const
inline
933 {
934 PointOfInterestContainer::const_iterator itr = _pointsOfInterestStore.find(id);
935 if (itr != _pointsOfInterestStore.end())
936 return &itr->second;
937 return nullptr;
938 }
PointOfInterestContainer _pointsOfInterestStore
Definition ObjectMgr.h:1573

References _pointsOfInterestStore.

Referenced by LoadGossipMenuItems().

◆ GetPointOfInterestLocale()

PointOfInterestLocale const * ObjectMgr::GetPointOfInterestLocale ( uint32  poi_id) const
inline
1334 {
1335 PointOfInterestLocaleContainer::const_iterator itr = _pointOfInterestLocaleStore.find(poi_id);
1336 if (itr == _pointOfInterestLocaleStore.end()) return nullptr;
1337 return &itr->second;
1338 }
PointOfInterestLocaleContainer _pointOfInterestLocaleStore
Definition ObjectMgr.h:1688

References _pointOfInterestLocaleStore.

◆ GetQuestForAreaTrigger()

uint32 ObjectMgr::GetQuestForAreaTrigger ( uint32  Trigger_ID) const
inline
846 {
847 QuestAreaTriggerContainer::const_iterator itr = _questAreaTriggerStore.find(Trigger_ID);
848 if (itr != _questAreaTriggerStore.end())
849 return itr->second;
850 return 0;
851 }
QuestAreaTriggerContainer _questAreaTriggerStore
Definition ObjectMgr.h:1557

References _questAreaTriggerStore.

◆ GetQuestGreeting()

QuestGreeting const * ObjectMgr::GetQuestGreeting ( TypeID  type,
uint32  id 
) const
6927{
6928 uint8 typeIndex;
6929 if (type == TYPEID_UNIT)
6930 typeIndex = 0;
6931 else if (type == TYPEID_GAMEOBJECT)
6932 typeIndex = 1;
6933 else
6934 return nullptr;
6935
6936 std::pair<uint32, uint8> pairKey = std::make_pair(id, typeIndex);
6937 QuestGreetingContainer::const_iterator itr = _questGreetingStore.find(pairKey);
6938 if (itr == _questGreetingStore.end())
6939 return nullptr;
6940
6941 return &itr->second;
6942}
@ TYPEID_GAMEOBJECT
Definition ObjectGuid.h:37
@ TYPEID_UNIT
Definition ObjectGuid.h:35
QuestGreetingContainer _questGreetingStore
Definition ObjectMgr.h:1560

References _questGreetingStore, TYPEID_GAMEOBJECT, and TYPEID_UNIT.

◆ GetQuestLocale()

QuestLocale const * ObjectMgr::GetQuestLocale ( uint32  entry) const
inline
1322 {
1323 QuestLocaleContainer::const_iterator itr = _questLocaleStore.find(entry);
1324 if (itr == _questLocaleStore.end()) return nullptr;
1325 return &itr->second;
1326 }
QuestLocaleContainer _questLocaleStore
Definition ObjectMgr.h:1680

References _questLocaleStore.

◆ GetQuestMoneyReward()

uint32 ObjectMgr::GetQuestMoneyReward ( uint8  level,
uint32  questMoneyDifficulty 
) const
11168{
11169 if (questMoneyDifficulty < MAX_QUEST_MONEY_REWARDS)
11170 {
11171 auto const& itr = _questMoneyRewards.find(level);
11172 if (itr != _questMoneyRewards.end())
11173 {
11174 return itr->second.at(questMoneyDifficulty);
11175 }
11176 }
11177
11178 return 0;
11179}
static constexpr uint32 MAX_QUEST_MONEY_REWARDS
Definition ObjectMgr.h:721
QuestMoneyRewardStore _questMoneyRewards
Definition ObjectMgr.h:1712

References _questMoneyRewards, and MAX_QUEST_MONEY_REWARDS.

◆ GetQuestOfferRewardLocale()

QuestOfferRewardLocale const * ObjectMgr::GetQuestOfferRewardLocale ( uint32  entry) const
inline
1340 {
1341 auto itr = _questOfferRewardLocaleStore.find(entry);
1342 if (itr == _questOfferRewardLocaleStore.end()) return nullptr;
1343 return &itr->second;
1344 }
QuestOfferRewardLocaleContainer _questOfferRewardLocaleStore
Definition ObjectMgr.h:1681

References _questOfferRewardLocaleStore.

◆ GetQuestPOIVector()

QuestPOIVector const * ObjectMgr::GetQuestPOIVector ( uint32  questId)
inline
941 {
942 QuestPOIContainer::const_iterator itr = _questPOIStore.find(questId);
943 if (itr != _questPOIStore.end())
944 return &itr->second;
945 return nullptr;
946 }
QuestPOIContainer _questPOIStore
Definition ObjectMgr.h:1575

References _questPOIStore.

◆ GetQuestRequestItemsLocale()

QuestRequestItemsLocale const * ObjectMgr::GetQuestRequestItemsLocale ( uint32  entry) const
inline
1346 {
1347 auto itr = _questRequestItemsLocaleStore.find(entry);
1348 if (itr == _questRequestItemsLocaleStore.end()) return nullptr;
1349 return &itr->second;
1350 }
QuestRequestItemsLocaleContainer _questRequestItemsLocaleStore
Definition ObjectMgr.h:1682

References _questRequestItemsLocaleStore.

◆ GetQuestTemplate()

Quest const * ObjectMgr::GetQuestTemplate ( uint32  quest_id) const
inline
839 {
840 return quest_id < _questTemplatesFast.size() ? _questTemplatesFast[quest_id] : nullptr;
841 }
std::vector< Quest * > _questTemplatesFast
Definition ObjectMgr.h:1551

References _questTemplatesFast.

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

◆ GetQuestTemplates()

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

References _questTemplates.

◆ GetRepRewardRate()

RepRewardRate const * ObjectMgr::GetRepRewardRate ( uint32  factionId) const
inline
905 {
906 RepRewardRateContainer::const_iterator itr = _repRewardRateStore.find(factionId);
907 if (itr != _repRewardRateStore.end())
908 return &itr->second;
909
910 return nullptr;
911 }
RepRewardRateContainer _repRewardRateStore
Definition ObjectMgr.h:1567

References _repRewardRateStore.

◆ GetRepSpilloverTemplate()

RepSpilloverTemplate const * ObjectMgr::GetRepSpilloverTemplate ( uint32  factionId) const
inline
924 {
925 RepSpilloverTemplateContainer::const_iterator itr = _repSpilloverTemplateStore.find(factionId);
926 if (itr != _repSpilloverTemplateStore.end())
927 return &itr->second;
928
929 return nullptr;
930 }
RepSpilloverTemplateContainer _repSpilloverTemplateStore
Definition ObjectMgr.h:1569

References _repSpilloverTemplateStore.

◆ GetReputationOnKilEntry()

ReputationOnKillEntry const * ObjectMgr::GetReputationOnKilEntry ( uint32  id) const
inline
914 {
915 RepOnKillContainer::const_iterator itr = _repOnKillStore.find(id);
916 if (itr != _repOnKillStore.end())
917 return &itr->second;
918 return nullptr;
919 }
RepOnKillContainer _repOnKillStore
Definition ObjectMgr.h:1568

References _repOnKillStore.

◆ GetScriptId()

uint32 ObjectMgr::GetScriptId ( std::string const &  name)
10505{
10506 // use binary search to find the script name in the sorted vector
10507 // assume "" is the first element
10508 if (name.empty())
10509 return 0;
10510
10511 ScriptNameContainer::const_iterator itr = std::lower_bound(_scriptNamesStore.begin(), _scriptNamesStore.end(), name);
10512 if (itr == _scriptNamesStore.end() || (*itr != name))
10513 return 0;
10514
10515 return uint32(itr - _scriptNamesStore.begin());
10516}
ScriptNameContainer _scriptNamesStore
Definition ObjectMgr.h:1592

References _scriptNamesStore.

Referenced by LoadAreaTriggerScripts(), LoadCreatureDataFromDB(), LoadCreatures(), LoadCreatureTemplate(), LoadGameObjectDataFromDB(), LoadGameobjects(), LoadGameObjectTemplate(), LoadInstanceTemplate(), LoadItemTemplates(), and LoadSpellScriptNames().

◆ GetScriptName()

std::string const & ObjectMgr::GetScriptName ( uint32  id) const
10499{
10500 static std::string const empty = "";
10501 return (id < _scriptNamesStore.size()) ? _scriptNamesStore[id] : empty;
10502}

References _scriptNamesStore.

Referenced by ValidateSpellScripts().

◆ GetScriptNames()

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

References _scriptNamesStore.

◆ GetSparringData()

CreatureSparringContainer const & ObjectMgr::GetSparringData ( ) const
inline
1242{ return _creatureSparringStore; }
CreatureSparringContainer _creatureSparringStore
Definition ObjectMgr.h:1607

References _creatureSparringStore.

◆ GetSpawnData()

SpawnData const * ObjectMgr::GetSpawnData ( SpawnObjectType  type,
ObjectGuid::LowType  spawnId 
) const
8714{
8715 switch (type)
8716 {
8718 return GetCreatureData(spawnId);
8720 return GetGameObjectData(spawnId);
8721 default:
8722 return nullptr;
8723 }
8724}
@ SPAWN_TYPE_GAMEOBJECT
Definition SpawnData.h:28
@ SPAWN_TYPE_CREATURE
Definition SpawnData.h:27

References GetCreatureData(), GetGameObjectData(), SPAWN_TYPE_CREATURE, and SPAWN_TYPE_GAMEOBJECT.

Referenced by LoadSpawnGroups().

◆ GetSpawnDataForGroup()

std::pair< SpawnGroupLinkContainer::const_iterator, SpawnGroupLinkContainer::const_iterator > ObjectMgr::GetSpawnDataForGroup ( uint32  groupId) const
inline
1286 {
1287 return _spawnGroupMapStore.equal_range(groupId);
1288 }
SpawnGroupLinkContainer _spawnGroupMapStore
Definition ObjectMgr.h:1666

References _spawnGroupMapStore.

◆ GetSpawnGroupData()

SpawnGroupTemplateData const * ObjectMgr::GetSpawnGroupData ( uint32  groupId) const
inline
1279 {
1280 auto itr = _spawnGroupDataStore.find(groupId);
1281 return itr != _spawnGroupDataStore.end() ? &itr->second : nullptr;
1282 }

References _spawnGroupDataStore.

◆ GetSpellClickInfoMapBounds()

SpellClickInfoMapBounds ObjectMgr::GetSpellClickInfoMapBounds ( uint32  creature_id) const
inline
1462 {
1463 return _spellClickInfoStore.equal_range(creature_id);
1464 }
SpellClickInfoContainer _spellClickInfoStore
Definition ObjectMgr.h:1594

References _spellClickInfoStore.

◆ GetSpellScriptsBounds()

SpellScriptsBounds ObjectMgr::GetSpellScriptsBounds ( uint32  spell_id)
9680{
9681 return SpellScriptsBounds(_spellScriptsStore.lower_bound(spell_id), _spellScriptsStore.upper_bound(spell_id));
9682}
std::pair< SpellScriptsContainer::iterator, SpellScriptsContainer::iterator > SpellScriptsBounds
Definition ObjectMgr.h:389
SpellScriptsContainer _spellScriptsStore
Definition ObjectMgr.h:1596

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
1210 {
1211 TempSummonDataContainer::const_iterator itr = _tempSummonDataStore.find(TempSummonGroupKey(summonerId, summonerType, group));
1212 if (itr != _tempSummonDataStore.end())
1213 return &itr->second;
1214
1215 return nullptr;
1216 }
TempSummonDataContainer _tempSummonDataStore
Stores temp summon data grouped by summoner's entry, summoner's type and group id.
Definition ObjectMgr.h:1671

References _tempSummonDataStore.

◆ GetTaxiMountDisplayId()

uint32 ObjectMgr::GetTaxiMountDisplayId ( uint32  id,
TeamId  teamId,
bool  allowed_alt_team = false 
)
7268{
7269 CreatureModel mountModel;
7270 CreatureTemplate const* mount_info = nullptr;
7271
7272 // select mount creature id
7273 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(id);
7274 if (node)
7275 {
7276 uint32 mount_entry = node->MountCreatureID[teamId == TEAM_ALLIANCE ? 1 : 0];
7277
7278 // Fix for Alliance not being able to use Acherus taxi
7279 // only one mount type for both sides
7280 if (mount_entry == 0 && allowed_alt_team)
7281 {
7282 // Simply reverse the selection. At least one team in theory should have a valid mount ID to choose.
7283 mount_entry = node->MountCreatureID[teamId];
7284 }
7285
7286 mount_info = GetCreatureTemplate(mount_entry);
7287 if (mount_info)
7288 {
7289 CreatureModel const* model = mount_info->GetRandomValidModel();
7290 if (!model)
7291 {
7292 LOG_ERROR("sql.sql", "No displayid found for the taxi mount with the entry {}! Can't load it!", mount_entry);
7293 return 0;
7294 }
7295 mountModel = *model;
7296 }
7297 }
7298
7299 // minfo is not actually used but the mount_id was updated
7300 GetCreatureModelRandomGender(&mountModel, mount_info);
7301
7302 return mountModel.CreatureDisplayID;
7303}
CreatureModelInfo const * GetCreatureModelRandomGender(CreatureModel *model, CreatureTemplate const *creatureTemplate) const
Definition ObjectMgr.cpp:1678
CreatureModel const * GetRandomValidModel() const
Definition Creature.cpp:120

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 
)
7244{
7245 TaxiPathSetBySource::iterator src_i = sTaxiPathSetBySource.find(source);
7246 if (src_i == sTaxiPathSetBySource.end())
7247 {
7248 path = 0;
7249 cost = 0;
7250 return;
7251 }
7252
7253 TaxiPathSetForSource& pathSet = src_i->second;
7254
7255 TaxiPathSetForSource::iterator dest_i = pathSet.find(destination);
7256 if (dest_i == pathSet.end())
7257 {
7258 path = 0;
7259 cost = 0;
7260 return;
7261 }
7262
7263 cost = dest_i->second->price;
7264 path = dest_i->second->ID;
7265}
TaxiPathSetBySource sTaxiPathSetBySource
Definition DBCStores.cpp:183
std::map< uint32, TaxiPathEntry const * > TaxiPathSetForSource
Definition DBCStructure.h:2242

References TaxiNodesEntry::ID, and sTaxiPathSetBySource.

◆ GetTrainer()

Trainer::Trainer * ObjectMgr::GetTrainer ( uint32  creatureId)
10092{
10093 auto itr = _creatureDefaultTrainers.find(creatureId);
10094 if (itr != _creatureDefaultTrainers.end())
10095 return Acore::Containers::MapGetValuePtr(_trainers, itr->second);
10096
10097 return nullptr;
10098}
std::unordered_map< uint32, uint32 > _creatureDefaultTrainers
Definition ObjectMgr.h:1693
std::unordered_map< uint32, Trainer::Trainer > _trainers
Definition ObjectMgr.h:1691

References _creatureDefaultTrainers, _trainers, and Acore::Containers::MapGetValuePtr().

◆ GetVehicleAccessoryList()

VehicleAccessoryList const * ObjectMgr::GetVehicleAccessoryList ( Vehicle veh) const
11015{
11016 if (Creature* cre = veh->GetBase()->ToCreature())
11017 {
11018 // Give preference to GUID-based accessories
11019 VehicleAccessoryContainer::const_iterator itr = _vehicleAccessoryStore.find(cre->GetSpawnId());
11020 if (itr != _vehicleAccessoryStore.end())
11021 return &itr->second;
11022 }
11023
11024 // Otherwise return entry-based
11025 VehicleAccessoryContainer::const_iterator itr = _vehicleTemplateAccessoryStore.find(veh->GetCreatureEntry());
11026 if (itr != _vehicleTemplateAccessoryStore.end())
11027 return &itr->second;
11028 return nullptr;
11029}
VehicleAccessoryContainer _vehicleAccessoryStore
Definition ObjectMgr.h:1599
VehicleAccessoryContainer _vehicleTemplateAccessoryStore
Definition ObjectMgr.h:1598
Creature * ToCreature()
Definition Object.h:206
Unit * GetBase() const
May be called from scripts.
Definition Vehicle.h:37
uint32 GetCreatureEntry() const
Definition Vehicle.h:39

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

◆ GetVehicleSeatAddon()

VehicleSeatAddon const * ObjectMgr::GetVehicleSeatAddon ( uint32  seatId) const
inline
1516 {
1517 VehicleSeatAddonContainer::const_iterator itr = _vehicleSeatAddonStore.find(seatId);
1518 if (itr == _vehicleSeatAddonStore.end())
1519 return nullptr;
1520
1521 return &itr->second;
1522 }
VehicleSeatAddonContainer _vehicleSeatAddonStore
Definition ObjectMgr.h:1600

References _vehicleSeatAddonStore.

◆ GetXPForLevel()

uint32 ObjectMgr::GetXPForLevel ( uint8  level) const
8126{
8127 if (level < _playerXPperLevel.size())
8128 return _playerXPperLevel[level];
8129 return 0;
8130}
PlayerXPperLevel _playerXPperLevel
Definition ObjectMgr.h:1629

References _playerXPperLevel.

◆ InitializeSpellInfoPrecomputedData()

void ObjectMgr::InitializeSpellInfoPrecomputedData ( )
6396{
6397 uint32 limit = sSpellStore.GetNumRows();
6398 for(uint32 i = 0; i <= limit; ++i)
6399 if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i))
6400 {
6401 const_cast<SpellInfo*>(spellInfo)->SetStackableWithRanks(spellInfo->ComputeIsStackableWithRanks());
6402 const_cast<SpellInfo*>(spellInfo)->SetCritCapable(spellInfo->ComputeIsCritCapable());
6403 const_cast<SpellInfo*>(spellInfo)->SetSpellValid(SpellMgr::ComputeIsSpellValid(spellInfo, false));
6404 }
6405}
DBCStorage< SpellEntry > sSpellStore(SpellEntryfmt)
Definition SpellInfo.h:340
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:417

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

◆ instance()

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

References instance().

Referenced by instance().

◆ IsGameObjectStaticTransport()

bool ObjectMgr::IsGameObjectStaticTransport ( uint32  entry)
10995{
10996 GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
10997 return goinfo && goinfo->type == GAMEOBJECT_TYPE_TRANSPORT;
10998}
@ GAMEOBJECT_TYPE_TRANSPORT
Definition SharedDefines.h:1575

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

Referenced by AddGOData().

◆ IsProfanityName()

bool ObjectMgr::IsProfanityName ( std::string_view  name) const
9166{
9167 // pussywizard
9168 if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
9169 return true;
9170
9171 std::wstring wstr;
9172 if (!Utf8toWStr (name, wstr))
9173 return false;
9174
9175 wstrToLower(wstr);
9176
9177 return _profanityNamesStore.find(wstr) != _profanityNamesStore.end();
9178}

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

Referenced by AddProfanityPlayerName().

◆ IsReservedName()

bool ObjectMgr::IsReservedName ( std::string_view  name) const
9063{
9064 // pussywizard
9065 if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
9066 return true;
9067
9068 std::wstring wstr;
9069 if (!Utf8toWStr (name, wstr))
9070 return false;
9071
9072 wstrToLower(wstr);
9073
9074 return _reservedNamesStore.find(wstr) != _reservedNamesStore.end();
9075}

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

Referenced by AddReservedPlayerName().

◆ IsTavernAreaTrigger()

bool ObjectMgr::IsTavernAreaTrigger ( uint32  triggerID,
uint32  faction 
) const
inline
854 {
855 auto itr = _tavernAreaTriggerStore.find(triggerID);
856 if (itr != _tavernAreaTriggerStore.end())
857 {
858 return (itr->second & faction) != 0;
859 }
860
861 return false;
862 }
TavernAreaTriggerContainer _tavernAreaTriggerStore
Definition ObjectMgr.h:1558

References _tavernAreaTriggerStore.

◆ IsTransportMap()

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

References _transportMaps.

◆ IsValidChannelName()

bool ObjectMgr::IsValidChannelName ( std::string const &  name)
static
9339{
9340 std::wstring wname;
9341 if (!Utf8toWStr(name, wname))
9342 return false;
9343
9344 if (wname.size() > MAX_CHANNEL_NAME)
9345 return false;
9346
9347 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_CHANNEL_NAMES);
9348
9349 return isValidString(wname, strictMask, true);
9350}
#define MAX_CHANNEL_NAME
Definition ObjectMgr.h:689
@ CONFIG_STRICT_CHANNEL_NAMES
Definition WorldConfig.h:180

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

◆ IsValidCharterName()

bool ObjectMgr::IsValidCharterName ( std::string_view  name)
static
9313{
9314 std::wstring wname;
9315 if (!Utf8toWStr(name, wname))
9316 return false;
9317
9318 if (wname.size() > MAX_CHARTER_NAME)
9319 return false;
9320
9321 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_CHARTER_NAME);
9322 if (wname.size() < minName)
9323 return false;
9324
9325 // Check Reserved Name
9326 if (sObjectMgr->IsReservedName(name))
9327 return false;
9328
9329 // Check Profanity Name
9330 if (sObjectMgr->IsProfanityName(name))
9331 return false;
9332
9333 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_CHARTER_NAMES);
9334
9335 return isValidString(wname, strictMask, true);
9336}
#define MAX_CHARTER_NAME
Definition ObjectMgr.h:688
@ CONFIG_MIN_CHARTER_NAME
Definition WorldConfig.h:183
@ CONFIG_STRICT_CHARTER_NAMES
Definition WorldConfig.h:179

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,
uint32  maxcount,
uint32  ptime,
uint32  ExtendedCost,
Player player = nullptr,
std::set< uint32 > *  skip_vendors = nullptr,
uint32  ORnpcflag = 0 
) const
10363{
10364 /*
10365 CreatureTemplate const* cInfo = GetCreatureTemplate(vendor_entry);
10366 if (!cInfo)
10367 {
10368 if (player)
10369 ChatHandler(player->GetSession()).SendSysMessage(LANG_COMMAND_VENDORSELECTION);
10370 else
10371 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have data for not existed creature template (Entry: {}), ignore", vendor_entry);
10372 return false;
10373 }
10374
10375 if (!((cInfo->npcflag | ORnpcflag) & UNIT_NPC_FLAG_VENDOR))
10376 {
10377 if (!skip_vendors || skip_vendors->count(vendor_entry) == 0)
10378 {
10379 if (player)
10380 ChatHandler(player->GetSession()).SendSysMessage(LANG_COMMAND_VENDORSELECTION);
10381 else
10382 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have data for not creature template (Entry: {}) without vendor flag, ignore", vendor_entry);
10383
10384 if (skip_vendors)
10385 skip_vendors->insert(vendor_entry);
10386 }
10387 return false;
10388 }
10389 */
10390
10391 if (!sObjectMgr->GetItemTemplate(item_id))
10392 {
10393 if (player)
10395 else
10396 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` for Vendor (Entry: {}) have in item list non-existed item ({}), ignore", vendor_entry, item_id);
10397 return false;
10398 }
10399
10400 if (ExtendedCost && !sItemExtendedCostStore.LookupEntry(ExtendedCost))
10401 {
10402 if (player)
10404 else
10405 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have Item (Entry: {}) with wrong ExtendedCost ({}) for vendor ({}), ignore", item_id, ExtendedCost, vendor_entry);
10406 return false;
10407 }
10408
10409 if (maxcount > 0 && incrtime == 0)
10410 {
10411 if (player)
10412 ChatHandler(player->GetSession()).PSendSysMessage("MaxCount != 0 ({}) but IncrTime == 0", maxcount);
10413 else
10414 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);
10415 return false;
10416 }
10417 else if (maxcount == 0 && incrtime > 0)
10418 {
10419 if (player)
10420 ChatHandler(player->GetSession()).PSendSysMessage("MaxCount == 0 but IncrTime<>= 0");
10421 else
10422 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);
10423 return false;
10424 }
10425
10426 VendorItemData const* vItems = GetNpcVendorItemList(vendor_entry);
10427 if (!vItems)
10428 return true; // later checks for non-empty lists
10429
10430 if (vItems->FindItemCostPair(item_id, ExtendedCost))
10431 {
10432 if (player)
10433 ChatHandler(player->GetSession()).PSendSysMessage(LANG_ITEM_ALREADY_IN_LIST, item_id, ExtendedCost);
10434 else
10435 LOG_ERROR("sql.sql", "Table `npc_vendor` has duplicate items {} (with extended cost {}) for vendor (Entry: {}), ignoring", item_id, ExtendedCost, vendor_entry);
10436 return false;
10437 }
10438
10439 return true;
10440}
DBCStorage< ItemExtendedCostEntry > sItemExtendedCostStore(ItemExtendedCostEntryfmt)
@ LANG_ITEM_ALREADY_IN_LIST
Definition Language.h:256
@ LANG_ITEM_NOT_FOUND
Definition Language.h:253
@ LANG_EXTENDED_COST_NOT_EXIST
Definition Language.h:381
Definition Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:219
VendorItemData const * GetNpcVendorItemList(uint32 entry) const
Definition ObjectMgr.h:1443
WorldSession * GetSession() const
Definition Player.h:2020
VendorItem const * FindItemCostPair(uint32 item_id, uint32 extendedCost) const
Definition Creature.cpp:104

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 ( )
7417{
7418 uint32 oldMSTime = getMSTime();
7419
7420 if (!_accessRequirementStore.empty())
7421 {
7422 for (DungeonProgressionRequirementsContainer::iterator itr = _accessRequirementStore.begin(); itr != _accessRequirementStore.end(); ++itr)
7423 {
7424 std::unordered_map<uint8, DungeonProgressionRequirements*> difficulties = itr->second;
7425 for (auto difficultiesItr = difficulties.begin(); difficultiesItr != difficulties.end(); ++difficultiesItr)
7426 {
7427 for (auto questItr = difficultiesItr->second->quests.begin(); questItr != difficultiesItr->second->quests.end(); ++questItr)
7428 {
7429 delete* questItr;
7430 }
7431
7432 for (auto achievementItr = difficultiesItr->second->achievements.begin(); achievementItr != difficultiesItr->second->achievements.end(); ++achievementItr)
7433 {
7434 delete* achievementItr;
7435 }
7436
7437 for (auto itemsItr = difficultiesItr->second->items.begin(); itemsItr != difficultiesItr->second->items.end(); ++itemsItr)
7438 {
7439 delete* itemsItr;
7440 }
7441
7442 delete difficultiesItr->second;
7443 }
7444 }
7445
7446 _accessRequirementStore.clear(); // need for reload case
7447 }
7448 // 0 1 2 3 4 5
7449 QueryResult access_template_result = WorldDatabase.Query("SELECT id, map_id, difficulty, min_level, max_level, min_avg_item_level FROM dungeon_access_template");
7450 if (!access_template_result)
7451 {
7452 LOG_WARN("server.loading", ">> Loaded 0 access requirement definitions. DB table `dungeon_access_template` is empty.");
7453 LOG_INFO("server.loading", " ");
7454 return;
7455 }
7456
7457 uint32 count = 0;
7458 uint32 countProgressionRequirements = 0;
7459
7460 do
7461 {
7462 Field* fields = access_template_result->Fetch();
7463
7464 //Get the common variables for the access requirements
7465 uint8 dungeon_access_id = fields[0].Get<uint8>();
7466 uint32 mapid = fields[1].Get<uint32>();
7467 uint8 difficulty = fields[2].Get<uint8>();
7468
7469 //Set up the access requirements
7471 ar->levelMin = fields[3].Get<uint8>();
7472 ar->levelMax = fields[4].Get<uint8>();
7473 ar->reqItemLevel = fields[5].Get<uint16>();
7474
7475 // 0 1 2 3 4 6
7476 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);
7477 if (progression_requirements_results)
7478 {
7479 do
7480 {
7481 Field* progression_requirement_row = progression_requirements_results->Fetch();
7482
7483 const uint8 requirement_type = progression_requirement_row[0].Get<uint8>();
7484 const uint32 requirement_id = progression_requirement_row[1].Get<uint32>();
7485 const std::string requirement_note = progression_requirement_row[2].Get<std::string>();
7486 const uint8 requirement_faction = progression_requirement_row[3].Get<uint8>();
7487 const uint8 requirement_priority = progression_requirement_row[4].IsNull() ? UINT8_MAX : progression_requirement_row[4].Get<uint8>();
7488 const bool requirement_checkLeaderOnly = progression_requirement_row[5].Get<bool>();
7489
7490 ProgressionRequirement* progression_requirement = new ProgressionRequirement();
7491 progression_requirement->id = requirement_id;
7492 progression_requirement->note = requirement_note;
7493 progression_requirement->faction = (TeamId)requirement_faction;
7494 progression_requirement->priority = requirement_priority;
7495 progression_requirement->checkLeaderOnly = requirement_checkLeaderOnly;
7496
7497 std::vector<ProgressionRequirement*>* currentRequirementsList = nullptr;
7498
7499 switch (requirement_type)
7500 {
7501 case 0:
7502 {
7503 //Achievement
7504 if (!sAchievementStore.LookupEntry(progression_requirement->id))
7505 {
7506 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);
7507 break;
7508 }
7509
7510 currentRequirementsList = &ar->achievements;
7511 break;
7512 }
7513 case 1:
7514 {
7515 //Quest
7516 if (!GetQuestTemplate(progression_requirement->id))
7517 {
7518 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);
7519 break;
7520 }
7521
7522 currentRequirementsList = &ar->quests;
7523 break;
7524 }
7525 case 2:
7526 {
7527 //Item
7528 ItemTemplate const* pProto = GetItemTemplate(progression_requirement->id);
7529 if (!pProto)
7530 {
7531 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);
7532 break;
7533 }
7534
7535 currentRequirementsList = &ar->items;
7536 break;
7537 }
7538 default:
7539 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);
7540 break;
7541 }
7542
7543 //Check if array is valid and delete the progression requirement
7544 if (!currentRequirementsList)
7545 {
7546 delete progression_requirement;
7547 continue;
7548 }
7549
7550 //Insert into the array
7551 if (currentRequirementsList->size() > requirement_priority)
7552 {
7553 currentRequirementsList->insert(currentRequirementsList->begin() + requirement_priority, progression_requirement);
7554 }
7555 else
7556 {
7557 currentRequirementsList->push_back(progression_requirement);
7558 }
7559
7560 } while (progression_requirements_results->NextRow());
7561 }
7562
7563 //Sort all arrays for priority
7564 auto sortFunction = [](const ProgressionRequirement* const a, const ProgressionRequirement* const b) {return a->priority > b->priority; };
7565 std::sort(ar->achievements.begin(), ar->achievements.end(), sortFunction);
7566 std::sort(ar->quests.begin(), ar->quests.end(), sortFunction);
7567 std::sort(ar->items.begin(), ar->items.end(), sortFunction);
7568
7569 countProgressionRequirements += ar->achievements.size();
7570 countProgressionRequirements += ar->quests.size();
7571 countProgressionRequirements += ar->items.size();
7572 count++;
7573
7574 _accessRequirementStore[mapid][difficulty] = ar;
7575 } while (access_template_result->NextRow());
7576
7577 LOG_INFO("server.loading", ">> Loaded {} Rows From dungeon_access_template And {} Rows From dungeon_access_requirements in {} ms", count, countProgressionRequirements, GetMSTimeDiffToNow(oldMSTime));
7578 LOG_INFO("server.loading", " ");
7579}
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
#define LOG_WARN(filterType__,...)
Definition Log.h:149
TeamId
Definition SharedDefines.h:747
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition Timer.h:131
uint32 getMSTime()
Definition Timer.h:103
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
ItemTemplate const * GetItemTemplate(uint32 entry)
Definition ObjectMgr.cpp:3871
Quest const * GetQuestTemplate(uint32 quest_id) const
Definition ObjectMgr.h:838
Definition Player.h:935
Definition ItemTemplate.h:619
Definition Player.h:926
uint32 priority
Definition Player.h:930

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 ( )
9546{
9547 uint32 oldMSTime = getMSTime();
9548
9549 _acoreStringStore.clear(); // for reload case
9550 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");
9551 if (!result)
9552 {
9553 LOG_WARN("server.loading", ">> Loaded 0 acore strings. DB table `acore_strings` is empty.");
9554 LOG_INFO("server.loading", " ");
9555 return false;
9556 }
9557
9558 do
9559 {
9560 Field* fields = result->Fetch();
9561
9562 uint32 entry = fields[0].Get<uint32>();
9563
9564 AcoreString& data = _acoreStringStore[entry];
9565
9566 data.Content.resize(DEFAULT_LOCALE + 1);
9567
9568 for (uint8 i = 0; i < TOTAL_LOCALES; ++i)
9569 AddLocaleString(fields[i + 1].Get<std::string>(), LocaleConstant(i), data.Content);
9570 } while (result->NextRow());
9571
9572 LOG_INFO("server.loading", ">> Loaded {} Acore Strings in {} ms", (uint32)_acoreStringStore.size(), GetMSTimeDiffToNow(oldMSTime));
9573 LOG_INFO("server.loading", " ");
9574
9575 return true;
9576}
LocaleConstant
Definition Common.h:117
@ TOTAL_LOCALES
Definition Common.h:128
static void AddLocaleString(std::string &&s, LocaleConstant locale, std::vector< std::string > &data)
Definition ObjectMgr.cpp:383

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

◆ LoadAreaTriggers()

void ObjectMgr::LoadAreaTriggers ( )
7306{
7307 uint32 oldMSTime = getMSTime();
7308
7309 _areaTriggerStore.clear();
7310
7311 QueryResult result = WorldDatabase.Query("SELECT entry, map, x, y, z, radius, length, width, height, orientation FROM areatrigger");
7312
7313 if (!result)
7314 {
7315 LOG_WARN("server.loading", ">> Loaded 0 area trigger definitions. DB table `areatrigger` is empty.");
7316 LOG_INFO("server.loading", " ");
7317 return;
7318 }
7319
7320 uint32 count = 0;
7321
7322 do
7323 {
7324 Field* fields = result->Fetch();
7325
7326 ++count;
7327
7328 AreaTrigger at;
7329
7330 at.entry = fields[0].Get<uint32>();
7331 at.map = fields[1].Get<uint32>();
7332 at.x = fields[2].Get<float>();
7333 at.y = fields[3].Get<float>();
7334 at.z = fields[4].Get<float>();
7335 at.radius = fields[5].Get<float>();
7336 at.length = fields[6].Get<float>();
7337 at.width = fields[7].Get<float>();
7338 at.height = fields[8].Get<float>();
7339 at.orientation = fields[9].Get<float>();
7340
7341 MapEntry const* mapEntry = sMapStore.LookupEntry(at.map);
7342 if (!mapEntry)
7343 {
7344 LOG_ERROR("sql.sql", "Area trigger (ID:{}) map (ID: {}) does not exist in `Map.dbc`.", at.entry, at.map);
7345 continue;
7346 }
7347
7348 _areaTriggerStore[at.entry] = at;
7349 } while (result->NextRow());
7350
7351 LOG_INFO("server.loading", ">> Loaded {} Area Trigger Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7352 LOG_INFO("server.loading", " ");
7353}
float height
Definition ObjectMgr.h:430
float x
Definition ObjectMgr.h:424
float y
Definition ObjectMgr.h:425
float orientation
Definition ObjectMgr.h:431
float length
Definition ObjectMgr.h:428
uint32 entry
Definition ObjectMgr.h:422
float radius
Definition ObjectMgr.h:427
float z
Definition ObjectMgr.h:426
float width
Definition ObjectMgr.h:429

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 ( )
7159{
7160 uint32 oldMSTime = getMSTime();
7161
7162 _areaTriggerScriptStore.clear(); // need for reload case
7163 QueryResult result = WorldDatabase.Query("SELECT entry, ScriptName FROM areatrigger_scripts");
7164
7165 if (!result)
7166 {
7167 LOG_WARN("server.loading", ">> Loaded 0 Areatrigger Scripts. DB Table `areatrigger_scripts` Is Empty.");
7168 LOG_INFO("server.loading", " ");
7169 return;
7170 }
7171
7172 uint32 count = 0;
7173
7174 do
7175 {
7176 ++count;
7177
7178 Field* fields = result->Fetch();
7179
7180 uint32 Trigger_ID = fields[0].Get<uint32>();
7181 std::string scriptName = fields[1].Get<std::string>();
7182
7183 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
7184 if (!atEntry)
7185 {
7186 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
7187 continue;
7188 }
7189 _areaTriggerScriptStore[Trigger_ID] = GetScriptId(scriptName);
7190 } while (result->NextRow());
7191
7192 LOG_INFO("server.loading", ">> Loaded {} Areatrigger Scripts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7193 LOG_INFO("server.loading", " ");
7194}
uint32 GetScriptId(std::string const &name)
Definition ObjectMgr.cpp:10504

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

◆ LoadAreaTriggerTeleports()

void ObjectMgr::LoadAreaTriggerTeleports ( )
7356{
7357 uint32 oldMSTime = getMSTime();
7358
7359 _areaTriggerTeleportStore.clear(); // need for reload case
7360
7361 // 0 1 2 3 4 5
7362 QueryResult result = WorldDatabase.Query("SELECT ID, target_map, target_position_x, target_position_y, target_position_z, target_orientation FROM areatrigger_teleport");
7363
7364 if (!result)
7365 {
7366 LOG_WARN("server.loading", ">> Loaded 0 area trigger teleport definitions. DB table `areatrigger_teleport` is empty.");
7367 LOG_INFO("server.loading", " ");
7368 return;
7369 }
7370
7371 uint32 count = 0;
7372
7373 do
7374 {
7375 Field* fields = result->Fetch();
7376
7377 ++count;
7378
7379 uint32 Trigger_ID = fields[0].Get<uint32>();
7380
7382
7383 at.target_mapId = fields[1].Get<uint16>();
7384 at.target_X = fields[2].Get<float>();
7385 at.target_Y = fields[3].Get<float>();
7386 at.target_Z = fields[4].Get<float>();
7387 at.target_Orientation = fields[5].Get<float>();
7388
7389 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
7390 if (!atEntry)
7391 {
7392 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
7393 continue;
7394 }
7395
7396 MapEntry const* mapEntry = sMapStore.LookupEntry(at.target_mapId);
7397 if (!mapEntry)
7398 {
7399 LOG_ERROR("sql.sql", "Area trigger (ID:{}) target map (ID: {}) does not exist in `Map.dbc`.", Trigger_ID, at.target_mapId);
7400 continue;
7401 }
7402
7403 if (at.target_X == 0 && at.target_Y == 0 && at.target_Z == 0)
7404 {
7405 LOG_ERROR("sql.sql", "Area trigger (ID:{}) target coordinates not provided.", Trigger_ID);
7406 continue;
7407 }
7408
7409 _areaTriggerTeleportStore[Trigger_ID] = at;
7410 } while (result->NextRow());
7411
7412 LOG_INFO("server.loading", ">> Loaded {} Area Trigger Teleport Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7413 LOG_INFO("server.loading", " ");
7414}
Definition ObjectMgr.h:412
uint32 target_mapId
Definition ObjectMgr.h:413

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

◆ LoadBroadcastTextLocales()

void ObjectMgr::LoadBroadcastTextLocales ( )
10604{
10605 uint32 oldMSTime = getMSTime();
10606
10607 // 0 1 2 3
10608 QueryResult result = WorldDatabase.Query("SELECT ID, locale, MaleText, FemaleText FROM broadcast_text_locale");
10609
10610 if (!result)
10611 {
10612 LOG_WARN("server.loading", ">> Loaded 0 broadcast text locales. DB table `broadcast_text_locale` is empty.");
10613 LOG_INFO("server.loading", " ");
10614 return;
10615 }
10616
10617 uint32 locales_count = 0;
10618 do
10619 {
10620 Field* fields = result->Fetch();
10621
10622 uint32 id = fields[0].Get<uint32>();
10623
10624 BroadcastTextContainer::iterator bct = _broadcastTextStore.find(id);
10625 if (bct == _broadcastTextStore.end())
10626 {
10627 LOG_ERROR("sql.sql", "BroadcastText (Id: {}) found in table `broadcast_text_locale` but does not exist in `broadcast_text`. Skipped!", id);
10628 continue;
10629 }
10630
10631 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
10632 if (locale == LOCALE_enUS)
10633 continue;
10634
10635 AddLocaleString(fields[2].Get<std::string>(), locale, bct->second.MaleText);
10636 AddLocaleString(fields[3].Get<std::string>(), locale, bct->second.FemaleText);
10637 locales_count++;
10638 } while (result->NextRow());
10639
10640 LOG_INFO("server.loading", ">> Loaded {} Broadcast Text Locales in {} ms", locales_count, GetMSTimeDiffToNow(oldMSTime));
10641 LOG_INFO("server.loading", " ");
10642}
LocaleConstant GetLocaleByName(const std::string &name)
Definition Common.cpp:42

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

◆ LoadBroadcastTexts()

void ObjectMgr::LoadBroadcastTexts ( )
10519{
10520 uint32 oldMSTime = getMSTime();
10521
10522 _broadcastTextStore.clear(); // for reload case
10523
10524 // 0 1 2 3 4 5 6 7 8 9 10 11 12
10525 QueryResult result = WorldDatabase.Query("SELECT ID, LanguageID, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3, SoundEntriesID, EmotesID, Flags FROM broadcast_text");
10526 if (!result)
10527 {
10528 LOG_WARN("server.loading", ">> Loaded 0 broadcast texts. DB table `broadcast_text` is empty.");
10529 LOG_INFO("server.loading", " ");
10530 return;
10531 }
10532
10533 _broadcastTextStore.rehash(result->GetRowCount());
10534
10535 do
10536 {
10537 Field* fields = result->Fetch();
10538
10539 BroadcastText bct;
10540
10541 bct.Id = fields[0].Get<uint32>();
10542 bct.LanguageID = fields[1].Get<uint32>();
10543 bct.MaleText[DEFAULT_LOCALE] = fields[2].Get<std::string>();
10544 bct.FemaleText[DEFAULT_LOCALE] = fields[3].Get<std::string>();
10545 bct.EmoteId1 = fields[4].Get<uint32>();
10546 bct.EmoteId2 = fields[5].Get<uint32>();
10547 bct.EmoteId3 = fields[6].Get<uint32>();
10548 bct.EmoteDelay1 = fields[7].Get<uint32>();
10549 bct.EmoteDelay2 = fields[8].Get<uint32>();
10550 bct.EmoteDelay3 = fields[9].Get<uint32>();
10551 bct.SoundEntriesId = fields[10].Get<uint32>();
10552 bct.EmotesID = fields[11].Get<uint32>();
10553 bct.Flags = fields[12].Get<uint32>();
10554
10555 if (bct.SoundEntriesId)
10556 {
10557 if (!sSoundEntriesStore.LookupEntry(bct.SoundEntriesId))
10558 {
10559 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has SoundEntriesId {} but sound does not exist.", bct.Id, bct.SoundEntriesId);
10560 bct.SoundEntriesId = 0;
10561 }
10562 }
10563
10565 {
10566 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` using Language {} but Language does not exist.", bct.Id, bct.LanguageID);
10568 }
10569
10570 if (bct.EmoteId1)
10571 {
10572 if (!sEmotesStore.LookupEntry(bct.EmoteId1))
10573 {
10574 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId1 {} but emote does not exist.", bct.Id, bct.EmoteId1);
10575 bct.EmoteId1 = 0;
10576 }
10577 }
10578
10579 if (bct.EmoteId2)
10580 {
10581 if (!sEmotesStore.LookupEntry(bct.EmoteId2))
10582 {
10583 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId2 {} but emote does not exist.", bct.Id, bct.EmoteId2);
10584 bct.EmoteId2 = 0;
10585 }
10586 }
10587
10588 if (bct.EmoteId3)
10589 {
10590 if (!sEmotesStore.LookupEntry(bct.EmoteId3))
10591 {
10592 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId3 {} but emote does not exist.", bct.Id, bct.EmoteId3);
10593 bct.EmoteId3 = 0;
10594 }
10595 }
10596
10597 _broadcastTextStore[bct.Id] = bct;
10598 } while (result->NextRow());
10599
10600 LOG_INFO("server.loading", ">> Loaded {} Broadcast Texts in {} ms", _broadcastTextStore.size(), GetMSTimeDiffToNow(oldMSTime));
10601}
DBCStorage< SoundEntriesEntry > sSoundEntriesStore(SoundEntriesfmt)
DBCStorage< EmotesEntry > sEmotesStore(EmotesEntryfmt)
LanguageDesc const * GetLanguageDescByID(uint32 lang)
Definition ObjectMgr.cpp:254
@ LANG_UNIVERSAL
Definition SharedDefines.h:723
Definition ObjectMgr.h:435
uint32 EmoteDelay2
Definition ObjectMgr.h:450
uint32 Id
Definition ObjectMgr.h:442
std::vector< std::string > FemaleText
Definition ObjectMgr.h:445
uint32 EmotesID
Definition ObjectMgr.h:453
uint32 LanguageID
Definition ObjectMgr.h:443
uint32 EmoteId2
Definition ObjectMgr.h:447
uint32 EmoteDelay1
Definition ObjectMgr.h:449
uint32 SoundEntriesId
Definition ObjectMgr.h:452
std::vector< std::string > MaleText
Definition ObjectMgr.h:444
uint32 EmoteId3
Definition ObjectMgr.h:448
uint32 EmoteId1
Definition ObjectMgr.h:446
uint32 EmoteDelay3
Definition ObjectMgr.h:451
uint32 Flags
Definition ObjectMgr.h:454

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 ( )
1263{
1264 uint32 oldMSTime = getMSTime();
1265
1266 // 0 1 2 3 4 5 6 7
1267 QueryResult result = WorldDatabase.Query("SELECT guid, path_id, mount, bytes1, bytes2, emote, visibilityDistanceType, auras FROM creature_addon");
1268
1269 if (!result)
1270 {
1271 LOG_WARN("server.loading", ">> Loaded 0 creature addon definitions. DB table `creature_addon` is empty.");
1272 LOG_INFO("server.loading", " ");
1273 return;
1274 }
1275
1276 uint32 count = 0;
1277 do
1278 {
1279 Field* fields = result->Fetch();
1280
1281 ObjectGuid::LowType guid = fields[0].Get<uint32>();
1282
1283 CreatureData const* creData = GetCreatureData(guid);
1284 if (!creData)
1285 {
1286 LOG_ERROR("sql.sql", "Creature (GUID: {}) does not exist but has a record in `creature_addon`", guid);
1287 continue;
1288 }
1289
1290 CreatureAddon& creatureAddon = _creatureAddonStore[guid];
1291
1292 creatureAddon.path_id = fields[1].Get<uint32>();
1293 if (creData->movementType == WAYPOINT_MOTION_TYPE && !creatureAddon.path_id)
1294 {
1295 const_cast<CreatureData*>(creData)->movementType = IDLE_MOTION_TYPE;
1296 LOG_ERROR("sql.sql", "Creature (GUID {}) has movement type set to WAYPOINT_MOTION_TYPE but no path assigned", guid);
1297 }
1298
1299 creatureAddon.mount = fields[2].Get<uint32>();
1300 creatureAddon.bytes1 = fields[3].Get<uint32>();
1301 creatureAddon.bytes2 = fields[4].Get<uint32>();
1302 creatureAddon.emote = fields[5].Get<uint32>();
1303 creatureAddon.visibilityDistanceType = VisibilityDistanceType(fields[6].Get<uint8>());
1304
1305 for (std::string_view aura : Acore::Tokenize(fields[7].Get<std::string_view>(), ' ', false))
1306 {
1307 SpellInfo const* spellInfo = nullptr;
1308
1309 if (Optional<uint32> spellId = Acore::StringTo<uint32>(aura))
1310 {
1311 spellInfo = sSpellMgr->GetSpellInfo(*spellId);
1312 }
1313
1314 if (!spellInfo)
1315 {
1316 LOG_ERROR("sql.sql", "Creature (GUID: {}) has wrong spell '{}' defined in `auras` field in `creature_addon`.", guid, aura);
1317 continue;
1318 }
1319
1320 if (std::find(creatureAddon.auras.begin(), creatureAddon.auras.end(), spellInfo->Id) != creatureAddon.auras.end())
1321 {
1322 LOG_ERROR("sql.sql", "Creature (GUID: {}) has duplicate aura (spell {}) in `auras` field in `creature_addon`.", guid, spellInfo->Id);
1323 continue;
1324 }
1325
1326 if (spellInfo->GetDuration() > 0)
1327 {
1328 LOG_DEBUG/*ERROR*/("sql.sql", "Creature (Entry: {}) has temporary aura (spell {}) in `auras` field in `creature_template_addon`.", guid, spellInfo->Id);
1329 // continue;
1330 }
1331
1332 creatureAddon.auras.push_back(spellInfo->Id);
1333 }
1334
1335 if (creatureAddon.mount)
1336 {
1337 if (!sCreatureDisplayInfoStore.LookupEntry(creatureAddon.mount))
1338 {
1339 LOG_ERROR("sql.sql", "Creature (GUID: {}) has invalid displayInfoId ({}) for mount defined in `creature_addon`", guid, creatureAddon.mount);
1340 creatureAddon.mount = 0;
1341 }
1342 }
1343
1344 if (!sEmotesStore.LookupEntry(creatureAddon.emote))
1345 {
1346 LOG_ERROR("sql.sql", "Creature (GUID: {}) has invalid emote ({}) defined in `creature_addon`.", guid, creatureAddon.emote);
1347 creatureAddon.emote = 0;
1348 }
1349
1351 {
1352 LOG_ERROR("sql.sql", "Creature (GUID: {}) has invalid visibilityDistanceType ({}) defined in `creature_addon`.", guid, AsUnderlyingType(creatureAddon.visibilityDistanceType));
1354 }
1355
1356 ++count;
1357 } while (result->NextRow());
1358
1359 LOG_INFO("server.loading", ">> Loaded {} Creature Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1360 LOG_INFO("server.loading", " ");
1361}
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
@ WAYPOINT_MOTION_TYPE
Definition MotionMaster.h:41
VisibilityDistanceType
Definition ObjectDefines.h:62
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:610
uint32 Id
Definition SpellInfo.h:344
int32 GetDuration() const
Definition SpellInfo.cpp:2738
Definition AsioHacksFwd.h:47
std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
Definition Tokenize.cpp:20
STL namespace.
Definition CreatureData.h:431
std::vector< uint32 > auras
Definition CreatureData.h:437
uint32 mount
Definition CreatureData.h:433
uint32 emote
Definition CreatureData.h:436
uint32 path_id
Definition CreatureData.h:432
VisibilityDistanceType visibilityDistanceType
Definition CreatureData.h:438
uint32 bytes1
Definition CreatureData.h:434
uint32 bytes2
Definition CreatureData.h:435

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, Max, CreatureAddon::mount, Normal, CreatureAddon::path_id, sCreatureDisplayInfoStore, sEmotesStore, sSpellMgr, Acore::Tokenize(), CreatureAddon::visibilityDistanceType, WAYPOINT_MOTION_TYPE, and WorldDatabase.

◆ LoadCreatureClassLevelStats()

void ObjectMgr::LoadCreatureClassLevelStats ( )
10676{
10677 uint32 oldMSTime = getMSTime();
10678
10679 QueryResult result = WorldDatabase.Query("SELECT level, class, basehp0, basehp1, basehp2, basemana, basearmor, attackpower, rangedattackpower, damage_base, damage_exp1, damage_exp2, Strength, Agility, Stamina, Intellect, Spirit FROM creature_classlevelstats");
10680
10681 if (!result)
10682 {
10683 LOG_WARN("server.loading", ">> Loaded 0 creature base stats. DB table `creature_classlevelstats` is empty.");
10684 LOG_INFO("server.loading", " ");
10685 return;
10686 }
10687
10688 uint32 count = 0;
10689 do
10690 {
10691 Field* fields = result->Fetch();
10692
10693 uint8 Level = fields[0].Get<uint8>();
10694 uint8 Class = fields[1].Get<uint8>();
10695
10696 if (!Class || ((1 << (Class - 1)) & CLASSMASK_ALL_CREATURES) == 0)
10697 LOG_ERROR("sql.sql", "Creature base stats for level {} has invalid class {}", Level, Class);
10698
10699 CreatureBaseStats stats;
10700
10701 for (uint8 i = 0; i < MAX_EXPANSIONS; ++i)
10702 {
10703 stats.BaseHealth[i] = fields[2 + i].Get<uint32>();
10704
10705 if (stats.BaseHealth[i] == 0)
10706 {
10707 LOG_ERROR("sql.sql", "Creature base stats for class {}, level {} has invalid zero base HP[{}] - set to 1", Class, Level, i);
10708 stats.BaseHealth[i] = 1;
10709 }
10710
10711 // xinef: if no data is available, get them from lower expansions
10712 if (stats.BaseHealth[i] <= 1)
10713 {
10714 for (uint8 j = i; j > 0;)
10715 {
10716 --j;
10717 if (stats.BaseHealth[j] > 1)
10718 {
10719 stats.BaseHealth[i] = stats.BaseHealth[j];
10720 break;
10721 }
10722 }
10723 }
10724
10725 stats.BaseDamage[i] = fields[9 + i].Get<float>();
10726 if (stats.BaseDamage[i] < 0.0f)
10727 {
10728 LOG_ERROR("sql.sql", "Creature base stats for class {}, level {} has invalid negative base damage[{}] - set to 0.0", Class, Level, i);
10729 stats.BaseDamage[i] = 0.0f;
10730 }
10731 }
10732
10733 stats.BaseMana = fields[5].Get<uint32>();
10734 stats.BaseArmor = fields[6].Get<uint32>();
10735
10736 stats.AttackPower = fields[7].Get<uint32>();
10737 stats.RangedAttackPower = fields[8].Get<uint32>();
10738
10739 stats.Strength = fields[12].Get<uint32>();
10740 stats.Agility = fields[13].Get<uint32>();
10741 stats.Stamina = fields[14].Get<uint32>();
10742 stats.Intellect = fields[15].Get<uint32>();
10743 stats.Spirit = fields[16].Get<uint32>();
10744
10745 if (!stats.Strength || !stats.Agility || !stats.Stamina || !stats.Intellect || !stats.Spirit)
10746 {
10747 // Once these attributes are implemented, this should probably be uncommented.
10748 // LOG_WARN("server.loading", "Creature base attributes for class {}, level {} are missing!", Class, Level);
10749 }
10750
10752
10753 ++count;
10754 } while (result->NextRow());
10755
10757 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
10758 {
10759 for (uint16 lvl = itr->second.minlevel; lvl <= itr->second.maxlevel; ++lvl)
10760 {
10761 if (_creatureBaseStatsStore.find(MAKE_PAIR16(lvl, itr->second.unit_class)) == _creatureBaseStatsStore.end())
10762 LOG_ERROR("sql.sql", "Missing base stats for creature class {} level {}", itr->second.unit_class, lvl);
10763 }
10764 }
10765
10766 LOG_INFO("server.loading", ">> Loaded {} Creature Base Stats in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10767 LOG_INFO("server.loading", " ");
10768}
std::unordered_map< uint32, CreatureTemplate > CreatureTemplateContainer
Definition CreatureData.h:287
@ Class
Requires the player to be a specific class.
@ Level
Requires the player to be at least a specific level.
CreatureTemplateContainer const * GetCreatureTemplates() const
Definition ObjectMgr.h:772
uint32 BaseMana
Definition CreatureData.h:300
uint32 Agility
Definition CreatureData.h:306
float BaseDamage[MAX_EXPANSIONS]
Definition CreatureData.h:304
uint32 RangedAttackPower
Definition CreatureData.h:303
uint32 AttackPower
Definition CreatureData.h:302
uint32 BaseHealth[MAX_EXPANSIONS]
Definition CreatureData.h:299
uint32 Strength
Definition CreatureData.h:305
float BaseArmor
Definition CreatureData.h:301
uint32 Spirit
Definition CreatureData.h:309
uint32 Stamina
Definition CreatureData.h:307
uint32 Intellect
Definition CreatureData.h:308

References _creatureBaseStatsStore, CreatureBaseStats::Agility, CreatureBaseStats::AttackPower, CreatureBaseStats::BaseArmor, CreatureBaseStats::BaseDamage, CreatureBaseStats::BaseHealth, CreatureBaseStats::BaseMana, Class, CLASSMASK_ALL_CREATURES, Field::Get(), GetCreatureTemplates(), getMSTime(), GetMSTimeDiffToNow(), CreatureBaseStats::Intellect, Level, LOG_ERROR, LOG_INFO, LOG_WARN, MAKE_PAIR16(), MAX_EXPANSIONS, CreatureBaseStats::RangedAttackPower, CreatureBaseStats::Spirit, CreatureBaseStats::Stamina, CreatureBaseStats::Strength, and WorldDatabase.

◆ LoadCreatureCustomIDs()

void ObjectMgr::LoadCreatureCustomIDs ( )

Load config option Creatures.CustomIDs into Store.

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

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

◆ LoadCreatureDataFromDB()

CreatureData const * ObjectMgr::LoadCreatureDataFromDB ( ObjectGuid::LowType  spawnId)

Loads a single creature spawn entry from the database into the data store cache.

This is needed as a prerequisite for Creature::LoadCreatureFromDB(), which reads from the in-memory cache (via GetCreatureData()) rather than querying the DB itself. For spawns not loaded during server startup, this method populates the cache so that Creature::LoadCreatureFromDB() can then create the live entity.

Returns the cached data if already loaded, or nullptr if the spawn doesn't exist or fails validation.

Parameters
spawnIdThe creature spawn GUID to load.
Returns
Pointer to the cached CreatureData, or nullptr on failure.
2529{
2530 CreatureData const* data = GetCreatureData(spawnId);
2531 if (data)
2532 return data;
2533
2534 QueryResult result = WorldDatabase.Query("SELECT creature.guid, id1, id2, id3, map, equipment_id, "
2535 "position_x, position_y, position_z, orientation, spawntimesecs, wander_distance, "
2536 "currentwaypoint, curhealth, curmana, MovementType, spawnMask, phaseMask, "
2537 "creature.npcflag, creature.unit_flags, creature.dynamicflags, creature.ScriptName "
2538 "FROM creature WHERE creature.guid = {}", spawnId);
2539
2540 if (!result)
2541 return nullptr;
2542
2543 Field* fields = result->Fetch();
2544 uint32 id1 = fields[1].Get<uint32>();
2545 uint32 id2 = fields[2].Get<uint32>();
2546 uint32 id3 = fields[3].Get<uint32>();
2547
2548 CreatureTemplate const* cInfo = GetCreatureTemplate(id1);
2549 if (!cInfo)
2550 {
2551 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with non-existing creature entry {} in id1 field, skipped.", spawnId, id1);
2552 return nullptr;
2553 }
2554
2555 if (id2 && !GetCreatureTemplate(id2))
2556 {
2557 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with non-existing creature entry {} in id2 field, skipped.", spawnId, id2);
2558 return nullptr;
2559 }
2560
2561 if (id3 && !GetCreatureTemplate(id3))
2562 {
2563 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with non-existing creature entry {} in id3 field, skipped.", spawnId, id3);
2564 return nullptr;
2565 }
2566
2567 if (!id2 && id3)
2568 {
2569 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with creature entry {} in id3 field but no entry in id2 field, skipped.", spawnId, id3);
2570 return nullptr;
2571 }
2572
2574 creatureData.id1 = id1;
2575 creatureData.id2 = id2;
2576 creatureData.id3 = id3;
2577 creatureData.mapid = fields[4].Get<uint16>();
2578 creatureData.equipmentId = fields[5].Get<int8>();
2579 creatureData.posX = fields[6].Get<float>();
2580 creatureData.posY = fields[7].Get<float>();
2581 creatureData.posZ = fields[8].Get<float>();
2582 creatureData.orientation = fields[9].Get<float>();
2583 creatureData.spawntimesecs = fields[10].Get<uint32>();
2584 creatureData.wander_distance = fields[11].Get<float>();
2585 creatureData.currentwaypoint = fields[12].Get<uint32>();
2586 creatureData.curhealth = fields[13].Get<uint32>();
2587 creatureData.curmana = fields[14].Get<uint32>();
2588 creatureData.movementType = fields[15].Get<uint8>();
2589 creatureData.spawnMask = fields[16].Get<uint8>();
2590 creatureData.phaseMask = fields[17].Get<uint32>();
2591 creatureData.npcflag = fields[18].Get<uint32>();
2592 creatureData.unit_flags = fields[19].Get<uint32>();
2593 creatureData.dynamicflags = fields[20].Get<uint32>();
2594 creatureData.ScriptId = GetScriptId(fields[21].Get<std::string>());
2595 creatureData.spawnGroupId = 0;
2596
2597 if (!creatureData.ScriptId)
2598 creatureData.ScriptId = cInfo->ScriptID;
2599
2600 MapEntry const* mapEntry = sMapStore.LookupEntry(creatureData.mapid);
2601 if (!mapEntry)
2602 {
2603 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) that spawned at non-existing map (Id: {}), skipped.", spawnId, creatureData.mapid);
2604 _creatureDataStore.erase(spawnId);
2605 return nullptr;
2606 }
2607
2608 if (mapEntry->IsRaid() && creatureData.spawntimesecs >= 7 * DAY && creatureData.spawntimesecs < 14 * DAY)
2609 creatureData.spawntimesecs = 14 * DAY;
2610
2611 bool ok = true;
2612 for (uint32 diff = 0; diff < MAX_DIFFICULTY - 1 && ok; ++diff)
2613 {
2614 if (_difficultyEntries[diff].find(id1) != _difficultyEntries[diff].end() ||
2615 _difficultyEntries[diff].find(id2) != _difficultyEntries[diff].end() ||
2616 _difficultyEntries[diff].find(id3) != _difficultyEntries[diff].end())
2617 {
2618 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) that is listed as difficulty {} template (Entries: {}, {}, {}) in `creature_template`, skipped.",
2619 spawnId, diff + 1, id1, id2, id3);
2620 ok = false;
2621 }
2622 }
2623
2624 if (!ok)
2625 {
2626 _creatureDataStore.erase(spawnId);
2627 return nullptr;
2628 }
2629
2630 if (creatureData.equipmentId != 0)
2631 {
2632 if (!GetEquipmentInfo(id1, creatureData.equipmentId) ||
2633 (id2 && !GetEquipmentInfo(id2, creatureData.equipmentId)) ||
2634 (id3 && !GetEquipmentInfo(id3, creatureData.equipmentId)))
2635 {
2636 LOG_ERROR("sql.sql", "Table `creature` has creature (Entries: {}, {}, {}) with equipment_id {} not found in table `creature_equip_template`, set to no equipment.",
2637 id1, id2, id3, creatureData.equipmentId);
2638 creatureData.equipmentId = 0;
2639 }
2640 }
2641
2642 if (creatureData.movementType >= MAX_DB_MOTION_TYPE)
2643 {
2644 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {} Entries: {}, {}, {}) with wrong movement generator type ({}), set to IDLE.",
2645 spawnId, id1, id2, id3, creatureData.movementType);
2646 creatureData.movementType = IDLE_MOTION_TYPE;
2647 }
2648
2649 if (creatureData.wander_distance < 0.0f)
2650 {
2651 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {} Entries: {}, {}, {}) with `wander_distance`< 0, set to 0.",
2652 spawnId, id1, id2, id3);
2653 creatureData.wander_distance = 0.0f;
2654 }
2655 else if (creatureData.movementType == RANDOM_MOTION_TYPE)
2656 {
2657 if (creatureData.wander_distance == 0.0f)
2658 {
2659 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {} Entries: {}, {}, {}) with `MovementType`=1 (random movement) but with `wander_distance`=0, replace by idle movement type (0).",
2660 spawnId, id1, id2, id3);
2661 creatureData.movementType = IDLE_MOTION_TYPE;
2662 }
2663 }
2664 else if (creatureData.movementType == IDLE_MOTION_TYPE)
2665 {
2666 if (creatureData.wander_distance != 0.0f)
2667 {
2668 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {} Entries: {}, {}, {}) with `MovementType`=0 (idle) have `wander_distance`<>0, set to 0.",
2669 spawnId, id1, id2, id3);
2670 creatureData.wander_distance = 0.0f;
2671 }
2672 }
2673
2674 if (creatureData.phaseMask == 0)
2675 {
2676 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {} Entries: {}, {}, {}) with `phaseMask`=0 (not visible for anyone), set to 1.",
2677 spawnId, id1, id2, id3);
2678 creatureData.phaseMask = 1;
2679 }
2680
2681 return &creatureData;
2682}
constexpr auto DAY
Definition Common.h:49
std::int8_t int8
Definition Define.h:105
@ RANDOM_MOTION_TYPE
Definition MotionMaster.h:40
EquipmentInfo const * GetEquipmentInfo(uint32 entry, int8 &id)
Definition ObjectMgr.cpp:1454
ObjectData const creatureData[]
Definition instance_blackwing_lair.cpp:45
bool IsRaid() const
Definition DBCStructure.h:1354

References _creatureDataStore, _difficultyEntries, creatureData, DAY, Field::Get(), GetCreatureData(), GetCreatureTemplate(), GetEquipmentInfo(), GetScriptId(), IDLE_MOTION_TYPE, MapEntry::IsRaid(), LOG_ERROR, MAX_DB_MOTION_TYPE, MAX_DIFFICULTY, RANDOM_MOTION_TYPE, sMapStore, and WorldDatabase.

◆ LoadCreatureDefaultTrainers()

void ObjectMgr::LoadCreatureDefaultTrainers ( )
10064{
10065 uint32 oldMSTime = getMSTime();
10066
10068
10069 if (QueryResult result = WorldDatabase.Query("SELECT CreatureId, TrainerId FROM creature_default_trainer"))
10070 {
10071 do
10072 {
10073 Field* fields = result->Fetch();
10074 uint32 creatureId = fields[0].Get<uint32>();
10075 uint32 trainerId = fields[1].Get<uint32>();
10076
10077 if (!GetCreatureTemplate(creatureId))
10078 {
10079 LOG_ERROR("sql.sql", "Table `creature_default_trainer` references non-existing creature template (CreatureId: %u), ignoring", creatureId);
10080 continue;
10081 }
10082
10083 _creatureDefaultTrainers[creatureId] = trainerId;
10084
10085 } while (result->NextRow());
10086 }
10087
10088 LOG_INFO("server.loading", ">> Loaded {} default trainers in {} ms", _creatureDefaultTrainers.size(), GetMSTimeDiffToNow(oldMSTime));
10089}

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

◆ LoadCreatureLocales()

void ObjectMgr::LoadCreatureLocales ( )
395{
396 uint32 oldMSTime = getMSTime();
397
398 _creatureLocaleStore.clear(); // need for reload case
399
400 // 0 1 2 3
401 QueryResult result = WorldDatabase.Query("SELECT entry, locale, Name, Title FROM creature_template_locale");
402 if (!result)
403 return;
404
405 do
406 {
407 Field* fields = result->Fetch();
408
409 uint32 ID = fields[0].Get<uint32>();
410
411 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
412 if (locale == LOCALE_enUS)
413 continue;
414
416 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
417 AddLocaleString(fields[3].Get<std::string>(), locale, data.Title);
418 } while (result->NextRow());
419
420 LOG_INFO("server.loading", ">> Loaded {} Creature Locale Strings in {} ms", (unsigned long)_creatureLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
421}
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 ( )
1711{
1712 uint32 oldMSTime = getMSTime();
1713
1714 // 0 1 2 3 4
1715 QueryResult result = WorldDatabase.Query("SELECT DisplayID, BoundingRadius, CombatReach, Gender, DisplayID_Other_Gender FROM creature_model_info");
1716
1717 if (!result)
1718 {
1719 LOG_WARN("server.loading", ">> Loaded 0 creature model definitions. DB table `creature_model_info` is empty.");
1720 LOG_INFO("server.loading", " ");
1721 return;
1722 }
1723
1724 _creatureModelStore.rehash(result->GetRowCount());
1725 uint32 count = 0;
1726
1727 // List of ModelDataIDs that use Invisible models
1728 uint32 triggerCreatureModelDataID[14] = { 1731, 1752, 2206, 2296, 2372, 2382, 2481, 2512, 2513, 2611, 2636, 2790, 3230, 3274 };
1729
1730 do
1731 {
1732 Field* fields = result->Fetch();
1733
1734 uint32 displayId = fields[0].Get<uint32>();
1735 CreatureDisplayInfoEntry const* creatureDisplay = sCreatureDisplayInfoStore.LookupEntry(displayId);
1736 uint32 modelId = fields[0].Get<uint32>();
1737
1738 CreatureModelInfo& modelInfo = _creatureModelStore[modelId];
1739
1740 modelInfo.bounding_radius = fields[1].Get<float>();
1741 modelInfo.combat_reach = fields[2].Get<float>();
1742 modelInfo.gender = fields[3].Get<uint8>();
1743 modelInfo.modelid_other_gender = fields[4].Get<uint32>();
1744 modelInfo.is_trigger = false;
1745
1746 // Checks
1747
1748 if (!sCreatureDisplayInfoStore.LookupEntry(modelId))
1749 LOG_ERROR("sql.sql", "Table `creature_model_info` has model for not existed display id ({}).", modelId);
1750
1751 if (modelInfo.gender > GENDER_NONE)
1752 {
1753 LOG_ERROR("sql.sql", "Table `creature_model_info` has wrong gender ({}) for display id ({}).", uint32(modelInfo.gender), modelId);
1754 modelInfo.gender = GENDER_MALE;
1755 }
1756
1757 if (modelInfo.modelid_other_gender && !sCreatureDisplayInfoStore.LookupEntry(modelInfo.modelid_other_gender))
1758 {
1759 LOG_ERROR("sql.sql", "Table `creature_model_info` has not existed alt.gender model ({}) for existed display id ({}).", modelInfo.modelid_other_gender, modelId);
1760 modelInfo.modelid_other_gender = 0;
1761 }
1762
1763 if (modelInfo.combat_reach < 0.1f)
1764 modelInfo.combat_reach = DEFAULT_COMBAT_REACH;
1765
1766 if (CreatureModelDataEntry const* modelData = sCreatureModelDataStore.LookupEntry(creatureDisplay->ModelId))
1767 {
1768 for (uint32 i = 0; i < 14; i++)
1769 {
1770 if (modelData->Id == triggerCreatureModelDataID[i])
1771 {
1772 modelInfo.is_trigger = true;
1773 break;
1774 }
1775 }
1776 }
1777
1778 ++count;
1779 } while (result->NextRow());
1780
1781 LOG_INFO("server.loading", ">> Loaded {} Creature Model Based Info in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1782 LOG_INFO("server.loading", " ");
1783}
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
#define DEFAULT_COMBAT_REACH
Definition ObjectDefines.h:45
@ GENDER_MALE
Definition SharedDefines.h:61
Definition DBCStructure.h:721
Definition DBCStructure.h:775
float bounding_radius
Definition CreatureData.h:390

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

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 ( )
8981{
8982 LoadQuestRelationsHelper(_creatureQuestInvolvedRelations, "creature_questender", false, false);
8983
8984 for (QuestRelations::iterator itr = _creatureQuestInvolvedRelations.begin(); itr != _creatureQuestInvolvedRelations.end(); ++itr)
8985 {
8986 CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
8987 if (!cInfo)
8988 LOG_ERROR("sql.sql", "Table `creature_questender` have data for not existed creature entry ({}) and existed quest {}", itr->first, itr->second);
8989 else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
8990 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);
8991 }
8992}
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:323
void LoadQuestRelationsHelper(QuestRelations &map, std::string const &table, bool starter, bool go)
Definition ObjectMgr.cpp:8893

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadCreatureQuestItems()

void ObjectMgr::LoadCreatureQuestItems ( )
11089{
11090 uint32 oldMSTime = getMSTime();
11091
11092 // 0 1 2
11093 QueryResult result = WorldDatabase.Query("SELECT CreatureEntry, ItemId, Idx FROM creature_questitem ORDER BY Idx ASC");
11094
11095 if (!result)
11096 {
11097 LOG_WARN("server.loading", ">> Loaded 0 creature quest items. DB table `creature_questitem` is empty.");
11098 return;
11099 }
11100
11101 uint32 count = 0;
11102 do
11103 {
11104 Field* fields = result->Fetch();
11105
11106 uint32 entry = fields[0].Get<uint32>();
11107 uint32 item = fields[1].Get<uint32>();
11108 uint32 idx = fields[2].Get<uint32>();
11109
11110 CreatureTemplate const* creatureInfo = GetCreatureTemplate(entry);
11111 if (!creatureInfo)
11112 {
11113 LOG_ERROR("sql.sql", "Table `creature_questitem` has data for nonexistent creature (entry: {}, idx: {}), skipped", entry, idx);
11114 continue;
11115 };
11116
11117 ItemEntry const* dbcData = sItemStore.LookupEntry(item);
11118 if (!dbcData)
11119 {
11120 LOG_ERROR("sql.sql", "Table `creature_questitem` has nonexistent item (ID: {}) in creature (entry: {}, idx: {}), skipped", item, entry, idx);
11121 continue;
11122 };
11123
11124 _creatureQuestItemStore[entry].push_back(item);
11125
11126 ++count;
11127 } while (result->NextRow());
11128
11129 LOG_INFO("server.loading", ">> Loaded {} Creature Quest Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
11130 LOG_INFO("server.loading", " ");
11131}
DBCStorage< ItemEntry > sItemStore(Itemfmt)
Definition DBCStructure.h:1143

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

◆ LoadCreatureQuestStarters()

void ObjectMgr::LoadCreatureQuestStarters ( )
8967{
8968 LoadQuestRelationsHelper(_creatureQuestRelations, "creature_queststarter", true, false);
8969
8970 for (QuestRelations::iterator itr = _creatureQuestRelations.begin(); itr != _creatureQuestRelations.end(); ++itr)
8971 {
8972 CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
8973 if (!cInfo)
8974 LOG_ERROR("sql.sql", "Table `creature_queststarter` have data for not existed creature entry ({}) and existed quest {}", itr->first, itr->second);
8975 else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
8976 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);
8977 }
8978}

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadCreatures()

void ObjectMgr::LoadCreatures ( )
2321{
2322 uint32 oldMSTime = getMSTime();
2323
2324 // 0 1 2 3 4 5 6 7 8 9 10 11
2325 QueryResult result = WorldDatabase.Query("SELECT creature.guid, id1, id2, id3, map, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, wander_distance, "
2326 // 12 13 14 15 16 17 18 19 20 21 22
2327 "currentwaypoint, curhealth, curmana, MovementType, spawnMask, phaseMask, eventEntry, pool_entry, creature.npcflag, creature.unit_flags, creature.dynamicflags, "
2328 // 23
2329 "creature.ScriptName "
2330 "FROM creature "
2331 "LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid "
2332 "LEFT OUTER JOIN pool_creature ON creature.guid = pool_creature.guid");
2333
2334 if (!result)
2335 {
2336 LOG_WARN("server.loading", ">> Loaded 0 creatures. DB table `creature` is empty.");
2337 LOG_INFO("server.loading", " ");
2338 return;
2339 }
2340
2342 LOG_INFO("server.loading", "Calculating zone and area fields. This may take a moment...");
2343
2344 // Build single time for check spawnmask
2345 std::map<uint32, uint32> spawnMasks;
2346 for (uint32 i = 0; i < sMapStore.GetNumRows(); ++i)
2347 if (sMapStore.LookupEntry(i))
2348 for (int k = 0; k < MAX_DIFFICULTY; ++k)
2350 spawnMasks[i] |= (1 << k);
2351
2352 _creatureDataStore.rehash(result->GetRowCount());
2353 uint32 count = 0;
2354 do
2355 {
2356 Field* fields = result->Fetch();
2357
2358 ObjectGuid::LowType spawnId = fields[0].Get<uint32>();
2359 uint32 id1 = fields[1].Get<uint32>();
2360 uint32 id2 = fields[2].Get<uint32>();
2361 uint32 id3 = fields[3].Get<uint32>();
2362
2363 CreatureTemplate const* cInfo = GetCreatureTemplate(id1);
2364 if (!cInfo)
2365 {
2366 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with non existing creature entry {} in id1 field, skipped.", spawnId, id1);
2367 continue;
2368 }
2369 CreatureTemplate const* cInfo2 = GetCreatureTemplate(id2);
2370 if (!cInfo2 && id2)
2371 {
2372 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with non existing creature entry {} in id2 field, skipped.", spawnId, id2);
2373 continue;
2374 }
2375 CreatureTemplate const* cInfo3 = GetCreatureTemplate(id3);
2376 if (!cInfo3 && id3)
2377 {
2378 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with non existing creature entry {} in id3 field, skipped.", spawnId, id3);
2379 continue;
2380 }
2381 if (!id2 && id3)
2382 {
2383 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with creature entry {} in id3 field but no entry in id2 field, skipped.", spawnId, id3);
2384 continue;
2385 }
2386 CreatureData& data = _creatureDataStore[spawnId];
2387 data.spawnId = spawnId;
2388 data.id1 = id1;
2389 data.id2 = id2;
2390 data.id3 = id3;
2391 data.mapid = fields[4].Get<uint16>();
2392 data.equipmentId = fields[5].Get<int8>();
2393 data.posX = fields[6].Get<float>();
2394 data.posY = fields[7].Get<float>();
2395 data.posZ = fields[8].Get<float>();
2396 data.orientation = fields[9].Get<float>();
2397 data.spawntimesecs = fields[10].Get<uint32>();
2398 data.wander_distance = fields[11].Get<float>();
2399 data.currentwaypoint = fields[12].Get<uint32>();
2400 data.curhealth = fields[13].Get<uint32>();
2401 data.curmana = fields[14].Get<uint32>();
2402 data.movementType = fields[15].Get<uint8>();
2403 data.spawnMask = fields[16].Get<uint8>();
2404 data.phaseMask = fields[17].Get<uint32>();
2405 int16 gameEvent = fields[18].Get<int16>();
2406 uint32 PoolId = fields[19].Get<uint32>();
2407 data.npcflag = fields[20].Get<uint32>();
2408 data.unit_flags = fields[21].Get<uint32>();
2409 data.dynamicflags = fields[22].Get<uint32>();
2410 data.ScriptId = GetScriptId(fields[23].Get<std::string>());
2411 data.spawnGroupId = 0;
2412
2413 if (!data.ScriptId)
2414 data.ScriptId = cInfo->ScriptID;
2415
2416 MapEntry const* mapEntry = sMapStore.LookupEntry(data.mapid);
2417 if (!mapEntry)
2418 {
2419 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that spawned at not existed map (Id: {}), skipped.", spawnId, data.mapid);
2420 continue;
2421 }
2422
2423 // pussywizard: 7 days means no reaspawn, so set it to 14 days, because manual id reset may be late
2424 if (mapEntry->IsRaid() && data.spawntimesecs >= 7 * DAY && data.spawntimesecs < 14 * DAY)
2425 data.spawntimesecs = 14 * DAY;
2426
2427 // Skip spawnMask check for transport maps
2428 if (!_transportMaps.count(data.mapid))
2429 {
2430 if (data.spawnMask & ~spawnMasks[data.mapid])
2431 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that have wrong spawn mask {} including not supported difficulty modes for map (Id: {}).",
2432 spawnId, data.spawnMask, data.mapid);
2433 }
2434 else
2435 data.spawnGroupId = 1; // force compatibility group for transport spawns
2436
2437 bool ok = true;
2438 for (uint32 diff = 0; diff < MAX_DIFFICULTY - 1 && ok; ++diff)
2439 {
2440 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()))
2441 {
2442 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that listed as difficulty {} template (Entries: {}, {}, {}) in `creature_template`, skipped.",
2443 spawnId, diff + 1, data.id1, data.id2, data.id3);
2444 ok = false;
2445 }
2446 }
2447 if (!ok)
2448 continue;
2449
2450 // -1 random, 0 no equipment,
2451 if (data.equipmentId != 0)
2452 {
2453 if ((!GetEquipmentInfo(data.id1, data.equipmentId)) || (data.id2 && !GetEquipmentInfo(data.id2, data.equipmentId)) || (data.id3 && !GetEquipmentInfo(data.id3, data.equipmentId)))
2454 {
2455 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.",
2456 data.id1, data.id2, data.id3, data.equipmentId);
2457 data.equipmentId = 0;
2458 }
2459 }
2461 {
2462 if (!mapEntry->IsDungeon())
2463 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.",
2464 spawnId, data.id1, data.id2, data.id3);
2465 }
2466 if (data.movementType >= MAX_DB_MOTION_TYPE)
2467 {
2468 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);
2470 }
2471 if (data.wander_distance < 0.0f)
2472 {
2473 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {} Entries: {}, {}, {}) with `wander_distance`< 0, set to 0.", spawnId, data.id1, data.id2, data.id3);
2474 data.wander_distance = 0.0f;
2475 }
2476 else if (data.movementType == RANDOM_MOTION_TYPE)
2477 {
2478 if (data.wander_distance == 0.0f)
2479 {
2480 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).",
2481 spawnId, data.id1, data.id2, data.id3);
2483 }
2484 }
2485 else if (data.movementType == IDLE_MOTION_TYPE)
2486 {
2487 if (data.wander_distance != 0.0f)
2488 {
2489 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);
2490 data.wander_distance = 0.0f;
2491 }
2492 }
2493
2494 if (data.phaseMask == 0)
2495 {
2496 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);
2497 data.phaseMask = 1;
2498 }
2499
2501 {
2502 uint32 zoneId = sMapMgr->GetZoneId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
2503 uint32 areaId = sMapMgr->GetAreaId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
2504
2506
2507 stmt->SetData(0, zoneId);
2508 stmt->SetData(1, areaId);
2509 stmt->SetData(2, spawnId);
2510
2511 WorldDatabase.Execute(stmt);
2512 }
2513
2514 // Add to grid if not managed by the game event or pool system
2515 if (gameEvent == 0 && PoolId == 0)
2516 AddCreatureToGrid(spawnId, &data);
2517
2518 ++count;
2519 } while (result->NextRow());
2520
2521 LOG_INFO("server.loading", ">> Loaded {} Creatures in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2522 LOG_INFO("server.loading", " ");
2523}
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition CreatureData.h:46
Difficulty
Definition DBCEnums.h:266
MapDifficulty const * GetMapDifficultyData(uint32 mapId, Difficulty difficulty)
Definition DBCStores.cpp:761
std::int16_t int16
Definition Define.h:104
@ CONFIG_CALCULATE_CREATURE_ZONE_AREA_DATA
Definition WorldConfig.h:116
@ WORLD_UPD_CREATURE_ZONE_AREA_DATA
Definition WorldDatabase.h:114
bool HasFlagsExtra(uint32 flag) const
Definition CreatureData.h:278
uint32 ScriptId
Definition SpawnData.h:76

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, Field::Get(), GetCreatureTemplate(), GetEquipmentInfo(), GetMapDifficultyData(), getMSTime(), GetMSTimeDiffToNow(), GetScriptId(), CreatureTemplate::HasFlagsExtra(), CreatureData::id1, CreatureData::id2, CreatureData::id3, IDLE_MOTION_TYPE, MapEntry::IsDungeon(), MapEntry::IsRaid(), LOG_ERROR, LOG_INFO, LOG_WARN, SpawnData::mapid, MAX_DB_MOTION_TYPE, MAX_DIFFICULTY, CreatureData::movementType, CreatureData::npcflag, SpawnData::orientation, SpawnData::phaseMask, SpawnData::posX, SpawnData::posY, SpawnData::posZ, RANDOM_MOTION_TYPE, SpawnData::ScriptId, PreparedStatementBase::SetData(), sMapMgr, sMapStore, SpawnData::spawnGroupId, SpawnData::spawnId, SpawnData::spawnMask, CreatureData::spawntimesecs, sWorld, CreatureData::unit_flags, CreatureData::wander_distance, WORLD_UPD_CREATURE_ZONE_AREA_DATA, and WorldDatabase.

◆ LoadCreatureSparring()

void ObjectMgr::LoadCreatureSparring ( )
2685{
2686 uint32 oldMSTime = getMSTime();
2687
2688 QueryResult result = WorldDatabase.Query("SELECT GUID, SparringPCT FROM creature_sparring");
2689
2690 if (!result)
2691 {
2692 LOG_WARN("server.loading", ">> Loaded 0 sparring data. DB table `creature_sparring` is empty.");
2693 LOG_INFO("server.loading", " ");
2694 return;
2695 }
2696
2697 uint32 count = 0;
2698 do
2699 {
2700 Field* fields = result->Fetch();
2701
2702 ObjectGuid::LowType spawnId = fields[0].Get<uint32>();
2703 float sparringHealthPct = fields[1].Get<float>();
2704
2705 if (!GetCreatureData(spawnId))
2706 {
2707 LOG_ERROR("sql.sql", "Entry {} has a record in `creature_sparring` but doesn't exist in `creatures` table");
2708 continue;
2709 }
2710
2711 _creatureSparringStore[spawnId].push_back(sparringHealthPct);
2712
2713 ++count;
2714 } while (result->NextRow());
2715
2716 LOG_INFO("server.loading", ">> Loaded {} sparring data in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2717 LOG_INFO("server.loading", " ");
2718}

References _creatureSparringStore, Field::Get(), GetCreatureData(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, 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.
586{
587 uint32 entry = fields[0].Get<uint32>();
588
589 CreatureTemplate& creatureTemplate = _creatureTemplateStore[entry];
590
591 // enlarge the fast cache as necessary
592 if (_creatureTemplateStoreFast.size() < entry + 1)
593 {
594 _creatureTemplateStoreFast.resize(entry + 1, nullptr);
595 }
596
597 // load a pointer to this creatureTemplate into the fast cache
598 _creatureTemplateStoreFast[entry] = &creatureTemplate;
599
600 // build the creatureTemplate
601 creatureTemplate.Entry = entry;
602
603 for (uint8 i = 0; i < MAX_DIFFICULTY - 1; ++i)
604 {
605 creatureTemplate.DifficultyEntry[i] = fields[1 + i].Get<uint32>();
606 }
607
608 for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i)
609 {
610 creatureTemplate.KillCredit[i] = fields[4 + i].Get<uint32>();
611 }
612 creatureTemplate.Name = fields[6].Get<std::string>();
613 creatureTemplate.SubName = fields[7].Get<std::string>();
614 creatureTemplate.IconName = fields[8].Get<std::string>();
615 creatureTemplate.GossipMenuId = fields[9].Get<uint32>();
616 creatureTemplate.minlevel = fields[10].Get<uint8>();
617 creatureTemplate.maxlevel = fields[11].Get<uint8>();
618 creatureTemplate.expansion = uint32(fields[12].Get<int16>());
619 creatureTemplate.faction = uint32(fields[13].Get<uint16>());
620 creatureTemplate.npcflag = fields[14].Get<uint32>();
621 creatureTemplate.speed_walk = fields[15].Get<float>();
622 creatureTemplate.speed_run = fields[16].Get<float>();
623 creatureTemplate.speed_swim = fields[17].Get<float>();
624 creatureTemplate.speed_flight = fields[18].Get<float>();
625 creatureTemplate.detection_range = fields[19].Get<float>();
626 creatureTemplate.rank = uint32(fields[20].Get<uint8>());
627 creatureTemplate.dmgschool = uint32(fields[21].Get<int8>());
628 creatureTemplate.DamageModifier = fields[22].Get<float>();
629 creatureTemplate.BaseAttackTime = fields[23].Get<uint32>();
630 creatureTemplate.RangeAttackTime = fields[24].Get<uint32>();
631 creatureTemplate.BaseVariance = fields[25].Get<float>();
632 creatureTemplate.RangeVariance = fields[26].Get<float>();
633 creatureTemplate.unit_class = uint32(fields[27].Get<uint8>());
634 creatureTemplate.unit_flags = fields[28].Get<uint32>();
635 creatureTemplate.unit_flags2 = fields[29].Get<uint32>();
636 creatureTemplate.dynamicflags = fields[30].Get<uint32>();
637 creatureTemplate.family = uint32(fields[31].Get<uint8>());
638 creatureTemplate.type = uint32(fields[32].Get<uint8>());
639 creatureTemplate.type_flags = fields[33].Get<uint32>();
640 creatureTemplate.lootid = fields[34].Get<uint32>();
641 creatureTemplate.pickpocketLootId = fields[35].Get<uint32>();
642 creatureTemplate.SkinLootId = fields[36].Get<uint32>();
643
644 for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
645 {
646 creatureTemplate.resistance[i] = 0;
647 }
648
649 for (uint8 i = 0; i < MAX_CREATURE_SPELLS; ++i)
650 {
651 creatureTemplate.spells[i] = 0;
652 }
653
654 creatureTemplate.PetSpellDataId = fields[37].Get<uint32>();
655 creatureTemplate.VehicleId = fields[38].Get<uint32>();
656 creatureTemplate.mingold = fields[39].Get<uint32>();
657 creatureTemplate.maxgold = fields[40].Get<uint32>();
658 creatureTemplate.AIName = fields[41].Get<std::string>();
659 creatureTemplate.MovementType = uint32(fields[42].Get<uint8>());
660 if (!fields[43].IsNull())
661 {
662 creatureTemplate.Movement.Ground = static_cast<CreatureGroundMovementType>(fields[43].Get<uint8>());
663 }
664
665 creatureTemplate.Movement.Swim = fields[44].Get<bool>();
666 if (!fields[45].IsNull())
667 {
668 creatureTemplate.Movement.Flight = static_cast<CreatureFlightMovementType>(fields[45].Get<uint8>());
669 }
670
671 creatureTemplate.Movement.Rooted = fields[46].Get<bool>();
672 if (!fields[47].IsNull())
673 {
674 creatureTemplate.Movement.Chase = static_cast<CreatureChaseMovementType>(fields[47].Get<uint8>());
675 }
676 if (!fields[48].IsNull())
677 {
678 creatureTemplate.Movement.Random = static_cast<CreatureRandomMovementType>(fields[48].Get<uint8>());
679 }
680 if (!fields[49].IsNull())
681 {
682 creatureTemplate.Movement.InteractionPauseTimer = fields[49].Get<uint32>();
683 }
684
685 creatureTemplate.HoverHeight = fields[50].Get<float>();
686 creatureTemplate.ModHealth = fields[51].Get<float>();
687 creatureTemplate.ModMana = fields[52].Get<float>();
688 creatureTemplate.ModArmor = fields[53].Get<float>();
689 creatureTemplate.ModExperience = fields[54].Get<float>();
690 creatureTemplate.RacialLeader = fields[55].Get<bool>();
691 creatureTemplate.movementId = fields[56].Get<uint32>();
692 creatureTemplate.RegenHealth = fields[57].Get<bool>();
693 creatureTemplate.CreatureImmunitiesId = fields[58].Get<int32>();
694 creatureTemplate.flags_extra = fields[59].Get<uint32>();
695 creatureTemplate.ScriptID = GetScriptId(fields[60].Get<std::string>());
696
697 // Warn about deprecated immunity flags that should be moved to `creature_immunities` table
698 if (creatureTemplate.flags_extra & CREATURE_FLAG_EXTRA_NO_TAUNT)
699 LOG_WARN("server.loading", "Creature (Entry: {}) has deprecated flags_extra bit NO_TAUNT (0x100) set. This will be migrated to the `creature_immunities` table in a future update.", entry);
700 if (creatureTemplate.flags_extra & CREATURE_FLAG_EXTRA_AVOID_AOE)
701 LOG_WARN("server.loading", "Creature (Entry: {}) has deprecated flags_extra bit AVOID_AOE (0x400000) set. This will be migrated to the `creature_immunities` table in a future update.", entry);
702 if (creatureTemplate.flags_extra & CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK)
703 LOG_WARN("server.loading", "Creature (Entry: {}) has deprecated flags_extra bit IMMUNITY_KNOCKBACK (0x40000000) set. This will be migrated to the `creature_immunities` table in a future update.", entry);
704
705 // useful if the creature template load is being triggered from outside this class
706 if (triggerHook)
707 {
708 sScriptMgr->OnAfterDatabaseLoadCreatureTemplates(_creatureTemplateStoreFast);
709 }
710}
@ CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK
Definition CreatureData.h:76
@ CREATURE_FLAG_EXTRA_NO_TAUNT
Definition CreatureData.h:54
@ CREATURE_FLAG_EXTRA_AVOID_AOE
Definition CreatureData.h:68
std::int32_t int32
Definition Define.h:103
#define sScriptMgr
Definition ScriptMgr.h:736
@ SPELL_SCHOOL_HOLY
Definition SharedDefines.h:272
uint32 Entry
Definition CreatureData.h:188

References _creatureTemplateStore, _creatureTemplateStoreFast, CREATURE_FLAG_EXTRA_AVOID_AOE, CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK, CREATURE_FLAG_EXTRA_NO_TAUNT, CreatureTemplate::Entry, Field::Get(), GetScriptId(), LOG_WARN, MAX_CREATURE_SPELLS, MAX_DIFFICULTY, MAX_KILL_CREDIT, MAX_SPELL_SCHOOL, SPELL_SCHOOL_HOLY, and sScriptMgr.

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplateAddons()

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

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

◆ LoadCreatureTemplateModels()

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

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

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplateResistances()

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

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

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

◆ LoadCreatureTemplateSpells()

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

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

References _equipmentInfoStore, Field::Get(), GetCreatureTemplate(), 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, and WorldDatabase.

◆ LoadEventScripts()

void ObjectMgr::LoadEventScripts ( )
6207{
6209
6210 std::set<uint32> evt_scripts;
6211 // Load all possible script entries from gameobjects
6213 for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
6214 if (uint32 eventId = itr->second.GetEventScriptId())
6215 evt_scripts.insert(eventId);
6216
6217 // Load all possible script entries from spells
6218 for (uint32 i = 1; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
6219 if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(i))
6220 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
6221 if (spell->Effects[j].Effect == SPELL_EFFECT_SEND_EVENT)
6222 if (spell->Effects[j].MiscValue)
6223 evt_scripts.insert(spell->Effects[j].MiscValue);
6224
6225 for (std::size_t path_idx = 0; path_idx < sTaxiPathNodesByPath.size(); ++path_idx)
6226 {
6227 for (std::size_t node_idx = 0; node_idx < sTaxiPathNodesByPath[path_idx].size(); ++node_idx)
6228 {
6229 TaxiPathNodeEntry const* node = sTaxiPathNodesByPath[path_idx][node_idx];
6230
6231 if (node->arrivalEventID)
6232 evt_scripts.insert(node->arrivalEventID);
6233
6234 if (node->departureEventID)
6235 evt_scripts.insert(node->departureEventID);
6236 }
6237 }
6238
6239 // Then check if all scripts are in above list of possible script entries
6240 for (ScriptMapMap::const_iterator itr = sEventScripts.begin(); itr != sEventScripts.end(); ++itr)
6241 {
6242 std::set<uint32>::const_iterator itr2 = evt_scripts.find(itr->first);
6243 if (itr2 == evt_scripts.end())
6244 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 {}",
6245 itr->first, SPELL_EFFECT_SEND_EVENT);
6246 }
6247}
TaxiPathNodesByPath sTaxiPathNodesByPath
Definition DBCStores.cpp:187
#define MAX_SPELL_EFFECTS
Definition DBCStructure.h:1637
std::unordered_map< uint32, GameObjectTemplate > GameObjectTemplateContainer
Definition GameObject.h:42
ScriptMapMap sEventScripts
Definition ObjectMgr.cpp:61
@ SCRIPTS_EVENT
Definition ObjectMgr.h:150
@ SPELL_EFFECT_SEND_EVENT
Definition SharedDefines.h:827
GameObjectTemplateContainer const * GetGameObjectTemplates() const
Definition ObjectMgr.h:764
void LoadScripts(ScriptsType type)
Definition ObjectMgr.cpp:5864
Definition DBCStructure.h:1973
uint32 arrivalEventID
Definition DBCStructure.h:1983
uint32 departureEventID
Definition DBCStructure.h:1984

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

◆ LoadExplorationBaseXP()

void ObjectMgr::LoadExplorationBaseXP ( )
8093{
8094 uint32 oldMSTime = getMSTime();
8095
8096 QueryResult result = WorldDatabase.Query("SELECT level, basexp FROM exploration_basexp");
8097
8098 if (!result)
8099 {
8100 LOG_WARN("server.loading", ">> Loaded 0 BaseXP definitions. DB table `exploration_basexp` is empty.");
8101 LOG_INFO("server.loading", " ");
8102 return;
8103 }
8104
8105 uint32 count = 0;
8106
8107 do
8108 {
8109 Field* fields = result->Fetch();
8110 uint8 level = fields[0].Get<uint8>();
8111 uint32 basexp = fields[1].Get<int32>();
8112 _baseXPTable[level] = basexp;
8113 ++count;
8114 } while (result->NextRow());
8115
8116 LOG_INFO("server.loading", ">> Loaded {} BaseXP Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8117 LOG_INFO("server.loading", " ");
8118}

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

◆ LoadFactionChangeAchievements()

void ObjectMgr::LoadFactionChangeAchievements ( )
10771{
10772 uint32 oldMSTime = getMSTime();
10773
10774 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_achievement");
10775
10776 if (!result)
10777 {
10778 LOG_WARN("server.loading", ">> Loaded 0 faction change achievement pairs. DB table `player_factionchange_achievement` is empty.");
10779 LOG_INFO("server.loading", " ");
10780 return;
10781 }
10782
10783 uint32 count = 0;
10784
10785 do
10786 {
10787 Field* fields = result->Fetch();
10788
10789 uint32 alliance = fields[0].Get<uint32>();
10790 uint32 horde = fields[1].Get<uint32>();
10791
10792 if (!sAchievementStore.LookupEntry(alliance))
10793 LOG_ERROR("sql.sql", "Achievement {} (alliance_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", alliance);
10794 else if (!sAchievementStore.LookupEntry(horde))
10795 LOG_ERROR("sql.sql", "Achievement {} (horde_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", horde);
10796 else
10797 FactionChangeAchievements[alliance] = horde;
10798
10799 ++count;
10800 } while (result->NextRow());
10801
10802 LOG_INFO("server.loading", ">> Loaded {} faction change achievement pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10803 LOG_INFO("server.loading", " ");
10804}
CharacterConversionMap FactionChangeAchievements
Definition ObjectMgr.h:1499

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

◆ LoadFactionChangeItems()

void ObjectMgr::LoadFactionChangeItems ( )
10807{
10808 uint32 oldMSTime = getMSTime();
10809
10810 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_items");
10811
10812 if (!result)
10813 {
10814 LOG_WARN("server.loading", ">> Loaded 0 faction change item pairs. DB table `player_factionchange_items` is empty.");
10815 LOG_INFO("server.loading", " ");
10816 return;
10817 }
10818
10819 uint32 count = 0;
10820
10821 do
10822 {
10823 Field* fields = result->Fetch();
10824
10825 uint32 alliance = fields[0].Get<uint32>();
10826 uint32 horde = fields[1].Get<uint32>();
10827
10828 if (!GetItemTemplate(alliance))
10829 LOG_ERROR("sql.sql", "Item {} (alliance_id) referenced in `player_factionchange_items` does not exist, pair skipped!", alliance);
10830 else if (!GetItemTemplate(horde))
10831 LOG_ERROR("sql.sql", "Item {} (horde_id) referenced in `player_factionchange_items` does not exist, pair skipped!", horde);
10832 else
10833 FactionChangeItems[alliance] = horde;
10834
10835 ++count;
10836 } while (result->NextRow());
10837
10838 LOG_INFO("server.loading", ">> Loaded {} faction change item pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10839 LOG_INFO("server.loading", " ");
10840}
CharacterConversionMap FactionChangeItems
Definition ObjectMgr.h:1500

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

◆ LoadFactionChangeQuests()

void ObjectMgr::LoadFactionChangeQuests ( )
10843{
10844 uint32 oldMSTime = getMSTime();
10845
10846 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_quests");
10847
10848 if (!result)
10849 {
10850 LOG_WARN("server.loading", ">> Loaded 0 faction change quest pairs. DB table `player_factionchange_quests` is empty.");
10851 LOG_INFO("server.loading", " ");
10852 return;
10853 }
10854
10855 uint32 count = 0;
10856
10857 do
10858 {
10859 Field* fields = result->Fetch();
10860
10861 uint32 alliance = fields[0].Get<uint32>();
10862 uint32 horde = fields[1].Get<uint32>();
10863
10864 if (!GetQuestTemplate(alliance))
10865 LOG_ERROR("sql.sql", "Quest {} (alliance_id) referenced in `player_factionchange_quests` does not exist, pair skipped!", alliance);
10866 else if (!GetQuestTemplate(horde))
10867 LOG_ERROR("sql.sql", "Quest {} (horde_id) referenced in `player_factionchange_quests` does not exist, pair skipped!", horde);
10868 else
10869 FactionChangeQuests[alliance] = horde;
10870
10871 ++count;
10872 } while (result->NextRow());
10873
10874 LOG_INFO("server.loading", ">> Loaded {} faction change quest pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10875 LOG_INFO("server.loading", " ");
10876}
CharacterConversionMap FactionChangeQuests
Definition ObjectMgr.h:1501

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

◆ LoadFactionChangeReputations()

void ObjectMgr::LoadFactionChangeReputations ( )
10879{
10880 uint32 oldMSTime = getMSTime();
10881
10882 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_reputations");
10883
10884 if (!result)
10885 {
10886 LOG_WARN("server.loading", ">> Loaded 0 faction change reputation pairs. DB table `player_factionchange_reputations` is empty.");
10887 LOG_INFO("server.loading", " ");
10888 return;
10889 }
10890
10891 uint32 count = 0;
10892
10893 do
10894 {
10895 Field* fields = result->Fetch();
10896
10897 uint32 alliance = fields[0].Get<uint32>();
10898 uint32 horde = fields[1].Get<uint32>();
10899
10900 if (!sFactionStore.LookupEntry(alliance))
10901 LOG_ERROR("sql.sql", "Reputation {} (alliance_id) referenced in `player_factionchange_reputations` does not exist, pair skipped!", alliance);
10902 else if (!sFactionStore.LookupEntry(horde))
10903 LOG_ERROR("sql.sql", "Reputation {} (horde_id) referenced in `player_factionchange_reputations` does not exist, pair skipped!", horde);
10904 else
10905 FactionChangeReputation[alliance] = horde;
10906
10907 ++count;
10908 } while (result->NextRow());
10909
10910 LOG_INFO("server.loading", ">> Loaded {} faction change reputation pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10911 LOG_INFO("server.loading", " ");
10912}
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
CharacterConversionMap FactionChangeReputation
Definition ObjectMgr.h:1502

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

◆ LoadFactionChangeSpells()

void ObjectMgr::LoadFactionChangeSpells ( )
10915{
10916 uint32 oldMSTime = getMSTime();
10917
10918 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_spells");
10919
10920 if (!result)
10921 {
10922 LOG_WARN("server.loading", ">> Loaded 0 faction change spell pairs. DB table `player_factionchange_spells` is empty.");
10923 LOG_INFO("server.loading", " ");
10924 return;
10925 }
10926
10927 uint32 count = 0;
10928
10929 do
10930 {
10931 Field* fields = result->Fetch();
10932
10933 uint32 alliance = fields[0].Get<uint32>();
10934 uint32 horde = fields[1].Get<uint32>();
10935
10936 if (!sSpellMgr->GetSpellInfo(alliance))
10937 LOG_ERROR("sql.sql", "Spell {} (alliance_id) referenced in `player_factionchange_spells` does not exist, pair skipped!", alliance);
10938 else if (!sSpellMgr->GetSpellInfo(horde))
10939 LOG_ERROR("sql.sql", "Spell {} (horde_id) referenced in `player_factionchange_spells` does not exist, pair skipped!", horde);
10940 else
10941 FactionChangeSpells[alliance] = horde;
10942
10943 ++count;
10944 } while (result->NextRow());
10945
10946 LOG_INFO("server.loading", ">> Loaded {} faction change spell pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10947 LOG_INFO("server.loading", " ");
10948}
CharacterConversionMap FactionChangeSpells
Definition ObjectMgr.h:1503

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

◆ LoadFactionChangeTitles()

void ObjectMgr::LoadFactionChangeTitles ( )
10951{
10952 uint32 oldMSTime = getMSTime();
10953
10954 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_titles");
10955
10956 if (!result)
10957 {
10958 LOG_WARN("server.loading", ">> Loaded 0 faction change title pairs. DB table `player_factionchange_title` is empty.");
10959 return;
10960 }
10961
10962 uint32 count = 0;
10963
10964 do
10965 {
10966 Field* fields = result->Fetch();
10967
10968 uint32 alliance = fields[0].Get<uint32>();
10969 uint32 horde = fields[1].Get<uint32>();
10970
10971 if (!sCharTitlesStore.LookupEntry(alliance))
10972 LOG_ERROR("sql.sql", "Title {} (alliance_id) referenced in `player_factionchange_title` does not exist, pair skipped!", alliance);
10973 else if (!sCharTitlesStore.LookupEntry(horde))
10974 LOG_ERROR("sql.sql", "Title {} (horde_id) referenced in `player_factionchange_title` does not exist, pair skipped!", horde);
10975 else
10976 FactionChangeTitles[alliance] = horde;
10977
10978 ++count;
10979 } while (result->NextRow());
10980
10981 LOG_INFO("server.loading", ">> Loaded {} faction change title pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10982 LOG_INFO("server.loading", " ");
10983}
DBCStorage< CharTitlesEntry > sCharTitlesStore(CharTitlesEntryfmt)
CharacterConversionMap FactionChangeTitles
Definition ObjectMgr.h:1504

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

◆ LoadFishingBaseSkillLevel()

void ObjectMgr::LoadFishingBaseSkillLevel ( )
9595{
9596 uint32 oldMSTime = getMSTime();
9597
9598 _fishingBaseForAreaStore.clear(); // for reload case
9599
9600 QueryResult result = WorldDatabase.Query("SELECT entry, skill FROM skill_fishing_base_level");
9601
9602 if (!result)
9603 {
9604 LOG_WARN("server.loading", ">> Loaded 0 areas for fishing base skill level. DB table `skill_fishing_base_level` is empty.");
9605 LOG_INFO("server.loading", " ");
9606 return;
9607 }
9608
9609 uint32 count = 0;
9610
9611 do
9612 {
9613 Field* fields = result->Fetch();
9614 uint32 entry = fields[0].Get<uint32>();
9615 int32 skill = fields[1].Get<int16>();
9616
9617 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
9618 if (!fArea)
9619 {
9620 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
9621 continue;
9622 }
9623
9624 _fishingBaseForAreaStore[entry] = skill;
9625 ++count;
9626 } while (result->NextRow());
9627
9628 LOG_INFO("server.loading", ">> Loaded {} areas for fishing base skill level in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9629 LOG_INFO("server.loading", " ");
9630}

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

◆ LoadGameObjectAddons()

void ObjectMgr::LoadGameObjectAddons ( )
1364{
1365 uint32 oldMSTime = getMSTime();
1366
1367 // 0 1 2 3 4 5 6
1368 QueryResult result = WorldDatabase.Query("SELECT guid, parent_rotation0, parent_rotation1, parent_rotation2, parent_rotation3, invisibilityType, invisibilityValue FROM gameobject_addon");
1369
1370 if (!result)
1371 {
1372 LOG_WARN("server.loading", ">> Loaded 0 gameobject addon definitions. DB table `gameobject_addon` is empty.");
1373 LOG_INFO("server.loading", " ");
1374 return;
1375 }
1376
1377 uint32 count = 0;
1378 do
1379 {
1380 Field* fields = result->Fetch();
1381
1382 ObjectGuid::LowType guid = fields[0].Get<uint32>();
1383
1385 if (!goData)
1386 {
1387 LOG_ERROR("sql.sql", "GameObject (GUID: {}) does not exist but has a record in `gameobject_addon`", guid);
1388 continue;
1389 }
1390
1391 GameObjectAddon& gameObjectAddon = _gameObjectAddonStore[guid];
1392 gameObjectAddon.ParentRotation = QuaternionData(fields[1].Get<float>(), fields[2].Get<float>(), fields[3].Get<float>(), fields[4].Get<float>());
1393 gameObjectAddon.invisibilityType = InvisibilityType(fields[5].Get<uint8>());
1394 gameObjectAddon.InvisibilityValue = fields[6].Get<uint32>();
1395
1396 if (gameObjectAddon.invisibilityType >= TOTAL_INVISIBILITY_TYPES)
1397 {
1398 LOG_ERROR("sql.sql", "GameObject (GUID: {}) has invalid InvisibilityType in `gameobject_addon`", guid);
1399 gameObjectAddon.invisibilityType = INVISIBILITY_GENERAL;
1400 gameObjectAddon.InvisibilityValue = 0;
1401 }
1402
1403 if (gameObjectAddon.invisibilityType && !gameObjectAddon.InvisibilityValue)
1404 {
1405 LOG_ERROR("sql.sql", "GameObject (GUID: {}) has InvisibilityType set but has no InvisibilityValue in `gameobject_addon`, set to 1", guid);
1406 gameObjectAddon.InvisibilityValue = 1;
1407 }
1408
1409 if (!gameObjectAddon.ParentRotation.IsUnit())
1410 {
1411 LOG_ERROR("sql.sql", "GameObject (GUID: {}) has invalid parent rotation in `gameobject_addon`, set to default", guid);
1412 gameObjectAddon.ParentRotation = QuaternionData();
1413 }
1414
1415 ++count;
1416 } while (result->NextRow());
1417
1418 LOG_INFO("server.loading", ">> Loaded {} Gameobject Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1419 LOG_INFO("server.loading", " ");
1420}
InvisibilityType
Definition SharedDefines.h:1242
@ TOTAL_INVISIBILITY_TYPES
Definition SharedDefines.h:1256
@ INVISIBILITY_GENERAL
Definition SharedDefines.h:1243
ObjectData const goData[]
Definition instance_violet_hold.cpp:48
Definition GameObjectData.h:699
QuaternionData ParentRotation
Definition GameObjectData.h:700
uint32 InvisibilityValue
Definition GameObjectData.h:702
InvisibilityType invisibilityType
Definition GameObjectData.h:701
Definition GameObjectData.h:683
bool IsUnit() const
Definition GameObject.cpp:41

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

◆ LoadGameObjectDataFromDB()

GameObjectData const * ObjectMgr::LoadGameObjectDataFromDB ( ObjectGuid::LowType  spawnId)

Loads a single gameobject spawn entry from the database into the data store cache.

This is needed as a prerequisite for GameObject::LoadGameObjectFromDB(), which reads from the in-memory cache (via GetGameObjectData()) rather than querying the DB itself. For spawns not loaded during server startup, this method populates the cache so that GameObject::LoadGameObjectFromDB() can then create the live entity.

Returns the cached data if already loaded, or nullptr if the spawn doesn't exist or fails validation.

Parameters
spawnIdThe gameobject spawn GUID to load.
Returns
Pointer to the cached GameObjectData, or nullptr on failure.
3047{
3048 GameObjectData const* data = GetGameObjectData(spawnId);
3049 if (data)
3050 return data;
3051
3052 QueryResult result = WorldDatabase.Query("SELECT gameobject.guid, id, map, position_x, position_y, position_z, orientation, "
3053 "rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state, spawnMask, phaseMask, "
3054 "ScriptName "
3055 "FROM gameobject WHERE gameobject.guid = {}", spawnId);
3056
3057 if (!result)
3058 return nullptr;
3059
3060 Field* fields = result->Fetch();
3061 uint32 entry = fields[1].Get<uint32>();
3062
3063 GameObjectTemplate const* gInfo = GetGameObjectTemplate(entry);
3064 if (!gInfo)
3065 {
3066 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {}) with non-existing gameobject entry {}, skipped.", spawnId, entry);
3067 return nullptr;
3068 }
3069
3070 if (gInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(gInfo->displayId))
3071 {
3072 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry {} GoType: {}) with an invalid displayId ({}), not loaded.",
3073 spawnId, entry, gInfo->type, gInfo->displayId);
3074 return nullptr;
3075 }
3076
3078 goData.id = entry;
3079 goData.mapid = fields[2].Get<uint16>();
3080 goData.posX = fields[3].Get<float>();
3081 goData.posY = fields[4].Get<float>();
3082 goData.posZ = fields[5].Get<float>();
3083 goData.orientation = fields[6].Get<float>();
3084 goData.rotation.x = fields[7].Get<float>();
3085 goData.rotation.y = fields[8].Get<float>();
3086 goData.rotation.z = fields[9].Get<float>();
3087 goData.rotation.w = fields[10].Get<float>();
3088 goData.spawntimesecs = fields[11].Get<int32>();
3089 goData.animprogress = fields[12].Get<uint8>();
3090 goData.artKit = 0;
3091 goData.ScriptId = GetScriptId(fields[16].Get<std::string>());
3092
3093 if (!goData.ScriptId)
3094 goData.ScriptId = gInfo->ScriptId;
3095
3096 MapEntry const* mapEntry = sMapStore.LookupEntry(goData.mapid);
3097 if (!mapEntry)
3098 {
3099 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) spawned on a non-existing map (Id: {}), skipped.", spawnId, entry, goData.mapid);
3100 _gameObjectDataStore.erase(spawnId);
3101 return nullptr;
3102 }
3103
3104 if (goData.spawntimesecs == 0 && gInfo->IsDespawnAtAction())
3105 {
3106 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with `spawntimesecs` (0) value, but the gameobject is marked as despawnable at action.", spawnId, entry);
3107 }
3108
3109 uint32 go_state = fields[13].Get<uint8>();
3110 if (go_state >= MAX_GO_STATE)
3111 {
3112 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid `state` ({}) value, skipped.", spawnId, entry, go_state);
3113 _gameObjectDataStore.erase(spawnId);
3114 return nullptr;
3115 }
3116 goData.go_state = GOState(go_state);
3117
3118 goData.spawnMask = fields[14].Get<uint8>();
3119 goData.phaseMask = fields[15].Get<uint32>();
3120
3121 if (goData.rotation.x < -1.0f || goData.rotation.x > 1.0f)
3122 {
3123 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationX ({}) value, skipped.", spawnId, entry, goData.rotation.x);
3124 _gameObjectDataStore.erase(spawnId);
3125 return nullptr;
3126 }
3127
3128 if (goData.rotation.y < -1.0f || goData.rotation.y > 1.0f)
3129 {
3130 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationY ({}) value, skipped.", spawnId, entry, goData.rotation.y);
3131 _gameObjectDataStore.erase(spawnId);
3132 return nullptr;
3133 }
3134
3135 if (goData.rotation.z < -1.0f || goData.rotation.z > 1.0f)
3136 {
3137 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationZ ({}) value, skipped.", spawnId, entry, goData.rotation.z);
3138 _gameObjectDataStore.erase(spawnId);
3139 return nullptr;
3140 }
3141
3142 if (goData.rotation.w < -1.0f || goData.rotation.w > 1.0f)
3143 {
3144 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationW ({}) value, skipped.", spawnId, entry, goData.rotation.w);
3145 _gameObjectDataStore.erase(spawnId);
3146 return nullptr;
3147 }
3148
3149 if (fabs(goData.rotation.x * goData.rotation.x + goData.rotation.y * goData.rotation.y +
3150 goData.rotation.z * goData.rotation.z + goData.rotation.w * goData.rotation.w - 1.0f) >= 1e-5f)
3151 {
3152 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotation quaternion (non-unit), defaulting to orientation on Z axis only", spawnId, entry);
3153 goData.rotation = G3D::Quat(G3D::Matrix3::fromEulerAnglesZYX(goData.orientation, 0.0f, 0.0f));
3154 }
3155
3156 if (!MapMgr::IsValidMapCoord(goData.mapid, goData.posX, goData.posY, goData.posZ, goData.orientation))
3157 {
3158 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid coordinates, skipped.", spawnId, entry);
3159 _gameObjectDataStore.erase(spawnId);
3160 return nullptr;
3161 }
3162
3163 if (goData.phaseMask == 0)
3164 {
3165 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with `phaseMask`=0 (not visible for anyone), set to 1.", spawnId, entry);
3166 goData.phaseMask = 1;
3167 }
3168
3169 return &goData;
3170}
DBCStorage< GameObjectDisplayInfoEntry > sGameObjectDisplayInfoStore(GameObjectDisplayInfofmt)
#define MAX_GO_STATE
Definition GameObjectData.h:28
GOState
Definition GameObjectData.h:707
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition MapMgr.h:90

References _gameObjectDataStore, Field::Get(), GetGameObjectData(), GetGameObjectTemplate(), GetScriptId(), goData, MapMgr::IsValidMapCoord(), LOG_ERROR, MAX_GO_STATE, sGameObjectDisplayInfoStore, sMapStore, and WorldDatabase.

◆ LoadGameObjectForQuests()

void ObjectMgr::LoadGameObjectForQuests ( )
9381{
9382 uint32 oldMSTime = getMSTime();
9383
9384 if (GetGameObjectTemplates()->empty())
9385 {
9386 LOG_WARN("server.loading", ">> Loaded 0 GameObjects for quests");
9387 LOG_INFO("server.loading", " ");
9388 return;
9389 }
9390
9391 uint32 count = 0;
9392
9393 // collect GO entries for GO that must activated
9395 for (GameObjectTemplateContainer::iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
9396 {
9397 itr->second.IsForQuests = false;
9398 switch (itr->second.type)
9399 {
9401 itr->second.IsForQuests = true;
9402 ++count;
9403 break;
9405 {
9406 // scan GO chest with loot including quest items
9407 uint32 loot_id = (itr->second.GetLootId());
9408
9409 // find quest loot for GO
9410 if (itr->second.chest.questId || LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
9411 {
9412 itr->second.IsForQuests = true;
9413 ++count;
9414 }
9415 break;
9416 }
9418 {
9419 if (itr->second._generic.questID > 0) //quests objects
9420 {
9421 itr->second.IsForQuests = true;
9422 ++count;
9423 }
9424 break;
9425 }
9427 {
9428 if (itr->second.spellFocus.questID > 0) //quests objects
9429 {
9430 itr->second.IsForQuests = true;
9431 ++count;
9432 }
9433 break;
9434 }
9436 {
9437 if (itr->second.goober.questId > 0) //quests objects
9438 {
9439 itr->second.IsForQuests = true;
9440 ++count;
9441 }
9442 break;
9443 }
9444 default:
9445 break;
9446 }
9447 }
9448
9449 LOG_INFO("server.loading", ">> Loaded {} GameObjects for quests in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9450 LOG_INFO("server.loading", " ");
9451}
LootStore LootTemplates_Gameobject("gameobject_loot_template", "gameobject entry", true)
@ GAMEOBJECT_TYPE_SPELL_FOCUS
Definition SharedDefines.h:1572
@ GAMEOBJECT_TYPE_GENERIC
Definition SharedDefines.h:1569
@ GAMEOBJECT_TYPE_CHEST
Definition SharedDefines.h:1567
@ GAMEOBJECT_TYPE_QUESTGIVER
Definition SharedDefines.h:1566
@ GAMEOBJECT_TYPE_GOOBER
Definition SharedDefines.h:1574
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, GetGameObjectTemplates(), getMSTime(), GetMSTimeDiffToNow(), LootStore::HaveQuestLootFor(), LOG_INFO, LOG_WARN, and LootTemplates_Gameobject.

◆ LoadGameObjectLocales()

void ObjectMgr::LoadGameObjectLocales ( )
7737{
7738 uint32 oldMSTime = getMSTime();
7739
7740 _gameObjectLocaleStore.clear(); // need for reload case
7741
7742 // 0 1 2 3
7743 QueryResult result = WorldDatabase.Query("SELECT entry, locale, name, castBarCaption FROM gameobject_template_locale");
7744 if (!result)
7745 return;
7746
7747 do
7748 {
7749 Field* fields = result->Fetch();
7750
7751 uint32 ID = fields[0].Get<uint32>();
7752
7753 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
7754 if (locale == LOCALE_enUS)
7755 continue;
7756
7758 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
7759 AddLocaleString(fields[3].Get<std::string>(), locale, data.CastBarCaption);
7760 } while (result->NextRow());
7761
7762 LOG_INFO("server.loading", ">> Loaded {} Gameobject Locale Strings in {} ms", (uint32)_gameObjectLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
7763}
Definition GameObjectData.h:677
std::vector< std::string > Name
Definition GameObjectData.h:678
std::vector< std::string > CastBarCaption
Definition GameObjectData.h:679

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

◆ LoadGameobjectQuestEnders()

void ObjectMgr::LoadGameobjectQuestEnders ( )
8953{
8954 LoadQuestRelationsHelper(_goQuestInvolvedRelations, "gameobject_questender", false, true);
8955
8956 for (QuestRelations::iterator itr = _goQuestInvolvedRelations.begin(); itr != _goQuestInvolvedRelations.end(); ++itr)
8957 {
8958 GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
8959 if (!goInfo)
8960 LOG_ERROR("sql.sql", "Table `gameobject_questender` have data for not existed gameobject entry ({}) and existed quest {}", itr->first, itr->second);
8961 else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
8962 LOG_ERROR("sql.sql", "Table `gameobject_questender` have data gameobject entry ({}) for quest {}, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
8963 }
8964}

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameObjectQuestItems()

void ObjectMgr::LoadGameObjectQuestItems ( )
11044{
11045 uint32 oldMSTime = getMSTime();
11046
11047 // 0 1 2
11048 QueryResult result = WorldDatabase.Query("SELECT GameObjectEntry, ItemId, Idx FROM gameobject_questitem ORDER BY Idx ASC");
11049
11050 if (!result)
11051 {
11052 LOG_WARN("server.loading", ">> Loaded 0 gameobject quest items. DB table `gameobject_questitem` is empty.");
11053 return;
11054 }
11055
11056 uint32 count = 0;
11057 do
11058 {
11059 Field* fields = result->Fetch();
11060
11061 uint32 entry = fields[0].Get<uint32>();
11062 uint32 item = fields[1].Get<uint32>();
11063 uint32 idx = fields[2].Get<uint32>();
11064
11065 GameObjectTemplate const* goInfo = GetGameObjectTemplate(entry);
11066 if (!goInfo)
11067 {
11068 LOG_ERROR("sql.sql", "Table `gameobject_questitem` has data for nonexistent gameobject (entry: {}, idx: {}), skipped", entry, idx);
11069 continue;
11070 };
11071
11072 ItemEntry const* dbcData = sItemStore.LookupEntry(item);
11073 if (!dbcData)
11074 {
11075 LOG_ERROR("sql.sql", "Table `gameobject_questitem` has nonexistent item (ID: {}) in gameobject (entry: {}, idx: {}), skipped", item, entry, idx);
11076 continue;
11077 };
11078
11079 _gameObjectQuestItemStore[entry].push_back(item);
11080
11081 ++count;
11082 } while (result->NextRow());
11083
11084 LOG_INFO("server.loading", ">> Loaded {} Gameobject Quest Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
11085 LOG_INFO("server.loading", " ");
11086}

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

◆ LoadGameobjectQuestStarters()

void ObjectMgr::LoadGameobjectQuestStarters ( )
8939{
8940 LoadQuestRelationsHelper(_goQuestRelations, "gameobject_queststarter", true, true);
8941
8942 for (QuestRelations::iterator itr = _goQuestRelations.begin(); itr != _goQuestRelations.end(); ++itr)
8943 {
8944 GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
8945 if (!goInfo)
8946 LOG_ERROR("sql.sql", "Table `gameobject_queststarter` have data for not existed gameobject entry ({}) and existed quest {}", itr->first, itr->second);
8947 else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
8948 LOG_ERROR("sql.sql", "Table `gameobject_queststarter` have data gameobject entry ({}) for quest {}, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
8949 }
8950}

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameobjects()

void ObjectMgr::LoadGameobjects ( )
2858{
2859 uint32 oldMSTime = getMSTime();
2860
2861 // 0 1 2 3 4 5 6
2862 QueryResult result = WorldDatabase.Query("SELECT gameobject.guid, id, map, position_x, position_y, position_z, orientation, "
2863 // 7 8 9 10 11 12 13 14 15 16 17
2864 "rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state, spawnMask, phaseMask, eventEntry, pool_entry, "
2865 // 18
2866 "ScriptName "
2867 "FROM gameobject LEFT OUTER JOIN game_event_gameobject ON gameobject.guid = game_event_gameobject.guid "
2868 "LEFT OUTER JOIN pool_gameobject ON gameobject.guid = pool_gameobject.guid");
2869
2870 if (!result)
2871 {
2872 LOG_WARN("server.loading", ">> Loaded 0 gameobjects. DB table `gameobject` is empty.");
2873 LOG_INFO("server.loading", " ");
2874 return;
2875 }
2876
2878 LOG_INFO("server.loading", "Calculating zone and area fields. This may take a moment...");
2879
2880 // build single time for check spawnmask
2881 std::map<uint32, uint32> spawnMasks;
2882 for (uint32 i = 0; i < sMapStore.GetNumRows(); ++i)
2883 if (sMapStore.LookupEntry(i))
2884 for (int k = 0; k < MAX_DIFFICULTY; ++k)
2886 spawnMasks[i] |= (1 << k);
2887
2888 _gameObjectDataStore.rehash(result->GetRowCount());
2889 do
2890 {
2891 Field* fields = result->Fetch();
2892
2893 ObjectGuid::LowType guid = fields[0].Get<uint32>();
2894 uint32 entry = fields[1].Get<uint32>();
2895
2896 GameObjectTemplate const* gInfo = GetGameObjectTemplate(entry);
2897 if (!gInfo)
2898 {
2899 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {}) with non existing gameobject entry {}, skipped.", guid, entry);
2900 continue;
2901 }
2902
2903 if (!gInfo->displayId)
2904 {
2905 switch (gInfo->type)
2906 {
2909 break;
2910 default:
2911 LOG_ERROR("sql.sql", "Gameobject (GUID: {} Entry {} GoType: {}) doesn't have a displayId ({}), not loaded.", guid, entry, gInfo->type, gInfo->displayId);
2912 break;
2913 }
2914 }
2915
2916 if (gInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(gInfo->displayId))
2917 {
2918 LOG_ERROR("sql.sql", "Gameobject (GUID: {} Entry {} GoType: {}) has an invalid displayId ({}), not loaded.", guid, entry, gInfo->type, gInfo->displayId);
2919 continue;
2920 }
2921
2923
2924 data.spawnId = guid;
2925 data.id = entry;
2926 data.mapid = fields[2].Get<uint16>();
2927 data.posX = fields[3].Get<float>();
2928 data.posY = fields[4].Get<float>();
2929 data.posZ = fields[5].Get<float>();
2930 data.orientation = fields[6].Get<float>();
2931 data.rotation.x = fields[7].Get<float>();
2932 data.rotation.y = fields[8].Get<float>();
2933 data.rotation.z = fields[9].Get<float>();
2934 data.rotation.w = fields[10].Get<float>();
2935 data.spawntimesecs = fields[11].Get<int32>();
2936 data.ScriptId = GetScriptId(fields[18].Get<std::string>());
2937 data.spawnGroupId = 0;
2938 if (!data.ScriptId)
2939 data.ScriptId = gInfo->ScriptId;
2940
2941 MapEntry const* mapEntry = sMapStore.LookupEntry(data.mapid);
2942 if (!mapEntry)
2943 {
2944 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) spawned on a non-existed map (Id: {}), skip", guid, data.id, data.mapid);
2945 continue;
2946 }
2947
2948 if (data.spawntimesecs == 0 && gInfo->IsDespawnAtAction())
2949 {
2950 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);
2951 }
2952
2953 data.animprogress = fields[12].Get<uint8>();
2954 data.artKit = 0;
2955
2956 uint32 go_state = fields[13].Get<uint8>();
2957 if (go_state >= MAX_GO_STATE)
2958 {
2959 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid `state` ({}) value, skip", guid, data.id, go_state);
2960 continue;
2961 }
2962 data.go_state = GOState(go_state);
2963
2964 data.spawnMask = fields[14].Get<uint8>();
2965
2966 if (!_transportMaps.count(data.mapid))
2967 {
2968 if (data.spawnMask & ~spawnMasks[data.mapid])
2969 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);
2970 }
2971 else
2972 data.spawnGroupId = 1; // force compatibility group for transport spawns
2973
2974 data.phaseMask = fields[15].Get<uint32>();
2975 int16 gameEvent = fields[16].Get<int16>();
2976 uint32 PoolId = fields[17].Get<uint32>();
2977
2978 if (data.rotation.x < -1.0f || data.rotation.x > 1.0f)
2979 {
2980 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationX ({}) value, skip", guid, data.id, data.rotation.x);
2981 continue;
2982 }
2983
2984 if (data.rotation.y < -1.0f || data.rotation.y > 1.0f)
2985 {
2986 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationY ({}) value, skip", guid, data.id, data.rotation.y);
2987 continue;
2988 }
2989
2990 if (data.rotation.z < -1.0f || data.rotation.z > 1.0f)
2991 {
2992 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationZ ({}) value, skip", guid, data.id, data.rotation.z);
2993 continue;
2994 }
2995
2996 if (data.rotation.w < -1.0f || data.rotation.w > 1.0f)
2997 {
2998 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationW ({}) value, skip", guid, data.id, data.rotation.w);
2999 continue;
3000 }
3001
3002 if (fabs(data.rotation.x * data.rotation.x + data.rotation.y * data.rotation.y +
3003 data.rotation.z * data.rotation.z + data.rotation.w * data.rotation.w - 1.0f) >= 1e-5f)
3004 {
3005 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotation quaternion (non-unit), defaulting to orientation on Z axis only", guid, data.id);
3006 data.rotation = G3D::Quat(G3D::Matrix3::fromEulerAnglesZYX(data.orientation, 0.0f, 0.0f));
3007 }
3008
3009 if (!MapMgr::IsValidMapCoord(data.mapid, data.posX, data.posY, data.posZ, data.orientation))
3010 {
3011 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid coordinates, skip", guid, data.id);
3012 continue;
3013 }
3014
3015 if (data.phaseMask == 0)
3016 {
3017 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with `phaseMask`=0 (not visible for anyone), set to 1.", guid, data.id);
3018 data.phaseMask = 1;
3019 }
3020
3022 {
3023 uint32 zoneId = sMapMgr->GetZoneId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
3024 uint32 areaId = sMapMgr->GetAreaId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
3025
3027
3028 stmt->SetData(0, zoneId);
3029 stmt->SetData(1, areaId);
3030 stmt->SetData(2, guid);
3031
3032 WorldDatabase.Execute(stmt);
3033 }
3034
3035 if (gameEvent == 0 && PoolId == 0) // if not this is to be managed by GameEvent System or Pool system
3036 AddGameobjectToGrid(guid, &data);
3037 } while (result->NextRow());
3038
3039 LOG_INFO("server.loading", ">> Loaded {} Gameobjects in {} ms", (unsigned long)_gameObjectDataStore.size(), GetMSTimeDiffToNow(oldMSTime));
3040 LOG_INFO("server.loading", " ");
3041}
@ GAMEOBJECT_TYPE_TRAP
Definition SharedDefines.h:1570
@ CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA
Definition WorldConfig.h:117
@ WORLD_UPD_GAMEOBJECT_ZONE_AREA_DATA
Definition WorldDatabase.h:115

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, SpawnData::mapid, MAX_DIFFICULTY, MAX_GO_STATE, SpawnData::orientation, SpawnData::phaseMask, SpawnData::posX, SpawnData::posY, SpawnData::posZ, GameObjectData::rotation, SpawnData::ScriptId, PreparedStatementBase::SetData(), sGameObjectDisplayInfoStore, sMapMgr, sMapStore, SpawnData::spawnGroupId, SpawnData::spawnId, SpawnData::spawnMask, GameObjectData::spawntimesecs, sWorld, WORLD_UPD_GAMEOBJECT_ZONE_AREA_DATA, and WorldDatabase.

◆ LoadGameObjectSummons()

void ObjectMgr::LoadGameObjectSummons ( )
2240{
2241 uint32 oldMSTime = getMSTime();
2242
2243 _goSummonDataStore.clear();
2244
2245 // 0 1 2 3 4 5 6 7 8 9 10 11 12
2246 QueryResult result = WorldDatabase.Query("SELECT summonerId, summonerType, groupId, entry, position_x, position_y, position_z, orientation, rotation0, rotation1, rotation2, rotation3, respawnTime FROM gameobject_summon_groups");
2247
2248 if (!result)
2249 {
2250 LOG_WARN("server.loading", ">> Loaded 0 gameobject summons. DB table `gameobject_summon_groups` is empty.");
2251 return;
2252 }
2253
2254 uint32 count = 0;
2255 do
2256 {
2257 Field* fields = result->Fetch();
2258
2259 uint32 summonerId = fields[0].Get<uint32>();
2260 SummonerType summonerType = SummonerType(fields[1].Get<uint8>());
2261 uint8 group = fields[2].Get<uint8>();
2262
2263 switch (summonerType)
2264 {
2266 if (!GetCreatureTemplate(summonerId))
2267 {
2268 LOG_ERROR("sql.sql", "Table `gameobject_summon_groups` has summoner with non existing entry {} for creature summoner type, skipped.", summonerId);
2269 continue;
2270 }
2271 break;
2273 if (!GetGameObjectTemplate(summonerId))
2274 {
2275 LOG_ERROR("sql.sql", "Table `gameobject_summon_groups` has summoner with non existing entry {} for gameobject summoner type, skipped.", summonerId);
2276 continue;
2277 }
2278 break;
2279 case SUMMONER_TYPE_MAP:
2280 if (!sMapStore.LookupEntry(summonerId))
2281 {
2282 LOG_ERROR("sql.sql", "Table `gameobject_summon_groups` has summoner with non existing entry {} for map summoner type, skipped.", summonerId);
2283 continue;
2284 }
2285 break;
2286 default:
2287 LOG_ERROR("sql.sql", "Table `gameobject_summon_groups` has unhandled summoner type {} for summoner {}, skipped.", summonerType, summonerId);
2288 continue;
2289 }
2290
2292 data.entry = fields[3].Get<uint32>();
2293
2294 if (!GetGameObjectTemplate(data.entry))
2295 {
2296 LOG_ERROR("sql.sql", "Table `gameobject_summon_groups` has gameobject in group [Summoner ID: {}, Summoner Type: {}, Group ID: {}] with non existing gameobject entry {}, skipped.", summonerId, summonerType, group, data.entry);
2297 continue;
2298 }
2299
2300 float posX = fields[4].Get<float>();
2301 float posY = fields[5].Get<float>();
2302 float posZ = fields[6].Get<float>();
2303 float orientation = fields[7].Get<float>();
2304
2305 data.pos.Relocate(posX, posY, posZ, orientation);
2306
2307 data.rot = G3D::Quat(fields[8].Get<float>(), fields[9].Get<float>(), fields[10].Get<float>(), fields[11].Get<float>());
2308 data.respawnTime = fields[12].Get<uint32>();
2309
2310 TempSummonGroupKey key(summonerId, summonerType, group);
2311 _goSummonDataStore[key].push_back(data);
2312
2313 ++count;
2314 } while (result->NextRow());
2315
2316 LOG_INFO("server.loading", ">> Loaded {} Gameobject Summons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2317 LOG_INFO("server.loading", " ");
2318}
SummonerType
Definition TemporarySummon.h:25
@ SUMMONER_TYPE_MAP
Definition TemporarySummon.h:28
@ SUMMONER_TYPE_CREATURE
Definition TemporarySummon.h:26
@ SUMMONER_TYPE_GAMEOBJECT
Definition TemporarySummon.h:27
Stores data for temp gameobject summons.
Definition TemporarySummon.h:42
G3D::Quat rot
Definition TemporarySummon.h:45
uint32 respawnTime
Duration in seconds; passed to SummonGameObject's respawnTime parameter.
Definition TemporarySummon.h:46
uint32 entry
Definition TemporarySummon.h:43
Position pos
Definition TemporarySummon.h:44
void Relocate(float x, float y)
Definition Position.h:77

References _goSummonDataStore, GameObjectSummonData::entry, Field::Get(), GetCreatureTemplate(), GetGameObjectTemplate(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, GameObjectSummonData::pos, Position::Relocate(), GameObjectSummonData::respawnTime, GameObjectSummonData::rot, sMapStore, SUMMONER_TYPE_CREATURE, SUMMONER_TYPE_GAMEOBJECT, SUMMONER_TYPE_MAP, and WorldDatabase.

◆ LoadGameObjectTemplate()

void ObjectMgr::LoadGameObjectTemplate ( )
7825{
7826 uint32 oldMSTime = getMSTime();
7827
7828 // 0 1 2 3 4 5 6 7
7829 QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, size, "
7830 // 8 9 10 11 12 13 14 15 16 17 18 19 20
7831 "Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, "
7832 // 21 22 23 24 25 26 27 28 29 30 31 32 33
7833 "Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, AIName, ScriptName "
7834 "FROM gameobject_template");
7835
7836 if (!result)
7837 {
7838 LOG_WARN("server.loading", ">> Loaded 0 gameobject definitions. DB table `gameobject_template` is empty.");
7839 LOG_INFO("server.loading", " ");
7840 return;
7841 }
7842
7843 _gameObjectTemplateStore.rehash(result->GetRowCount());
7844 uint32 count = 0;
7845 do
7846 {
7847 Field* fields = result->Fetch();
7848
7849 uint32 entry = fields[0].Get<uint32>();
7850
7852
7853 got.entry = entry;
7854 got.type = uint32(fields[1].Get<uint8>());
7855 got.displayId = fields[2].Get<uint32>();
7856 got.name = fields[3].Get<std::string>();
7857 got.IconName = fields[4].Get<std::string>();
7858 got.castBarCaption = fields[5].Get<std::string>();
7859 got.unk1 = fields[6].Get<std::string>();
7860 got.size = fields[7].Get<float>();
7861
7862 for (uint8 i = 0; i < MAX_GAMEOBJECT_DATA; ++i)
7863 got.raw.data[i] = fields[8 + i].Get<int32>(); // data1 and data6 can be -1
7864
7865 got.AIName = fields[32].Get<std::string>();
7866 got.ScriptId = GetScriptId(fields[33].Get<std::string>());
7867 got.IsForQuests = false;
7868
7869 // Checks
7870 if (!got.AIName.empty() && !sGameObjectAIRegistry->HasItem(got.AIName))
7871 {
7872 LOG_ERROR("sql.sql", "GameObject (Entry: {}) has non-registered `AIName` '{}' set, removing", got.entry, got.AIName);
7873 }
7874
7875 switch (got.type)
7876 {
7877 case GAMEOBJECT_TYPE_DOOR: //0
7878 {
7879 if (got.door.lockId)
7880 CheckGOLockId(&got, got.door.lockId, 1);
7881 CheckGONoDamageImmuneId(&got, got.door.noDamageImmune, 3);
7882 break;
7883 }
7884 case GAMEOBJECT_TYPE_BUTTON: //1
7885 {
7886 if (got.button.lockId)
7887 CheckGOLockId(&got, got.button.lockId, 1);
7888 CheckGONoDamageImmuneId(&got, got.button.noDamageImmune, 4);
7889 break;
7890 }
7892 {
7893 if (got.questgiver.lockId)
7894 CheckGOLockId(&got, got.questgiver.lockId, 0);
7895 CheckGONoDamageImmuneId(&got, got.questgiver.noDamageImmune, 5);
7896 break;
7897 }
7898 case GAMEOBJECT_TYPE_CHEST: //3
7899 {
7900 if (got.chest.lockId)
7901 CheckGOLockId(&got, got.chest.lockId, 0);
7902
7903 CheckGOConsumable(&got, got.chest.consumable, 3);
7904
7905 if (got.chest.linkedTrapId) // linked trap
7906 CheckGOLinkedTrapId(&got, got.chest.linkedTrapId, 7);
7907 break;
7908 }
7909 case GAMEOBJECT_TYPE_TRAP: //6
7910 {
7911 if (got.trap.lockId)
7912 CheckGOLockId(&got, got.trap.lockId, 0);
7913 break;
7914 }
7915 case GAMEOBJECT_TYPE_CHAIR: //7
7916 CheckAndFixGOChairHeightId(&got, got.chair.height, 1);
7917 break;
7919 {
7920 if (got.spellFocus.focusId)
7921 {
7922 if (!sSpellFocusObjectStore.LookupEntry(got.spellFocus.focusId))
7923 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data0={} but SpellFocus (Id: {}) not exist.",
7924 entry, got.type, got.spellFocus.focusId, got.spellFocus.focusId);
7925 }
7926
7927 if (got.spellFocus.linkedTrapId) // linked trap
7928 CheckGOLinkedTrapId(&got, got.spellFocus.linkedTrapId, 2);
7929 break;
7930 }
7931 case GAMEOBJECT_TYPE_GOOBER: //10
7932 {
7933 if (got.goober.lockId)
7934 CheckGOLockId(&got, got.goober.lockId, 0);
7935
7936 CheckGOConsumable(&got, got.goober.consumable, 3);
7937
7938 if (got.goober.pageId) // pageId
7939 {
7940 if (!GetPageText(got.goober.pageId))
7941 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data7={} but PageText (Entry {}) not exist.",
7942 entry, got.type, got.goober.pageId, got.goober.pageId);
7943 }
7944 CheckGONoDamageImmuneId(&got, got.goober.noDamageImmune, 11);
7945 if (got.goober.linkedTrapId) // linked trap
7946 CheckGOLinkedTrapId(&got, got.goober.linkedTrapId, 12);
7947 break;
7948 }
7950 {
7951 if (got.areadamage.lockId)
7952 CheckGOLockId(&got, got.areadamage.lockId, 0);
7953 break;
7954 }
7955 case GAMEOBJECT_TYPE_CAMERA: //13
7956 {
7957 if (got.camera.lockId)
7958 CheckGOLockId(&got, got.camera.lockId, 0);
7959 break;
7960 }
7962 {
7963 if (got.moTransport.taxiPathId)
7964 {
7965 if (got.moTransport.taxiPathId >= sTaxiPathNodesByPath.size() || sTaxiPathNodesByPath[got.moTransport.taxiPathId].empty())
7966 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data0={} but TaxiPath (Id: {}) not exist.",
7967 entry, got.type, got.moTransport.taxiPathId, got.moTransport.taxiPathId);
7968 }
7969 if (uint32 transportMap = got.moTransport.mapID)
7970 _transportMaps.insert(transportMap);
7971 break;
7972 }
7974 break;
7976 {
7977 // always must have spell
7978 CheckGOSpellId(&got, got.spellcaster.spellId, 0);
7979 break;
7980 }
7981 case GAMEOBJECT_TYPE_FLAGSTAND: //24
7982 {
7983 if (got.flagstand.lockId)
7984 CheckGOLockId(&got, got.flagstand.lockId, 0);
7985 CheckGONoDamageImmuneId(&got, got.flagstand.noDamageImmune, 5);
7986 break;
7987 }
7989 {
7990 if (got.fishinghole.lockId)
7991 CheckGOLockId(&got, got.fishinghole.lockId, 4);
7992 break;
7993 }
7994 case GAMEOBJECT_TYPE_FLAGDROP: //26
7995 {
7996 if (got.flagdrop.lockId)
7997 CheckGOLockId(&got, got.flagdrop.lockId, 0);
7998 CheckGONoDamageImmuneId(&got, got.flagdrop.noDamageImmune, 3);
7999 break;
8000 }
8002 CheckAndFixGOChairHeightId(&got, got.barberChair.chairheight, 0);
8003 break;
8004 }
8005
8006 ++count;
8007 } while (result->NextRow());
8008
8009 LOG_INFO("server.loading", ">> Loaded {} Game Object Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8010 LOG_INFO("server.loading", " ");
8011}
DBCStorage< SpellFocusObjectEntry > sSpellFocusObjectStore(SpellFocusObjectfmt)
#define sGameObjectAIRegistry
Definition GameObjectAIFactory.h:49
void CheckGONoDamageImmuneId(GameObjectTemplate *goTemplate, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7805
void CheckGOSpellId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7784
void CheckAndFixGOChairHeightId(GameObjectTemplate const *goInfo, uint32 const &dataN, uint32 N)
Definition ObjectMgr.cpp:7793
void CheckGOConsumable(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7814
void CheckGOLinkedTrapId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7774
void CheckGOLockId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7765
@ GAMEOBJECT_TYPE_CAMERA
Definition SharedDefines.h:1577
@ GAMEOBJECT_TYPE_BUTTON
Definition SharedDefines.h:1565
@ GAMEOBJECT_TYPE_MO_TRANSPORT
Definition SharedDefines.h:1579
@ GAMEOBJECT_TYPE_SUMMONING_RITUAL
Definition SharedDefines.h:1582
@ GAMEOBJECT_TYPE_FISHINGHOLE
Definition SharedDefines.h:1589
@ GAMEOBJECT_TYPE_FLAGDROP
Definition SharedDefines.h:1590
@ GAMEOBJECT_TYPE_SPELLCASTER
Definition SharedDefines.h:1586
@ GAMEOBJECT_TYPE_FLAGSTAND
Definition SharedDefines.h:1588
@ GAMEOBJECT_TYPE_CHAIR
Definition SharedDefines.h:1571
@ GAMEOBJECT_TYPE_AREADAMAGE
Definition SharedDefines.h:1576
@ GAMEOBJECT_TYPE_BARBER_CHAIR
Definition SharedDefines.h:1596
@ GAMEOBJECT_TYPE_DOOR
Definition SharedDefines.h:1564
#define MAX_GAMEOBJECT_DATA
Definition SharedDefines.h:1603
PageText const * GetPageText(uint32 pageEntry)
Definition ObjectMgr.cpp:6448
uint32 entry
Definition GameObjectData.h:33

References _gameObjectTemplateStore, _transportMaps, CheckAndFixGOChairHeightId(), CheckGOConsumable(), CheckGOLinkedTrapId(), CheckGOLockId(), CheckGONoDamageImmuneId(), CheckGOSpellId(), GameObjectTemplate::entry, 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 ( )
8014{
8015 uint32 oldMSTime = getMSTime();
8016
8017 // 0 1 2 3 4 5 6 7 8
8018 QueryResult result = WorldDatabase.Query("SELECT entry, faction, flags, mingold, maxgold, artkit0, artkit1, artkit2, artkit3 FROM gameobject_template_addon");
8019
8020 if (!result)
8021 {
8022 LOG_WARN("server.loading", ">> Loaded 0 gameobject template addon definitions. DB table `gameobject_template_addon` is empty.");
8023 LOG_INFO("server.loading", " ");
8024 return;
8025 }
8026
8027 uint32 count = 0;
8028 do
8029 {
8030 Field* fields = result->Fetch();
8031
8032 uint32 entry = fields[0].Get<uint32>();
8033
8034 GameObjectTemplate const* got = GetGameObjectTemplate(entry);
8035 if (!got)
8036 {
8037 LOG_ERROR("sql.sql",
8038 "GameObject template (Entry: {}) does not exist but has a record in `gameobject_template_addon`",
8039 entry);
8040 continue;
8041 }
8042
8044 gameObjectAddon.faction = uint32(fields[1].Get<uint16>());
8045 gameObjectAddon.flags = fields[2].Get<uint32>();
8046 gameObjectAddon.mingold = fields[3].Get<uint32>();
8047 gameObjectAddon.maxgold = fields[4].Get<uint32>();
8048
8049 for (uint32 i = 0; i < gameObjectAddon.artKits.size(); i++)
8050 {
8051 uint32 artKitID = fields[5 + i].Get<uint32>();
8052 if (!artKitID)
8053 continue;
8054
8055 if (!sGameObjectArtKitStore.LookupEntry(artKitID))
8056 {
8057 LOG_ERROR("sql.sql", "GameObject (Entry: {}) has invalid `artkit{}` {} defined, set to zero instead.", entry, i, artKitID);
8058 continue;
8059 }
8060
8061 gameObjectAddon.artKits[i] = artKitID;
8062 }
8063
8064 // checks
8065 if (gameObjectAddon.faction && !sFactionTemplateStore.LookupEntry(gameObjectAddon.faction))
8066 LOG_ERROR("sql.sql",
8067 "GameObject (Entry: {}) has invalid faction ({}) defined in `gameobject_template_addon`.",
8068 entry, gameObjectAddon.faction);
8069
8070 if (gameObjectAddon.maxgold > 0)
8071 {
8072 switch (got->type)
8073 {
8076 break;
8077 default:
8078 LOG_ERROR("sql.sql",
8079 "GameObject (Entry {} GoType: {}) cannot be looted but has maxgold set in `gameobject_template_addon`.",
8080 entry, got->type);
8081 break;
8082 }
8083 }
8084
8085 ++count;
8086 } while (result->NextRow());
8087
8088 LOG_INFO("server.loading", ">> Loaded {} Game Object Template Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8089 LOG_INFO("server.loading", " ");
8090}
DBCStorage< GameObjectArtKitEntry > sGameObjectArtKitStore(GameObjectArtKitfmt)
Definition GameObjectData.h:667
uint32 mingold
Definition GameObjectData.h:671
uint32 flags
Definition GameObjectData.h:670
uint32 faction
Definition GameObjectData.h:669
std::array< uint32, 4 > artKits
Definition GameObjectData.h:673
uint32 maxgold
Definition GameObjectData.h:672

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

◆ LoadGameTele()

void ObjectMgr::LoadGameTele ( )
9735{
9736 uint32 oldMSTime = getMSTime();
9737
9738 _gameTeleStore.clear(); // for reload case
9739
9740 // 0 1 2 3 4 5 6
9741 QueryResult result = WorldDatabase.Query("SELECT id, position_x, position_y, position_z, orientation, map, name FROM game_tele");
9742
9743 if (!result)
9744 {
9745 LOG_WARN("server.loading", ">> Loaded 0 GameTeleports. DB table `game_tele` is empty!");
9746 LOG_INFO("server.loading", " ");
9747 return;
9748 }
9749
9750 uint32 count = 0;
9751
9752 do
9753 {
9754 Field* fields = result->Fetch();
9755
9756 uint32 id = fields[0].Get<uint32>();
9757
9758 GameTele gt;
9759
9760 gt.position_x = fields[1].Get<float>();
9761 gt.position_y = fields[2].Get<float>();
9762 gt.position_z = fields[3].Get<float>();
9763 gt.orientation = fields[4].Get<float>();
9764 gt.mapId = fields[5].Get<uint16>();
9765 gt.name = fields[6].Get<std::string>();
9766
9767 if (!MapMgr::IsValidMapCoord(gt.mapId, gt.position_x, gt.position_y, gt.position_z, gt.orientation))
9768 {
9769 LOG_ERROR("sql.sql", "Wrong position for id {} (name: {}) in `game_tele` table, ignoring.", id, gt.name);
9770 continue;
9771 }
9772
9773 if (!Utf8toWStr(gt.name, gt.wnameLow))
9774 {
9775 LOG_ERROR("sql.sql", "Wrong UTF8 name for id {} in `game_tele` table, ignoring.", id);
9776 continue;
9777 }
9778
9779 wstrToLower(gt.wnameLow);
9780
9781 _gameTeleStore[id] = gt;
9782
9783 ++count;
9784 } while (result->NextRow());
9785
9786 LOG_INFO("server.loading", ">> Loaded {} GameTeleports in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9787 LOG_INFO("server.loading", " ");
9788}
float position_x
Definition ObjectMgr.h:134

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 ( )
10191{
10192 uint32 oldMSTime = getMSTime();
10193
10194 _gossipMenusStore.clear();
10195
10196 QueryResult result = WorldDatabase.Query("SELECT MenuID, TextID FROM gossip_menu");
10197
10198 if (!result)
10199 {
10200 LOG_WARN("server.loading", ">> Loaded 0 gossip_menu entries. DB table `gossip_menu` is empty!");
10201 LOG_INFO("server.loading", " ");
10202 return;
10203 }
10204
10205 do
10206 {
10207 Field* fields = result->Fetch();
10208
10209 GossipMenus gMenu;
10210
10211 gMenu.MenuID = fields[0].Get<uint32>();
10212 gMenu.TextID = fields[1].Get<uint32>();
10213
10214 if (!GetGossipText(gMenu.TextID))
10215 {
10216 LOG_ERROR("sql.sql", "Table gossip_menu entry {} are using non-existing TextID {}", gMenu.MenuID, gMenu.TextID);
10217 continue;
10218 }
10219
10220 _gossipMenusStore.insert(GossipMenusContainer::value_type(gMenu.MenuID, gMenu));
10221 } while (result->NextRow());
10222
10223 LOG_INFO("server.loading", ">> Loaded {} gossip_menu entries in {} ms", (uint32)_gossipMenusStore.size(), GetMSTimeDiffToNow(oldMSTime));
10224 LOG_INFO("server.loading", " ");
10225}
GossipText const * GetGossipText(uint32 Text_ID) const
Definition ObjectMgr.cpp:6626
Definition ObjectMgr.h:628
uint32 TextID
Definition ObjectMgr.h:630
uint32 MenuID
Definition ObjectMgr.h:629

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

◆ LoadGossipMenuItems()

void ObjectMgr::LoadGossipMenuItems ( )
10228{
10229 uint32 oldMSTime = getMSTime();
10230
10231 _gossipMenuItemsStore.clear();
10232
10233 QueryResult result = WorldDatabase.Query(
10234 // 0 1 2 3 4 5 6 7 8 9 10 11 12
10235 "SELECT MenuID, OptionID, OptionIcon, OptionText, OptionBroadcastTextID, OptionType, OptionNpcFlag, ActionMenuID, ActionPoiID, BoxCoded, BoxMoney, BoxText, BoxBroadcastTextID "
10236 "FROM gossip_menu_option ORDER BY MenuID, OptionID");
10237
10238 if (!result)
10239 {
10240 LOG_WARN("server.loading", ">> Loaded 0 gossip_menu_option IDs. DB table `gossip_menu_option` is empty!");
10241 LOG_INFO("server.loading", " ");
10242 return;
10243 }
10244
10245 do
10246 {
10247 Field* fields = result->Fetch();
10248
10249 GossipMenuItems gMenuItem;
10250
10251 gMenuItem.MenuID = fields[0].Get<uint32>();
10252 gMenuItem.OptionID = fields[1].Get<uint16>();
10253 gMenuItem.OptionIcon = fields[2].Get<uint32>();
10254 gMenuItem.OptionText = fields[3].Get<std::string>();
10255 gMenuItem.OptionBroadcastTextID = fields[4].Get<uint32>();
10256 gMenuItem.OptionType = fields[5].Get<uint8>();
10257 gMenuItem.OptionNpcFlag = fields[6].Get<uint32>();
10258 gMenuItem.ActionMenuID = fields[7].Get<uint32>();
10259 gMenuItem.ActionPoiID = fields[8].Get<uint32>();
10260 gMenuItem.BoxCoded = fields[9].Get<bool>();
10261 gMenuItem.BoxMoney = fields[10].Get<uint32>();
10262 gMenuItem.BoxText = fields[11].Get<std::string>();
10263 gMenuItem.BoxBroadcastTextID = fields[12].Get<uint32>();
10264
10265 if (gMenuItem.OptionIcon >= GOSSIP_ICON_MAX)
10266 {
10267 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);
10268 gMenuItem.OptionIcon = GOSSIP_ICON_CHAT;
10269 }
10270
10272 {
10273 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has non-existing or incompatible OptionBroadcastTextID {}, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.OptionBroadcastTextID);
10274 gMenuItem.OptionBroadcastTextID = 0;
10275 }
10276
10277 if (gMenuItem.OptionType >= GOSSIP_OPTION_MAX)
10278 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);
10279
10280 if (gMenuItem.ActionPoiID && !GetPointOfInterest(gMenuItem.ActionPoiID))
10281 {
10282 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} use non-existing ActionPoiID {}, ignoring", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.ActionPoiID);
10283 gMenuItem.ActionPoiID = 0;
10284 }
10285
10286 if (gMenuItem.BoxBroadcastTextID && !GetBroadcastText(gMenuItem.BoxBroadcastTextID))
10287 {
10288 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has non-existing or incompatible BoxBroadcastTextID {}, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.BoxBroadcastTextID);
10289 gMenuItem.BoxBroadcastTextID = 0;
10290 }
10291
10292 _gossipMenuItemsStore.insert(GossipMenuItemsContainer::value_type(gMenuItem.MenuID, gMenuItem));
10293 } while (result->NextRow());
10294
10295 // Warn if any trainer creature templates reference a GossipMenuId that has no gossip_menu_option entries
10296 // This will cause the gossip menu to fallback to MenuID 0 at runtime which will display: "I wish to unlearn my talents."
10297 std::set<uint32> checkedMenuIds;
10298 for (auto const& [entry, tmpl] : _creatureTemplateStore)
10299 {
10300 uint32 menuId = tmpl.GossipMenuId;
10301 if (!menuId)
10302 continue;
10303
10304 if (!(tmpl.npcflag & UNIT_NPC_FLAG_TRAINER))
10305 continue;
10306
10307 if (checkedMenuIds.contains(menuId))
10308 continue;
10309
10310 checkedMenuIds.insert(menuId);
10311
10312 auto [first, second] = _gossipMenuItemsStore.equal_range(menuId);
10313 if (first == second)
10314 LOG_WARN("server.loading", "Trainer creature template references GossipMenuId {} has no `gossip_menu_option` entries. This will fallback to MenuID 0.", menuId);
10315 }
10316
10317 LOG_INFO("server.loading", ">> Loaded {} gossip_menu_option entries in {} ms", uint32(_gossipMenuItemsStore.size()), GetMSTimeDiffToNow(oldMSTime));
10318 LOG_INFO("server.loading", " ");
10319}
@ GOSSIP_ICON_CHAT
Definition GossipDef.h:61
@ GOSSIP_ICON_MAX
Definition GossipDef.h:82
@ GOSSIP_OPTION_MAX
Definition GossipDef.h:56
@ UNIT_NPC_FLAG_TRAINER
Definition UnitDefines.h:326
PointOfInterest const * GetPointOfInterest(uint32 id) const
Definition ObjectMgr.h:932
BroadcastText const * GetBroadcastText(uint32 id) const
Definition ObjectMgr.h:1227
Definition ObjectMgr.h:610
uint8 OptionIcon
Definition ObjectMgr.h:613
uint32 BoxBroadcastTextID
Definition ObjectMgr.h:624
std::string OptionText
Definition ObjectMgr.h:614
uint32 ActionMenuID
Definition ObjectMgr.h:618
bool BoxCoded
Definition ObjectMgr.h:620
uint32 MenuID
Definition ObjectMgr.h:611
uint32 OptionNpcFlag
Definition ObjectMgr.h:617
uint32 ActionPoiID
Definition ObjectMgr.h:619
uint32 BoxMoney
Definition ObjectMgr.h:621
std::string BoxText
Definition ObjectMgr.h:622
uint32 OptionID
Definition ObjectMgr.h:612
uint32 OptionType
Definition ObjectMgr.h:616
uint32 OptionBroadcastTextID
Definition ObjectMgr.h:615

References _creatureTemplateStore, _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, UNIT_NPC_FLAG_TRAINER, and WorldDatabase.

◆ LoadGossipMenuItemsLocales()

void ObjectMgr::LoadGossipMenuItemsLocales ( )
424{
425 uint32 oldMSTime = getMSTime();
426
427 _gossipMenuItemsLocaleStore.clear(); // need for reload case
428
429 // 0 1 2 3 4
430 QueryResult result = WorldDatabase.Query("SELECT MenuID, OptionID, Locale, OptionText, BoxText FROM gossip_menu_option_locale");
431
432 if (!result)
433 return;
434
435 do
436 {
437 Field* fields = result->Fetch();
438
439 uint32 MenuID = fields[0].Get<uint32>();
440 uint16 OptionID = fields[1].Get<uint16>();
441
442 LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>());
443 if (locale == LOCALE_enUS)
444 continue;
445
447 AddLocaleString(fields[3].Get<std::string>(), locale, data.OptionText);
448 AddLocaleString(fields[4].Get<std::string>(), locale, data.BoxText);
449 } while (result->NextRow());
450
451 LOG_INFO("server.loading", ">> Loaded {} Gossip Menu Option Locale Strings in {} ms", (uint32)_gossipMenuItemsLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
452}
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 ( )
6635{
6636 uint32 oldMSTime = getMSTime();
6637
6638 QueryResult result = WorldDatabase.Query("SELECT ID, "
6639 "text0_0, text0_1, BroadcastTextID0, lang0, Probability0, em0_0, em0_1, em0_2, em0_3, em0_4, em0_5, "
6640 "text1_0, text1_1, BroadcastTextID1, lang1, Probability1, em1_0, em1_1, em1_2, em1_3, em1_4, em1_5, "
6641 "text2_0, text2_1, BroadcastTextID2, lang2, Probability2, em2_0, em2_1, em2_2, em2_3, em2_4, em2_5, "
6642 "text3_0, text3_1, BroadcastTextID3, lang3, Probability3, em3_0, em3_1, em3_2, em3_3, em3_4, em3_5, "
6643 "text4_0, text4_1, BroadcastTextID4, lang4, Probability4, em4_0, em4_1, em4_2, em4_3, em4_4, em4_5, "
6644 "text5_0, text5_1, BroadcastTextID5, lang5, Probability5, em5_0, em5_1, em5_2, em5_3, em5_4, em5_5, "
6645 "text6_0, text6_1, BroadcastTextID6, lang6, Probability6, em6_0, em6_1, em6_2, em6_3, em6_4, em6_5, "
6646 "text7_0, text7_1, BroadcastTextID7, lang7, Probability7, em7_0, em7_1, em7_2, em7_3, em7_4, em7_5 "
6647 "FROM npc_text");
6648
6649 if (!result)
6650 {
6651 LOG_WARN("server.loading", ">> Loaded 0 npc texts, table is empty!");
6652 LOG_INFO("server.loading", " ");
6653 return;
6654 }
6655
6656 _gossipTextStore.rehash(result->GetRowCount());
6657
6658 uint32 count = 0;
6659 uint8 cic;
6660
6661 do
6662 {
6663 cic = 0;
6664
6665 Field* fields = result->Fetch();
6666
6667 uint32 id = fields[cic++].Get<uint32>();
6668 if (!id)
6669 {
6670 LOG_ERROR("sql.sql", "Table `npc_text` has record wit reserved id 0, ignore.");
6671 continue;
6672 }
6673
6674 GossipText& gText = _gossipTextStore[id];
6675
6676 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6677 {
6678 gText.Options[i].Text_0 = fields[cic++].Get<std::string>();
6679 gText.Options[i].Text_1 = fields[cic++].Get<std::string>();
6680 gText.Options[i].BroadcastTextID = fields[cic++].Get<uint32>();
6681 gText.Options[i].Language = fields[cic++].Get<uint8>();
6682 gText.Options[i].Probability = fields[cic++].Get<float>();
6683
6684 for (uint8 j = 0; j < MAX_GOSSIP_TEXT_EMOTES; ++j)
6685 {
6686 gText.Options[i].Emotes[j]._Delay = fields[cic++].Get<uint16>();
6687 gText.Options[i].Emotes[j]._Emote = fields[cic++].Get<uint16>();
6688 }
6689 }
6690
6691 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; i++)
6692 {
6693 if (gText.Options[i].BroadcastTextID)
6694 {
6696 {
6697 LOG_ERROR("sql.sql", "GossipText (Id: {}) in table `npc_text` has non-existing or incompatible BroadcastTextID{} {}.", id, i, gText.Options[i].BroadcastTextID);
6698 gText.Options[i].BroadcastTextID = 0;
6699 }
6700 }
6701 }
6702
6703 count++;
6704 } while (result->NextRow());
6705
6706 LOG_INFO("server.loading", ">> Loaded {} Npc Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6707 LOG_INFO("server.loading", " ");
6708}
#define MAX_GOSSIP_TEXT_OPTIONS
Definition NPCHandler.h:42
#define MAX_GOSSIP_TEXT_EMOTES
Definition NPCHandler.h:30
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
uint32 _Emote
Definition NPCHandler.h:26
uint32 _Delay
Definition NPCHandler.h:27

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 ( )
6542{
6543 uint32 oldMSTime = getMSTime();
6544
6545 // 0 1 2 3
6546 QueryResult result = WorldDatabase.Query("SELECT entry, creditType, creditEntry, lastEncounterDungeon FROM instance_encounters");
6547 if (!result)
6548 {
6549 LOG_WARN("server.loading", ">> Loaded 0 instance encounters, table is empty!");
6550 LOG_INFO("server.loading", " ");
6551 return;
6552 }
6553
6554 uint32 count = 0;
6555 std::map<uint32, DungeonEncounterEntry const*> dungeonLastBosses;
6556 do
6557 {
6558 Field* fields = result->Fetch();
6559 uint32 entry = fields[0].Get<uint32>();
6560 uint8 creditType = fields[1].Get<uint8>();
6561 uint32 creditEntry = fields[2].Get<uint32>();
6562 uint32 lastEncounterDungeon = fields[3].Get<uint16>();
6563 DungeonEncounterEntry const* dungeonEncounter = sDungeonEncounterStore.LookupEntry(entry);
6564 if (!dungeonEncounter)
6565 {
6566 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid encounter id {}, skipped!", entry);
6567 continue;
6568 }
6569
6570 if (lastEncounterDungeon && !sLFGMgr->GetLFGDungeonEntry(lastEncounterDungeon))
6571 {
6572 LOG_ERROR("sql.sql", "Table `instance_encounters` has an encounter {} ({}) marked as final for invalid dungeon id {}, skipped!", entry, dungeonEncounter->encounterName[0], lastEncounterDungeon);
6573 continue;
6574 }
6575
6576 std::map<uint32, DungeonEncounterEntry const*>::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon);
6577 if (lastEncounterDungeon)
6578 {
6579 if (itr != dungeonLastBosses.end())
6580 {
6581 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]);
6582 continue;
6583 }
6584
6585 dungeonLastBosses[lastEncounterDungeon] = dungeonEncounter;
6586 }
6587
6588 switch (creditType)
6589 {
6591 {
6592 CreatureTemplate const* creatureInfo = GetCreatureTemplate(creditEntry);
6593 if (!creatureInfo)
6594 {
6595 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid creature (entry {}) linked to the encounter {} ({}), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
6596 continue;
6597 }
6598 const_cast<CreatureTemplate*>(creatureInfo)->flags_extra |= CREATURE_FLAG_EXTRA_DUNGEON_BOSS;
6599 break;
6600 }
6602 {
6603 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(creditEntry);
6604 if (!spellInfo)
6605 {
6606 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid spell (entry {}) linked to the encounter {} ({}), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
6607 continue;
6608 }
6609 const_cast<SpellInfo*>(spellInfo)->AttributesCu |= SPELL_ATTR0_CU_ENCOUNTER_REWARD;
6610 break;
6611 }
6612 default:
6613 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid credit type ({}) for encounter {} ({}), skipped!", creditType, entry, dungeonEncounter->encounterName[0]);
6614 continue;
6615 }
6616
6617 DungeonEncounterList& encounters = _dungeonEncounterStore[MAKE_PAIR32(dungeonEncounter->mapId, dungeonEncounter->difficulty)];
6618 encounters.push_back(new DungeonEncounter(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon));
6619 ++count;
6620 } while (result->NextRow());
6621
6622 LOG_INFO("server.loading", ">> Loaded {} Instance Encounters in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6623 LOG_INFO("server.loading", " ");
6624}
@ CREATURE_FLAG_EXTRA_DUNGEON_BOSS
Definition CreatureData.h:74
DBCStorage< DungeonEncounterEntry > sDungeonEncounterStore(DungeonEncounterfmt)
#define sLFGMgr
Definition LFGMgr.h:658
EncounterCreditType
Definition Map.h:160
@ ENCOUNTER_CREDIT_KILL_CREATURE
Definition Map.h:161
@ ENCOUNTER_CREDIT_CAST_SPELL
Definition Map.h:162
std::list< DungeonEncounter const * > DungeonEncounterList
Definition ObjectMgr.h:714
@ SPELL_ATTR0_CU_ENCOUNTER_REWARD
Definition SpellInfo.h:208
Definition DBCStructure.h:866
Definition ObjectMgr.h:704

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 ( )
6491{
6492 uint32 oldMSTime = getMSTime();
6493
6494 // 0 1 2 4
6495 QueryResult result = WorldDatabase.Query("SELECT map, parent, script, allowMount FROM instance_template");
6496
6497 if (!result)
6498 {
6499 LOG_WARN("server.loading", ">> Loaded 0 instance templates. DB table `instance_template` is empty!");
6500 LOG_INFO("server.loading", " ");
6501 return;
6502 }
6503
6504 uint32 count = 0;
6505 do
6506 {
6507 Field* fields = result->Fetch();
6508
6509 uint16 mapID = fields[0].Get<uint16>();
6510
6511 if (!MapMgr::IsValidMAP(mapID, true))
6512 {
6513 LOG_ERROR("sql.sql", "ObjectMgr::LoadInstanceTemplate: bad mapid {} for template!", mapID);
6514 continue;
6515 }
6516
6517 InstanceTemplate instanceTemplate;
6518
6519 instanceTemplate.AllowMount = fields[3].Get<bool>();
6520 instanceTemplate.Parent = uint32(fields[1].Get<uint16>());
6521 instanceTemplate.ScriptId = GetScriptId(fields[2].Get<std::string>());
6522
6523 _instanceTemplateStore[mapID] = instanceTemplate;
6524
6525 ++count;
6526 } while (result->NextRow());
6527
6528 LOG_INFO("server.loading", ">> Loaded {} Instance Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6529 LOG_INFO("server.loading", " ");
6530}
static bool IsValidMAP(uint32 mapid, bool startUp)
Definition MapMgr.cpp:311
bool AllowMount
Definition Map.h:127
uint32 ScriptId
Definition Map.h:126

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

◆ LoadItemLocales()

void ObjectMgr::LoadItemLocales ( )
3201{
3202 uint32 oldMSTime = getMSTime();
3203
3204 _itemLocaleStore.clear(); // need for reload case
3205
3206 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name, Description FROM item_template_locale");
3207 if (!result)
3208 return;
3209
3210 do
3211 {
3212 Field* fields = result->Fetch();
3213
3214 uint32 ID = fields[0].Get<uint32>();
3215
3216 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
3217 if (locale == LOCALE_enUS)
3218 continue;
3219
3220 ItemLocale& data = _itemLocaleStore[ID];
3221 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
3222 AddLocaleString(fields[3].Get<std::string>(), locale, data.Description);
3223 } while (result->NextRow());
3224
3225 LOG_INFO("server.loading", ">> Loaded {} Item Locale Strings in {} ms", (uint32)_itemLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
3226}
Definition ItemTemplate.h:834
std::vector< std::string > Description
Definition ItemTemplate.h:836
std::vector< std::string > Name
Definition ItemTemplate.h:835

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

◆ LoadItemSetNameLocales()

void ObjectMgr::LoadItemSetNameLocales ( )
3877{
3878 uint32 oldMSTime = getMSTime();
3879
3880 _itemSetNameLocaleStore.clear(); // need for reload case
3881
3882 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name FROM item_set_names_locale");
3883
3884 if (!result)
3885 return;
3886
3887 do
3888 {
3889 Field* fields = result->Fetch();
3890
3891 uint32 ID = fields[0].Get<uint32>();
3892
3893 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
3894 if (locale == LOCALE_enUS)
3895 continue;
3896
3898 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
3899 } while (result->NextRow());
3900
3901 LOG_INFO("server.loading", ">> Loaded {} Item Set Name Locale Strings in {} ms", uint32(_itemSetNameLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
3902}
Definition ItemTemplate.h:846
std::vector< std::string > Name
Definition ItemTemplate.h:847

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

◆ LoadItemSetNames()

void ObjectMgr::LoadItemSetNames ( )
3905{
3906 uint32 oldMSTime = getMSTime();
3907
3908 _itemSetNameStore.clear(); // needed for reload case
3909
3910 std::set<uint32> itemSetItems;
3911
3912 // fill item set member ids
3913 for (uint32 entryId = 0; entryId < sItemSetStore.GetNumRows(); ++entryId)
3914 {
3915 ItemSetEntry const* setEntry = sItemSetStore.LookupEntry(entryId);
3916 if (!setEntry)
3917 continue;
3918
3919 for (uint32 i = 0; i < MAX_ITEM_SET_ITEMS; ++i)
3920 if (setEntry->itemId[i])
3921 itemSetItems.insert(setEntry->itemId[i]);
3922 }
3923
3924 // 0 1 2
3925 QueryResult result = WorldDatabase.Query("SELECT `entry`, `name`, `InventoryType` FROM `item_set_names`");
3926
3927 if (!result)
3928 {
3929 LOG_WARN("server.loading", ">> Loaded 0 item set names. DB table `item_set_names` is empty.");
3930 LOG_INFO("server.loading", " ");
3931 return;
3932 }
3933
3934 _itemSetNameStore.rehash(result->GetRowCount());
3935 uint32 count = 0;
3936
3937 do
3938 {
3939 Field* fields = result->Fetch();
3940
3941 uint32 entry = fields[0].Get<uint32>();
3942 if (itemSetItems.find(entry) == itemSetItems.end())
3943 {
3944 LOG_ERROR("sql.sql", "Item set name (Entry: {}) not found in ItemSet.dbc, data useless.", entry);
3945 continue;
3946 }
3947
3948 ItemSetNameEntry& data = _itemSetNameStore[entry];
3949 data.name = fields[1].Get<std::string>();
3950
3951 uint32 invType = fields[2].Get<uint8>();
3952 if (invType >= MAX_INVTYPE)
3953 {
3954 LOG_ERROR("sql.sql", "Item set name (Entry: {}) has wrong InventoryType value ({})", entry, invType);
3955 invType = INVTYPE_NON_EQUIP;
3956 }
3957
3958 data.InventoryType = invType;
3959 itemSetItems.erase(entry);
3960 ++count;
3961 } while (result->NextRow());
3962
3963 if (!itemSetItems.empty())
3964 {
3965 ItemTemplate const* pProto;
3966 for (std::set<uint32>::iterator itr = itemSetItems.begin(); itr != itemSetItems.end(); ++itr)
3967 {
3968 uint32 entry = *itr;
3969 // add data from item_template if available
3970 pProto = GetItemTemplate(entry);
3971 if (pProto)
3972 {
3973 LOG_ERROR("sql.sql", "Item set part (Entry: {}) does not have entry in `item_set_names`, adding data from `item_template`.", entry);
3974 ItemSetNameEntry& data = _itemSetNameStore[entry];
3975 data.name = pProto->Name1;
3976 data.InventoryType = pProto->InventoryType;
3977 ++count;
3978 }
3979 else
3980 LOG_ERROR("sql.sql", "Item set part (Entry: {}) does not have entry in `item_set_names`, set will not display properly.", entry);
3981 }
3982 }
3983
3984 LOG_INFO("server.loading", ">> Loaded {} Item Set Names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3985 LOG_INFO("server.loading", " ");
3986}
DBCStorage< ItemSetEntry > sItemSetStore(ItemSetEntryfmt)
#define MAX_ITEM_SET_ITEMS
Definition DBCStructure.h:1228
@ INVTYPE_NON_EQUIP
Definition ItemTemplate.h:256
#define MAX_INVTYPE
Definition ItemTemplate.h:287
Definition DBCStructure.h:1232
uint32 itemId[MAX_ITEM_SET_ITEMS]
Definition DBCStructure.h:1236
Definition ItemTemplate.h:840
uint32 InventoryType
Definition ItemTemplate.h:842
std::string name
Definition ItemTemplate.h:841
std::string Name1
Definition ItemTemplate.h:624
uint32 InventoryType
Definition ItemTemplate.h:632

References _itemSetNameStore, Field::Get(), GetItemTemplate(), 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, and WorldDatabase.

◆ LoadItemTemplates()

void ObjectMgr::LoadItemTemplates ( )
3253{
3254 uint32 oldMSTime = getMSTime();
3255
3256 // 0 1 2 3 4 5 6 7 8 9 10 11 12
3257 QueryResult result = WorldDatabase.Query("SELECT entry, class, subclass, SoundOverrideSubclass, name, displayid, Quality, Flags, FlagsExtra, BuyCount, BuyPrice, SellPrice, InventoryType, "
3258 // 13 14 15 16 17 18 19 20
3259 "AllowableClass, AllowableRace, ItemLevel, RequiredLevel, RequiredSkill, RequiredSkillRank, requiredspell, requiredhonorrank, "
3260 // 21 22 23 24 25 26 27
3261 "RequiredCityRank, RequiredReputationFaction, RequiredReputationRank, maxcount, stackable, ContainerSlots, stat_type1, "
3262 // 28 29 30 31 32 33 34 35 36 37
3263 "stat_value1, stat_type2, stat_value2, stat_type3, stat_value3, stat_type4, stat_value4, stat_type5, stat_value5, stat_type6, "
3264 // 38 39 40 41 42 43 44 45 46
3265 "stat_value6, stat_type7, stat_value7, stat_type8, stat_value8, stat_type9, stat_value9, stat_type10, stat_value10, "
3266 // 47 48 49 50 51 52 53 54 55 56 57
3267 "ScalingStatDistribution, ScalingStatValue, dmg_min1, dmg_max1, dmg_type1, dmg_min2, dmg_max2, dmg_type2, armor, holy_res, fire_res, "
3268 // 58 59 60 61 62 63 64 65 66 67
3269 "nature_res, frost_res, shadow_res, arcane_res, delay, ammo_type, RangedModRange, spellid_1, spelltrigger_1, spellcharges_1, "
3270 // 68 69 70 71 72 73 74
3271 "spellppmRate_1, spellcooldown_1, spellcategory_1, spellcategorycooldown_1, spellid_2, spelltrigger_2, spellcharges_2, "
3272 // 75 76 77 78 79 80 81
3273 "spellppmRate_2, spellcooldown_2, spellcategory_2, spellcategorycooldown_2, spellid_3, spelltrigger_3, spellcharges_3, "
3274 // 82 83 84 85 86 87 88
3275 "spellppmRate_3, spellcooldown_3, spellcategory_3, spellcategorycooldown_3, spellid_4, spelltrigger_4, spellcharges_4, "
3276 // 89 90 91 92 93 94 95
3277 "spellppmRate_4, spellcooldown_4, spellcategory_4, spellcategorycooldown_4, spellid_5, spelltrigger_5, spellcharges_5, "
3278 // 96 97 98 99 100 101 102 103 104
3279 "spellppmRate_5, spellcooldown_5, spellcategory_5, spellcategorycooldown_5, bonding, description, PageText, LanguageID, PageMaterial, "
3280 // 105 106 107 108 109 110 111 112 113 114 115 116
3281 "startquest, lockid, Material, sheath, RandomProperty, RandomSuffix, block, itemset, MaxDurability, area, Map, BagFamily, "
3282 // 117 118 119 120 121 122 123 124
3283 "TotemCategory, socketColor_1, socketContent_1, socketColor_2, socketContent_2, socketColor_3, socketContent_3, socketBonus, "
3284 // 125 126 127 128 129 130 131 132
3285 "GemProperties, RequiredDisenchantSkill, ArmorDamageModifier, duration, ItemLimitCategory, HolidayId, ScriptName, DisenchantID, "
3286 // 133 134 135 136
3287 "FoodType, minMoneyLoot, maxMoneyLoot, flagsCustom FROM item_template");
3288
3289 if (!result)
3290 {
3291 LOG_WARN("server.loading", ">> Loaded 0 item templates. DB table `item_template` is empty.");
3292 LOG_INFO("server.loading", " ");
3293 return;
3294 }
3295
3296 _itemTemplateStore.reserve(result->GetRowCount());
3297 uint32 count = 0;
3298 // original inspiration https://github.com/TrinityCore/TrinityCore/commit/0c44bd33ee7b42c924859139a9f4b04cf2b91261
3299 bool enforceDBCAttributes = sWorld->getBoolConfig(CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES);
3300
3301 do
3302 {
3303 Field* fields = result->Fetch();
3304
3305 uint32 entry = fields[0].Get<uint32>();
3306
3307 ItemTemplate& itemTemplate = _itemTemplateStore[entry];
3308
3309 itemTemplate.ItemId = entry;
3310 itemTemplate.Class = uint32(fields[1].Get<uint8>());
3311 itemTemplate.SubClass = uint32(fields[2].Get<uint8>());
3312 itemTemplate.SoundOverrideSubclass = int32(fields[3].Get<int8>());
3313 itemTemplate.Name1 = fields[4].Get<std::string>();
3314 itemTemplate.DisplayInfoID = fields[5].Get<uint32>();
3315 itemTemplate.Quality = uint32(fields[6].Get<uint8>());
3316 itemTemplate.Flags = ItemFlags(fields[7].Get<uint32>());
3317 itemTemplate.Flags2 = ItemFlags2(fields[8].Get<uint32>());
3318 itemTemplate.BuyCount = uint32(fields[9].Get<uint8>());
3319 itemTemplate.BuyPrice = int32(fields[10].Get<int64>());
3320 itemTemplate.SellPrice = uint32(fields[11].Get<uint32>());
3321 itemTemplate.InventoryType = uint32(fields[12].Get<uint8>());
3322 itemTemplate.AllowableClass = fields[13].Get<int32>();
3323 itemTemplate.AllowableRace = fields[14].Get<int32>();
3324 itemTemplate.ItemLevel = uint32(fields[15].Get<uint16>());
3325 itemTemplate.RequiredLevel = uint32(fields[16].Get<uint8>());
3326 itemTemplate.RequiredSkill = uint32(fields[17].Get<uint16>());
3327 itemTemplate.RequiredSkillRank = uint32(fields[18].Get<uint16>());
3328 itemTemplate.RequiredSpell = fields[19].Get<uint32>();
3329 itemTemplate.RequiredHonorRank = fields[20].Get<uint32>();
3330 itemTemplate.RequiredCityRank = fields[21].Get<uint32>();
3331 itemTemplate.RequiredReputationFaction = uint32(fields[22].Get<uint16>());
3332 itemTemplate.RequiredReputationRank = uint32(fields[23].Get<uint16>());
3333 itemTemplate.MaxCount = fields[24].Get<int32>();
3334 itemTemplate.Stackable = fields[25].Get<int32>();
3335 itemTemplate.ContainerSlots = uint32(fields[26].Get<uint8>());
3336
3337 uint8 statsCount = 0;
3338 uint8 statsIterator = 0;
3339 while (statsIterator < MAX_ITEM_PROTO_STATS)
3340 {
3341 uint32 statType = uint32(fields[27 + statsIterator * 2].Get<uint8>());
3342 int32 statValue = fields[28 + statsIterator * 2].Get<int32>();
3343 statsIterator++;
3344 if (statValue == 0)
3345 continue;
3346
3347 itemTemplate.ItemStat[statsCount].ItemStatType = statType;
3348 itemTemplate.ItemStat[statsCount].ItemStatValue = statValue;
3349 statsCount++;
3350 }
3351 itemTemplate.StatsCount = statsCount;
3352
3353 itemTemplate.ScalingStatDistribution = uint32(fields[47].Get<uint16>());
3354 itemTemplate.ScalingStatValue = fields[48].Get<int32>();
3355
3356 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
3357 {
3358 itemTemplate.Damage[i].DamageMin = fields[49 + i * 3].Get<float>();
3359 itemTemplate.Damage[i].DamageMax = fields[50 + i * 3].Get<float>();
3360 itemTemplate.Damage[i].DamageType = uint32(fields[51 + i * 3].Get<uint8>());
3361 }
3362
3363 itemTemplate.Armor = fields[55].Get<uint32>();
3364 itemTemplate.HolyRes = fields[56].Get<int32>();
3365 itemTemplate.FireRes = fields[57].Get<int32>();
3366 itemTemplate.NatureRes = fields[58].Get<int32>();
3367 itemTemplate.FrostRes = fields[59].Get<int32>();
3368 itemTemplate.ShadowRes = fields[60].Get<int32>();
3369 itemTemplate.ArcaneRes = fields[61].Get<int32>();
3370 itemTemplate.Delay = uint32(fields[62].Get<uint16>());
3371 itemTemplate.AmmoType = uint32(fields[63].Get<uint8>());
3372 itemTemplate.RangedModRange = fields[64].Get<float>();
3373
3374 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
3375 {
3376 itemTemplate.Spells[i].SpellId = fields[65 + i * 7 ].Get<int32>();
3377 itemTemplate.Spells[i].SpellTrigger = uint32(fields[66 + i * 7].Get<uint8>());
3378 itemTemplate.Spells[i].SpellCharges = int32(fields[67 + i * 7].Get<int16>());
3379 itemTemplate.Spells[i].SpellPPMRate = fields[68 + i * 7].Get<float>();
3380 itemTemplate.Spells[i].SpellCooldown = fields[69 + i * 7].Get<int32>();
3381 itemTemplate.Spells[i].SpellCategory = uint32(fields[70 + i * 7].Get<uint16>());
3382 itemTemplate.Spells[i].SpellCategoryCooldown = fields[71 + i * 7].Get<int32>();
3383 }
3384
3385 itemTemplate.Bonding = uint32(fields[100].Get<uint8>());
3386 itemTemplate.Description = fields[101].Get<std::string>();
3387 itemTemplate.PageText = fields[102].Get<uint32>();
3388 itemTemplate.LanguageID = uint32(fields[103].Get<uint8>());
3389 itemTemplate.PageMaterial = uint32(fields[104].Get<uint8>());
3390 itemTemplate.StartQuest = fields[105].Get<uint32>();
3391 itemTemplate.LockID = fields[106].Get<uint32>();
3392 itemTemplate.Material = int32(fields[107].Get<int8>());
3393 itemTemplate.Sheath = uint32(fields[108].Get<uint8>());
3394 itemTemplate.RandomProperty = fields[109].Get<int32>();
3395 itemTemplate.RandomSuffix = fields[110].Get<int32>();
3396 itemTemplate.Block = fields[111].Get<uint32>();
3397 itemTemplate.ItemSet = fields[112].Get<uint32>();
3398 itemTemplate.MaxDurability = uint32(fields[113].Get<uint16>());
3399 itemTemplate.Area = fields[114].Get<uint32>();
3400 itemTemplate.Map = uint32(fields[115].Get<uint16>());
3401 itemTemplate.BagFamily = fields[116].Get<uint32>();
3402 itemTemplate.TotemCategory = fields[117].Get<uint32>();
3403
3404 for (uint8 i = 0; i < MAX_ITEM_PROTO_SOCKETS; ++i)
3405 {
3406 itemTemplate.Socket[i].Color = uint32(fields[118 + i * 2].Get<uint8>());
3407 itemTemplate.Socket[i].Content = fields[119 + i * 2].Get<uint32>();
3408 }
3409
3410 itemTemplate.socketBonus = fields[124].Get<uint32>();
3411 itemTemplate.GemProperties = fields[125].Get<uint32>();
3412 itemTemplate.RequiredDisenchantSkill = uint32(fields[126].Get<int16>());
3413 itemTemplate.ArmorDamageModifier = fields[127].Get<float>();
3414 itemTemplate.Duration = fields[128].Get<uint32>();
3415 itemTemplate.ItemLimitCategory = uint32(fields[129].Get<int16>());
3416 itemTemplate.HolidayId = fields[130].Get<uint32>();
3417 itemTemplate.ScriptId = GetScriptId(fields[131].Get<std::string>());
3418 itemTemplate.DisenchantID = fields[132].Get<uint32>();
3419 itemTemplate.FoodType = uint32(fields[133].Get<uint8>());
3420 itemTemplate.MinMoneyLoot = fields[134].Get<uint32>();
3421 itemTemplate.MaxMoneyLoot = fields[135].Get<uint32>();
3422 itemTemplate.FlagsCu = ItemFlagsCustom(fields[136].Get<uint32>());
3423
3424 // Checks
3425 ItemEntry const* dbcitem = sItemStore.LookupEntry(entry);
3426
3427 if (!dbcitem)
3428 {
3429 LOG_DEBUG("sql.sql", "Item (Entry: {}) does not exist in item.dbc! (not correct id?).", entry);
3430 continue;
3431 }
3432
3433 if (enforceDBCAttributes)
3434 {
3435 if (itemTemplate.Class != dbcitem->ClassID)
3436 {
3437 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Class value ({}), must be ({}).", entry, itemTemplate.Class, dbcitem->ClassID);
3438 itemTemplate.Class = dbcitem->ClassID;
3439 }
3440 if (itemTemplate.SubClass != dbcitem->SubclassID)
3441 {
3442 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Subclass value ({}) for class {}, must be ({}).", entry, itemTemplate.SubClass, itemTemplate.Class, dbcitem->SubclassID);
3443 itemTemplate.SubClass = dbcitem->SubclassID;
3444 }
3445 if (itemTemplate.SoundOverrideSubclass != dbcitem->SoundOverrideSubclassID)
3446 {
3447 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct SoundOverrideSubclass ({}), must be {}.", entry, itemTemplate.SoundOverrideSubclass, dbcitem->SoundOverrideSubclassID);
3448 itemTemplate.SoundOverrideSubclass = dbcitem->SoundOverrideSubclassID;
3449 }
3450 if (itemTemplate.Material != dbcitem->Material)
3451 {
3452 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct material ({}), must be {}.", entry, itemTemplate.Material, dbcitem->Material);
3453 itemTemplate.Material = dbcitem->Material;
3454 }
3455 if (itemTemplate.InventoryType != dbcitem->InventoryType)
3456 {
3457 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong InventoryType value ({}), must be {}.", entry, itemTemplate.InventoryType, dbcitem->InventoryType);
3458 itemTemplate.InventoryType = dbcitem->InventoryType;
3459 }
3460 if (itemTemplate.DisplayInfoID != dbcitem->DisplayInfoID)
3461 {
3462 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct display id ({}), must be {}.", entry, itemTemplate.DisplayInfoID, dbcitem->DisplayInfoID);
3463 itemTemplate.DisplayInfoID = dbcitem->DisplayInfoID;
3464 }
3465 if (itemTemplate.Sheath != dbcitem->SheatheType)
3466 {
3467 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Sheath ({}), must be {}.", entry, itemTemplate.Sheath, dbcitem->SheatheType);
3468 itemTemplate.Sheath = dbcitem->SheatheType;
3469 }
3470 }
3471
3472 if (itemTemplate.Quality >= MAX_ITEM_QUALITY)
3473 {
3474 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Quality value ({})", entry, itemTemplate.Quality);
3475 itemTemplate.Quality = ITEM_QUALITY_NORMAL;
3476 }
3477
3478 if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_HORDE))
3479 {
3480 if (FactionEntry const* faction = sFactionStore.LookupEntry(HORDE))
3481 if ((itemTemplate.AllowableRace & faction->BaseRepRaceMask[0]) == 0)
3482 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.",
3483 entry, itemTemplate.AllowableRace, ITEM_FLAG2_FACTION_HORDE);
3484
3485 if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE))
3486 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.",
3488 }
3489 else if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE))
3490 {
3491 if (FactionEntry const* faction = sFactionStore.LookupEntry(ALLIANCE))
3492 if ((itemTemplate.AllowableRace & faction->BaseRepRaceMask[0]) == 0)
3493 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.",
3494 entry, itemTemplate.AllowableRace, ITEM_FLAG2_FACTION_ALLIANCE);
3495 }
3496
3497 if (itemTemplate.BuyCount <= 0)
3498 {
3499 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong BuyCount value ({}), set to default(1).", entry, itemTemplate.BuyCount);
3500 itemTemplate.BuyCount = 1;
3501 }
3502
3503 if (itemTemplate.RequiredSkill >= MAX_SKILL_TYPE)
3504 {
3505 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong RequiredSkill value ({})", entry, itemTemplate.RequiredSkill);
3506 itemTemplate.RequiredSkill = 0;
3507 }
3508
3509 {
3510 // can be used in equip slot, as page read use in inventory, or spell casting at use
3511 bool req = itemTemplate.InventoryType != INVTYPE_NON_EQUIP || itemTemplate.PageText;
3512 if (!req)
3513 for (uint8 j = 0; j < MAX_ITEM_PROTO_SPELLS; ++j)
3514 {
3515 if (itemTemplate.Spells[j].SpellId)
3516 {
3517 req = true;
3518 break;
3519 }
3520 }
3521
3522 if (req)
3523 {
3524 if (!(itemTemplate.AllowableClass & CLASSMASK_ALL_PLAYABLE))
3525 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have any playable classes ({}) in `AllowableClass` and can't be equipped or used.", entry, itemTemplate.AllowableClass);
3526
3527 if (!(itemTemplate.AllowableRace & sRaceMgr->GetPlayableRaceMask()))
3528 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have any playable races ({}) in `AllowableRace` and can't be equipped or used.", entry, itemTemplate.AllowableRace);
3529 }
3530 }
3531
3532 if (itemTemplate.RequiredSpell && !sSpellMgr->GetSpellInfo(itemTemplate.RequiredSpell))
3533 {
3534 LOG_ERROR("sql.sql", "Item (Entry: {}) has a wrong (non-existing) spell in RequiredSpell ({})", entry, itemTemplate.RequiredSpell);
3535 itemTemplate.RequiredSpell = 0;
3536 }
3537
3538 if (itemTemplate.RequiredReputationRank >= MAX_REPUTATION_RANK)
3539 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong reputation rank in RequiredReputationRank ({}), item can't be used.", entry, itemTemplate.RequiredReputationRank);
3540
3541 if (itemTemplate.RequiredReputationFaction)
3542 {
3543 if (!sFactionStore.LookupEntry(itemTemplate.RequiredReputationFaction))
3544 {
3545 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (not existing) faction in RequiredReputationFaction ({})", entry, itemTemplate.RequiredReputationFaction);
3546 itemTemplate.RequiredReputationFaction = 0;
3547 }
3548
3549 if (itemTemplate.RequiredReputationRank == MIN_REPUTATION_RANK)
3550 LOG_ERROR("sql.sql", "Item (Entry: {}) has min. reputation rank in RequiredReputationRank (0) but RequiredReputationFaction > 0, faction setting is useless.", entry);
3551 }
3552
3553 if (itemTemplate.MaxCount < -1)
3554 {
3555 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large negative in maxcount ({}), replace by value (-1) no storing limits.", entry, itemTemplate.MaxCount);
3556 itemTemplate.MaxCount = -1;
3557 }
3558
3559 if (itemTemplate.Stackable == 0)
3560 {
3561 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong value in stackable ({}), replace by default 1.", entry, itemTemplate.Stackable);
3562 itemTemplate.Stackable = 1;
3563 }
3564 else if (itemTemplate.Stackable < -1)
3565 {
3566 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large negative in stackable ({}), replace by value (-1) no stacking limits.", entry, itemTemplate.Stackable);
3567 itemTemplate.Stackable = -1;
3568 }
3569
3570 if (itemTemplate.ContainerSlots > MAX_BAG_SIZE)
3571 {
3572 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large value in ContainerSlots ({}), replace by hardcoded limit ({}).", entry, itemTemplate.ContainerSlots, MAX_BAG_SIZE);
3573 itemTemplate.ContainerSlots = MAX_BAG_SIZE;
3574 }
3575
3576 for (uint8 j = 0; j < itemTemplate.StatsCount; ++j)
3577 {
3578 // for ItemStatValue != 0
3579 if (itemTemplate.ItemStat[j].ItemStatValue && itemTemplate.ItemStat[j].ItemStatType >= MAX_ITEM_MOD)
3580 {
3581 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (non-existing?) stat_type{} ({})", entry, j + 1, itemTemplate.ItemStat[j].ItemStatType);
3582 itemTemplate.ItemStat[j].ItemStatType = 0;
3583 }
3584
3585 switch (itemTemplate.ItemStat[j].ItemStatType)
3586 {
3589 // Skip warning for specific items: 13113 (Feathermoon Headdress - Blizzard oversight), 34967 (test item)
3590 if (entry != 13113 && entry != 34967)
3591 LOG_WARN("sql.sql", "Item (Entry: {}) has deprecated stat_type{} ({})", entry, j + 1, itemTemplate.ItemStat[j].ItemStatType);
3592
3593 break;
3594 default:
3595 break;
3596 }
3597 }
3598
3599 for (uint8 j = 0; j < MAX_ITEM_PROTO_DAMAGES; ++j)
3600 {
3601 if (itemTemplate.Damage[j].DamageType >= MAX_SPELL_SCHOOL)
3602 {
3603 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong dmg_type{} ({})", entry, j + 1, itemTemplate.Damage[j].DamageType);
3604 itemTemplate.Damage[j].DamageType = 0;
3605 }
3606 }
3607
3608 // special format
3609 if ((itemTemplate.Spells[0].SpellId == 483) || (itemTemplate.Spells[0].SpellId == 55884))
3610 {
3611 // spell_1
3612 if (itemTemplate.Spells[0].SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
3613 {
3614 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);
3615 itemTemplate.Spells[0].SpellId = 0;
3616 itemTemplate.Spells[0].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3617 itemTemplate.Spells[1].SpellId = 0;
3618 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3619 }
3620
3621 // spell_2 have learning spell
3622 if (itemTemplate.Spells[1].SpellTrigger != ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
3623 {
3624 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);
3625 itemTemplate.Spells[0].SpellId = 0;
3626 itemTemplate.Spells[1].SpellId = 0;
3627 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3628 }
3629 else if (!itemTemplate.Spells[1].SpellId)
3630 {
3631 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have an expected spell in spellid_{} in special learning format.", entry, 1 + 1);
3632 itemTemplate.Spells[0].SpellId = 0;
3633 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3634 }
3635 else if (itemTemplate.Spells[1].SpellId != -1)
3636 {
3637 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemTemplate.Spells[1].SpellId);
3638 if (!spellInfo && !sDisableMgr->IsDisabledFor(DISABLE_TYPE_SPELL, itemTemplate.Spells[1].SpellId, nullptr))
3639 {
3640 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (not existing) spell in spellid_{} ({})", entry, 1 + 1, itemTemplate.Spells[1].SpellId);
3641 itemTemplate.Spells[0].SpellId = 0;
3642 itemTemplate.Spells[1].SpellId = 0;
3643 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3644 }
3645 // allowed only in special format
3646 else if ((itemTemplate.Spells[1].SpellId == 483) || (itemTemplate.Spells[1].SpellId == 55884))
3647 {
3648 LOG_ERROR("sql.sql", "Item (Entry: {}) has broken spell in spellid_{} ({})", entry, 1 + 1, itemTemplate.Spells[1].SpellId);
3649 itemTemplate.Spells[0].SpellId = 0;
3650 itemTemplate.Spells[1].SpellId = 0;
3651 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3652 }
3653 }
3654
3655 // spell_3*, spell_4*, spell_5* is empty
3656 for (uint8 j = 2; j < MAX_ITEM_PROTO_SPELLS; ++j)
3657 {
3658 if (itemTemplate.Spells[j].SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
3659 {
3660 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong item spell trigger value in spelltrigger_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellTrigger);
3661 itemTemplate.Spells[j].SpellId = 0;
3662 itemTemplate.Spells[j].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3663 }
3664 else if (itemTemplate.Spells[j].SpellId != 0)
3665 {
3666 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong spell in spellid_{} ({}) for learning special format", entry, j + 1, itemTemplate.Spells[j].SpellId);
3667 itemTemplate.Spells[j].SpellId = 0;
3668 }
3669 }
3670 }
3671 // normal spell list
3672 else
3673 {
3674 for (uint8 j = 0; j < MAX_ITEM_PROTO_SPELLS; ++j)
3675 {
3676 if (itemTemplate.Spells[j].SpellTrigger >= MAX_ITEM_SPELLTRIGGER || itemTemplate.Spells[j].SpellTrigger == ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
3677 {
3678 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong item spell trigger value in spelltrigger_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellTrigger);
3679 itemTemplate.Spells[j].SpellId = 0;
3680 itemTemplate.Spells[j].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3681 }
3682
3683 if (itemTemplate.Spells[j].SpellId && itemTemplate.Spells[j].SpellId != -1)
3684 {
3685 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemTemplate.Spells[j].SpellId);
3686 if (!spellInfo && !sDisableMgr->IsDisabledFor(DISABLE_TYPE_SPELL, itemTemplate.Spells[j].SpellId, nullptr))
3687 {
3688 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (not existing) spell in spellid_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellId);
3689 itemTemplate.Spells[j].SpellId = 0;
3690 }
3691 // allowed only in special format
3692 else if ((itemTemplate.Spells[j].SpellId == 483) || (itemTemplate.Spells[j].SpellId == 55884))
3693 {
3694 LOG_ERROR("sql.sql", "Item (Entry: {}) has broken spell in spellid_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellId);
3695 itemTemplate.Spells[j].SpellId = 0;
3696 }
3697 }
3698 }
3699 }
3700
3701 if (itemTemplate.Bonding >= MAX_BIND_TYPE)
3702 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Bonding value ({})", entry, itemTemplate.Bonding);
3703
3704 if (itemTemplate.PageText && !GetPageText(itemTemplate.PageText))
3705 LOG_ERROR("sql.sql", "Item (Entry: {}) has non existing first page (Id:{})", entry, itemTemplate.PageText);
3706
3707 if (itemTemplate.LockID && !sLockStore.LookupEntry(itemTemplate.LockID))
3708 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong LockID ({})", entry, itemTemplate.LockID);
3709
3710 if (itemTemplate.RandomProperty)
3711 {
3712 // To be implemented later
3713 if (itemTemplate.RandomProperty == -1)
3714 itemTemplate.RandomProperty = 0;
3715
3716 else if (!sItemRandomPropertiesStore.LookupEntry(GetItemEnchantMod(itemTemplate.RandomProperty)))
3717 {
3718 LOG_ERROR("sql.sql", "Item (Entry: {}) has unknown (wrong or not listed in `item_enchantment_template`) RandomProperty ({})", entry, itemTemplate.RandomProperty);
3719 itemTemplate.RandomProperty = 0;
3720 }
3721 }
3722
3723 if (itemTemplate.RandomSuffix && !sItemRandomSuffixStore.LookupEntry(GetItemEnchantMod(itemTemplate.RandomSuffix)))
3724 {
3725 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong RandomSuffix ({})", entry, itemTemplate.RandomSuffix);
3726 itemTemplate.RandomSuffix = 0;
3727 }
3728
3729 if (itemTemplate.ItemSet && !sItemSetStore.LookupEntry(itemTemplate.ItemSet))
3730 {
3731 LOG_ERROR("sql.sql", "Item (Entry: {}) have wrong ItemSet ({})", entry, itemTemplate.ItemSet);
3732 itemTemplate.ItemSet = 0;
3733 }
3734
3735 if (itemTemplate.Area && !sAreaTableStore.LookupEntry(itemTemplate.Area))
3736 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Area ({})", entry, itemTemplate.Area);
3737
3738 if (itemTemplate.Map && !sMapStore.LookupEntry(itemTemplate.Map))
3739 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Map ({})", entry, itemTemplate.Map);
3740
3741 if (itemTemplate.BagFamily)
3742 {
3743 // check bits
3744 for (uint32 j = 0; j < sizeof(itemTemplate.BagFamily) * 8; ++j)
3745 {
3746 uint32 mask = 1 << j;
3747 if ((itemTemplate.BagFamily & mask) == 0)
3748 continue;
3749
3750 ItemBagFamilyEntry const* bf = sItemBagFamilyStore.LookupEntry(j + 1);
3751 if (!bf)
3752 {
3753 LOG_ERROR("sql.sql", "Item (Entry: {}) has bag family bit set not listed in ItemBagFamily.dbc, remove bit", entry);
3754 itemTemplate.BagFamily &= ~mask;
3755 continue;
3756 }
3757
3759 {
3760 CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(itemTemplate.ItemId);
3761 if (!ctEntry)
3762 {
3763 LOG_ERROR("sql.sql", "Item (Entry: {}) has currency bag family bit set in BagFamily but not listed in CurrencyTypes.dbc, remove bit", entry);
3764 itemTemplate.BagFamily &= ~mask;
3765 }
3766 }
3767 }
3768 }
3769
3770 if (itemTemplate.TotemCategory && !sTotemCategoryStore.LookupEntry(itemTemplate.TotemCategory))
3771 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong TotemCategory ({})", entry, itemTemplate.TotemCategory);
3772
3773 for (uint8 j = 0; j < MAX_ITEM_PROTO_SOCKETS; ++j)
3774 {
3775 if (itemTemplate.Socket[j].Color && (itemTemplate.Socket[j].Color & SOCKET_COLOR_ALL) != itemTemplate.Socket[j].Color)
3776 {
3777 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong socketColor_{} ({})", entry, j + 1, itemTemplate.Socket[j].Color);
3778 itemTemplate.Socket[j].Color = 0;
3779 }
3780 }
3781
3782 if (itemTemplate.GemProperties && !sGemPropertiesStore.LookupEntry(itemTemplate.GemProperties))
3783 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong GemProperties ({})", entry, itemTemplate.GemProperties);
3784
3785 if (itemTemplate.FoodType >= MAX_PET_DIET)
3786 {
3787 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong FoodType value ({})", entry, itemTemplate.FoodType);
3788 itemTemplate.FoodType = 0;
3789 }
3790
3791 if (itemTemplate.ItemLimitCategory && !sItemLimitCategoryStore.LookupEntry(itemTemplate.ItemLimitCategory))
3792 {
3793 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong LimitCategory value ({})", entry, itemTemplate.ItemLimitCategory);
3794 itemTemplate.ItemLimitCategory = 0;
3795 }
3796
3797 if (itemTemplate.HolidayId && !sHolidaysStore.LookupEntry(itemTemplate.HolidayId))
3798 {
3799 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong HolidayId value ({})", entry, itemTemplate.HolidayId);
3800 itemTemplate.HolidayId = 0;
3801 }
3802
3803 if (itemTemplate.HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME) && !itemTemplate.Duration)
3804 {
3805 LOG_ERROR("sql.sql", "Item (Entry {}) has flag ITEM_FLAGS_CU_DURATION_REAL_TIME but it does not have duration limit", entry);
3806 itemTemplate.FlagsCu = static_cast<ItemFlagsCustom>(static_cast<uint32>(itemTemplate.FlagsCu) & ~ITEM_FLAGS_CU_DURATION_REAL_TIME);
3807 }
3808
3809 // Set after checks to ensure valid item quality
3810 itemTemplate.BuyPrice *= sWorld->getRate(qualityToBuyValueConfig[itemTemplate.Quality]);
3811 itemTemplate.SellPrice *= sWorld->getRate(qualityToSellValueConfig[itemTemplate.Quality]);
3812
3813 // Fill categories map
3814 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
3815 if (itemTemplate.Spells[i].SpellId && itemTemplate.Spells[i].SpellCategory && itemTemplate.Spells[i].SpellCategoryCooldown)
3816 {
3817 SpellCategoryStore::iterator ct = sSpellsByCategoryStore.find(itemTemplate.Spells[i].SpellCategory);
3818 if (ct != sSpellsByCategoryStore.end())
3819 {
3820 ct->second.emplace(true, itemTemplate.Spells[i].SpellId);
3821 }
3822 else
3823 sSpellsByCategoryStore[itemTemplate.Spells[i].SpellCategory].emplace(true, itemTemplate.Spells[i].SpellId);
3824 }
3825
3826 ++count;
3827 } while (result->NextRow());
3828
3829 // pussywizard:
3830 {
3831 uint32 max = 0;
3832 for (ItemTemplateContainer::const_iterator itr = _itemTemplateStore.begin(); itr != _itemTemplateStore.end(); ++itr)
3833 if (itr->first > max)
3834 max = itr->first;
3835 if (max)
3836 {
3837 _itemTemplateStoreFast.clear();
3838 _itemTemplateStoreFast.resize(max + 1, nullptr);
3839 for (ItemTemplateContainer::iterator itr = _itemTemplateStore.begin(); itr != _itemTemplateStore.end(); ++itr)
3840 _itemTemplateStoreFast[itr->first] = &(itr->second);
3841 }
3842 }
3843
3844 // Check if item templates for DBC referenced character start outfit are present
3845 std::set<uint32> notFoundOutfit;
3846 for (uint32 i = 1; i < sCharStartOutfitStore.GetNumRows(); ++i)
3847 {
3848 CharStartOutfitEntry const* entry = sCharStartOutfitStore.LookupEntry(i);
3849 if (!entry)
3850 continue;
3851
3852 for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j)
3853 {
3854 if (entry->ItemId[j] <= 0)
3855 continue;
3856
3857 uint32 item_id = entry->ItemId[j];
3858
3859 if (!GetItemTemplate(item_id))
3860 notFoundOutfit.insert(item_id);
3861 }
3862 }
3863
3864 for (std::set<uint32>::const_iterator itr = notFoundOutfit.begin(); itr != notFoundOutfit.end(); ++itr)
3865 LOG_ERROR("sql.sql", "Item (Entry: {}) does not exist in `item_template` but is referenced in `CharStartOutfit.dbc`", *itr);
3866
3867 LOG_INFO("server.loading", ">> Loaded {} Item Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3868 LOG_INFO("server.loading", " ");
3869}
#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)
#define MAX_OUTFIT_ITEMS
Definition DBCStructure.h:617
#define sDisableMgr
Definition DisableMgr.h:88
@ DISABLE_TYPE_SPELL
Definition DisableMgr.h:28
uint32 GetItemEnchantMod(int32 entry)
Definition ItemEnchantmentMgr.cpp:84
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
@ ITEM_MOD_SPELL_DAMAGE_DONE
Definition ItemTemplate.h:64
#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
ServerConfigs const qualityToSellValueConfig[MAX_ITEM_QUALITY]
Definition ObjectMgr.cpp:3240
ServerConfigs const qualityToBuyValueConfig[MAX_ITEM_QUALITY]
Definition ObjectMgr.cpp:3228
#define MAX_REPUTATION_RANK
Definition SharedDefines.h:233
#define MIN_REPUTATION_RANK
Definition SharedDefines.h:232
#define MAX_PET_DIET
Definition SharedDefines.h:3464
@ ITEM_QUALITY_NORMAL
Definition SharedDefines.h:318
#define MAX_ITEM_QUALITY
Definition SharedDefines.h:327
#define MAX_SKILL_TYPE
Definition SharedDefines.h:3251
@ ALLIANCE
Definition SharedDefines.h:756
@ HORDE
Definition SharedDefines.h:755
#define CLASSMASK_ALL_PLAYABLE
Definition SharedDefines.h:142
@ CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES
Definition WorldConfig.h:100
Definition DBCStructure.h:620
int32 ItemId[MAX_OUTFIT_ITEMS]
Definition DBCStructure.h:626
Definition DBCStructure.h:835
Definition DBCStructure.h:907
Definition DBCStructure.h:1155
int32 SoundOverrideSubclassID
Definition DBCStructure.h:1147
uint32 SheatheType
Definition DBCStructure.h:1151
uint32 DisplayInfoID
Definition DBCStructure.h:1149
uint32 ClassID
Definition DBCStructure.h:1145
int32 Material
Definition DBCStructure.h:1148
uint32 SubclassID
Definition DBCStructure.h:1146
uint32 ItemId
Definition ItemTemplate.h:620

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(), GetScriptId(), HORDE, ItemEntry::InventoryType, INVTYPE_NON_EQUIP, ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ITEM_FLAGS_CU_DURATION_REAL_TIME, ITEM_MOD_SPELL_DAMAGE_DONE, ITEM_MOD_SPELL_HEALING_DONE, ITEM_QUALITY_NORMAL, ITEM_SPELLTRIGGER_LEARN_SPELL_ID, ITEM_SPELLTRIGGER_ON_USE, ItemTemplate::ItemId, 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, qualityToBuyValueConfig, qualityToSellValueConfig, sAreaTableStore, sCharStartOutfitStore, sCurrencyTypesStore, sDisableMgr, sFactionStore, sGemPropertiesStore, ItemEntry::SheatheType, sHolidaysStore, sItemBagFamilyStore, sItemLimitCategoryStore, sItemRandomPropertiesStore, sItemRandomSuffixStore, sItemSetStore, sItemStore, sLockStore, sMapStore, SOCKET_COLOR_ALL, ItemEntry::SoundOverrideSubclassID, sRaceMgr, sSpellMgr, sSpellsByCategoryStore, sTotemCategoryStore, ItemEntry::SubclassID, sWorld, and WorldDatabase.

◆ LoadLinkedRespawn()

void ObjectMgr::LoadLinkedRespawn ( )
1922{
1923 uint32 oldMSTime = getMSTime();
1924
1925 _linkedRespawnStore.clear();
1926 // 0 1 2
1927 QueryResult result = WorldDatabase.Query("SELECT guid, linkedGuid, linkType FROM linked_respawn ORDER BY guid ASC");
1928
1929 if (!result)
1930 {
1931 LOG_WARN("server.loading", ">> Loaded 0 linked respawns. DB table `linked_respawn` is empty.");
1932 LOG_INFO("server.loading", " ");
1933 return;
1934 }
1935
1936 do
1937 {
1938 Field* fields = result->Fetch();
1939
1940 ObjectGuid::LowType guidLow = fields[0].Get<uint32>();
1941 ObjectGuid::LowType linkedGuidLow = fields[1].Get<uint32>();
1942 uint8 linkType = fields[2].Get<uint8>();
1943
1944 ObjectGuid guid, linkedGuid;
1945 bool error = false;
1946 switch (linkType)
1947 {
1949 {
1950 const CreatureData* slave = GetCreatureData(guidLow);
1951 if (!slave)
1952 {
1953 LOG_ERROR("sql.sql", "LinkedRespawn: Creature (guid) {} not found in creature table", guidLow);
1954 error = true;
1955 break;
1956 }
1957
1958 const CreatureData* master = GetCreatureData(linkedGuidLow);
1959 if (!master)
1960 {
1961 LOG_ERROR("sql.sql", "LinkedRespawn: Creature (linkedGuid) {} not found in creature table", linkedGuidLow);
1962 error = true;
1963 break;
1964 }
1965
1966 MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
1967 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
1968 {
1969 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to Creature '{}' on an unpermitted map.", guidLow, linkedGuidLow);
1970 error = true;
1971 break;
1972 }
1973
1974 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
1975 {
1976 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to Creature '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
1977 error = true;
1978 break;
1979 }
1980
1981 guid = ObjectGuid::Create<HighGuid::Unit>(slave->id1, guidLow);
1982 linkedGuid = ObjectGuid::Create<HighGuid::Unit>(master->id1, linkedGuidLow);
1983 break;
1984 }
1985 case CREATURE_TO_GO:
1986 {
1987 const CreatureData* slave = GetCreatureData(guidLow);
1988 if (!slave)
1989 {
1990 LOG_ERROR("sql.sql", "LinkedRespawn: Creature (guid) {} not found in creature table", guidLow);
1991 error = true;
1992 break;
1993 }
1994
1995 const GameObjectData* master = GetGameObjectData(linkedGuidLow);
1996 if (!master)
1997 {
1998 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (linkedGuid) {} not found in gameobject table", linkedGuidLow);
1999 error = true;
2000 break;
2001 }
2002
2003 MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
2004 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
2005 {
2006 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to Gameobject '{}' on an unpermitted map.", guidLow, linkedGuidLow);
2007 error = true;
2008 break;
2009 }
2010
2011 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
2012 {
2013 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to Gameobject '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
2014 error = true;
2015 break;
2016 }
2017
2018 guid = ObjectGuid::Create<HighGuid::Unit>(slave->id1, guidLow);
2019 linkedGuid = ObjectGuid::Create<HighGuid::GameObject>(master->id, linkedGuidLow);
2020 break;
2021 }
2022 case GO_TO_GO:
2023 {
2024 const GameObjectData* slave = GetGameObjectData(guidLow);
2025 if (!slave)
2026 {
2027 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (guid) {} not found in gameobject table", guidLow);
2028 error = true;
2029 break;
2030 }
2031
2032 const GameObjectData* master = GetGameObjectData(linkedGuidLow);
2033 if (!master)
2034 {
2035 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (linkedGuid) {} not found in gameobject table", linkedGuidLow);
2036 error = true;
2037 break;
2038 }
2039
2040 MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
2041 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
2042 {
2043 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '{}' linking to Gameobject '{}' on an unpermitted map.", guidLow, linkedGuidLow);
2044 error = true;
2045 break;
2046 }
2047
2048 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
2049 {
2050 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '{}' linking to Gameobject '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
2051 error = true;
2052 break;
2053 }
2054
2055 guid = ObjectGuid::Create<HighGuid::GameObject>(slave->id, guidLow);
2056 linkedGuid = ObjectGuid::Create<HighGuid::GameObject>(master->id, linkedGuidLow);
2057 break;
2058 }
2059 case GO_TO_CREATURE:
2060 {
2061 const GameObjectData* slave = GetGameObjectData(guidLow);
2062 if (!slave)
2063 {
2064 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (guid) {} not found in gameobject table", guidLow);
2065 error = true;
2066 break;
2067 }
2068
2069 const CreatureData* master = GetCreatureData(linkedGuidLow);
2070 if (!master)
2071 {
2072 LOG_ERROR("sql.sql", "LinkedRespawn: Creature (linkedGuid) {} not found in creature table", linkedGuidLow);
2073 error = true;
2074 break;
2075 }
2076
2077 MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
2078 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
2079 {
2080 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '{}' linking to Creature '{}' on an unpermitted map.", guidLow, linkedGuidLow);
2081 error = true;
2082 break;
2083 }
2084
2085 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
2086 {
2087 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '{}' linking to Creature '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
2088 error = true;
2089 break;
2090 }
2091
2092 guid = ObjectGuid::Create<HighGuid::GameObject>(slave->id, guidLow);
2093 linkedGuid = ObjectGuid::Create<HighGuid::Unit>(master->id1, linkedGuidLow);
2094 break;
2095 }
2096 }
2097
2098 if (!error)
2099 _linkedRespawnStore[guid] = linkedGuid;
2100 } while (result->NextRow());
2101
2102 LOG_INFO("server.loading", ">> Loaded {} Linked Respawns In {} ms", uint64(_linkedRespawnStore.size()), GetMSTimeDiffToNow(oldMSTime));
2103 LOG_INFO("server.loading", " ");
2104}
Definition ObjectGuid.h:118
bool Instanceable() const
Definition DBCStructure.h:1353

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, SpawnData::mapid, sMapStore, SpawnData::spawnMask, and WorldDatabase.

◆ LoadMailLevelRewards()

void ObjectMgr::LoadMailLevelRewards ( )
9875{
9876 uint32 oldMSTime = getMSTime();
9877
9878 _mailLevelRewardStore.clear(); // for reload case
9879
9880 // 0 1 2 3
9881 QueryResult result = WorldDatabase.Query("SELECT level, raceMask, mailTemplateId, senderEntry FROM mail_level_reward");
9882
9883 if (!result)
9884 {
9885 LOG_WARN("server.loading", ">> Loaded 0 level dependent mail rewards. DB table `mail_level_reward` is empty.");
9886 LOG_INFO("server.loading", " ");
9887 return;
9888 }
9889
9890 uint32 count = 0;
9891
9892 do
9893 {
9894 Field* fields = result->Fetch();
9895
9896 uint8 level = fields[0].Get<uint8>();
9897 uint32 raceMask = fields[1].Get<uint32>();
9898 uint32 mailTemplateId = fields[2].Get<uint32>();
9899 uint32 senderEntry = fields[3].Get<uint32>();
9900
9901 if (level > MAX_LEVEL)
9902 {
9903 LOG_ERROR("sql.sql", "Table `mail_level_reward` have data for level {} that more supported by client ({}), ignoring.", level, MAX_LEVEL);
9904 continue;
9905 }
9906
9907 if (!(raceMask & sRaceMgr->GetPlayableRaceMask()))
9908 {
9909 LOG_ERROR("sql.sql", "Table `mail_level_reward` have raceMask ({}) for level {} that not include any player races, ignoring.", raceMask, level);
9910 continue;
9911 }
9912
9913 if (!sMailTemplateStore.LookupEntry(mailTemplateId))
9914 {
9915 LOG_ERROR("sql.sql", "Table `mail_level_reward` have invalid mailTemplateId ({}) for level {} that invalid not include any player races, ignoring.", mailTemplateId, level);
9916 continue;
9917 }
9918
9919 if (!GetCreatureTemplate(senderEntry))
9920 {
9921 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);
9922 continue;
9923 }
9924
9925 _mailLevelRewardStore[level].push_back(MailLevelReward(raceMask, mailTemplateId, senderEntry));
9926
9927 ++count;
9928 } while (result->NextRow());
9929
9930 LOG_INFO("server.loading", ">> Loaded {} Level Dependent Mail Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9931 LOG_INFO("server.loading", " ");
9932}
#define MAX_LEVEL
Definition DBCEnums.h:39
DBCStorage< MailTemplateEntry > sMailTemplateStore(MailTemplateEntryfmt)
Definition ObjectMgr.h:547

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

◆ LoadModuleStrings()

bool ObjectMgr::LoadModuleStrings ( )
9454{
9455 uint32 oldMSTime = getMSTime();
9456
9457 _moduleStringStore.clear(); // for reload case
9458 QueryResult result = WorldDatabase.Query("SELECT module, id, string FROM module_string");
9459 if (!result)
9460 {
9461 LOG_WARN("server.loading", ">> Loaded 0 module strings. DB table `module_string` is empty.");
9462 LOG_INFO("server.loading", " ");
9463 return false;
9464 }
9465
9466 do
9467 {
9468 Field* fields = result->Fetch();
9469
9470 std::string module = fields[0].Get<std::string>();
9471 uint32 id = fields[1].Get<uint32>();
9472
9473 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
9474 ModuleString& data = _moduleStringStore[pairKey];
9475
9476 AddLocaleString(fields[2].Get<std::string>(), LOCALE_enUS, data.Content);
9477 } while (result->NextRow());
9478
9479 LOG_INFO("server.loading", ">> Loaded {} Module Strings in {} ms", _moduleStringStore.size(), GetMSTimeDiffToNow(oldMSTime));
9480 LOG_INFO("server.loading", " ");
9481
9482 return true;
9483}

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

◆ LoadModuleStringsLocale()

bool ObjectMgr::LoadModuleStringsLocale ( )
9486{
9487 uint32 oldMSTime = getMSTime();
9488
9489 QueryResult result = WorldDatabase.Query("SELECT module, id, locale, string FROM module_string_locale");
9490 if (!result)
9491 {
9492 LOG_WARN("server.loading", ">> Loaded 0 module strings locale. DB table `module_string_locale` is empty.");
9493 LOG_INFO("server.loading", " ");
9494 return false;
9495 }
9496
9497 uint32 localeCount = 0;
9498 do
9499 {
9500 Field* fields = result->Fetch();
9501
9502 std::string module = fields[0].Get<std::string>();
9503 uint32 id = fields[1].Get<uint32>();
9504
9505 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
9506 ModuleString& data = _moduleStringStore[pairKey];
9507
9508 ModuleStringContainer::iterator ms = _moduleStringStore.find(pairKey);
9509 if (ms == _moduleStringStore.end())
9510 {
9511 LOG_ERROR("sql.sql", "ModuleString (Module: {} Id: {}) found in table `module_string_locale` but does not exist in `module_string`. Skipped!", module, id);
9512 continue;
9513 }
9514
9515 LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>());
9516 if (locale == LOCALE_enUS)
9517 continue;
9518
9519 AddLocaleString(fields[3].Get<std::string>(), locale, data.Content);
9520 localeCount++;
9521 } while (result->NextRow());
9522
9523 LOG_INFO("server.loading", ">> Loaded {} Module Strings Locales in {} ms", localeCount, GetMSTimeDiffToNow(oldMSTime));
9524 LOG_INFO("server.loading", " ");
9525
9526 return true;
9527}

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

◆ LoadNPCSpellClickSpells()

void ObjectMgr::LoadNPCSpellClickSpells ( )
8627{
8628 uint32 oldMSTime = getMSTime();
8629
8630 _spellClickInfoStore.clear();
8631 // 0 1 2 3
8632 QueryResult result = WorldDatabase.Query("SELECT npc_entry, spell_id, cast_flags, user_type FROM npc_spellclick_spells");
8633
8634 if (!result)
8635 {
8636 LOG_WARN("server.loading", ">> Loaded 0 spellclick spells. DB table `npc_spellclick_spells` is empty.");
8637 LOG_INFO("server.loading", " ");
8638 return;
8639 }
8640
8641 uint32 count = 0;
8642
8643 do
8644 {
8645 Field* fields = result->Fetch();
8646
8647 uint32 npc_entry = fields[0].Get<uint32>();
8648 CreatureTemplate const* cInfo = GetCreatureTemplate(npc_entry);
8649 if (!cInfo)
8650 {
8651 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown creature_template {}. Skipping entry.", npc_entry);
8652 continue;
8653 }
8654
8655 uint32 spellid = fields[1].Get<uint32>();
8656 SpellInfo const* spellinfo = sSpellMgr->GetSpellInfo(spellid);
8657 if (!spellinfo)
8658 {
8659 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown spellid {}. Skipping entry.", spellid);
8660 continue;
8661 }
8662
8663 uint8 userType = fields[3].Get<uint16>();
8664 if (userType >= SPELL_CLICK_USER_MAX)
8665 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown user type {}. Skipping entry.", uint32(userType));
8666
8667 uint8 castFlags = fields[2].Get<uint8>();
8668 SpellClickInfo info;
8669 info.spellId = spellid;
8670 info.castFlags = castFlags;
8671 info.userType = SpellClickUserTypes(userType);
8672 _spellClickInfoStore.insert(SpellClickInfoContainer::value_type(npc_entry, info));
8673
8674 ++count;
8675 } while (result->NextRow());
8676
8677 // all spellclick data loaded, now we check if there are creatures with NPC_FLAG_SPELLCLICK but with no data
8678 // NOTE: It *CAN* be the other way around: no spellclick flag but with spellclick data, in case of creature-only vehicle accessories
8680 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
8681 {
8682 if ((itr->second.npcflag & UNIT_NPC_FLAG_SPELLCLICK) && _spellClickInfoStore.find(itr->second.Entry) == _spellClickInfoStore.end())
8683 {
8684 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);
8685 const_cast<CreatureTemplate*>(&itr->second)->npcflag &= ~UNIT_NPC_FLAG_SPELLCLICK;
8686 }
8687 }
8688
8689 LOG_INFO("server.loading", ">> Loaded {} Spellclick Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8690 LOG_INFO("server.loading", " ");
8691}
SpellClickUserTypes
Definition SharedDefines.h:668
@ SPELL_CLICK_USER_MAX
Definition SharedDefines.h:673
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:346
Definition ObjectMgr.h:399
uint32 spellId
Definition ObjectMgr.h:400

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

◆ LoadNpcTextLocales()

void ObjectMgr::LoadNpcTextLocales ( )
6711{
6712 uint32 oldMSTime = getMSTime();
6713
6714 _npcTextLocaleStore.clear(); // need for reload case
6715
6716 QueryResult result = WorldDatabase.Query("SELECT ID, Locale, "
6717 // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
6718 "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 "
6719 "FROM npc_text_locale");
6720
6721 if (!result)
6722 return;
6723
6724 do
6725 {
6726 Field* fields = result->Fetch();
6727
6728 uint32 ID = fields[0].Get<uint32>();
6729
6730 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
6731 if (locale == LOCALE_enUS)
6732 continue;
6733
6735 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6736 {
6737 AddLocaleString(fields[2 + i * 2].Get<std::string>(), locale, data.Text_0[i]);
6738 AddLocaleString(fields[3 + i * 2].Get<std::string>(), locale, data.Text_1[i]);
6739 }
6740 } while (result->NextRow());
6741
6742 LOG_INFO("server.loading", ">> Loaded {} Npc Text Locale Strings in {} ms", (uint32)_npcTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6743}
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 ( )
6458{
6459 uint32 oldMSTime = getMSTime();
6460
6461 _pageTextLocaleStore.clear(); // need for reload case
6462
6463 // 0 1 2
6464 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Text FROM page_text_locale");
6465
6466 if (!result)
6467 {
6468 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text_locale` is empty!");
6469 LOG_INFO("server.loading", " ");
6470 return;
6471 }
6472
6473 do
6474 {
6475 Field* fields = result->Fetch();
6476
6477 uint32 ID = fields[0].Get<uint32>();
6478
6479 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
6480 if (locale == LOCALE_enUS)
6481 continue;
6482
6484 AddLocaleString(fields[2].Get<std::string>(), locale, data.Text);
6485 } while (result->NextRow());
6486
6487 LOG_INFO("server.loading", ">> Loaded {} Page Text Locale Strings in {} ms", (uint32)_pageTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6488}
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, LOG_WARN, PageTextLocale::Text, and WorldDatabase.

◆ LoadPageTexts()

void ObjectMgr::LoadPageTexts ( )
6408{
6409 uint32 oldMSTime = getMSTime();
6410
6411 // 0 1 2
6412 QueryResult result = WorldDatabase.Query("SELECT ID, Text, NextPageID FROM page_text");
6413
6414 if (!result)
6415 {
6416 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text` is empty!");
6417 LOG_INFO("server.loading", " ");
6418 return;
6419 }
6420
6421 uint32 count = 0;
6422 do
6423 {
6424 Field* fields = result->Fetch();
6425
6426 PageText& pageText = _pageTextStore[fields[0].Get<uint32>()];
6427
6428 pageText.Text = fields[1].Get<std::string>();
6429 pageText.NextPage = fields[2].Get<uint32>();
6430
6431 ++count;
6432 } while (result->NextRow());
6433
6434 for (PageTextContainer::const_iterator itr = _pageTextStore.begin(); itr != _pageTextStore.end(); ++itr)
6435 {
6436 if (itr->second.NextPage)
6437 {
6438 PageTextContainer::const_iterator itr2 = _pageTextStore.find(itr->second.NextPage);
6439 if (itr2 == _pageTextStore.end())
6440 LOG_ERROR("sql.sql", "Page text (Id: {}) has not existing next page (Id: {})", itr->first, itr->second.NextPage);
6441 }
6442 }
6443
6444 LOG_INFO("server.loading", ">> Loaded {} Page Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6445 LOG_INFO("server.loading", " ");
6446}
Definition ObjectMgr.h:58
std::string Text
Definition ObjectMgr.h:59
uint32 NextPage
Definition ObjectMgr.h:60

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

◆ LoadPetLevelInfo()

void ObjectMgr::LoadPetLevelInfo ( )
4145{
4146 uint32 oldMSTime = getMSTime();
4147
4148 // 0 1 2 3 4 5 6 7 8 9 10 11
4149 QueryResult result = WorldDatabase.Query("SELECT creature_entry, level, hp, mana, str, agi, sta, inte, spi, armor, min_dmg, max_dmg FROM pet_levelstats");
4150
4151 if (!result)
4152 {
4153 LOG_WARN("server.loading", ">> Loaded 0 level pet stats definitions. DB table `pet_levelstats` is empty.");
4154 LOG_INFO("server.loading", " ");
4155 return;
4156 }
4157
4158 uint32 count = 0;
4159
4160 do
4161 {
4162 Field* fields = result->Fetch();
4163
4164 uint32 creature_id = fields[0].Get<uint32>();
4165 if (!GetCreatureTemplate(creature_id))
4166 {
4167 LOG_ERROR("sql.sql", "Wrong creature id {} in `pet_levelstats` table, ignoring.", creature_id);
4168 continue;
4169 }
4170
4171 uint32 current_level = fields[1].Get<uint8>();
4172 if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4173 {
4174 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
4175 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `pet_levelstats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
4176 else
4177 {
4178 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `pet_levelstats` table, ignoring.", current_level);
4179 ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
4180 }
4181 continue;
4182 }
4183 else if (current_level < 1)
4184 {
4185 LOG_ERROR("sql.sql", "Wrong (<1) level {} in `pet_levelstats` table, ignoring.", current_level);
4186 continue;
4187 }
4188
4189 PetLevelInfo*& pInfoMapEntry = _petInfoStore[creature_id];
4190
4191 if (!pInfoMapEntry)
4192 pInfoMapEntry = new PetLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
4193
4194 // data for level 1 stored in [0] array element, ...
4195 PetLevelInfo* pLevelInfo = &pInfoMapEntry[current_level - 1];
4196
4197 pLevelInfo->health = fields[2].Get<uint32>();
4198 pLevelInfo->mana = fields[3].Get<uint32>();
4199 pLevelInfo->armor = fields[9].Get<uint32>();
4200 pLevelInfo->min_dmg = fields[10].Get<uint32>();
4201 pLevelInfo->max_dmg = fields[11].Get<uint32>();
4202 for (uint8 i = 0; i < MAX_STATS; i++)
4203 {
4204 pLevelInfo->stats[i] = fields[i + 4].Get<uint32>();
4205 }
4206
4207 ++count;
4208 } while (result->NextRow());
4209
4210 // Fill gaps and check integrity
4211 for (PetLevelInfoContainer::iterator itr = _petInfoStore.begin(); itr != _petInfoStore.end(); ++itr)
4212 {
4213 PetLevelInfo* pInfo = itr->second;
4214
4215 // fatal error if no level 1 data
4216 if (!pInfo || pInfo[0].health == 0)
4217 {
4218 LOG_ERROR("sql.sql", "Creature {} does not have pet stats data for Level 1!", itr->first);
4219 exit(1);
4220 }
4221
4222 // fill level gaps
4223 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4224 {
4225 if (pInfo[level].health == 0)
4226 {
4227 LOG_ERROR("sql.sql", "Creature {} has no data for Level {} pet stats data, using data of Level {}.", itr->first, level + 1, level);
4228 pInfo[level] = pInfo[level - 1];
4229 }
4230 }
4231 }
4232
4233 LOG_INFO("server.loading", ">> Loaded {} Level Pet Stats Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4234 LOG_INFO("server.loading", " ");
4235}
#define STRONG_MAX_LEVEL
Definition DBCEnums.h:43
#define MAX_STATS
Definition SharedDefines.h:253
Definition ObjectMgr.h:532
uint32 max_dmg
Definition ObjectMgr.h:543
uint32 mana
Definition ObjectMgr.h:540
uint32 min_dmg
Definition ObjectMgr.h:542
uint32 health
Definition ObjectMgr.h:539
std::array< uint32, MAX_STATS > stats
Definition ObjectMgr.h:538
uint32 armor
Definition ObjectMgr.h:541

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

◆ LoadPetNames()

void ObjectMgr::LoadPetNames ( )
8133{
8134 uint32 oldMSTime = getMSTime();
8135 // 0 1 2
8136 QueryResult result = WorldDatabase.Query("SELECT word, entry, half FROM pet_name_generation");
8137
8138 if (!result)
8139 {
8140 LOG_WARN("server.loading", ">> Loaded 0 pet name parts. DB table `pet_name_generation` is empty!");
8141 LOG_INFO("server.loading", " ");
8142 return;
8143 }
8144
8145 uint32 count = 0;
8146
8147 do
8148 {
8149 Field* fields = result->Fetch();
8150 std::string word = fields[0].Get<std::string>();
8151 uint32 entry = fields[1].Get<uint32>();
8152 bool half = fields[2].Get<bool>();
8153 if (half)
8154 _petHalfName1[entry].push_back(word);
8155 else
8156 _petHalfName0[entry].push_back(word);
8157 ++count;
8158 } while (result->NextRow());
8159
8160 LOG_INFO("server.loading", ">> Loaded {} Pet Name Parts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8161 LOG_INFO("server.loading", " ");
8162}

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

◆ LoadPetNamesLocales()

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

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

◆ LoadPetNumber()

void ObjectMgr::LoadPetNumber ( )
8165{
8166 uint32 oldMSTime = getMSTime();
8167
8168 QueryResult result = CharacterDatabase.Query("SELECT MAX(id) FROM character_pet");
8169 if (result)
8170 {
8171 Field* fields = result->Fetch();
8172 _hiPetNumber = fields[0].Get<uint32>() + 1;
8173 }
8174
8175 LOG_INFO("server.loading", ">> Loaded The Max Pet Number: {} in {} ms", _hiPetNumber - 1, GetMSTimeDiffToNow(oldMSTime));
8176 LOG_INFO("server.loading", " ");
8177}

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

◆ LoadPlayerInfo()

void ObjectMgr::LoadPlayerInfo ( )
4284{
4285 // Load playercreate
4286 {
4287 if (_playerInfo.empty() || _playerInfo.size() != sRaceMgr->GetMaxRaces())
4288 {
4289 _playerInfo.clear();
4290 _playerInfo.resize(sRaceMgr->GetMaxRaces());
4291 for (auto& classVec : _playerInfo)
4292 classVec.resize(MAX_CLASSES, nullptr);
4293 }
4294
4295 uint32 oldMSTime = getMSTime();
4296 // 0 1 2 3 4 5 6
4297 QueryResult result = WorldDatabase.Query("SELECT race, class, map, zone, position_x, position_y, position_z, orientation FROM playercreateinfo");
4298
4299 if (!result)
4300 {
4301 LOG_INFO("server.loading", " ");
4302 LOG_WARN("server.loading", ">> Loaded 0 player create definitions. DB table `playercreateinfo` is empty.");
4303 exit(1);
4304 }
4305 else
4306 {
4307 uint32 count = 0;
4308
4309 do
4310 {
4311 Field* fields = result->Fetch();
4312
4313 uint32 current_race = fields[0].Get<uint8>();
4314 uint32 current_class = fields[1].Get<uint8>();
4315 uint32 mapId = fields[2].Get<uint16>();
4316 uint32 areaId = fields[3].Get<uint32>(); // zone
4317 float positionX = fields[4].Get<float>();
4318 float positionY = fields[5].Get<float>();
4319 float positionZ = fields[6].Get<float>();
4320 float orientation = fields[7].Get<float>();
4321
4322 if (current_race >= sRaceMgr->GetMaxRaces())
4323 {
4324 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo` table, ignoring.", current_race);
4325 continue;
4326 }
4327
4328 ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(current_race);
4329 if (!rEntry)
4330 {
4331 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo` table, ignoring.", current_race);
4332 continue;
4333 }
4334
4335 if (current_class >= MAX_CLASSES)
4336 {
4337 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo` table, ignoring.", current_class);
4338 continue;
4339 }
4340
4341 if (!sChrClassesStore.LookupEntry(current_class))
4342 {
4343 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo` table, ignoring.", current_class);
4344 continue;
4345 }
4346
4347 // accept DB data only for valid position (and non instanceable)
4348 if (!MapMgr::IsValidMapCoord(mapId, positionX, positionY, positionZ, orientation))
4349 {
4350 LOG_ERROR("sql.sql", "Wrong home position for class {} race {} pair in `playercreateinfo` table, ignoring.", current_class, current_race);
4351 continue;
4352 }
4353
4354 if (sMapStore.LookupEntry(mapId)->Instanceable())
4355 {
4356 LOG_ERROR("sql.sql", "Home position in instanceable map for class {} race {} pair in `playercreateinfo` table, ignoring.", current_class, current_race);
4357 continue;
4358 }
4359
4360 PlayerInfo* info = new PlayerInfo();
4361 info->mapId = mapId;
4362 info->areaId = areaId;
4363 info->positionX = positionX;
4364 info->positionY = positionY;
4365 info->positionZ = positionZ;
4366 info->orientation = orientation;
4367 info->displayId_m = rEntry->model_m;
4368 info->displayId_f = rEntry->model_f;
4369 _playerInfo[current_race][current_class] = info;
4370
4371 ++count;
4372 } while (result->NextRow());
4373
4374 LOG_INFO("server.loading", ">> Loaded {} Player Create Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4375 LOG_INFO("server.loading", " ");
4376 }
4377 }
4378
4379 // Load playercreate items
4380 LOG_INFO("server.loading", "Loading Player Create Items Data...");
4381 {
4382 uint32 oldMSTime = getMSTime();
4383 // 0 1 2 3
4384 QueryResult result = WorldDatabase.Query("SELECT race, class, itemid, amount FROM playercreateinfo_item");
4385
4386 if (!result)
4387 {
4388 LOG_WARN("server.loading", ">> Loaded 0 Custom Player Create Items. DB Table `playercreateinfo_item` Is Empty.");
4389 LOG_INFO("server.loading", " ");
4390 }
4391 else
4392 {
4393 uint32 count = 0;
4394
4395 do
4396 {
4397 Field* fields = result->Fetch();
4398
4399 uint32 current_race = fields[0].Get<uint8>();
4400 if (current_race >= sRaceMgr->GetMaxRaces())
4401 {
4402 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo_item` table, ignoring.", current_race);
4403 continue;
4404 }
4405
4406 uint32 current_class = fields[1].Get<uint8>();
4407 if (current_class >= MAX_CLASSES)
4408 {
4409 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo_item` table, ignoring.", current_class);
4410 continue;
4411 }
4412
4413 uint32 item_id = fields[2].Get<uint32>();
4414
4415 if (!GetItemTemplate(item_id))
4416 {
4417 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);
4418 continue;
4419 }
4420
4421 int32 amount = fields[3].Get<int32>();
4422
4423 if (!amount)
4424 {
4425 LOG_ERROR("sql.sql", "Item id {} (class {} race {}) have amount == 0 in `playercreateinfo_item` table, ignoring.", item_id, current_race, current_class);
4426 continue;
4427 }
4428
4429 if (!current_race || !current_class)
4430 {
4431 uint32 min_race = current_race ? current_race : 1;
4432 uint32 max_race = current_race ? current_race + 1 : sRaceMgr->GetMaxRaces();
4433 uint32 min_class = current_class ? current_class : 1;
4434 uint32 max_class = current_class ? current_class + 1 : MAX_CLASSES;
4435 for (uint32 r = min_race; r < max_race; ++r)
4436 for (uint32 c = min_class; c < max_class; ++c)
4437 PlayerCreateInfoAddItemHelper(r, c, item_id, amount);
4438 }
4439 else
4440 PlayerCreateInfoAddItemHelper(current_race, current_class, item_id, amount);
4441
4442 ++count;
4443 } while (result->NextRow());
4444
4445 LOG_INFO("server.loading", ">> Loaded {} Custom Player Create Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4446 LOG_INFO("server.loading", " ");
4447 }
4448 }
4449
4450 // Load playercreate skills
4451 LOG_INFO("server.loading", "Loading Player Create Skill Data...");
4452 {
4453 uint32 oldMSTime = getMSTime();
4454
4455 QueryResult result = WorldDatabase.Query("SELECT raceMask, classMask, skill, `rank` FROM playercreateinfo_skills");
4456
4457 if (!result)
4458 {
4459 LOG_WARN("server.loading", ">> Loaded 0 Player Create Skills. DB Table `playercreateinfo_skills` Is Empty.");
4460 }
4461 else
4462 {
4463 uint32 count = 0;
4464
4465 do
4466 {
4467 Field* fields = result->Fetch();
4468 uint32 raceMask = fields[0].Get<uint32>();
4469 uint32 classMask = fields[1].Get<uint32>();
4471 skill.SkillId = fields[2].Get<uint16>();
4472 skill.Rank = fields[3].Get<uint16>();
4473
4474 if (skill.Rank >= MAX_SKILL_STEP)
4475 {
4476 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);
4477 continue;
4478 }
4479
4480 if (raceMask != 0 && !(raceMask & sRaceMgr->GetPlayableRaceMask()))
4481 {
4482 LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_skills` table, ignoring.", raceMask);
4483 continue;
4484 }
4485
4486 if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE))
4487 {
4488 LOG_ERROR("sql.sql", "Wrong class mask {} in `playercreateinfo_skills` table, ignoring.", classMask);
4489 continue;
4490 }
4491
4492 if (!sSkillLineStore.LookupEntry(skill.SkillId))
4493 {
4494 LOG_ERROR("sql.sql", "Wrong skill id {} in `playercreateinfo_skills` table, ignoring.", skill.SkillId);
4495 continue;
4496 }
4497
4498 for (uint32 raceIndex = RACE_HUMAN; raceIndex < sRaceMgr->GetMaxRaces(); ++raceIndex)
4499 {
4500 if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask))
4501 {
4502 for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
4503 {
4504 if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
4505 {
4506 if (!GetSkillRaceClassInfo(skill.SkillId, raceIndex, classIndex))
4507 continue;
4508
4509 if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
4510 {
4511 info->skills.push_back(skill);
4512 ++count;
4513 }
4514 }
4515 }
4516 }
4517 }
4518 } while (result->NextRow());
4519
4520 LOG_INFO("server.loading", ">> Loaded {} Player Create Skills in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4521 LOG_INFO("server.loading", " ");
4522 }
4523 }
4524
4525 // Load playercreate spells
4526 LOG_INFO("server.loading", "Loading Player Create Spell Data...");
4527 {
4528 uint32 oldMSTime = getMSTime();
4529
4530 QueryResult result = WorldDatabase.Query("SELECT racemask, classmask, Spell FROM playercreateinfo_spell_custom");
4531
4532 if (!result)
4533 {
4534 LOG_WARN("server.loading", ">> Loaded 0 player create spells. DB table `playercreateinfo_spell_custom` is empty.");
4535 }
4536 else
4537 {
4538 uint32 count = 0;
4539
4540 do
4541 {
4542 Field* fields = result->Fetch();
4543 uint32 raceMask = fields[0].Get<uint32>();
4544 uint32 classMask = fields[1].Get<uint32>();
4545 uint32 spellId = fields[2].Get<uint32>();
4546
4547 if (raceMask != 0 && !(raceMask & sRaceMgr->GetPlayableRaceMask()))
4548 {
4549 LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_spell_custom` table, ignoring.", raceMask);
4550 continue;
4551 }
4552
4553 if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE))
4554 {
4555 LOG_ERROR("sql.sql", "Wrong class mask {} in `playercreateinfo_spell_custom` table, ignoring.", classMask);
4556 continue;
4557 }
4558
4559 for (uint32 raceIndex = RACE_HUMAN; raceIndex < sRaceMgr->GetMaxRaces(); ++raceIndex)
4560 {
4561 if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask))
4562 {
4563 for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
4564 {
4565 if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
4566 {
4567 if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
4568 {
4569 info->customSpells.push_back(spellId);
4570 ++count;
4571 }
4572 }
4573 }
4574 }
4575 }
4576 } while (result->NextRow());
4577
4578 LOG_INFO("server.loading", ">> Loaded {} Custom Player Create Spells in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4579 LOG_INFO("server.loading", " ");
4580 }
4581 }
4582
4583 // Load playercreate cast spell
4584 LOG_INFO("server.loading", "Loading Player Create Cast Spell Data...");
4585 {
4586 uint32 oldMSTime = getMSTime();
4587
4588 QueryResult result = WorldDatabase.Query("SELECT raceMask, classMask, spell FROM playercreateinfo_cast_spell");
4589
4590 if (!result)
4591 {
4592 LOG_WARN("server.loading", ">> Loaded 0 Player Create Cast Spells. DB Table `playercreateinfo_cast_spell` Is Empty.");
4593 }
4594 else
4595 {
4596 uint32 count = 0;
4597
4598 do
4599 {
4600 Field* fields = result->Fetch();
4601 uint32 raceMask = fields[0].Get<uint32>();
4602 uint32 classMask = fields[1].Get<uint32>();
4603 uint32 spellId = fields[2].Get<uint32>();
4604
4605 if (raceMask != 0 && !(raceMask & sRaceMgr->GetPlayableRaceMask()))
4606 {
4607 LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_cast_spell` table, ignoring.", raceMask);
4608 continue;
4609 }
4610
4611 if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE))
4612 {
4613 LOG_ERROR("sql.sql", "Wrong class mask {} in `playercreateinfo_cast_spell` table, ignoring.", classMask);
4614 continue;
4615 }
4616
4617 for (uint32 raceIndex = RACE_HUMAN; raceIndex < sRaceMgr->GetMaxRaces(); ++raceIndex)
4618 {
4619 if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask))
4620 {
4621 for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
4622 {
4623 if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
4624 {
4625 if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
4626 {
4627 info->castSpells.push_back(spellId);
4628 ++count;
4629 }
4630 }
4631 }
4632 }
4633 }
4634 } while (result->NextRow());
4635
4636 LOG_INFO("server.loading", ">> Loaded {} Player Create Cast Spells in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4637 LOG_INFO("server.loading", " ");
4638 }
4639 }
4640
4641 // Load playercreate actions
4642 LOG_INFO("server.loading", "Loading Player Create Action Data...");
4643 {
4644 uint32 oldMSTime = getMSTime();
4645
4646 // 0 1 2 3 4
4647 QueryResult result = WorldDatabase.Query("SELECT race, class, button, action, type FROM playercreateinfo_action");
4648
4649 if (!result)
4650 {
4651 LOG_WARN("server.loading", ">> Loaded 0 Player Create Actions. DB Table `playercreateinfo_action` Is Empty.");
4652 LOG_INFO("server.loading", " ");
4653 }
4654 else
4655 {
4656 uint32 count = 0;
4657
4658 do
4659 {
4660 Field* fields = result->Fetch();
4661
4662 uint32 current_race = fields[0].Get<uint8>();
4663 if (current_race >= sRaceMgr->GetMaxRaces())
4664 {
4665 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo_action` table, ignoring.", current_race);
4666 continue;
4667 }
4668
4669 uint32 current_class = fields[1].Get<uint8>();
4670 if (current_class >= MAX_CLASSES)
4671 {
4672 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo_action` table, ignoring.", current_class);
4673 continue;
4674 }
4675
4676 if (PlayerInfo* info = _playerInfo[current_race][current_class])
4677 info->action.push_back(PlayerCreateInfoAction(fields[2].Get<uint16>(), fields[3].Get<uint32>(), fields[4].Get<uint16>()));
4678
4679 ++count;
4680 } while (result->NextRow());
4681
4682 LOG_INFO("server.loading", ">> Loaded {} Player Create Actions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4683 LOG_INFO("server.loading", " ");
4684 }
4685 }
4686
4687 // Loading levels data (class/race dependent)
4688 LOG_INFO("server.loading", "Loading Player Create Level Stats Data...");
4689 {
4690 struct RaceStats
4691 {
4692 int16 StatModifier[MAX_STATS];
4693 };
4694
4695 std::vector<RaceStats> raceStatModifiers;
4696
4697 raceStatModifiers.resize(sRaceMgr->GetMaxRaces());
4698
4699 uint32 oldMSTime = getMSTime();
4700
4701 // 0 1 2 3 4 5
4702 QueryResult raceStatsResult = WorldDatabase.Query("SELECT Race, Strength, Agility, Stamina, Intellect, Spirit FROM player_race_stats");
4703
4704 if (!raceStatsResult)
4705 {
4706 LOG_WARN("server.loading", ">> Loaded 0 race stats definitions. DB table `player_race_stats` is empty.");
4707 LOG_INFO("server.loading", " ");
4708 exit(1);
4709 }
4710
4711 do
4712 {
4713 Field* fields = raceStatsResult->Fetch();
4714
4715 uint32 current_race = fields[0].Get<uint8>();
4716 if (current_race >= sRaceMgr->GetMaxRaces())
4717 {
4718 LOG_ERROR("sql.sql", "Wrong race {} in `player_race_stats` table, ignoring.", current_race);
4719 continue;
4720 }
4721
4722 for (uint32 i = 0; i < MAX_STATS; ++i)
4723 raceStatModifiers[current_race].StatModifier[i] = fields[i + 1].Get<int16>();
4724
4725 } while (raceStatsResult->NextRow());
4726
4727 // 0 1 2 3 4 5 6 7 8
4728 QueryResult result = WorldDatabase.Query("SELECT Class, Level, Strength, Agility, Stamina, Intellect, Spirit, BaseHP, BaseMana FROM player_class_stats");
4729
4730 if (!result)
4731 {
4732 LOG_ERROR("server.loading", ">> Loaded 0 level stats definitions. DB table `player_class_stats` is empty.");
4733 exit(1);
4734 }
4735
4736 uint32 count = 0;
4737
4738 do
4739 {
4740 Field* fields = result->Fetch();
4741
4742 uint32 current_class = fields[0].Get<uint8>();
4743 if (current_class >= MAX_CLASSES)
4744 {
4745 LOG_ERROR("sql.sql", "Wrong class {} in `player_class_stats` table, ignoring.", current_class);
4746 continue;
4747 }
4748
4749 uint32 current_level = fields[1].Get<uint8>();
4750 if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4751 {
4752 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
4753 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `player_class_stats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
4754 else
4755 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `player_class_stats` table, ignoring.", current_level);
4756
4757 continue;
4758 }
4759
4760 for (std::size_t race = 0; race < raceStatModifiers.size(); ++race)
4761 {
4762 if (PlayerInfo* info = _playerInfo[race][current_class])
4763 {
4764 if (!info->levelInfo)
4765 info->levelInfo = new PlayerLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
4766
4767 PlayerLevelInfo& levelInfo = info->levelInfo[current_level - 1];
4768 for (int i = 0; i < MAX_STATS; ++i)
4769 levelInfo.stats[i] = fields[i + 2].Get<uint16>() + raceStatModifiers[race].StatModifier[i];
4770 }
4771 }
4772
4773 PlayerClassInfo* info = _playerClassInfo[current_class];
4774 if (!info)
4775 {
4776 info = new PlayerClassInfo();
4778 _playerClassInfo[current_class] = info;
4779 }
4780
4781 PlayerClassLevelInfo& levelInfo = info->levelInfo[current_level - 1];
4782
4783 levelInfo.basehealth = fields[7].Get<uint32>();
4784 levelInfo.basemana = fields[8].Get<uint32>();
4785
4786 ++count;
4787 } while (result->NextRow());
4788
4789 // Fill gaps and check integrity
4790 for (int race = RACE_HUMAN; race < sRaceMgr->GetMaxRaces(); ++race)
4791 {
4792 // skip non existed races
4793 if (!sChrRacesStore.LookupEntry(race))
4794 continue;
4795
4796 for (int class_ = 0; class_ < MAX_CLASSES; ++class_)
4797 {
4798 // skip non existed classes
4799 if (!sChrClassesStore.LookupEntry(class_))
4800 continue;
4801
4802 PlayerClassInfo* pClassInfo = _playerClassInfo[class_];
4803 PlayerInfo* info = _playerInfo[race][class_];
4804 if (!info)
4805 continue;
4806
4807 // skip expansion races if not playing with expansion
4808 if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_THE_BURNING_CRUSADE && (race == RACE_BLOODELF || race == RACE_DRAENEI))
4809 continue;
4810
4811 // skip expansion classes if not playing with expansion
4813 continue;
4814
4815 // fatal error if no initial stats data
4816 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))
4817 {
4818 LOG_ERROR("sql.sql", "Race {} class {} initial level does not have stats data!", race, class_);
4819 exit(1);
4820 }
4821
4822 // fatal error if no initial health/mana data
4823 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))
4824 {
4825 LOG_ERROR("sql.sql", "Class {} initial level does not have health/mana data!", class_);
4826 exit(1);
4827 }
4828
4829 // fill level gaps for stats
4830 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4831 {
4832 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))
4833 {
4834 LOG_ERROR("sql.sql", "Race {} class {} level {} does not have stats data. Using stats data of level {}.", race, class_, level + 1, level);
4835 info->levelInfo[level] = info->levelInfo[level - 1];
4836 }
4837 }
4838
4839 // fill level gaps for health/mana
4840 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4841 {
4842 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))
4843 {
4844 LOG_ERROR("sql.sql", "Class {} level {} does not have health/mana data. Using stats data of level {}.", class_, level + 1, level);
4845 pClassInfo->levelInfo[level] = pClassInfo->levelInfo[level - 1];
4846 }
4847 }
4848 }
4849 }
4850
4851 LOG_INFO("server.loading", ">> Loaded {} Level Stats Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4852 LOG_INFO("server.loading", " ");
4853 }
4854
4855 // Loading xp per level data
4856 LOG_INFO("server.loading", "Loading Player Create XP Data...");
4857 {
4858 uint32 oldMSTime = getMSTime();
4859
4860 _playerXPperLevel.resize(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
4861 for (uint8 level = 0; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4862 _playerXPperLevel[level] = 0;
4863
4864 // 0 1
4865 QueryResult result = WorldDatabase.Query("SELECT Level, Experience FROM player_xp_for_level");
4866
4867 if (!result)
4868 {
4869 LOG_WARN("server.loading", ">> Loaded 0 xp for level definitions. DB table `player_xp_for_level` is empty.");
4870 LOG_INFO("server.loading", " ");
4871 exit(1);
4872 }
4873
4874 uint32 count = 0;
4875
4876 do
4877 {
4878 Field* fields = result->Fetch();
4879
4880 uint32 current_level = fields[0].Get<uint8>();
4881 uint32 current_xp = fields[1].Get<uint32>();
4882
4883 if (current_level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4884 {
4885 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
4886 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `player_xp_for_level` table, ignoring.", STRONG_MAX_LEVEL, current_level);
4887 else
4888 {
4889 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `player_xp_for_levels` table, ignoring.", current_level);
4890 ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
4891 }
4892 continue;
4893 }
4894 //PlayerXPperLevel
4895 _playerXPperLevel[current_level] = current_xp;
4896 ++count;
4897 } while (result->NextRow());
4898
4899 // fill level gaps
4900 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4901 {
4902 if (_playerXPperLevel[level] == 0)
4903 {
4904 LOG_ERROR("sql.sql", "Level {} does not have XP for level data. Using data of level [{}] + 100.", level + 1, level);
4905 _playerXPperLevel[level] = _playerXPperLevel[level - 1] + 100;
4906 }
4907 }
4908
4909 LOG_INFO("server.loading", ">> Loaded {} XP For Level Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4910 LOG_INFO("server.loading", " ");
4911 }
4912}
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)
#define MAX_SKILL_STEP
Definition DBCStructure.h:1580
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:131
@ 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 WorldConfig.h:197
@ CONFIG_START_PLAYER_LEVEL
Definition WorldConfig.h:196
@ CONFIG_EXPANSION
Definition WorldConfig.h:233
void PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count)
Definition ObjectMgr.cpp:4249
Definition DBCStructure.h:679
uint32 model_f
Definition DBCStructure.h:685
uint32 model_m
Definition DBCStructure.h:684
Definition Player.h:276
uint32 basehealth
Definition Player.h:278
uint32 basemana
Definition Player.h:279
Definition Player.h:302
Definition Player.h:314
uint16 SkillId
Definition Player.h:315
float orientation
Definition Player.h:331
uint16 displayId_m
Definition Player.h:332
float positionX
Definition Player.h:328
uint32 areaId
Definition Player.h:327
float positionY
Definition Player.h:329
float positionZ
Definition Player.h:330
uint32 mapId
Definition Player.h:326
uint16 displayId_f
Definition Player.h:333
Definition Player.h:290
std::array< uint32, MAX_STATS > stats
Definition Player.h:296

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_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, sChrClassesStore, sChrRacesStore, PlayerCreateInfoSkill::SkillId, sMapStore, sRaceMgr, sSkillLineStore, PlayerLevelInfo::stats, STRONG_MAX_LEVEL, sWorld, and WorldDatabase.

◆ LoadPlayerShapeshiftModels()

void ObjectMgr::LoadPlayerShapeshiftModels ( )
1845{
1846 uint32 oldMSTime = getMSTime();
1847
1848 QueryResult result = WorldDatabase.Query("SELECT ShapeshiftID, RaceID, CustomizationID, GenderID, ModelID from player_shapeshift_model");
1849
1850 if (!result)
1851 {
1852 LOG_INFO("server.loading", ">> Loaded 0 player shapeshift model records. DB table `player_shapeshift_model` is empty.");
1853 return;
1854 }
1855
1856 uint32 count = 0;
1857 do
1858 {
1859 Field* fields = result->Fetch();
1860
1861 ShapeshiftForm shapeshiftForm = ShapeshiftForm(fields[0].Get<uint8>());
1862 uint8 race = fields[1].Get<uint8>();
1863 uint8 customizationID = fields[2].Get<uint8>();
1864 uint8 genderID = Gender(fields[3].Get<uint8>());
1865 uint32 modelId = fields[4].Get<uint32>();
1866
1867 ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race);
1868 if (!raceEntry)
1869 {
1870 LOG_ERROR("sql.sql", "Race {} defined in `player_shapeshift_model` does not exists, skipped.", uint32(race));
1871 continue;
1872 }
1873
1874 CreatureDisplayInfoEntry const* displayEntry = sCreatureDisplayInfoStore.LookupEntry(modelId);
1875 if (!displayEntry)
1876 {
1877 LOG_ERROR("sql.sql", "ShapeshiftForm: {}, Race: {} defined in `player_shapeshift_model` has non-existing model ({}), skipped.", shapeshiftForm, race, modelId);
1878 continue;
1879 }
1880
1881 _playerShapeshiftModel[std::make_tuple(shapeshiftForm, race, customizationID, genderID)] = modelId;
1882 ++count;
1883 } while (result->NextRow());
1884
1885 LOG_INFO("server.loading", ">> Loaded {} player totem model records in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1886 LOG_INFO("server.loading", " ");
1887}
Gender
Definition SharedDefines.h:60
ShapeshiftForm
Definition UnitDefines.h:71

References _playerShapeshiftModel, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, sChrRacesStore, sCreatureDisplayInfoStore, and WorldDatabase.

◆ LoadPlayerTotemModels()

void ObjectMgr::LoadPlayerTotemModels ( )
1786{
1787 uint32 oldMSTime = getMSTime();
1788
1789 QueryResult result = WorldDatabase.Query("SELECT TotemID, RaceID, ModelID from player_totem_model");
1790
1791 if (!result)
1792 {
1793 LOG_INFO("server.loading", ">> Loaded 0 player totem model records. DB table `player_totem_model` is empty.");
1794 return;
1795 }
1796
1797 uint32 count = 0;
1798 do
1799 {
1800 Field* fields = result->Fetch();
1801
1802 SummonSlot totemSlot = SummonSlot(fields[0].Get<uint8>());
1803 uint8 race = fields[1].Get<uint8>();
1804 uint32 displayId = fields[2].Get<uint32>();
1805
1806 if (totemSlot < SUMMON_SLOT_TOTEM_FIRE || totemSlot >= MAX_TOTEM_SLOT)
1807 {
1808 LOG_ERROR("sql.sql", "Wrong TotemSlot {} in `player_totem_model` table, skipped.", totemSlot);
1809 continue;
1810 }
1811
1812 ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race);
1813 if (!raceEntry)
1814 {
1815 LOG_ERROR("sql.sql", "Race {} defined in `player_totem_model` does not exists, skipped.", uint32(race));
1816 continue;
1817 }
1818
1819 CreatureDisplayInfoEntry const* displayEntry = sCreatureDisplayInfoStore.LookupEntry(displayId);
1820 if (!displayEntry)
1821 {
1822 LOG_ERROR("sql.sql", "TotemSlot: {} defined in `player_totem_model` has non-existing model ({}), skipped.", totemSlot, displayId);
1823 continue;
1824 }
1825
1826 _playerTotemModel[std::make_pair(totemSlot, Races(race))] = displayId;
1827 ++count;
1828 } while (result->NextRow());
1829
1830 LOG_INFO("server.loading", ">> Loaded {} player totem model records in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1831 LOG_INFO("server.loading", " ");
1832}
#define MAX_TOTEM_SLOT
Definition SharedDefines.h:3555
SummonSlot
Definition SharedDefines.h:3543
Races
Definition SharedDefines.h:69

References _playerTotemModel, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, MAX_TOTEM_SLOT, sChrRacesStore, sCreatureDisplayInfoStore, and WorldDatabase.

◆ LoadPointOfInterestLocales()

void ObjectMgr::LoadPointOfInterestLocales ( )
495{
496 uint32 oldMSTime = getMSTime();
497
498 _pointOfInterestLocaleStore.clear(); // need for reload case
499
500 // 0 1 2
501 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name FROM points_of_interest_locale");
502
503 if (!result)
504 return;
505
506 do
507 {
508 Field* fields = result->Fetch();
509
510 uint32 ID = fields[0].Get<uint32>();
511
512 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
513 if (locale == LOCALE_enUS)
514 continue;
515
517 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
518 } while (result->NextRow());
519
520 LOG_INFO("server.loading", ">> Loaded {} Points Of Interest Locale Strings in {} ms", (uint32)_pointOfInterestLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
521}
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 ( )
8496{
8497 uint32 oldMSTime = getMSTime();
8498
8499 _pointsOfInterestStore.clear(); // need for reload case
8500
8501 uint32 count = 0;
8502
8503 // 0 1 2 3 4 5 6
8504 QueryResult result = WorldDatabase.Query("SELECT ID, PositionX, PositionY, Icon, Flags, Importance, Name FROM points_of_interest");
8505
8506 if (!result)
8507 {
8508 LOG_WARN("server.loading", ">> Loaded 0 Points of Interest definitions. DB table `points_of_interest` is empty.");
8509 LOG_INFO("server.loading", " ");
8510 return;
8511 }
8512
8513 do
8514 {
8515 Field* fields = result->Fetch();
8516
8517 uint32 point_id = fields[0].Get<uint32>();
8518
8519 PointOfInterest POI;
8520 POI.ID = point_id;
8521 POI.PositionX = fields[1].Get<float>();
8522 POI.PositionY = fields[2].Get<float>();
8523 POI.Icon = fields[3].Get<uint32>();
8524 POI.Flags = fields[4].Get<uint32>();
8525 POI.Importance = fields[5].Get<uint32>();
8526 POI.Name = fields[6].Get<std::string>();
8527
8528 if (!Acore::IsValidMapCoord(POI.PositionX, POI.PositionY))
8529 {
8530 LOG_ERROR("sql.sql", "Table `points_of_interest` (ID: {}) have invalid coordinates (X: {} Y: {}), ignored.", point_id, POI.PositionX, POI.PositionY);
8531 continue;
8532 }
8533
8534 _pointsOfInterestStore[point_id] = POI;
8535
8536 ++count;
8537 } while (result->NextRow());
8538
8539 LOG_INFO("server.loading", ">> Loaded {} Points of Interest Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8540 LOG_INFO("server.loading", " ");
8541}
bool IsValidMapCoord(float c)
Definition GridDefines.h:210
Definition ObjectMgr.h:592
uint32 ID
Definition ObjectMgr.h:593

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

◆ LoadProfanityNamesFromDB()

void ObjectMgr::LoadProfanityNamesFromDB ( )
9098{
9099 uint32 oldMSTime = getMSTime();
9100
9101 _profanityNamesStore.clear(); // need for reload case
9102
9103 QueryResult result = CharacterDatabase.Query("SELECT name FROM profanity_name");
9104
9105 if (!result)
9106 {
9107 LOG_WARN("server.loading", ">> Loaded 0 profanity names. DB table `profanity_name` is empty!");
9108 return;
9109 }
9110
9111 uint32 count = 0;
9112
9113 Field* fields;
9114 do
9115 {
9116 fields = result->Fetch();
9117 std::string name = fields[0].Get<std::string>();
9118
9119 std::wstring wstr;
9120 if (!Utf8toWStr (name, wstr))
9121 {
9122 LOG_ERROR("sql.sql", "Table `profanity_name` have invalid name: {}", name);
9123 continue;
9124 }
9125
9126 wstrToLower(wstr);
9127
9128 _profanityNamesStore.insert(wstr);
9129 ++count;
9130 } while (result->NextRow());
9131
9132 LOG_INFO("server.loading", ">> Loaded {} profanity names from DB in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9133}

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

◆ LoadProfanityNamesFromDBC()

void ObjectMgr::LoadProfanityNamesFromDBC ( )
9136{
9137 if (!sWorld->getBoolConfig(CONFIG_STRICT_NAMES_PROFANITY))
9138 {
9139 LOG_WARN("server.loading", ">> Loaded 0 profanity names from DBC. Config option disabled.");
9140 return;
9141 }
9142
9143 uint32 oldMSTime = getMSTime();
9144
9145 uint32 count = 0;
9146
9147 for (NamesProfanityEntry const* profanityStore : sNamesProfanityStore)
9148 {
9149 std::wstring wstr;
9150
9151 Utf8toWStr(profanityStore->Pattern, wstr);
9152
9153 // DBC does not have clean entries, remove the junk.
9154 boost::algorithm::replace_all(wstr, "\\<", "");
9155 boost::algorithm::replace_all(wstr, "\\>", "");
9156
9157 _profanityNamesStore.insert(wstr);
9158 count++;
9159 }
9160
9161 LOG_INFO("server.loading", ">> Loaded {} profanity names from DBC in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9162 LOG_INFO("server.loading", " ");
9163}
DBCStorage< NamesProfanityEntry > sNamesProfanityStore(NamesProfanityfmt)
@ CONFIG_STRICT_NAMES_PROFANITY
Definition WorldConfig.h:146
Definition DBCStructure.h:1405

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

◆ LoadQuestAreaTriggers()

void ObjectMgr::LoadQuestAreaTriggers ( )
6869{
6870 uint32 oldMSTime = getMSTime();
6871
6872 _questAreaTriggerStore.clear(); // need for reload case
6873
6874 QueryResult result = WorldDatabase.Query("SELECT id, quest FROM areatrigger_involvedrelation");
6875
6876 if (!result)
6877 {
6878 LOG_WARN("server.loading", ">> Loaded 0 quest trigger points. DB table `areatrigger_involvedrelation` is empty.");
6879 LOG_INFO("server.loading", " ");
6880 return;
6881 }
6882
6883 uint32 count = 0;
6884
6885 do
6886 {
6887 ++count;
6888
6889 Field* fields = result->Fetch();
6890
6891 uint32 trigger_ID = fields[0].Get<uint32>();
6892 uint32 quest_ID = fields[1].Get<uint32>();
6893
6894 AreaTrigger const* atEntry = GetAreaTrigger(trigger_ID);
6895 if (!atEntry)
6896 {
6897 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", trigger_ID);
6898 continue;
6899 }
6900
6901 Quest const* quest = GetQuestTemplate(quest_ID);
6902
6903 if (!quest)
6904 {
6905 LOG_ERROR("sql.sql", "Table `areatrigger_involvedrelation` has record (id: {}) for not existing quest {}", trigger_ID, quest_ID);
6906 continue;
6907 }
6908
6910 {
6911 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);
6912
6913 // this will prevent quest completing without objective
6914 const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
6915
6916 // continue; - quest modified to required objective and trigger can be allowed.
6917 }
6918
6919 _questAreaTriggerStore[trigger_ID] = quest_ID;
6920 } while (result->NextRow());
6921
6922 LOG_INFO("server.loading", ">> Loaded {} Quest Trigger Points in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6923 LOG_INFO("server.loading", " ");
6924}
@ 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 ( )
6945{
6946 uint32 oldMSTime = getMSTime();
6947
6948 _questGreetingStore.clear(); // For reload case
6949
6950 // 0 1 2 3 4
6951 QueryResult result = WorldDatabase.Query("SELECT ID, Type, GreetEmoteType, GreetEmoteDelay, Greeting FROM quest_greeting");
6952 if (!result)
6953 {
6954 LOG_WARN("server.loading", ">> Loaded 0 quest greetings. DB table `quest_greeting` is empty.");
6955 return;
6956 }
6957
6958 do
6959 {
6960 Field* fields = result->Fetch();
6961
6962 uint32 id = fields[0].Get<uint32>();
6963 uint8 type = fields[1].Get<uint8>();
6964 switch (type)
6965 {
6966 case 0: // Creature
6967 if (!GetCreatureTemplate(id))
6968 {
6969 LOG_ERROR("sql.sql", "Table `quest_greeting`: creature template entry {} does not exist.", id);
6970 continue;
6971 }
6972 break;
6973 case 1: // GameObject
6974 if (!GetGameObjectTemplate(id))
6975 {
6976 LOG_ERROR("sql.sql", "Table `quest_greeting`: gameobject template entry {} does not exist.", id);
6977 continue;
6978 }
6979 break;
6980 default:
6981 LOG_ERROR("sql.sql", "Table `quest_greeting` has unknown type {} for id {}, skipped.", type, id);
6982 continue;
6983 }
6984
6985 std::pair<uint32, uint8> pairKey = std::make_pair(id, type);
6986 QuestGreeting& data = _questGreetingStore[pairKey];
6987
6988 data.EmoteType = fields[2].Get<uint16>();
6989 data.EmoteDelay = fields[3].Get<uint32>();
6990 AddLocaleString(fields[4].Get<std::string>(), LOCALE_enUS, data.Greeting);
6991 }
6992 while (result->NextRow());
6993
6994 LOG_INFO("server.loading", ">> Loaded {} quest_greeting in {} ms", _questGreetingStore.size(), GetMSTimeDiffToNow(oldMSTime));
6995 LOG_INFO("server.loading", " ");
6996}
Definition ObjectMgr.h:603
uint32 EmoteDelay
Definition ObjectMgr.h:605
std::vector< std::string > Greeting
Definition ObjectMgr.h:606
uint16 EmoteType
Definition ObjectMgr.h:604

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

◆ LoadQuestGreetingsLocales()

void ObjectMgr::LoadQuestGreetingsLocales ( )
6999{
7000 uint32 oldMSTime = getMSTime();
7001
7002 // 0 1 2 3
7003 QueryResult result = WorldDatabase.Query("SELECT ID, Type, Locale, Greeting FROM quest_greeting_locale");
7004 if (!result)
7005 {
7006 LOG_WARN("server.loading", ">> Loaded 0 quest_greeting locales. DB table `quest_greeting_locale` is empty.");
7007 return;
7008 }
7009
7010 uint32 localeCount = 0;
7011 do
7012 {
7013 Field* fields = result->Fetch();
7014
7015 uint32 id = fields[0].Get<uint32>();
7016 uint8 type = fields[1].Get<uint8>();
7017 switch (type)
7018 {
7019 case 0: // Creature
7020 if (!GetCreatureTemplate(id))
7021 {
7022 LOG_ERROR("sql.sql", "Table `quest_greeting_locale`: creature template entry {} does not exist.", id);
7023 continue;
7024 }
7025 break;
7026 case 1: // GameObject
7027 if (!GetGameObjectTemplate(id))
7028 {
7029 LOG_ERROR("sql.sql", "Table `quest_greeting_locale`: gameobject template entry {} does not exist.", id);
7030 continue;
7031 }
7032 break;
7033 default:
7034 continue;
7035 }
7036
7037 std::pair<uint32, uint8> pairKey = std::make_pair(id, type);
7038 QuestGreeting& data = _questGreetingStore[pairKey];
7039
7040 QuestGreetingContainer::iterator qgc = _questGreetingStore.find(pairKey);
7041 if (qgc == _questGreetingStore.end())
7042 {
7043 LOG_ERROR("sql.sql", "QuestGreeting (Id: {} Type: {}) found in table `quest_greeting_locale` but does not exist in `quest_greeting`. Skipped!", id, type);
7044 continue;
7045 }
7046
7047 LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>());
7048 if (locale == LOCALE_enUS)
7049 continue;
7050
7051 AddLocaleString(fields[3].Get<std::string>(), locale, data.Greeting);
7052 localeCount++;
7053 } while (result->NextRow());
7054
7055 LOG_INFO("server.loading", ">> Loaded {} quest greeting Locale Strings in {} ms", localeCount, GetMSTimeDiffToNow(oldMSTime));
7056 LOG_INFO("server.loading", " ");
7057}

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

◆ LoadQuestLocales()

void ObjectMgr::LoadQuestLocales ( )
5829{
5830 uint32 oldMSTime = getMSTime();
5831
5832 _questLocaleStore.clear(); // need for reload case
5833
5834 // 0 1 2 3 4 5 6 7 8 9 10
5835 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Title, Details, Objectives, EndText, CompletedText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4 FROM quest_template_locale");
5836
5837 if (!result)
5838 return;
5839
5840 do
5841 {
5842 Field* fields = result->Fetch();
5843
5844 uint32 ID = fields[0].Get<uint32>();
5845
5846 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
5847 if (locale == LOCALE_enUS)
5848 continue;
5849
5850 QuestLocale& data = _questLocaleStore[ID];
5851 AddLocaleString(fields[2].Get<std::string>(), locale, data.Title);
5852 AddLocaleString(fields[3].Get<std::string>(), locale, data.Details);
5853 AddLocaleString(fields[4].Get<std::string>(), locale, data.Objectives);
5854 AddLocaleString(fields[5].Get<std::string>(), locale, data.AreaDescription);
5855 AddLocaleString(fields[6].Get<std::string>(), locale, data.CompletedText);
5856
5857 for (uint8 i = 0; i < 4; ++i)
5858 AddLocaleString(fields[i + 7].Get<std::string>(), locale, data.ObjectiveText[i]);
5859 } while (result->NextRow());
5860
5861 LOG_INFO("server.loading", ">> Loaded {} Quest Locale Strings in {} ms", (uint32)_questLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
5862}
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 ( )
11134{
11135 uint32 oldMSTime = getMSTime();
11136
11137 _questMoneyRewards.clear();
11138
11139 // 0 1 2 3 4 5 6 7 8 9 10
11140 QueryResult result = WorldDatabase.Query("SELECT `Level`, Money0, Money1, Money2, Money3, Money4, Money5, Money6, Money7, Money8, Money9 FROM `quest_money_reward` ORDER BY `Level`");
11141 if (!result)
11142 {
11143 LOG_WARN("server.loading", ">> Loaded 0 quest money rewards. DB table `quest_money_reward` is empty.");
11144 return;
11145 }
11146
11147 uint32 count = 0;
11148 do
11149 {
11150 Field* fields = result->Fetch();
11151 uint32 Level = fields[0].Get<uint32>();
11152
11153 QuestMoneyRewardArray& questMoneyReward = _questMoneyRewards[Level];
11154 questMoneyReward.fill(0);
11155
11156 for (uint8 i = 0; i < MAX_QUEST_MONEY_REWARDS; ++i)
11157 {
11158 questMoneyReward[i] = fields[1 + i].Get<uint32>();
11159 ++count;
11160 }
11161 } while (result->NextRow());
11162
11163 LOG_INFO("server.loading", ">> Loaded {} Quest Money Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
11164 LOG_INFO("server.loading", " ");
11165}
std::array< uint32, MAX_QUEST_MONEY_REWARDS > QuestMoneyRewardArray
Definition ObjectMgr.h:722

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

◆ LoadQuestOfferRewardLocale()

void ObjectMgr::LoadQuestOfferRewardLocale ( )
7060{
7061 uint32 oldMSTime = getMSTime();
7062
7063 _questOfferRewardLocaleStore.clear(); // need for reload case
7064
7065 // 0 1 2
7066 QueryResult result = WorldDatabase.Query("SELECT Id, locale, RewardText FROM quest_offer_reward_locale");
7067 if (!result)
7068 return;
7069
7070 do
7071 {
7072 Field* fields = result->Fetch();
7073
7074 uint32 id = fields[0].Get<uint32>();
7075 std::string localeName = fields[1].Get<std::string>();
7076
7077 LocaleConstant locale = GetLocaleByName(localeName);
7078 if (locale == LOCALE_enUS)
7079 continue;
7080
7082 AddLocaleString(fields[2].Get<std::string>(), locale, data.RewardText);
7083 } while (result->NextRow());
7084
7085 LOG_INFO("server.loading", ">> Loaded {} Quest Offer Reward Locale Strings in {} ms", _questOfferRewardLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
7086}
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 ( )
8544{
8545 if (!sWorld->getBoolConfig(CONFIG_QUEST_POI_ENABLED))
8546 {
8547 LOG_INFO("server.loading", ">> Loaded 0 quest POI definitions. Disabled by config.");
8548 LOG_INFO("server.loading", " ");
8549 return;
8550 }
8551
8552 uint32 oldMSTime = getMSTime();
8553
8554 _questPOIStore.clear(); // need for reload case
8555
8556 uint32 count = 0;
8557
8558 // 0 1 2 3 4 5 6 7
8559 QueryResult result = WorldDatabase.Query("SELECT QuestID, id, ObjectiveIndex, MapID, WorldMapAreaId, Floor, Priority, Flags FROM quest_poi order by QuestID");
8560
8561 if (!result)
8562 {
8563 LOG_WARN("server.loading", ">> Loaded 0 quest POI definitions. DB table `quest_poi` is empty.");
8564 LOG_INFO("server.loading", " ");
8565 return;
8566 }
8567
8568 // 0 1 2 3
8569 QueryResult points = WorldDatabase.Query("SELECT QuestID, Idx1, X, Y FROM quest_poi_points ORDER BY QuestID DESC, Idx2");
8570
8571 std::vector<std::vector<std::vector<QuestPOIPoint> > > POIs;
8572
8573 if (points)
8574 {
8575 // The first result should have the highest questId
8576 Field* fields = points->Fetch();
8577 uint32 questIdMax = fields[0].Get<uint32>();
8578 POIs.resize(questIdMax + 1);
8579
8580 do
8581 {
8582 fields = points->Fetch();
8583
8584 uint32 questId = fields[0].Get<uint32>();
8585 uint32 id = fields[1].Get<uint32>();
8586 int32 x = fields[2].Get<int32>();
8587 int32 y = fields[3].Get<int32>();
8588
8589 if (POIs[questId].size() <= id + 1)
8590 POIs[questId].resize(id + 10);
8591
8592 QuestPOIPoint point(x, y);
8593 POIs[questId][id].push_back(point);
8594 } while (points->NextRow());
8595 }
8596
8597 do
8598 {
8599 Field* fields = result->Fetch();
8600
8601 uint32 questId = fields[0].Get<uint32>();
8602 uint32 id = fields[1].Get<uint32>();
8603 int32 objIndex = fields[2].Get<int32>();
8604 uint32 mapId = fields[3].Get<uint32>();
8605 uint32 WorldMapAreaId = fields[4].Get<uint32>();
8606 uint32 FloorId = fields[5].Get<uint32>();
8607 uint32 unk3 = fields[6].Get<uint32>();
8608 uint32 unk4 = fields[7].Get<uint32>();
8609
8610 QuestPOI POI(id, objIndex, mapId, WorldMapAreaId, FloorId, unk3, unk4);
8611 if (questId < POIs.size() && id < POIs[questId].size())
8612 {
8613 POI.points = POIs[questId][id];
8614 _questPOIStore[questId].push_back(POI);
8615 }
8616 else
8617 LOG_ERROR("sql.sql", "Table quest_poi references unknown quest points for quest {} POI id {}", questId, id);
8618
8619 ++count;
8620 } while (result->NextRow());
8621
8622 LOG_INFO("server.loading", ">> Loaded {} Quest POI definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8623 LOG_INFO("server.loading", " ");
8624}
@ CONFIG_QUEST_POI_ENABLED
Definition WorldConfig.h:139
Definition ObjectMgr.h:642
Definition ObjectMgr.h:651

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
8894{
8895 uint32 oldMSTime = getMSTime();
8896
8897 map.clear(); // need for reload case
8898
8899 uint32 count = 0;
8900
8901 QueryResult result = WorldDatabase.Query("SELECT id, quest, pool_entry FROM {} qr LEFT JOIN pool_quest pq ON qr.quest = pq.entry", table);
8902
8903 if (!result)
8904 {
8905 LOG_WARN("server.loading", ">> Loaded 0 quest relations from `{}`, table is empty.", table);
8906 LOG_INFO("server.loading", " ");
8907 return;
8908 }
8909
8910 PooledQuestRelation* poolRelationMap = go ? &sPoolMgr->mQuestGORelation : &sPoolMgr->mQuestCreatureRelation;
8911 if (starter)
8912 poolRelationMap->clear();
8913
8914 do
8915 {
8916 uint32 id = result->Fetch()[0].Get<uint32>();
8917 uint32 quest = result->Fetch()[1].Get<uint32>();
8918 uint32 poolId = result->Fetch()[2].Get<uint32>();
8919
8920 if (_questTemplates.find(quest) == _questTemplates.end())
8921 {
8922 LOG_ERROR("sql.sql", "Table `{}`: Quest {} listed for entry {} does not exist.", table, quest, id);
8923 continue;
8924 }
8925
8926 if (!poolId || !starter)
8927 map.insert(QuestRelations::value_type(id, quest));
8928 else if (starter)
8929 poolRelationMap->insert(PooledQuestRelation::value_type(quest, id));
8930
8931 ++count;
8932 } while (result->NextRow());
8933
8934 LOG_INFO("server.loading", ">> Loaded {} Quest Relations From {} in {} ms", count, table, GetMSTimeDiffToNow(oldMSTime));
8935 LOG_INFO("server.loading", " ");
8936}
#define sPoolMgr
Definition PoolMgr.h:177
std::multimap< uint32, uint32 > PooledQuestRelation
Definition PoolMgr.h:101

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

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

◆ LoadQuestRequestItemsLocale()

void ObjectMgr::LoadQuestRequestItemsLocale ( )
7089{
7090 uint32 oldMSTime = getMSTime();
7091
7092 _questRequestItemsLocaleStore.clear(); // need for reload case
7093
7094 // 0 1 2
7095 QueryResult result = WorldDatabase.Query("SELECT Id, locale, CompletionText FROM quest_request_items_locale");
7096 if (!result)
7097 return;
7098
7099 do
7100 {
7101 Field* fields = result->Fetch();
7102
7103 uint32 id = fields[0].Get<uint32>();
7104 std::string localeName = fields[1].Get<std::string>();
7105
7106 LocaleConstant locale = GetLocaleByName(localeName);
7107 if (locale == LOCALE_enUS)
7108 continue;
7109
7111 AddLocaleString(fields[2].Get<std::string>(), locale, data.CompletionText);
7112 } while (result->NextRow());
7113
7114 LOG_INFO("server.loading", ">> Loaded {} Quest Request Items Locale Strings in {} ms", _questRequestItemsLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
7115}
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 ( )
5019{
5020 uint32 oldMSTime = getMSTime();
5021
5022 // For reload case
5023 for (QuestMap::const_iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
5024 delete itr->second;
5025 _questTemplates.clear();
5026
5027 mExclusiveQuestGroups.clear();
5028
5029 QueryResult result = WorldDatabase.Query("SELECT "
5030 //0 1 2 3 4 5 6 7 8
5031 "ID, QuestType, QuestLevel, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, TimeAllowed, AllowableRaces,"
5032 // 9 10 11 12
5033 "RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, "
5034 // 13 14 15 16 17 18 19 20
5035 "RewardNextQuest, RewardXPDifficulty, RewardMoney, RewardMoneyDifficulty, RewardDisplaySpell, RewardSpell, RewardHonor, RewardKillHonor, "
5036 // 21 22 23 24 25 26
5037 "StartItem, Flags, RewardTitle, RequiredPlayerKills, RewardTalents, RewardArenaPoints, "
5038 // 27 28 29 30 31 32 33 34
5039 "RewardItem1, RewardAmount1, RewardItem2, RewardAmount2, RewardItem3, RewardAmount3, RewardItem4, RewardAmount4, "
5040 // 35 36 37 38 39 40 41 42 43 44 45 46
5041 "RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemID6, RewardChoiceItemQuantity6, "
5042 // 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
5043 "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionID5, RewardFactionValue5, RewardFactionOverride5,"
5044 // 61 63 64 65
5045 "POIContinent, POIx, POIy, POIPriority, "
5046 // 66 67 68 69 70
5047 "LogTitle, LogDescription, QuestDescription, AreaDescription, QuestCompletionLog, "
5048 // 71 72 73 74 75 76 77 78
5049 "RequiredNpcOrGo1, RequiredNpcOrGo2, RequiredNpcOrGo3, RequiredNpcOrGo4, RequiredNpcOrGoCount1, RequiredNpcOrGoCount2, RequiredNpcOrGoCount3, RequiredNpcOrGoCount4, "
5050 // 79 80 81 82 83 84 85 86
5051 "ItemDrop1, ItemDrop2, ItemDrop3, ItemDrop4, ItemDropQuantity1, ItemDropQuantity2, ItemDropQuantity3, ItemDropQuantity4, "
5052 // 87 88 89 90 91 92 93 94 95 96 97 98
5053 "RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, "
5054 // 99 100 101 102 103
5055 "Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4"
5056 " FROM quest_template");
5057 if (!result)
5058 {
5059 LOG_WARN("server.loading", ">> Loaded 0 quests definitions. DB table `quest_template` is empty.");
5060 LOG_INFO("server.loading", " ");
5061 return;
5062 }
5063
5064 // create multimap previous quest for each existed quest
5065 // some quests can have many previous maps set by NextQuestId in previous quest
5066 // for example set of race quests can lead to single not race specific quest
5067 do
5068 {
5069 Field* fields = result->Fetch();
5070
5071 Quest* newQuest = new Quest(fields);
5072 _questTemplates[newQuest->GetQuestId()] = newQuest;
5073 } while (result->NextRow());
5074
5075 // pussywizard:
5076 {
5077 uint32 max = 0;
5078 for (QuestMap::const_iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
5079 if (itr->first > max)
5080 max = itr->first;
5081 if (max)
5082 {
5083 _questTemplatesFast.clear();
5084 _questTemplatesFast.resize(max + 1, nullptr);
5085 for (QuestMap::iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
5086 _questTemplatesFast[itr->first] = itr->second;
5087 }
5088 }
5089
5090 for (QuestMap::iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
5091 itr->second->InitializeQueryData();
5092
5093 std::map<uint32, uint32> usedMailTemplates;
5094
5095 // Load `quest_details`
5096 // 0 1 2 3 4 5 6 7 8
5097 result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4 FROM quest_details");
5098
5099 if (!result)
5100 {
5101 LOG_WARN("server.loading", ">> Loaded 0 quest details. DB table `quest_details` is empty.");
5102 }
5103 else
5104 {
5105 do
5106 {
5107 Field* fields = result->Fetch();
5108 uint32 questId = fields[0].Get<uint32>();
5109
5110 auto itr = _questTemplates.find(questId);
5111 if (itr != _questTemplates.end())
5112 itr->second->LoadQuestDetails(fields);
5113 else
5114 LOG_ERROR("sql.sql", "Table `quest_details` has data for quest {} but such quest does not exist", questId);
5115 } while (result->NextRow());
5116 }
5117
5118 // Load `quest_request_items`
5119 // 0 1 2 3
5120 result = WorldDatabase.Query("SELECT ID, EmoteOnComplete, EmoteOnIncomplete, CompletionText FROM quest_request_items");
5121
5122 if (!result)
5123 {
5124 LOG_WARN("server.loading", ">> Loaded 0 quest request items. DB table `quest_request_items` is empty.");
5125 }
5126 else
5127 {
5128 do
5129 {
5130 Field* fields = result->Fetch();
5131 uint32 questId = fields[0].Get<uint32>();
5132
5133 auto itr = _questTemplates.find(questId);
5134 if (itr != _questTemplates.end())
5135 itr->second->LoadQuestRequestItems(fields);
5136 else
5137 LOG_ERROR("sql.sql", "Table `quest_request_items` has data for quest {} but such quest does not exist", questId);
5138 } while (result->NextRow());
5139 }
5140
5141 // Load `quest_offer_reward`
5142 // 0 1 2 3 4 5 6 7 8 9
5143 result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4, RewardText FROM quest_offer_reward");
5144
5145 if (!result)
5146 {
5147 LOG_WARN("server.loading", ">> Loaded 0 quest reward emotes. DB table `quest_offer_reward` is empty.");
5148 }
5149 else
5150 {
5151 do
5152 {
5153 Field* fields = result->Fetch();
5154 uint32 questId = fields[0].Get<uint32>();
5155
5156 auto itr = _questTemplates.find(questId);
5157 if (itr != _questTemplates.end())
5158 itr->second->LoadQuestOfferReward(fields);
5159 else
5160 LOG_ERROR("sql.sql", "Table `quest_offer_reward` has data for quest {} but such quest does not exist", questId);
5161 } while (result->NextRow());
5162 }
5163
5164 // Load `quest_template_addon`
5165 // 0 1 2 3 4 5 6 7 8
5166 result = WorldDatabase.Query("SELECT ID, MaxLevel, AllowableClasses, SourceSpellID, PrevQuestID, NextQuestID, ExclusiveGroup, BreadcrumbForQuestId, RewardMailTemplateID, "
5167 //9 10 11 12 13 14 15 16 17 18
5168 "RewardMailDelay, RequiredSkillID, RequiredSkillPoints, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, ProvidedItemCount, RewardMailSenderEntry, SpecialFlags FROM quest_template_addon LEFT JOIN quest_mail_sender ON Id=QuestId");
5169
5170 if (!result)
5171 {
5172 LOG_WARN("server.loading", ">> Loaded 0 quest template addons. DB table `quest_template_addon` is empty.");
5173 }
5174 else
5175 {
5176 do
5177 {
5178 Field* fields = result->Fetch();
5179 uint32 questId = fields[0].Get<uint32>();
5180
5181 auto itr = _questTemplates.find(questId);
5182 if (itr != _questTemplates.end())
5183 itr->second->LoadQuestTemplateAddon(fields);
5184 else
5185 LOG_ERROR("sql.sql", "Table `quest_template_addon` has data for quest {} but such quest does not exist", questId);
5186 } while (result->NextRow());
5187 }
5188
5189 // Post processing
5190 for (QuestMap::iterator iter = _questTemplates.begin(); iter != _questTemplates.end(); ++iter)
5191 {
5192 // skip post-loading checks for disabled quests
5193 if (sDisableMgr->IsDisabledFor(DISABLE_TYPE_QUEST, iter->first, nullptr))
5194 continue;
5195
5196 Quest* qinfo = iter->second;
5197
5198 // additional quest integrity checks (GO, creature_template and item_template must be loaded already)
5199
5200 if (qinfo->GetQuestMethod() >= 3)
5201 LOG_ERROR("sql.sql", "Quest {} has `Method` = {}, expected values are 0, 1 or 2.", qinfo->GetQuestId(), qinfo->GetQuestMethod());
5202
5204 {
5205 LOG_ERROR("sql.sql", "Quest {} has `SpecialFlags` = {} > max allowed value. Correct `SpecialFlags` to value <= {}",
5208 }
5209
5210 if (qinfo->Flags & QUEST_FLAGS_DAILY && qinfo->Flags & QUEST_FLAGS_WEEKLY)
5211 {
5212 LOG_ERROR("sql.sql", "Weekly Quest {} is marked as daily quest in `Flags`, removed daily flag.", qinfo->GetQuestId());
5213 qinfo->Flags &= ~QUEST_FLAGS_DAILY;
5214 }
5215
5216 if (qinfo->Flags & QUEST_FLAGS_DAILY)
5217 {
5219 {
5220 LOG_ERROR("sql.sql", "Daily Quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
5222 }
5223 }
5224
5225 if (qinfo->Flags & QUEST_FLAGS_WEEKLY)
5226 {
5228 {
5229 LOG_ERROR("sql.sql", "Weekly Quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
5231 }
5232 }
5233
5235 {
5237 {
5238 LOG_ERROR("sql.sql", "Monthly quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
5240 }
5241 }
5242
5243 if (qinfo->Flags & QUEST_FLAGS_TRACKING)
5244 {
5245 // at auto-reward can be rewarded only RewardChoiceItemId[0]
5246 for (int j = 1; j < QUEST_REWARD_CHOICES_COUNT; ++j )
5247 {
5248 if (uint32 id = qinfo->RewardChoiceItemId[j])
5249 {
5250 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but item from `RewardChoiceItemId{}` can't be rewarded with quest flag QUEST_FLAGS_TRACKING.",
5251 qinfo->GetQuestId(), j + 1, id, j + 1);
5252 // no changes, quest ignore this data
5253 }
5254 }
5255 }
5256
5257 // client quest log visual (area case)
5258 if (qinfo->ZoneOrSort > 0)
5259 {
5260 if (!sAreaTableStore.LookupEntry(qinfo->ZoneOrSort))
5261 {
5262 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} (zone case) but zone with this id does not exist.",
5263 qinfo->GetQuestId(), qinfo->ZoneOrSort);
5264 // no changes, quest not dependent from this value but can have problems at client
5265 }
5266 }
5267 // client quest log visual (sort case)
5268 if (qinfo->ZoneOrSort < 0)
5269 {
5270 QuestSortEntry const* qSort = sQuestSortStore.LookupEntry(-int32(qinfo->ZoneOrSort));
5271 if (!qSort)
5272 {
5273 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} (sort case) but quest sort with this id does not exist.",
5274 qinfo->GetQuestId(), qinfo->ZoneOrSort);
5275 // 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)
5276 }
5277 //check for proper RequiredSkillId value (skill case)
5278 if (uint32 skill_id = SkillByQuestSort(-int32(qinfo->ZoneOrSort)))
5279 {
5280 if (qinfo->RequiredSkillId != skill_id)
5281 {
5282 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} but `RequiredSkillId` does not have a corresponding value ({}).",
5283 qinfo->GetQuestId(), qinfo->ZoneOrSort, skill_id);
5284 //override, and force proper value here?
5285 }
5286 }
5287 }
5288
5289 // RequiredClasses, can be 0/CLASSMASK_ALL_PLAYABLE to allow any class
5290 if (qinfo->RequiredClasses)
5291 {
5293 {
5294 LOG_ERROR("sql.sql", "Quest {} does not contain any playable classes in `RequiredClasses` ({}), value set to 0 (all classes).", qinfo->GetQuestId(), qinfo->RequiredClasses);
5295 qinfo->RequiredClasses = 0;
5296 }
5297 }
5298 // AllowableRaces, can be 0/PlayableRaceMask to allow any race
5299 if (qinfo->AllowableRaces)
5300 {
5301 if (!(qinfo->AllowableRaces & sRaceMgr->GetPlayableRaceMask()))
5302 {
5303 LOG_ERROR("sql.sql", "Quest {} does not contain any playable races in `AllowableRaces` ({}), value set to 0 (all races).", qinfo->GetQuestId(), qinfo->AllowableRaces);
5304 qinfo->AllowableRaces = 0;
5305 }
5306 }
5307 // RequiredSkillId, can be 0
5308 if (qinfo->RequiredSkillId)
5309 {
5310 if (!sSkillLineStore.LookupEntry(qinfo->RequiredSkillId))
5311 {
5312 LOG_ERROR("sql.sql", "Quest {} has `RequiredSkillId` = {} but this skill does not exist",
5313 qinfo->GetQuestId(), qinfo->RequiredSkillId);
5314 }
5315 }
5316
5317 if (qinfo->RequiredSkillPoints)
5318 {
5319 if (qinfo->RequiredSkillPoints > sWorld->GetConfigMaxSkillValue())
5320 {
5321 LOG_ERROR("sql.sql", "Quest {} has `RequiredSkillPoints` = {} but max possible skill is {}, quest can't be done.",
5322 qinfo->GetQuestId(), qinfo->RequiredSkillPoints, sWorld->GetConfigMaxSkillValue());
5323 // no changes, quest can't be done for this requirement
5324 }
5325 }
5326 // else Skill quests can have 0 skill level, this is ok
5327
5328 if (qinfo->RequiredFactionId2 && !sFactionStore.LookupEntry(qinfo->RequiredFactionId2))
5329 {
5330 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionId2` = {} but faction template {} does not exist, quest can't be done.",
5331 qinfo->GetQuestId(), qinfo->RequiredFactionId2, qinfo->RequiredFactionId2);
5332 // no changes, quest can't be done for this requirement
5333 }
5334
5335 if (qinfo->RequiredFactionId1 && !sFactionStore.LookupEntry(qinfo->RequiredFactionId1))
5336 {
5337 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionId1` = {} but faction template {} does not exist, quest can't be done.",
5338 qinfo->GetQuestId(), qinfo->RequiredFactionId1, qinfo->RequiredFactionId1);
5339 // no changes, quest can't be done for this requirement
5340 }
5341
5342 if (qinfo->RequiredMinRepFaction && !sFactionStore.LookupEntry(qinfo->RequiredMinRepFaction))
5343 {
5344 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepFaction` = {} but faction template {} does not exist, quest can't be done.",
5345 qinfo->GetQuestId(), qinfo->RequiredMinRepFaction, qinfo->RequiredMinRepFaction);
5346 // no changes, quest can't be done for this requirement
5347 }
5348
5349 if (qinfo->RequiredMaxRepFaction && !sFactionStore.LookupEntry(qinfo->RequiredMaxRepFaction))
5350 {
5351 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepFaction` = {} but faction template {} does not exist, quest can't be done.",
5352 qinfo->GetQuestId(), qinfo->RequiredMaxRepFaction, qinfo->RequiredMaxRepFaction);
5353 // no changes, quest can't be done for this requirement
5354 }
5355
5357 {
5358 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepValue` = {} but max reputation is {}, quest can't be done.",
5360 // no changes, quest can't be done for this requirement
5361 }
5362
5363 if (qinfo->RequiredMinRepValue && qinfo->RequiredMaxRepValue && qinfo->RequiredMaxRepValue <= qinfo->RequiredMinRepValue)
5364 {
5365 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepValue` = {} and `RequiredMinRepValue` = {}, quest can't be done.",
5366 qinfo->GetQuestId(), qinfo->RequiredMaxRepValue, qinfo->RequiredMinRepValue);
5367 // no changes, quest can't be done for this requirement
5368 }
5369
5370 if (!qinfo->RequiredFactionId1 && qinfo->RequiredFactionValue1 != 0)
5371 {
5372 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionValue1` = {} but `RequiredFactionId1` is 0, value has no effect",
5373 qinfo->GetQuestId(), qinfo->RequiredFactionValue1);
5374 // warning
5375 }
5376
5377 if (!qinfo->RequiredFactionId2 && qinfo->RequiredFactionValue2 != 0)
5378 {
5379 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionValue2` = {} but `RequiredFactionId2` is 0, value has no effect",
5380 qinfo->GetQuestId(), qinfo->RequiredFactionValue2);
5381 // warning
5382 }
5383
5384 if (!qinfo->RequiredMinRepFaction && qinfo->RequiredMinRepValue != 0)
5385 {
5386 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepValue` = {} but `RequiredMinRepFaction` is 0, value has no effect",
5387 qinfo->GetQuestId(), qinfo->RequiredMinRepValue);
5388 // warning
5389 }
5390
5391 if (!qinfo->RequiredMaxRepFaction && qinfo->RequiredMaxRepValue != 0)
5392 {
5393 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepValue` = {} but `RequiredMaxRepFaction` is 0, value has no effect",
5394 qinfo->GetQuestId(), qinfo->RequiredMaxRepValue);
5395 // warning
5396 }
5397
5398 if (qinfo->RewardTitleId && !sCharTitlesStore.LookupEntry(qinfo->RewardTitleId))
5399 {
5400 LOG_ERROR("sql.sql", "Quest {} has `RewardTitleId` = {} but CharTitle Id {} does not exist, quest can't be rewarded with title.",
5401 qinfo->GetQuestId(), qinfo->GetCharTitleId(), qinfo->GetCharTitleId());
5402 qinfo->RewardTitleId = 0;
5403 // quest can't reward this title
5404 }
5405
5406 if (qinfo->StartItem)
5407 {
5408 if (!GetItemTemplate(qinfo->StartItem))
5409 {
5410 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = {} but item with entry {} does not exist, quest can't be done.",
5411 qinfo->GetQuestId(), qinfo->StartItem, qinfo->StartItem);
5412 qinfo->StartItem = 0; // quest can't be done for this requirement
5413 }
5414 else if (qinfo->StartItemCount == 0)
5415 {
5416 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = {} but `StartItemCount` = 0, set to 1 but need fix in DB.",
5417 qinfo->GetQuestId(), qinfo->StartItem);
5418 qinfo->StartItemCount = 1; // update to 1 for allow quest work for backward compatibility with DB
5419 }
5420 }
5421 else if (qinfo->StartItemCount > 0)
5422 {
5423 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = 0 but `StartItemCount` = {}, useless value.",
5424 qinfo->GetQuestId(), qinfo->StartItemCount);
5425 qinfo->StartItemCount = 0; // no quest work changes in fact
5426 }
5427
5428 if (qinfo->SourceSpellid)
5429 {
5430 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->SourceSpellid);
5431 if (!spellInfo)
5432 {
5433 LOG_ERROR("sql.sql", "Quest {} has `SourceSpellid` = {} but spell {} doesn't exist, quest can't be done.",
5434 qinfo->GetQuestId(), qinfo->SourceSpellid, qinfo->SourceSpellid);
5435 qinfo->SourceSpellid = 0; // quest can't be done for this requirement
5436 }
5437 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5438 {
5439 LOG_ERROR("sql.sql", "Quest {} has `SourceSpellid` = {} but spell {} is broken, quest can't be done.",
5440 qinfo->GetQuestId(), qinfo->SourceSpellid, qinfo->SourceSpellid);
5441 qinfo->SourceSpellid = 0; // quest can't be done for this requirement
5442 }
5443 }
5444
5445 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
5446 {
5447 uint32 id = qinfo->RequiredItemId[j];
5448 if (id)
5449 {
5450 if (qinfo->RequiredItemCount[j] == 0)
5451 {
5452 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = {} but `RequiredItemCount{}` = 0, quest can't be done.",
5453 qinfo->GetQuestId(), j + 1, id, j + 1);
5454 // no changes, quest can't be done for this requirement
5455 }
5456
5458
5459 if (!GetItemTemplate(id))
5460 {
5461 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = {} but item with entry {} does not exist, quest can't be done.",
5462 qinfo->GetQuestId(), j + 1, id, id);
5463 qinfo->RequiredItemCount[j] = 0; // prevent incorrect work of quest
5464 }
5465 }
5466 else if (qinfo->RequiredItemCount[j] > 0)
5467 {
5468 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = 0 but `RequiredItemCount{}` = {}, quest can't be done.",
5469 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RequiredItemCount[j]);
5470 qinfo->RequiredItemCount[j] = 0; // prevent incorrect work of quest
5471 }
5472 }
5473
5474 for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
5475 {
5476 uint32 id = qinfo->ItemDrop[j];
5477 if (id)
5478 {
5479 if (!GetItemTemplate(id))
5480 {
5481 LOG_ERROR("sql.sql", "Quest {} has `ItemDrop{}` = {} but item with entry {} does not exist, quest can't be done.",
5482 qinfo->GetQuestId(), j + 1, id, id);
5483 // no changes, quest can't be done for this requirement
5484 }
5485 }
5486 else
5487 {
5488 if (qinfo->ItemDropQuantity[j] > 0)
5489 {
5490 LOG_ERROR("sql.sql", "Quest {} has `ItemDrop{}` = 0 but `ItemDropQuantity{}` = {}.",
5491 qinfo->GetQuestId(), j + 1, j + 1, qinfo->ItemDropQuantity[j]);
5492 // no changes, quest ignore this data
5493 }
5494 }
5495 }
5496
5497 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
5498 {
5499 int32 id = qinfo->RequiredNpcOrGo[j];
5500 if (id < 0 && !GetGameObjectTemplate(-id))
5501 {
5502 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but gameobject {} does not exist, quest can't be done.",
5503 qinfo->GetQuestId(), j + 1, id, uint32(-id));
5504 qinfo->RequiredNpcOrGo[j] = 0; // quest can't be done for this requirement
5505 }
5506
5507 if (id > 0 && !GetCreatureTemplate(id))
5508 {
5509 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but creature with entry {} does not exist, quest can't be done.",
5510 qinfo->GetQuestId(), j + 1, id, uint32(id));
5511 qinfo->RequiredNpcOrGo[j] = 0; // quest can't be done for this requirement
5512 }
5513
5514 if (id)
5515 {
5516 // In fact SpeakTo and Kill are quite same: either you can speak to mob:SpeakTo or you can't:Kill/Cast
5517
5519
5520 if (!qinfo->RequiredNpcOrGoCount[j])
5521 {
5522 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but `RequiredNpcOrGoCount{}` = 0, quest can't be done.",
5523 qinfo->GetQuestId(), j + 1, id, j + 1);
5524 // no changes, quest can be incorrectly done, but we already report this
5525 }
5526 }
5527 else if (qinfo->RequiredNpcOrGoCount[j] > 0)
5528 {
5529 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = 0 but `RequiredNpcOrGoCount{}` = {}.",
5530 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RequiredNpcOrGoCount[j]);
5531 // no changes, quest ignore this data
5532 }
5533 }
5534
5535 for (uint8 j = 0; j < QUEST_REWARD_CHOICES_COUNT; ++j)
5536 {
5537 uint32 id = qinfo->RewardChoiceItemId[j];
5538 if (id)
5539 {
5540 if (!GetItemTemplate(id))
5541 {
5542 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but item with entry {} does not exist, quest will not reward this item.",
5543 qinfo->GetQuestId(), j + 1, id, id);
5544 qinfo->RewardChoiceItemId[j] = 0; // no changes, quest will not reward this
5545 }
5546
5547 if (!qinfo->RewardChoiceItemCount[j])
5548 {
5549 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but `RewardChoiceItemCount{}` = 0, quest can't be done.",
5550 qinfo->GetQuestId(), j + 1, id, j + 1);
5551 // no changes, quest can't be done
5552 }
5553 }
5554 else if (qinfo->RewardChoiceItemCount[j] > 0)
5555 {
5556 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = 0 but `RewardChoiceItemCount{}` = {}.",
5557 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardChoiceItemCount[j]);
5558 // no changes, quest ignore this data
5559 }
5560 }
5561
5562 for (uint8 j = 0; j < QUEST_REWARDS_COUNT; ++j)
5563 {
5564 if (!qinfo->RewardItemId[0] && qinfo->RewardItemId[j])
5565 {
5566 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId1` but has `RewardItem{}`. Reward item will not be loaded.",
5567 qinfo->GetQuestId(), j + 1);
5568 }
5569 if (!qinfo->RewardItemId[1] && j > 1 && qinfo->RewardItemId[j])
5570 {
5571 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId2` but has `RewardItem{}`. Reward item will not be loaded.",
5572 qinfo->GetQuestId(), j + 1);
5573 }
5574 if (!qinfo->RewardItemId[2] && j > 2 && qinfo->RewardItemId[j])
5575 {
5576 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId3` but has `RewardItem{}`. Reward item will not be loaded.",
5577 qinfo->GetQuestId(), j + 1);
5578 }
5579 }
5580
5581 for (uint8 j = 0; j < QUEST_REWARDS_COUNT; ++j)
5582 {
5583 uint32 id = qinfo->RewardItemId[j];
5584 if (id)
5585 {
5586 if (!GetItemTemplate(id))
5587 {
5588 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = {} but item with entry {} does not exist, quest will not reward this item.",
5589 qinfo->GetQuestId(), j + 1, id, id);
5590 qinfo->RewardItemId[j] = 0; // no changes, quest will not reward this item
5591 }
5592
5593 if (!qinfo->RewardItemIdCount[j])
5594 {
5595 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = {} but `RewardItemIdCount{}` = 0, quest will not reward this item.",
5596 qinfo->GetQuestId(), j + 1, id, j + 1);
5597 // no changes
5598 }
5599 }
5600 else if (qinfo->RewardItemIdCount[j] > 0)
5601 {
5602 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = 0 but `RewardItemIdCount{}` = {}.",
5603 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardItemIdCount[j]);
5604 // no changes, quest ignore this data
5605 }
5606 }
5607
5608 for (uint8 j = 0; j < QUEST_REPUTATIONS_COUNT; ++j)
5609 {
5610 if (qinfo->RewardFactionId[j])
5611 {
5612 if (std::abs(qinfo->RewardFactionValueId[j]) > 9)
5613 {
5614 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]);
5615 }
5616 if (!sFactionStore.LookupEntry(qinfo->RewardFactionId[j]))
5617 {
5618 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]);
5619 qinfo->RewardFactionId[j] = 0; // quest will not reward this
5620 }
5621 }
5622
5623 else if (qinfo->RewardFactionValueIdOverride[j] != 0)
5624 {
5625 LOG_ERROR("sql.sql", "Quest {} has `RewardFactionId{}` = 0 but `RewardFactionValueIdOverride{}` = {}.",
5626 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardFactionValueIdOverride[j]);
5627 // no changes, quest ignore this data
5628 }
5629 }
5630
5631 if (qinfo->RewardDisplaySpell)
5632 {
5633 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardDisplaySpell);
5634
5635 if (!spellInfo)
5636 {
5637 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} does not exist, spell removed as display reward.",
5638 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5639 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5640 }
5641
5642 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5643 {
5644 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is broken, quest will not have a spell reward.",
5645 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5646 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5647 }
5648
5649 else if (GetTalentSpellCost(qinfo->RewardDisplaySpell))
5650 {
5651 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is talent, quest will not have a spell reward.",
5652 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5653 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5654 }
5655 }
5656
5657 if (qinfo->RewardSpell > 0)
5658 {
5659 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardSpell);
5660
5661 if (!spellInfo)
5662 {
5663 LOG_ERROR("sql.sql", "Quest {} has `RewardSpell` = {} but spell {} does not exist, quest will not have a spell reward.",
5664 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5665 qinfo->RewardSpell = 0; // no spell will be casted on player
5666 }
5667
5668 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5669 {
5670 LOG_ERROR("sql.sql", "Quest {} has `RewardSpell` = {} but spell {} is broken, quest will not have a spell reward.",
5671 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5672 qinfo->RewardSpell = 0; // no spell will be casted on player
5673 }
5674
5675 else if (GetTalentSpellCost(qinfo->RewardSpell))
5676 {
5677 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is talent, quest will not have a spell reward.",
5678 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5679 qinfo->RewardSpell = 0; // no spell will be casted on player
5680 }
5681 }
5682
5683 if (qinfo->RewardMailTemplateId)
5684 {
5685 if (!sMailTemplateStore.LookupEntry(qinfo->RewardMailTemplateId))
5686 {
5687 LOG_ERROR("sql.sql", "Quest {} has `RewardMailTemplateId` = {} but mail template {} does not exist, quest will not have a mail reward.",
5688 qinfo->GetQuestId(), qinfo->RewardMailTemplateId, qinfo->RewardMailTemplateId);
5689 qinfo->RewardMailTemplateId = 0; // no mail will send to player
5690 qinfo->RewardMailDelay = 0; // no mail will send to player
5691 qinfo->RewardMailSenderEntry = 0;
5692 }
5693 else if (usedMailTemplates.find(qinfo->RewardMailTemplateId) != usedMailTemplates.end())
5694 {
5695 std::map<uint32, uint32>::const_iterator used_mt_itr = usedMailTemplates.find(qinfo->RewardMailTemplateId);
5696 LOG_ERROR("sql.sql", "Quest {} has `RewardMailTemplateId` = {} but mail template {} already used for quest {}, quest will not have a mail reward.",
5697 qinfo->GetQuestId(), qinfo->RewardMailTemplateId, qinfo->RewardMailTemplateId, used_mt_itr->second);
5698 qinfo->RewardMailTemplateId = 0; // no mail will send to player
5699 qinfo->RewardMailDelay = 0; // no mail will send to player
5700 qinfo->RewardMailSenderEntry = 0;
5701 }
5702 else
5703 usedMailTemplates[qinfo->RewardMailTemplateId] = qinfo->GetQuestId();
5704 }
5705
5706 if (qinfo->RewardNextQuest)
5707 {
5708 QuestMap::iterator qNextItr = _questTemplates.find(qinfo->RewardNextQuest);
5709 if (qNextItr == _questTemplates.end())
5710 {
5711 LOG_ERROR("sql.sql", "Quest {} has `RewardNextQuest` = {} but quest {} does not exist, quest chain will not work.",
5712 qinfo->GetQuestId(), qinfo->RewardNextQuest, qinfo->RewardNextQuest);
5713 qinfo->RewardNextQuest = 0;
5714 }
5715 else
5716 qNextItr->second->prevChainQuests.push_back(qinfo->GetQuestId());
5717 }
5718
5719 // fill additional data stores
5720 if (qinfo->PrevQuestId)
5721 {
5722 if (_questTemplates.find(std::abs(qinfo->GetPrevQuestId())) == _questTemplates.end())
5723 {
5724 LOG_ERROR("sql.sql", "Quest {} has PrevQuestId {}, but no such quest", qinfo->GetQuestId(), qinfo->GetPrevQuestId());
5725 }
5726 else
5727 {
5728 qinfo->prevQuests.push_back(qinfo->PrevQuestId);
5729 }
5730 }
5731
5732 if (qinfo->NextQuestId)
5733 {
5734 QuestMap::iterator qNextItr = _questTemplates.find(qinfo->GetNextQuestId());
5735 if (qNextItr == _questTemplates.end())
5736 {
5737 LOG_ERROR("sql.sql", "Quest {} has NextQuestId {}, but no such quest", qinfo->GetQuestId(), qinfo->GetNextQuestId());
5738 }
5739 else
5740 qNextItr->second->prevQuests.push_back(static_cast<int32>(qinfo->GetQuestId()));
5741 }
5742
5743 if (qinfo->ExclusiveGroup)
5744 mExclusiveQuestGroups.insert(std::pair<int32, uint32>(qinfo->ExclusiveGroup, qinfo->GetQuestId()));
5745
5746 if (uint32 breadcrumbForQuestId = qinfo->GetBreadcrumbForQuestId())
5747 {
5748 if (_questTemplates.find(breadcrumbForQuestId) == _questTemplates.end())
5749 LOG_ERROR("sql.sql", "Quest {} has BreadcrumbForQuestId {}, but no such quest exists", qinfo->GetQuestId(), breadcrumbForQuestId);
5750 else
5751 _breadcrumbsForQuest[breadcrumbForQuestId].push_back(qinfo->GetQuestId());
5752
5753 if (qinfo->GetNextQuestId())
5754 LOG_ERROR("sql.sql", "Quest {} is a breadcrumb quest but also has NextQuestID {} set", qinfo->GetQuestId(), qinfo->GetNextQuestId());
5755 if (qinfo->GetExclusiveGroup())
5756 LOG_ERROR("sql.sql", "Quest {} is a breadcrumb quest but also has ExclusiveGroup {} set", qinfo->GetQuestId(), qinfo->GetExclusiveGroup());
5757 }
5758
5759 if (qinfo->TimeAllowed)
5761 if (qinfo->RequiredPlayerKills)
5763 }
5764
5765 for (auto const& [questId, quest] : _questTemplates)
5766 {
5767 if (sDisableMgr->IsDisabledFor(DISABLE_TYPE_QUEST, questId, nullptr))
5768 continue;
5769
5770 uint32 breadcrumbForQuestId = quest->GetBreadcrumbForQuestId();
5771 if (!breadcrumbForQuestId)
5772 continue;
5773
5774 std::set<uint32> visitedQuests;
5775 visitedQuests.insert(questId);
5776
5777 while (breadcrumbForQuestId)
5778 {
5779 if (!visitedQuests.insert(breadcrumbForQuestId).second)
5780 {
5781 LOG_ERROR("sql.sql", "Breadcrumb quests {} and {} form a loop", questId, breadcrumbForQuestId);
5782 break;
5783 }
5784
5785 Quest const* targetQuest = GetQuestTemplate(breadcrumbForQuestId);
5786 if (!targetQuest)
5787 break;
5788
5789 breadcrumbForQuestId = targetQuest->GetBreadcrumbForQuestId();
5790 }
5791 }
5792
5793 // check QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT for spell with SPELL_EFFECT_QUEST_COMPLETE
5794 for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
5795 {
5796 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i);
5797 if (!spellInfo)
5798 continue;
5799
5800 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
5801 {
5802 if (spellInfo->Effects[j].Effect != SPELL_EFFECT_QUEST_COMPLETE)
5803 continue;
5804
5805 uint32 quest_id = spellInfo->Effects[j].MiscValue;
5806
5807 Quest const* quest = GetQuestTemplate(quest_id);
5808
5809 // some quest referenced in spells not exist (outdated spells)
5810 if (!quest)
5811 continue;
5812
5814 {
5815 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);
5816
5817 // this will prevent quest completing without objective
5818 // xinef: remove this, leave error but do not break the quest
5819 // const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
5820 }
5821 }
5822 }
5823
5824 LOG_INFO("server.loading", ">> Loaded {} Quests Definitions in {} ms", (unsigned long)_questTemplates.size(), GetMSTimeDiffToNow(oldMSTime));
5825 LOG_INFO("server.loading", " ");
5826}
uint32 GetTalentSpellCost(uint32 spellId)
Definition DBCStores.cpp:686
DBCStorage< QuestSortEntry > sQuestSortStore(QuestSortEntryfmt)
@ DISABLE_TYPE_QUEST
Definition DisableMgr.h:29
#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
@ SPELL_EFFECT_QUEST_COMPLETE
Definition SharedDefines.h:782
uint32 SkillByQuestSort(int32 QuestSort)
Definition SharedDefines.h:3273
ExclusiveQuestGroups mExclusiveQuestGroups
Definition ObjectMgr.h:1153
uint32 ItemDropQuantity[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition QuestDef.h:304
uint32 RewardMailDelay
Definition QuestDef.h:396
uint32 RewardMailSenderEntry
Definition QuestDef.h:404
int32 RequiredNpcOrGo[QUEST_OBJECTIVES_COUNT]
Definition QuestDef.h:305
uint32 RequiredMaxRepFaction
Definition QuestDef.h:401
uint32 SourceSpellid
Definition QuestDef.h:390
uint32 RequiredMinRepFaction
Definition QuestDef.h:399
int32 RequiredFactionValue2
Definition QuestDef.h:356
int32 RequiredFactionValue1
Definition QuestDef.h:354
int32 ZoneOrSort
Definition QuestDef.h:348
uint32 RequiredNpcOrGoCount[QUEST_OBJECTIVES_COUNT]
Definition QuestDef.h:306
uint32 StartItemCount
Definition QuestDef.h:403
void SetSpecialFlag(uint32 flag)
Definition QuestDef.h:225
uint32 GetCharTitleId() const
Definition QuestDef.h:254
uint32 RewardTitleId
Definition QuestDef.h:360
uint32 RewardItemIdCount[QUEST_REWARDS_COUNT]
Definition QuestDef.h:310
uint32 RewardChoiceItemId[QUEST_REWARD_CHOICES_COUNT]
Definition QuestDef.h:307
uint32 NextQuestId
Definition QuestDef.h:392
uint32 RewardMailTemplateId
Definition QuestDef.h:395
uint32 ItemDrop[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition QuestDef.h:303
int32 RewardFactionValueIdOverride[QUEST_REPUTATIONS_COUNT]
Definition QuestDef.h:313
uint32 RequiredSkillPoints
Definition QuestDef.h:398
int32 RewardSpell
Definition QuestDef.h:379
uint32 RewardChoiceItemCount[QUEST_REWARD_CHOICES_COUNT]
Definition QuestDef.h:308
uint32 AllowableRaces
Definition QuestDef.h:352
uint32 RewardNextQuest
Definition QuestDef.h:364
uint32 RequiredPlayerKills
Definition QuestDef.h:361
int32 GetPrevQuestId() const
Definition QuestDef.h:249
uint32 StartItem
Definition QuestDef.h:366
uint32 GetQuestId() const
Definition QuestDef.h:228
int32 RequiredMaxRepValue
Definition QuestDef.h:402
uint32 RequiredClasses
Definition QuestDef.h:389
uint32 Flags
Definition QuestDef.h:359
uint32 RequiredItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition QuestDef.h:302
uint32 GetBreadcrumbForQuestId() const
Definition QuestDef.h:252
int32 GetExclusiveGroup() const
Definition QuestDef.h:251
uint32 TimeAllowed
Definition QuestDef.h:358
uint32 RequiredFactionId1
Definition QuestDef.h:353
uint32 RequiredFactionId2
Definition QuestDef.h:355
PrevQuests prevQuests
Definition QuestDef.h:325
uint32 RewardDisplaySpell
Definition QuestDef.h:378
uint32 RequiredItemId[QUEST_ITEM_OBJECTIVES_COUNT]
Definition QuestDef.h:301
int32 PrevQuestId
Definition QuestDef.h:391
uint32 GetNextQuestId() const
Definition QuestDef.h:250
uint32 RewardFactionId[QUEST_REPUTATIONS_COUNT]
Definition QuestDef.h:311
int32 ExclusiveGroup
Definition QuestDef.h:393
uint32 RequiredSkillId
Definition QuestDef.h:397
int32 RewardFactionValueId[QUEST_REPUTATIONS_COUNT]
Definition QuestDef.h:312
uint32 RewardItemId[QUEST_REWARDS_COUNT]
Definition QuestDef.h:309
uint32 GetQuestMethod() const
Definition QuestDef.h:229
int32 RequiredMinRepValue
Definition QuestDef.h:400
uint32 SpecialFlags
Definition QuestDef.h:405
static const int32 Reputation_Cap
Definition ReputationMgr.h:67
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition SpellInfo.h:417
Definition DBCStructure.h:1445

References _breadcrumbsForQuest, _questTemplates, _questTemplatesFast, Quest::AllowableRaces, CLASSMASK_ALL_PLAYABLE, SpellMgr::ComputeIsSpellValid(), DISABLE_TYPE_QUEST, SpellInfo::Effects, Quest::ExclusiveGroup, Quest::Flags, Field::Get(), Quest::GetBreadcrumbForQuestId(), Quest::GetCharTitleId(), GetCreatureTemplate(), Quest::GetExclusiveGroup(), GetGameObjectTemplate(), GetItemTemplate(), getMSTime(), GetMSTimeDiffToNow(), Quest::GetNextQuestId(), Quest::GetPrevQuestId(), Quest::GetQuestId(), Quest::GetQuestMethod(), GetQuestTemplate(), GetTalentSpellCost(), Quest::HasSpecialFlag(), SpellInfo::Id, 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, 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, sDisableMgr, Quest::SetSpecialFlag(), sFactionStore, SkillByQuestSort(), sMailTemplateStore, Quest::SourceSpellid, Quest::SpecialFlags, SPELL_EFFECT_QUEST_COMPLETE, sQuestSortStore, sRaceMgr, sSkillLineStore, sSpellMgr, Quest::StartItem, Quest::StartItemCount, sWorld, Quest::TimeAllowed, WorldDatabase, and Quest::ZoneOrSort.

◆ LoadQuestStartersAndEnders()

void ObjectMgr::LoadQuestStartersAndEnders ( )
inline
961 {
962 LOG_INFO("server.loading", "Loading GO Start Quest Data...");
964 LOG_INFO("server.loading", "Loading GO End Quest Data...");
966 LOG_INFO("server.loading", "Loading Creature Start Quest Data...");
968 LOG_INFO("server.loading", "Loading Creature End Quest Data...");
970 }
void LoadCreatureQuestEnders()
Definition ObjectMgr.cpp:8980
void LoadGameobjectQuestEnders()
Definition ObjectMgr.cpp:8952
void LoadGameobjectQuestStarters()
Definition ObjectMgr.cpp:8938
void LoadCreatureQuestStarters()
Definition ObjectMgr.cpp:8966

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

◆ LoadReferenceVendor()

int ObjectMgr::LoadReferenceVendor ( int32  vendor,
int32  item_id,
std::set< uint32 > *  skip_vendors 
)
10101{
10102 // find all items from the reference vendor
10104 stmt->SetData(0, uint32(item));
10105 PreparedQueryResult result = WorldDatabase.Query(stmt);
10106
10107 if (!result)
10108 return 0;
10109
10110 uint32 count = 0;
10111 do
10112 {
10113 Field* fields = result->Fetch();
10114
10115 int32 item_id = fields[0].Get<int32>();
10116
10117 // if item is a negative, its a reference
10118 if (item_id < 0)
10119 count += LoadReferenceVendor(vendor, -item_id, skip_vendors);
10120 else
10121 {
10122 uint32 maxcount = fields[1].Get<uint32>();
10123 uint32 incrtime = fields[2].Get<uint32>();
10124 uint32 ExtendedCost = fields[3].Get<uint32>();
10125
10126 if (!IsVendorItemValid(vendor, item_id, maxcount, incrtime, ExtendedCost, nullptr, skip_vendors))
10127 continue;
10128
10129 VendorItemData& vList = _cacheVendorItemStore[vendor];
10130
10131 vList.AddItem(item_id, maxcount, incrtime, ExtendedCost);
10132 ++count;
10133 }
10134 } while (result->NextRow());
10135
10136 return count;
10137}
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
@ WORLD_SEL_NPC_VENDOR_REF
Definition WorldDatabase.h:45
bool IsVendorItemValid(uint32 vendor_entry, uint32 item, uint32 maxcount, uint32 ptime, uint32 ExtendedCost, Player *player=nullptr, std::set< uint32 > *skip_vendors=nullptr, uint32 ORnpcflag=0) const
Definition ObjectMgr.cpp:10362
int LoadReferenceVendor(int32 vendor, int32 item_id, std::set< uint32 > *skip_vendors)
Definition ObjectMgr.cpp:10100

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 ( )
8305{
8306 uint32 oldMSTime = getMSTime();
8307
8308 // For reload case
8309 _repOnKillStore.clear();
8310
8311 uint32 count = 0;
8312
8313 // 0 1 2
8314 QueryResult result = WorldDatabase.Query("SELECT creature_id, RewOnKillRepFaction1, RewOnKillRepFaction2, "
8315 // 3 4 5 6 7 8 9
8316 "IsTeamAward1, MaxStanding1, RewOnKillRepValue1, IsTeamAward2, MaxStanding2, RewOnKillRepValue2, TeamDependent "
8317 "FROM creature_onkill_reputation");
8318
8319 if (!result)
8320 {
8321 LOG_WARN("server.loading", ">> Loaded 0 creature award reputation definitions. DB table `creature_onkill_reputation` is empty.");
8322 LOG_INFO("server.loading", " ");
8323 return;
8324 }
8325
8326 do
8327 {
8328 Field* fields = result->Fetch();
8329
8330 uint32 creature_id = fields[0].Get<uint32>();
8331
8332 ReputationOnKillEntry repOnKill;
8333 repOnKill.RepFaction1 = fields[1].Get<int16>();
8334 repOnKill.RepFaction2 = fields[2].Get<int16>();
8335 repOnKill.IsTeamAward1 = fields[3].Get<bool>();
8336 repOnKill.ReputationMaxCap1 = fields[4].Get<uint8>();
8337 repOnKill.RepValue1 = fields[5].Get<float>();
8338 repOnKill.IsTeamAward2 = fields[6].Get<bool>();
8339 repOnKill.ReputationMaxCap2 = fields[7].Get<uint8>();
8340 repOnKill.RepValue2 = fields[8].Get<float>();
8341 repOnKill.TeamDependent = fields[9].Get<uint8>();
8342
8343 if (!GetCreatureTemplate(creature_id))
8344 {
8345 LOG_ERROR("sql.sql", "Table `creature_onkill_reputation` have data for not existed creature entry ({}), skipped", creature_id);
8346 continue;
8347 }
8348
8349 if (repOnKill.RepFaction1)
8350 {
8351 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(repOnKill.RepFaction1);
8352 if (!factionEntry1)
8353 {
8354 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `creature_onkill_reputation`", repOnKill.RepFaction1);
8355 continue;
8356 }
8357 }
8358
8359 if (repOnKill.RepFaction2)
8360 {
8361 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(repOnKill.RepFaction2);
8362 if (!factionEntry2)
8363 {
8364 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `creature_onkill_reputation`", repOnKill.RepFaction2);
8365 continue;
8366 }
8367 }
8368
8369 _repOnKillStore[creature_id] = repOnKill;
8370
8371 ++count;
8372 } while (result->NextRow());
8373
8374 LOG_INFO("server.loading", ">> Loaded {} Creature Award Reputation Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8375 LOG_INFO("server.loading", " ");
8376}
Definition ObjectMgr.h:572
uint32 RepFaction1
Definition ObjectMgr.h:573

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

◆ LoadReputationRewardRate()

void ObjectMgr::LoadReputationRewardRate ( )
8217{
8218 uint32 oldMSTime = getMSTime();
8219
8220 _repRewardRateStore.clear(); // for reload case
8221
8222 uint32 count = 0; // 0 1 2 3 4 5 6 7
8223 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");
8224 if (!result)
8225 {
8226 LOG_INFO("server.loading", ">> Loaded `reputation_reward_rate`, table is empty!");
8227 return;
8228 }
8229
8230 do
8231 {
8232 Field* fields = result->Fetch();
8233
8234 uint32 factionId = fields[0].Get<uint32>();
8235
8236 RepRewardRate repRate;
8237
8238 repRate.questRate = fields[1].Get<float>();
8239 repRate.questDailyRate = fields[2].Get<float>();
8240 repRate.questWeeklyRate = fields[3].Get<float>();
8241 repRate.questMonthlyRate = fields[4].Get<float>();
8242 repRate.questRepeatableRate = fields[5].Get<float>();
8243 repRate.creatureRate = fields[6].Get<float>();
8244 repRate.spellRate = fields[7].Get<float>();
8245
8246 FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
8247 if (!factionEntry)
8248 {
8249 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_reward_rate`", factionId);
8250 continue;
8251 }
8252
8253 if (repRate.questRate < 0.0f)
8254 {
8255 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_rate with invalid rate {}, skipping data for faction {}", repRate.questRate, factionId);
8256 continue;
8257 }
8258
8259 if (repRate.questDailyRate < 0.0f)
8260 {
8261 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_daily_rate with invalid rate {}, skipping data for faction {}", repRate.questDailyRate, factionId);
8262 continue;
8263 }
8264
8265 if (repRate.questWeeklyRate < 0.0f)
8266 {
8267 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_weekly_rate with invalid rate {}, skipping data for faction {}", repRate.questWeeklyRate, factionId);
8268 continue;
8269 }
8270
8271 if (repRate.questMonthlyRate < 0.0f)
8272 {
8273 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_monthly_rate with invalid rate {}, skipping data for faction {}", repRate.questMonthlyRate, factionId);
8274 continue;
8275 }
8276
8277 if (repRate.questRepeatableRate < 0.0f)
8278 {
8279 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_repeatable_rate with invalid rate {}, skipping data for faction {}", repRate.questRepeatableRate, factionId);
8280 continue;
8281 }
8282
8283 if (repRate.creatureRate < 0.0f)
8284 {
8285 LOG_ERROR("sql.sql", "Table reputation_reward_rate has creature_rate with invalid rate {}, skipping data for faction {}", repRate.creatureRate, factionId);
8286 continue;
8287 }
8288
8289 if (repRate.spellRate < 0.0f)
8290 {
8291 LOG_ERROR("sql.sql", "Table reputation_reward_rate has spell_rate with invalid rate {}, skipping data for faction {}", repRate.spellRate, factionId);
8292 continue;
8293 }
8294
8295 _repRewardRateStore[factionId] = repRate;
8296
8297 ++count;
8298 } while (result->NextRow());
8299
8300 LOG_INFO("server.loading", ">> Loaded {} Reputation Reward Rate in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8301 LOG_INFO("server.loading", " ");
8302}
Definition ObjectMgr.h:561
float questRate
Definition ObjectMgr.h:562

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

◆ LoadReputationSpilloverTemplate()

void ObjectMgr::LoadReputationSpilloverTemplate ( )
8379{
8380 uint32 oldMSTime = getMSTime();
8381
8382 _repSpilloverTemplateStore.clear(); // for reload case
8383
8384 uint32 count = 0; // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
8385 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");
8386
8387 if (!result)
8388 {
8389 LOG_INFO("server.loading", ">> Loaded `reputation_spillover_template`, table is empty.");
8390 LOG_INFO("server.loading", " ");
8391 return;
8392 }
8393
8394 do
8395 {
8396 Field* fields = result->Fetch();
8397
8398 uint32 factionId = fields[0].Get<uint16>();
8399
8400 RepSpilloverTemplate repTemplate;
8401
8402 repTemplate.faction[0] = fields[1].Get<uint16>();
8403 repTemplate.faction_rate[0] = fields[2].Get<float>();
8404 repTemplate.faction_rank[0] = fields[3].Get<uint8>();
8405 repTemplate.faction[1] = fields[4].Get<uint16>();
8406 repTemplate.faction_rate[1] = fields[5].Get<float>();
8407 repTemplate.faction_rank[1] = fields[6].Get<uint8>();
8408 repTemplate.faction[2] = fields[7].Get<uint16>();
8409 repTemplate.faction_rate[2] = fields[8].Get<float>();
8410 repTemplate.faction_rank[2] = fields[9].Get<uint8>();
8411 repTemplate.faction[3] = fields[10].Get<uint16>();
8412 repTemplate.faction_rate[3] = fields[11].Get<float>();
8413 repTemplate.faction_rank[3] = fields[12].Get<uint8>();
8414 repTemplate.faction[4] = fields[13].Get<uint16>();
8415 repTemplate.faction_rate[4] = fields[14].Get<float>();
8416 repTemplate.faction_rank[4] = fields[15].Get<uint8>();
8417 repTemplate.faction[5] = fields[16].Get<uint16>();
8418 repTemplate.faction_rate[5] = fields[17].Get<float>();
8419 repTemplate.faction_rank[5] = fields[18].Get<uint8>();
8420
8421 FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
8422
8423 if (!factionEntry)
8424 {
8425 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", factionId);
8426 continue;
8427 }
8428
8429 if (factionEntry->team == 0)
8430 {
8431 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} in `reputation_spillover_template` does not belong to any team, skipping", factionId);
8432 continue;
8433 }
8434
8435 for (uint32 i = 0; i < MAX_SPILLOVER_FACTIONS; ++i)
8436 {
8437 if (repTemplate.faction[i])
8438 {
8439 FactionEntry const* factionSpillover = sFactionStore.LookupEntry(repTemplate.faction[i]);
8440
8441 if (!factionSpillover)
8442 {
8443 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);
8444 continue;
8445 }
8446
8447 if (factionSpillover->reputationListID < 0)
8448 {
8449 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);
8450 continue;
8451 }
8452
8453 if (repTemplate.faction_rank[i] >= MAX_REPUTATION_RANK)
8454 {
8455 LOG_ERROR("sql.sql", "Rank {} used in `reputation_spillover_template` for spillover faction {} is not valid, skipping", repTemplate.faction_rank[i], repTemplate.faction[i]);
8456 continue;
8457 }
8458 }
8459 }
8460
8461 FactionEntry const* factionEntry0 = sFactionStore.LookupEntry(repTemplate.faction[0]);
8462 if (repTemplate.faction[0] && !factionEntry0)
8463 {
8464 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[0]);
8465 continue;
8466 }
8467 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(repTemplate.faction[1]);
8468 if (repTemplate.faction[1] && !factionEntry1)
8469 {
8470 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[1]);
8471 continue;
8472 }
8473 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(repTemplate.faction[2]);
8474 if (repTemplate.faction[2] && !factionEntry2)
8475 {
8476 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[2]);
8477 continue;
8478 }
8479 FactionEntry const* factionEntry3 = sFactionStore.LookupEntry(repTemplate.faction[3]);
8480 if (repTemplate.faction[3] && !factionEntry3)
8481 {
8482 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[3]);
8483 continue;
8484 }
8485
8486 _repSpilloverTemplateStore[factionId] = repTemplate;
8487
8488 ++count;
8489 } while (result->NextRow());
8490
8491 LOG_INFO("server.loading", ">> Loaded {} Reputation Spillover Template in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8492 LOG_INFO("server.loading", " ");
8493}
#define MAX_SPILLOVER_FACTIONS
Definition SharedDefines.h:235
int32 reputationListID
Definition DBCStructure.h:909
Definition ObjectMgr.h:585
uint32 faction[MAX_SPILLOVER_FACTIONS]
Definition ObjectMgr.h:586

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 ( )
8995{
8996 uint32 oldMSTime = getMSTime();
8997
8998 _reservedNamesStore.clear(); // need for reload case
8999
9000 QueryResult result = CharacterDatabase.Query("SELECT name FROM reserved_name");
9001
9002 if (!result)
9003 {
9004 LOG_WARN("server.loading", ">> Loaded 0 reserved names. DB table `reserved_name` is empty!");
9005 return;
9006 }
9007
9008 uint32 count = 0;
9009
9010 Field* fields;
9011 do
9012 {
9013 fields = result->Fetch();
9014 std::string name = fields[0].Get<std::string>();
9015
9016 std::wstring wstr;
9017 if (!Utf8toWStr (name, wstr))
9018 {
9019 LOG_ERROR("sql.sql", "Table `reserved_name` have invalid name: {}", name);
9020 continue;
9021 }
9022
9023 wstrToLower(wstr);
9024
9025 _reservedNamesStore.insert(wstr);
9026 ++count;
9027 } while (result->NextRow());
9028
9029 LOG_INFO("server.loading", ">> Loaded {} reserved names from DB in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9030}

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

◆ LoadReservedPlayerNamesDBC()

void ObjectMgr::LoadReservedPlayerNamesDBC ( )
9033{
9034 if (!sWorld->getBoolConfig(CONFIG_STRICT_NAMES_RESERVED))
9035 {
9036 LOG_WARN("server.loading", ">> Loaded 0 reserved names from DBC. Config option disabled.");
9037 return;
9038 }
9039
9040 uint32 oldMSTime = getMSTime();
9041
9042 uint32 count = 0;
9043
9044 for (NamesReservedEntry const* reservedStore : sNamesReservedStore)
9045 {
9046 std::wstring wstr;
9047
9048 Utf8toWStr(reservedStore->Pattern, wstr);
9049
9050 // DBC does not have clean entries, remove the junk.
9051 boost::algorithm::replace_all(wstr, "\\<", "");
9052 boost::algorithm::replace_all(wstr, "\\>", "");
9053
9054 _reservedNamesStore.insert(wstr);
9055 count++;
9056 }
9057
9058 LOG_INFO("server.loading", ">> Loaded {} reserved names from DBC in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9059 LOG_INFO("server.loading", " ");
9060}
DBCStorage< NamesReservedEntry > sNamesReservedStore(NamesReservedfmt)
@ CONFIG_STRICT_NAMES_RESERVED
Definition WorldConfig.h:145
Definition DBCStructure.h:1398

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

◆ LoadScriptNames()

void ObjectMgr::LoadScriptNames ( )
10443{
10444 uint32 oldMSTime = getMSTime();
10445
10446 // We insert an empty placeholder here so we can use the
10447 // script id 0 as dummy for "no script found".
10448 _scriptNamesStore.emplace_back("");
10449
10450 QueryResult result = WorldDatabase.Query(
10451 "SELECT DISTINCT(ScriptName) FROM achievement_criteria_data WHERE ScriptName <> '' AND type = 11 "
10452 "UNION "
10453 "SELECT DISTINCT(ScriptName) FROM battleground_template WHERE ScriptName <> '' "
10454 "UNION "
10455 "SELECT DISTINCT(ScriptName) FROM creature WHERE ScriptName <> '' "
10456 "UNION "
10457 "SELECT DISTINCT(ScriptName) FROM creature_template WHERE ScriptName <> '' "
10458 "UNION "
10459 "SELECT DISTINCT(ScriptName) FROM gameobject WHERE ScriptName <> '' "
10460 "UNION "
10461 "SELECT DISTINCT(ScriptName) FROM gameobject_template WHERE ScriptName <> '' "
10462 "UNION "
10463 "SELECT DISTINCT(ScriptName) FROM item_template WHERE ScriptName <> '' "
10464 "UNION "
10465 "SELECT DISTINCT(ScriptName) FROM areatrigger_scripts WHERE ScriptName <> '' "
10466 "UNION "
10467 "SELECT DISTINCT(ScriptName) FROM spell_script_names WHERE ScriptName <> '' "
10468 "UNION "
10469 "SELECT DISTINCT(ScriptName) FROM transports WHERE ScriptName <> '' "
10470 "UNION "
10471 "SELECT DISTINCT(ScriptName) FROM game_weather WHERE ScriptName <> '' "
10472 "UNION "
10473 "SELECT DISTINCT(ScriptName) FROM conditions WHERE ScriptName <> '' "
10474 "UNION "
10475 "SELECT DISTINCT(ScriptName) FROM outdoorpvp_template WHERE ScriptName <> '' "
10476 "UNION "
10477 "SELECT DISTINCT(script) FROM instance_template WHERE script <> ''");
10478
10479 if (!result)
10480 {
10481 LOG_INFO("server.loading", " ");
10482 LOG_ERROR("sql.sql", ">> Loaded empty set of Script Names!");
10483 return;
10484 }
10485
10486 _scriptNamesStore.reserve(result->GetRowCount() + 1);
10487
10488 do
10489 {
10490 _scriptNamesStore.push_back((*result)[0].Get<std::string>());
10491 } while (result->NextRow());
10492
10493 std::sort(_scriptNamesStore.begin(), _scriptNamesStore.end());
10494 LOG_INFO("server.loading", ">> Loaded {} ScriptNames in {} ms", _scriptNamesStore.size(), GetMSTimeDiffToNow(oldMSTime));
10495 LOG_INFO("server.loading", " ");
10496}

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

◆ LoadScripts()

void ObjectMgr::LoadScripts ( ScriptsType  type)
private
5865{
5866 uint32 oldMSTime = getMSTime();
5867
5868 ScriptMapMap* scripts = GetScriptsMapByType(type);
5869 if (!scripts)
5870 return;
5871
5872 std::string tableName = GetScriptsTableNameByType(type);
5873 if (tableName.empty())
5874 return;
5875
5876 if (sScriptMgr->IsScriptScheduled()) // function cannot be called when scripts are in use.
5877 return;
5878
5879 LOG_INFO("server.loading", "Loading {}...", tableName);
5880
5881 scripts->clear(); // need for reload support
5882
5883 bool isSpellScriptTable = (type == SCRIPTS_SPELL);
5884 // 0 1 2 3 4 5 6 7 8 9
5885 QueryResult result = WorldDatabase.Query("SELECT id, delay, command, datalong, datalong2, dataint, x, y, z, o{} FROM {}", isSpellScriptTable ? ", effIndex" : "", tableName);
5886
5887 if (!result)
5888 {
5889 LOG_WARN("server.loading", ">> Loaded 0 script definitions. DB table `{}` is empty!", tableName);
5890 LOG_INFO("server.loading", " ");
5891 return;
5892 }
5893
5894 uint32 count = 0;
5895
5896 do
5897 {
5898 Field* fields = result->Fetch();
5899 ScriptInfo tmp;
5900 tmp.type = type;
5901 tmp.id = fields[0].Get<uint32>();
5902 if (isSpellScriptTable)
5903 tmp.id |= fields[10].Get<uint8>() << 24;
5904 tmp.delay = fields[1].Get<uint32>();
5905 tmp.command = ScriptCommands(fields[2].Get<uint32>());
5906 tmp.Raw.nData[0] = fields[3].Get<uint32>();
5907 tmp.Raw.nData[1] = fields[4].Get<uint32>();
5908 tmp.Raw.nData[2] = fields[5].Get<int32>();
5909 tmp.Raw.fData[0] = fields[6].Get<float>();
5910 tmp.Raw.fData[1] = fields[7].Get<float>();
5911 tmp.Raw.fData[2] = fields[8].Get<float>();
5912 tmp.Raw.fData[3] = fields[9].Get<float>();
5913
5914 // generic command args check
5915 switch (tmp.command)
5916 {
5918 {
5920 {
5921 LOG_ERROR("sql.sql", "Table `{}` has invalid talk type (datalong = {}) in SCRIPT_COMMAND_TALK for script id {}",
5922 tableName, tmp.Talk.ChatType, tmp.id);
5923 continue;
5924 }
5926 {
5927 LOG_ERROR("sql.sql", "Table `{}` has invalid talk text id (dataint = {}) in SCRIPT_COMMAND_TALK for script id {}",
5928 tableName, tmp.Talk.TextID, tmp.id);
5929 continue;
5930 }
5931 break;
5932 }
5933
5935 {
5936 if (!sEmotesStore.LookupEntry(tmp.Emote.EmoteID))
5937 {
5938 LOG_ERROR("sql.sql", "Table `{}` has invalid emote id (datalong = {}) in SCRIPT_COMMAND_EMOTE for script id {}",
5939 tableName, tmp.Emote.EmoteID, tmp.id);
5940 continue;
5941 }
5942 break;
5943 }
5944
5946 {
5947 if (!sMapStore.LookupEntry(tmp.TeleportTo.MapID))
5948 {
5949 LOG_ERROR("sql.sql", "Table `{}` has invalid map (Id: {}) in SCRIPT_COMMAND_TELEPORT_TO for script id {}",
5950 tableName, tmp.TeleportTo.MapID, tmp.id);
5951 continue;
5952 }
5953
5955 {
5956 LOG_ERROR("sql.sql", "Table `{}` has invalid coordinates (X: {} Y: {} Z: {} O: {}) in SCRIPT_COMMAND_TELEPORT_TO for script id {}",
5957 tableName, tmp.TeleportTo.DestX, tmp.TeleportTo.DestY, tmp.TeleportTo.DestZ, tmp.TeleportTo.Orientation, tmp.id);
5958 continue;
5959 }
5960 break;
5961 }
5962
5964 {
5965 Quest const* quest = GetQuestTemplate(tmp.QuestExplored.QuestID);
5966 if (!quest)
5967 {
5968 LOG_ERROR("sql.sql", "Table `{}` has invalid quest (ID: {}) in SCRIPT_COMMAND_QUEST_EXPLORED in `datalong` for script id {}",
5969 tableName, tmp.QuestExplored.QuestID, tmp.id);
5970 continue;
5971 }
5972
5974 {
5975 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.",
5976 tableName, tmp.QuestExplored.QuestID, tmp.id);
5977
5978 // this will prevent quest completing without objective
5979 const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
5980
5981 // continue; - quest objective requirement set and command can be allowed
5982 }
5983
5985 {
5986 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 {}",
5987 tableName, tmp.QuestExplored.Distance, tmp.id);
5988 continue;
5989 }
5990
5992 {
5993 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",
5995 continue;
5996 }
5997
5999 {
6000 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",
6001 tableName, tmp.QuestExplored.Distance, tmp.id, INTERACTION_DISTANCE);
6002 continue;
6003 }
6004
6005 break;
6006 }
6007
6009 {
6011 {
6012 LOG_ERROR("sql.sql", "Table `{}` has invalid creature (Entry: {}) in SCRIPT_COMMAND_KILL_CREDIT for script id {}",
6013 tableName, tmp.KillCredit.CreatureEntry, tmp.id);
6014 continue;
6015 }
6016 break;
6017 }
6018
6020 {
6022 if (!data)
6023 {
6024 LOG_ERROR("sql.sql", "Table `{}` has invalid gameobject (GUID: {}) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
6025 tableName, tmp.RespawnGameobject.GOGuid, tmp.id);
6026 continue;
6027 }
6028
6029 GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
6030 if (!info)
6031 {
6032 LOG_ERROR("sql.sql", "Table `{}` has gameobject with invalid entry (GUID: {} Entry: {}) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
6033 tableName, tmp.RespawnGameobject.GOGuid, data->id, tmp.id);
6034 continue;
6035 }
6036
6037 if (info->type == GAMEOBJECT_TYPE_FISHINGNODE ||
6039 info->type == GAMEOBJECT_TYPE_DOOR ||
6040 info->type == GAMEOBJECT_TYPE_BUTTON ||
6041 info->type == GAMEOBJECT_TYPE_TRAP)
6042 {
6043 LOG_ERROR("sql.sql", "Table `{}` have gameobject type ({}) unsupported by command SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
6044 tableName, info->entry, tmp.id);
6045 continue;
6046 }
6047 break;
6048 }
6049
6051 {
6053 {
6054 LOG_ERROR("sql.sql", "Table `{}` has invalid coordinates (X: {} Y: {} Z: {} O: {}) in SCRIPT_COMMAND_TEMP_SUMMON_CREATURE for script id {}",
6056 continue;
6057 }
6058
6060 if (!GetCreatureTemplate(entry))
6061 {
6062 LOG_ERROR("sql.sql", "Table `{}` has invalid creature (Entry: {}) in SCRIPT_COMMAND_TEMP_SUMMON_CREATURE for script id {}",
6063 tableName, tmp.TempSummonCreature.CreatureEntry, tmp.id);
6064 continue;
6065 }
6066 break;
6067 }
6068
6071 {
6073 if (!data)
6074 {
6075 LOG_ERROR("sql.sql", "Table `{}` has invalid gameobject (GUID: {}) in {} for script id {}",
6076 tableName, tmp.ToggleDoor.GOGuid, GetScriptCommandName(tmp.command), tmp.id);
6077 continue;
6078 }
6079
6080 GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
6081 if (!info)
6082 {
6083 LOG_ERROR("sql.sql", "Table `{}` has gameobject with invalid entry (GUID: {} Entry: {}) in {} for script id {}",
6084 tableName, tmp.ToggleDoor.GOGuid, data->id, GetScriptCommandName(tmp.command), tmp.id);
6085 continue;
6086 }
6087
6088 if (info->type != GAMEOBJECT_TYPE_DOOR)
6089 {
6090 LOG_ERROR("sql.sql", "Table `{}` has gameobject type ({}) non supported by command {} for script id {}",
6091 tableName, info->entry, GetScriptCommandName(tmp.command), tmp.id);
6092 continue;
6093 }
6094
6095 break;
6096 }
6097
6099 {
6100 if (!sSpellMgr->GetSpellInfo(tmp.RemoveAura.SpellID))
6101 {
6102 LOG_ERROR("sql.sql", "Table `{}` using non-existent spell (id: {}) in SCRIPT_COMMAND_REMOVE_AURA for script id {}",
6103 tableName, tmp.RemoveAura.SpellID, tmp.id);
6104 continue;
6105 }
6106 if (tmp.RemoveAura.Flags & ~0x1) // 1 bits (0, 1)
6107 {
6108 LOG_ERROR("sql.sql", "Table `{}` using unknown flags in datalong2 ({}) in SCRIPT_COMMAND_REMOVE_AURA for script id {}",
6109 tableName, tmp.RemoveAura.Flags, tmp.id);
6110 continue;
6111 }
6112 break;
6113 }
6114
6116 {
6117 if (!sSpellMgr->GetSpellInfo(tmp.CastSpell.SpellID))
6118 {
6119 LOG_ERROR("sql.sql", "Table `{}` using non-existent spell (id: {}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
6120 tableName, tmp.CastSpell.SpellID, tmp.id);
6121 continue;
6122 }
6123 if (tmp.CastSpell.Flags > 4) // targeting type
6124 {
6125 LOG_ERROR("sql.sql", "Table `{}` using unknown target in datalong2 ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
6126 tableName, tmp.CastSpell.Flags, tmp.id);
6127 continue;
6128 }
6129 if (tmp.CastSpell.Flags != 4 && tmp.CastSpell.CreatureEntry & ~0x1) // 1 bit (0, 1)
6130 {
6131 LOG_ERROR("sql.sql", "Table `{}` using unknown flags in dataint ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
6132 tableName, tmp.CastSpell.CreatureEntry, tmp.id);
6133 continue;
6134 }
6135 else if (tmp.CastSpell.Flags == 4 && !GetCreatureTemplate(tmp.CastSpell.CreatureEntry))
6136 {
6137 LOG_ERROR("sql.sql", "Table `{}` using invalid creature entry in dataint ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
6138 tableName, tmp.CastSpell.CreatureEntry, tmp.id);
6139 continue;
6140 }
6141 break;
6142 }
6143
6145 {
6147 {
6148 LOG_ERROR("sql.sql", "Table `{}` has nonexistent item (entry: {}) in SCRIPT_COMMAND_CREATE_ITEM for script id {}",
6149 tableName, tmp.CreateItem.ItemEntry, tmp.id);
6150 continue;
6151 }
6152 if (!tmp.CreateItem.Amount)
6153 {
6154 LOG_ERROR("sql.sql", "Table `{}` SCRIPT_COMMAND_CREATE_ITEM but amount is {} for script id {}",
6155 tableName, tmp.CreateItem.Amount, tmp.id);
6156 continue;
6157 }
6158 break;
6159 }
6160 default:
6161 break;
6162 }
6163
6164 if (scripts->find(tmp.id) == scripts->end())
6165 {
6166 ScriptMap emptyMap;
6167 (*scripts)[tmp.id] = emptyMap;
6168 }
6169 (*scripts)[tmp.id].insert(std::pair<uint32, ScriptInfo>(tmp.delay, tmp));
6170
6171 ++count;
6172 } while (result->NextRow());
6173
6174 LOG_INFO("server.loading", ">> Loaded {} script definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6175 LOG_INFO("server.loading", " ");
6176}
@ CHAT_TYPE_WHISPER
Definition CreatureData.h:416
#define DEFAULT_VISIBILITY_DISTANCE
Definition ObjectDefines.h:39
#define INTERACTION_DISTANCE
Definition ObjectDefines.h:24
std::multimap< uint32, ScriptInfo > ScriptMap
Definition ObjectMgr.h:386
ScriptMapMap * GetScriptsMapByType(ScriptsType type)
Definition ObjectMgr.cpp:84
ScriptCommands
Definition ObjectMgr.h:92
@ SCRIPT_COMMAND_EMOTE
Definition ObjectMgr.h:94
@ SCRIPT_COMMAND_CREATE_ITEM
Definition ObjectMgr.h:110
@ SCRIPT_COMMAND_CLOSE_DOOR
Definition ObjectMgr.h:105
@ SCRIPT_COMMAND_CAST_SPELL
Definition ObjectMgr.h:108
@ SCRIPT_COMMAND_RESPAWN_GAMEOBJECT
Definition ObjectMgr.h:102
@ SCRIPT_COMMAND_QUEST_EXPLORED
Definition ObjectMgr.h:100
@ SCRIPT_COMMAND_TALK
Definition ObjectMgr.h:93
@ SCRIPT_COMMAND_OPEN_DOOR
Definition ObjectMgr.h:104
@ SCRIPT_COMMAND_TELEPORT_TO
Definition ObjectMgr.h:99
@ SCRIPT_COMMAND_TEMP_SUMMON_CREATURE
Definition ObjectMgr.h:103
@ SCRIPT_COMMAND_KILL_CREDIT
Definition ObjectMgr.h:101
@ SCRIPT_COMMAND_REMOVE_AURA
Definition ObjectMgr.h:107
std::string GetScriptCommandName(ScriptCommands command)
Definition ObjectMgr.cpp:104
std::map< uint32, ScriptMap > ScriptMapMap
Definition ObjectMgr.h:387
std::string GetScriptsTableNameByType(ScriptsType type)
Definition ObjectMgr.cpp:64
@ SCRIPTS_SPELL
Definition ObjectMgr.h:149
@ GAMEOBJECT_TYPE_FISHINGNODE
Definition SharedDefines.h:1581
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3427
Definition ObjectMgr.h:191
float Orientation
Definition ObjectMgr.h:251
uint32 Flags
Definition ObjectMgr.h:208
struct ScriptInfo::@270::@273 Talk
ScriptsType type
Definition ObjectMgr.h:192
uint32 QuestID
Definition ObjectMgr.h:256
struct ScriptInfo::@270::@280 KillCredit
struct ScriptInfo::@270::@287 CreateItem
int32 TextID
Definition ObjectMgr.h:209
struct ScriptInfo::@270::@278 TeleportTo
float DestX
Definition ObjectMgr.h:230
uint32 ItemEntry
Definition ObjectMgr.h:317
struct ScriptInfo::@270::@285 CastSpell
uint32 ChatType
Definition ObjectMgr.h:207
uint32 id
Definition ObjectMgr.h:193
struct ScriptInfo::@270::@272 Raw
uint32 delay
Definition ObjectMgr.h:194
float fData[4]
Definition ObjectMgr.h:202
float PosY
Definition ObjectMgr.h:279
ScriptCommands command
Definition ObjectMgr.h:195
float DestY
Definition ObjectMgr.h:231
uint32 MapID
Definition ObjectMgr.h:244
uint32 nData[3]
Definition ObjectMgr.h:201
float PosZ
Definition ObjectMgr.h:280
struct ScriptInfo::@270::@284 RemoveAura
struct ScriptInfo::@270::@282 TempSummonCreature
float PosX
Definition ObjectMgr.h:278
uint32 Distance
Definition ObjectMgr.h:257
uint32 SpellID
Definition ObjectMgr.h:295
float DestZ
Definition ObjectMgr.h:232
struct ScriptInfo::@270::@279 QuestExplored
struct ScriptInfo::@270::@283 ToggleDoor
struct ScriptInfo::@270::@281 RespawnGameobject
uint32 GOGuid
Definition ObjectMgr.h:268
uint32 CreatureEntry
Definition ObjectMgr.h:262
uint32 Amount
Definition ObjectMgr.h:318
struct ScriptInfo::@270::@274 Emote
uint32 EmoteID
Definition ObjectMgr.h:214

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

◆ LoadSpawnGroups()

void ObjectMgr::LoadSpawnGroups ( )
8785{
8786 uint32 oldMSTime = getMSTime();
8787
8788 // Reset prior state for hot-reload support
8789 // Preserve the forced legacy group for spawns on transport maps (set in LoadCreatures/LoadGameobjects).
8790 _spawnGroupMapStore.clear();
8791 for (auto& [id, data] : _creatureDataStore)
8792 data.spawnGroupId = _transportMaps.count(data.mapid) ? 1 : 0;
8793 for (auto& [id, data] : _gameObjectDataStore)
8794 data.spawnGroupId = _transportMaps.count(data.mapid) ? 1 : 0;
8795
8796 // 0 1 2
8797 QueryResult result = WorldDatabase.Query("SELECT groupId, spawnType, spawnId FROM spawn_group");
8798
8799 if (!result)
8800 {
8801 LOG_INFO("server.loading", ">> Loaded 0 spawn group members. DB table `spawn_group` is empty.");
8802 LOG_INFO("server.loading", " ");
8803 return;
8804 }
8805
8806 uint32 numMembers = 0;
8807 do
8808 {
8809 Field* fields = result->Fetch();
8810 uint32 groupId = fields[0].Get<uint32>();
8811 uint32 type = fields[1].Get<uint8>();
8812 if (type >= SPAWN_TYPE_MAX)
8813 {
8814 LOG_ERROR("sql.sql", "Spawn data with invalid type {} listed for spawn group {}. Skipped.", type, groupId);
8815 continue;
8816 }
8817 SpawnObjectType spawnType = SpawnObjectType(type);
8818 ObjectGuid::LowType spawnId = fields[2].Get<uint32>();
8819
8820 SpawnData const* data = GetSpawnData(spawnType, spawnId);
8821 if (!data)
8822 {
8823 LOG_ERROR("sql.sql", "Spawn data with ID ({},{}) not found, but is listed as a member of spawn group {}!",
8824 uint32(spawnType), spawnId, groupId);
8825 continue;
8826 }
8827 if (data->spawnGroupId)
8828 {
8829 LOG_ERROR("sql.sql", "Spawn with ID ({},{}) is listed as a member of spawn group {}, but is already a member of spawn group {}. Skipping.",
8830 uint32(spawnType), spawnId, groupId, data->spawnGroupId);
8831 continue;
8832 }
8833
8834 auto it = _spawnGroupDataStore.find(groupId);
8835 if (it == _spawnGroupDataStore.end())
8836 {
8837 LOG_ERROR("sql.sql", "Spawn group {} assigned to spawn ID ({},{}), but group is not found!", groupId, uint32(spawnType), spawnId);
8838 continue;
8839 }
8840
8841 SpawnGroupTemplateData& groupTemplate = it->second;
8842 if (groupTemplate.mapId == SPAWNGROUP_MAP_UNSET)
8843 groupTemplate.mapId = data->mapid;
8844 else if (groupTemplate.mapId != data->mapid && !(groupTemplate.flags & SPAWNGROUP_FLAG_SYSTEM))
8845 {
8846 LOG_ERROR("sql.sql", "Spawn group {} has map ID {}, but spawn ({},{}) has map id {} - spawn NOT added to group!",
8847 groupId, groupTemplate.mapId, uint32(spawnType), spawnId, data->mapid);
8848 continue;
8849 }
8850
8851 // Warn if spawn is also in a pool (non-system groups and pools are mutually exclusive)
8852 if (!(groupTemplate.flags & SPAWNGROUP_FLAG_SYSTEM))
8853 {
8854 uint32 poolId = 0;
8855 if (spawnType == SPAWN_TYPE_CREATURE)
8856 poolId = sPoolMgr->IsPartOfAPool<Creature>(spawnId);
8857 else if (spawnType == SPAWN_TYPE_GAMEOBJECT)
8858 poolId = sPoolMgr->IsPartOfAPool<GameObject>(spawnId);
8859
8860 if (poolId)
8861 LOG_WARN("sql.sql", "Spawn ({},{}) is a member of spawn group {} and also part of pool {}. This may cause issues!",
8862 uint32(spawnType), spawnId, groupId, poolId);
8863 }
8864
8865 const_cast<SpawnData*>(data)->spawnGroupId = groupId;
8866 if (!(groupTemplate.flags & SPAWNGROUP_FLAG_SYSTEM))
8867 _spawnGroupMapStore.emplace(groupId, data);
8868 ++numMembers;
8869 } while (result->NextRow());
8870
8871 LOG_INFO("server.loading", ">> Loaded {} spawn group members in {} ms", numMembers, GetMSTimeDiffToNow(oldMSTime));
8872 LOG_INFO("server.loading", " ");
8873}
SpawnObjectType
Definition SpawnData.h:26
@ SPAWN_TYPE_MAX
Definition SpawnData.h:30
SpawnData const * GetSpawnData(SpawnObjectType type, ObjectGuid::LowType spawnId) const
Definition ObjectMgr.cpp:8713
Definition SpawnData.h:66
Definition SpawnData.h:58
SpawnGroupFlags flags
Definition SpawnData.h:62
uint32 mapId
Definition SpawnData.h:61

References _creatureDataStore, _gameObjectDataStore, _spawnGroupDataStore, _spawnGroupMapStore, _transportMaps, SpawnGroupTemplateData::flags, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), GetSpawnData(), LOG_ERROR, LOG_INFO, LOG_WARN, SpawnGroupTemplateData::mapId, SPAWN_TYPE_CREATURE, SPAWN_TYPE_GAMEOBJECT, SPAWN_TYPE_MAX, SPAWNGROUP_FLAG_SYSTEM, SPAWNGROUP_MAP_UNSET, sPoolMgr, and WorldDatabase.

◆ LoadSpawnGroupTemplates()

void ObjectMgr::LoadSpawnGroupTemplates ( )
8727{
8728 uint32 oldMSTime = getMSTime();
8729
8730 _spawnGroupDataStore.clear();
8731
8732 // 0 1 2
8733 QueryResult result = WorldDatabase.Query("SELECT groupId, groupName, groupFlags FROM spawn_group_template");
8734
8735 if (result)
8736 {
8737 do
8738 {
8739 Field* fields = result->Fetch();
8740 uint32 groupId = fields[0].Get<uint32>();
8742 group.groupId = groupId;
8743 group.name = fields[1].Get<std::string>();
8744 group.mapId = SPAWNGROUP_MAP_UNSET;
8745 uint32 flags = fields[2].Get<uint32>();
8746 if (flags & ~uint32(SPAWNGROUP_FLAG_ALL))
8747 {
8748 flags &= uint32(SPAWNGROUP_FLAG_ALL);
8749 LOG_ERROR("sql.sql", "Invalid spawn group flag {} on group ID {} ({}), reduced to valid flags {}.",
8750 fields[2].Get<uint32>(), groupId, group.name, flags);
8751 }
8752 if ((flags & SPAWNGROUP_FLAG_SYSTEM) && (flags & SPAWNGROUP_FLAG_MANUAL_SPAWN))
8753 {
8754 flags &= ~SPAWNGROUP_FLAG_MANUAL_SPAWN;
8755 LOG_ERROR("sql.sql", "System spawn group {} ({}) has invalid manual spawn flag. Ignored.", groupId, group.name);
8756 }
8757 group.flags = SpawnGroupFlags(flags);
8758 } while (result->NextRow());
8759 }
8760
8761 if (_spawnGroupDataStore.find(0) == _spawnGroupDataStore.end())
8762 {
8763 LOG_ERROR("sql.sql", "Default spawn group (index 0) is missing from DB! Manually inserted.");
8765 data.groupId = 0;
8766 data.name = "Default Group";
8769 }
8770 if (_spawnGroupDataStore.find(1) == _spawnGroupDataStore.end())
8771 {
8772 LOG_ERROR("sql.sql", "Default legacy spawn group (index 1) is missing from DB! Manually inserted.");
8774 data.groupId = 1;
8775 data.name = "Legacy Group";
8778 }
8779
8780 LOG_INFO("server.loading", ">> Loaded {} spawn group templates in {} ms", _spawnGroupDataStore.size(), GetMSTimeDiffToNow(oldMSTime));
8781 LOG_INFO("server.loading", " ");
8782}
@ SPAWNGROUP_FLAG_ALL
Definition SpawnData.h:50
@ SPAWNGROUP_FLAG_MANUAL_SPAWN
Definition SpawnData.h:46
std::string name
Definition SpawnData.h:60
uint32 groupId
Definition SpawnData.h:59

References _spawnGroupDataStore, SpawnGroupTemplateData::flags, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), SpawnGroupTemplateData::groupId, LOG_ERROR, LOG_INFO, SpawnGroupTemplateData::mapId, SpawnGroupTemplateData::name, SPAWNGROUP_FLAG_ALL, SPAWNGROUP_FLAG_COMPATIBILITY_MODE, SPAWNGROUP_FLAG_MANUAL_SPAWN, SPAWNGROUP_FLAG_SYSTEM, SPAWNGROUP_MAP_UNSET, and WorldDatabase.

◆ LoadSpellScriptNames()

void ObjectMgr::LoadSpellScriptNames ( )
6278{
6279 uint32 oldMSTime = getMSTime();
6280
6281 _spellScriptsStore.clear(); // need for reload case
6282
6283 QueryResult result = WorldDatabase.Query("SELECT spell_id, ScriptName FROM spell_script_names");
6284
6285 if (!result)
6286 {
6287 LOG_WARN("server.loading", ">> Loaded 0 spell script names. DB table `spell_script_names` is empty!");
6288 LOG_INFO("server.loading", " ");
6289 return;
6290 }
6291
6292 uint32 count = 0;
6293
6294 do
6295 {
6296 Field* fields = result->Fetch();
6297
6298 int32 spellId = fields[0].Get<int32>();
6299 std::string scriptName = fields[1].Get<std::string>();
6300
6301 bool allRanks = false;
6302 if (spellId <= 0)
6303 {
6304 allRanks = true;
6305 spellId = -spellId;
6306 }
6307
6308 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
6309 if (!spellInfo)
6310 {
6311 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) does not exist in `Spell.dbc`.", scriptName, fields[0].Get<int32>());
6312 continue;
6313 }
6314
6315 if (allRanks)
6316 {
6317 if (sSpellMgr->GetFirstSpellInChain(spellId) != uint32(spellId))
6318 {
6319 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) is not first rank of spell.", scriptName, fields[0].Get<int32>());
6320 continue;
6321 }
6322 while (spellInfo)
6323 {
6324 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
6325 spellInfo = spellInfo->GetNextRankSpell();
6326 }
6327 }
6328 else
6329 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
6330 ++count;
6331 } while (result->NextRow());
6332
6333 LOG_INFO("server.loading", ">> Loaded {} spell script names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6334 LOG_INFO("server.loading", " ");
6335}
SpellInfo const * GetNextRankSpell() const
Definition SpellInfo.cpp:2915

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

◆ LoadSpellScripts()

void ObjectMgr::LoadSpellScripts ( )
6179{
6181
6182 // check ids
6183 for (ScriptMapMap::const_iterator itr = sSpellScripts.begin(); itr != sSpellScripts.end(); ++itr)
6184 {
6185 uint32 spellId = uint32(itr->first) & 0x00FFFFFF;
6186 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
6187
6188 if (!spellInfo)
6189 {
6190 LOG_ERROR("sql.sql", "Table `spell_scripts` has not existing spell (Id: {}) as script id", spellId);
6191 continue;
6192 }
6193
6194 SpellEffIndex i = SpellEffIndex((uint32(itr->first) >> 24) & 0x000000FF);
6195 if (uint32(i) >= MAX_SPELL_EFFECTS)
6196 {
6197 LOG_ERROR("sql.sql", "Table `spell_scripts` has too high effect index {} for spell (Id: {}) as script id", uint32(i), spellId);
6198 }
6199
6200 //check for correct spellEffect
6201 if (!spellInfo->Effects[i].Effect || (spellInfo->Effects[i].Effect != SPELL_EFFECT_SCRIPT_EFFECT && spellInfo->Effects[i].Effect != SPELL_EFFECT_DUMMY))
6202 LOG_ERROR("sql.sql", "Table `spell_scripts` - spell {} effect {} is not SPELL_EFFECT_SCRIPT_EFFECT or SPELL_EFFECT_DUMMY", spellId, uint32(i));
6203 }
6204}
ScriptMapMap sSpellScripts
Definition ObjectMgr.cpp:60
SpellEffIndex
Definition SharedDefines.h:30
@ SPELL_EFFECT_DUMMY
Definition SharedDefines.h:769
@ SPELL_EFFECT_SCRIPT_EFFECT
Definition SharedDefines.h:843

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 ( )
7118{
7119 uint32 oldMSTime = getMSTime();
7120
7121 _tavernAreaTriggerStore.clear(); // need for reload case
7122
7123 QueryResult result = WorldDatabase.Query("SELECT id, faction FROM areatrigger_tavern");
7124
7125 if (!result)
7126 {
7127 LOG_WARN("server.loading", ">> Loaded 0 tavern triggers. DB table `areatrigger_tavern` is empty.");
7128 LOG_INFO("server.loading", " ");
7129 return;
7130 }
7131
7132 uint32 count = 0;
7133
7134 do
7135 {
7136 ++count;
7137
7138 Field* fields = result->Fetch();
7139
7140 uint32 Trigger_ID = fields[0].Get<uint32>();
7141
7142 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
7143 if (!atEntry)
7144 {
7145 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
7146 continue;
7147 }
7148
7149 uint32 faction = fields[1].Get<uint32>();
7150
7151 _tavernAreaTriggerStore.emplace(Trigger_ID, faction);
7152 } while (result->NextRow());
7153
7154 LOG_INFO("server.loading", ">> Loaded {} Tavern Triggers in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7155 LOG_INFO("server.loading", " ");
7156}

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

◆ LoadTempSummons()

void ObjectMgr::LoadTempSummons ( )
2154{
2155 uint32 oldMSTime = getMSTime();
2156
2157 // 0 1 2 3 4 5 6 7 8 9
2158 QueryResult result = WorldDatabase.Query("SELECT summonerId, summonerType, groupId, entry, position_x, position_y, position_z, orientation, summonType, summonTime FROM creature_summon_groups");
2159
2160 if (!result)
2161 {
2162 LOG_WARN("server.loading", ">> Loaded 0 temp summons. DB table `creature_summon_groups` is empty.");
2163 return;
2164 }
2165
2166 uint32 count = 0;
2167 do
2168 {
2169 Field* fields = result->Fetch();
2170
2171 uint32 summonerId = fields[0].Get<uint32>();
2172 SummonerType summonerType = SummonerType(fields[1].Get<uint8>());
2173 uint8 group = fields[2].Get<uint8>();
2174
2175 switch (summonerType)
2176 {
2178 if (!GetCreatureTemplate(summonerId))
2179 {
2180 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has summoner with non existing entry {} for creature summoner type, skipped.", summonerId);
2181 continue;
2182 }
2183 break;
2185 if (!GetGameObjectTemplate(summonerId))
2186 {
2187 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has summoner with non existing entry {} for gameobject summoner type, skipped.", summonerId);
2188 continue;
2189 }
2190 break;
2191 case SUMMONER_TYPE_MAP:
2192 if (!sMapStore.LookupEntry(summonerId))
2193 {
2194 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has summoner with non existing entry {} for map summoner type, skipped.", summonerId);
2195 continue;
2196 }
2197 break;
2198 default:
2199 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has unhandled summoner type {} for summoner {}, skipped.", summonerType, summonerId);
2200 continue;
2201 }
2202
2203 TempSummonData data;
2204 data.entry = fields[3].Get<uint32>();
2205
2206 if (!GetCreatureTemplate(data.entry))
2207 {
2208 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);
2209 continue;
2210 }
2211
2212 float posX = fields[4].Get<float>();
2213 float posY = fields[5].Get<float>();
2214 float posZ = fields[6].Get<float>();
2215 float orientation = fields[7].Get<float>();
2216
2217 data.pos.Relocate(posX, posY, posZ, orientation);
2218
2219 data.type = TempSummonType(fields[8].Get<uint8>());
2220
2222 {
2223 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);
2224 continue;
2225 }
2226
2227 data.time = fields[9].Get<uint32>();
2228
2229 TempSummonGroupKey key(summonerId, summonerType, group);
2230 _tempSummonDataStore[key].push_back(data);
2231
2232 ++count;
2233 } while (result->NextRow());
2234
2235 LOG_INFO("server.loading", ">> Loaded {} Temporary Summons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2236 LOG_INFO("server.loading", " ");
2237}
TempSummonType
Definition Object.h:48
@ TEMPSUMMON_MANUAL_DESPAWN
Definition Object.h:56
Stores data for temp summons.
Definition TemporarySummon.h:33
TempSummonType type
Summon type, see TempSummonType for available types.
Definition TemporarySummon.h:36
uint32 time
Despawn time, usable only with certain temp summon types.
Definition TemporarySummon.h:37
uint32 entry
Entry of summoned creature.
Definition TemporarySummon.h:34
Position pos
Position, where should be creature spawned.
Definition TemporarySummon.h:35

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.

◆ LoadTrainers()

void ObjectMgr::LoadTrainers ( )
9935{
9936 uint32 oldMSTime = getMSTime();
9937
9938 // For reload case
9939 _trainers.clear();
9940 _classTrainers.clear();
9941
9942 std::unordered_map<int32, std::vector<Trainer::Spell>> spellsByTrainer;
9943 if (QueryResult trainerSpellsResult = WorldDatabase.Query("SELECT TrainerId, SpellId, MoneyCost, ReqSkillLine, ReqSkillRank, ReqAbility1, ReqAbility2, ReqAbility3, ReqLevel FROM trainer_spell"))
9944 {
9945 do
9946 {
9947 Field* fields = trainerSpellsResult->Fetch();
9948
9949 Trainer::Spell spell;
9950 uint32 trainerId = fields[0].Get<uint32>();
9951 spell.SpellId = fields[1].Get<uint32>();
9952 spell.MoneyCost = fields[2].Get<uint32>();
9953 spell.ReqSkillLine = fields[3].Get<uint32>();
9954 spell.ReqSkillRank = fields[4].Get<uint32>();
9955 spell.ReqAbility[0] = fields[5].Get<uint32>();
9956 spell.ReqAbility[1] = fields[6].Get<uint32>();
9957 spell.ReqAbility[2] = fields[7].Get<uint32>();
9958 spell.ReqLevel = fields[8].Get<uint8>();
9959
9960 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell.SpellId);
9961 if (!spellInfo)
9962 {
9963 LOG_ERROR("sql.sql", "Table `trainer_spell` references non-existing spell (SpellId: {}) for TrainerId {}, ignoring", spell.SpellId, trainerId);
9964 continue;
9965 }
9966
9967 if (GetTalentSpellCost(spell.SpellId))
9968 {
9969 LOG_ERROR("sql.sql", "Table `trainer_spell` references non-existing spell (SpellId: {}) which is a talent, for TrainerId {}, ignoring", spell.SpellId, trainerId);
9970 continue;
9971 }
9972
9973 if (spell.ReqSkillLine && !sSkillLineStore.LookupEntry(spell.ReqSkillLine))
9974 {
9975 LOG_ERROR("sql.sql", "Table `trainer_spell` references non-existing skill (ReqSkillLine: {}) for TrainerId {} and SpellId {}, ignoring",
9976 spell.ReqSkillLine, spell.SpellId, trainerId);
9977 continue;
9978 }
9979
9980 bool allReqValid = true;
9981 for (std::size_t i = 0; i < spell.ReqAbility.size(); ++i)
9982 {
9983 uint32 requiredSpell = spell.ReqAbility[i];
9984 if (requiredSpell && !sSpellMgr->GetSpellInfo(requiredSpell))
9985 {
9986 LOG_ERROR("sql.sql", "Table `trainer_spell` references non-existing spell (ReqAbility {} : {}) for TrainerId {} and SpellId {}, ignoring",
9987 i + 1, requiredSpell, trainerId, spell.SpellId);
9988 allReqValid = false;
9989 }
9990 }
9991
9992 if (!allReqValid)
9993 continue;
9994
9995 spellsByTrainer[trainerId].push_back(spell);
9996 } while (trainerSpellsResult->NextRow());
9997 }
9998
9999 if (QueryResult trainersResult = WorldDatabase.Query("SELECT Id, Type, Requirement, Greeting FROM trainer"))
10000 {
10001 do
10002 {
10003 Field* fields = trainersResult->Fetch();
10004
10005 uint32 trainerId = fields[0].Get<uint32>();
10006 Trainer::Type trainerType = Trainer::Type(fields[1].Get<uint8>());
10007 uint32 requirement = fields[2].Get<uint32>();
10008 std::string greeting = fields[3].Get<std::string>();
10009 std::vector<Trainer::Spell> spells;
10010 auto spellsItr = spellsByTrainer.find(trainerId);
10011 if (spellsItr != spellsByTrainer.end())
10012 {
10013 spells = std::move(spellsItr->second);
10014 spellsByTrainer.erase(spellsItr);
10015 }
10016
10017 auto [it, isNew] = _trainers.emplace(std::piecewise_construct, std::forward_as_tuple(trainerId), std::forward_as_tuple(trainerId, trainerType, requirement, std::move(greeting), std::move(spells)));
10018 ASSERT(isNew);
10019 if (trainerType == Trainer::Type::Class)
10020 {
10021 if (!requirement || requirement >= MAX_CLASSES)
10022 LOG_ERROR("sql.sql", "Table `trainer` has invalid class requirement for trainer {}, ignoring");
10023 else
10024 {
10025 uint8 classId = static_cast<uint8>(requirement);
10026 _classTrainers[classId].push_back(&it->second);
10027 }
10028 }
10029 } while (trainersResult->NextRow());
10030 }
10031
10032 for (auto const& unusedSpells : spellsByTrainer)
10033 {
10034 for (Trainer::Spell const& unusedSpell : unusedSpells.second)
10035 {
10036 LOG_ERROR("sql.sql", "Table `trainer_spell` references non-existing trainer (TrainerId: {}) for SpellId {}, ignoring", unusedSpells.first, unusedSpell.SpellId);
10037 }
10038 }
10039
10040 if (QueryResult trainerLocalesResult = WorldDatabase.Query("SELECT Id, locale, Greeting_lang FROM trainer_locale"))
10041 {
10042 do
10043 {
10044 Field* fields = trainerLocalesResult->Fetch();
10045 uint32 trainerId = fields[0].Get<uint32>();
10046 std::string localeName = fields[1].Get<std::string>();
10047
10048 LocaleConstant locale = GetLocaleByName(localeName);
10049 if (locale == LOCALE_enUS)
10050 continue;
10051
10053 trainer->AddGreetingLocale(locale, fields[2].Get<std::string>());
10054 else
10055 LOG_ERROR("sql.sql", "Table `trainer_locale` references non-existing trainer (TrainerId: {}) for locale %s, ignoring",
10056 trainerId, localeName.c_str());
10057 } while (trainerLocalesResult->NextRow());
10058 }
10059
10060 LOG_INFO("server.loading", ">> Loaded {} Trainers in {} ms", _trainers.size(), GetMSTimeDiffToNow(oldMSTime));
10061}
#define ASSERT
Definition Errors.h:68
Definition Trainer.h:66
Type
Definition Trainer.h:32
Definition Trainer.h:54
uint32 ReqSkillLine
Definition Trainer.h:57
std::array< uint32, 3 > ReqAbility
Definition Trainer.h:59
uint8 ReqLevel
Definition Trainer.h:60
uint32 ReqSkillRank
Definition Trainer.h:58
uint32 SpellId
Definition Trainer.h:55
uint32 MoneyCost
Definition Trainer.h:56

References _classTrainers, _trainers, ASSERT, Trainer::Class, Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), GetTalentSpellCost(), LOCALE_enUS, LOG_ERROR, LOG_INFO, Acore::Containers::MapGetValuePtr(), MAX_CLASSES, Trainer::Spell::MoneyCost, Trainer::Spell::ReqAbility, Trainer::Spell::ReqLevel, Trainer::Spell::ReqSkillLine, Trainer::Spell::ReqSkillRank, Trainer::Spell::SpellId, sSkillLineStore, sSpellMgr, and WorldDatabase.

◆ LoadVehicleAccessories()

void ObjectMgr::LoadVehicleAccessories ( )
4045{
4046 uint32 oldMSTime = getMSTime();
4047
4048 _vehicleAccessoryStore.clear(); // needed for reload case
4049
4050 uint32 count = 0;
4051
4052 // 0 1 2 3 4 5
4053 QueryResult result = WorldDatabase.Query("SELECT `guid`, `accessory_entry`, `seat_id`, `minion`, `summontype`, `summontimer` FROM `vehicle_accessory`");
4054
4055 if (!result)
4056 {
4057 LOG_WARN("server.loading", ">> Loaded 0 Vehicle Accessories in {} ms", GetMSTimeDiffToNow(oldMSTime));
4058 LOG_INFO("server.loading", " ");
4059 return;
4060 }
4061
4062 do
4063 {
4064 Field* fields = result->Fetch();
4065
4066 uint32 uiGUID = fields[0].Get<uint32>();
4067 uint32 uiAccessory = fields[1].Get<uint32>();
4068 int8 uiSeat = int8(fields[2].Get<int16>());
4069 bool bMinion = fields[3].Get<bool>();
4070 uint8 uiSummonType = fields[4].Get<uint8>();
4071 uint32 uiSummonTimer = fields[5].Get<uint32>();
4072
4073 if (!GetCreatureTemplate(uiAccessory))
4074 {
4075 LOG_ERROR("sql.sql", "Table `vehicle_accessory`: Accessory {} does not exist.", uiAccessory);
4076 continue;
4077 }
4078
4079 _vehicleAccessoryStore[uiGUID].push_back(VehicleAccessory(uiAccessory, uiSeat, bMinion, uiSummonType, uiSummonTimer));
4080
4081 ++count;
4082 } while (result->NextRow());
4083
4084 LOG_INFO("server.loading", ">> Loaded {} Vehicle Accessories in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4085 LOG_INFO("server.loading", " ");
4086}
Definition VehicleDefines.h:115

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

◆ LoadVehicleSeatAddon()

void ObjectMgr::LoadVehicleSeatAddon ( )
4089{
4090 uint32 oldMSTime = getMSTime();
4091
4092 _vehicleSeatAddonStore.clear(); // needed for reload case
4093
4094 uint32 count = 0;
4095
4096 // 0 1 2 3 4 5 6
4097 QueryResult result = WorldDatabase.Query("SELECT `SeatEntry`, `SeatOrientation`, `ExitParamX`, `ExitParamY`, `ExitParamZ`, `ExitParamO`, `ExitParamValue` FROM `vehicle_seat_addon`");
4098
4099 if (!result)
4100 {
4101 LOG_ERROR("server.loading", ">> Loaded 0 vehicle seat addons. DB table `vehicle_seat_addon` is empty.");
4102 return;
4103 }
4104
4105 do
4106 {
4107 Field* fields = result->Fetch();
4108
4109 uint32 seatID = fields[0].Get<uint32>();
4110 float orientation = fields[1].Get<float>();
4111 float exitX = fields[2].Get<float>();
4112 float exitY = fields[3].Get<float>();
4113 float exitZ = fields[4].Get<float>();
4114 float exitO = fields[5].Get<float>();
4115 uint8 exitParam = fields[6].Get<uint8>();
4116
4117 if (!sVehicleSeatStore.LookupEntry(seatID))
4118 {
4119 LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: {} does not exist in VehicleSeat.dbc. Skipping entry.", seatID);
4120 continue;
4121 }
4122
4123 // Sanitizing values
4124 if (orientation > float(M_PI * 2))
4125 {
4126 LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: {} is using invalid angle offset value ({}). Set Value to 0.", seatID, orientation);
4127 orientation = 0.0f;
4128 }
4129
4131 {
4132 LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: {} is using invalid exit parameter value ({}). Setting to 0 (none).", seatID, exitParam);
4133 continue;
4134 }
4135
4136 _vehicleSeatAddonStore[seatID] = VehicleSeatAddon(orientation, exitX, exitY, exitZ, exitO, exitParam);
4137
4138 ++count;
4139 } while (result->NextRow());
4140
4141 LOG_INFO("server.loading", ">> Loaded {} Vehicle Seat Addon entries in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4142}
DBCStorage< VehicleSeatEntry > sVehicleSeatStore(VehicleSeatEntryfmt)
Definition VehicleDefines.h:86

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

◆ LoadVehicleTemplateAccessories()

void ObjectMgr::LoadVehicleTemplateAccessories ( )
3989{
3990 uint32 oldMSTime = getMSTime();
3991
3992 _vehicleTemplateAccessoryStore.clear(); // needed for reload case
3993
3994 uint32 count = 0;
3995
3996 // 0 1 2 3 4 5
3997 QueryResult result = WorldDatabase.Query("SELECT `entry`, `accessory_entry`, `seat_id`, `minion`, `summontype`, `summontimer` FROM `vehicle_template_accessory`");
3998
3999 if (!result)
4000 {
4001 LOG_WARN("server.loading", ">> Loaded 0 vehicle template accessories. DB table `vehicle_template_accessory` is empty.");
4002 LOG_INFO("server.loading", " ");
4003 return;
4004 }
4005
4006 do
4007 {
4008 Field* fields = result->Fetch();
4009
4010 uint32 uiEntry = fields[0].Get<uint32>();
4011 uint32 uiAccessory = fields[1].Get<uint32>();
4012 int8 uiSeat = int8(fields[2].Get<int8>());
4013 bool bMinion = fields[3].Get<bool>();
4014 uint8 uiSummonType = fields[4].Get<uint8>();
4015 uint32 uiSummonTimer = fields[5].Get<uint32>();
4016
4017 if (!GetCreatureTemplate(uiEntry))
4018 {
4019 LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: creature template entry {} does not exist.", uiEntry);
4020 continue;
4021 }
4022
4023 if (!GetCreatureTemplate(uiAccessory))
4024 {
4025 LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: Accessory {} does not exist.", uiAccessory);
4026 continue;
4027 }
4028
4029 if (_spellClickInfoStore.find(uiEntry) == _spellClickInfoStore.end())
4030 {
4031 LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: creature template entry {} has no data in npc_spellclick_spells", uiEntry);
4032 continue;
4033 }
4034
4035 _vehicleTemplateAccessoryStore[uiEntry].push_back(VehicleAccessory(uiAccessory, uiSeat, bMinion, uiSummonType, uiSummonTimer));
4036
4037 ++count;
4038 } while (result->NextRow());
4039
4040 LOG_INFO("server.loading", ">> Loaded {} Vehicle Template Accessories in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4041 LOG_INFO("server.loading", " ");
4042}

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

◆ LoadVendors()

void ObjectMgr::LoadVendors ( )
10140{
10141 uint32 oldMSTime = getMSTime();
10142
10143 // For reload case
10144 for (CacheVendorItemContainer::iterator itr = _cacheVendorItemStore.begin(); itr != _cacheVendorItemStore.end(); ++itr)
10145 itr->second.Clear();
10146 _cacheVendorItemStore.clear();
10147
10148 std::set<uint32> skip_vendors;
10149
10150 QueryResult result = WorldDatabase.Query("SELECT entry, item, maxcount, incrtime, ExtendedCost FROM npc_vendor ORDER BY entry, slot ASC, item, ExtendedCost");
10151 if (!result)
10152 {
10153 LOG_INFO("server.loading", " ");
10154 LOG_WARN("server.loading", ">> Loaded 0 Vendors. DB table `npc_vendor` is empty!");
10155 return;
10156 }
10157
10158 uint32 count = 0;
10159
10160 do
10161 {
10162 Field* fields = result->Fetch();
10163
10164 uint32 entry = fields[0].Get<uint32>();
10165 int32 item_id = fields[1].Get<int32>();
10166
10167 // if item is a negative, its a reference
10168 if (item_id < 0)
10169 count += LoadReferenceVendor(entry, -item_id, &skip_vendors);
10170 else
10171 {
10172 uint32 maxcount = fields[2].Get<uint32>();
10173 uint32 incrtime = fields[3].Get<uint32>();
10174 uint32 ExtendedCost = fields[4].Get<uint32>();
10175
10176 if (!IsVendorItemValid(entry, item_id, maxcount, incrtime, ExtendedCost, nullptr, &skip_vendors))
10177 continue;
10178
10179 VendorItemData& vList = _cacheVendorItemStore[entry];
10180
10181 vList.AddItem(item_id, maxcount, incrtime, ExtendedCost);
10182 ++count;
10183 }
10184 } while (result->NextRow());
10185
10186 LOG_INFO("server.loading", ">> Loaded {} Vendors in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10187 LOG_INFO("server.loading", " ");
10188}

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

◆ LoadWaypointScripts()

void ObjectMgr::LoadWaypointScripts ( )
6251{
6253
6254 std::set<uint32> actionSet;
6255
6256 for (ScriptMapMap::const_iterator itr = sWaypointScripts.begin(); itr != sWaypointScripts.end(); ++itr)
6257 actionSet.insert(itr->first);
6258
6260 PreparedQueryResult result = WorldDatabase.Query(stmt);
6261
6262 if (result)
6263 {
6264 do
6265 {
6266 Field* fields = result->Fetch();
6267 uint32 action = fields[0].Get<uint32>();
6268
6269 actionSet.erase(action);
6270 } while (result->NextRow());
6271 }
6272
6273 for (std::set<uint32>::iterator itr = actionSet.begin(); itr != actionSet.end(); ++itr)
6274 LOG_ERROR("sql.sql", "There is no waypoint which links to the waypoint script {}", *itr);
6275}
ScriptMapMap sWaypointScripts
Definition ObjectMgr.cpp:62
@ SCRIPTS_WAYPOINT
Definition ObjectMgr.h:151
@ 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
1359{ return _gameObjectDataStore[guid]; }

References _gameObjectDataStore.

Referenced by AddGOData().

◆ NewOrExistCreatureData()

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

References _creatureDataStore.

Referenced by AddCreData().

◆ OnDeleteSpawnData()

void ObjectMgr::OnDeleteSpawnData ( SpawnData const *  data)
8876{
8877 auto templateIt = _spawnGroupDataStore.find(data->spawnGroupId);
8878 ASSERT(templateIt != _spawnGroupDataStore.end(), "Spawn data is being deleted and has invalid spawn group index {}!", data->spawnGroupId);
8879 if (templateIt->second.flags & SPAWNGROUP_FLAG_SYSTEM)
8880 return;
8881
8882 auto pair = _spawnGroupMapStore.equal_range(data->spawnGroupId);
8883 for (auto it = pair.first; it != pair.second; ++it)
8884 {
8885 if (it->second != data)
8886 continue;
8887 _spawnGroupMapStore.erase(it);
8888 return;
8889 }
8890 ASSERT(false, "Spawn data being removed is member of spawn group {}, but not found in lookup table!", data->spawnGroupId);
8891}

References _spawnGroupDataStore, _spawnGroupMapStore, ASSERT, SPAWNGROUP_FLAG_SYSTEM, and SpawnData::spawnGroupId.

◆ PlayerCreateInfoAddItemHelper()

void ObjectMgr::PlayerCreateInfoAddItemHelper ( uint32  race_,
uint32  class_,
uint32  itemId,
int32  count 
)
private
4250{
4251 if (!_playerInfo[race_][class_])
4252 return;
4253
4254 if (count > 0)
4255 _playerInfo[race_][class_]->item.push_back(PlayerCreateInfoItem(itemId, count));
4256 else
4257 {
4258 if (count < -1)
4259 LOG_ERROR("sql.sql", "Invalid count {} specified on item {} be removed from original player create info (use -1)!", count, itemId);
4260
4261 for (uint32 gender = 0; gender < GENDER_NONE; ++gender)
4262 {
4263 if (CharStartOutfitEntry const* entry = GetCharStartOutfitEntry(race_, class_, gender))
4264 {
4265 bool found = false;
4266 for (uint8 x = 0; x < MAX_OUTFIT_ITEMS; ++x)
4267 {
4268 if (entry->ItemId[x] > 0 && uint32(entry->ItemId[x]) == itemId)
4269 {
4270 found = true;
4271 const_cast<CharStartOutfitEntry*>(entry)->ItemId[x] = 0;
4272 break;
4273 }
4274 }
4275
4276 if (!found)
4277 LOG_ERROR("sql.sql", "Item {} specified to be removed from original create info not found in dbc!", itemId);
4278 }
4279 }
4280 }
4281}
CharStartOutfitEntry const * GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender)
Definition DBCStores.cpp:842
Definition Player.h:266

References _playerInfo, GENDER_NONE, GetCharStartOutfitEntry(), LOG_ERROR, and MAX_OUTFIT_ITEMS.

Referenced by LoadPlayerInfo().

◆ RemoveCreatureFromGrid()

void ObjectMgr::RemoveCreatureFromGrid ( ObjectGuid::LowType  guid,
CreatureData const *  data 
)
2735{
2736 uint8 mask = data->spawnMask;
2737 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2738 {
2739 if (mask & 1)
2740 {
2741 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2742 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2743 cell_guids.creatures.erase(guid);
2744 }
2745 }
2746}

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

Referenced by DeleteCreatureData().

◆ RemoveGameobjectFromGrid()

void ObjectMgr::RemoveGameobjectFromGrid ( ObjectGuid::LowType  guid,
GameObjectData const *  data 
)
3187{
3188 uint8 mask = data->spawnMask;
3189 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
3190 {
3191 if (mask & 1)
3192 {
3193 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
3194 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
3195 cell_guids.gameobjects.erase(guid);
3196 }
3197 }
3198}

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

Referenced by DeleteGOData().

◆ RemoveVendorItem()

bool ObjectMgr::RemoveVendorItem ( uint32  entry,
uint32  item,
bool  persist = true 
)
10341{
10342 CacheVendorItemContainer::iterator iter = _cacheVendorItemStore.find(entry);
10343 if (iter == _cacheVendorItemStore.end())
10344 return false;
10345
10346 if (!iter->second.RemoveItem(item))
10347 return false;
10348
10349 if (persist)
10350 {
10352
10353 stmt->SetData(0, entry);
10354 stmt->SetData(1, item);
10355
10356 WorldDatabase.Execute(stmt);
10357 }
10358
10359 return true;
10360}
@ WORLD_DEL_NPC_VENDOR
Definition WorldDatabase.h:44

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

◆ ReturnOrDeleteOldMails()

void ObjectMgr::ReturnOrDeleteOldMails ( bool  serverUp)
6746{
6747 uint32 oldMSTime = getMSTime();
6748
6749 time_t curTime = GameTime::GetGameTime().count();
6750
6752 stmt->SetData(0, uint32(curTime));
6753 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6754 if (!result)
6755 return;
6756
6757 std::map<uint32 /*messageId*/, MailItemInfoVec> itemsCache;
6758 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_EXPIRED_MAIL_ITEMS);
6759 stmt->SetData(0, uint32(curTime));
6760 if (PreparedQueryResult items = CharacterDatabase.Query(stmt))
6761 {
6762 MailItemInfo item;
6763 do
6764 {
6765 Field* fields = items->Fetch();
6766 item.item_guid = fields[0].Get<uint32>();
6767 item.item_template = fields[1].Get<uint32>();
6768 uint32 mailId = fields[2].Get<uint32>();
6769 itemsCache[mailId].push_back(item);
6770 } while (items->NextRow());
6771 }
6772
6773 uint32 deletedCount = 0;
6774 uint32 returnedCount = 0;
6775 do
6776 {
6777 Field* fields = result->Fetch();
6778 Mail* m = new Mail;
6779 m->messageID = fields[0].Get<uint32>();
6780 m->messageType = fields[1].Get<uint8>();
6781 m->sender = fields[2].Get<uint32>();
6782 m->receiver = fields[3].Get<uint32>();
6783 bool has_items = fields[4].Get<bool>();
6784 m->expire_time = time_t(fields[5].Get<uint32>());
6785 m->deliver_time = time_t(0);
6786 m->stationery = fields[6].Get<uint8>();
6787 m->checked = fields[7].Get<uint8>();
6788 m->mailTemplateId = fields[8].Get<int16>();
6789
6790 Player* player = nullptr;
6791 if (serverUp)
6793
6794 if (player) // don't modify mails of a logged in player
6795 {
6796 delete m;
6797 continue;
6798 }
6799
6800 // Delete or return mail
6801 if (has_items)
6802 {
6803 // read items from cache
6804 m->items.swap(itemsCache[m->messageID]);
6805
6806 // If it is mail from non-player, or if it's already return mail, it shouldn't be returned, but deleted
6807 if (!m->IsSentByPlayer() || m->IsSentByGM() || (m->IsCODPayment() || m->IsReturnedMail()))
6808 {
6809 for (auto const& mailedItem : m->items)
6810 {
6811 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
6812 stmt->SetData(0, mailedItem.item_guid);
6813 CharacterDatabase.Execute(stmt);
6814 }
6815
6816 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
6817 stmt->SetData(0, m->messageID);
6818 CharacterDatabase.Execute(stmt);
6819 }
6820 else
6821 {
6822 // Mail will be returned
6823 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_RETURNED);
6824 stmt->SetData(0, m->receiver);
6825 stmt->SetData(1, m->sender);
6826 stmt->SetData(2, uint32(curTime + 30 * DAY));
6827 stmt->SetData(3, uint32(curTime));
6829 stmt->SetData(5, m->messageID);
6830 CharacterDatabase.Execute(stmt);
6831 for (auto const& mailedItem : m->items)
6832 {
6833 // Update receiver in mail items for its proper delivery, and in instance_item for avoid lost item at sender delete
6834 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_ITEM_RECEIVER);
6835 stmt->SetData(0, m->sender);
6836 stmt->SetData(1, mailedItem.item_guid);
6837 CharacterDatabase.Execute(stmt);
6838
6839 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_OWNER);
6840 stmt->SetData(0, m->sender);
6841 stmt->SetData(1, mailedItem.item_guid);
6842 CharacterDatabase.Execute(stmt);
6843 }
6844
6845 // xinef: update global data
6846 sCharacterCache->IncreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->sender));
6847 sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver));
6848
6849 delete m;
6850 ++returnedCount;
6851 continue;
6852 }
6853 }
6854
6855 sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver));
6856
6857 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
6858 stmt->SetData(0, m->messageID);
6859 CharacterDatabase.Execute(stmt);
6860 delete m;
6861 ++deletedCount;
6862 } while (result->NextRow());
6863
6864 LOG_INFO("server.loading", ">> Processed {} expired mails: {} deleted and {} returned in {} ms", deletedCount + returnedCount, deletedCount, returnedCount, GetMSTimeDiffToNow(oldMSTime));
6865 LOG_INFO("server.loading", " ");
6866}
#define sCharacterCache
Definition CharacterCache.h:83
@ 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:383
@ CHAR_UPD_MAIL_ITEM_RECEIVER
Definition CharacterDatabase.h:117
std::vector< MailItemInfo > MailItemInfoVec
Definition Mail.h:164
@ MAIL_CHECK_MASK_RETURNED
Definition Mail.h:48
Definition Player.h:1084
Seconds GetGameTime()
Definition GameTime.cpp:38
Player * FindPlayerByLowGUID(ObjectGuid::LowType lowguid)
Definition ObjectAccessor.cpp:251
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, Player, Mail::receiver, sCharacterCache, Mail::sender, PreparedStatementBase::SetData(), and Mail::stationery.

◆ SetCreatureLinkedRespawn()

bool ObjectMgr::SetCreatureLinkedRespawn ( ObjectGuid::LowType  guid,
ObjectGuid::LowType  linkedGuid 
)
2107{
2108 if (!guidLow)
2109 return false;
2110
2111 CreatureData const* master = GetCreatureData(guidLow);
2112 ObjectGuid guid = ObjectGuid::Create<HighGuid::Unit>(master->id1, guidLow);
2113
2114 if (!linkedGuidLow) // we're removing the linking
2115 {
2116 _linkedRespawnStore.erase(guid);
2118 stmt->SetData(0, guidLow);
2119 WorldDatabase.Execute(stmt);
2120 return true;
2121 }
2122
2123 CreatureData const* slave = GetCreatureData(linkedGuidLow);
2124 if (!slave)
2125 {
2126 LOG_ERROR("sql.sql", "Creature '{}' linking to non-existent creature '{}'.", guidLow, linkedGuidLow);
2127 return false;
2128 }
2129
2130 MapEntry const* map = sMapStore.LookupEntry(master->mapid);
2131 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
2132 {
2133 LOG_ERROR("sql.sql", "Creature '{}' linking to '{}' on an unpermitted map.", guidLow, linkedGuidLow);
2134 return false;
2135 }
2136
2137 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
2138 {
2139 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
2140 return false;
2141 }
2142
2143 ObjectGuid linkedGuid = ObjectGuid::Create<HighGuid::Unit>(slave->id1, linkedGuidLow);
2144
2145 _linkedRespawnStore[guid] = linkedGuid;
2147 stmt->SetData(0, guidLow);
2148 stmt->SetData(1, linkedGuidLow);
2149 WorldDatabase.Execute(stmt);
2150 return true;
2151}
@ 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, SpawnData::mapid, PreparedStatementBase::SetData(), sMapStore, SpawnData::spawnMask, WORLD_DEL_CRELINKED_RESPAWN, WORLD_REP_CREATURE_LINKED_RESPAWN, and WorldDatabase.

◆ SetDBCLocaleIndex()

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

References DBCLocaleIndex.

◆ SetHighestGuids()

void ObjectMgr::SetHighestGuids ( )
7633{
7634 QueryResult result = CharacterDatabase.Query("SELECT MAX(guid) FROM characters");
7635 if (result)
7636 GetGuidSequenceGenerator<HighGuid::Player>().Set((*result)[0].Get<uint32>() + 1);
7637
7638 result = CharacterDatabase.Query("SELECT MAX(guid) FROM item_instance");
7639 if (result)
7640 GetGuidSequenceGenerator<HighGuid::Item>().Set((*result)[0].Get<uint32>() + 1);
7641
7642 // Cleanup other tables from not existed guids ( >= _hiItemGuid)
7643 CharacterDatabase.Execute("DELETE FROM character_inventory WHERE item >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7644 CharacterDatabase.Execute("DELETE FROM mail_items WHERE item_guid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7645 CharacterDatabase.Execute("DELETE FROM auctionhouse WHERE itemguid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7646 CharacterDatabase.Execute("DELETE FROM guild_bank_item WHERE item_guid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7647
7648 result = WorldDatabase.Query("SELECT MAX(guid) FROM transports");
7649 if (result)
7650 GetGuidSequenceGenerator<HighGuid::Mo_Transport>().Set((*result)[0].Get<uint32>() + 1);
7651
7652 result = CharacterDatabase.Query("SELECT MAX(id) FROM auctionhouse");
7653 if (result)
7654 _auctionId = (*result)[0].Get<uint32>() + 1;
7655
7656 result = CharacterDatabase.Query("SELECT MAX(id) FROM mail");
7657 if (result)
7658 _mailId = (*result)[0].Get<uint32>() + 1;
7659
7660 result = CharacterDatabase.Query("SELECT MAX(arenateamid) FROM arena_team");
7661 if (result)
7662 sArenaTeamMgr->SetNextArenaTeamId((*result)[0].Get<uint32>() + 1);
7663
7664 result = CharacterDatabase.Query("SELECT MAX(fight_id) FROM log_arena_fights");
7665 if (result)
7666 sArenaTeamMgr->SetLastArenaLogId((*result)[0].Get<uint32>());
7667
7668 result = CharacterDatabase.Query("SELECT MAX(setguid) FROM character_equipmentsets");
7669 if (result)
7670 _equipmentSetGuid = (*result)[0].Get<uint64>() + 1;
7671
7672 result = CharacterDatabase.Query("SELECT MAX(guildId) FROM guild");
7673 if (result)
7674 sGuildMgr->SetNextGuildId((*result)[0].Get<uint32>() + 1);
7675
7676 result = WorldDatabase.Query("SELECT MAX(guid) FROM creature");
7677 if (result)
7678 _creatureSpawnId = (*result)[0].Get<uint32>() + 1;
7679
7680 result = WorldDatabase.Query("SELECT MAX(guid) FROM gameobject");
7681 if (result)
7682 _gameObjectSpawnId = (*result)[0].Get<uint32>() + 1;
7683}
#define sArenaTeamMgr
Definition ArenaTeamMgr.h:69
#define sGuildMgr
Definition GuildMgr.h:51

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

◆ ValidateSpellScripts()

void ObjectMgr::ValidateSpellScripts ( )
6338{
6339 uint32 oldMSTime = getMSTime();
6340
6341 if (_spellScriptsStore.empty())
6342 {
6343 LOG_INFO("server.loading", ">> Validated 0 scripts.");
6344 LOG_INFO("server.loading", " ");
6345 return;
6346 }
6347
6348 uint32 count = 0;
6349
6350 for (SpellScriptsContainer::iterator itr = _spellScriptsStore.begin(); itr != _spellScriptsStore.end();)
6351 {
6352 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
6353 std::vector<std::pair<SpellScriptLoader*, SpellScriptsContainer::iterator> > SpellScriptLoaders;
6354 sScriptMgr->CreateSpellScriptLoaders(itr->first, SpellScriptLoaders);
6355 itr = _spellScriptsStore.upper_bound(itr->first);
6356
6357 for (std::vector<std::pair<SpellScriptLoader*, SpellScriptsContainer::iterator> >::iterator sitr = SpellScriptLoaders.begin(); sitr != SpellScriptLoaders.end(); ++sitr)
6358 {
6359 SpellScript* spellScript = sitr->first->GetSpellScript();
6360 AuraScript* auraScript = sitr->first->GetAuraScript();
6361 bool valid = true;
6362 if (!spellScript && !auraScript)
6363 {
6364 LOG_ERROR("sql.sql", "Functions GetSpellScript() and GetAuraScript() of script `{}` do not return objects - script skipped", GetScriptName(sitr->second->second));
6365 valid = false;
6366 }
6367 if (spellScript)
6368 {
6369 spellScript->_Init(&sitr->first->GetName(), spellInfo->Id);
6370 spellScript->_Register();
6371 if (!spellScript->_Validate(spellInfo))
6372 valid = false;
6373 delete spellScript;
6374 }
6375 if (auraScript)
6376 {
6377 auraScript->_Init(&sitr->first->GetName(), spellInfo->Id);
6378 auraScript->_Register();
6379 if (!auraScript->_Validate(spellInfo))
6380 valid = false;
6381 delete auraScript;
6382 }
6383 if (!valid)
6384 {
6385 _spellScriptsStore.erase(sitr->second);
6386 }
6387 }
6388 ++count;
6389 }
6390
6391 LOG_INFO("server.loading", ">> Validated {} scripts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6392 LOG_INFO("server.loading", " ");
6393}
Definition SpellScript.h:518
bool _Validate(SpellInfo const *entry) override
Definition SpellScript.cpp:662
std::string const & GetScriptName(uint32 id) const
Definition ObjectMgr.cpp:10498
Definition SpellScript.h:182
bool _Validate(SpellInfo const *entry) override
Definition SpellScript.cpp:316
virtual void _Register()
Definition SpellScript.cpp:45
virtual void _Init(std::string const *scriptname, uint32 spellId)
Definition SpellScript.cpp:59

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

◆ _breadcrumbsForQuest

BreadcrumbQuestMap ObjectMgr::_breadcrumbsForQuest

◆ _broadcastTextStore

BroadcastTextContainer ObjectMgr::_broadcastTextStore
private

◆ _cacheVendorItemStore

◆ _classTrainers

std::unordered_map<uint8, std::vector<Trainer::Trainer const*> > ObjectMgr::_classTrainers
private

Referenced by GetClassTrainers(), and LoadTrainers().

◆ _creatureAddonStore

CreatureAddonContainer ObjectMgr::_creatureAddonStore
private

◆ _creatureBaseStatsStore

CreatureBaseStatsContainer ObjectMgr::_creatureBaseStatsStore
private

◆ _creatureCustomIDsStore

CreatureCustomIDsContainer ObjectMgr::_creatureCustomIDsStore
private

◆ _creatureDataStore

◆ _creatureDefaultTrainers

std::unordered_map<uint32, uint32> ObjectMgr::_creatureDefaultTrainers
private

◆ _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

◆ _creatureSparringStore

CreatureSparringContainer ObjectMgr::_creatureSparringStore
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 GetGridObjectGuids().

◆ _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

◆ _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

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

◆ _goSummonDataStore

GameObjectSummonDataContainer ObjectMgr::_goSummonDataStore
private

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

Referenced by GetGameObjectSummonGroup(), and LoadGameObjectSummons().

◆ _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

std::vector<std::vector<PlayerInfo*> > ObjectMgr::_playerInfo
private

◆ _playerShapeshiftModel

PlayerShapeshiftModelMap ObjectMgr::_playerShapeshiftModel
private

◆ _playerTotemModel

PlayerTotemModelMap ObjectMgr::_playerTotemModel
private

◆ _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

◆ _spawnGroupDataStore

◆ _spawnGroupMapStore

SpawnGroupLinkContainer ObjectMgr::_spawnGroupMapStore
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().

◆ _trainers

std::unordered_map<uint32, Trainer::Trainer> ObjectMgr::_trainers
private

Referenced by GetTrainer(), and LoadTrainers().

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


The documentation for this class was generated from the following files: