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
 

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)
 
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 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 LoadTrainerSpell ()
 
void AddSpellToTrainer (uint32 entry, uint32 spell, uint32 spellCost, uint32 reqSkill, uint32 reqSkillValue, uint32 reqLevel, uint32 reqSpell)
 
std::string GeneratePetName (uint32 entry)
 
std::string GeneratePetNameLocale (uint32 entry, LocaleConstant locale)
 
uint32 GetBaseXP (uint8 level)
 
uint32 GetXPForLevel (uint8 level) const
 
int32 GetFishingBaseSkillLevel (uint32 entry) const
 
void ReturnOrDeleteOldMails (bool serverUp)
 
CreatureBaseStats const * GetCreatureBaseStats (uint8 level, uint8 unitClass)
 
void SetHighestGuids ()
 
template<HighGuid type>
ObjectGuidGeneratorBaseGetGenerator ()
 
uint32 GenerateAuctionID ()
 
uint64 GenerateEquipmentSetGuid ()
 
uint32 GenerateMailID ()
 
uint32 GeneratePetNumber ()
 
ObjectGuid::LowType GenerateCreatureSpawnId ()
 
ObjectGuid::LowType GenerateGameObjectSpawnId ()
 
MailLevelReward const * GetMailLevelReward (uint32 level, uint32 raceMask)
 
CellObjectGuids const & 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
 
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)
 
void DeleteCreatureData (ObjectGuid::LowType spawnId)
 
ObjectGuid GetLinkedRespawnGuid (ObjectGuid guid) const
 
GameObjectDataContainer const & GetAllGOData () const
 
GameObjectData const * GetGameObjectData (ObjectGuid::LowType spawnId) const
 
CreatureLocale const * GetCreatureLocale (uint32 entry) const
 
GameObjectLocale const * GetGameObjectLocale (uint32 entry) const
 
ItemLocale const * GetItemLocale (uint32 entry) const
 
ItemSetNameLocale const * GetItemSetNameLocale (uint32 entry) const
 
PageTextLocale const * GetPageTextLocale (uint32 entry) const
 
QuestLocale const * GetQuestLocale (uint32 entry) const
 
GossipMenuItemsLocale const * GetGossipMenuItemsLocale (uint32 entry) const
 
PointOfInterestLocale const * GetPointOfInterestLocale (uint32 poi_id) const
 
QuestOfferRewardLocale const * GetQuestOfferRewardLocale (uint32 entry) const
 
QuestRequestItemsLocale const * GetQuestRequestItemsLocale (uint32 entry) const
 
NpcTextLocale const * GetNpcTextLocale (uint32 entry) const
 
QuestGreeting const * GetQuestGreeting (TypeID type, uint32 id) const
 
GameObjectDataNewGOData (ObjectGuid::LowType guid)
 
void DeleteGOData (ObjectGuid::LowType guid)
 
ModuleString const * GetModuleString (std::string module, uint32 id) const
 
std::string const * GetModuleString (std::string module, uint32 id, LocaleConstant locale) const
 
AcoreString const * GetAcoreString (uint32 entry) const
 
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)
 
TrainerSpellData const * GetNpcTrainerSpells (uint32 entry) const
 
VendorItemData const * GetNpcVendorItemList (uint32 entry) const
 
void AddVendorItem (uint32 entry, uint32 item, int32 maxcount, uint32 incrtime, uint32 extendedCost, bool persist=true)
 
bool RemoveVendorItem (uint32 entry, uint32 item, bool persist=true)
 
bool IsVendorItemValid (uint32 vendor_entry, uint32 item, int32 maxcount, uint32 ptime, uint32 ExtendedCost, Player *player=nullptr, std::set< uint32 > *skip_vendors=nullptr, uint32 ORnpcflag=0) const
 
void LoadScriptNames ()
 
ScriptNameContainerGetScriptNames ()
 
std::string const & GetScriptName (uint32 id) const
 
uint32 GetScriptId (std::string const &name)
 
SpellClickInfoMapBounds GetSpellClickInfoMapBounds (uint32 creature_id) const
 
GossipMenusMapBounds GetGossipMenusMapBounds (uint32 uiMenuId) const
 
GossipMenusMapBoundsNonConst GetGossipMenusMapBoundsNonConst (uint32 uiMenuId)
 
GossipMenuItemsMapBounds GetGossipMenuItemsMapBounds (uint32 uiMenuId) const
 
GossipMenuItemsMapBoundsNonConst GetGossipMenuItemsMapBoundsNonConst (uint32 uiMenuId)
 
void LoadFactionChangeAchievements ()
 
void LoadFactionChangeItems ()
 
void LoadFactionChangeQuests ()
 
void LoadFactionChangeReputations ()
 
void LoadFactionChangeSpells ()
 
void LoadFactionChangeTitles ()
 
bool IsTransportMap (uint32 mapId) const
 
VehicleSeatAddon const * GetVehicleSeatAddon (uint32 seatId) const
 
uint32 GetQuestMoneyReward (uint8 level, uint32 questMoneyDifficulty) const
 

Static Public Member Functions

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

Public Attributes

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

Private Types

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

Private Member Functions

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

Private Attributes

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

◆ 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 
1626 {
1628 CREATURE_TO_GO, // Creature is dependant on GO
1629 GO_TO_GO,
1630 GO_TO_CREATURE, // GO is dependant on creature
1631 };
@ CREATURE_TO_GO
Definition ObjectMgr.h:1628
@ CREATURE_TO_CREATURE
Definition ObjectMgr.h:1627
@ GO_TO_GO
Definition ObjectMgr.h:1629
@ GO_TO_CREATURE
Definition ObjectMgr.h:1630

Constructor & Destructor Documentation

◆ ObjectMgr()

ObjectMgr::ObjectMgr ( )
private
299 :
300 _auctionId(1),
302 _mailId(1),
303 _hiPetNumber(1),
307{
308 for (uint8 i = 0; i < MAX_CLASSES; ++i)
309 {
310 _playerClassInfo[i] = nullptr;
311 for (uint8 j = 0; j < MAX_RACES; ++j)
312 _playerInfo[j][i] = nullptr;
313 }
314}
@ LOCALE_enUS
Definition Common.h:118
std::uint8_t uint8
Definition Define.h:109
#define MAX_RACES
Definition SharedDefines.h:95
#define MAX_CLASSES
Definition SharedDefines.h:155
PlayerInfo * _playerInfo[MAX_RACES][MAX_CLASSES]
Definition ObjectMgr.h:1559
ObjectGuid::LowType _gameObjectSpawnId
Definition ObjectMgr.h:1468
uint32 _mailId
Definition ObjectMgr.h:1462
ObjectGuid::LowType _creatureSpawnId
Definition ObjectMgr.h:1467
LocaleConstant DBCLocaleIndex
Definition ObjectMgr.h:1535
PlayerClassInfo * _playerClassInfo[MAX_CLASSES]
Definition ObjectMgr.h:1555
uint64 _equipmentSetGuid
Definition ObjectMgr.h:1461
uint32 _auctionId
Definition ObjectMgr.h:1460
uint32 _hiPetNumber
Definition ObjectMgr.h:1464

References _playerClassInfo, _playerInfo, MAX_CLASSES, and MAX_RACES.

◆ ~ObjectMgr()

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

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

Member Function Documentation

◆ AddCreatureToGrid()

void ObjectMgr::AddCreatureToGrid ( ObjectGuid::LowType  guid,
CreatureData const *  data 
)
2488{
2489 uint8 mask = data->spawnMask;
2490 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2491 {
2492 if (mask & 1)
2493 {
2494 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2495 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2496 cell_guids.creatures.insert(guid);
2497 }
2498 }
2499}
uint32 MAKE_PAIR32(uint16 l, uint16 h)
Definition ObjectDefines.h:88
MapObjectGuids _mapObjectGuidsStore
Definition ObjectMgr.h:1580
GridCoord ComputeGridCoord(float x, float y)
Definition GridDefines.h:185
Definition ObjectMgr.h:478
CellGuidSet creatures
Definition ObjectMgr.h:479
Definition GridDefines.h:88
uint32 GetId() const
Definition GridDefines.h:150

References _mapObjectGuidsStore, Acore::ComputeGridCoord(), CellObjectGuids::creatures, CoordPair< LIMIT >::GetId(), MAKE_PAIR32(), CreatureData::mapid, CreatureData::posX, CreatureData::posY, and CreatureData::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 
)
2567{
2568 CreatureTemplate const* cInfo = GetCreatureTemplate(entry);
2569 if (!cInfo)
2570 return 0;
2571
2572 uint32 level = cInfo->minlevel == cInfo->maxlevel ? cInfo->minlevel : urand(cInfo->minlevel, cInfo->maxlevel); // Only used for extracting creature base stats
2573 CreatureBaseStats const* stats = GetCreatureBaseStats(level, cInfo->unit_class);
2574 Map* map = sMapMgr->CreateBaseMap(mapId);
2575 if (!map)
2576 return 0;
2577
2579 CreatureData& data = NewOrExistCreatureData(spawnId);
2580 data.spawnMask = spawnId;
2581 data.id1 = entry;
2582 data.id2 = 0;
2583 data.id3 = 0;
2584 data.mapid = mapId;
2585 data.displayid = 0;
2586 data.equipmentId = 0;
2587 data.posX = x;
2588 data.posY = y;
2589 data.posZ = z;
2590 data.orientation = o;
2591 data.spawntimesecs = spawntimedelay;
2592 data.wander_distance = 0;
2593 data.currentwaypoint = 0;
2594 data.curhealth = stats->GenerateHealth(cInfo);
2595 data.curmana = stats->GenerateMana(cInfo);
2596 data.movementType = cInfo->MovementType;
2597 data.spawnMask = 1;
2599 data.dbData = false;
2600 data.npcflag = cInfo->npcflag;
2601 data.unit_flags = cInfo->unit_flags;
2602 data.dynamicflags = cInfo->dynamicflags;
2603
2604 AddCreatureToGrid(spawnId, &data);
2605
2606 // Spawn if necessary (loaded grids only)
2607 if (!map->Instanceable() && map->IsGridLoaded(x, y))
2608 {
2609 Creature* creature = new Creature();
2610 if (!creature->LoadCreatureFromDB(spawnId, map, true, true))
2611 {
2612 LOG_ERROR("sql.sql", "AddCreature: Cannot add creature entry {} to map", entry);
2613 delete creature;
2614 return 0;
2615 }
2616 }
2617
2618 return spawnId;
2619}
std::uint32_t uint32
Definition Define.h:107
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
#define sMapMgr
Definition MapMgr.h:220
@ PHASEMASK_NORMAL
Definition Object.h:62
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:1705
Definition Map.h:163
bool IsGridLoaded(GridCoord const &gridCoord) const
Definition Map.cpp:200
bool Instanceable() const
Definition Map.h:294
uint32 LowType
Definition ObjectGuid.h:122
CreatureBaseStats const * GetCreatureBaseStats(uint8 level, uint8 unitClass)
Definition ObjectMgr.cpp:9961
void AddCreatureToGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition ObjectMgr.cpp:2487
ObjectGuid::LowType GenerateCreatureSpawnId()
Definition ObjectMgr.cpp:7275
CreatureData & NewOrExistCreatureData(ObjectGuid::LowType spawnId)
Definition ObjectMgr.h:1216
CreatureTemplate const * GetCreatureTemplate(uint32 entry)
Definition ObjectMgr.cpp:10309
Definition CreatureData.h:303
uint32 GenerateMana(CreatureTemplate const *info) const
Definition CreatureData.h:318
uint32 GenerateHealth(CreatureTemplate const *info) const
Definition CreatureData.h:313
Definition CreatureData.h:370
float wander_distance
Definition CreatureData.h:384
uint32 phaseMask
Definition CreatureData.h:376
uint32 spawntimesecs
Definition CreatureData.h:383
uint32 dynamicflags
Definition CreatureData.h:392
uint32 npcflag
Definition CreatureData.h:390
bool dbData
Definition CreatureData.h:394
uint32 displayid
Definition CreatureData.h:377
uint8 movementType
Definition CreatureData.h:388
uint8 spawnMask
Definition CreatureData.h:389
uint32 unit_flags
Definition CreatureData.h:391
uint32 id2
Definition CreatureData.h:373
uint32 curhealth
Definition CreatureData.h:386
float orientation
Definition CreatureData.h:382
uint32 curmana
Definition CreatureData.h:387
uint32 id3
Definition CreatureData.h:374
float posY
Definition CreatureData.h:380
float posX
Definition CreatureData.h:379
int8 equipmentId
Definition CreatureData.h:378
uint32 currentwaypoint
Definition CreatureData.h:385
uint16 mapid
Definition CreatureData.h:375
float posZ
Definition CreatureData.h:381
uint32 id1
Definition CreatureData.h:372
Definition CreatureData.h:186
uint32 unit_flags
Definition CreatureData.h:214
uint8 minlevel
Definition CreatureData.h:195
uint8 maxlevel
Definition CreatureData.h:196
uint32 MovementType
Definition CreatureData.h:234
uint32 npcflag
Definition CreatureData.h:199
uint32 unit_class
Definition CreatureData.h:213
uint32 dynamicflags
Definition CreatureData.h:216

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

◆ AddGameobjectInfo()

void ObjectMgr::AddGameobjectInfo ( GameObjectTemplate goinfo)

◆ AddGameobjectToGrid()

void ObjectMgr::AddGameobjectToGrid ( ObjectGuid::LowType  guid,
GameObjectData const *  data 
)
2794{
2795 uint8 mask = data->spawnMask;
2796 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2797 {
2798 if (mask & 1)
2799 {
2800 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2801 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2802 cell_guids.gameobjects.insert(guid);
2803 }
2804 }
2805}
CellGuidSet gameobjects
Definition ObjectMgr.h:480

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

Referenced by AddGOData(), and LoadGameobjects().

◆ AddGameTele()

bool ObjectMgr::AddGameTele ( GameTele data)
9193{
9194 // find max id
9195 uint32 new_id = 0;
9196 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9197 if (itr->first > new_id)
9198 new_id = itr->first;
9199
9200 // use next
9201 ++new_id;
9202
9203 if (!Utf8toWStr(tele.name, tele.wnameLow))
9204 return false;
9205
9206 wstrToLower(tele.wnameLow);
9207
9208 _gameTeleStore[new_id] = tele;
9209
9211
9212 stmt->SetData(0, new_id);
9213 stmt->SetData(1, tele.position_x);
9214 stmt->SetData(2, tele.position_y);
9215 stmt->SetData(3, tele.position_z);
9216 stmt->SetData(4, tele.orientation);
9217 stmt->SetData(5, uint16(tele.mapId));
9218 stmt->SetData(6, tele.name);
9219
9220 WorldDatabase.Execute(stmt);
9221
9222 return true;
9223}
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:1523
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 
)
2516{
2517 GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
2518 if (!goinfo)
2519 return 0;
2520
2521 Map* map = sMapMgr->CreateBaseMap(mapId);
2522 if (!map)
2523 return 0;
2524
2526
2527 GameObjectData& data = NewGOData(spawnId);
2528 data.id = entry;
2529 data.mapid = mapId;
2530 data.posX = x;
2531 data.posY = y;
2532 data.posZ = z;
2533 data.orientation = o;
2534 data.rotation.x = rotation0;
2535 data.rotation.y = rotation1;
2536 data.rotation.z = rotation2;
2537 data.rotation.w = rotation3;
2538 data.spawntimesecs = spawntimedelay;
2539 data.animprogress = 100;
2540 data.spawnMask = 1;
2541 data.go_state = GO_STATE_READY;
2543 data.artKit = goinfo->type == GAMEOBJECT_TYPE_CAPTURE_POINT ? 21 : 0;
2544 data.dbData = false;
2545
2546 AddGameobjectToGrid(spawnId, &data);
2547
2548 // Spawn if necessary (loaded grids only)
2549 // We use spawn coords to spawn
2550 if (!map->Instanceable() && map->IsGridLoaded(x, y))
2551 {
2553 if (!go->LoadGameObjectFromDB(spawnId, map))
2554 {
2555 LOG_ERROR("sql.sql", "AddGOData: cannot add gameobject entry {} to map", entry);
2556 delete go;
2557 return 0;
2558 }
2559 }
2560
2561 LOG_DEBUG("maps", "AddGOData: spawnId {} entry {} map {} x {} y {} z {} o {}", spawnId, entry, mapId, x, y, z, o);
2562
2563 return spawnId;
2564}
@ GO_STATE_READY
Definition GameObjectData.h:692
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
@ GAMEOBJECT_TYPE_CAPTURE_POINT
Definition SharedDefines.h:1600
Definition GameObject.h:120
virtual bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition GameObject.cpp:1104
void AddGameobjectToGrid(ObjectGuid::LowType guid, GameObjectData const *data)
Definition ObjectMgr.cpp:2793
GameObjectTemplate const * GetGameObjectTemplate(uint32 entry)
Definition ObjectMgr.cpp:10285
ObjectGuid::LowType GenerateGameObjectSpawnId()
Definition ObjectMgr.cpp:7285
GameObjectData & NewGOData(ObjectGuid::LowType guid)
Definition ObjectMgr.h:1301
bool IsGameObjectStaticTransport(uint32 entry)
Definition ObjectMgr.cpp:10294
Definition Transport.h:115
Definition GameObjectData.h:698
bool dbData
Definition GameObjectData.h:714
float orientation
Definition GameObjectData.h:706
float posZ
Definition GameObjectData.h:705
uint8 artKit
Definition GameObjectData.h:713
int32 spawntimesecs
Definition GameObjectData.h:708
uint8 spawnMask
Definition GameObjectData.h:712
G3D::Quat rotation
Definition GameObjectData.h:707
uint32 animprogress
Definition GameObjectData.h:710
uint16 mapid
Definition GameObjectData.h:701
float posX
Definition GameObjectData.h:703
uint32 phaseMask
Definition GameObjectData.h:702
float posY
Definition GameObjectData.h:704
uint32 id
Definition GameObjectData.h:700
GOState go_state
Definition GameObjectData.h:711
Definition GameObjectData.h:31
uint32 type
Definition GameObjectData.h:33

References AddGameobjectToGrid(), GameObjectData::animprogress, GameObjectData::artKit, GameObjectData::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, GameObjectData::mapid, NewGOData(), GameObjectData::orientation, GameObjectData::phaseMask, PHASEMASK_NORMAL, GameObjectData::posX, GameObjectData::posY, GameObjectData::posZ, GameObjectData::rotation, sMapMgr, GameObjectData::spawnMask, GameObjectData::spawntimesecs, and GameObjectTemplate::type.

◆ AddLocaleString()

◆ AddProfanityPlayerName()

void ObjectMgr::AddProfanityPlayerName ( std::string const &  name)
8560{
8561 if (!IsProfanityName(name))
8562 {
8563 std::wstring wstr;
8564 if (!Utf8toWStr(name, wstr))
8565 {
8566 LOG_ERROR("server", "Could not add invalid name to profanity player names: {}", name);
8567 return;
8568 }
8569 wstrToLower(wstr);
8570
8571 _profanityNamesStore.insert(wstr);
8572
8574 stmt->SetData(0, name);
8575 CharacterDatabase.Execute(stmt);
8576 }
8577}
@ CHAR_INS_PROFANITY_PLAYER_NAME
Definition CharacterDatabase.h:520
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
ProfanityNamesContainer _profanityNamesStore
Definition ObjectMgr.h:1521
bool IsProfanityName(std::string_view name) const
Definition ObjectMgr.cpp:8544

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

◆ AddReservedPlayerName()

void ObjectMgr::AddReservedPlayerName ( std::string const &  name)
8457{
8458 if (!IsReservedName(name))
8459 {
8460 std::wstring wstr;
8461 if (!Utf8toWStr(name, wstr))
8462 {
8463 LOG_ERROR("server", "Could not add invalid name to reserved player names: {}", name);
8464 return;
8465 }
8466 wstrToLower(wstr);
8467
8468 _reservedNamesStore.insert(wstr);
8469
8471 stmt->SetData(0, name);
8472 CharacterDatabase.Execute(stmt);
8473 }
8474}
@ CHAR_INS_RESERVED_PLAYER_NAME
Definition CharacterDatabase.h:519
bool IsReservedName(std::string_view name) const
Definition ObjectMgr.cpp:8441
ReservedNamesContainer _reservedNamesStore
Definition ObjectMgr.h:1517

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

◆ AddSpellToTrainer()

void ObjectMgr::AddSpellToTrainer ( uint32  entry,
uint32  spell,
uint32  spellCost,
uint32  reqSkill,
uint32  reqSkillValue,
uint32  reqLevel,
uint32  reqSpell 
)
9314{
9315 if (entry >= ACORE_TRAINER_START_REF)
9316 return;
9317
9318 CreatureTemplate const* cInfo = GetCreatureTemplate(entry);
9319 if (!cInfo)
9320 {
9321 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry for a non-existing creature template (Entry: {}), ignoring", entry);
9322 return;
9323 }
9324
9325 if (!(cInfo->npcflag & UNIT_NPC_FLAG_TRAINER))
9326 {
9327 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry for a creature template (Entry: {}) without trainer flag, ignoring", entry);
9328 return;
9329 }
9330
9331 SpellInfo const* spellinfo = sSpellMgr->GetSpellInfo(spell);
9332 if (!spellinfo)
9333 {
9334 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a non-existing spell (Spell: {}), ignoring", entry, spell);
9335 return;
9336 }
9337
9338 if (!SpellMgr::ComputeIsSpellValid(spellinfo))
9339 {
9340 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a broken spell (Spell: {}), ignoring", entry, spell);
9341 return;
9342 }
9343
9344 if (GetTalentSpellCost(spell))
9345 {
9346 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a non-existing spell (Spell: {}) which is a talent, ignoring", entry, spell);
9347 return;
9348 }
9349
9350 if (reqSpell && !sSpellMgr->GetSpellInfo(reqSpell))
9351 {
9352 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a non-existing reqSpell (Spell: {}), ignoring", entry, reqSpell);
9353 return;
9354 }
9355
9357
9358 TrainerSpell& trainerSpell = data.spellList[spell];
9359 trainerSpell.spell = spell;
9360 trainerSpell.spellCost = spellCost;
9361 trainerSpell.reqSkill = reqSkill;
9362 trainerSpell.reqSkillValue = reqSkillValue;
9363 trainerSpell.reqLevel = reqLevel;
9364 trainerSpell.reqSpell = reqSpell;
9365
9366 if (!trainerSpell.reqLevel)
9367 trainerSpell.reqLevel = spellinfo->SpellLevel;
9368
9369 // calculate learned spell for profession case when stored cast-spell
9370 trainerSpell.learnedSpell[0] = spell;
9371 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
9372 {
9373 if (spellinfo->Effects[i].Effect != SPELL_EFFECT_LEARN_SPELL)
9374 continue;
9375 if (trainerSpell.learnedSpell[0] == spell)
9376 trainerSpell.learnedSpell[0] = 0;
9377 // player must be able to cast spell on himself
9378 if (spellinfo->Effects[i].TargetA.GetTarget() != 0 && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_TARGET_ALLY
9379 && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_TARGET_ANY && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_CASTER)
9380 {
9381 LOG_ERROR("sql.sql", "Table `npc_trainer` has spell {} for trainer entry {} with learn effect which has incorrect target type, ignoring learn effect!", spell, entry);
9382 continue;
9383 }
9384
9385 trainerSpell.learnedSpell[i] = spellinfo->Effects[i].TriggerSpell;
9386
9387 if (trainerSpell.learnedSpell[i])
9388 {
9389 SpellInfo const* learnedSpellInfo = sSpellMgr->GetSpellInfo(trainerSpell.learnedSpell[i]);
9390 if (learnedSpellInfo && learnedSpellInfo->IsProfession())
9391 data.trainerType = 2;
9392 }
9393 }
9394
9395 return;
9396}
uint32 GetTalentSpellCost(uint32 spellId)
Definition DBCStores.cpp:686
#define MAX_SPELL_EFFECTS
Definition DBCStructure.h:1638
#define ACORE_TRAINER_START_REF
Definition ObjectMgr.h:493
@ SPELL_EFFECT_LEARN_SPELL
Definition SharedDefines.h:825
@ TARGET_UNIT_TARGET_ALLY
Definition SharedDefines.h:1436
@ TARGET_UNIT_TARGET_ANY
Definition SharedDefines.h:1440
@ TARGET_UNIT_CASTER
Definition SharedDefines.h:1421
#define sSpellMgr
Definition SpellMgr.h:825
@ UNIT_NPC_FLAG_TRAINER
Definition UnitDefines.h:323
Definition SpellInfo.h:316
uint32 SpellLevel
Definition SpellInfo.h:360
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition SpellInfo.h:393
bool IsProfession() const
Definition SpellInfo.cpp:953
static bool ComputeIsSpellValid(SpellInfo const *spellInfo, bool msg=true)
Some checks for spells, to prevent adding deprecated/broken spells for trainers, spell book,...
Definition SpellMgr.cpp:370
Definition CreatureData.h:529
TrainerSpellMap spellList
Definition CreatureData.h:533
uint32 trainerType
Definition CreatureData.h:534
Definition CreatureData.h:507
uint32 reqSkillValue
Definition CreatureData.h:517
uint32 learnedSpell[3]
Definition CreatureData.h:519
uint32 reqSpell
Definition CreatureData.h:520
uint32 spellCost
Definition CreatureData.h:515
uint32 reqSkill
Definition CreatureData.h:516
uint32 reqLevel
Definition CreatureData.h:518
uint32 spell
Definition CreatureData.h:514

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

Referenced by LoadTrainerSpell().

◆ AddVendorItem()

void ObjectMgr::AddVendorItem ( uint32  entry,
uint32  item,
int32  maxcount,
uint32  incrtime,
uint32  extendedCost,
bool  persist = true 
)
9639{
9640 VendorItemData& vList = _cacheVendorItemStore[entry];
9641 vList.AddItem(item, maxcount, incrtime, extendedCost);
9642
9643 if (persist)
9644 {
9646
9647 stmt->SetData(0, entry);
9648 stmt->SetData(1, item);
9649 stmt->SetData(2, maxcount);
9650 stmt->SetData(3, incrtime);
9651 stmt->SetData(4, extendedCost);
9652
9653 WorldDatabase.Execute(stmt);
9654 }
9655}
@ WORLD_INS_NPC_VENDOR
Definition WorldDatabase.h:43
Definition CreatureData.h:469
void AddItem(uint32 item, int32 maxcount, uint32 ptime, uint32 ExtendedCost)
Definition CreatureData.h:481

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

◆ BuildPlayerLevelInfo()

void ObjectMgr::BuildPlayerLevelInfo ( uint8  race,
uint8  class_,
uint8  level,
PlayerLevelInfo plinfo 
) const
private
4549{
4550 // base data (last known level)
4551 *info = _playerInfo[race][_class]->levelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1];
4552
4553 // if conversion from uint32 to uint8 causes unexpected behaviour, change lvl to uint32
4554 for (uint8 lvl = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1; lvl < level; ++lvl)
4555 {
4556 switch (_class)
4557 {
4558 case CLASS_WARRIOR:
4559 info->stats[STAT_STRENGTH] += (lvl > 23 ? 2 : (lvl > 1 ? 1 : 0));
4560 info->stats[STAT_STAMINA] += (lvl > 23 ? 2 : (lvl > 1 ? 1 : 0));
4561 info->stats[STAT_AGILITY] += (lvl > 36 ? 1 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4562 info->stats[STAT_INTELLECT] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4563 info->stats[STAT_SPIRIT] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4564 break;
4565 case CLASS_PALADIN:
4566 info->stats[STAT_STRENGTH] += (lvl > 3 ? 1 : 0);
4567 info->stats[STAT_STAMINA] += (lvl > 33 ? 2 : (lvl > 1 ? 1 : 0));
4568 info->stats[STAT_AGILITY] += (lvl > 38 ? 1 : (lvl > 7 && !(lvl % 2) ? 1 : 0));
4569 info->stats[STAT_INTELLECT] += (lvl > 6 && (lvl % 2) ? 1 : 0);
4570 info->stats[STAT_SPIRIT] += (lvl > 7 ? 1 : 0);
4571 break;
4572 case CLASS_HUNTER:
4573 info->stats[STAT_STRENGTH] += (lvl > 4 ? 1 : 0);
4574 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4575 info->stats[STAT_AGILITY] += (lvl > 33 ? 2 : (lvl > 1 ? 1 : 0));
4576 info->stats[STAT_INTELLECT] += (lvl > 8 && (lvl % 2) ? 1 : 0);
4577 info->stats[STAT_SPIRIT] += (lvl > 38 ? 1 : (lvl > 9 && !(lvl % 2) ? 1 : 0));
4578 break;
4579 case CLASS_ROGUE:
4580 info->stats[STAT_STRENGTH] += (lvl > 5 ? 1 : 0);
4581 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4582 info->stats[STAT_AGILITY] += (lvl > 16 ? 2 : (lvl > 1 ? 1 : 0));
4583 info->stats[STAT_INTELLECT] += (lvl > 8 && !(lvl % 2) ? 1 : 0);
4584 info->stats[STAT_SPIRIT] += (lvl > 38 ? 1 : (lvl > 9 && !(lvl % 2) ? 1 : 0));
4585 break;
4586 case CLASS_PRIEST:
4587 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4588 info->stats[STAT_STAMINA] += (lvl > 5 ? 1 : 0);
4589 info->stats[STAT_AGILITY] += (lvl > 38 ? 1 : (lvl > 8 && (lvl % 2) ? 1 : 0));
4590 info->stats[STAT_INTELLECT] += (lvl > 22 ? 2 : (lvl > 1 ? 1 : 0));
4591 info->stats[STAT_SPIRIT] += (lvl > 3 ? 1 : 0);
4592 break;
4593 case CLASS_SHAMAN:
4594 info->stats[STAT_STRENGTH] += (lvl > 34 ? 1 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4595 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4596 info->stats[STAT_AGILITY] += (lvl > 7 && !(lvl % 2) ? 1 : 0);
4597 info->stats[STAT_INTELLECT] += (lvl > 5 ? 1 : 0);
4598 info->stats[STAT_SPIRIT] += (lvl > 4 ? 1 : 0);
4599 break;
4600 case CLASS_MAGE:
4601 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4602 info->stats[STAT_STAMINA] += (lvl > 5 ? 1 : 0);
4603 info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4604 info->stats[STAT_INTELLECT] += (lvl > 24 ? 2 : (lvl > 1 ? 1 : 0));
4605 info->stats[STAT_SPIRIT] += (lvl > 33 ? 2 : (lvl > 2 ? 1 : 0));
4606 break;
4607 case CLASS_WARLOCK:
4608 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4609 info->stats[STAT_STAMINA] += (lvl > 38 ? 2 : (lvl > 3 ? 1 : 0));
4610 info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4611 info->stats[STAT_INTELLECT] += (lvl > 33 ? 2 : (lvl > 2 ? 1 : 0));
4612 info->stats[STAT_SPIRIT] += (lvl > 38 ? 2 : (lvl > 3 ? 1 : 0));
4613 break;
4614 case CLASS_DRUID:
4615 info->stats[STAT_STRENGTH] += (lvl > 38 ? 2 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4616 info->stats[STAT_STAMINA] += (lvl > 32 ? 2 : (lvl > 4 ? 1 : 0));
4617 info->stats[STAT_AGILITY] += (lvl > 38 ? 2 : (lvl > 8 && (lvl % 2) ? 1 : 0));
4618 info->stats[STAT_INTELLECT] += (lvl > 38 ? 3 : (lvl > 4 ? 1 : 0));
4619 info->stats[STAT_SPIRIT] += (lvl > 38 ? 3 : (lvl > 5 ? 1 : 0));
4620 }
4621 }
4622}
@ CLASS_HUNTER
Definition SharedDefines.h:143
@ CLASS_DRUID
Definition SharedDefines.h:151
@ CLASS_SHAMAN
Definition SharedDefines.h:147
@ CLASS_PRIEST
Definition SharedDefines.h:145
@ CLASS_WARRIOR
Definition SharedDefines.h:141
@ CLASS_WARLOCK
Definition SharedDefines.h:149
@ CLASS_MAGE
Definition SharedDefines.h:148
@ CLASS_PALADIN
Definition SharedDefines.h:142
@ CLASS_ROGUE
Definition SharedDefines.h:144
@ STAT_SPIRIT
Definition SharedDefines.h:273
@ STAT_INTELLECT
Definition SharedDefines.h:272
@ STAT_AGILITY
Definition SharedDefines.h:270
@ STAT_STRENGTH
Definition SharedDefines.h:269
@ STAT_STAMINA
Definition SharedDefines.h:271
@ CONFIG_MAX_PLAYER_LEVEL
Definition WorldConfig.h:189
#define sWorld
Definition World.h:316
std::array< uint32, MAX_STATS > stats
Definition Player.h:305

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

Referenced by GetPlayerLevelInfo().

◆ ChangeFishingBaseSkillLevel()

void ObjectMgr::ChangeFishingBaseSkillLevel ( uint32  entry,
int32  skill 
)
9012{
9013 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
9014 if (!fArea)
9015 {
9016 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
9017 return;
9018 }
9019
9020 _fishingBaseForAreaStore[entry] = skill;
9021
9022 LOG_INFO("server.loading", ">> Fishing base skill level of area {} changed to {}", entry, skill);
9023 LOG_INFO("server.loading", " ");
9024}
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
#define LOG_INFO(filterType__,...)
Definition Log.h:166
FishingBaseSkillContainer _fishingBaseForAreaStore
Definition ObjectMgr.h:1568
Definition DBCStructure.h:519

References _fishingBaseForAreaStore, LOG_ERROR, LOG_INFO, and sAreaTableStore.

◆ CheckCreatureMovement()

void ObjectMgr::CheckCreatureMovement ( char const *  table,
uint64  id,
CreatureMovementData creatureMovement 
)
1260{
1261 if (creatureMovement.Ground >= CreatureGroundMovementType::Max)
1262 {
1263 LOG_ERROR("sql.sql", "`{}`.`Ground` wrong value ({}) for Id {}, setting to Run.", table, uint32(creatureMovement.Ground), id);
1264 creatureMovement.Ground = CreatureGroundMovementType::Run;
1265 }
1266
1267 if (creatureMovement.Flight >= CreatureFlightMovementType::Max)
1268 {
1269 LOG_ERROR("sql.sql", "`{}`.`Flight` wrong value ({}) for Id {}, setting to None.", table, uint32(creatureMovement.Flight), id);
1270 creatureMovement.Flight = CreatureFlightMovementType::None;
1271 }
1272
1273 if (creatureMovement.Chase >= CreatureChaseMovementType::Max)
1274 {
1275 LOG_ERROR("sql.sql", "`{}`.`Chase` wrong value ({}) for Id {}, setting to Run.", table, uint32(creatureMovement.Chase), id);
1276 creatureMovement.Chase = CreatureChaseMovementType::Run;
1277 }
1278
1279 if (creatureMovement.Random >= CreatureRandomMovementType::Max)
1280 {
1281 LOG_ERROR("sql.sql", "`{}`.`Random` wrong value ({}) for Id {}, setting to Walk.", table, uint32(creatureMovement.Random), id);
1282 creatureMovement.Random = CreatureRandomMovementType::Walk;
1283 }
1284}
CreatureRandomMovementType Random
Definition CreatureData.h:127
CreatureFlightMovementType Flight
Definition CreatureData.h:123
CreatureChaseMovementType Chase
Definition CreatureData.h:126
CreatureGroundMovementType Ground
Definition CreatureData.h:122

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

Referenced by CheckCreatureTemplate(), and LoadCreatureMovementOverrides().

◆ CheckCreatureTemplate()

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

References _creatureCustomIDsStore, _difficultyEntries, Creature::_GetDamageMod(), _hasDifficultyEntries, CreatureTemplate::AIName, BASE_ATTACK_TIME, CreatureTemplate::BaseAttackTime, CheckCreatureMovement(), CLASSMASK_ALL_CREATURES, CREATURE_FAMILY_HORSE_CUSTOM, CREATURE_FLAG_EXTRA_DB_ALLOWED, CREATURE_FLAG_EXTRA_MODULE, CREATURE_TYPE_HUMANOID, CreatureTemplate::DifficultyEntry, CreatureTemplate::dmgschool, CreatureTemplate::Entry, CreatureTemplate::expansion, CreatureTemplate::faction, CreatureTemplate::family, CreatureTemplate::flags_extra, GetCreatureTemplate(), CreatureTemplate::GossipMenuId, CreatureTemplate::HoverHeight, IDLE_MOTION_TYPE, CreatureTemplate::KillCredit, LOG_DEBUG, LOG_ERROR, LOG_INFO, MAX_CREATURE_SPELLS, MAX_DB_MOTION_TYPE, MAX_DIFFICULTY, MAX_EXPANSIONS, MAX_KILL_CREDIT, MAX_SPELL_SCHOOL, MAX_TRAINER_TYPE, CreatureTemplate::Models, CreatureTemplate::Movement, CreatureTemplate::MovementType, CreatureTemplate::npcflag, CreatureTemplate::PetSpellDataId, 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::trainer_class, CreatureTemplate::trainer_race, CreatureTemplate::trainer_spell, CreatureTemplate::trainer_type, CreatureTemplate::type, CreatureTemplate::unit_class, UNIT_CLASS_WARRIOR, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAG_TRAINER, and CreatureTemplate::VehicleId.

Referenced by LoadCreatureTemplates().

◆ CheckDeclinedNames()

bool ObjectMgr::CheckDeclinedNames ( std::wstring  w_ownname,
DeclinedName const &  names 
)
static
9027{
9028 // get main part of the name
9029 std::wstring mainpart = GetMainPartOfName(w_ownname, 0);
9030 // prepare flags
9031 bool x = true;
9032 bool y = true;
9033
9034 // check declined names
9035 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
9036 {
9037 std::wstring wname;
9038 if (!Utf8toWStr(names.name[i], wname))
9039 return false;
9040
9041 if (mainpart != GetMainPartOfName(wname, i + 1))
9042 x = false;
9043
9044 if (w_ownname != wname)
9045 y = false;
9046 }
9047 return (x || y);
9048}
#define MAX_DECLINED_NAME_CASES
Definition Unit.h:530
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
8732{
8733 std::wstring wname;
8734 if (!Utf8toWStr(name, wname))
8735 return PET_NAME_INVALID;
8736
8737 if (wname.size() > MAX_PET_NAME)
8738 return PET_NAME_TOO_LONG;
8739
8740 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PET_NAME);
8741 if (wname.size() < minName)
8742 return PET_NAME_TOO_SHORT;
8743
8744 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PET_NAMES);
8745 if (!isValidString(wname, strictMask, false))
8747
8748 // Check Reserved Name
8749 if (sObjectMgr->IsReservedName(name))
8750 return PET_NAME_RESERVED;
8751
8752 // Check Profanity Name
8753 if (sObjectMgr->IsProfanityName(name))
8754 return PET_NAME_PROFANE;
8755
8756 return PET_NAME_SUCCESS;
8757}
bool isValidString(std::wstring wstr, uint32 strictMask, bool numericOrSpace, bool create=false)
Definition ObjectMgr.cpp:8616
#define sObjectMgr
Definition ObjectMgr.h:1650
#define MAX_PET_NAME
Definition ObjectMgr.h:684
@ PET_NAME_INVALID
Definition SharedDefines.h:3926
@ PET_NAME_RESERVED
Definition SharedDefines.h:3932
@ PET_NAME_SUCCESS
Definition SharedDefines.h:3924
@ PET_NAME_MIXED_LANGUAGES
Definition SharedDefines.h:3930
@ PET_NAME_TOO_SHORT
Definition SharedDefines.h:3928
@ PET_NAME_TOO_LONG
Definition SharedDefines.h:3929
@ PET_NAME_PROFANE
Definition SharedDefines.h:3931
@ CONFIG_STRICT_PET_NAMES
Definition WorldConfig.h:176
@ CONFIG_MIN_PET_NAME
Definition WorldConfig.h:179

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
8653{
8654 std::wstring wname;
8655
8656 // Check for invalid characters
8657 if (!Utf8toWStr(name, wname))
8659
8660 // Check for too long name
8661 if (wname.size() > MAX_PLAYER_NAME)
8662 return CHAR_NAME_TOO_LONG;
8663
8664 // Check for too short name
8665 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PLAYER_NAME);
8666 if (wname.size() < minName)
8667 return CHAR_NAME_TOO_SHORT;
8668
8669 // Check for mixed languages
8670 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PLAYER_NAMES);
8671 if (!isValidString(wname, strictMask, false, create))
8673
8674 // Check for three consecutive letters
8675 wstrToLower(wname);
8676 for (std::size_t i = 2; i < wname.size(); ++i)
8677 if (wname[i] == wname[i - 1] && wname[i] == wname[i - 2])
8679
8680 // Check Reserved Name
8681 if (sObjectMgr->IsReservedName(name))
8682 return CHAR_NAME_RESERVED;
8683
8684 // Check Profanity Name
8685 if (sObjectMgr->IsProfanityName(name))
8686 return CHAR_NAME_PROFANE;
8687
8688 return CHAR_NAME_SUCCESS;
8689}
#define MAX_PLAYER_NAME
Definition ObjectMgr.h:682
@ CHAR_NAME_TOO_SHORT
Definition SharedDefines.h:3688
@ CHAR_NAME_THREE_CONSECUTIVE
Definition SharedDefines.h:3696
@ CHAR_NAME_INVALID_CHARACTER
Definition SharedDefines.h:3690
@ CHAR_NAME_TOO_LONG
Definition SharedDefines.h:3689
@ CHAR_NAME_RESERVED
Definition SharedDefines.h:3693
@ CHAR_NAME_MIXED_LANGUAGES
Definition SharedDefines.h:3691
@ CHAR_NAME_PROFANE
Definition SharedDefines.h:3692
@ CHAR_NAME_SUCCESS
Definition SharedDefines.h:3685
@ CONFIG_STRICT_PLAYER_NAMES
Definition WorldConfig.h:173
@ CONFIG_MIN_PLAYER_NAME
Definition WorldConfig.h:177

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
1677{
1678 npcflag = cinfo->npcflag;
1679 unit_flags = cinfo->unit_flags;
1680 dynamicflags = cinfo->dynamicflags;
1681
1682 if (data)
1683 {
1684 if (data->npcflag)
1685 npcflag = data->npcflag;
1686
1687 if (data->unit_flags)
1688 unit_flags = data->unit_flags;
1689
1690 if (data->dynamicflags)
1691 dynamicflags = data->dynamicflags;
1692 }
1693}

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
1662{
1663 // Load creature model (display id)
1664 if (data && data->displayid)
1665 if (CreatureModel const* model = cinfo->GetModelWithDisplayId(data->displayid))
1666 return model;
1667
1668 if (!cinfo->HasFlagsExtra(CREATURE_FLAG_EXTRA_TRIGGER))
1669 if (CreatureModel const* model = cinfo->GetRandomValidModel())
1670 return model;
1671
1672 // Triggers by default receive the invisible model
1673 return cinfo->GetFirstInvisibleModel();
1674}
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition CreatureData.h:52

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)
8253{
8254 // remove mapid*cellid -> guid_set map
8255 CreatureData const* data = GetCreatureData(guid);
8256 if (data)
8257 RemoveCreatureFromGrid(guid, data);
8258
8259 _creatureDataStore.erase(guid);
8260}
CreatureDataContainer _creatureDataStore
Definition ObjectMgr.h:1583
void RemoveCreatureFromGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition ObjectMgr.cpp:2501
CreatureData const * GetCreatureData(ObjectGuid::LowType spawnId) const
Definition ObjectMgr.h:1207

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

◆ DeleteGameTele()

bool ObjectMgr::DeleteGameTele ( std::string_view  name)
9226{
9227 // explicit name case
9228 std::wstring wname;
9229 if (!Utf8toWStr(name, wname))
9230 return false;
9231
9232 // converting string that we try to find to lower case
9233 wstrToLower(wname);
9234
9235 for (GameTeleContainer::iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9236 {
9237 if (itr->second.wnameLow == wname)
9238 {
9240
9241 stmt->SetData(0, itr->second.name);
9242
9243 WorldDatabase.Execute(stmt);
9244
9245 _gameTeleStore.erase(itr);
9246 return true;
9247 }
9248 }
9249
9250 return false;
9251}
@ 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)
8263{
8264 // remove mapid*cellid -> guid_set map
8265 GameObjectData const* data = GetGameObjectData(guid);
8266 if (data)
8267 RemoveGameobjectFromGrid(guid, data);
8268
8269 _gameObjectDataStore.erase(guid);
8270}
GameObjectData const * GetGameObjectData(ObjectGuid::LowType spawnId) const
Definition ObjectMgr.h:1227
GameObjectDataContainer _gameObjectDataStore
Definition ObjectMgr.h:1597
void RemoveGameobjectFromGrid(ObjectGuid::LowType guid, GameObjectData const *data)
Definition ObjectMgr.cpp:2807

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

◆ GenerateAuctionID()

uint32 ObjectMgr::GenerateAuctionID ( )
7245{
7246 if (_auctionId >= 0xFFFFFFFE)
7247 {
7248 LOG_ERROR("server.worldserver", "Auctions ids overflow!! Can't continue, shutting down server. ");
7250 }
7251 return _auctionId++;
7252}
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 ( )
7276{
7277 if (_creatureSpawnId >= uint32(0xFFFFFF))
7278 {
7279 LOG_ERROR("server.worldserver", "Creature spawn id overflow!! Can't continue, shutting down server. Search on forum for TCE00007 for more info.");
7281 }
7282 return _creatureSpawnId++;
7283}

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

Referenced by AddCreData().

◆ GenerateEquipmentSetGuid()

uint64 ObjectMgr::GenerateEquipmentSetGuid ( )
7255{
7256 if (_equipmentSetGuid >= uint64(0xFFFFFFFFFFFFFFFELL))
7257 {
7258 LOG_ERROR("server.worldserver", "EquipmentSet guid overflow!! Can't continue, shutting down server. ");
7260 }
7261 return _equipmentSetGuid++;
7262}
std::uint64_t uint64
Definition Define.h:106

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

◆ GenerateGameObjectSpawnId()

uint32 ObjectMgr::GenerateGameObjectSpawnId ( )
7286{
7287 if (_gameObjectSpawnId >= uint32(0xFFFFFF))
7288 {
7289 LOG_ERROR("server.worldserver", "GameObject spawn id overflow!! Can't continue, shutting down server. Search on forum for TCE00007 for more info. ");
7291 }
7292 return _gameObjectSpawnId++;
7293}

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

Referenced by AddGOData().

◆ GenerateMailID()

uint32 ObjectMgr::GenerateMailID ( )
7265{
7266 if (_mailId >= 0xFFFFFFFE)
7267 {
7268 LOG_ERROR("server.worldserver", "Mail ids overflow!! Can't continue, shutting down server. ");
7270 }
7271 std::lock_guard<std::mutex> guard(_mailIdMutex);
7272 return _mailId++;
7273}
std::mutex _mailIdMutex
Definition ObjectMgr.h:1463

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

◆ GeneratePetName()

std::string ObjectMgr::GeneratePetName ( uint32  entry)
7752{
7753 std::vector<std::string>& list0 = _petHalfName0[entry];
7754 std::vector<std::string>& list1 = _petHalfName1[entry];
7755
7756 if (list0.empty() || list1.empty())
7757 {
7758 CreatureTemplate const* cinfo = GetCreatureTemplate(entry);
7759 char const* petname = GetPetName(cinfo->family, sWorld->GetDefaultDbcLocale());
7760 if (!petname)
7761 return cinfo->Name;
7762
7763 return std::string(petname);
7764 }
7765
7766 return *(list0.begin() + urand(0, list0.size() - 1)) + *(list1.begin() + urand(0, list1.size() - 1));
7767}
char const * GetPetName(uint32 petfamily, uint32 dbclang)
Definition DBCStores.cpp:665
HalfNameContainer _petHalfName1
Definition ObjectMgr.h:1572
HalfNameContainer _petHalfName0
Definition ObjectMgr.h:1571
std::string Name
Definition CreatureData.h:191

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

Referenced by GeneratePetNameLocale().

◆ GeneratePetNameLocale()

std::string ObjectMgr::GeneratePetNameLocale ( uint32  entry,
LocaleConstant  locale 
)
7739{
7740 std::vector<std::string>& list0 = _petHalfLocaleName0[std::make_pair(entry, locale)];
7741 std::vector<std::string>& list1 = _petHalfLocaleName1[std::make_pair(entry, locale)];
7742
7743 if (list0.empty() || list1.empty())
7744 {
7745 return GeneratePetName(entry);
7746 }
7747
7748 return *(list0.begin() + urand(0, list0.size() - 1)) + *(list1.begin() + urand(0, list1.size() - 1));
7749}
HalfNameContainerLocale _petHalfLocaleName0
Definition ObjectMgr.h:1574
HalfNameContainerLocale _petHalfLocaleName1
Definition ObjectMgr.h:1575
std::string GeneratePetName(uint32 entry)
Definition ObjectMgr.cpp:7751

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

◆ GeneratePetNumber()

uint32 ObjectMgr::GeneratePetNumber ( )
7770{
7771 std::lock_guard<std::mutex> guard(_hiPetNumberMutex);
7772 return ++_hiPetNumber;
7773}
std::mutex _hiPetNumberMutex
Definition ObjectMgr.h:1465

References _hiPetNumber, and _hiPetNumberMutex.

◆ GetAccessRequirement()

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

References _accessRequirementStore.

◆ GetAcoreString() [1/2]

AcoreString const * ObjectMgr::GetAcoreString ( uint32  entry) const
inline
1316 {
1317 AcoreStringContainer::const_iterator itr = _acoreStringStore.find(entry);
1318 if (itr == _acoreStringStore.end())
1319 return nullptr;
1320
1321 return &itr->second;
1322 }
AcoreStringContainer _acoreStringStore
Definition ObjectMgr.h:1615

References _acoreStringStore.

Referenced by GetAcoreString(), and GetAcoreStringForDBCLocale().

◆ GetAcoreString() [2/2]

std::string ObjectMgr::GetAcoreString ( uint32  entry,
LocaleConstant  locale 
) const
8958{
8959 AcoreString const* as = GetAcoreString(entry);
8960 if (as && !as->Content.empty())
8961 {
8962 if (as->Content.size() > std::size_t(locale) && !as->Content[locale].empty())
8963 return as->Content[locale];
8964
8965 return as->Content[DEFAULT_LOCALE];
8966 }
8967
8968 std::string msg = Acore::StringFormat("No entry for acore_string ({}) in DB.", entry);
8969 LOG_ERROR("sql.sql", msg);
8970 return msg;
8971}
#define DEFAULT_LOCALE
Definition Common.h:131
AcoreString const * GetAcoreString(uint32 entry) const
Definition ObjectMgr.h:1315
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default AC string format function.
Definition StringFormat.h:34
Definition ObjectMgr.h:501
std::vector< std::string > Content
Definition ObjectMgr.h:502

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

◆ GetAcoreStringForDBCLocale()

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

References DBCLocaleIndex, and GetAcoreString().

◆ GetAllAreaTriggerScriptData()

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

References _areaTriggerScriptStore.

◆ GetAllCreatureData()

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

References _creatureDataStore.

◆ GetAllGOData()

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

References _gameObjectDataStore.

◆ GetAreaTrigger()

AreaTrigger const * ObjectMgr::GetAreaTrigger ( uint32  trigger) const
inline
863 {
864 AreaTriggerContainer::const_iterator itr = _areaTriggerStore.find(trigger);
865 if (itr != _areaTriggerStore.end())
866 return &itr->second;
867 return nullptr;
868 }
AreaTriggerContainer _areaTriggerStore
Definition ObjectMgr.h:1494

References _areaTriggerStore.

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

◆ GetAreaTriggerScriptId()

uint32 ObjectMgr::GetAreaTriggerScriptId ( uint32  trigger_id)
9051{
9052 AreaTriggerScriptContainer::const_iterator i = _areaTriggerScriptStore.find(trigger_id);
9053 if (i != _areaTriggerScriptStore.end())
9054 return i->second;
9055 return 0;
9056}

References _areaTriggerScriptStore.

◆ GetAreaTriggerTeleport()

AreaTriggerTeleport const * ObjectMgr::GetAreaTriggerTeleport ( uint32  trigger) const
inline
871 {
872 AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.find(trigger);
873 if (itr != _areaTriggerTeleportStore.end())
874 return &itr->second;
875 return nullptr;
876 }
AreaTriggerTeleportContainer _areaTriggerTeleportStore
Definition ObjectMgr.h:1495

References _areaTriggerTeleportStore.

◆ GetBaseReputationOf()

int32 ObjectMgr::GetBaseReputationOf ( FactionEntry const *  factionEntry,
uint8  race,
uint8  playerClass 
)
9065{
9066 if (!factionEntry)
9067 return 0;
9068
9069 uint32 raceMask = (1 << (race - 1));
9070 uint32 classMask = (1 << (playerClass - 1));
9071
9072 for (int i = 0; i < 4; i++)
9073 {
9074 if ((!factionEntry->BaseRepClassMask[i] ||
9075 factionEntry->BaseRepClassMask[i] & classMask) &&
9076 (!factionEntry->BaseRepRaceMask[i] ||
9077 factionEntry->BaseRepRaceMask[i] & raceMask))
9078 return factionEntry->BaseRepValue[i];
9079 }
9080
9081 return 0;
9082}

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

◆ GetBaseXP()

uint32 ObjectMgr::GetBaseXP ( uint8  level)
7680{
7681 return _baseXPTable[level] ? _baseXPTable[level] : 0;
7682}
BaseXPContainer _baseXPTable
Definition ObjectMgr.h:1565

References _baseXPTable.

◆ GetBroadcastText()

BroadcastText const * ObjectMgr::GetBroadcastText ( uint32  id) const
inline
1200 {
1201 BroadcastTextContainer::const_iterator itr = _broadcastTextStore.find(id);
1202 if (itr != _broadcastTextStore.end())
1203 return &itr->second;
1204 return nullptr;
1205 }
BroadcastTextContainer _broadcastTextStore
Definition ObjectMgr.h:1604

References _broadcastTextStore.

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

◆ GetCreatureAddon()

CreatureAddon const * ObjectMgr::GetCreatureAddon ( ObjectGuid::LowType  lowguid)
1449{
1450 CreatureAddonContainer::const_iterator itr = _creatureAddonStore.find(lowguid);
1451 if (itr != _creatureAddonStore.end())
1452 return &(itr->second);
1453
1454 return nullptr;
1455}
CreatureAddonContainer _creatureAddonStore
Definition ObjectMgr.h:1588

References _creatureAddonStore.

◆ GetCreatureBaseStats()

CreatureBaseStats const * ObjectMgr::GetCreatureBaseStats ( uint8  level,
uint8  unitClass 
)
9962{
9963 CreatureBaseStatsContainer::const_iterator it = _creatureBaseStatsStore.find(MAKE_PAIR16(level, unitClass));
9964
9965 if (it != _creatureBaseStatsStore.end())
9966 return &(it->second);
9967
9968 struct DefaultCreatureBaseStats : public CreatureBaseStats
9969 {
9970 DefaultCreatureBaseStats()
9971 {
9972 BaseArmor = 1;
9973 for (uint8 j = 0; j < MAX_EXPANSIONS; ++j)
9974 {
9975 BaseHealth[j] = 1;
9976 BaseDamage[j] = 0.0f;
9977 }
9978 BaseMana = 0;
9979 AttackPower = 0;
9980 RangedAttackPower = 0;
9981 }
9982 };
9983 static const DefaultCreatureBaseStats defStats;
9984 return &defStats;
9985}
uint16 MAKE_PAIR16(uint8 l, uint8 h)
Definition ObjectDefines.h:83
CreatureBaseStatsContainer _creatureBaseStatsStore
Definition ObjectMgr.h:1549

References _creatureBaseStatsStore, MAKE_PAIR16(), and MAX_EXPANSIONS.

Referenced by AddCreData().

◆ GetCreatureData()

CreatureData const * ObjectMgr::GetCreatureData ( ObjectGuid::LowType  spawnId) const
inline
1208 {
1209 CreatureDataContainer::const_iterator itr = _creatureDataStore.find(spawnId);
1210 if (itr == _creatureDataStore.end()) return nullptr;
1211 return &itr->second;
1212 }

References _creatureDataStore.

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

◆ GetCreatureLocale()

CreatureLocale const * ObjectMgr::GetCreatureLocale ( uint32  entry) const
inline
1234 {
1235 CreatureLocaleContainer::const_iterator itr = _creatureLocaleStore.find(entry);
1236 if (itr == _creatureLocaleStore.end()) return nullptr;
1237 return &itr->second;
1238 }
CreatureLocaleContainer _creatureLocaleStore
Definition ObjectMgr.h:1596

References _creatureLocaleStore.

◆ GetCreatureModelInfo()

CreatureModelInfo const * ObjectMgr::GetCreatureModelInfo ( uint32  modelId) const
1653{
1654 CreatureModelContainer::const_iterator itr = _creatureModelStore.find(modelId);
1655 if (itr != _creatureModelStore.end())
1656 return &(itr->second);
1657
1658 return nullptr;
1659}
CreatureModelContainer _creatureModelStore
Definition ObjectMgr.h:1587

References _creatureModelStore.

Referenced by GetCreatureModelRandomGender(), and LoadCreatureTemplateModels().

◆ GetCreatureModelRandomGender()

CreatureModelInfo const * ObjectMgr::GetCreatureModelRandomGender ( CreatureModel model,
CreatureTemplate const *  creatureTemplate 
) const
1696{
1697 CreatureModelInfo const* modelInfo = GetCreatureModelInfo(model->CreatureDisplayID);
1698 if (!modelInfo)
1699 return nullptr;
1700
1701 // If a model for another gender exists, 50% chance to use it
1702 if (modelInfo->modelid_other_gender != 0 && urand(0, 1) == 0)
1703 {
1704 CreatureModelInfo const* minfo_tmp = GetCreatureModelInfo(modelInfo->modelid_other_gender);
1705 if (!minfo_tmp)
1706 LOG_ERROR("sql.sql", "Model (Entry: {}) has modelid_other_gender {} not found in table `creature_model_info`. ", model->CreatureDisplayID, modelInfo->modelid_other_gender);
1707 else
1708 {
1709 // Model ID changed
1710 model->CreatureDisplayID = modelInfo->modelid_other_gender;
1711 if (creatureTemplate)
1712 {
1713 auto itr = std::find_if(creatureTemplate->Models.begin(), creatureTemplate->Models.end(), [&](CreatureModel const& templateModel)
1714 {
1715 return templateModel.CreatureDisplayID == modelInfo->modelid_other_gender;
1716 });
1717 if (itr != creatureTemplate->Models.end())
1718 *model = *itr;
1719 }
1720 return minfo_tmp;
1721 }
1722 }
1723
1724 return modelInfo;
1725}
CreatureModelInfo const * GetCreatureModelInfo(uint32 modelId) const
Definition ObjectMgr.cpp:1652
Definition CreatureData.h:398
uint32 modelid_other_gender
Definition CreatureData.h:402
uint32 CreatureDisplayID
Definition CreatureData.h:179

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
1467{
1469}
std::unordered_map< ObjectGuid::LowType, CreatureMovementData > _creatureMovementOverrides
Definition ObjectMgr.h:1590
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
1008 {
1009 return _creatureQuestInvolvedRelations.equal_range(creature_entry);
1010 }
QuestRelations _creatureQuestInvolvedRelations
Definition ObjectMgr.h:1513

References _creatureQuestInvolvedRelations.

◆ GetCreatureQuestInvolvedRelationMap()

QuestRelations * ObjectMgr::GetCreatureQuestInvolvedRelationMap ( )
inline

◆ GetCreatureQuestItemList()

CreatureQuestItemList const * ObjectMgr::GetCreatureQuestItemList ( uint32  id) const
inline
826 {
827 CreatureQuestItemMap::const_iterator itr = _creatureQuestItemStore.find(id);
828 if (itr != _creatureQuestItemStore.end())
829 return &itr->second;
830 return nullptr;
831 }
CreatureQuestItemMap _creatureQuestItemStore
Definition ObjectMgr.h:1593

References _creatureQuestItemStore.

◆ GetCreatureQuestItemMap()

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

References _creatureQuestItemStore.

◆ GetCreatureQuestRelationBounds()

QuestRelationBounds ObjectMgr::GetCreatureQuestRelationBounds ( uint32  creature_entry)
inline
1003 {
1004 return _creatureQuestRelations.equal_range(creature_entry);
1005 }
QuestRelations _creatureQuestRelations
Definition ObjectMgr.h:1512

References _creatureQuestRelations.

◆ GetCreatureQuestRelationMap()

QuestRelations * ObjectMgr::GetCreatureQuestRelationMap ( )
inline
993 {
995 }

References _creatureQuestRelations.

◆ GetCreatureTemplate()

◆ GetCreatureTemplateAddon()

CreatureAddon const * ObjectMgr::GetCreatureTemplateAddon ( uint32  entry)
1458{
1459 CreatureAddonContainer::const_iterator itr = _creatureTemplateAddonStore.find(entry);
1460 if (itr != _creatureTemplateAddonStore.end())
1461 return &(itr->second);
1462
1463 return nullptr;
1464}
CreatureAddonContainer _creatureTemplateAddonStore
Definition ObjectMgr.h:1589

References _creatureTemplateAddonStore.

◆ GetCreatureTemplates()

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

References _creatureTemplateStore.

Referenced by LoadCreatureClassLevelStats(), and LoadNPCSpellClickSpells().

◆ GetDBCLocaleIndex()

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

References DBCLocaleIndex.

◆ GetDungeonEncounterList()

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

References _dungeonEncounterStore, and MAKE_PAIR32().

◆ GetEquipmentInfo()

EquipmentInfo const * ObjectMgr::GetEquipmentInfo ( uint32  entry,
int8 id 
)
1472{
1473 EquipmentInfoContainer::const_iterator itr = _equipmentInfoStore.find(entry);
1474 if (itr == _equipmentInfoStore.end())
1475 return nullptr;
1476
1477 if (itr->second.empty())
1478 return nullptr;
1479
1480 if (id == -1) // select a random element
1481 {
1482 EquipmentInfoContainerInternal::const_iterator ritr = itr->second.begin();
1483 std::advance(ritr, urand(0u, itr->second.size() - 1));
1484 id = std::distance(itr->second.begin(), ritr) + 1;
1485 return &ritr->second;
1486 }
1487 else
1488 {
1489 EquipmentInfoContainerInternal::const_iterator itr2 = itr->second.find(id);
1490 if (itr2 != itr->second.end())
1491 return &itr2->second;
1492 }
1493
1494 return nullptr;
1495}
EquipmentInfoContainer _equipmentInfoStore
Definition ObjectMgr.h:1594

References _equipmentInfoStore, and urand().

Referenced by LoadCreatures().

◆ GetFishingBaseSkillLevel()

int32 ObjectMgr::GetFishingBaseSkillLevel ( uint32  entry) const
inline
1118 {
1119 FishingBaseSkillContainer::const_iterator itr = _fishingBaseForAreaStore.find(entry);
1120 return itr != _fishingBaseForAreaStore.end() ? itr->second : 0;
1121 }

References _fishingBaseForAreaStore.

◆ GetGameObjectAddon()

GameObjectAddon const * ObjectMgr::GetGameObjectAddon ( ObjectGuid::LowType  lowguid)
1440{
1441 GameObjectAddonContainer::const_iterator itr = _gameObjectAddonStore.find(lowguid);
1442 if (itr != _gameObjectAddonStore.end())
1443 return &(itr->second);
1444
1445 return nullptr;
1446}
GameObjectAddonContainer _gameObjectAddonStore
Definition ObjectMgr.h:1591

References _gameObjectAddonStore.

◆ GetGameObjectData()

GameObjectData const * ObjectMgr::GetGameObjectData ( ObjectGuid::LowType  spawnId) const
inline
1228 {
1229 GameObjectDataContainer::const_iterator itr = _gameObjectDataStore.find(spawnId);
1230 if (itr == _gameObjectDataStore.end()) return nullptr;
1231 return &itr->second;
1232 }

References _gameObjectDataStore.

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

◆ GetGameObjectLocale()

GameObjectLocale const * ObjectMgr::GetGameObjectLocale ( uint32  entry) const
inline
1240 {
1241 GameObjectLocaleContainer::const_iterator itr = _gameObjectLocaleStore.find(entry);
1242 if (itr == _gameObjectLocaleStore.end()) return nullptr;
1243 return &itr->second;
1244 }
GameObjectLocaleContainer _gameObjectLocaleStore
Definition ObjectMgr.h:1598

References _gameObjectLocaleStore.

◆ GetGameObjectQuestItemList()

GameObjectQuestItemList const * ObjectMgr::GetGameObjectQuestItemList ( uint32  id) const
inline
817 {
818 GameObjectQuestItemMap::const_iterator itr = _gameObjectQuestItemStore.find(id);
819 if (itr != _gameObjectQuestItemStore.end())
820 return &itr->second;
821 return nullptr;
822 }
GameObjectQuestItemMap _gameObjectQuestItemStore
Definition ObjectMgr.h:1592

References _gameObjectQuestItemStore.

◆ GetGameObjectQuestItemMap()

GameObjectQuestItemMap const * ObjectMgr::GetGameObjectQuestItemMap ( ) const
inline

◆ GetGameObjectTemplate()

GameObjectTemplate const * ObjectMgr::GetGameObjectTemplate ( uint32  entry)
10286{
10287 GameObjectTemplateContainer::const_iterator itr = _gameObjectTemplateStore.find(entry);
10288 if (itr != _gameObjectTemplateStore.end())
10289 return &(itr->second);
10290
10291 return nullptr;
10292}
GameObjectTemplateContainer _gameObjectTemplateStore
Definition ObjectMgr.h:1599

References _gameObjectTemplateStore.

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

◆ GetGameObjectTemplateAddon()

GameObjectTemplateAddon const * ObjectMgr::GetGameObjectTemplateAddon ( uint32  entry) const
10301{
10302 auto itr = _gameObjectTemplateAddonStore.find(entry);
10303 if (itr != _gameObjectTemplateAddonStore.end())
10304 return &itr->second;
10305
10306 return nullptr;
10307}
GameObjectTemplateAddonContainer _gameObjectTemplateAddonStore
Definition ObjectMgr.h:1600

References _gameObjectTemplateAddonStore.

◆ GetGameObjectTemplates()

GameObjectTemplateContainer const * ObjectMgr::GetGameObjectTemplates ( ) const
inline

◆ GetGameTele() [1/2]

GameTele const * ObjectMgr::GetGameTele ( std::string_view  name,
bool  exactSearch = false 
) const
9170{
9171 // explicit name case
9172 std::wstring wname;
9173 if (!Utf8toWStr(name, wname))
9174 return nullptr;
9175
9176 // converting string that we try to find to lower case
9177 wstrToLower(wname);
9178
9179 // Alternative first GameTele what contains wnameLow as substring in case no GameTele location found
9180 const GameTele* alt = nullptr;
9181 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9182 {
9183 if (itr->second.wnameLow == wname)
9184 return &itr->second;
9185 else if (!exactSearch && !alt && itr->second.wnameLow.find(wname) != std::wstring::npos)
9186 alt = &itr->second;
9187 }
9188
9189 return alt;
9190}
Definition ObjectMgr.h:132

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

◆ GetGameTele() [2/2]

GameTele const * ObjectMgr::GetGameTele ( uint32  id) const
inline
1357 {
1358 GameTeleContainer::const_iterator itr = _gameTeleStore.find(id);
1359 if (itr == _gameTeleStore.end()) return nullptr;
1360 return &itr->second;
1361 }

References _gameTeleStore.

◆ GetGameTeleMap()

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

References _gameTeleStore.

◆ GetGenerator()

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

◆ GetGoBackTrigger()

AreaTriggerTeleport const * ObjectMgr::GetGoBackTrigger ( uint32  Map) const
7144{
7145 bool useParentDbValue = false;
7146 uint32 parentId = 0;
7147 MapEntry const* mapEntry = sMapStore.LookupEntry(Map);
7148 if (!mapEntry || mapEntry->entrance_map < 0)
7149 return nullptr;
7150
7151 if (mapEntry->IsDungeon())
7152 {
7153 InstanceTemplate const* iTemplate = sObjectMgr->GetInstanceTemplate(Map);
7154
7155 if (!iTemplate)
7156 return nullptr;
7157
7158 parentId = iTemplate->Parent;
7159 useParentDbValue = true;
7160 }
7161
7162 uint32 entrance_map = uint32(mapEntry->entrance_map);
7163 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
7164 if ((!useParentDbValue && itr->second.target_mapId == entrance_map) || (useParentDbValue && itr->second.target_mapId == parentId))
7165 {
7166 AreaTrigger const* atEntry = GetAreaTrigger(itr->first);
7167 if (atEntry && atEntry->map == Map)
7168 return &itr->second;
7169 }
7170 return nullptr;
7171}
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
AreaTrigger const * GetAreaTrigger(uint32 trigger) const
Definition ObjectMgr.h:862
Definition ObjectMgr.h:420
uint32 map
Definition ObjectMgr.h:422
Definition Map.h:121
uint32 Parent
Definition Map.h:122
Definition DBCStructure.h:1326
int32 entrance_map
Definition DBCStructure.h:1341
bool IsDungeon() const
Definition DBCStructure.h:1352

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

◆ GetGOQuestInvolvedRelationBounds()

QuestRelationBounds ObjectMgr::GetGOQuestInvolvedRelationBounds ( uint32  go_entry)
inline
988 {
989 return _goQuestInvolvedRelations.equal_range(go_entry);
990 }
QuestRelations _goQuestInvolvedRelations
Definition ObjectMgr.h:1511

References _goQuestInvolvedRelations.

◆ GetGOQuestInvolvedRelationMap()

QuestRelations * ObjectMgr::GetGOQuestInvolvedRelationMap ( )
inline
978 {
980 }

References _goQuestInvolvedRelations.

◆ GetGOQuestRelationBounds()

QuestRelationBounds ObjectMgr::GetGOQuestRelationBounds ( uint32  go_entry)
inline
983 {
984 return _goQuestRelations.equal_range(go_entry);
985 }
QuestRelations _goQuestRelations
Definition ObjectMgr.h:1510

References _goQuestRelations.

◆ GetGOQuestRelationMap()

QuestRelations * ObjectMgr::GetGOQuestRelationMap ( )
inline
973 {
974 return &_goQuestRelations;
975 }

References _goQuestRelations.

◆ GetGossipMenuItemsLocale()

GossipMenuItemsLocale const * ObjectMgr::GetGossipMenuItemsLocale ( uint32  entry) const
inline
1270 {
1271 GossipMenuItemsLocaleContainer::const_iterator itr = _gossipMenuItemsLocaleStore.find(entry);
1272 if (itr == _gossipMenuItemsLocaleStore.end()) return nullptr;
1273 return &itr->second;
1274 }
GossipMenuItemsLocaleContainer _gossipMenuItemsLocaleStore
Definition ObjectMgr.h:1616

References _gossipMenuItemsLocaleStore.

◆ GetGossipMenuItemsMapBounds()

GossipMenuItemsMapBounds ObjectMgr::GetGossipMenuItemsMapBounds ( uint32  uiMenuId) const
inline
1410 {
1411 return _gossipMenuItemsStore.equal_range(uiMenuId);
1412 }
GossipMenuItemsContainer _gossipMenuItemsStore
Definition ObjectMgr.h:1505

References _gossipMenuItemsStore.

◆ GetGossipMenuItemsMapBoundsNonConst()

GossipMenuItemsMapBoundsNonConst ObjectMgr::GetGossipMenuItemsMapBoundsNonConst ( uint32  uiMenuId)
inline
1414 {
1415 return _gossipMenuItemsStore.equal_range(uiMenuId);
1416 }

References _gossipMenuItemsStore.

◆ GetGossipMenusMapBounds()

GossipMenusMapBounds ObjectMgr::GetGossipMenusMapBounds ( uint32  uiMenuId) const
inline
1400 {
1401 return _gossipMenusStore.equal_range(uiMenuId);
1402 }
GossipMenusContainer _gossipMenusStore
Definition ObjectMgr.h:1504

References _gossipMenusStore.

◆ GetGossipMenusMapBoundsNonConst()

GossipMenusMapBoundsNonConst ObjectMgr::GetGossipMenusMapBoundsNonConst ( uint32  uiMenuId)
inline
1405 {
1406 return _gossipMenusStore.equal_range(uiMenuId);
1407 }

References _gossipMenusStore.

◆ GetGossipText()

GossipText const * ObjectMgr::GetGossipText ( uint32  Text_ID) const
6191{
6192 GossipTextContainer::const_iterator itr = _gossipTextStore.find(Text_ID);
6193 if (itr != _gossipTextStore.end())
6194 return &itr->second;
6195 return nullptr;
6196}
GossipTextContainer _gossipTextStore
Definition ObjectMgr.h:1492

References _gossipTextStore.

Referenced by LoadGossipMenu().

◆ GetGridObjectGuids()

CellObjectGuids const & ObjectMgr::GetGridObjectGuids ( uint16  mapid,
uint8  spawnMode,
uint32  gridId 
)
inline
1162 {
1163 MapObjectGuids::const_iterator itr1 = _mapObjectGuidsStore.find(MAKE_PAIR32(mapid, spawnMode));
1164 if (itr1 != _mapObjectGuidsStore.end())
1165 {
1166 CellObjectGuidsMap::const_iterator itr2 = itr1->second.find(gridId);
1167 if (itr2 != itr1->second.end())
1168 return itr2->second;
1169 }
1170 return _emptyCellObjectGuids;
1171 }
CellObjectGuids _emptyCellObjectGuids
Definition ObjectMgr.h:1582

References _emptyCellObjectGuids, _mapObjectGuidsStore, and MAKE_PAIR32().

◆ GetGuidSequenceGenerator()

template<HighGuid high>
ObjectGuidGeneratorBase & ObjectMgr::GetGuidSequenceGenerator ( )
inlineprivate
1473 {
1474 auto itr = _guidGenerators.find(high);
1475 if (itr == _guidGenerators.end())
1476 itr = _guidGenerators.insert(std::make_pair(high, std::unique_ptr<ObjectGuidGenerator<high>>(new ObjectGuidGenerator<high>()))).first;
1477
1478 return *itr->second;
1479 }
Definition ObjectGuid.h:297
std::map< HighGuid, std::unique_ptr< ObjectGuidGeneratorBase > > _guidGenerators
Definition ObjectMgr.h:1481

References _guidGenerators.

◆ GetInstanceTemplate()

InstanceTemplate const * ObjectMgr::GetInstanceTemplate ( uint32  mapId)
6097{
6098 InstanceTemplateContainer::const_iterator itr = _instanceTemplateStore.find(uint16(mapID));
6099 if (itr != _instanceTemplateStore.end())
6100 return &(itr->second);
6101
6102 return nullptr;
6103}
InstanceTemplateContainer _instanceTemplateStore
Definition ObjectMgr.h:1538

References _instanceTemplateStore.

◆ GetItemLocale()

ItemLocale const * ObjectMgr::GetItemLocale ( uint32  entry) const
inline
1246 {
1247 ItemLocaleContainer::const_iterator itr = _itemLocaleStore.find(entry);
1248 if (itr == _itemLocaleStore.end()) return nullptr;
1249 return &itr->second;
1250 }
ItemLocaleContainer _itemLocaleStore
Definition ObjectMgr.h:1607

References _itemLocaleStore.

◆ GetItemSetNameEntry()

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

References _itemSetNameStore.

◆ GetItemSetNameLocale()

ItemSetNameLocale const * ObjectMgr::GetItemSetNameLocale ( uint32  entry) const
inline
1252 {
1253 ItemSetNameLocaleContainer::const_iterator itr = _itemSetNameLocaleStore.find(entry);
1254 if (itr == _itemSetNameLocaleStore.end())return nullptr;
1255 return &itr->second;
1256 }
ItemSetNameLocaleContainer _itemSetNameLocaleStore
Definition ObjectMgr.h:1608

References _itemSetNameLocaleStore.

◆ GetItemTemplate()

ItemTemplate const * ObjectMgr::GetItemTemplate ( uint32  entry)
3488{
3489 return entry < _itemTemplateStoreFast.size() ? _itemTemplateStoreFast[entry] : nullptr;
3490}
std::vector< ItemTemplate * > _itemTemplateStoreFast
Definition ObjectMgr.h:1606

References _itemTemplateStoreFast.

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

◆ GetItemTemplateStore()

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

References _itemTemplateStore.

◆ GetItemTemplateStoreFast()

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

References _itemTemplateStoreFast.

◆ GetLinkedRespawnGuid()

ObjectGuid ObjectMgr::GetLinkedRespawnGuid ( ObjectGuid  guid) const
inline
1219 {
1220 LinkedRespawnContainer::const_iterator itr = _linkedRespawnStore.find(guid);
1221 if (itr == _linkedRespawnStore.end())
1222 return ObjectGuid::Empty;
1223 return itr->second;
1224 }
static ObjectGuid const Empty
Definition ObjectGuid.h:120
LinkedRespawnContainer _linkedRespawnStore
Definition ObjectMgr.h:1595

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
1427 {
1428 if (data.size() > std::size_t(loc_idx) && !data[loc_idx].empty())
1429 value = data[loc_idx];
1430 }

◆ GetLocaleString() [2/2]

◆ GetMailLevelReward()

MailLevelReward const * ObjectMgr::GetMailLevelReward ( uint32  level,
uint32  raceMask 
)
inline
1149 {
1150 MailLevelRewardContainer::const_iterator map_itr = _mailLevelRewardStore.find(level);
1151 if (map_itr == _mailLevelRewardStore.end())
1152 return nullptr;
1153
1154 for (const auto & set_itr : map_itr->second)
1155 if (set_itr.raceMask & raceMask)
1156 return &set_itr;
1157
1158 return nullptr;
1159 }
MailLevelRewardContainer _mailLevelRewardStore
Definition ObjectMgr.h:1547

References _mailLevelRewardStore.

◆ GetMapEntranceTrigger()

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

Searches for the areatrigger which teleports players to the given map

7177{
7178 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
7179 {
7180 if (itr->second.target_mapId == Map) // Id is used to determine correct Scarlet Monastery instance
7181 {
7182 // xinef: no need to check, already done at loading
7183 //AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first);
7184 //if (atEntry)
7185 return &itr->second;
7186 }
7187 }
7188 return nullptr;
7189}

References _areaTriggerTeleportStore.

◆ GetMapObjectGuids()

CellObjectGuidsMap const & ObjectMgr::GetMapObjectGuids ( uint16  mapid,
uint8  spawnMode 
)
inline
1174 {
1175 MapObjectGuids::const_iterator itr1 = _mapObjectGuidsStore.find(MAKE_PAIR32(mapid, spawnMode));
1176 if (itr1 != _mapObjectGuidsStore.end())
1177 return itr1->second;
1179 }
CellObjectGuidsMap _emptyCellObjectGuidsMap
Definition ObjectMgr.h:1581

References _emptyCellObjectGuidsMap, _mapObjectGuidsStore, and MAKE_PAIR32().

◆ GetModelForShapeshift()

uint32 ObjectMgr::GetModelForShapeshift ( ShapeshiftForm  form,
Player player 
) const
1907{
1908 uint8 customizationID;
1909
1910 if (player->GetTeamId() == TEAM_ALLIANCE)
1911 customizationID = player->GetByteValue(PLAYER_BYTES, 3); // Use Hair Color
1912 else
1913 customizationID = player->GetByteValue(PLAYER_BYTES, 0); // Use Skin Color
1914
1915 auto itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), customizationID, player->getGender()));
1916 if (itr != _playerShapeshiftModel.end())
1917 return itr->second; // Explicit combination
1918
1919 itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), customizationID, GENDER_NONE));
1920 if (itr != _playerShapeshiftModel.end())
1921 return itr->second; // Combination applied to both genders
1922
1923 itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), 255, player->getGender()));
1924 if (itr != _playerShapeshiftModel.end())
1925 return itr->second; // Default gender-dependent model
1926
1927 itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), 255, GENDER_NONE));
1928 if (itr != _playerShapeshiftModel.end())
1929 return itr->second; // Last resort
1930
1931 LOG_DEBUG("entities.player", "ShapeshiftForm {} with RaceID ({}) have no shapeshift model data defined, using fallback data.", form, player->getRace());
1932 return 0;
1933}
@ GENDER_NONE
Definition SharedDefines.h:63
@ TEAM_ALLIANCE
Definition SharedDefines.h:771
@ PLAYER_BYTES
Definition UpdateFields.h:181
PlayerShapeshiftModelMap _playerShapeshiftModel
Definition ObjectMgr.h:1637
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition Object.cpp:312
TeamId GetTeamId(bool original=false) const
Definition Player.h:2108
uint8 getGender() const
Definition Unit.h:831
uint8 getRace(bool original=false) const
Definition Unit.cpp:20877

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

◆ GetModelForTotem()

uint32 ObjectMgr::GetModelForTotem ( SummonSlot  totemSlot,
Races  race 
) const
1852{
1853 auto itr = _playerTotemModel.find(std::make_pair(totemSlot, race));
1854 if (itr != _playerTotemModel.end())
1855 return itr->second;
1856
1857 LOG_ERROR("misc", "TotemSlot {} with RaceID ({}) have no totem model data defined, set to default model.", totemSlot, race);
1858 return 0;
1859}
PlayerTotemModelMap _playerTotemModel
Definition ObjectMgr.h:1635

References _playerTotemModel, and LOG_ERROR.

◆ GetModuleString() [1/2]

ModuleString const * ObjectMgr::GetModuleString ( std::string  module,
uint32  id 
) const
inline
1305 {
1306 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
1307 ModuleStringContainer::const_iterator itr = _moduleStringStore.find(pairKey);
1308 if (itr == _moduleStringStore.end())
1309 return nullptr;
1310
1311 return &itr->second;
1312 }
ModuleStringContainer _moduleStringStore
Definition ObjectMgr.h:1614

References _moduleStringStore.

Referenced by GetModuleString().

◆ GetModuleString() [2/2]

std::string const * ObjectMgr::GetModuleString ( std::string  module,
uint32  id,
LocaleConstant  locale 
) const
8909{
8910 ModuleString const* ms = GetModuleString(module, id);
8911 if (ms && !ms->Content.empty())
8912 {
8913 if (ms->Content.size() > size_t(locale) && !ms->Content[locale].empty())
8914 return &ms->Content[locale];
8915
8916 return &ms->Content[DEFAULT_LOCALE];
8917 }
8918
8919 LOG_ERROR("sql.sql", "Module string module {} id {} not found in DB.", module, id);
8920
8921 return (std::string*)"error";
8922}
ModuleString const * GetModuleString(std::string module, uint32 id) const
Definition ObjectMgr.h:1304
Definition ObjectMgr.h:496
std::vector< std::string > Content
Definition ObjectMgr.h:497

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

◆ GetNearestTaxiNode()

uint32 ObjectMgr::GetNearestTaxiNode ( float  x,
float  y,
float  z,
uint32  mapid,
uint32  teamId 
)
6761{
6762 bool found = false;
6763 float dist = 10000;
6764 uint32 id = 0;
6765
6766 for (uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i)
6767 {
6768 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(i);
6769
6770 if (!node || node->map_id != mapid || (!node->MountCreatureID[teamId == TEAM_ALLIANCE ? 1 : 0] && node->MountCreatureID[0] != 32981)) // dk flight
6771 continue;
6772
6773 uint8 field = (uint8)((i - 1) / 32);
6774 uint32 submask = 1 << ((i - 1) % 32);
6775
6776 // skip not taxi network nodes
6777 if (field >= TaxiMaskSize || (sTaxiNodesMask[field] & submask) == 0)
6778 {
6779 continue;
6780 }
6781
6782 float dist2 = (node->x - x) * (node->x - x) + (node->y - y) * (node->y - y) + (node->z - z) * (node->z - z);
6783 if (found)
6784 {
6785 if (dist2 < dist)
6786 {
6787 dist = dist2;
6788 id = i;
6789 }
6790 }
6791 else
6792 {
6793 found = true;
6794 dist = dist2;
6795 id = i;
6796 }
6797 }
6798
6799 return id;
6800}
TaxiMask sTaxiNodesMask
Definition DBCStores.cpp:176
DBCStorage< TaxiNodesEntry > sTaxiNodesStore(TaxiNodesEntryfmt)
static constexpr std::size_t TaxiMaskSize
Definition DBCStructure.h:2249
Definition DBCStructure.h:1954
float z
Definition DBCStructure.h:1959
uint32 map_id
Definition DBCStructure.h:1956
float x
Definition DBCStructure.h:1957
float y
Definition DBCStructure.h:1958
uint32 MountCreatureID[2]
Definition DBCStructure.h:1962

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

◆ GetNpcTextLocale()

NpcTextLocale const * ObjectMgr::GetNpcTextLocale ( uint32  entry) const
inline
1294 {
1295 NpcTextLocaleContainer::const_iterator itr = _npcTextLocaleStore.find(entry);
1296 if (itr == _npcTextLocaleStore.end()) return nullptr;
1297 return &itr->second;
1298 }
NpcTextLocaleContainer _npcTextLocaleStore
Definition ObjectMgr.h:1612

References _npcTextLocaleStore.

◆ GetNpcTrainerSpells()

TrainerSpellData const * ObjectMgr::GetNpcTrainerSpells ( uint32  entry) const
inline
1368 {
1369 CacheTrainerSpellContainer::const_iterator iter = _cacheTrainerSpellStore.find(entry);
1370 if (iter == _cacheTrainerSpellStore.end())
1371 return nullptr;
1372
1373 return &iter->second;
1374 }

References _cacheTrainerSpellStore.

◆ GetNpcVendorItemList()

VendorItemData const * ObjectMgr::GetNpcVendorItemList ( uint32  entry) const
inline
1377 {
1378 CacheVendorItemContainer::const_iterator iter = _cacheVendorItemStore.find(entry);
1379 if (iter == _cacheVendorItemStore.end())
1380 return nullptr;
1381
1382 return &iter->second;
1383 }

References _cacheVendorItemStore.

Referenced by IsVendorItemValid().

◆ GetPageText()

PageText const * ObjectMgr::GetPageText ( uint32  pageEntry)
6013{
6014 PageTextContainer::const_iterator itr = _pageTextStore.find(pageEntry);
6015 if (itr != _pageTextStore.end())
6016 return &(itr->second);
6017
6018 return nullptr;
6019}
PageTextContainer _pageTextStore
Definition ObjectMgr.h:1537

References _pageTextStore.

Referenced by LoadGameObjectTemplate(), and LoadItemTemplates().

◆ GetPageTextLocale()

PageTextLocale const * ObjectMgr::GetPageTextLocale ( uint32  entry) const
inline
1258 {
1259 PageTextLocaleContainer::const_iterator itr = _pageTextLocaleStore.find(entry);
1260 if (itr == _pageTextLocaleStore.end()) return nullptr;
1261 return &itr->second;
1262 }
PageTextLocaleContainer _pageTextLocaleStore
Definition ObjectMgr.h:1613

References _pageTextLocaleStore.

◆ GetPetLevelInfo()

PetLevelInfo const * ObjectMgr::GetPetLevelInfo ( uint32  creature_id,
uint8  level 
) const
3854{
3855 if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
3856 level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
3857
3858 PetLevelInfoContainer::const_iterator itr = _petInfoStore.find(creature_id);
3859 if (itr == _petInfoStore.end())
3860 return nullptr;
3861
3862 return &itr->second[level - 1]; // data for level 1 stored in [0] array element, ...
3863}

References _petInfoStore, CONFIG_MAX_PLAYER_LEVEL, and sWorld.

◆ GetPlayerClassInfo()

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

References _playerClassInfo, and MAX_CLASSES.

◆ GetPlayerClassLevelInfo()

void ObjectMgr::GetPlayerClassLevelInfo ( uint32  class_,
uint8  level,
PlayerClassLevelInfo info 
) const
4521{
4522 if (level < 1 || class_ >= MAX_CLASSES)
4523 return;
4524
4525 PlayerClassInfo const* pInfo = _playerClassInfo[class_];
4526
4527 if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4528 level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
4529
4530 *info = pInfo->levelInfo[level - 1];
4531}
Definition Player.h:292

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

◆ GetPlayerInfo()

PlayerInfo const * ObjectMgr::GetPlayerInfo ( uint32  race,
uint32  class_ 
) const
10332{
10333 if (race >= MAX_RACES)
10334 return nullptr;
10335 if (class_ >= MAX_CLASSES)
10336 return nullptr;
10337 PlayerInfo const* info = _playerInfo[race][class_];
10338 if (!info)
10339 return nullptr;
10340 return info;
10341}
Definition Player.h:331

References _playerInfo, MAX_CLASSES, and MAX_RACES.

◆ GetPlayerLevelInfo()

void ObjectMgr::GetPlayerLevelInfo ( uint32  race,
uint32  class_,
uint8  level,
PlayerLevelInfo info 
) const
4534{
4535 if (level < 1 || race >= MAX_RACES || class_ >= MAX_CLASSES)
4536 return;
4537
4538 PlayerInfo const* pInfo = _playerInfo[race][class_];
4539 if (!pInfo)
4540 return;
4541
4542 if (level <= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4543 *info = pInfo->levelInfo[level - 1];
4544 else
4545 BuildPlayerLevelInfo(race, class_, level, info);
4546}
void BuildPlayerLevelInfo(uint8 race, uint8 class_, uint8 level, PlayerLevelInfo *plinfo) const
Definition ObjectMgr.cpp:4548

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

◆ GetPointOfInterest()

PointOfInterest const * ObjectMgr::GetPointOfInterest ( uint32  id) const
inline
929 {
930 PointOfInterestContainer::const_iterator itr = _pointsOfInterestStore.find(id);
931 if (itr != _pointsOfInterestStore.end())
932 return &itr->second;
933 return nullptr;
934 }
PointOfInterestContainer _pointsOfInterestStore
Definition ObjectMgr.h:1506

References _pointsOfInterestStore.

Referenced by LoadGossipMenuItems().

◆ GetPointOfInterestLocale()

PointOfInterestLocale const * ObjectMgr::GetPointOfInterestLocale ( uint32  poi_id) const
inline
1276 {
1277 PointOfInterestLocaleContainer::const_iterator itr = _pointOfInterestLocaleStore.find(poi_id);
1278 if (itr == _pointOfInterestLocaleStore.end()) return nullptr;
1279 return &itr->second;
1280 }
PointOfInterestLocaleContainer _pointOfInterestLocaleStore
Definition ObjectMgr.h:1617

References _pointOfInterestLocaleStore.

◆ GetQuestForAreaTrigger()

uint32 ObjectMgr::GetQuestForAreaTrigger ( uint32  Trigger_ID) const
inline
842 {
843 QuestAreaTriggerContainer::const_iterator itr = _questAreaTriggerStore.find(Trigger_ID);
844 if (itr != _questAreaTriggerStore.end())
845 return itr->second;
846 return 0;
847 }
QuestAreaTriggerContainer _questAreaTriggerStore
Definition ObjectMgr.h:1490

References _questAreaTriggerStore.

◆ GetQuestGreeting()

QuestGreeting const * ObjectMgr::GetQuestGreeting ( TypeID  type,
uint32  id 
) const
6491{
6492 uint8 typeIndex;
6493 if (type == TYPEID_UNIT)
6494 typeIndex = 0;
6495 else if (type == TYPEID_GAMEOBJECT)
6496 typeIndex = 1;
6497 else
6498 return nullptr;
6499
6500 std::pair<uint32, uint8> pairKey = std::make_pair(id, typeIndex);
6501 QuestGreetingContainer::const_iterator itr = _questGreetingStore.find(pairKey);
6502 if (itr == _questGreetingStore.end())
6503 return nullptr;
6504
6505 return &itr->second;
6506}
@ TYPEID_GAMEOBJECT
Definition ObjectGuid.h:37
@ TYPEID_UNIT
Definition ObjectGuid.h:35
QuestGreetingContainer _questGreetingStore
Definition ObjectMgr.h:1493

References _questGreetingStore, TYPEID_GAMEOBJECT, and TYPEID_UNIT.

◆ GetQuestLocale()

QuestLocale const * ObjectMgr::GetQuestLocale ( uint32  entry) const
inline
1264 {
1265 QuestLocaleContainer::const_iterator itr = _questLocaleStore.find(entry);
1266 if (itr == _questLocaleStore.end()) return nullptr;
1267 return &itr->second;
1268 }
QuestLocaleContainer _questLocaleStore
Definition ObjectMgr.h:1609

References _questLocaleStore.

◆ GetQuestMoneyReward()

uint32 ObjectMgr::GetQuestMoneyReward ( uint8  level,
uint32  questMoneyDifficulty 
) const
10468{
10469 if (questMoneyDifficulty < MAX_QUEST_MONEY_REWARDS)
10470 {
10471 auto const& itr = _questMoneyRewards.find(level);
10472 if (itr != _questMoneyRewards.end())
10473 {
10474 return itr->second.at(questMoneyDifficulty);
10475 }
10476 }
10477
10478 return 0;
10479}
static constexpr uint32 MAX_QUEST_MONEY_REWARDS
Definition ObjectMgr.h:718
QuestMoneyRewardStore _questMoneyRewards
Definition ObjectMgr.h:1639

References _questMoneyRewards, and MAX_QUEST_MONEY_REWARDS.

◆ GetQuestOfferRewardLocale()

QuestOfferRewardLocale const * ObjectMgr::GetQuestOfferRewardLocale ( uint32  entry) const
inline
1282 {
1283 auto itr = _questOfferRewardLocaleStore.find(entry);
1284 if (itr == _questOfferRewardLocaleStore.end()) return nullptr;
1285 return &itr->second;
1286 }
QuestOfferRewardLocaleContainer _questOfferRewardLocaleStore
Definition ObjectMgr.h:1610

References _questOfferRewardLocaleStore.

◆ GetQuestPOIVector()

QuestPOIVector const * ObjectMgr::GetQuestPOIVector ( uint32  questId)
inline
937 {
938 QuestPOIContainer::const_iterator itr = _questPOIStore.find(questId);
939 if (itr != _questPOIStore.end())
940 return &itr->second;
941 return nullptr;
942 }
QuestPOIContainer _questPOIStore
Definition ObjectMgr.h:1508

References _questPOIStore.

◆ GetQuestRequestItemsLocale()

QuestRequestItemsLocale const * ObjectMgr::GetQuestRequestItemsLocale ( uint32  entry) const
inline
1288 {
1289 auto itr = _questRequestItemsLocaleStore.find(entry);
1290 if (itr == _questRequestItemsLocaleStore.end()) return nullptr;
1291 return &itr->second;
1292 }
QuestRequestItemsLocaleContainer _questRequestItemsLocaleStore
Definition ObjectMgr.h:1611

References _questRequestItemsLocaleStore.

◆ GetQuestTemplate()

Quest const * ObjectMgr::GetQuestTemplate ( uint32  quest_id) const
inline
835 {
836 return quest_id < _questTemplatesFast.size() ? _questTemplatesFast[quest_id] : nullptr;
837 }
std::vector< Quest * > _questTemplatesFast
Definition ObjectMgr.h:1484

References _questTemplatesFast.

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

◆ GetQuestTemplates()

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

References _questTemplates.

◆ GetRepRewardRate()

RepRewardRate const * ObjectMgr::GetRepRewardRate ( uint32  factionId) const
inline
901 {
902 RepRewardRateContainer::const_iterator itr = _repRewardRateStore.find(factionId);
903 if (itr != _repRewardRateStore.end())
904 return &itr->second;
905
906 return nullptr;
907 }
RepRewardRateContainer _repRewardRateStore
Definition ObjectMgr.h:1500

References _repRewardRateStore.

◆ GetRepSpilloverTemplate()

RepSpilloverTemplate const * ObjectMgr::GetRepSpilloverTemplate ( uint32  factionId) const
inline
920 {
921 RepSpilloverTemplateContainer::const_iterator itr = _repSpilloverTemplateStore.find(factionId);
922 if (itr != _repSpilloverTemplateStore.end())
923 return &itr->second;
924
925 return nullptr;
926 }
RepSpilloverTemplateContainer _repSpilloverTemplateStore
Definition ObjectMgr.h:1502

References _repSpilloverTemplateStore.

◆ GetReputationOnKilEntry()

ReputationOnKillEntry const * ObjectMgr::GetReputationOnKilEntry ( uint32  id) const
inline
910 {
911 RepOnKillContainer::const_iterator itr = _repOnKillStore.find(id);
912 if (itr != _repOnKillStore.end())
913 return &itr->second;
914 return nullptr;
915 }
RepOnKillContainer _repOnKillStore
Definition ObjectMgr.h:1501

References _repOnKillStore.

◆ GetScriptId()

uint32 ObjectMgr::GetScriptId ( std::string const &  name)
9822{
9823 // use binary search to find the script name in the sorted vector
9824 // assume "" is the first element
9825 if (name.empty())
9826 return 0;
9827
9828 ScriptNameContainer::const_iterator itr = std::lower_bound(_scriptNamesStore.begin(), _scriptNamesStore.end(), name);
9829 if (itr == _scriptNamesStore.end() || (*itr != name))
9830 return 0;
9831
9832 return uint32(itr - _scriptNamesStore.begin());
9833}
ScriptNameContainer _scriptNamesStore
Definition ObjectMgr.h:1525

References _scriptNamesStore.

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

◆ GetScriptName()

std::string const & ObjectMgr::GetScriptName ( uint32  id) const
9816{
9817 static std::string const empty = "";
9818 return (id < _scriptNamesStore.size()) ? _scriptNamesStore[id] : empty;
9819}

References _scriptNamesStore.

Referenced by ValidateSpellScripts().

◆ GetScriptNames()

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

References _scriptNamesStore.

◆ GetSparringData()

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

References _creatureSparringStore.

◆ GetSpellClickInfoMapBounds()

SpellClickInfoMapBounds ObjectMgr::GetSpellClickInfoMapBounds ( uint32  creature_id) const
inline
1395 {
1396 return _spellClickInfoStore.equal_range(creature_id);
1397 }
SpellClickInfoContainer _spellClickInfoStore
Definition ObjectMgr.h:1527

References _spellClickInfoStore.

◆ GetSpellScriptsBounds()

SpellScriptsBounds ObjectMgr::GetSpellScriptsBounds ( uint32  spell_id)
9059{
9060 return SpellScriptsBounds(_spellScriptsStore.lower_bound(spell_id), _spellScriptsStore.upper_bound(spell_id));
9061}
std::pair< SpellScriptsContainer::iterator, SpellScriptsContainer::iterator > SpellScriptsBounds
Definition ObjectMgr.h:388
SpellScriptsContainer _spellScriptsStore
Definition ObjectMgr.h:1529

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
1191 {
1192 TempSummonDataContainer::const_iterator itr = _tempSummonDataStore.find(TempSummonGroupKey(summonerId, summonerType, group));
1193 if (itr != _tempSummonDataStore.end())
1194 return &itr->second;
1195
1196 return nullptr;
1197 }
TempSummonDataContainer _tempSummonDataStore
Stores temp summon data grouped by summoner's entry, summoner's type and group id.
Definition ObjectMgr.h:1602
Key for storing temp summon data in TempSummonDataContainer.
Definition ObjectMgr.h:64

References _tempSummonDataStore.

◆ GetTaxiMountDisplayId()

uint32 ObjectMgr::GetTaxiMountDisplayId ( uint32  id,
TeamId  teamId,
bool  allowed_alt_team = false 
)
6827{
6828 CreatureModel mountModel;
6829 CreatureTemplate const* mount_info = nullptr;
6830
6831 // select mount creature id
6832 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(id);
6833 if (node)
6834 {
6835 uint32 mount_entry = node->MountCreatureID[teamId == TEAM_ALLIANCE ? 1 : 0];
6836
6837 // Fix for Alliance not being able to use Acherus taxi
6838 // only one mount type for both sides
6839 if (mount_entry == 0 && allowed_alt_team)
6840 {
6841 // Simply reverse the selection. At least one team in theory should have a valid mount ID to choose.
6842 mount_entry = node->MountCreatureID[teamId];
6843 }
6844
6845 mount_info = GetCreatureTemplate(mount_entry);
6846 if (mount_info)
6847 {
6848 CreatureModel const* model = mount_info->GetRandomValidModel();
6849 if (!model)
6850 {
6851 LOG_ERROR("sql.sql", "No displayid found for the taxi mount with the entry {}! Can't load it!", mount_entry);
6852 return 0;
6853 }
6854 mountModel = *model;
6855 }
6856 }
6857
6858 // minfo is not actually used but the mount_id was updated
6859 GetCreatureModelRandomGender(&mountModel, mount_info);
6860
6861 return mountModel.CreatureDisplayID;
6862}
CreatureModelInfo const * GetCreatureModelRandomGender(CreatureModel *model, CreatureTemplate const *creatureTemplate) const
Definition ObjectMgr.cpp:1695
CreatureModel const * GetRandomValidModel() const
Definition Creature.cpp:127

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 
)
6803{
6804 TaxiPathSetBySource::iterator src_i = sTaxiPathSetBySource.find(source);
6805 if (src_i == sTaxiPathSetBySource.end())
6806 {
6807 path = 0;
6808 cost = 0;
6809 return;
6810 }
6811
6812 TaxiPathSetForSource& pathSet = src_i->second;
6813
6814 TaxiPathSetForSource::iterator dest_i = pathSet.find(destination);
6815 if (dest_i == pathSet.end())
6816 {
6817 path = 0;
6818 cost = 0;
6819 return;
6820 }
6821
6822 cost = dest_i->second->price;
6823 path = dest_i->second->ID;
6824}
TaxiPathSetBySource sTaxiPathSetBySource
Definition DBCStores.cpp:183
std::map< uint32, TaxiPathEntry const * > TaxiPathSetForSource
Definition DBCStructure.h:2243

References TaxiNodesEntry::ID, and sTaxiPathSetBySource.

◆ GetVehicleAccessoryList()

VehicleAccessoryList const * ObjectMgr::GetVehicleAccessoryList ( Vehicle veh) const
10315{
10316 if (Creature* cre = veh->GetBase()->ToCreature())
10317 {
10318 // Give preference to GUID-based accessories
10319 VehicleAccessoryContainer::const_iterator itr = _vehicleAccessoryStore.find(cre->GetSpawnId());
10320 if (itr != _vehicleAccessoryStore.end())
10321 return &itr->second;
10322 }
10323
10324 // Otherwise return entry-based
10325 VehicleAccessoryContainer::const_iterator itr = _vehicleTemplateAccessoryStore.find(veh->GetCreatureEntry());
10326 if (itr != _vehicleTemplateAccessoryStore.end())
10327 return &itr->second;
10328 return nullptr;
10329}
VehicleAccessoryContainer _vehicleAccessoryStore
Definition ObjectMgr.h:1532
VehicleAccessoryContainer _vehicleTemplateAccessoryStore
Definition ObjectMgr.h:1531
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
1449 {
1450 VehicleSeatAddonContainer::const_iterator itr = _vehicleSeatAddonStore.find(seatId);
1451 if (itr == _vehicleSeatAddonStore.end())
1452 return nullptr;
1453
1454 return &itr->second;
1455 }
VehicleSeatAddonContainer _vehicleSeatAddonStore
Definition ObjectMgr.h:1533

References _vehicleSeatAddonStore.

◆ GetXPForLevel()

uint32 ObjectMgr::GetXPForLevel ( uint8  level) const
7685{
7686 if (level < _playerXPperLevel.size())
7687 return _playerXPperLevel[level];
7688 return 0;
7689}
PlayerXPperLevel _playerXPperLevel
Definition ObjectMgr.h:1562

References _playerXPperLevel.

◆ InitializeSpellInfoPrecomputedData()

void ObjectMgr::InitializeSpellInfoPrecomputedData ( )
5960{
5961 uint32 limit = sSpellStore.GetNumRows();
5962 for(uint32 i = 0; i <= limit; ++i)
5963 if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i))
5964 {
5965 const_cast<SpellInfo*>(spellInfo)->SetStackableWithRanks(spellInfo->ComputeIsStackableWithRanks());
5966 const_cast<SpellInfo*>(spellInfo)->SetCritCapable(spellInfo->ComputeIsCritCapable());
5967 const_cast<SpellInfo*>(spellInfo)->SetSpellValid(SpellMgr::ComputeIsSpellValid(spellInfo, false));
5968 }
5969}
DBCStorage< SpellEntry > sSpellStore(SpellEntryfmt)

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

◆ instance()

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

References instance().

Referenced by instance().

◆ IsGameObjectStaticTransport()

bool ObjectMgr::IsGameObjectStaticTransport ( uint32  entry)
10295{
10296 GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
10297 return goinfo && goinfo->type == GAMEOBJECT_TYPE_TRANSPORT;
10298}
@ GAMEOBJECT_TYPE_TRANSPORT
Definition SharedDefines.h:1582

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

Referenced by AddGOData().

◆ IsProfanityName()

bool ObjectMgr::IsProfanityName ( std::string_view  name) const
8545{
8546 // pussywizard
8547 if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
8548 return true;
8549
8550 std::wstring wstr;
8551 if (!Utf8toWStr (name, wstr))
8552 return false;
8553
8554 wstrToLower(wstr);
8555
8556 return _profanityNamesStore.find(wstr) != _profanityNamesStore.end();
8557}

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

Referenced by AddProfanityPlayerName().

◆ IsReservedName()

bool ObjectMgr::IsReservedName ( std::string_view  name) const
8442{
8443 // pussywizard
8444 if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
8445 return true;
8446
8447 std::wstring wstr;
8448 if (!Utf8toWStr (name, wstr))
8449 return false;
8450
8451 wstrToLower(wstr);
8452
8453 return _reservedNamesStore.find(wstr) != _reservedNamesStore.end();
8454}

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

Referenced by AddReservedPlayerName().

◆ IsTavernAreaTrigger()

bool ObjectMgr::IsTavernAreaTrigger ( uint32  triggerID,
uint32  faction 
) const
inline
850 {
851 auto itr = _tavernAreaTriggerStore.find(triggerID);
852 if (itr != _tavernAreaTriggerStore.end())
853 {
854 return (itr->second & faction) != 0;
855 }
856
857 return false;
858 }
TavernAreaTriggerContainer _tavernAreaTriggerStore
Definition ObjectMgr.h:1491

References _tavernAreaTriggerStore.

◆ IsTransportMap()

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

References _transportMaps.

◆ IsValidChannelName()

bool ObjectMgr::IsValidChannelName ( std::string const &  name)
static
8718{
8719 std::wstring wname;
8720 if (!Utf8toWStr(name, wname))
8721 return false;
8722
8723 if (wname.size() > MAX_CHANNEL_NAME)
8724 return false;
8725
8726 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_CHANNEL_NAMES);
8727
8728 return isValidString(wname, strictMask, true);
8729}
#define MAX_CHANNEL_NAME
Definition ObjectMgr.h:686
@ CONFIG_STRICT_CHANNEL_NAMES
Definition WorldConfig.h:175

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

◆ IsValidCharterName()

bool ObjectMgr::IsValidCharterName ( std::string_view  name)
static
8692{
8693 std::wstring wname;
8694 if (!Utf8toWStr(name, wname))
8695 return false;
8696
8697 if (wname.size() > MAX_CHARTER_NAME)
8698 return false;
8699
8700 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_CHARTER_NAME);
8701 if (wname.size() < minName)
8702 return false;
8703
8704 // Check Reserved Name
8705 if (sObjectMgr->IsReservedName(name))
8706 return false;
8707
8708 // Check Profanity Name
8709 if (sObjectMgr->IsProfanityName(name))
8710 return false;
8711
8712 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_CHARTER_NAMES);
8713
8714 return isValidString(wname, strictMask, true);
8715}
#define MAX_CHARTER_NAME
Definition ObjectMgr.h:685
@ CONFIG_MIN_CHARTER_NAME
Definition WorldConfig.h:178
@ CONFIG_STRICT_CHARTER_NAMES
Definition WorldConfig.h:174

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

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

◆ IsVendorItemValid()

bool ObjectMgr::IsVendorItemValid ( uint32  vendor_entry,
uint32  item,
int32  maxcount,
uint32  ptime,
uint32  ExtendedCost,
Player player = nullptr,
std::set< uint32 > *  skip_vendors = nullptr,
uint32  ORnpcflag = 0 
) const
9680{
9681 /*
9682 CreatureTemplate const* cInfo = GetCreatureTemplate(vendor_entry);
9683 if (!cInfo)
9684 {
9685 if (player)
9686 ChatHandler(player->GetSession()).SendSysMessage(LANG_COMMAND_VENDORSELECTION);
9687 else
9688 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have data for not existed creature template (Entry: {}), ignore", vendor_entry);
9689 return false;
9690 }
9691
9692 if (!((cInfo->npcflag | ORnpcflag) & UNIT_NPC_FLAG_VENDOR))
9693 {
9694 if (!skip_vendors || skip_vendors->count(vendor_entry) == 0)
9695 {
9696 if (player)
9697 ChatHandler(player->GetSession()).SendSysMessage(LANG_COMMAND_VENDORSELECTION);
9698 else
9699 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have data for not creature template (Entry: {}) without vendor flag, ignore", vendor_entry);
9700
9701 if (skip_vendors)
9702 skip_vendors->insert(vendor_entry);
9703 }
9704 return false;
9705 }
9706 */
9707
9708 if (!sObjectMgr->GetItemTemplate(item_id))
9709 {
9710 if (player)
9712 else
9713 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` for Vendor (Entry: {}) have in item list non-existed item ({}), ignore", vendor_entry, item_id);
9714 return false;
9715 }
9716
9717 if (ExtendedCost && !sItemExtendedCostStore.LookupEntry(ExtendedCost))
9718 {
9719 if (player)
9721 else
9722 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have Item (Entry: {}) with wrong ExtendedCost ({}) for vendor ({}), ignore", item_id, ExtendedCost, vendor_entry);
9723 return false;
9724 }
9725
9726 if (maxcount > 0 && incrtime == 0)
9727 {
9728 if (player)
9729 ChatHandler(player->GetSession()).PSendSysMessage("MaxCount != 0 ({}) but IncrTime == 0", maxcount);
9730 else
9731 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);
9732 return false;
9733 }
9734 else if (maxcount == 0 && incrtime > 0)
9735 {
9736 if (player)
9737 ChatHandler(player->GetSession()).PSendSysMessage("MaxCount == 0 but IncrTime<>= 0");
9738 else
9739 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);
9740 return false;
9741 }
9742
9743 VendorItemData const* vItems = GetNpcVendorItemList(vendor_entry);
9744 if (!vItems)
9745 return true; // later checks for non-empty lists
9746
9747 if (vItems->FindItemCostPair(item_id, ExtendedCost))
9748 {
9749 if (player)
9750 ChatHandler(player->GetSession()).PSendSysMessage(LANG_ITEM_ALREADY_IN_LIST, item_id, ExtendedCost);
9751 else
9752 LOG_ERROR("sql.sql", "Table `npc_vendor` has duplicate items {} (with extended cost {}) for vendor (Entry: {}), ignoring", item_id, ExtendedCost, vendor_entry);
9753 return false;
9754 }
9755
9756 return true;
9757}
DBCStorage< ItemExtendedCostEntry > sItemExtendedCostStore(ItemExtendedCostEntryfmt)
@ LANG_ITEM_ALREADY_IN_LIST
Definition Language.h:253
@ LANG_ITEM_NOT_FOUND
Definition Language.h:250
@ LANG_EXTENDED_COST_NOT_EXIST
Definition Language.h:378
Definition Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:211
VendorItemData const * GetNpcVendorItemList(uint32 entry) const
Definition ObjectMgr.h:1376
WorldSession * GetSession() const
Definition Player.h:1998
VendorItem const * FindItemCostPair(uint32 item_id, uint32 extendedCost) const
Definition Creature.cpp:111

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 ( )
6976{
6977 uint32 oldMSTime = getMSTime();
6978
6979 if (!_accessRequirementStore.empty())
6980 {
6981 for (DungeonProgressionRequirementsContainer::iterator itr = _accessRequirementStore.begin(); itr != _accessRequirementStore.end(); ++itr)
6982 {
6983 std::unordered_map<uint8, DungeonProgressionRequirements*> difficulties = itr->second;
6984 for (auto difficultiesItr = difficulties.begin(); difficultiesItr != difficulties.end(); ++difficultiesItr)
6985 {
6986 for (auto questItr = difficultiesItr->second->quests.begin(); questItr != difficultiesItr->second->quests.end(); ++questItr)
6987 {
6988 delete* questItr;
6989 }
6990
6991 for (auto achievementItr = difficultiesItr->second->achievements.begin(); achievementItr != difficultiesItr->second->achievements.end(); ++achievementItr)
6992 {
6993 delete* achievementItr;
6994 }
6995
6996 for (auto itemsItr = difficultiesItr->second->items.begin(); itemsItr != difficultiesItr->second->items.end(); ++itemsItr)
6997 {
6998 delete* itemsItr;
6999 }
7000
7001 delete difficultiesItr->second;
7002 }
7003 }
7004
7005 _accessRequirementStore.clear(); // need for reload case
7006 }
7007 // 0 1 2 3 4 5
7008 QueryResult access_template_result = WorldDatabase.Query("SELECT id, map_id, difficulty, min_level, max_level, min_avg_item_level FROM dungeon_access_template");
7009 if (!access_template_result)
7010 {
7011 LOG_WARN("server.loading", ">> Loaded 0 access requirement definitions. DB table `dungeon_access_template` is empty.");
7012 LOG_INFO("server.loading", " ");
7013 return;
7014 }
7015
7016 uint32 count = 0;
7017 uint32 countProgressionRequirements = 0;
7018
7019 do
7020 {
7021 Field* fields = access_template_result->Fetch();
7022
7023 //Get the common variables for the access requirements
7024 uint8 dungeon_access_id = fields[0].Get<uint8>();
7025 uint32 mapid = fields[1].Get<uint32>();
7026 uint8 difficulty = fields[2].Get<uint8>();
7027
7028 //Set up the access requirements
7030 ar->levelMin = fields[3].Get<uint8>();
7031 ar->levelMax = fields[4].Get<uint8>();
7032 ar->reqItemLevel = fields[5].Get<uint16>();
7033
7034 // 0 1 2 3 4 6
7035 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);
7036 if (progression_requirements_results)
7037 {
7038 do
7039 {
7040 Field* progression_requirement_row = progression_requirements_results->Fetch();
7041
7042 const uint8 requirement_type = progression_requirement_row[0].Get<uint8>();
7043 const uint32 requirement_id = progression_requirement_row[1].Get<uint32>();
7044 const std::string requirement_note = progression_requirement_row[2].Get<std::string>();
7045 const uint8 requirement_faction = progression_requirement_row[3].Get<uint8>();
7046 const uint8 requirement_priority = progression_requirement_row[4].IsNull() ? UINT8_MAX : progression_requirement_row[4].Get<uint8>();
7047 const bool requirement_checkLeaderOnly = progression_requirement_row[5].Get<bool>();
7048
7049 ProgressionRequirement* progression_requirement = new ProgressionRequirement();
7050 progression_requirement->id = requirement_id;
7051 progression_requirement->note = requirement_note;
7052 progression_requirement->faction = (TeamId)requirement_faction;
7053 progression_requirement->priority = requirement_priority;
7054 progression_requirement->checkLeaderOnly = requirement_checkLeaderOnly;
7055
7056 std::vector<ProgressionRequirement*>* currentRequirementsList = nullptr;
7057
7058 switch (requirement_type)
7059 {
7060 case 0:
7061 {
7062 //Achievement
7063 if (!sAchievementStore.LookupEntry(progression_requirement->id))
7064 {
7065 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);
7066 break;
7067 }
7068
7069 currentRequirementsList = &ar->achievements;
7070 break;
7071 }
7072 case 1:
7073 {
7074 //Quest
7075 if (!GetQuestTemplate(progression_requirement->id))
7076 {
7077 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);
7078 break;
7079 }
7080
7081 currentRequirementsList = &ar->quests;
7082 break;
7083 }
7084 case 2:
7085 {
7086 //Item
7087 ItemTemplate const* pProto = GetItemTemplate(progression_requirement->id);
7088 if (!pProto)
7089 {
7090 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);
7091 break;
7092 }
7093
7094 currentRequirementsList = &ar->items;
7095 break;
7096 }
7097 default:
7098 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);
7099 break;
7100 }
7101
7102 //Check if array is valid and delete the progression requirement
7103 if (!currentRequirementsList)
7104 {
7105 delete progression_requirement;
7106 continue;
7107 }
7108
7109 //Insert into the array
7110 if (currentRequirementsList->size() > requirement_priority)
7111 {
7112 currentRequirementsList->insert(currentRequirementsList->begin() + requirement_priority, progression_requirement);
7113 }
7114 else
7115 {
7116 currentRequirementsList->push_back(progression_requirement);
7117 }
7118
7119 } while (progression_requirements_results->NextRow());
7120 }
7121
7122 //Sort all arrays for priority
7123 auto sortFunction = [](const ProgressionRequirement* const a, const ProgressionRequirement* const b) {return a->priority > b->priority; };
7124 std::sort(ar->achievements.begin(), ar->achievements.end(), sortFunction);
7125 std::sort(ar->quests.begin(), ar->quests.end(), sortFunction);
7126 std::sort(ar->items.begin(), ar->items.end(), sortFunction);
7127
7128 countProgressionRequirements += ar->achievements.size();
7129 countProgressionRequirements += ar->quests.size();
7130 countProgressionRequirements += ar->items.size();
7131 count++;
7132
7133 _accessRequirementStore[mapid][difficulty] = ar;
7134 } while (access_template_result->NextRow());
7135
7136 LOG_INFO("server.loading", ">> Loaded {} Rows From dungeon_access_template And {} Rows From dungeon_access_requirements in {} ms", count, countProgressionRequirements, GetMSTimeDiffToNow(oldMSTime));
7137 LOG_INFO("server.loading", " ");
7138}
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
#define LOG_WARN(filterType__,...)
Definition Log.h:162
TeamId
Definition SharedDefines.h:770
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:3487
Quest const * GetQuestTemplate(uint32 quest_id) const
Definition ObjectMgr.h:834
Definition Player.h:937
Definition ItemTemplate.h:619
Definition Player.h:928
uint32 priority
Definition Player.h:932

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 ( )
8925{
8926 uint32 oldMSTime = getMSTime();
8927
8928 _acoreStringStore.clear(); // for reload case
8929 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");
8930 if (!result)
8931 {
8932 LOG_WARN("server.loading", ">> Loaded 0 acore strings. DB table `acore_strings` is empty.");
8933 LOG_INFO("server.loading", " ");
8934 return false;
8935 }
8936
8937 do
8938 {
8939 Field* fields = result->Fetch();
8940
8941 uint32 entry = fields[0].Get<uint32>();
8942
8943 AcoreString& data = _acoreStringStore[entry];
8944
8945 data.Content.resize(DEFAULT_LOCALE + 1);
8946
8947 for (uint8 i = 0; i < TOTAL_LOCALES; ++i)
8948 AddLocaleString(fields[i + 1].Get<std::string>(), LocaleConstant(i), data.Content);
8949 } while (result->NextRow());
8950
8951 LOG_INFO("server.loading", ">> Loaded {} Acore Strings in {} ms", (uint32)_acoreStringStore.size(), GetMSTimeDiffToNow(oldMSTime));
8952 LOG_INFO("server.loading", " ");
8953
8954 return true;
8955}
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:382

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

◆ LoadAreaTriggers()

void ObjectMgr::LoadAreaTriggers ( )
6865{
6866 uint32 oldMSTime = getMSTime();
6867
6868 _areaTriggerStore.clear();
6869
6870 QueryResult result = WorldDatabase.Query("SELECT entry, map, x, y, z, radius, length, width, height, orientation FROM areatrigger");
6871
6872 if (!result)
6873 {
6874 LOG_WARN("server.loading", ">> Loaded 0 area trigger definitions. DB table `areatrigger` is empty.");
6875 LOG_INFO("server.loading", " ");
6876 return;
6877 }
6878
6879 uint32 count = 0;
6880
6881 do
6882 {
6883 Field* fields = result->Fetch();
6884
6885 ++count;
6886
6887 AreaTrigger at;
6888
6889 at.entry = fields[0].Get<uint32>();
6890 at.map = fields[1].Get<uint32>();
6891 at.x = fields[2].Get<float>();
6892 at.y = fields[3].Get<float>();
6893 at.z = fields[4].Get<float>();
6894 at.radius = fields[5].Get<float>();
6895 at.length = fields[6].Get<float>();
6896 at.width = fields[7].Get<float>();
6897 at.height = fields[8].Get<float>();
6898 at.orientation = fields[9].Get<float>();
6899
6900 MapEntry const* mapEntry = sMapStore.LookupEntry(at.map);
6901 if (!mapEntry)
6902 {
6903 LOG_ERROR("sql.sql", "Area trigger (ID:{}) map (ID: {}) does not exist in `Map.dbc`.", at.entry, at.map);
6904 continue;
6905 }
6906
6907 _areaTriggerStore[at.entry] = at;
6908 } while (result->NextRow());
6909
6910 LOG_INFO("server.loading", ">> Loaded {} Area Trigger Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6911 LOG_INFO("server.loading", " ");
6912}
float height
Definition ObjectMgr.h:429
float x
Definition ObjectMgr.h:423
float y
Definition ObjectMgr.h:424
float orientation
Definition ObjectMgr.h:430
float length
Definition ObjectMgr.h:427
uint32 entry
Definition ObjectMgr.h:421
float radius
Definition ObjectMgr.h:426
float z
Definition ObjectMgr.h:425
float width
Definition ObjectMgr.h:428

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

◆ LoadAreaTriggerScripts()

void ObjectMgr::LoadAreaTriggerScripts ( )
6723{
6724 uint32 oldMSTime = getMSTime();
6725
6726 _areaTriggerScriptStore.clear(); // need for reload case
6727 QueryResult result = WorldDatabase.Query("SELECT entry, ScriptName FROM areatrigger_scripts");
6728
6729 if (!result)
6730 {
6731 LOG_WARN("server.loading", ">> Loaded 0 Areatrigger Scripts. DB Table `areatrigger_scripts` Is Empty.");
6732 LOG_INFO("server.loading", " ");
6733 return;
6734 }
6735
6736 uint32 count = 0;
6737
6738 do
6739 {
6740 ++count;
6741
6742 Field* fields = result->Fetch();
6743
6744 uint32 Trigger_ID = fields[0].Get<uint32>();
6745 std::string scriptName = fields[1].Get<std::string>();
6746
6747 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6748 if (!atEntry)
6749 {
6750 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6751 continue;
6752 }
6753 _areaTriggerScriptStore[Trigger_ID] = GetScriptId(scriptName);
6754 } while (result->NextRow());
6755
6756 LOG_INFO("server.loading", ">> Loaded {} Areatrigger Scripts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6757 LOG_INFO("server.loading", " ");
6758}
uint32 GetScriptId(std::string const &name)
Definition ObjectMgr.cpp:9821

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

◆ LoadAreaTriggerTeleports()

void ObjectMgr::LoadAreaTriggerTeleports ( )
6915{
6916 uint32 oldMSTime = getMSTime();
6917
6918 _areaTriggerTeleportStore.clear(); // need for reload case
6919
6920 // 0 1 2 3 4 5
6921 QueryResult result = WorldDatabase.Query("SELECT ID, target_map, target_position_x, target_position_y, target_position_z, target_orientation FROM areatrigger_teleport");
6922
6923 if (!result)
6924 {
6925 LOG_WARN("server.loading", ">> Loaded 0 area trigger teleport definitions. DB table `areatrigger_teleport` is empty.");
6926 LOG_INFO("server.loading", " ");
6927 return;
6928 }
6929
6930 uint32 count = 0;
6931
6932 do
6933 {
6934 Field* fields = result->Fetch();
6935
6936 ++count;
6937
6938 uint32 Trigger_ID = fields[0].Get<uint32>();
6939
6941
6942 at.target_mapId = fields[1].Get<uint16>();
6943 at.target_X = fields[2].Get<float>();
6944 at.target_Y = fields[3].Get<float>();
6945 at.target_Z = fields[4].Get<float>();
6946 at.target_Orientation = fields[5].Get<float>();
6947
6948 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6949 if (!atEntry)
6950 {
6951 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6952 continue;
6953 }
6954
6955 MapEntry const* mapEntry = sMapStore.LookupEntry(at.target_mapId);
6956 if (!mapEntry)
6957 {
6958 LOG_ERROR("sql.sql", "Area trigger (ID:{}) target map (ID: {}) does not exist in `Map.dbc`.", Trigger_ID, at.target_mapId);
6959 continue;
6960 }
6961
6962 if (at.target_X == 0 && at.target_Y == 0 && at.target_Z == 0)
6963 {
6964 LOG_ERROR("sql.sql", "Area trigger (ID:{}) target coordinates not provided.", Trigger_ID);
6965 continue;
6966 }
6967
6968 _areaTriggerTeleportStore[Trigger_ID] = at;
6969 } while (result->NextRow());
6970
6971 LOG_INFO("server.loading", ">> Loaded {} Area Trigger Teleport Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6972 LOG_INFO("server.loading", " ");
6973}
Definition ObjectMgr.h:411
uint32 target_mapId
Definition ObjectMgr.h:412

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

◆ LoadBroadcastTextLocales()

void ObjectMgr::LoadBroadcastTextLocales ( )
9921{
9922 uint32 oldMSTime = getMSTime();
9923
9924 // 0 1 2 3
9925 QueryResult result = WorldDatabase.Query("SELECT ID, locale, MaleText, FemaleText FROM broadcast_text_locale");
9926
9927 if (!result)
9928 {
9929 LOG_WARN("server.loading", ">> Loaded 0 broadcast text locales. DB table `broadcast_text_locale` is empty.");
9930 LOG_INFO("server.loading", " ");
9931 return;
9932 }
9933
9934 uint32 locales_count = 0;
9935 do
9936 {
9937 Field* fields = result->Fetch();
9938
9939 uint32 id = fields[0].Get<uint32>();
9940
9941 BroadcastTextContainer::iterator bct = _broadcastTextStore.find(id);
9942 if (bct == _broadcastTextStore.end())
9943 {
9944 LOG_ERROR("sql.sql", "BroadcastText (Id: {}) found in table `broadcast_text_locale` but does not exist in `broadcast_text`. Skipped!", id);
9945 continue;
9946 }
9947
9948 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
9949 if (locale == LOCALE_enUS)
9950 continue;
9951
9952 AddLocaleString(fields[2].Get<std::string>(), locale, bct->second.MaleText);
9953 AddLocaleString(fields[3].Get<std::string>(), locale, bct->second.FemaleText);
9954 locales_count++;
9955 } while (result->NextRow());
9956
9957 LOG_INFO("server.loading", ">> Loaded {} Broadcast Text Locales in {} ms", locales_count, GetMSTimeDiffToNow(oldMSTime));
9958 LOG_INFO("server.loading", " ");
9959}
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 ( )
9836{
9837 uint32 oldMSTime = getMSTime();
9838
9839 _broadcastTextStore.clear(); // for reload case
9840
9841 // 0 1 2 3 4 5 6 7 8 9 10 11 12
9842 QueryResult result = WorldDatabase.Query("SELECT ID, LanguageID, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3, SoundEntriesID, EmotesID, Flags FROM broadcast_text");
9843 if (!result)
9844 {
9845 LOG_WARN("server.loading", ">> Loaded 0 broadcast texts. DB table `broadcast_text` is empty.");
9846 LOG_INFO("server.loading", " ");
9847 return;
9848 }
9849
9850 _broadcastTextStore.rehash(result->GetRowCount());
9851
9852 do
9853 {
9854 Field* fields = result->Fetch();
9855
9856 BroadcastText bct;
9857
9858 bct.Id = fields[0].Get<uint32>();
9859 bct.LanguageID = fields[1].Get<uint32>();
9860 bct.MaleText[DEFAULT_LOCALE] = fields[2].Get<std::string>();
9861 bct.FemaleText[DEFAULT_LOCALE] = fields[3].Get<std::string>();
9862 bct.EmoteId1 = fields[4].Get<uint32>();
9863 bct.EmoteId2 = fields[5].Get<uint32>();
9864 bct.EmoteId3 = fields[6].Get<uint32>();
9865 bct.EmoteDelay1 = fields[7].Get<uint32>();
9866 bct.EmoteDelay2 = fields[8].Get<uint32>();
9867 bct.EmoteDelay3 = fields[9].Get<uint32>();
9868 bct.SoundEntriesId = fields[10].Get<uint32>();
9869 bct.EmotesID = fields[11].Get<uint32>();
9870 bct.Flags = fields[12].Get<uint32>();
9871
9872 if (bct.SoundEntriesId)
9873 {
9874 if (!sSoundEntriesStore.LookupEntry(bct.SoundEntriesId))
9875 {
9876 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has SoundEntriesId {} but sound does not exist.", bct.Id, bct.SoundEntriesId);
9877 bct.SoundEntriesId = 0;
9878 }
9879 }
9880
9882 {
9883 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` using Language {} but Language does not exist.", bct.Id, bct.LanguageID);
9885 }
9886
9887 if (bct.EmoteId1)
9888 {
9889 if (!sEmotesStore.LookupEntry(bct.EmoteId1))
9890 {
9891 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId1 {} but emote does not exist.", bct.Id, bct.EmoteId1);
9892 bct.EmoteId1 = 0;
9893 }
9894 }
9895
9896 if (bct.EmoteId2)
9897 {
9898 if (!sEmotesStore.LookupEntry(bct.EmoteId2))
9899 {
9900 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId2 {} but emote does not exist.", bct.Id, bct.EmoteId2);
9901 bct.EmoteId2 = 0;
9902 }
9903 }
9904
9905 if (bct.EmoteId3)
9906 {
9907 if (!sEmotesStore.LookupEntry(bct.EmoteId3))
9908 {
9909 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId3 {} but emote does not exist.", bct.Id, bct.EmoteId3);
9910 bct.EmoteId3 = 0;
9911 }
9912 }
9913
9914 _broadcastTextStore[bct.Id] = bct;
9915 } while (result->NextRow());
9916
9917 LOG_INFO("server.loading", ">> Loaded {} Broadcast Texts in {} ms", _broadcastTextStore.size(), GetMSTimeDiffToNow(oldMSTime));
9918}
DBCStorage< SoundEntriesEntry > sSoundEntriesStore(SoundEntriesfmt)
DBCStorage< EmotesEntry > sEmotesStore(EmotesEntryfmt)
LanguageDesc const * GetLanguageDescByID(uint32 lang)
Definition ObjectMgr.cpp:253
@ LANG_UNIVERSAL
Definition SharedDefines.h:746
Definition ObjectMgr.h:434
uint32 EmoteDelay2
Definition ObjectMgr.h:449
uint32 Id
Definition ObjectMgr.h:441
std::vector< std::string > FemaleText
Definition ObjectMgr.h:444
uint32 EmotesID
Definition ObjectMgr.h:452
uint32 LanguageID
Definition ObjectMgr.h:442
uint32 EmoteId2
Definition ObjectMgr.h:446
uint32 EmoteDelay1
Definition ObjectMgr.h:448
uint32 SoundEntriesId
Definition ObjectMgr.h:451
std::vector< std::string > MaleText
Definition ObjectMgr.h:443
uint32 EmoteId3
Definition ObjectMgr.h:447
uint32 EmoteId1
Definition ObjectMgr.h:445
uint32 EmoteDelay3
Definition ObjectMgr.h:450
uint32 Flags
Definition ObjectMgr.h:453

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

◆ LoadCreatureAddons()

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

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 ( )
9988{
9989 uint32 oldMSTime = getMSTime();
9990
9991 QueryResult result = WorldDatabase.Query("SELECT level, class, basehp0, basehp1, basehp2, basemana, basearmor, attackpower, rangedattackpower, damage_base, damage_exp1, damage_exp2 FROM creature_classlevelstats");
9992
9993 if (!result)
9994 {
9995 LOG_WARN("server.loading", ">> Loaded 0 creature base stats. DB table `creature_classlevelstats` is empty.");
9996 LOG_INFO("server.loading", " ");
9997 return;
9998 }
9999
10000 uint32 count = 0;
10001 do
10002 {
10003 Field* fields = result->Fetch();
10004
10005 uint8 Level = fields[0].Get<uint8>();
10006 uint8 Class = fields[1].Get<uint8>();
10007
10008 if (!Class || ((1 << (Class - 1)) & CLASSMASK_ALL_CREATURES) == 0)
10009 LOG_ERROR("sql.sql", "Creature base stats for level {} has invalid class {}", Level, Class);
10010
10011 CreatureBaseStats stats;
10012
10013 for (uint8 i = 0; i < MAX_EXPANSIONS; ++i)
10014 {
10015 stats.BaseHealth[i] = fields[2 + i].Get<uint32>();
10016
10017 if (stats.BaseHealth[i] == 0)
10018 {
10019 LOG_ERROR("sql.sql", "Creature base stats for class {}, level {} has invalid zero base HP[{}] - set to 1", Class, Level, i);
10020 stats.BaseHealth[i] = 1;
10021 }
10022
10023 // xinef: if no data is available, get them from lower expansions
10024 if (stats.BaseHealth[i] <= 1)
10025 {
10026 for (uint8 j = i; j > 0;)
10027 {
10028 --j;
10029 if (stats.BaseHealth[j] > 1)
10030 {
10031 stats.BaseHealth[i] = stats.BaseHealth[j];
10032 break;
10033 }
10034 }
10035 }
10036
10037 stats.BaseDamage[i] = fields[9 + i].Get<float>();
10038 if (stats.BaseDamage[i] < 0.0f)
10039 {
10040 LOG_ERROR("sql.sql", "Creature base stats for class {}, level {} has invalid negative base damage[{}] - set to 0.0", Class, Level, i);
10041 stats.BaseDamage[i] = 0.0f;
10042 }
10043 }
10044
10045 stats.BaseMana = fields[5].Get<uint32>();
10046 stats.BaseArmor = fields[6].Get<uint32>();
10047
10048 stats.AttackPower = fields[7].Get<uint32>();
10049 stats.RangedAttackPower = fields[8].Get<uint32>();
10050
10052
10053 ++count;
10054 } while (result->NextRow());
10055
10057 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
10058 {
10059 for (uint16 lvl = itr->second.minlevel; lvl <= itr->second.maxlevel; ++lvl)
10060 {
10061 if (_creatureBaseStatsStore.find(MAKE_PAIR16(lvl, itr->second.unit_class)) == _creatureBaseStatsStore.end())
10062 LOG_ERROR("sql.sql", "Missing base stats for creature class {} level {}", itr->second.unit_class, lvl);
10063 }
10064 }
10065
10066 LOG_INFO("server.loading", ">> Loaded {} Creature Base Stats in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10067 LOG_INFO("server.loading", " ");
10068}
std::unordered_map< uint32, CreatureTemplate > CreatureTemplateContainer
Definition CreatureData.h:292
@ 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:769
uint32 BaseMana
Definition CreatureData.h:305
float BaseDamage[MAX_EXPANSIONS]
Definition CreatureData.h:309
uint32 RangedAttackPower
Definition CreatureData.h:308
uint32 AttackPower
Definition CreatureData.h:307
uint32 BaseHealth[MAX_EXPANSIONS]
Definition CreatureData.h:304
float BaseArmor
Definition CreatureData.h:306

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

◆ LoadCreatureCustomIDs()

void ObjectMgr::LoadCreatureCustomIDs ( )

Load config option Creatures.CustomIDs into Store.

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

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

◆ LoadCreatureLocales()

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

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

◆ LoadCreatureModelInfo()

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

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

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

◆ LoadCreatureQuestEnders()

void ObjectMgr::LoadCreatureQuestEnders ( )
8360{
8361 LoadQuestRelationsHelper(_creatureQuestInvolvedRelations, "creature_questender", false, false);
8362
8363 for (QuestRelations::iterator itr = _creatureQuestInvolvedRelations.begin(); itr != _creatureQuestInvolvedRelations.end(); ++itr)
8364 {
8365 CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
8366 if (!cInfo)
8367 LOG_ERROR("sql.sql", "Table `creature_questender` have data for not existed creature entry ({}) and existed quest {}", itr->first, itr->second);
8368 else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
8369 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);
8370 }
8371}
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:320
void LoadQuestRelationsHelper(QuestRelations &map, std::string const &table, bool starter, bool go)
Definition ObjectMgr.cpp:8272

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadCreatureQuestItems()

void ObjectMgr::LoadCreatureQuestItems ( )
10389{
10390 uint32 oldMSTime = getMSTime();
10391
10392 // 0 1 2
10393 QueryResult result = WorldDatabase.Query("SELECT CreatureEntry, ItemId, Idx FROM creature_questitem ORDER BY Idx ASC");
10394
10395 if (!result)
10396 {
10397 LOG_WARN("server.loading", ">> Loaded 0 creature quest items. DB table `creature_questitem` is empty.");
10398 return;
10399 }
10400
10401 uint32 count = 0;
10402 do
10403 {
10404 Field* fields = result->Fetch();
10405
10406 uint32 entry = fields[0].Get<uint32>();
10407 uint32 item = fields[1].Get<uint32>();
10408 uint32 idx = fields[2].Get<uint32>();
10409
10410 CreatureTemplate const* creatureInfo = GetCreatureTemplate(entry);
10411 if (!creatureInfo)
10412 {
10413 LOG_ERROR("sql.sql", "Table `creature_questitem` has data for nonexistent creature (entry: {}, idx: {}), skipped", entry, idx);
10414 continue;
10415 };
10416
10417 ItemEntry const* dbcData = sItemStore.LookupEntry(item);
10418 if (!dbcData)
10419 {
10420 LOG_ERROR("sql.sql", "Table `creature_questitem` has nonexistent item (ID: {}) in creature (entry: {}, idx: {}), skipped", item, entry, idx);
10421 continue;
10422 };
10423
10424 _creatureQuestItemStore[entry].push_back(item);
10425
10426 ++count;
10427 } while (result->NextRow());
10428
10429 LOG_INFO("server.loading", ">> Loaded {} Creature Quest Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10430 LOG_INFO("server.loading", " ");
10431}
DBCStorage< ItemEntry > sItemStore(Itemfmt)
Definition DBCStructure.h:1141

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

◆ LoadCreatureQuestStarters()

void ObjectMgr::LoadCreatureQuestStarters ( )
8346{
8347 LoadQuestRelationsHelper(_creatureQuestRelations, "creature_queststarter", true, false);
8348
8349 for (QuestRelations::iterator itr = _creatureQuestRelations.begin(); itr != _creatureQuestRelations.end(); ++itr)
8350 {
8351 CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
8352 if (!cInfo)
8353 LOG_ERROR("sql.sql", "Table `creature_queststarter` have data for not existed creature entry ({}) and existed quest {}", itr->first, itr->second);
8354 else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
8355 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);
8356 }
8357}

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadCreatures()

void ObjectMgr::LoadCreatures ( )
2254{
2255 uint32 oldMSTime = getMSTime();
2256
2257 // 0 1 2 3 4 5 6 7 8 9 10 11
2258 QueryResult result = WorldDatabase.Query("SELECT creature.guid, id1, id2, id3, map, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, wander_distance, "
2259 // 12 13 14 15 16 17 18 19 20 21 22
2260 "currentwaypoint, curhealth, curmana, MovementType, spawnMask, phaseMask, eventEntry, pool_entry, creature.npcflag, creature.unit_flags, creature.dynamicflags, "
2261 // 23
2262 "creature.ScriptName "
2263 "FROM creature "
2264 "LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid "
2265 "LEFT OUTER JOIN pool_creature ON creature.guid = pool_creature.guid");
2266
2267 if (!result)
2268 {
2269 LOG_WARN("server.loading", ">> Loaded 0 creatures. DB table `creature` is empty.");
2270 LOG_INFO("server.loading", " ");
2271 return;
2272 }
2273
2275 LOG_INFO("server.loading", "Calculating zone and area fields. This may take a moment...");
2276
2277 // Build single time for check spawnmask
2278 std::map<uint32, uint32> spawnMasks;
2279 for (uint32 i = 0; i < sMapStore.GetNumRows(); ++i)
2280 if (sMapStore.LookupEntry(i))
2281 for (int k = 0; k < MAX_DIFFICULTY; ++k)
2283 spawnMasks[i] |= (1 << k);
2284
2285 _creatureDataStore.rehash(result->GetRowCount());
2286 uint32 count = 0;
2287 do
2288 {
2289 Field* fields = result->Fetch();
2290
2291 ObjectGuid::LowType spawnId = fields[0].Get<uint32>();
2292 uint32 id1 = fields[1].Get<uint32>();
2293 uint32 id2 = fields[2].Get<uint32>();
2294 uint32 id3 = fields[3].Get<uint32>();
2295
2296 CreatureTemplate const* cInfo = GetCreatureTemplate(id1);
2297 if (!cInfo)
2298 {
2299 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with non existing creature entry {} in id1 field, skipped.", spawnId, id1);
2300 continue;
2301 }
2302 CreatureTemplate const* cInfo2 = GetCreatureTemplate(id2);
2303 if (!cInfo2 && id2)
2304 {
2305 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with non existing creature entry {} in id2 field, skipped.", spawnId, id2);
2306 continue;
2307 }
2308 CreatureTemplate const* cInfo3 = GetCreatureTemplate(id3);
2309 if (!cInfo3 && id3)
2310 {
2311 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with non existing creature entry {} in id3 field, skipped.", spawnId, id3);
2312 continue;
2313 }
2314 if (!id2 && id3)
2315 {
2316 LOG_ERROR("sql.sql", "Table `creature` has creature (SpawnId: {}) with creature entry {} in id3 field but no entry in id2 field, skipped.", spawnId, id3);
2317 continue;
2318 }
2319 CreatureData& data = _creatureDataStore[spawnId];
2320 data.id1 = id1;
2321 data.id2 = id2;
2322 data.id3 = id3;
2323 data.mapid = fields[4].Get<uint16>();
2324 data.equipmentId = fields[5].Get<int8>();
2325 data.posX = fields[6].Get<float>();
2326 data.posY = fields[7].Get<float>();
2327 data.posZ = fields[8].Get<float>();
2328 data.orientation = fields[9].Get<float>();
2329 data.spawntimesecs = fields[10].Get<uint32>();
2330 data.wander_distance = fields[11].Get<float>();
2331 data.currentwaypoint = fields[12].Get<uint32>();
2332 data.curhealth = fields[13].Get<uint32>();
2333 data.curmana = fields[14].Get<uint32>();
2334 data.movementType = fields[15].Get<uint8>();
2335 data.spawnMask = fields[16].Get<uint8>();
2336 data.phaseMask = fields[17].Get<uint32>();
2337 int16 gameEvent = fields[18].Get<int16>();
2338 uint32 PoolId = fields[19].Get<uint32>();
2339 data.npcflag = fields[20].Get<uint32>();
2340 data.unit_flags = fields[21].Get<uint32>();
2341 data.dynamicflags = fields[22].Get<uint32>();
2342 data.ScriptId = GetScriptId(fields[23].Get<std::string>());
2343
2344 if (!data.ScriptId)
2345 data.ScriptId = cInfo->ScriptID;
2346
2347 MapEntry const* mapEntry = sMapStore.LookupEntry(data.mapid);
2348 if (!mapEntry)
2349 {
2350 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that spawned at not existed map (Id: {}), skipped.", spawnId, data.mapid);
2351 continue;
2352 }
2353
2354 // pussywizard: 7 days means no reaspawn, so set it to 14 days, because manual id reset may be late
2355 if (mapEntry->IsRaid() && data.spawntimesecs >= 7 * DAY && data.spawntimesecs < 14 * DAY)
2356 data.spawntimesecs = 14 * DAY;
2357
2358 // Skip spawnMask check for transport maps
2359 if (!_transportMaps.count(data.mapid) && data.spawnMask & ~spawnMasks[data.mapid])
2360 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that have wrong spawn mask {} including not supported difficulty modes for map (Id: {}).",
2361 spawnId, data.spawnMask, data.mapid);
2362
2363 bool ok = true;
2364 for (uint32 diff = 0; diff < MAX_DIFFICULTY - 1 && ok; ++diff)
2365 {
2366 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()))
2367 {
2368 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that listed as difficulty {} template (Entries: {}, {}, {}) in `creature_template`, skipped.",
2369 spawnId, diff + 1, data.id1, data.id2, data.id3);
2370 ok = false;
2371 }
2372 }
2373 if (!ok)
2374 continue;
2375
2376 // -1 random, 0 no equipment,
2377 if (data.equipmentId != 0)
2378 {
2379 if ((!GetEquipmentInfo(data.id1, data.equipmentId)) || (data.id2 && !GetEquipmentInfo(data.id2, data.equipmentId)) || (data.id3 && !GetEquipmentInfo(data.id3, data.equipmentId)))
2380 {
2381 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.",
2382 data.id1, data.id2, data.id3, data.equipmentId);
2383 data.equipmentId = 0;
2384 }
2385 }
2387 {
2388 if (!mapEntry->IsDungeon())
2389 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.",
2390 spawnId, data.id1, data.id2, data.id3);
2391 }
2392 if (data.movementType >= MAX_DB_MOTION_TYPE)
2393 {
2394 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);
2396 }
2397 if (data.wander_distance < 0.0f)
2398 {
2399 LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {} Entries: {}, {}, {}) with `wander_distance`< 0, set to 0.", spawnId, data.id1, data.id2, data.id3);
2400 data.wander_distance = 0.0f;
2401 }
2402 else if (data.movementType == RANDOM_MOTION_TYPE)
2403 {
2404 if (data.wander_distance == 0.0f)
2405 {
2406 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).",
2407 spawnId, data.id1, data.id2, data.id3);
2409 }
2410 }
2411 else if (data.movementType == IDLE_MOTION_TYPE)
2412 {
2413 if (data.wander_distance != 0.0f)
2414 {
2415 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);
2416 data.wander_distance = 0.0f;
2417 }
2418 }
2419
2420 if (data.phaseMask == 0)
2421 {
2422 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);
2423 data.phaseMask = 1;
2424 }
2425
2427 {
2428 uint32 zoneId = sMapMgr->GetZoneId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
2429 uint32 areaId = sMapMgr->GetAreaId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
2430
2432
2433 stmt->SetData(0, zoneId);
2434 stmt->SetData(1, areaId);
2435 stmt->SetData(2, spawnId);
2436
2437 WorldDatabase.Execute(stmt);
2438 }
2439
2440 // Add to grid if not managed by the game event or pool system
2441 if (gameEvent == 0 && PoolId == 0)
2442 AddCreatureToGrid(spawnId, &data);
2443
2444 ++count;
2445 } while (result->NextRow());
2446
2447 LOG_INFO("server.loading", ">> Loaded {} Creatures in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2448 LOG_INFO("server.loading", " ");
2449}
constexpr auto DAY
Definition Common.h:49
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition CreatureData.h:45
Difficulty
Definition DBCEnums.h:266
MapDifficulty const * GetMapDifficultyData(uint32 mapId, Difficulty difficulty)
Definition DBCStores.cpp:761
std::int8_t int8
Definition Define.h:105
std::int16_t int16
Definition Define.h:104
@ RANDOM_MOTION_TYPE
Definition MotionMaster.h:40
@ CONFIG_CALCULATE_CREATURE_ZONE_AREA_DATA
Definition WorldConfig.h:112
@ WORLD_UPD_CREATURE_ZONE_AREA_DATA
Definition WorldDatabase.h:115
EquipmentInfo const * GetEquipmentInfo(uint32 entry, int8 &id)
Definition ObjectMgr.cpp:1471
uint32 ScriptId
Definition CreatureData.h:393
bool HasFlagsExtra(uint32 flag) const
Definition CreatureData.h:283
bool IsRaid() const
Definition DBCStructure.h:1355

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, CreatureData::mapid, MAX_DB_MOTION_TYPE, MAX_DIFFICULTY, CreatureData::movementType, CreatureData::npcflag, CreatureData::orientation, CreatureData::phaseMask, CreatureData::posX, CreatureData::posY, CreatureData::posZ, RANDOM_MOTION_TYPE, CreatureData::ScriptId, PreparedStatementBase::SetData(), sMapMgr, sMapStore, CreatureData::spawnMask, CreatureData::spawntimesecs, sWorld, CreatureData::unit_flags, CreatureData::wander_distance, WORLD_UPD_CREATURE_ZONE_AREA_DATA, and WorldDatabase.

◆ LoadCreatureSparring()

void ObjectMgr::LoadCreatureSparring ( )
2452{
2453 uint32 oldMSTime = getMSTime();
2454
2455 QueryResult result = WorldDatabase.Query("SELECT GUID, SparringPCT FROM creature_sparring");
2456
2457 if (!result)
2458 {
2459 LOG_WARN("server.loading", ">> Loaded 0 sparring data. DB table `creature_sparring` is empty.");
2460 LOG_INFO("server.loading", " ");
2461 return;
2462 }
2463
2464 uint32 count = 0;
2465 do
2466 {
2467 Field* fields = result->Fetch();
2468
2469 ObjectGuid::LowType spawnId = fields[0].Get<uint32>();
2470 float sparringHealthPct = fields[1].Get<float>();
2471
2472 if (!GetCreatureData(spawnId))
2473 {
2474 LOG_ERROR("sql.sql", "Entry {} has a record in `creature_sparring` but doesn't exist in `creatures` table");
2475 continue;
2476 }
2477
2478 _creatureSparringStore[spawnId].push_back(sparringHealthPct);
2479
2480 ++count;
2481 } while (result->NextRow());
2482
2483 LOG_INFO("server.loading", ">> Loaded {} sparring data in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2484 LOG_INFO("server.loading", " ");
2485}

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

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

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplateAddons()

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

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

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

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplateResistances()

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

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

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplates()

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

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

◆ LoadCreatureTemplateSpells()

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

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

Referenced by LoadCreatureTemplates().

◆ LoadEquipmentTemplates()

void ObjectMgr::LoadEquipmentTemplates ( )
1498{
1499 uint32 oldMSTime = getMSTime();
1500
1501 // 0 1 2 3 4
1502 QueryResult result = WorldDatabase.Query("SELECT CreatureID, ID, ItemID1, ItemID2, ItemID3 FROM creature_equip_template");
1503
1504 if (!result)
1505 {
1506 LOG_WARN("server.loading", ">> Loaded 0 creature equipment templates. DB table `creature_equip_template` is empty!");
1507 LOG_INFO("server.loading", " ");
1508 return;
1509 }
1510
1511 uint32 count = 0;
1512 do
1513 {
1514 Field* fields = result->Fetch();
1515
1516 uint32 entry = fields[0].Get<uint32>();
1517
1518 if (!GetCreatureTemplate(entry))
1519 {
1520 LOG_ERROR("sql.sql", "Creature template (CreatureID: {}) does not exist but has a record in `creature_equip_template`", entry);
1521 continue;
1522 }
1523
1524 uint8 id = fields[1].Get<uint8>();
1525 if (!id)
1526 {
1527 LOG_ERROR("sql.sql", "Creature equipment template with id 0 found for creature {}, skipped.", entry);
1528 continue;
1529 }
1530
1531 EquipmentInfo& equipmentInfo = _equipmentInfoStore[entry][id];
1532
1533 equipmentInfo.ItemEntry[0] = fields[2].Get<uint32>();
1534 equipmentInfo.ItemEntry[1] = fields[3].Get<uint32>();
1535 equipmentInfo.ItemEntry[2] = fields[4].Get<uint32>();
1536
1537 for (uint8 i = 0; i < MAX_EQUIPMENT_ITEMS; ++i)
1538 {
1539 if (!equipmentInfo.ItemEntry[i])
1540 continue;
1541
1542 ItemEntry const* dbcItem = sItemStore.LookupEntry(equipmentInfo.ItemEntry[i]);
1543
1544 if (!dbcItem)
1545 {
1546 LOG_ERROR("sql.sql", "Unknown item (ID={}) in creature_equip_template.ItemID{} for CreatureID = {} and ID = {}, forced to 0.",
1547 equipmentInfo.ItemEntry[i], i + 1, entry, id);
1548 equipmentInfo.ItemEntry[i] = 0;
1549 continue;
1550 }
1551
1552 if (dbcItem->InventoryType != INVTYPE_WEAPON &&
1553 dbcItem->InventoryType != INVTYPE_SHIELD &&
1554 dbcItem->InventoryType != INVTYPE_RANGED &&
1555 dbcItem->InventoryType != INVTYPE_2HWEAPON &&
1558 dbcItem->InventoryType != INVTYPE_HOLDABLE &&
1559 dbcItem->InventoryType != INVTYPE_THROWN &&
1561 {
1562 LOG_ERROR("sql.sql", "Item (ID={}) in creature_equip_template.ItemID{} for CreatureID = {} and ID = {} is not equipable in a hand, forced to 0.",
1563 equipmentInfo.ItemEntry[i], i + 1, entry, id);
1564 equipmentInfo.ItemEntry[i] = 0;
1565 }
1566 }
1567
1568 ++count;
1569 } while (result->NextRow());
1570
1571 LOG_INFO("server.loading", ">> Loaded {} Equipment Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1572 LOG_INFO("server.loading", " ");
1573}
#define MAX_EQUIPMENT_ITEMS
Definition CreatureData.h:35
@ 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:1148

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 ( )
5771{
5773
5774 std::set<uint32> evt_scripts;
5775 // Load all possible script entries from gameobjects
5777 for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
5778 if (uint32 eventId = itr->second.GetEventScriptId())
5779 evt_scripts.insert(eventId);
5780
5781 // Load all possible script entries from spells
5782 for (uint32 i = 1; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
5783 if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(i))
5784 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
5785 if (spell->Effects[j].Effect == SPELL_EFFECT_SEND_EVENT)
5786 if (spell->Effects[j].MiscValue)
5787 evt_scripts.insert(spell->Effects[j].MiscValue);
5788
5789 for (std::size_t path_idx = 0; path_idx < sTaxiPathNodesByPath.size(); ++path_idx)
5790 {
5791 for (std::size_t node_idx = 0; node_idx < sTaxiPathNodesByPath[path_idx].size(); ++node_idx)
5792 {
5793 TaxiPathNodeEntry const* node = sTaxiPathNodesByPath[path_idx][node_idx];
5794
5795 if (node->arrivalEventID)
5796 evt_scripts.insert(node->arrivalEventID);
5797
5798 if (node->departureEventID)
5799 evt_scripts.insert(node->departureEventID);
5800 }
5801 }
5802
5803 // Then check if all scripts are in above list of possible script entries
5804 for (ScriptMapMap::const_iterator itr = sEventScripts.begin(); itr != sEventScripts.end(); ++itr)
5805 {
5806 std::set<uint32>::const_iterator itr2 = evt_scripts.find(itr->first);
5807 if (itr2 == evt_scripts.end())
5808 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 {}",
5809 itr->first, SPELL_EFFECT_SEND_EVENT);
5810 }
5811}
TaxiPathNodesByPath sTaxiPathNodesByPath
Definition DBCStores.cpp:187
std::unordered_map< uint32, GameObjectTemplate > GameObjectTemplateContainer
Definition GameObject.h:42
ScriptMapMap sEventScripts
Definition ObjectMgr.cpp:60
@ SCRIPTS_EVENT
Definition ObjectMgr.h:149
@ SPELL_EFFECT_SEND_EVENT
Definition SharedDefines.h:850
GameObjectTemplateContainer const * GetGameObjectTemplates() const
Definition ObjectMgr.h:761
void LoadScripts(ScriptsType type)
Definition ObjectMgr.cpp:5428
Definition DBCStructure.h:1974
uint32 arrivalEventID
Definition DBCStructure.h:1984
uint32 departureEventID
Definition DBCStructure.h:1985

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 ( )
7652{
7653 uint32 oldMSTime = getMSTime();
7654
7655 QueryResult result = WorldDatabase.Query("SELECT level, basexp FROM exploration_basexp");
7656
7657 if (!result)
7658 {
7659 LOG_WARN("server.loading", ">> Loaded 0 BaseXP definitions. DB table `exploration_basexp` is empty.");
7660 LOG_INFO("server.loading", " ");
7661 return;
7662 }
7663
7664 uint32 count = 0;
7665
7666 do
7667 {
7668 Field* fields = result->Fetch();
7669 uint8 level = fields[0].Get<uint8>();
7670 uint32 basexp = fields[1].Get<int32>();
7671 _baseXPTable[level] = basexp;
7672 ++count;
7673 } while (result->NextRow());
7674
7675 LOG_INFO("server.loading", ">> Loaded {} BaseXP Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7676 LOG_INFO("server.loading", " ");
7677}
std::int32_t int32
Definition Define.h:103

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

◆ LoadFactionChangeAchievements()

void ObjectMgr::LoadFactionChangeAchievements ( )
10071{
10072 uint32 oldMSTime = getMSTime();
10073
10074 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_achievement");
10075
10076 if (!result)
10077 {
10078 LOG_WARN("server.loading", ">> Loaded 0 faction change achievement pairs. DB table `player_factionchange_achievement` is empty.");
10079 LOG_INFO("server.loading", " ");
10080 return;
10081 }
10082
10083 uint32 count = 0;
10084
10085 do
10086 {
10087 Field* fields = result->Fetch();
10088
10089 uint32 alliance = fields[0].Get<uint32>();
10090 uint32 horde = fields[1].Get<uint32>();
10091
10092 if (!sAchievementStore.LookupEntry(alliance))
10093 LOG_ERROR("sql.sql", "Achievement {} (alliance_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", alliance);
10094 else if (!sAchievementStore.LookupEntry(horde))
10095 LOG_ERROR("sql.sql", "Achievement {} (horde_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", horde);
10096 else
10097 FactionChangeAchievements[alliance] = horde;
10098
10099 ++count;
10100 } while (result->NextRow());
10101
10102 LOG_INFO("server.loading", ">> Loaded {} faction change achievement pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10103 LOG_INFO("server.loading", " ");
10104}
CharacterConversionMap FactionChangeAchievements
Definition ObjectMgr.h:1432

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

◆ LoadFactionChangeItems()

void ObjectMgr::LoadFactionChangeItems ( )
10107{
10108 uint32 oldMSTime = getMSTime();
10109
10110 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_items");
10111
10112 if (!result)
10113 {
10114 LOG_WARN("server.loading", ">> Loaded 0 faction change item pairs. DB table `player_factionchange_items` is empty.");
10115 LOG_INFO("server.loading", " ");
10116 return;
10117 }
10118
10119 uint32 count = 0;
10120
10121 do
10122 {
10123 Field* fields = result->Fetch();
10124
10125 uint32 alliance = fields[0].Get<uint32>();
10126 uint32 horde = fields[1].Get<uint32>();
10127
10128 if (!GetItemTemplate(alliance))
10129 LOG_ERROR("sql.sql", "Item {} (alliance_id) referenced in `player_factionchange_items` does not exist, pair skipped!", alliance);
10130 else if (!GetItemTemplate(horde))
10131 LOG_ERROR("sql.sql", "Item {} (horde_id) referenced in `player_factionchange_items` does not exist, pair skipped!", horde);
10132 else
10133 FactionChangeItems[alliance] = horde;
10134
10135 ++count;
10136 } while (result->NextRow());
10137
10138 LOG_INFO("server.loading", ">> Loaded {} faction change item pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10139 LOG_INFO("server.loading", " ");
10140}
CharacterConversionMap FactionChangeItems
Definition ObjectMgr.h:1433

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

◆ LoadFactionChangeQuests()

void ObjectMgr::LoadFactionChangeQuests ( )
10143{
10144 uint32 oldMSTime = getMSTime();
10145
10146 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_quests");
10147
10148 if (!result)
10149 {
10150 LOG_WARN("server.loading", ">> Loaded 0 faction change quest pairs. DB table `player_factionchange_quests` is empty.");
10151 LOG_INFO("server.loading", " ");
10152 return;
10153 }
10154
10155 uint32 count = 0;
10156
10157 do
10158 {
10159 Field* fields = result->Fetch();
10160
10161 uint32 alliance = fields[0].Get<uint32>();
10162 uint32 horde = fields[1].Get<uint32>();
10163
10164 if (!GetQuestTemplate(alliance))
10165 LOG_ERROR("sql.sql", "Quest {} (alliance_id) referenced in `player_factionchange_quests` does not exist, pair skipped!", alliance);
10166 else if (!GetQuestTemplate(horde))
10167 LOG_ERROR("sql.sql", "Quest {} (horde_id) referenced in `player_factionchange_quests` does not exist, pair skipped!", horde);
10168 else
10169 FactionChangeQuests[alliance] = horde;
10170
10171 ++count;
10172 } while (result->NextRow());
10173
10174 LOG_INFO("server.loading", ">> Loaded {} faction change quest pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10175 LOG_INFO("server.loading", " ");
10176}
CharacterConversionMap FactionChangeQuests
Definition ObjectMgr.h:1434

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

◆ LoadFactionChangeReputations()

void ObjectMgr::LoadFactionChangeReputations ( )
10179{
10180 uint32 oldMSTime = getMSTime();
10181
10182 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_reputations");
10183
10184 if (!result)
10185 {
10186 LOG_WARN("server.loading", ">> Loaded 0 faction change reputation pairs. DB table `player_factionchange_reputations` is empty.");
10187 LOG_INFO("server.loading", " ");
10188 return;
10189 }
10190
10191 uint32 count = 0;
10192
10193 do
10194 {
10195 Field* fields = result->Fetch();
10196
10197 uint32 alliance = fields[0].Get<uint32>();
10198 uint32 horde = fields[1].Get<uint32>();
10199
10200 if (!sFactionStore.LookupEntry(alliance))
10201 LOG_ERROR("sql.sql", "Reputation {} (alliance_id) referenced in `player_factionchange_reputations` does not exist, pair skipped!", alliance);
10202 else if (!sFactionStore.LookupEntry(horde))
10203 LOG_ERROR("sql.sql", "Reputation {} (horde_id) referenced in `player_factionchange_reputations` does not exist, pair skipped!", horde);
10204 else
10205 FactionChangeReputation[alliance] = horde;
10206
10207 ++count;
10208 } while (result->NextRow());
10209
10210 LOG_INFO("server.loading", ">> Loaded {} faction change reputation pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10211 LOG_INFO("server.loading", " ");
10212}
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
CharacterConversionMap FactionChangeReputation
Definition ObjectMgr.h:1435

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

◆ LoadFactionChangeSpells()

void ObjectMgr::LoadFactionChangeSpells ( )
10215{
10216 uint32 oldMSTime = getMSTime();
10217
10218 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_spells");
10219
10220 if (!result)
10221 {
10222 LOG_WARN("server.loading", ">> Loaded 0 faction change spell pairs. DB table `player_factionchange_spells` is empty.");
10223 LOG_INFO("server.loading", " ");
10224 return;
10225 }
10226
10227 uint32 count = 0;
10228
10229 do
10230 {
10231 Field* fields = result->Fetch();
10232
10233 uint32 alliance = fields[0].Get<uint32>();
10234 uint32 horde = fields[1].Get<uint32>();
10235
10236 if (!sSpellMgr->GetSpellInfo(alliance))
10237 LOG_ERROR("sql.sql", "Spell {} (alliance_id) referenced in `player_factionchange_spells` does not exist, pair skipped!", alliance);
10238 else if (!sSpellMgr->GetSpellInfo(horde))
10239 LOG_ERROR("sql.sql", "Spell {} (horde_id) referenced in `player_factionchange_spells` does not exist, pair skipped!", horde);
10240 else
10241 FactionChangeSpells[alliance] = horde;
10242
10243 ++count;
10244 } while (result->NextRow());
10245
10246 LOG_INFO("server.loading", ">> Loaded {} faction change spell pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10247 LOG_INFO("server.loading", " ");
10248}
CharacterConversionMap FactionChangeSpells
Definition ObjectMgr.h:1436

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

◆ LoadFactionChangeTitles()

void ObjectMgr::LoadFactionChangeTitles ( )
10251{
10252 uint32 oldMSTime = getMSTime();
10253
10254 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_titles");
10255
10256 if (!result)
10257 {
10258 LOG_WARN("server.loading", ">> Loaded 0 faction change title pairs. DB table `player_factionchange_title` is empty.");
10259 return;
10260 }
10261
10262 uint32 count = 0;
10263
10264 do
10265 {
10266 Field* fields = result->Fetch();
10267
10268 uint32 alliance = fields[0].Get<uint32>();
10269 uint32 horde = fields[1].Get<uint32>();
10270
10271 if (!sCharTitlesStore.LookupEntry(alliance))
10272 LOG_ERROR("sql.sql", "Title {} (alliance_id) referenced in `player_factionchange_title` does not exist, pair skipped!", alliance);
10273 else if (!sCharTitlesStore.LookupEntry(horde))
10274 LOG_ERROR("sql.sql", "Title {} (horde_id) referenced in `player_factionchange_title` does not exist, pair skipped!", horde);
10275 else
10276 FactionChangeTitles[alliance] = horde;
10277
10278 ++count;
10279 } while (result->NextRow());
10280
10281 LOG_INFO("server.loading", ">> Loaded {} faction change title pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10282 LOG_INFO("server.loading", " ");
10283}
DBCStorage< CharTitlesEntry > sCharTitlesStore(CharTitlesEntryfmt)
CharacterConversionMap FactionChangeTitles
Definition ObjectMgr.h:1437

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

◆ LoadFishingBaseSkillLevel()

void ObjectMgr::LoadFishingBaseSkillLevel ( )
8974{
8975 uint32 oldMSTime = getMSTime();
8976
8977 _fishingBaseForAreaStore.clear(); // for reload case
8978
8979 QueryResult result = WorldDatabase.Query("SELECT entry, skill FROM skill_fishing_base_level");
8980
8981 if (!result)
8982 {
8983 LOG_WARN("server.loading", ">> Loaded 0 areas for fishing base skill level. DB table `skill_fishing_base_level` is empty.");
8984 LOG_INFO("server.loading", " ");
8985 return;
8986 }
8987
8988 uint32 count = 0;
8989
8990 do
8991 {
8992 Field* fields = result->Fetch();
8993 uint32 entry = fields[0].Get<uint32>();
8994 int32 skill = fields[1].Get<int16>();
8995
8996 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
8997 if (!fArea)
8998 {
8999 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
9000 continue;
9001 }
9002
9003 _fishingBaseForAreaStore[entry] = skill;
9004 ++count;
9005 } while (result->NextRow());
9006
9007 LOG_INFO("server.loading", ">> Loaded {} areas for fishing base skill level in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9008 LOG_INFO("server.loading", " ");
9009}

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

◆ LoadGameObjectAddons()

void ObjectMgr::LoadGameObjectAddons ( )
1388{
1389 uint32 oldMSTime = getMSTime();
1390
1391 // 0 1 2
1392 QueryResult result = WorldDatabase.Query("SELECT guid, invisibilityType, invisibilityValue FROM gameobject_addon");
1393
1394 if (!result)
1395 {
1396 LOG_WARN("server.loading", ">> Loaded 0 gameobject addon definitions. DB table `gameobject_addon` is empty.");
1397 LOG_INFO("server.loading", " ");
1398 return;
1399 }
1400
1401 uint32 count = 0;
1402 do
1403 {
1404 Field* fields = result->Fetch();
1405
1406 ObjectGuid::LowType guid = fields[0].Get<uint32>();
1407
1408 const GameObjectData* goData = GetGameObjectData(guid);
1409 if (!goData)
1410 {
1411 LOG_ERROR("sql.sql", "GameObject (GUID: {}) does not exist but has a record in `gameobject_addon`", guid);
1412 continue;
1413 }
1414
1415 GameObjectAddon& gameObjectAddon = _gameObjectAddonStore[guid];
1416 gameObjectAddon.invisibilityType = InvisibilityType(fields[1].Get<uint8>());
1417 gameObjectAddon.InvisibilityValue = fields[2].Get<uint32>();
1418
1419 if (gameObjectAddon.invisibilityType >= TOTAL_INVISIBILITY_TYPES)
1420 {
1421 LOG_ERROR("sql.sql", "GameObject (GUID: {}) has invalid InvisibilityType in `gameobject_addon`", guid);
1422 gameObjectAddon.invisibilityType = INVISIBILITY_GENERAL;
1423 gameObjectAddon.InvisibilityValue = 0;
1424 }
1425
1426 if (gameObjectAddon.invisibilityType && !gameObjectAddon.InvisibilityValue)
1427 {
1428 LOG_ERROR("sql.sql", "GameObject (GUID: {}) has InvisibilityType set but has no InvisibilityValue in `gameobject_addon`, set to 1", guid);
1429 gameObjectAddon.InvisibilityValue = 1;
1430 }
1431
1432 ++count;
1433 } while (result->NextRow());
1434
1435 LOG_INFO("server.loading", ">> Loaded {} Gameobject Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1436 LOG_INFO("server.loading", " ");
1437}
InvisibilityType
Definition SharedDefines.h:1265
@ TOTAL_INVISIBILITY_TYPES
Definition SharedDefines.h:1279
@ INVISIBILITY_GENERAL
Definition SharedDefines.h:1266
Definition GameObjectData.h:683
uint32 InvisibilityValue
Definition GameObjectData.h:685
InvisibilityType invisibilityType
Definition GameObjectData.h:684

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

◆ LoadGameObjectForQuests()

void ObjectMgr::LoadGameObjectForQuests ( )
8760{
8761 uint32 oldMSTime = getMSTime();
8762
8763 if (GetGameObjectTemplates()->empty())
8764 {
8765 LOG_WARN("server.loading", ">> Loaded 0 GameObjects for quests");
8766 LOG_INFO("server.loading", " ");
8767 return;
8768 }
8769
8770 uint32 count = 0;
8771
8772 // collect GO entries for GO that must activated
8774 for (GameObjectTemplateContainer::iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
8775 {
8776 itr->second.IsForQuests = false;
8777 switch (itr->second.type)
8778 {
8780 itr->second.IsForQuests = true;
8781 ++count;
8782 break;
8784 {
8785 // scan GO chest with loot including quest items
8786 uint32 loot_id = (itr->second.GetLootId());
8787
8788 // find quest loot for GO
8789 if (itr->second.chest.questId || LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
8790 {
8791 itr->second.IsForQuests = true;
8792 ++count;
8793 }
8794 break;
8795 }
8797 {
8798 if (itr->second._generic.questID > 0) //quests objects
8799 {
8800 itr->second.IsForQuests = true;
8801 ++count;
8802 }
8803 break;
8804 }
8806 {
8807 if (itr->second.spellFocus.questID > 0) //quests objects
8808 {
8809 itr->second.IsForQuests = true;
8810 ++count;
8811 }
8812 break;
8813 }
8815 {
8816 if (itr->second.goober.questId > 0) //quests objects
8817 {
8818 itr->second.IsForQuests = true;
8819 ++count;
8820 }
8821 break;
8822 }
8823 default:
8824 break;
8825 }
8826 }
8827
8828 LOG_INFO("server.loading", ">> Loaded {} GameObjects for quests in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8829 LOG_INFO("server.loading", " ");
8830}
LootStore LootTemplates_Gameobject("gameobject_loot_template", "gameobject entry", true)
@ GAMEOBJECT_TYPE_SPELL_FOCUS
Definition SharedDefines.h:1579
@ GAMEOBJECT_TYPE_GENERIC
Definition SharedDefines.h:1576
@ GAMEOBJECT_TYPE_CHEST
Definition SharedDefines.h:1574
@ GAMEOBJECT_TYPE_QUESTGIVER
Definition SharedDefines.h:1573
@ GAMEOBJECT_TYPE_GOOBER
Definition SharedDefines.h:1581
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 ( )
7296{
7297 uint32 oldMSTime = getMSTime();
7298
7299 _gameObjectLocaleStore.clear(); // need for reload case
7300
7301 // 0 1 2 3
7302 QueryResult result = WorldDatabase.Query("SELECT entry, locale, name, castBarCaption FROM gameobject_template_locale");
7303 if (!result)
7304 return;
7305
7306 do
7307 {
7308 Field* fields = result->Fetch();
7309
7310 uint32 ID = fields[0].Get<uint32>();
7311
7312 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
7313 if (locale == LOCALE_enUS)
7314 continue;
7315
7317 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
7318 AddLocaleString(fields[3].Get<std::string>(), locale, data.CastBarCaption);
7319 } while (result->NextRow());
7320
7321 LOG_INFO("server.loading", ">> Loaded {} Gameobject Locale Strings in {} ms", (uint32)_gameObjectLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
7322}
Definition GameObjectData.h:676
std::vector< std::string > Name
Definition GameObjectData.h:677
std::vector< std::string > CastBarCaption
Definition GameObjectData.h:678

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

◆ LoadGameobjectQuestEnders()

void ObjectMgr::LoadGameobjectQuestEnders ( )
8332{
8333 LoadQuestRelationsHelper(_goQuestInvolvedRelations, "gameobject_questender", false, true);
8334
8335 for (QuestRelations::iterator itr = _goQuestInvolvedRelations.begin(); itr != _goQuestInvolvedRelations.end(); ++itr)
8336 {
8337 GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
8338 if (!goInfo)
8339 LOG_ERROR("sql.sql", "Table `gameobject_questender` have data for not existed gameobject entry ({}) and existed quest {}", itr->first, itr->second);
8340 else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
8341 LOG_ERROR("sql.sql", "Table `gameobject_questender` have data gameobject entry ({}) for quest {}, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
8342 }
8343}

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameObjectQuestItems()

void ObjectMgr::LoadGameObjectQuestItems ( )
10344{
10345 uint32 oldMSTime = getMSTime();
10346
10347 // 0 1 2
10348 QueryResult result = WorldDatabase.Query("SELECT GameObjectEntry, ItemId, Idx FROM gameobject_questitem ORDER BY Idx ASC");
10349
10350 if (!result)
10351 {
10352 LOG_WARN("server.loading", ">> Loaded 0 gameobject quest items. DB table `gameobject_questitem` is empty.");
10353 return;
10354 }
10355
10356 uint32 count = 0;
10357 do
10358 {
10359 Field* fields = result->Fetch();
10360
10361 uint32 entry = fields[0].Get<uint32>();
10362 uint32 item = fields[1].Get<uint32>();
10363 uint32 idx = fields[2].Get<uint32>();
10364
10365 GameObjectTemplate const* goInfo = GetGameObjectTemplate(entry);
10366 if (!goInfo)
10367 {
10368 LOG_ERROR("sql.sql", "Table `gameobject_questitem` has data for nonexistent gameobject (entry: {}, idx: {}), skipped", entry, idx);
10369 continue;
10370 };
10371
10372 ItemEntry const* dbcData = sItemStore.LookupEntry(item);
10373 if (!dbcData)
10374 {
10375 LOG_ERROR("sql.sql", "Table `gameobject_questitem` has nonexistent item (ID: {}) in gameobject (entry: {}, idx: {}), skipped", item, entry, idx);
10376 continue;
10377 };
10378
10379 _gameObjectQuestItemStore[entry].push_back(item);
10380
10381 ++count;
10382 } while (result->NextRow());
10383
10384 LOG_INFO("server.loading", ">> Loaded {} Gameobject Quest Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10385 LOG_INFO("server.loading", " ");
10386}

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

◆ LoadGameobjectQuestStarters()

void ObjectMgr::LoadGameobjectQuestStarters ( )
8318{
8319 LoadQuestRelationsHelper(_goQuestRelations, "gameobject_queststarter", true, true);
8320
8321 for (QuestRelations::iterator itr = _goQuestRelations.begin(); itr != _goQuestRelations.end(); ++itr)
8322 {
8323 GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
8324 if (!goInfo)
8325 LOG_ERROR("sql.sql", "Table `gameobject_queststarter` have data for not existed gameobject entry ({}) and existed quest {}", itr->first, itr->second);
8326 else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
8327 LOG_ERROR("sql.sql", "Table `gameobject_queststarter` have data gameobject entry ({}) for quest {}, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
8328 }
8329}

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameobjects()

void ObjectMgr::LoadGameobjects ( )
2622{
2623 uint32 oldMSTime = getMSTime();
2624
2625 // 0 1 2 3 4 5 6
2626 QueryResult result = WorldDatabase.Query("SELECT gameobject.guid, id, map, position_x, position_y, position_z, orientation, "
2627 // 7 8 9 10 11 12 13 14 15 16 17
2628 "rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state, spawnMask, phaseMask, eventEntry, pool_entry, "
2629 // 18
2630 "ScriptName "
2631 "FROM gameobject LEFT OUTER JOIN game_event_gameobject ON gameobject.guid = game_event_gameobject.guid "
2632 "LEFT OUTER JOIN pool_gameobject ON gameobject.guid = pool_gameobject.guid");
2633
2634 if (!result)
2635 {
2636 LOG_WARN("server.loading", ">> Loaded 0 gameobjects. DB table `gameobject` is empty.");
2637 LOG_INFO("server.loading", " ");
2638 return;
2639 }
2640
2642 LOG_INFO("server.loading", "Calculating zone and area fields. This may take a moment...");
2643
2644 // build single time for check spawnmask
2645 std::map<uint32, uint32> spawnMasks;
2646 for (uint32 i = 0; i < sMapStore.GetNumRows(); ++i)
2647 if (sMapStore.LookupEntry(i))
2648 for (int k = 0; k < MAX_DIFFICULTY; ++k)
2650 spawnMasks[i] |= (1 << k);
2651
2652 _gameObjectDataStore.rehash(result->GetRowCount());
2653 do
2654 {
2655 Field* fields = result->Fetch();
2656
2657 ObjectGuid::LowType guid = fields[0].Get<uint32>();
2658 uint32 entry = fields[1].Get<uint32>();
2659
2660 GameObjectTemplate const* gInfo = GetGameObjectTemplate(entry);
2661 if (!gInfo)
2662 {
2663 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {}) with non existing gameobject entry {}, skipped.", guid, entry);
2664 continue;
2665 }
2666
2667 if (!gInfo->displayId)
2668 {
2669 switch (gInfo->type)
2670 {
2673 break;
2674 default:
2675 LOG_ERROR("sql.sql", "Gameobject (GUID: {} Entry {} GoType: {}) doesn't have a displayId ({}), not loaded.", guid, entry, gInfo->type, gInfo->displayId);
2676 break;
2677 }
2678 }
2679
2680 if (gInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(gInfo->displayId))
2681 {
2682 LOG_ERROR("sql.sql", "Gameobject (GUID: {} Entry {} GoType: {}) has an invalid displayId ({}), not loaded.", guid, entry, gInfo->type, gInfo->displayId);
2683 continue;
2684 }
2685
2687
2688 data.id = entry;
2689 data.mapid = fields[2].Get<uint16>();
2690 data.posX = fields[3].Get<float>();
2691 data.posY = fields[4].Get<float>();
2692 data.posZ = fields[5].Get<float>();
2693 data.orientation = fields[6].Get<float>();
2694 data.rotation.x = fields[7].Get<float>();
2695 data.rotation.y = fields[8].Get<float>();
2696 data.rotation.z = fields[9].Get<float>();
2697 data.rotation.w = fields[10].Get<float>();
2698 data.spawntimesecs = fields[11].Get<int32>();
2699 data.ScriptId = GetScriptId(fields[18].Get<std::string>());
2700 if (!data.ScriptId)
2701 data.ScriptId = gInfo->ScriptId;
2702
2703 MapEntry const* mapEntry = sMapStore.LookupEntry(data.mapid);
2704 if (!mapEntry)
2705 {
2706 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) spawned on a non-existed map (Id: {}), skip", guid, data.id, data.mapid);
2707 continue;
2708 }
2709
2710 if (data.spawntimesecs == 0 && gInfo->IsDespawnAtAction())
2711 {
2712 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);
2713 }
2714
2715 data.animprogress = fields[12].Get<uint8>();
2716 data.artKit = 0;
2717
2718 uint32 go_state = fields[13].Get<uint8>();
2719 if (go_state >= MAX_GO_STATE)
2720 {
2721 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid `state` ({}) value, skip", guid, data.id, go_state);
2722 continue;
2723 }
2724 data.go_state = GOState(go_state);
2725
2726 data.spawnMask = fields[14].Get<uint8>();
2727
2728 if (!_transportMaps.count(data.mapid) && data.spawnMask & ~spawnMasks[data.mapid])
2729 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);
2730
2731 data.phaseMask = fields[15].Get<uint32>();
2732 int16 gameEvent = fields[16].Get<int16>();
2733 uint32 PoolId = fields[17].Get<uint32>();
2734
2735 if (data.rotation.x < -1.0f || data.rotation.x > 1.0f)
2736 {
2737 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationX ({}) value, skip", guid, data.id, data.rotation.x);
2738 continue;
2739 }
2740
2741 if (data.rotation.y < -1.0f || data.rotation.y > 1.0f)
2742 {
2743 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationY ({}) value, skip", guid, data.id, data.rotation.y);
2744 continue;
2745 }
2746
2747 if (data.rotation.z < -1.0f || data.rotation.z > 1.0f)
2748 {
2749 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationZ ({}) value, skip", guid, data.id, data.rotation.z);
2750 continue;
2751 }
2752
2753 if (data.rotation.w < -1.0f || data.rotation.w > 1.0f)
2754 {
2755 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationW ({}) value, skip", guid, data.id, data.rotation.w);
2756 continue;
2757 }
2758
2759 if (!MapMgr::IsValidMapCoord(data.mapid, data.posX, data.posY, data.posZ, data.orientation))
2760 {
2761 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid coordinates, skip", guid, data.id);
2762 continue;
2763 }
2764
2765 if (data.phaseMask == 0)
2766 {
2767 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with `phaseMask`=0 (not visible for anyone), set to 1.", guid, data.id);
2768 data.phaseMask = 1;
2769 }
2770
2772 {
2773 uint32 zoneId = sMapMgr->GetZoneId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
2774 uint32 areaId = sMapMgr->GetAreaId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
2775
2777
2778 stmt->SetData(0, zoneId);
2779 stmt->SetData(1, areaId);
2780 stmt->SetData(2, guid);
2781
2782 WorldDatabase.Execute(stmt);
2783 }
2784
2785 if (gameEvent == 0 && PoolId == 0) // if not this is to be managed by GameEvent System or Pool system
2786 AddGameobjectToGrid(guid, &data);
2787 } while (result->NextRow());
2788
2789 LOG_INFO("server.loading", ">> Loaded {} Gameobjects in {} ms", (unsigned long)_gameObjectDataStore.size(), GetMSTimeDiffToNow(oldMSTime));
2790 LOG_INFO("server.loading", " ");
2791}
DBCStorage< GameObjectDisplayInfoEntry > sGameObjectDisplayInfoStore(GameObjectDisplayInfofmt)
#define MAX_GO_STATE
Definition GameObjectData.h:27
GOState
Definition GameObjectData.h:690
@ GAMEOBJECT_TYPE_TRAP
Definition SharedDefines.h:1577
@ CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA
Definition WorldConfig.h:113
@ WORLD_UPD_GAMEOBJECT_ZONE_AREA_DATA
Definition WorldDatabase.h:116
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition MapMgr.h:90
uint32 ScriptId
Definition GameObjectData.h:709

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

◆ LoadGameObjectTemplate()

void ObjectMgr::LoadGameObjectTemplate ( )
7384{
7385 uint32 oldMSTime = getMSTime();
7386
7387 // 0 1 2 3 4 5 6 7
7388 QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, size, "
7389 // 8 9 10 11 12 13 14 15 16 17 18 19 20
7390 "Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, "
7391 // 21 22 23 24 25 26 27 28 29 30 31 32 33
7392 "Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, AIName, ScriptName "
7393 "FROM gameobject_template");
7394
7395 if (!result)
7396 {
7397 LOG_WARN("server.loading", ">> Loaded 0 gameobject definitions. DB table `gameobject_template` is empty.");
7398 LOG_INFO("server.loading", " ");
7399 return;
7400 }
7401
7402 _gameObjectTemplateStore.rehash(result->GetRowCount());
7403 uint32 count = 0;
7404 do
7405 {
7406 Field* fields = result->Fetch();
7407
7408 uint32 entry = fields[0].Get<uint32>();
7409
7411
7412 got.entry = entry;
7413 got.type = uint32(fields[1].Get<uint8>());
7414 got.displayId = fields[2].Get<uint32>();
7415 got.name = fields[3].Get<std::string>();
7416 got.IconName = fields[4].Get<std::string>();
7417 got.castBarCaption = fields[5].Get<std::string>();
7418 got.unk1 = fields[6].Get<std::string>();
7419 got.size = fields[7].Get<float>();
7420
7421 for (uint8 i = 0; i < MAX_GAMEOBJECT_DATA; ++i)
7422 got.raw.data[i] = fields[8 + i].Get<int32>(); // data1 and data6 can be -1
7423
7424 got.AIName = fields[32].Get<std::string>();
7425 got.ScriptId = GetScriptId(fields[33].Get<std::string>());
7426 got.IsForQuests = false;
7427
7428 // Checks
7429 if (!got.AIName.empty() && !sGameObjectAIRegistry->HasItem(got.AIName))
7430 {
7431 LOG_ERROR("sql.sql", "GameObject (Entry: {}) has non-registered `AIName` '{}' set, removing", got.entry, got.AIName);
7432 }
7433
7434 switch (got.type)
7435 {
7436 case GAMEOBJECT_TYPE_DOOR: //0
7437 {
7438 if (got.door.lockId)
7439 CheckGOLockId(&got, got.door.lockId, 1);
7440 CheckGONoDamageImmuneId(&got, got.door.noDamageImmune, 3);
7441 break;
7442 }
7443 case GAMEOBJECT_TYPE_BUTTON: //1
7444 {
7445 if (got.button.lockId)
7446 CheckGOLockId(&got, got.button.lockId, 1);
7447 CheckGONoDamageImmuneId(&got, got.button.noDamageImmune, 4);
7448 break;
7449 }
7451 {
7452 if (got.questgiver.lockId)
7453 CheckGOLockId(&got, got.questgiver.lockId, 0);
7454 CheckGONoDamageImmuneId(&got, got.questgiver.noDamageImmune, 5);
7455 break;
7456 }
7457 case GAMEOBJECT_TYPE_CHEST: //3
7458 {
7459 if (got.chest.lockId)
7460 CheckGOLockId(&got, got.chest.lockId, 0);
7461
7462 CheckGOConsumable(&got, got.chest.consumable, 3);
7463
7464 if (got.chest.linkedTrapId) // linked trap
7465 CheckGOLinkedTrapId(&got, got.chest.linkedTrapId, 7);
7466 break;
7467 }
7468 case GAMEOBJECT_TYPE_TRAP: //6
7469 {
7470 if (got.trap.lockId)
7471 CheckGOLockId(&got, got.trap.lockId, 0);
7472 break;
7473 }
7474 case GAMEOBJECT_TYPE_CHAIR: //7
7475 CheckAndFixGOChairHeightId(&got, got.chair.height, 1);
7476 break;
7478 {
7479 if (got.spellFocus.focusId)
7480 {
7481 if (!sSpellFocusObjectStore.LookupEntry(got.spellFocus.focusId))
7482 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data0={} but SpellFocus (Id: {}) not exist.",
7483 entry, got.type, got.spellFocus.focusId, got.spellFocus.focusId);
7484 }
7485
7486 if (got.spellFocus.linkedTrapId) // linked trap
7487 CheckGOLinkedTrapId(&got, got.spellFocus.linkedTrapId, 2);
7488 break;
7489 }
7490 case GAMEOBJECT_TYPE_GOOBER: //10
7491 {
7492 if (got.goober.lockId)
7493 CheckGOLockId(&got, got.goober.lockId, 0);
7494
7495 CheckGOConsumable(&got, got.goober.consumable, 3);
7496
7497 if (got.goober.pageId) // pageId
7498 {
7499 if (!GetPageText(got.goober.pageId))
7500 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data7={} but PageText (Entry {}) not exist.",
7501 entry, got.type, got.goober.pageId, got.goober.pageId);
7502 }
7503 CheckGONoDamageImmuneId(&got, got.goober.noDamageImmune, 11);
7504 if (got.goober.linkedTrapId) // linked trap
7505 CheckGOLinkedTrapId(&got, got.goober.linkedTrapId, 12);
7506 break;
7507 }
7509 {
7510 if (got.areadamage.lockId)
7511 CheckGOLockId(&got, got.areadamage.lockId, 0);
7512 break;
7513 }
7514 case GAMEOBJECT_TYPE_CAMERA: //13
7515 {
7516 if (got.camera.lockId)
7517 CheckGOLockId(&got, got.camera.lockId, 0);
7518 break;
7519 }
7521 {
7522 if (got.moTransport.taxiPathId)
7523 {
7524 if (got.moTransport.taxiPathId >= sTaxiPathNodesByPath.size() || sTaxiPathNodesByPath[got.moTransport.taxiPathId].empty())
7525 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data0={} but TaxiPath (Id: {}) not exist.",
7526 entry, got.type, got.moTransport.taxiPathId, got.moTransport.taxiPathId);
7527 }
7528 if (uint32 transportMap = got.moTransport.mapID)
7529 _transportMaps.insert(transportMap);
7530 break;
7531 }
7533 break;
7535 {
7536 // always must have spell
7537 CheckGOSpellId(&got, got.spellcaster.spellId, 0);
7538 break;
7539 }
7540 case GAMEOBJECT_TYPE_FLAGSTAND: //24
7541 {
7542 if (got.flagstand.lockId)
7543 CheckGOLockId(&got, got.flagstand.lockId, 0);
7544 CheckGONoDamageImmuneId(&got, got.flagstand.noDamageImmune, 5);
7545 break;
7546 }
7548 {
7549 if (got.fishinghole.lockId)
7550 CheckGOLockId(&got, got.fishinghole.lockId, 4);
7551 break;
7552 }
7553 case GAMEOBJECT_TYPE_FLAGDROP: //26
7554 {
7555 if (got.flagdrop.lockId)
7556 CheckGOLockId(&got, got.flagdrop.lockId, 0);
7557 CheckGONoDamageImmuneId(&got, got.flagdrop.noDamageImmune, 3);
7558 break;
7559 }
7561 CheckAndFixGOChairHeightId(&got, got.barberChair.chairheight, 0);
7562 break;
7563 }
7564
7565 ++count;
7566 } while (result->NextRow());
7567
7568 LOG_INFO("server.loading", ">> Loaded {} Game Object Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7569 LOG_INFO("server.loading", " ");
7570}
DBCStorage< SpellFocusObjectEntry > sSpellFocusObjectStore(SpellFocusObjectfmt)
#define sGameObjectAIRegistry
Definition GameObjectAIFactory.h:49
void CheckGONoDamageImmuneId(GameObjectTemplate *goTemplate, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7364
void CheckGOSpellId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7343
void CheckAndFixGOChairHeightId(GameObjectTemplate const *goInfo, uint32 const &dataN, uint32 N)
Definition ObjectMgr.cpp:7352
void CheckGOConsumable(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7373
void CheckGOLinkedTrapId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7333
void CheckGOLockId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7324
@ GAMEOBJECT_TYPE_CAMERA
Definition SharedDefines.h:1584
@ GAMEOBJECT_TYPE_BUTTON
Definition SharedDefines.h:1572
@ GAMEOBJECT_TYPE_MO_TRANSPORT
Definition SharedDefines.h:1586
@ GAMEOBJECT_TYPE_SUMMONING_RITUAL
Definition SharedDefines.h:1589
@ GAMEOBJECT_TYPE_FISHINGHOLE
Definition SharedDefines.h:1596
@ GAMEOBJECT_TYPE_FLAGDROP
Definition SharedDefines.h:1597
@ GAMEOBJECT_TYPE_SPELLCASTER
Definition SharedDefines.h:1593
@ GAMEOBJECT_TYPE_FLAGSTAND
Definition SharedDefines.h:1595
@ GAMEOBJECT_TYPE_CHAIR
Definition SharedDefines.h:1578
@ GAMEOBJECT_TYPE_AREADAMAGE
Definition SharedDefines.h:1583
@ GAMEOBJECT_TYPE_BARBER_CHAIR
Definition SharedDefines.h:1603
@ GAMEOBJECT_TYPE_DOOR
Definition SharedDefines.h:1571
#define MAX_GAMEOBJECT_DATA
Definition SharedDefines.h:1610
PageText const * GetPageText(uint32 pageEntry)
Definition ObjectMgr.cpp:6012
uint32 entry
Definition GameObjectData.h:32

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 ( )
7573{
7574 uint32 oldMSTime = getMSTime();
7575
7576 // 0 1 2 3 4 5 6 7 8
7577 QueryResult result = WorldDatabase.Query("SELECT entry, faction, flags, mingold, maxgold, artkit0, artkit1, artkit2, artkit3 FROM gameobject_template_addon");
7578
7579 if (!result)
7580 {
7581 LOG_WARN("server.loading", ">> Loaded 0 gameobject template addon definitions. DB table `gameobject_template_addon` is empty.");
7582 LOG_INFO("server.loading", " ");
7583 return;
7584 }
7585
7586 uint32 count = 0;
7587 do
7588 {
7589 Field* fields = result->Fetch();
7590
7591 uint32 entry = fields[0].Get<uint32>();
7592
7593 GameObjectTemplate const* got = GetGameObjectTemplate(entry);
7594 if (!got)
7595 {
7596 LOG_ERROR("sql.sql",
7597 "GameObject template (Entry: {}) does not exist but has a record in `gameobject_template_addon`",
7598 entry);
7599 continue;
7600 }
7601
7603 gameObjectAddon.faction = uint32(fields[1].Get<uint16>());
7604 gameObjectAddon.flags = fields[2].Get<uint32>();
7605 gameObjectAddon.mingold = fields[3].Get<uint32>();
7606 gameObjectAddon.maxgold = fields[4].Get<uint32>();
7607
7608 for (uint32 i = 0; i < gameObjectAddon.artKits.size(); i++)
7609 {
7610 uint32 artKitID = fields[5 + i].Get<uint32>();
7611 if (!artKitID)
7612 continue;
7613
7614 if (!sGameObjectArtKitStore.LookupEntry(artKitID))
7615 {
7616 LOG_ERROR("sql.sql", "GameObject (Entry: {}) has invalid `artkit{}` {} defined, set to zero instead.", entry, i, artKitID);
7617 continue;
7618 }
7619
7620 gameObjectAddon.artKits[i] = artKitID;
7621 }
7622
7623 // checks
7624 if (gameObjectAddon.faction && !sFactionTemplateStore.LookupEntry(gameObjectAddon.faction))
7625 LOG_ERROR("sql.sql",
7626 "GameObject (Entry: {}) has invalid faction ({}) defined in `gameobject_template_addon`.",
7627 entry, gameObjectAddon.faction);
7628
7629 if (gameObjectAddon.maxgold > 0)
7630 {
7631 switch (got->type)
7632 {
7635 break;
7636 default:
7637 LOG_ERROR("sql.sql",
7638 "GameObject (Entry {} GoType: {}) cannot be looted but has maxgold set in `gameobject_template_addon`.",
7639 entry, got->type);
7640 break;
7641 }
7642 }
7643
7644 ++count;
7645 } while (result->NextRow());
7646
7647 LOG_INFO("server.loading", ">> Loaded {} Game Object Template Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7648 LOG_INFO("server.loading", " ");
7649}
DBCStorage< GameObjectArtKitEntry > sGameObjectArtKitStore(GameObjectArtKitfmt)
Definition GameObjectData.h:666
uint32 mingold
Definition GameObjectData.h:670
uint32 flags
Definition GameObjectData.h:669
uint32 faction
Definition GameObjectData.h:668
std::array< uint32, 4 > artKits
Definition GameObjectData.h:672
uint32 maxgold
Definition GameObjectData.h:671

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 ( )
9114{
9115 uint32 oldMSTime = getMSTime();
9116
9117 _gameTeleStore.clear(); // for reload case
9118
9119 // 0 1 2 3 4 5 6
9120 QueryResult result = WorldDatabase.Query("SELECT id, position_x, position_y, position_z, orientation, map, name FROM game_tele");
9121
9122 if (!result)
9123 {
9124 LOG_WARN("server.loading", ">> Loaded 0 GameTeleports. DB table `game_tele` is empty!");
9125 LOG_INFO("server.loading", " ");
9126 return;
9127 }
9128
9129 uint32 count = 0;
9130
9131 do
9132 {
9133 Field* fields = result->Fetch();
9134
9135 uint32 id = fields[0].Get<uint32>();
9136
9137 GameTele gt;
9138
9139 gt.position_x = fields[1].Get<float>();
9140 gt.position_y = fields[2].Get<float>();
9141 gt.position_z = fields[3].Get<float>();
9142 gt.orientation = fields[4].Get<float>();
9143 gt.mapId = fields[5].Get<uint16>();
9144 gt.name = fields[6].Get<std::string>();
9145
9146 if (!MapMgr::IsValidMapCoord(gt.mapId, gt.position_x, gt.position_y, gt.position_z, gt.orientation))
9147 {
9148 LOG_ERROR("sql.sql", "Wrong position for id {} (name: {}) in `game_tele` table, ignoring.", id, gt.name);
9149 continue;
9150 }
9151
9152 if (!Utf8toWStr(gt.name, gt.wnameLow))
9153 {
9154 LOG_ERROR("sql.sql", "Wrong UTF8 name for id {} in `game_tele` table, ignoring.", id);
9155 continue;
9156 }
9157
9158 wstrToLower(gt.wnameLow);
9159
9160 _gameTeleStore[id] = gt;
9161
9162 ++count;
9163 } while (result->NextRow());
9164
9165 LOG_INFO("server.loading", ">> Loaded {} GameTeleports in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9166 LOG_INFO("server.loading", " ");
9167}
float position_x
Definition ObjectMgr.h:133

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

◆ LoadGossipMenu()

void ObjectMgr::LoadGossipMenu ( )
9530{
9531 uint32 oldMSTime = getMSTime();
9532
9533 _gossipMenusStore.clear();
9534
9535 QueryResult result = WorldDatabase.Query("SELECT MenuID, TextID FROM gossip_menu");
9536
9537 if (!result)
9538 {
9539 LOG_WARN("server.loading", ">> Loaded 0 gossip_menu entries. DB table `gossip_menu` is empty!");
9540 LOG_INFO("server.loading", " ");
9541 return;
9542 }
9543
9544 do
9545 {
9546 Field* fields = result->Fetch();
9547
9548 GossipMenus gMenu;
9549
9550 gMenu.MenuID = fields[0].Get<uint32>();
9551 gMenu.TextID = fields[1].Get<uint32>();
9552
9553 if (!GetGossipText(gMenu.TextID))
9554 {
9555 LOG_ERROR("sql.sql", "Table gossip_menu entry {} are using non-existing TextID {}", gMenu.MenuID, gMenu.TextID);
9556 continue;
9557 }
9558
9559 _gossipMenusStore.insert(GossipMenusContainer::value_type(gMenu.MenuID, gMenu));
9560 } while (result->NextRow());
9561
9562 LOG_INFO("server.loading", ">> Loaded {} gossip_menu entries in {} ms", (uint32)_gossipMenusStore.size(), GetMSTimeDiffToNow(oldMSTime));
9563 LOG_INFO("server.loading", " ");
9564}
GossipText const * GetGossipText(uint32 Text_ID) const
Definition ObjectMgr.cpp:6190
Definition ObjectMgr.h:624
uint32 TextID
Definition ObjectMgr.h:626
uint32 MenuID
Definition ObjectMgr.h:625

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

◆ LoadGossipMenuItems()

void ObjectMgr::LoadGossipMenuItems ( )
9567{
9568 uint32 oldMSTime = getMSTime();
9569
9570 _gossipMenuItemsStore.clear();
9571
9572 QueryResult result = WorldDatabase.Query(
9573 // 0 1 2 3 4 5 6 7 8 9 10 11 12
9574 "SELECT MenuID, OptionID, OptionIcon, OptionText, OptionBroadcastTextID, OptionType, OptionNpcFlag, ActionMenuID, ActionPoiID, BoxCoded, BoxMoney, BoxText, BoxBroadcastTextID "
9575 "FROM gossip_menu_option ORDER BY MenuID, OptionID");
9576
9577 if (!result)
9578 {
9579 LOG_WARN("server.loading", ">> Loaded 0 gossip_menu_option IDs. DB table `gossip_menu_option` is empty!");
9580 LOG_INFO("server.loading", " ");
9581 return;
9582 }
9583
9584 do
9585 {
9586 Field* fields = result->Fetch();
9587
9588 GossipMenuItems gMenuItem;
9589
9590 gMenuItem.MenuID = fields[0].Get<uint32>();
9591 gMenuItem.OptionID = fields[1].Get<uint16>();
9592 gMenuItem.OptionIcon = fields[2].Get<uint32>();
9593 gMenuItem.OptionText = fields[3].Get<std::string>();
9594 gMenuItem.OptionBroadcastTextID = fields[4].Get<uint32>();
9595 gMenuItem.OptionType = fields[5].Get<uint8>();
9596 gMenuItem.OptionNpcFlag = fields[6].Get<uint32>();
9597 gMenuItem.ActionMenuID = fields[7].Get<uint32>();
9598 gMenuItem.ActionPoiID = fields[8].Get<uint32>();
9599 gMenuItem.BoxCoded = fields[9].Get<bool>();
9600 gMenuItem.BoxMoney = fields[10].Get<uint32>();
9601 gMenuItem.BoxText = fields[11].Get<std::string>();
9602 gMenuItem.BoxBroadcastTextID = fields[12].Get<uint32>();
9603
9604 if (gMenuItem.OptionIcon >= GOSSIP_ICON_MAX)
9605 {
9606 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);
9607 gMenuItem.OptionIcon = GOSSIP_ICON_CHAT;
9608 }
9609
9611 {
9612 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has non-existing or incompatible OptionBroadcastTextID {}, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.OptionBroadcastTextID);
9613 gMenuItem.OptionBroadcastTextID = 0;
9614 }
9615
9616 if (gMenuItem.OptionType >= GOSSIP_OPTION_MAX)
9617 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);
9618
9619 if (gMenuItem.ActionPoiID && !GetPointOfInterest(gMenuItem.ActionPoiID))
9620 {
9621 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} use non-existing ActionPoiID {}, ignoring", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.ActionPoiID);
9622 gMenuItem.ActionPoiID = 0;
9623 }
9624
9625 if (gMenuItem.BoxBroadcastTextID && !GetBroadcastText(gMenuItem.BoxBroadcastTextID))
9626 {
9627 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has non-existing or incompatible BoxBroadcastTextID {}, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.BoxBroadcastTextID);
9628 gMenuItem.BoxBroadcastTextID = 0;
9629 }
9630
9631 _gossipMenuItemsStore.insert(GossipMenuItemsContainer::value_type(gMenuItem.MenuID, gMenuItem));
9632 } while (result->NextRow());
9633
9634 LOG_INFO("server.loading", ">> Loaded {} gossip_menu_option entries in {} ms", uint32(_gossipMenuItemsStore.size()), GetMSTimeDiffToNow(oldMSTime));
9635 LOG_INFO("server.loading", " ");
9636}
@ GOSSIP_ICON_CHAT
Definition GossipDef.h:61
@ GOSSIP_ICON_MAX
Definition GossipDef.h:82
@ GOSSIP_OPTION_MAX
Definition GossipDef.h:56
PointOfInterest const * GetPointOfInterest(uint32 id) const
Definition ObjectMgr.h:928
BroadcastText const * GetBroadcastText(uint32 id) const
Definition ObjectMgr.h:1199
Definition ObjectMgr.h:606
uint8 OptionIcon
Definition ObjectMgr.h:609
uint32 BoxBroadcastTextID
Definition ObjectMgr.h:620
std::string OptionText
Definition ObjectMgr.h:610
uint32 ActionMenuID
Definition ObjectMgr.h:614
bool BoxCoded
Definition ObjectMgr.h:616
uint32 MenuID
Definition ObjectMgr.h:607
uint32 OptionNpcFlag
Definition ObjectMgr.h:613
uint32 ActionPoiID
Definition ObjectMgr.h:615
uint32 BoxMoney
Definition ObjectMgr.h:617
std::string BoxText
Definition ObjectMgr.h:618
uint32 OptionID
Definition ObjectMgr.h:608
uint32 OptionType
Definition ObjectMgr.h:612
uint32 OptionBroadcastTextID
Definition ObjectMgr.h:611

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

◆ LoadGossipMenuItemsLocales()

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

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

◆ LoadGossipText()

void ObjectMgr::LoadGossipText ( )
6199{
6200 uint32 oldMSTime = getMSTime();
6201
6202 QueryResult result = WorldDatabase.Query("SELECT ID, "
6203 "text0_0, text0_1, BroadcastTextID0, lang0, Probability0, em0_0, em0_1, em0_2, em0_3, em0_4, em0_5, "
6204 "text1_0, text1_1, BroadcastTextID1, lang1, Probability1, em1_0, em1_1, em1_2, em1_3, em1_4, em1_5, "
6205 "text2_0, text2_1, BroadcastTextID2, lang2, Probability2, em2_0, em2_1, em2_2, em2_3, em2_4, em2_5, "
6206 "text3_0, text3_1, BroadcastTextID3, lang3, Probability3, em3_0, em3_1, em3_2, em3_3, em3_4, em3_5, "
6207 "text4_0, text4_1, BroadcastTextID4, lang4, Probability4, em4_0, em4_1, em4_2, em4_3, em4_4, em4_5, "
6208 "text5_0, text5_1, BroadcastTextID5, lang5, Probability5, em5_0, em5_1, em5_2, em5_3, em5_4, em5_5, "
6209 "text6_0, text6_1, BroadcastTextID6, lang6, Probability6, em6_0, em6_1, em6_2, em6_3, em6_4, em6_5, "
6210 "text7_0, text7_1, BroadcastTextID7, lang7, Probability7, em7_0, em7_1, em7_2, em7_3, em7_4, em7_5 "
6211 "FROM npc_text");
6212
6213 if (!result)
6214 {
6215 LOG_WARN("server.loading", ">> Loaded 0 npc texts, table is empty!");
6216 LOG_INFO("server.loading", " ");
6217 return;
6218 }
6219
6220 _gossipTextStore.rehash(result->GetRowCount());
6221
6222 uint32 count = 0;
6223 uint8 cic;
6224
6225 do
6226 {
6227 cic = 0;
6228
6229 Field* fields = result->Fetch();
6230
6231 uint32 id = fields[cic++].Get<uint32>();
6232 if (!id)
6233 {
6234 LOG_ERROR("sql.sql", "Table `npc_text` has record wit reserved id 0, ignore.");
6235 continue;
6236 }
6237
6238 GossipText& gText = _gossipTextStore[id];
6239
6240 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6241 {
6242 gText.Options[i].Text_0 = fields[cic++].Get<std::string>();
6243 gText.Options[i].Text_1 = fields[cic++].Get<std::string>();
6244 gText.Options[i].BroadcastTextID = fields[cic++].Get<uint32>();
6245 gText.Options[i].Language = fields[cic++].Get<uint8>();
6246 gText.Options[i].Probability = fields[cic++].Get<float>();
6247
6248 for (uint8 j = 0; j < MAX_GOSSIP_TEXT_EMOTES; ++j)
6249 {
6250 gText.Options[i].Emotes[j]._Delay = fields[cic++].Get<uint16>();
6251 gText.Options[i].Emotes[j]._Emote = fields[cic++].Get<uint16>();
6252 }
6253 }
6254
6255 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; i++)
6256 {
6257 if (gText.Options[i].BroadcastTextID)
6258 {
6260 {
6261 LOG_ERROR("sql.sql", "GossipText (Id: {}) in table `npc_text` has non-existing or incompatible BroadcastTextID{} {}.", id, i, gText.Options[i].BroadcastTextID);
6262 gText.Options[i].BroadcastTextID = 0;
6263 }
6264 }
6265 }
6266
6267 count++;
6268 } while (result->NextRow());
6269
6270 LOG_INFO("server.loading", ">> Loaded {} Npc Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6271 LOG_INFO("server.loading", " ");
6272}
#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 ( )
6106{
6107 uint32 oldMSTime = getMSTime();
6108
6109 // 0 1 2 3
6110 QueryResult result = WorldDatabase.Query("SELECT entry, creditType, creditEntry, lastEncounterDungeon FROM instance_encounters");
6111 if (!result)
6112 {
6113 LOG_WARN("server.loading", ">> Loaded 0 instance encounters, table is empty!");
6114 LOG_INFO("server.loading", " ");
6115 return;
6116 }
6117
6118 uint32 count = 0;
6119 std::map<uint32, DungeonEncounterEntry const*> dungeonLastBosses;
6120 do
6121 {
6122 Field* fields = result->Fetch();
6123 uint32 entry = fields[0].Get<uint32>();
6124 uint8 creditType = fields[1].Get<uint8>();
6125 uint32 creditEntry = fields[2].Get<uint32>();
6126 uint32 lastEncounterDungeon = fields[3].Get<uint16>();
6127 DungeonEncounterEntry const* dungeonEncounter = sDungeonEncounterStore.LookupEntry(entry);
6128 if (!dungeonEncounter)
6129 {
6130 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid encounter id {}, skipped!", entry);
6131 continue;
6132 }
6133
6134 if (lastEncounterDungeon && !sLFGMgr->GetLFGDungeonEntry(lastEncounterDungeon))
6135 {
6136 LOG_ERROR("sql.sql", "Table `instance_encounters` has an encounter {} ({}) marked as final for invalid dungeon id {}, skipped!", entry, dungeonEncounter->encounterName[0], lastEncounterDungeon);
6137 continue;
6138 }
6139
6140 std::map<uint32, DungeonEncounterEntry const*>::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon);
6141 if (lastEncounterDungeon)
6142 {
6143 if (itr != dungeonLastBosses.end())
6144 {
6145 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]);
6146 continue;
6147 }
6148
6149 dungeonLastBosses[lastEncounterDungeon] = dungeonEncounter;
6150 }
6151
6152 switch (creditType)
6153 {
6155 {
6156 CreatureTemplate const* creatureInfo = GetCreatureTemplate(creditEntry);
6157 if (!creatureInfo)
6158 {
6159 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid creature (entry {}) linked to the encounter {} ({}), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
6160 continue;
6161 }
6162 const_cast<CreatureTemplate*>(creatureInfo)->flags_extra |= CREATURE_FLAG_EXTRA_DUNGEON_BOSS;
6163 break;
6164 }
6166 {
6167 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(creditEntry);
6168 if (!spellInfo)
6169 {
6170 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid spell (entry {}) linked to the encounter {} ({}), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
6171 continue;
6172 }
6173 const_cast<SpellInfo*>(spellInfo)->AttributesCu |= SPELL_ATTR0_CU_ENCOUNTER_REWARD;
6174 break;
6175 }
6176 default:
6177 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid credit type ({}) for encounter {} ({}), skipped!", creditType, entry, dungeonEncounter->encounterName[0]);
6178 continue;
6179 }
6180
6181 DungeonEncounterList& encounters = _dungeonEncounterStore[MAKE_PAIR32(dungeonEncounter->mapId, dungeonEncounter->difficulty)];
6182 encounters.push_back(new DungeonEncounter(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon));
6183 ++count;
6184 } while (result->NextRow());
6185
6186 LOG_INFO("server.loading", ">> Loaded {} Instance Encounters in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6187 LOG_INFO("server.loading", " ");
6188}
@ CREATURE_FLAG_EXTRA_DUNGEON_BOSS
Definition CreatureData.h:73
DBCStorage< DungeonEncounterEntry > sDungeonEncounterStore(DungeonEncounterfmt)
#define sLFGMgr
Definition LFGMgr.h:641
EncounterCreditType
Definition Map.h:157
@ ENCOUNTER_CREDIT_KILL_CREATURE
Definition Map.h:158
@ ENCOUNTER_CREDIT_CAST_SPELL
Definition Map.h:159
std::list< DungeonEncounter const * > DungeonEncounterList
Definition ObjectMgr.h:711
@ SPELL_ATTR0_CU_ENCOUNTER_REWARD
Definition SpellInfo.h:207
Definition DBCStructure.h:866
Definition ObjectMgr.h:701

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 ( )
6055{
6056 uint32 oldMSTime = getMSTime();
6057
6058 // 0 1 2 4
6059 QueryResult result = WorldDatabase.Query("SELECT map, parent, script, allowMount FROM instance_template");
6060
6061 if (!result)
6062 {
6063 LOG_WARN("server.loading", ">> Loaded 0 instance templates. DB table `instance_template` is empty!");
6064 LOG_INFO("server.loading", " ");
6065 return;
6066 }
6067
6068 uint32 count = 0;
6069 do
6070 {
6071 Field* fields = result->Fetch();
6072
6073 uint16 mapID = fields[0].Get<uint16>();
6074
6075 if (!MapMgr::IsValidMAP(mapID, true))
6076 {
6077 LOG_ERROR("sql.sql", "ObjectMgr::LoadInstanceTemplate: bad mapid {} for template!", mapID);
6078 continue;
6079 }
6080
6081 InstanceTemplate instanceTemplate;
6082
6083 instanceTemplate.AllowMount = fields[3].Get<bool>();
6084 instanceTemplate.Parent = uint32(fields[1].Get<uint16>());
6085 instanceTemplate.ScriptId = GetScriptId(fields[2].Get<std::string>());
6086
6087 _instanceTemplateStore[mapID] = instanceTemplate;
6088
6089 ++count;
6090 } while (result->NextRow());
6091
6092 LOG_INFO("server.loading", ">> Loaded {} Instance Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6093 LOG_INFO("server.loading", " ");
6094}
static bool IsValidMAP(uint32 mapid, bool startUp)
Definition MapMgr.cpp:311
bool AllowMount
Definition Map.h:124
uint32 ScriptId
Definition Map.h:123

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 ( )
2822{
2823 uint32 oldMSTime = getMSTime();
2824
2825 _itemLocaleStore.clear(); // need for reload case
2826
2827 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name, Description FROM item_template_locale");
2828 if (!result)
2829 return;
2830
2831 do
2832 {
2833 Field* fields = result->Fetch();
2834
2835 uint32 ID = fields[0].Get<uint32>();
2836
2837 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
2838 if (locale == LOCALE_enUS)
2839 continue;
2840
2841 ItemLocale& data = _itemLocaleStore[ID];
2842 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
2843 AddLocaleString(fields[3].Get<std::string>(), locale, data.Description);
2844 } while (result->NextRow());
2845
2846 LOG_INFO("server.loading", ">> Loaded {} Item Locale Strings in {} ms", (uint32)_itemLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
2847}
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 ( )
3493{
3494 uint32 oldMSTime = getMSTime();
3495
3496 _itemSetNameLocaleStore.clear(); // need for reload case
3497
3498 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name FROM item_set_names_locale");
3499
3500 if (!result)
3501 return;
3502
3503 do
3504 {
3505 Field* fields = result->Fetch();
3506
3507 uint32 ID = fields[0].Get<uint32>();
3508
3509 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
3510 if (locale == LOCALE_enUS)
3511 continue;
3512
3514 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
3515 } while (result->NextRow());
3516
3517 LOG_INFO("server.loading", ">> Loaded {} Item Set Name Locale Strings in {} ms", uint32(_itemSetNameLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
3518}
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 ( )
3521{
3522 uint32 oldMSTime = getMSTime();
3523
3524 _itemSetNameStore.clear(); // needed for reload case
3525
3526 std::set<uint32> itemSetItems;
3527
3528 // fill item set member ids
3529 for (uint32 entryId = 0; entryId < sItemSetStore.GetNumRows(); ++entryId)
3530 {
3531 ItemSetEntry const* setEntry = sItemSetStore.LookupEntry(entryId);
3532 if (!setEntry)
3533 continue;
3534
3535 for (uint32 i = 0; i < MAX_ITEM_SET_ITEMS; ++i)
3536 if (setEntry->itemId[i])
3537 itemSetItems.insert(setEntry->itemId[i]);
3538 }
3539
3540 // 0 1 2
3541 QueryResult result = WorldDatabase.Query("SELECT `entry`, `name`, `InventoryType` FROM `item_set_names`");
3542
3543 if (!result)
3544 {
3545 LOG_WARN("server.loading", ">> Loaded 0 item set names. DB table `item_set_names` is empty.");
3546 LOG_INFO("server.loading", " ");
3547 return;
3548 }
3549
3550 _itemSetNameStore.rehash(result->GetRowCount());
3551 uint32 count = 0;
3552
3553 do
3554 {
3555 Field* fields = result->Fetch();
3556
3557 uint32 entry = fields[0].Get<uint32>();
3558 if (itemSetItems.find(entry) == itemSetItems.end())
3559 {
3560 LOG_ERROR("sql.sql", "Item set name (Entry: {}) not found in ItemSet.dbc, data useless.", entry);
3561 continue;
3562 }
3563
3564 ItemSetNameEntry& data = _itemSetNameStore[entry];
3565 data.name = fields[1].Get<std::string>();
3566
3567 uint32 invType = fields[2].Get<uint8>();
3568 if (invType >= MAX_INVTYPE)
3569 {
3570 LOG_ERROR("sql.sql", "Item set name (Entry: {}) has wrong InventoryType value ({})", entry, invType);
3571 invType = INVTYPE_NON_EQUIP;
3572 }
3573
3574 data.InventoryType = invType;
3575 itemSetItems.erase(entry);
3576 ++count;
3577 } while (result->NextRow());
3578
3579 if (!itemSetItems.empty())
3580 {
3581 ItemTemplate const* pProto;
3582 for (std::set<uint32>::iterator itr = itemSetItems.begin(); itr != itemSetItems.end(); ++itr)
3583 {
3584 uint32 entry = *itr;
3585 // add data from item_template if available
3586 pProto = GetItemTemplate(entry);
3587 if (pProto)
3588 {
3589 LOG_ERROR("sql.sql", "Item set part (Entry: {}) does not have entry in `item_set_names`, adding data from `item_template`.", entry);
3590 ItemSetNameEntry& data = _itemSetNameStore[entry];
3591 data.name = pProto->Name1;
3592 data.InventoryType = pProto->InventoryType;
3593 ++count;
3594 }
3595 else
3596 LOG_ERROR("sql.sql", "Item set part (Entry: {}) does not have entry in `item_set_names`, set will not display properly.", entry);
3597 }
3598 }
3599
3600 LOG_INFO("server.loading", ">> Loaded {} Item Set Names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3601 LOG_INFO("server.loading", " ");
3602}
DBCStorage< ItemSetEntry > sItemSetStore(ItemSetEntryfmt)
#define MAX_ITEM_SET_ITEMS
Definition DBCStructure.h:1229
@ INVTYPE_NON_EQUIP
Definition ItemTemplate.h:256
#define MAX_INVTYPE
Definition ItemTemplate.h:287
Definition DBCStructure.h:1233
uint32 itemId[MAX_ITEM_SET_ITEMS]
Definition DBCStructure.h:1237
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 ( )
2874{
2875 uint32 oldMSTime = getMSTime();
2876
2877 // 0 1 2 3 4 5 6 7 8 9 10 11 12
2878 QueryResult result = WorldDatabase.Query("SELECT entry, class, subclass, SoundOverrideSubclass, name, displayid, Quality, Flags, FlagsExtra, BuyCount, BuyPrice, SellPrice, InventoryType, "
2879 // 13 14 15 16 17 18 19 20
2880 "AllowableClass, AllowableRace, ItemLevel, RequiredLevel, RequiredSkill, RequiredSkillRank, requiredspell, requiredhonorrank, "
2881 // 21 22 23 24 25 26 27
2882 "RequiredCityRank, RequiredReputationFaction, RequiredReputationRank, maxcount, stackable, ContainerSlots, stat_type1, "
2883 // 28 29 30 31 32 33 34 35 36 37
2884 "stat_value1, stat_type2, stat_value2, stat_type3, stat_value3, stat_type4, stat_value4, stat_type5, stat_value5, stat_type6, "
2885 // 38 39 40 41 42 43 44 45 46
2886 "stat_value6, stat_type7, stat_value7, stat_type8, stat_value8, stat_type9, stat_value9, stat_type10, stat_value10, "
2887 // 47 48 49 50 51 52 53 54 55 56 57
2888 "ScalingStatDistribution, ScalingStatValue, dmg_min1, dmg_max1, dmg_type1, dmg_min2, dmg_max2, dmg_type2, armor, holy_res, fire_res, "
2889 // 58 59 60 61 62 63 64 65 66 67
2890 "nature_res, frost_res, shadow_res, arcane_res, delay, ammo_type, RangedModRange, spellid_1, spelltrigger_1, spellcharges_1, "
2891 // 68 69 70 71 72 73 74
2892 "spellppmRate_1, spellcooldown_1, spellcategory_1, spellcategorycooldown_1, spellid_2, spelltrigger_2, spellcharges_2, "
2893 // 75 76 77 78 79 80 81
2894 "spellppmRate_2, spellcooldown_2, spellcategory_2, spellcategorycooldown_2, spellid_3, spelltrigger_3, spellcharges_3, "
2895 // 82 83 84 85 86 87 88
2896 "spellppmRate_3, spellcooldown_3, spellcategory_3, spellcategorycooldown_3, spellid_4, spelltrigger_4, spellcharges_4, "
2897 // 89 90 91 92 93 94 95
2898 "spellppmRate_4, spellcooldown_4, spellcategory_4, spellcategorycooldown_4, spellid_5, spelltrigger_5, spellcharges_5, "
2899 // 96 97 98 99 100 101 102 103 104
2900 "spellppmRate_5, spellcooldown_5, spellcategory_5, spellcategorycooldown_5, bonding, description, PageText, LanguageID, PageMaterial, "
2901 // 105 106 107 108 109 110 111 112 113 114 115 116
2902 "startquest, lockid, Material, sheath, RandomProperty, RandomSuffix, block, itemset, MaxDurability, area, Map, BagFamily, "
2903 // 117 118 119 120 121 122 123 124
2904 "TotemCategory, socketColor_1, socketContent_1, socketColor_2, socketContent_2, socketColor_3, socketContent_3, socketBonus, "
2905 // 125 126 127 128 129 130 131 132
2906 "GemProperties, RequiredDisenchantSkill, ArmorDamageModifier, duration, ItemLimitCategory, HolidayId, ScriptName, DisenchantID, "
2907 // 133 134 135 136
2908 "FoodType, minMoneyLoot, maxMoneyLoot, flagsCustom FROM item_template");
2909
2910 if (!result)
2911 {
2912 LOG_WARN("server.loading", ">> Loaded 0 item templates. DB table `item_template` is empty.");
2913 LOG_INFO("server.loading", " ");
2914 return;
2915 }
2916
2917 _itemTemplateStore.reserve(result->GetRowCount());
2918 uint32 count = 0;
2919 // original inspiration https://github.com/TrinityCore/TrinityCore/commit/0c44bd33ee7b42c924859139a9f4b04cf2b91261
2920 bool enforceDBCAttributes = sWorld->getBoolConfig(CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES);
2921
2922 do
2923 {
2924 Field* fields = result->Fetch();
2925
2926 uint32 entry = fields[0].Get<uint32>();
2927
2928 ItemTemplate& itemTemplate = _itemTemplateStore[entry];
2929
2930 itemTemplate.ItemId = entry;
2931 itemTemplate.Class = uint32(fields[1].Get<uint8>());
2932 itemTemplate.SubClass = uint32(fields[2].Get<uint8>());
2933 itemTemplate.SoundOverrideSubclass = int32(fields[3].Get<int8>());
2934 itemTemplate.Name1 = fields[4].Get<std::string>();
2935 itemTemplate.DisplayInfoID = fields[5].Get<uint32>();
2936 itemTemplate.Quality = uint32(fields[6].Get<uint8>());
2937 itemTemplate.Flags = ItemFlags(fields[7].Get<uint32>());
2938 itemTemplate.Flags2 = ItemFlags2(fields[8].Get<uint32>());
2939 itemTemplate.BuyCount = uint32(fields[9].Get<uint8>());
2940 itemTemplate.BuyPrice = int32(fields[10].Get<int64>());
2941 itemTemplate.SellPrice = uint32(fields[11].Get<uint32>());
2942 itemTemplate.InventoryType = uint32(fields[12].Get<uint8>());
2943 itemTemplate.AllowableClass = fields[13].Get<int32>();
2944 itemTemplate.AllowableRace = fields[14].Get<int32>();
2945 itemTemplate.ItemLevel = uint32(fields[15].Get<uint16>());
2946 itemTemplate.RequiredLevel = uint32(fields[16].Get<uint8>());
2947 itemTemplate.RequiredSkill = uint32(fields[17].Get<uint16>());
2948 itemTemplate.RequiredSkillRank = uint32(fields[18].Get<uint16>());
2949 itemTemplate.RequiredSpell = fields[19].Get<uint32>();
2950 itemTemplate.RequiredHonorRank = fields[20].Get<uint32>();
2951 itemTemplate.RequiredCityRank = fields[21].Get<uint32>();
2952 itemTemplate.RequiredReputationFaction = uint32(fields[22].Get<uint16>());
2953 itemTemplate.RequiredReputationRank = uint32(fields[23].Get<uint16>());
2954 itemTemplate.MaxCount = fields[24].Get<int32>();
2955 itemTemplate.Stackable = fields[25].Get<int32>();
2956 itemTemplate.ContainerSlots = uint32(fields[26].Get<uint8>());
2957
2958 uint8 statsCount = 0;
2959 while (statsCount < MAX_ITEM_PROTO_STATS)
2960 {
2961 uint32 statType = uint32(fields[27 + statsCount * 2].Get<uint8>());
2962 int32 statValue = fields[28 + statsCount * 2].Get<int32>();
2963 if (statType == 0)
2964 break;
2965
2966 itemTemplate.ItemStat[statsCount].ItemStatType = statType;
2967 itemTemplate.ItemStat[statsCount].ItemStatValue = statValue;
2968 statsCount++;
2969 }
2970 itemTemplate.StatsCount = statsCount;
2971
2972 itemTemplate.ScalingStatDistribution = uint32(fields[47].Get<uint16>());
2973 itemTemplate.ScalingStatValue = fields[48].Get<int32>();
2974
2975 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2976 {
2977 itemTemplate.Damage[i].DamageMin = fields[49 + i * 3].Get<float>();
2978 itemTemplate.Damage[i].DamageMax = fields[50 + i * 3].Get<float>();
2979 itemTemplate.Damage[i].DamageType = uint32(fields[51 + i * 3].Get<uint8>());
2980 }
2981
2982 itemTemplate.Armor = fields[55].Get<uint32>();
2983 itemTemplate.HolyRes = fields[56].Get<int32>();
2984 itemTemplate.FireRes = fields[57].Get<int32>();
2985 itemTemplate.NatureRes = fields[58].Get<int32>();
2986 itemTemplate.FrostRes = fields[59].Get<int32>();
2987 itemTemplate.ShadowRes = fields[60].Get<int32>();
2988 itemTemplate.ArcaneRes = fields[61].Get<int32>();
2989 itemTemplate.Delay = uint32(fields[62].Get<uint16>());
2990 itemTemplate.AmmoType = uint32(fields[63].Get<uint8>());
2991 itemTemplate.RangedModRange = fields[64].Get<float>();
2992
2993 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
2994 {
2995 itemTemplate.Spells[i].SpellId = fields[65 + i * 7 ].Get<int32>();
2996 itemTemplate.Spells[i].SpellTrigger = uint32(fields[66 + i * 7].Get<uint8>());
2997 itemTemplate.Spells[i].SpellCharges = int32(fields[67 + i * 7].Get<int16>());
2998 itemTemplate.Spells[i].SpellPPMRate = fields[68 + i * 7].Get<float>();
2999 itemTemplate.Spells[i].SpellCooldown = fields[69 + i * 7].Get<int32>();
3000 itemTemplate.Spells[i].SpellCategory = uint32(fields[70 + i * 7].Get<uint16>());
3001 itemTemplate.Spells[i].SpellCategoryCooldown = fields[71 + i * 7].Get<int32>();
3002 }
3003
3004 itemTemplate.Bonding = uint32(fields[100].Get<uint8>());
3005 itemTemplate.Description = fields[101].Get<std::string>();
3006 itemTemplate.PageText = fields[102].Get<uint32>();
3007 itemTemplate.LanguageID = uint32(fields[103].Get<uint8>());
3008 itemTemplate.PageMaterial = uint32(fields[104].Get<uint8>());
3009 itemTemplate.StartQuest = fields[105].Get<uint32>();
3010 itemTemplate.LockID = fields[106].Get<uint32>();
3011 itemTemplate.Material = int32(fields[107].Get<int8>());
3012 itemTemplate.Sheath = uint32(fields[108].Get<uint8>());
3013 itemTemplate.RandomProperty = fields[109].Get<int32>();
3014 itemTemplate.RandomSuffix = fields[110].Get<int32>();
3015 itemTemplate.Block = fields[111].Get<uint32>();
3016 itemTemplate.ItemSet = fields[112].Get<uint32>();
3017 itemTemplate.MaxDurability = uint32(fields[113].Get<uint16>());
3018 itemTemplate.Area = fields[114].Get<uint32>();
3019 itemTemplate.Map = uint32(fields[115].Get<uint16>());
3020 itemTemplate.BagFamily = fields[116].Get<uint32>();
3021 itemTemplate.TotemCategory = fields[117].Get<uint32>();
3022
3023 for (uint8 i = 0; i < MAX_ITEM_PROTO_SOCKETS; ++i)
3024 {
3025 itemTemplate.Socket[i].Color = uint32(fields[118 + i * 2].Get<uint8>());
3026 itemTemplate.Socket[i].Content = fields[119 + i * 2].Get<uint32>();
3027 }
3028
3029 itemTemplate.socketBonus = fields[124].Get<uint32>();
3030 itemTemplate.GemProperties = fields[125].Get<uint32>();
3031 itemTemplate.RequiredDisenchantSkill = uint32(fields[126].Get<int16>());
3032 itemTemplate.ArmorDamageModifier = fields[127].Get<float>();
3033 itemTemplate.Duration = fields[128].Get<uint32>();
3034 itemTemplate.ItemLimitCategory = uint32(fields[129].Get<int16>());
3035 itemTemplate.HolidayId = fields[130].Get<uint32>();
3036 itemTemplate.ScriptId = GetScriptId(fields[131].Get<std::string>());
3037 itemTemplate.DisenchantID = fields[132].Get<uint32>();
3038 itemTemplate.FoodType = uint32(fields[133].Get<uint8>());
3039 itemTemplate.MinMoneyLoot = fields[134].Get<uint32>();
3040 itemTemplate.MaxMoneyLoot = fields[135].Get<uint32>();
3041 itemTemplate.FlagsCu = ItemFlagsCustom(fields[136].Get<uint32>());
3042
3043 // Checks
3044 ItemEntry const* dbcitem = sItemStore.LookupEntry(entry);
3045
3046 if (!dbcitem)
3047 {
3048 LOG_DEBUG("sql.sql", "Item (Entry: {}) does not exist in item.dbc! (not correct id?).", entry);
3049 continue;
3050 }
3051
3052 if (enforceDBCAttributes)
3053 {
3054 if (itemTemplate.Class != dbcitem->ClassID)
3055 {
3056 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Class value ({}), must be ({}).", entry, itemTemplate.Class, dbcitem->ClassID);
3057 itemTemplate.Class = dbcitem->ClassID;
3058 }
3059 if (itemTemplate.SubClass != dbcitem->SubclassID)
3060 {
3061 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Subclass value ({}) for class {}, must be ({}).", entry, itemTemplate.SubClass, itemTemplate.Class, dbcitem->SubclassID);
3062 itemTemplate.SubClass = dbcitem->SubclassID;
3063 }
3064 if (itemTemplate.SoundOverrideSubclass != dbcitem->SoundOverrideSubclassID)
3065 {
3066 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct SoundOverrideSubclass ({}), must be {}.", entry, itemTemplate.SoundOverrideSubclass, dbcitem->SoundOverrideSubclassID);
3067 itemTemplate.SoundOverrideSubclass = dbcitem->SoundOverrideSubclassID;
3068 }
3069 if (itemTemplate.Material != dbcitem->Material)
3070 {
3071 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct material ({}), must be {}.", entry, itemTemplate.Material, dbcitem->Material);
3072 itemTemplate.Material = dbcitem->Material;
3073 }
3074 if (itemTemplate.InventoryType != dbcitem->InventoryType)
3075 {
3076 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong InventoryType value ({}), must be {}.", entry, itemTemplate.InventoryType, dbcitem->InventoryType);
3077 itemTemplate.InventoryType = dbcitem->InventoryType;
3078 }
3079 if (itemTemplate.DisplayInfoID != dbcitem->DisplayInfoID)
3080 {
3081 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct display id ({}), must be {}.", entry, itemTemplate.DisplayInfoID, dbcitem->DisplayInfoID);
3082 itemTemplate.DisplayInfoID = dbcitem->DisplayInfoID;
3083 }
3084 if (itemTemplate.Sheath != dbcitem->SheatheType)
3085 {
3086 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Sheath ({}), must be {}.", entry, itemTemplate.Sheath, dbcitem->SheatheType);
3087 itemTemplate.Sheath = dbcitem->SheatheType;
3088 }
3089 }
3090
3091 if (itemTemplate.Quality >= MAX_ITEM_QUALITY)
3092 {
3093 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Quality value ({})", entry, itemTemplate.Quality);
3094 itemTemplate.Quality = ITEM_QUALITY_NORMAL;
3095 }
3096
3097 if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_HORDE))
3098 {
3099 if (FactionEntry const* faction = sFactionStore.LookupEntry(HORDE))
3100 if ((itemTemplate.AllowableRace & faction->BaseRepRaceMask[0]) == 0)
3101 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.",
3102 entry, itemTemplate.AllowableRace, ITEM_FLAG2_FACTION_HORDE);
3103
3104 if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE))
3105 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.",
3107 }
3108 else if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE))
3109 {
3110 if (FactionEntry const* faction = sFactionStore.LookupEntry(ALLIANCE))
3111 if ((itemTemplate.AllowableRace & faction->BaseRepRaceMask[0]) == 0)
3112 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.",
3113 entry, itemTemplate.AllowableRace, ITEM_FLAG2_FACTION_ALLIANCE);
3114 }
3115
3116 if (itemTemplate.BuyCount <= 0)
3117 {
3118 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong BuyCount value ({}), set to default(1).", entry, itemTemplate.BuyCount);
3119 itemTemplate.BuyCount = 1;
3120 }
3121
3122 if (itemTemplate.RequiredSkill >= MAX_SKILL_TYPE)
3123 {
3124 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong RequiredSkill value ({})", entry, itemTemplate.RequiredSkill);
3125 itemTemplate.RequiredSkill = 0;
3126 }
3127
3128 {
3129 // can be used in equip slot, as page read use in inventory, or spell casting at use
3130 bool req = itemTemplate.InventoryType != INVTYPE_NON_EQUIP || itemTemplate.PageText;
3131 if (!req)
3132 for (uint8 j = 0; j < MAX_ITEM_PROTO_SPELLS; ++j)
3133 {
3134 if (itemTemplate.Spells[j].SpellId)
3135 {
3136 req = true;
3137 break;
3138 }
3139 }
3140
3141 if (req)
3142 {
3143 if (!(itemTemplate.AllowableClass & CLASSMASK_ALL_PLAYABLE))
3144 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have any playable classes ({}) in `AllowableClass` and can't be equipped or used.", entry, itemTemplate.AllowableClass);
3145
3146 if (!(itemTemplate.AllowableRace & RACEMASK_ALL_PLAYABLE))
3147 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have any playable races ({}) in `AllowableRace` and can't be equipped or used.", entry, itemTemplate.AllowableRace);
3148 }
3149 }
3150
3151 if (itemTemplate.RequiredSpell && !sSpellMgr->GetSpellInfo(itemTemplate.RequiredSpell))
3152 {
3153 LOG_ERROR("sql.sql", "Item (Entry: {}) has a wrong (non-existing) spell in RequiredSpell ({})", entry, itemTemplate.RequiredSpell);
3154 itemTemplate.RequiredSpell = 0;
3155 }
3156
3157 if (itemTemplate.RequiredReputationRank >= MAX_REPUTATION_RANK)
3158 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong reputation rank in RequiredReputationRank ({}), item can't be used.", entry, itemTemplate.RequiredReputationRank);
3159
3160 if (itemTemplate.RequiredReputationFaction)
3161 {
3162 if (!sFactionStore.LookupEntry(itemTemplate.RequiredReputationFaction))
3163 {
3164 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (not existing) faction in RequiredReputationFaction ({})", entry, itemTemplate.RequiredReputationFaction);
3165 itemTemplate.RequiredReputationFaction = 0;
3166 }
3167
3168 if (itemTemplate.RequiredReputationRank == MIN_REPUTATION_RANK)
3169 LOG_ERROR("sql.sql", "Item (Entry: {}) has min. reputation rank in RequiredReputationRank (0) but RequiredReputationFaction > 0, faction setting is useless.", entry);
3170 }
3171
3172 if (itemTemplate.MaxCount < -1)
3173 {
3174 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large negative in maxcount ({}), replace by value (-1) no storing limits.", entry, itemTemplate.MaxCount);
3175 itemTemplate.MaxCount = -1;
3176 }
3177
3178 if (itemTemplate.Stackable == 0)
3179 {
3180 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong value in stackable ({}), replace by default 1.", entry, itemTemplate.Stackable);
3181 itemTemplate.Stackable = 1;
3182 }
3183 else if (itemTemplate.Stackable < -1)
3184 {
3185 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large negative in stackable ({}), replace by value (-1) no stacking limits.", entry, itemTemplate.Stackable);
3186 itemTemplate.Stackable = -1;
3187 }
3188
3189 if (itemTemplate.ContainerSlots > MAX_BAG_SIZE)
3190 {
3191 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large value in ContainerSlots ({}), replace by hardcoded limit ({}).", entry, itemTemplate.ContainerSlots, MAX_BAG_SIZE);
3192 itemTemplate.ContainerSlots = MAX_BAG_SIZE;
3193 }
3194
3195 for (uint8 j = 0; j < itemTemplate.StatsCount; ++j)
3196 {
3197 // for ItemStatValue != 0
3198 if (itemTemplate.ItemStat[j].ItemStatValue && itemTemplate.ItemStat[j].ItemStatType >= MAX_ITEM_MOD)
3199 {
3200 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (non-existing?) stat_type{} ({})", entry, j + 1, itemTemplate.ItemStat[j].ItemStatType);
3201 itemTemplate.ItemStat[j].ItemStatType = 0;
3202 }
3203
3204 switch (itemTemplate.ItemStat[j].ItemStatType)
3205 {
3208 LOG_WARN("sql.sql", "Item (Entry: {}) has deprecated stat_type{} ({})", entry, j + 1, itemTemplate.ItemStat[j].ItemStatType);
3209 break;
3210 default:
3211 break;
3212 }
3213 }
3214
3215 for (uint8 j = 0; j < MAX_ITEM_PROTO_DAMAGES; ++j)
3216 {
3217 if (itemTemplate.Damage[j].DamageType >= MAX_SPELL_SCHOOL)
3218 {
3219 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong dmg_type{} ({})", entry, j + 1, itemTemplate.Damage[j].DamageType);
3220 itemTemplate.Damage[j].DamageType = 0;
3221 }
3222 }
3223
3224 // special format
3225 if ((itemTemplate.Spells[0].SpellId == 483) || (itemTemplate.Spells[0].SpellId == 55884))
3226 {
3227 // spell_1
3228 if (itemTemplate.Spells[0].SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
3229 {
3230 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);
3231 itemTemplate.Spells[0].SpellId = 0;
3232 itemTemplate.Spells[0].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3233 itemTemplate.Spells[1].SpellId = 0;
3234 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3235 }
3236
3237 // spell_2 have learning spell
3238 if (itemTemplate.Spells[1].SpellTrigger != ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
3239 {
3240 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);
3241 itemTemplate.Spells[0].SpellId = 0;
3242 itemTemplate.Spells[1].SpellId = 0;
3243 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3244 }
3245 else if (!itemTemplate.Spells[1].SpellId)
3246 {
3247 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have an expected spell in spellid_{} in special learning format.", entry, 1 + 1);
3248 itemTemplate.Spells[0].SpellId = 0;
3249 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3250 }
3251 else if (itemTemplate.Spells[1].SpellId != -1)
3252 {
3253 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemTemplate.Spells[1].SpellId);
3254 if (!spellInfo && !sDisableMgr->IsDisabledFor(DISABLE_TYPE_SPELL, itemTemplate.Spells[1].SpellId, nullptr))
3255 {
3256 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (not existing) spell in spellid_{} ({})", entry, 1 + 1, itemTemplate.Spells[1].SpellId);
3257 itemTemplate.Spells[0].SpellId = 0;
3258 itemTemplate.Spells[1].SpellId = 0;
3259 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3260 }
3261 // allowed only in special format
3262 else if ((itemTemplate.Spells[1].SpellId == 483) || (itemTemplate.Spells[1].SpellId == 55884))
3263 {
3264 LOG_ERROR("sql.sql", "Item (Entry: {}) has broken spell in spellid_{} ({})", entry, 1 + 1, itemTemplate.Spells[1].SpellId);
3265 itemTemplate.Spells[0].SpellId = 0;
3266 itemTemplate.Spells[1].SpellId = 0;
3267 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3268 }
3269 }
3270
3271 // spell_3*, spell_4*, spell_5* is empty
3272 for (uint8 j = 2; j < MAX_ITEM_PROTO_SPELLS; ++j)
3273 {
3274 if (itemTemplate.Spells[j].SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
3275 {
3276 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong item spell trigger value in spelltrigger_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellTrigger);
3277 itemTemplate.Spells[j].SpellId = 0;
3278 itemTemplate.Spells[j].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3279 }
3280 else if (itemTemplate.Spells[j].SpellId != 0)
3281 {
3282 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong spell in spellid_{} ({}) for learning special format", entry, j + 1, itemTemplate.Spells[j].SpellId);
3283 itemTemplate.Spells[j].SpellId = 0;
3284 }
3285 }
3286 }
3287 // normal spell list
3288 else
3289 {
3290 for (uint8 j = 0; j < MAX_ITEM_PROTO_SPELLS; ++j)
3291 {
3292 if (itemTemplate.Spells[j].SpellTrigger >= MAX_ITEM_SPELLTRIGGER || itemTemplate.Spells[j].SpellTrigger == ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
3293 {
3294 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong item spell trigger value in spelltrigger_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellTrigger);
3295 itemTemplate.Spells[j].SpellId = 0;
3296 itemTemplate.Spells[j].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3297 }
3298
3299 if (itemTemplate.Spells[j].SpellId && itemTemplate.Spells[j].SpellId != -1)
3300 {
3301 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemTemplate.Spells[j].SpellId);
3302 if (!spellInfo && !sDisableMgr->IsDisabledFor(DISABLE_TYPE_SPELL, itemTemplate.Spells[j].SpellId, nullptr))
3303 {
3304 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (not existing) spell in spellid_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellId);
3305 itemTemplate.Spells[j].SpellId = 0;
3306 }
3307 // allowed only in special format
3308 else if ((itemTemplate.Spells[j].SpellId == 483) || (itemTemplate.Spells[j].SpellId == 55884))
3309 {
3310 LOG_ERROR("sql.sql", "Item (Entry: {}) has broken spell in spellid_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellId);
3311 itemTemplate.Spells[j].SpellId = 0;
3312 }
3313 }
3314 }
3315 }
3316
3317 if (itemTemplate.Bonding >= MAX_BIND_TYPE)
3318 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Bonding value ({})", entry, itemTemplate.Bonding);
3319
3320 if (itemTemplate.PageText && !GetPageText(itemTemplate.PageText))
3321 LOG_ERROR("sql.sql", "Item (Entry: {}) has non existing first page (Id:{})", entry, itemTemplate.PageText);
3322
3323 if (itemTemplate.LockID && !sLockStore.LookupEntry(itemTemplate.LockID))
3324 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong LockID ({})", entry, itemTemplate.LockID);
3325
3326 if (itemTemplate.RandomProperty)
3327 {
3328 // To be implemented later
3329 if (itemTemplate.RandomProperty == -1)
3330 itemTemplate.RandomProperty = 0;
3331
3332 else if (!sItemRandomPropertiesStore.LookupEntry(GetItemEnchantMod(itemTemplate.RandomProperty)))
3333 {
3334 LOG_ERROR("sql.sql", "Item (Entry: {}) has unknown (wrong or not listed in `item_enchantment_template`) RandomProperty ({})", entry, itemTemplate.RandomProperty);
3335 itemTemplate.RandomProperty = 0;
3336 }
3337 }
3338
3339 if (itemTemplate.RandomSuffix && !sItemRandomSuffixStore.LookupEntry(GetItemEnchantMod(itemTemplate.RandomSuffix)))
3340 {
3341 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong RandomSuffix ({})", entry, itemTemplate.RandomSuffix);
3342 itemTemplate.RandomSuffix = 0;
3343 }
3344
3345 if (itemTemplate.ItemSet && !sItemSetStore.LookupEntry(itemTemplate.ItemSet))
3346 {
3347 LOG_ERROR("sql.sql", "Item (Entry: {}) have wrong ItemSet ({})", entry, itemTemplate.ItemSet);
3348 itemTemplate.ItemSet = 0;
3349 }
3350
3351 if (itemTemplate.Area && !sAreaTableStore.LookupEntry(itemTemplate.Area))
3352 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Area ({})", entry, itemTemplate.Area);
3353
3354 if (itemTemplate.Map && !sMapStore.LookupEntry(itemTemplate.Map))
3355 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Map ({})", entry, itemTemplate.Map);
3356
3357 if (itemTemplate.BagFamily)
3358 {
3359 // check bits
3360 for (uint32 j = 0; j < sizeof(itemTemplate.BagFamily) * 8; ++j)
3361 {
3362 uint32 mask = 1 << j;
3363 if ((itemTemplate.BagFamily & mask) == 0)
3364 continue;
3365
3366 ItemBagFamilyEntry const* bf = sItemBagFamilyStore.LookupEntry(j + 1);
3367 if (!bf)
3368 {
3369 LOG_ERROR("sql.sql", "Item (Entry: {}) has bag family bit set not listed in ItemBagFamily.dbc, remove bit", entry);
3370 itemTemplate.BagFamily &= ~mask;
3371 continue;
3372 }
3373
3375 {
3376 CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(itemTemplate.ItemId);
3377 if (!ctEntry)
3378 {
3379 LOG_ERROR("sql.sql", "Item (Entry: {}) has currency bag family bit set in BagFamily but not listed in CurrencyTypes.dbc, remove bit", entry);
3380 itemTemplate.BagFamily &= ~mask;
3381 }
3382 }
3383 }
3384 }
3385
3386 if (itemTemplate.TotemCategory && !sTotemCategoryStore.LookupEntry(itemTemplate.TotemCategory))
3387 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong TotemCategory ({})", entry, itemTemplate.TotemCategory);
3388
3389 for (uint8 j = 0; j < MAX_ITEM_PROTO_SOCKETS; ++j)
3390 {
3391 if (itemTemplate.Socket[j].Color && (itemTemplate.Socket[j].Color & SOCKET_COLOR_ALL) != itemTemplate.Socket[j].Color)
3392 {
3393 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong socketColor_{} ({})", entry, j + 1, itemTemplate.Socket[j].Color);
3394 itemTemplate.Socket[j].Color = 0;
3395 }
3396 }
3397
3398 if (itemTemplate.GemProperties && !sGemPropertiesStore.LookupEntry(itemTemplate.GemProperties))
3399 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong GemProperties ({})", entry, itemTemplate.GemProperties);
3400
3401 if (itemTemplate.FoodType >= MAX_PET_DIET)
3402 {
3403 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong FoodType value ({})", entry, itemTemplate.FoodType);
3404 itemTemplate.FoodType = 0;
3405 }
3406
3407 if (itemTemplate.ItemLimitCategory && !sItemLimitCategoryStore.LookupEntry(itemTemplate.ItemLimitCategory))
3408 {
3409 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong LimitCategory value ({})", entry, itemTemplate.ItemLimitCategory);
3410 itemTemplate.ItemLimitCategory = 0;
3411 }
3412
3413 if (itemTemplate.HolidayId && !sHolidaysStore.LookupEntry(itemTemplate.HolidayId))
3414 {
3415 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong HolidayId value ({})", entry, itemTemplate.HolidayId);
3416 itemTemplate.HolidayId = 0;
3417 }
3418
3419 if (itemTemplate.HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME) && !itemTemplate.Duration)
3420 {
3421 LOG_ERROR("sql.sql", "Item (Entry {}) has flag ITEM_FLAGS_CU_DURATION_REAL_TIME but it does not have duration limit", entry);
3422 itemTemplate.FlagsCu = static_cast<ItemFlagsCustom>(static_cast<uint32>(itemTemplate.FlagsCu) & ~ITEM_FLAGS_CU_DURATION_REAL_TIME);
3423 }
3424
3425 // Set after checks to ensure valid item quality
3426 itemTemplate.BuyPrice *= sWorld->getRate(qualityToBuyValueConfig[itemTemplate.Quality]);
3427 itemTemplate.SellPrice *= sWorld->getRate(qualityToSellValueConfig[itemTemplate.Quality]);
3428
3429 // Fill categories map
3430 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
3431 if (itemTemplate.Spells[i].SpellId && itemTemplate.Spells[i].SpellCategory && itemTemplate.Spells[i].SpellCategoryCooldown)
3432 {
3433 SpellCategoryStore::iterator ct = sSpellsByCategoryStore.find(itemTemplate.Spells[i].SpellCategory);
3434 if (ct != sSpellsByCategoryStore.end())
3435 {
3436 ct->second.emplace(true, itemTemplate.Spells[i].SpellId);
3437 }
3438 else
3439 sSpellsByCategoryStore[itemTemplate.Spells[i].SpellCategory].emplace(true, itemTemplate.Spells[i].SpellId);
3440 }
3441
3442 ++count;
3443 } while (result->NextRow());
3444
3445 // pussywizard:
3446 {
3447 uint32 max = 0;
3448 for (ItemTemplateContainer::const_iterator itr = _itemTemplateStore.begin(); itr != _itemTemplateStore.end(); ++itr)
3449 if (itr->first > max)
3450 max = itr->first;
3451 if (max)
3452 {
3453 _itemTemplateStoreFast.clear();
3454 _itemTemplateStoreFast.resize(max + 1, nullptr);
3455 for (ItemTemplateContainer::iterator itr = _itemTemplateStore.begin(); itr != _itemTemplateStore.end(); ++itr)
3456 _itemTemplateStoreFast[itr->first] = &(itr->second);
3457 }
3458 }
3459
3460 // Check if item templates for DBC referenced character start outfit are present
3461 std::set<uint32> notFoundOutfit;
3462 for (uint32 i = 1; i < sCharStartOutfitStore.GetNumRows(); ++i)
3463 {
3464 CharStartOutfitEntry const* entry = sCharStartOutfitStore.LookupEntry(i);
3465 if (!entry)
3466 continue;
3467
3468 for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j)
3469 {
3470 if (entry->ItemId[j] <= 0)
3471 continue;
3472
3473 uint32 item_id = entry->ItemId[j];
3474
3475 if (!GetItemTemplate(item_id))
3476 notFoundOutfit.insert(item_id);
3477 }
3478 }
3479
3480 for (std::set<uint32>::const_iterator itr = notFoundOutfit.begin(); itr != notFoundOutfit.end(); ++itr)
3481 LOG_ERROR("sql.sql", "Item (Entry: {}) does not exist in `item_template` but is referenced in `CharStartOutfit.dbc`", *itr);
3482
3483 LOG_INFO("server.loading", ">> Loaded {} Item Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3484 LOG_INFO("server.loading", " ");
3485}
#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:2861
ServerConfigs const qualityToBuyValueConfig[MAX_ITEM_QUALITY]
Definition ObjectMgr.cpp:2849
#define MAX_REPUTATION_RANK
Definition SharedDefines.h:256
#define MIN_REPUTATION_RANK
Definition SharedDefines.h:255
#define MAX_PET_DIET
Definition SharedDefines.h:3481
@ ITEM_QUALITY_NORMAL
Definition SharedDefines.h:341
#define MAX_ITEM_QUALITY
Definition SharedDefines.h:350
#define MAX_SKILL_TYPE
Definition SharedDefines.h:3268
@ ALLIANCE
Definition SharedDefines.h:779
@ HORDE
Definition SharedDefines.h:778
#define CLASSMASK_ALL_PLAYABLE
Definition SharedDefines.h:157
#define RACEMASK_ALL_PLAYABLE
Definition SharedDefines.h:97
@ CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES
Definition WorldConfig.h:97
Definition DBCStructure.h:620
int32 ItemId[MAX_OUTFIT_ITEMS]
Definition DBCStructure.h:626
Definition DBCStructure.h:835
Definition DBCStructure.h:907
Definition DBCStructure.h:1153
int32 SoundOverrideSubclassID
Definition DBCStructure.h:1145
uint32 SheatheType
Definition DBCStructure.h:1149
uint32 DisplayInfoID
Definition DBCStructure.h:1147
uint32 ClassID
Definition DBCStructure.h:1143
int32 Material
Definition DBCStructure.h:1146
uint32 SubclassID
Definition DBCStructure.h:1144
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, RACEMASK_ALL_PLAYABLE, sAreaTableStore, sCharStartOutfitStore, sCurrencyTypesStore, sDisableMgr, sFactionStore, sGemPropertiesStore, ItemEntry::SheatheType, sHolidaysStore, sItemBagFamilyStore, sItemLimitCategoryStore, sItemRandomPropertiesStore, sItemRandomSuffixStore, sItemSetStore, sItemStore, sLockStore, sMapStore, SOCKET_COLOR_ALL, ItemEntry::SoundOverrideSubclassID, sSpellMgr, sSpellsByCategoryStore, sTotemCategoryStore, ItemEntry::SubclassID, sWorld, and WorldDatabase.

◆ LoadLinkedRespawn()

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

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

◆ LoadMailLevelRewards()

void ObjectMgr::LoadMailLevelRewards ( )
9254{
9255 uint32 oldMSTime = getMSTime();
9256
9257 _mailLevelRewardStore.clear(); // for reload case
9258
9259 // 0 1 2 3
9260 QueryResult result = WorldDatabase.Query("SELECT level, raceMask, mailTemplateId, senderEntry FROM mail_level_reward");
9261
9262 if (!result)
9263 {
9264 LOG_WARN("server.loading", ">> Loaded 0 level dependent mail rewards. DB table `mail_level_reward` is empty.");
9265 LOG_INFO("server.loading", " ");
9266 return;
9267 }
9268
9269 uint32 count = 0;
9270
9271 do
9272 {
9273 Field* fields = result->Fetch();
9274
9275 uint8 level = fields[0].Get<uint8>();
9276 uint32 raceMask = fields[1].Get<uint32>();
9277 uint32 mailTemplateId = fields[2].Get<uint32>();
9278 uint32 senderEntry = fields[3].Get<uint32>();
9279
9280 if (level > MAX_LEVEL)
9281 {
9282 LOG_ERROR("sql.sql", "Table `mail_level_reward` have data for level {} that more supported by client ({}), ignoring.", level, MAX_LEVEL);
9283 continue;
9284 }
9285
9286 if (!(raceMask & RACEMASK_ALL_PLAYABLE))
9287 {
9288 LOG_ERROR("sql.sql", "Table `mail_level_reward` have raceMask ({}) for level {} that not include any player races, ignoring.", raceMask, level);
9289 continue;
9290 }
9291
9292 if (!sMailTemplateStore.LookupEntry(mailTemplateId))
9293 {
9294 LOG_ERROR("sql.sql", "Table `mail_level_reward` have invalid mailTemplateId ({}) for level {} that invalid not include any player races, ignoring.", mailTemplateId, level);
9295 continue;
9296 }
9297
9298 if (!GetCreatureTemplate(senderEntry))
9299 {
9300 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);
9301 continue;
9302 }
9303
9304 _mailLevelRewardStore[level].push_back(MailLevelReward(raceMask, mailTemplateId, senderEntry));
9305
9306 ++count;
9307 } while (result->NextRow());
9308
9309 LOG_INFO("server.loading", ">> Loaded {} Level Dependent Mail Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9310 LOG_INFO("server.loading", " ");
9311}
#define MAX_LEVEL
Definition DBCEnums.h:39
DBCStorage< MailTemplateEntry > sMailTemplateStore(MailTemplateEntryfmt)
Definition ObjectMgr.h:543

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

◆ LoadModuleStrings()

bool ObjectMgr::LoadModuleStrings ( )
8833{
8834 uint32 oldMSTime = getMSTime();
8835
8836 _moduleStringStore.clear(); // for reload case
8837 QueryResult result = WorldDatabase.Query("SELECT module, id, string FROM module_string");
8838 if (!result)
8839 {
8840 LOG_WARN("server.loading", ">> Loaded 0 module strings. DB table `module_string` is empty.");
8841 LOG_INFO("server.loading", " ");
8842 return false;
8843 }
8844
8845 do
8846 {
8847 Field* fields = result->Fetch();
8848
8849 std::string module = fields[0].Get<std::string>();
8850 uint32 id = fields[1].Get<uint32>();
8851
8852 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
8853 ModuleString& data = _moduleStringStore[pairKey];
8854
8855 AddLocaleString(fields[2].Get<std::string>(), LOCALE_enUS, data.Content);
8856 } while (result->NextRow());
8857
8858 LOG_INFO("server.loading", ">> Loaded {} Module Strings in {} ms", _moduleStringStore.size(), GetMSTimeDiffToNow(oldMSTime));
8859 LOG_INFO("server.loading", " ");
8860
8861 return true;
8862}

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

◆ LoadModuleStringsLocale()

bool ObjectMgr::LoadModuleStringsLocale ( )
8865{
8866 uint32 oldMSTime = getMSTime();
8867
8868 QueryResult result = WorldDatabase.Query("SELECT module, id, locale, string FROM module_string_locale");
8869 if (!result)
8870 {
8871 LOG_WARN("server.loading", ">> Loaded 0 module strings locale. DB table `module_string_locale` is empty.");
8872 LOG_INFO("server.loading", " ");
8873 return false;
8874 }
8875
8876 uint32 localeCount = 0;
8877 do
8878 {
8879 Field* fields = result->Fetch();
8880
8881 std::string module = fields[0].Get<std::string>();
8882 uint32 id = fields[1].Get<uint32>();
8883
8884 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
8885 ModuleString& data = _moduleStringStore[pairKey];
8886
8887 ModuleStringContainer::iterator ms = _moduleStringStore.find(pairKey);
8888 if (ms == _moduleStringStore.end())
8889 {
8890 LOG_ERROR("sql.sql", "ModuleString (Module: {} Id: {}) found in table `module_string_locale` but does not exist in `module_string`. Skipped!", module, id);
8891 continue;
8892 }
8893
8894 LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>());
8895 if (locale == LOCALE_enUS)
8896 continue;
8897
8898 AddLocaleString(fields[3].Get<std::string>(), locale, data.Content);
8899 localeCount++;
8900 } while (result->NextRow());
8901
8902 LOG_INFO("server.loading", ">> Loaded {} Module Strings Locales in {} ms", localeCount, GetMSTimeDiffToNow(oldMSTime));
8903 LOG_INFO("server.loading", " ");
8904
8905 return true;
8906}

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

◆ LoadNPCSpellClickSpells()

void ObjectMgr::LoadNPCSpellClickSpells ( )
8186{
8187 uint32 oldMSTime = getMSTime();
8188
8189 _spellClickInfoStore.clear();
8190 // 0 1 2 3
8191 QueryResult result = WorldDatabase.Query("SELECT npc_entry, spell_id, cast_flags, user_type FROM npc_spellclick_spells");
8192
8193 if (!result)
8194 {
8195 LOG_WARN("server.loading", ">> Loaded 0 spellclick spells. DB table `npc_spellclick_spells` is empty.");
8196 LOG_INFO("server.loading", " ");
8197 return;
8198 }
8199
8200 uint32 count = 0;
8201
8202 do
8203 {
8204 Field* fields = result->Fetch();
8205
8206 uint32 npc_entry = fields[0].Get<uint32>();
8207 CreatureTemplate const* cInfo = GetCreatureTemplate(npc_entry);
8208 if (!cInfo)
8209 {
8210 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown creature_template {}. Skipping entry.", npc_entry);
8211 continue;
8212 }
8213
8214 uint32 spellid = fields[1].Get<uint32>();
8215 SpellInfo const* spellinfo = sSpellMgr->GetSpellInfo(spellid);
8216 if (!spellinfo)
8217 {
8218 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown spellid {}. Skipping entry.", spellid);
8219 continue;
8220 }
8221
8222 uint8 userType = fields[3].Get<uint16>();
8223 if (userType >= SPELL_CLICK_USER_MAX)
8224 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown user type {}. Skipping entry.", uint32(userType));
8225
8226 uint8 castFlags = fields[2].Get<uint8>();
8227 SpellClickInfo info;
8228 info.spellId = spellid;
8229 info.castFlags = castFlags;
8230 info.userType = SpellClickUserTypes(userType);
8231 _spellClickInfoStore.insert(SpellClickInfoContainer::value_type(npc_entry, info));
8232
8233 ++count;
8234 } while (result->NextRow());
8235
8236 // all spellclick data loaded, now we check if there are creatures with NPC_FLAG_SPELLCLICK but with no data
8237 // NOTE: It *CAN* be the other way around: no spellclick flag but with spellclick data, in case of creature-only vehicle accessories
8239 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
8240 {
8241 if ((itr->second.npcflag & UNIT_NPC_FLAG_SPELLCLICK) && _spellClickInfoStore.find(itr->second.Entry) == _spellClickInfoStore.end())
8242 {
8243 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);
8244 const_cast<CreatureTemplate*>(&itr->second)->npcflag &= ~UNIT_NPC_FLAG_SPELLCLICK;
8245 }
8246 }
8247
8248 LOG_INFO("server.loading", ">> Loaded {} Spellclick Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8249 LOG_INFO("server.loading", " ");
8250}
SpellClickUserTypes
Definition SharedDefines.h:691
@ SPELL_CLICK_USER_MAX
Definition SharedDefines.h:696
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:343
Definition ObjectMgr.h:398
uint32 spellId
Definition ObjectMgr.h:399

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 ( )
6275{
6276 uint32 oldMSTime = getMSTime();
6277
6278 _npcTextLocaleStore.clear(); // need for reload case
6279
6280 QueryResult result = WorldDatabase.Query("SELECT ID, Locale, "
6281 // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
6282 "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 "
6283 "FROM npc_text_locale");
6284
6285 if (!result)
6286 return;
6287
6288 do
6289 {
6290 Field* fields = result->Fetch();
6291
6292 uint32 ID = fields[0].Get<uint32>();
6293
6294 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
6295 if (locale == LOCALE_enUS)
6296 continue;
6297
6299 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6300 {
6301 AddLocaleString(fields[2 + i * 2].Get<std::string>(), locale, data.Text_0[i]);
6302 AddLocaleString(fields[3 + i * 2].Get<std::string>(), locale, data.Text_1[i]);
6303 }
6304 } while (result->NextRow());
6305
6306 LOG_INFO("server.loading", ">> Loaded {} Npc Text Locale Strings in {} ms", (uint32)_npcTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6307}
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 ( )
6022{
6023 uint32 oldMSTime = getMSTime();
6024
6025 _pageTextLocaleStore.clear(); // need for reload case
6026
6027 // 0 1 2
6028 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Text FROM page_text_locale");
6029
6030 if (!result)
6031 {
6032 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text_locale` is empty!");
6033 LOG_INFO("server.loading", " ");
6034 return;
6035 }
6036
6037 do
6038 {
6039 Field* fields = result->Fetch();
6040
6041 uint32 ID = fields[0].Get<uint32>();
6042
6043 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
6044 if (locale == LOCALE_enUS)
6045 continue;
6046
6048 AddLocaleString(fields[2].Get<std::string>(), locale, data.Text);
6049 } while (result->NextRow());
6050
6051 LOG_INFO("server.loading", ">> Loaded {} Page Text Locale Strings in {} ms", (uint32)_pageTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6052}
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 ( )
5972{
5973 uint32 oldMSTime = getMSTime();
5974
5975 // 0 1 2
5976 QueryResult result = WorldDatabase.Query("SELECT ID, Text, NextPageID FROM page_text");
5977
5978 if (!result)
5979 {
5980 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text` is empty!");
5981 LOG_INFO("server.loading", " ");
5982 return;
5983 }
5984
5985 uint32 count = 0;
5986 do
5987 {
5988 Field* fields = result->Fetch();
5989
5990 PageText& pageText = _pageTextStore[fields[0].Get<uint32>()];
5991
5992 pageText.Text = fields[1].Get<std::string>();
5993 pageText.NextPage = fields[2].Get<uint32>();
5994
5995 ++count;
5996 } while (result->NextRow());
5997
5998 for (PageTextContainer::const_iterator itr = _pageTextStore.begin(); itr != _pageTextStore.end(); ++itr)
5999 {
6000 if (itr->second.NextPage)
6001 {
6002 PageTextContainer::const_iterator itr2 = _pageTextStore.find(itr->second.NextPage);
6003 if (itr2 == _pageTextStore.end())
6004 LOG_ERROR("sql.sql", "Page text (Id: {}) has not existing next page (Id: {})", itr->first, itr->second.NextPage);
6005 }
6006 }
6007
6008 LOG_INFO("server.loading", ">> Loaded {} Page Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6009 LOG_INFO("server.loading", " ");
6010}
Definition ObjectMgr.h:57
std::string Text
Definition ObjectMgr.h:58
uint32 NextPage
Definition ObjectMgr.h:59

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

◆ LoadPetLevelInfo()

void ObjectMgr::LoadPetLevelInfo ( )
3761{
3762 uint32 oldMSTime = getMSTime();
3763
3764 // 0 1 2 3 4 5 6 7 8 9 10 11
3765 QueryResult result = WorldDatabase.Query("SELECT creature_entry, level, hp, mana, str, agi, sta, inte, spi, armor, min_dmg, max_dmg FROM pet_levelstats");
3766
3767 if (!result)
3768 {
3769 LOG_WARN("server.loading", ">> Loaded 0 level pet stats definitions. DB table `pet_levelstats` is empty.");
3770 LOG_INFO("server.loading", " ");
3771 return;
3772 }
3773
3774 uint32 count = 0;
3775
3776 do
3777 {
3778 Field* fields = result->Fetch();
3779
3780 uint32 creature_id = fields[0].Get<uint32>();
3781 if (!GetCreatureTemplate(creature_id))
3782 {
3783 LOG_ERROR("sql.sql", "Wrong creature id {} in `pet_levelstats` table, ignoring.", creature_id);
3784 continue;
3785 }
3786
3787 uint32 current_level = fields[1].Get<uint8>();
3788 if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
3789 {
3790 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
3791 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `pet_levelstats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
3792 else
3793 {
3794 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `pet_levelstats` table, ignoring.", current_level);
3795 ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
3796 }
3797 continue;
3798 }
3799 else if (current_level < 1)
3800 {
3801 LOG_ERROR("sql.sql", "Wrong (<1) level {} in `pet_levelstats` table, ignoring.", current_level);
3802 continue;
3803 }
3804
3805 PetLevelInfo*& pInfoMapEntry = _petInfoStore[creature_id];
3806
3807 if (!pInfoMapEntry)
3808 pInfoMapEntry = new PetLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
3809
3810 // data for level 1 stored in [0] array element, ...
3811 PetLevelInfo* pLevelInfo = &pInfoMapEntry[current_level - 1];
3812
3813 pLevelInfo->health = fields[2].Get<uint32>();
3814 pLevelInfo->mana = fields[3].Get<uint32>();
3815 pLevelInfo->armor = fields[9].Get<uint32>();
3816 pLevelInfo->min_dmg = fields[10].Get<uint32>();
3817 pLevelInfo->max_dmg = fields[11].Get<uint32>();
3818 for (uint8 i = 0; i < MAX_STATS; i++)
3819 {
3820 pLevelInfo->stats[i] = fields[i + 4].Get<uint32>();
3821 }
3822
3823 ++count;
3824 } while (result->NextRow());
3825
3826 // Fill gaps and check integrity
3827 for (PetLevelInfoContainer::iterator itr = _petInfoStore.begin(); itr != _petInfoStore.end(); ++itr)
3828 {
3829 PetLevelInfo* pInfo = itr->second;
3830
3831 // fatal error if no level 1 data
3832 if (!pInfo || pInfo[0].health == 0)
3833 {
3834 LOG_ERROR("sql.sql", "Creature {} does not have pet stats data for Level 1!", itr->first);
3835 exit(1);
3836 }
3837
3838 // fill level gaps
3839 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
3840 {
3841 if (pInfo[level].health == 0)
3842 {
3843 LOG_ERROR("sql.sql", "Creature {} has no data for Level {} pet stats data, using data of Level {}.", itr->first, level + 1, level);
3844 pInfo[level] = pInfo[level - 1];
3845 }
3846 }
3847 }
3848
3849 LOG_INFO("server.loading", ">> Loaded {} Level Pet Stats Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3850 LOG_INFO("server.loading", " ");
3851}
#define STRONG_MAX_LEVEL
Definition DBCEnums.h:43
#define MAX_STATS
Definition SharedDefines.h:276
Definition ObjectMgr.h:528
uint32 max_dmg
Definition ObjectMgr.h:539
uint32 mana
Definition ObjectMgr.h:536
uint32 min_dmg
Definition ObjectMgr.h:538
uint32 health
Definition ObjectMgr.h:535
std::array< uint32, MAX_STATS > stats
Definition ObjectMgr.h:534
uint32 armor
Definition ObjectMgr.h:537

References _petInfoStore, PetLevelInfo::armor, CONFIG_MAX_PLAYER_LEVEL, Field::Get(), 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 ( )
7692{
7693 uint32 oldMSTime = getMSTime();
7694 // 0 1 2
7695 QueryResult result = WorldDatabase.Query("SELECT word, entry, half FROM pet_name_generation");
7696
7697 if (!result)
7698 {
7699 LOG_WARN("server.loading", ">> Loaded 0 pet name parts. DB table `pet_name_generation` is empty!");
7700 LOG_INFO("server.loading", " ");
7701 return;
7702 }
7703
7704 uint32 count = 0;
7705
7706 do
7707 {
7708 Field* fields = result->Fetch();
7709 std::string word = fields[0].Get<std::string>();
7710 uint32 entry = fields[1].Get<uint32>();
7711 bool half = fields[2].Get<bool>();
7712 if (half)
7713 _petHalfName1[entry].push_back(word);
7714 else
7715 _petHalfName0[entry].push_back(word);
7716 ++count;
7717 } while (result->NextRow());
7718
7719 LOG_INFO("server.loading", ">> Loaded {} Pet Name Parts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7720 LOG_INFO("server.loading", " ");
7721}

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

◆ LoadPetNamesLocales()

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

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

◆ LoadPetNumber()

void ObjectMgr::LoadPetNumber ( )
7724{
7725 uint32 oldMSTime = getMSTime();
7726
7727 QueryResult result = CharacterDatabase.Query("SELECT MAX(id) FROM character_pet");
7728 if (result)
7729 {
7730 Field* fields = result->Fetch();
7731 _hiPetNumber = fields[0].Get<uint32>() + 1;
7732 }
7733
7734 LOG_INFO("server.loading", ">> Loaded The Max Pet Number: {} in {} ms", _hiPetNumber - 1, GetMSTimeDiffToNow(oldMSTime));
7735 LOG_INFO("server.loading", " ");
7736}

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

◆ LoadPlayerInfo()

void ObjectMgr::LoadPlayerInfo ( )
3900{
3901 // Load playercreate
3902 {
3903 uint32 oldMSTime = getMSTime();
3904 // 0 1 2 3 4 5 6
3905 QueryResult result = WorldDatabase.Query("SELECT race, class, map, zone, position_x, position_y, position_z, orientation FROM playercreateinfo");
3906
3907 if (!result)
3908 {
3909 LOG_INFO("server.loading", " ");
3910 LOG_WARN("server.loading", ">> Loaded 0 player create definitions. DB table `playercreateinfo` is empty.");
3911 exit(1);
3912 }
3913 else
3914 {
3915 uint32 count = 0;
3916
3917 do
3918 {
3919 Field* fields = result->Fetch();
3920
3921 uint32 current_race = fields[0].Get<uint8>();
3922 uint32 current_class = fields[1].Get<uint8>();
3923 uint32 mapId = fields[2].Get<uint16>();
3924 uint32 areaId = fields[3].Get<uint32>(); // zone
3925 float positionX = fields[4].Get<float>();
3926 float positionY = fields[5].Get<float>();
3927 float positionZ = fields[6].Get<float>();
3928 float orientation = fields[7].Get<float>();
3929
3930 if (current_race >= MAX_RACES)
3931 {
3932 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo` table, ignoring.", current_race);
3933 continue;
3934 }
3935
3936 ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(current_race);
3937 if (!rEntry)
3938 {
3939 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo` table, ignoring.", current_race);
3940 continue;
3941 }
3942
3943 if (current_class >= MAX_CLASSES)
3944 {
3945 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo` table, ignoring.", current_class);
3946 continue;
3947 }
3948
3949 if (!sChrClassesStore.LookupEntry(current_class))
3950 {
3951 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo` table, ignoring.", current_class);
3952 continue;
3953 }
3954
3955 // accept DB data only for valid position (and non instanceable)
3956 if (!MapMgr::IsValidMapCoord(mapId, positionX, positionY, positionZ, orientation))
3957 {
3958 LOG_ERROR("sql.sql", "Wrong home position for class {} race {} pair in `playercreateinfo` table, ignoring.", current_class, current_race);
3959 continue;
3960 }
3961
3962 if (sMapStore.LookupEntry(mapId)->Instanceable())
3963 {
3964 LOG_ERROR("sql.sql", "Home position in instanceable map for class {} race {} pair in `playercreateinfo` table, ignoring.", current_class, current_race);
3965 continue;
3966 }
3967
3968 PlayerInfo* info = new PlayerInfo();
3969 info->mapId = mapId;
3970 info->areaId = areaId;
3971 info->positionX = positionX;
3972 info->positionY = positionY;
3973 info->positionZ = positionZ;
3974 info->orientation = orientation;
3975 info->displayId_m = rEntry->model_m;
3976 info->displayId_f = rEntry->model_f;
3977 _playerInfo[current_race][current_class] = info;
3978
3979 ++count;
3980 } while (result->NextRow());
3981
3982 LOG_INFO("server.loading", ">> Loaded {} Player Create Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3983 LOG_INFO("server.loading", " ");
3984 }
3985 }
3986
3987 // Load playercreate items
3988 LOG_INFO("server.loading", "Loading Player Create Items Data...");
3989 {
3990 uint32 oldMSTime = getMSTime();
3991 // 0 1 2 3
3992 QueryResult result = WorldDatabase.Query("SELECT race, class, itemid, amount FROM playercreateinfo_item");
3993
3994 if (!result)
3995 {
3996 LOG_WARN("server.loading", ">> Loaded 0 Custom Player Create Items. DB Table `playercreateinfo_item` Is Empty.");
3997 LOG_INFO("server.loading", " ");
3998 }
3999 else
4000 {
4001 uint32 count = 0;
4002
4003 do
4004 {
4005 Field* fields = result->Fetch();
4006
4007 uint32 current_race = fields[0].Get<uint8>();
4008 if (current_race >= MAX_RACES)
4009 {
4010 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo_item` table, ignoring.", current_race);
4011 continue;
4012 }
4013
4014 uint32 current_class = fields[1].Get<uint8>();
4015 if (current_class >= MAX_CLASSES)
4016 {
4017 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo_item` table, ignoring.", current_class);
4018 continue;
4019 }
4020
4021 uint32 item_id = fields[2].Get<uint32>();
4022
4023 if (!GetItemTemplate(item_id))
4024 {
4025 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);
4026 continue;
4027 }
4028
4029 int32 amount = fields[3].Get<int32>();
4030
4031 if (!amount)
4032 {
4033 LOG_ERROR("sql.sql", "Item id {} (class {} race {}) have amount == 0 in `playercreateinfo_item` table, ignoring.", item_id, current_race, current_class);
4034 continue;
4035 }
4036
4037 if (!current_race || !current_class)
4038 {
4039 uint32 min_race = current_race ? current_race : 1;
4040 uint32 max_race = current_race ? current_race + 1 : MAX_RACES;
4041 uint32 min_class = current_class ? current_class : 1;
4042 uint32 max_class = current_class ? current_class + 1 : MAX_CLASSES;
4043 for (uint32 r = min_race; r < max_race; ++r)
4044 for (uint32 c = min_class; c < max_class; ++c)
4045 PlayerCreateInfoAddItemHelper(r, c, item_id, amount);
4046 }
4047 else
4048 PlayerCreateInfoAddItemHelper(current_race, current_class, item_id, amount);
4049
4050 ++count;
4051 } while (result->NextRow());
4052
4053 LOG_INFO("server.loading", ">> Loaded {} Custom Player Create Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4054 LOG_INFO("server.loading", " ");
4055 }
4056 }
4057
4058 // Load playercreate skills
4059 LOG_INFO("server.loading", "Loading Player Create Skill Data...");
4060 {
4061 uint32 oldMSTime = getMSTime();
4062
4063 QueryResult result = WorldDatabase.Query("SELECT raceMask, classMask, skill, `rank` FROM playercreateinfo_skills");
4064
4065 if (!result)
4066 {
4067 LOG_WARN("server.loading", ">> Loaded 0 Player Create Skills. DB Table `playercreateinfo_skills` Is Empty.");
4068 }
4069 else
4070 {
4071 uint32 count = 0;
4072
4073 do
4074 {
4075 Field* fields = result->Fetch();
4076 uint32 raceMask = fields[0].Get<uint32>();
4077 uint32 classMask = fields[1].Get<uint32>();
4079 skill.SkillId = fields[2].Get<uint16>();
4080 skill.Rank = fields[3].Get<uint16>();
4081
4082 if (skill.Rank >= MAX_SKILL_STEP)
4083 {
4084 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);
4085 continue;
4086 }
4087
4088 if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE))
4089 {
4090 LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_skills` table, ignoring.", raceMask);
4091 continue;
4092 }
4093
4094 if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE))
4095 {
4096 LOG_ERROR("sql.sql", "Wrong class mask {} in `playercreateinfo_skills` table, ignoring.", classMask);
4097 continue;
4098 }
4099
4100 if (!sSkillLineStore.LookupEntry(skill.SkillId))
4101 {
4102 LOG_ERROR("sql.sql", "Wrong skill id {} in `playercreateinfo_skills` table, ignoring.", skill.SkillId);
4103 continue;
4104 }
4105
4106 for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
4107 {
4108 if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask))
4109 {
4110 for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
4111 {
4112 if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
4113 {
4114 if (!GetSkillRaceClassInfo(skill.SkillId, raceIndex, classIndex))
4115 continue;
4116
4117 if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
4118 {
4119 info->skills.push_back(skill);
4120 ++count;
4121 }
4122 }
4123 }
4124 }
4125 }
4126 } while (result->NextRow());
4127
4128 LOG_INFO("server.loading", ">> Loaded {} Player Create Skills in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4129 LOG_INFO("server.loading", " ");
4130 }
4131 }
4132
4133 // Load playercreate spells
4134 LOG_INFO("server.loading", "Loading Player Create Spell Data...");
4135 {
4136 uint32 oldMSTime = getMSTime();
4137
4138 QueryResult result = WorldDatabase.Query("SELECT racemask, classmask, Spell FROM playercreateinfo_spell_custom");
4139
4140 if (!result)
4141 {
4142 LOG_WARN("server.loading", ">> Loaded 0 player create spells. DB table `playercreateinfo_spell_custom` is empty.");
4143 }
4144 else
4145 {
4146 uint32 count = 0;
4147
4148 do
4149 {
4150 Field* fields = result->Fetch();
4151 uint32 raceMask = fields[0].Get<uint32>();
4152 uint32 classMask = fields[1].Get<uint32>();
4153 uint32 spellId = fields[2].Get<uint32>();
4154
4155 if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE))
4156 {
4157 LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_spell_custom` table, ignoring.", raceMask);
4158 continue;
4159 }
4160
4161 if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE))
4162 {
4163 LOG_ERROR("sql.sql", "Wrong class mask {} in `playercreateinfo_spell_custom` table, ignoring.", classMask);
4164 continue;
4165 }
4166
4167 for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
4168 {
4169 if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask))
4170 {
4171 for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
4172 {
4173 if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
4174 {
4175 if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
4176 {
4177 info->customSpells.push_back(spellId);
4178 ++count;
4179 }
4180 }
4181 }
4182 }
4183 }
4184 } while (result->NextRow());
4185
4186 LOG_INFO("server.loading", ">> Loaded {} Custom Player Create Spells in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4187 LOG_INFO("server.loading", " ");
4188 }
4189 }
4190
4191 // Load playercreate cast spell
4192 LOG_INFO("server.loading", "Loading Player Create Cast Spell Data...");
4193 {
4194 uint32 oldMSTime = getMSTime();
4195
4196 QueryResult result = WorldDatabase.Query("SELECT raceMask, classMask, spell FROM playercreateinfo_cast_spell");
4197
4198 if (!result)
4199 {
4200 LOG_WARN("server.loading", ">> Loaded 0 Player Create Cast Spells. DB Table `playercreateinfo_cast_spell` Is Empty.");
4201 }
4202 else
4203 {
4204 uint32 count = 0;
4205
4206 do
4207 {
4208 Field* fields = result->Fetch();
4209 uint32 raceMask = fields[0].Get<uint32>();
4210 uint32 classMask = fields[1].Get<uint32>();
4211 uint32 spellId = fields[2].Get<uint32>();
4212
4213 if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE))
4214 {
4215 LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_cast_spell` table, ignoring.", raceMask);
4216 continue;
4217 }
4218
4219 if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE))
4220 {
4221 LOG_ERROR("sql.sql", "Wrong class mask {} in `playercreateinfo_cast_spell` table, ignoring.", classMask);
4222 continue;
4223 }
4224
4225 for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
4226 {
4227 if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask))
4228 {
4229 for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
4230 {
4231 if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
4232 {
4233 if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
4234 {
4235 info->castSpells.push_back(spellId);
4236 ++count;
4237 }
4238 }
4239 }
4240 }
4241 }
4242 } while (result->NextRow());
4243
4244 LOG_INFO("server.loading", ">> Loaded {} Player Create Cast Spells in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4245 LOG_INFO("server.loading", " ");
4246 }
4247 }
4248
4249 // Load playercreate actions
4250 LOG_INFO("server.loading", "Loading Player Create Action Data...");
4251 {
4252 uint32 oldMSTime = getMSTime();
4253
4254 // 0 1 2 3 4
4255 QueryResult result = WorldDatabase.Query("SELECT race, class, button, action, type FROM playercreateinfo_action");
4256
4257 if (!result)
4258 {
4259 LOG_WARN("server.loading", ">> Loaded 0 Player Create Actions. DB Table `playercreateinfo_action` Is Empty.");
4260 LOG_INFO("server.loading", " ");
4261 }
4262 else
4263 {
4264 uint32 count = 0;
4265
4266 do
4267 {
4268 Field* fields = result->Fetch();
4269
4270 uint32 current_race = fields[0].Get<uint8>();
4271 if (current_race >= MAX_RACES)
4272 {
4273 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo_action` table, ignoring.", current_race);
4274 continue;
4275 }
4276
4277 uint32 current_class = fields[1].Get<uint8>();
4278 if (current_class >= MAX_CLASSES)
4279 {
4280 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo_action` table, ignoring.", current_class);
4281 continue;
4282 }
4283
4284 if (PlayerInfo* info = _playerInfo[current_race][current_class])
4285 info->action.push_back(PlayerCreateInfoAction(fields[2].Get<uint16>(), fields[3].Get<uint32>(), fields[4].Get<uint16>()));
4286
4287 ++count;
4288 } while (result->NextRow());
4289
4290 LOG_INFO("server.loading", ">> Loaded {} Player Create Actions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4291 LOG_INFO("server.loading", " ");
4292 }
4293 }
4294
4295 // Loading levels data (class/race dependent)
4296 LOG_INFO("server.loading", "Loading Player Create Level Stats Data...");
4297 {
4298 struct RaceStats
4299 {
4300 int16 StatModifier[MAX_STATS];
4301 };
4302
4303 std::array<RaceStats, MAX_RACES> raceStatModifiers;
4304
4305 uint32 oldMSTime = getMSTime();
4306
4307 // 0 1 2 3 4 5
4308 QueryResult raceStatsResult = WorldDatabase.Query("SELECT Race, Strength, Agility, Stamina, Intellect, Spirit FROM player_race_stats");
4309
4310 if (!raceStatsResult)
4311 {
4312 LOG_WARN("server.loading", ">> Loaded 0 race stats definitions. DB table `player_race_stats` is empty.");
4313 LOG_INFO("server.loading", " ");
4314 exit(1);
4315 }
4316
4317 do
4318 {
4319 Field* fields = raceStatsResult->Fetch();
4320
4321 uint32 current_race = fields[0].Get<uint8>();
4322 if (current_race >= MAX_RACES)
4323 {
4324 LOG_ERROR("sql.sql", "Wrong race {} in `player_race_stats` table, ignoring.", current_race);
4325 continue;
4326 }
4327
4328 for (uint32 i = 0; i < MAX_STATS; ++i)
4329 raceStatModifiers[current_race].StatModifier[i] = fields[i + 1].Get<int16>();
4330
4331 } while (raceStatsResult->NextRow());
4332
4333 // 0 1 2 3 4 5 6 7 8
4334 QueryResult result = WorldDatabase.Query("SELECT Class, Level, Strength, Agility, Stamina, Intellect, Spirit, BaseHP, BaseMana FROM player_class_stats");
4335
4336 if (!result)
4337 {
4338 LOG_ERROR("server.loading", ">> Loaded 0 level stats definitions. DB table `player_class_stats` is empty.");
4339 exit(1);
4340 }
4341
4342 uint32 count = 0;
4343
4344 do
4345 {
4346 Field* fields = result->Fetch();
4347
4348 uint32 current_class = fields[0].Get<uint8>();
4349 if (current_class >= MAX_CLASSES)
4350 {
4351 LOG_ERROR("sql.sql", "Wrong class {} in `player_class_stats` table, ignoring.", current_class);
4352 continue;
4353 }
4354
4355 uint32 current_level = fields[1].Get<uint8>();
4356 if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4357 {
4358 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
4359 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `player_class_stats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
4360 else
4361 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `player_class_stats` table, ignoring.", current_level);
4362
4363 continue;
4364 }
4365
4366 for (std::size_t race = 0; race < raceStatModifiers.size(); ++race)
4367 {
4368 if (PlayerInfo* info = _playerInfo[race][current_class])
4369 {
4370 if (!info->levelInfo)
4371 info->levelInfo = new PlayerLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
4372
4373 PlayerLevelInfo& levelInfo = info->levelInfo[current_level - 1];
4374 for (int i = 0; i < MAX_STATS; ++i)
4375 levelInfo.stats[i] = fields[i + 2].Get<uint16>() + raceStatModifiers[race].StatModifier[i];
4376 }
4377 }
4378
4379 PlayerClassInfo* info = _playerClassInfo[current_class];
4380 if (!info)
4381 {
4382 info = new PlayerClassInfo();
4384 _playerClassInfo[current_class] = info;
4385 }
4386
4387 PlayerClassLevelInfo& levelInfo = info->levelInfo[current_level - 1];
4388
4389 levelInfo.basehealth = fields[7].Get<uint32>();
4390 levelInfo.basemana = fields[8].Get<uint32>();
4391
4392 ++count;
4393 } while (result->NextRow());
4394
4395 // Fill gaps and check integrity
4396 for (int race = 0; race < MAX_RACES; ++race)
4397 {
4398 // skip non existed races
4399 if (!sChrRacesStore.LookupEntry(race))
4400 continue;
4401
4402 for (int class_ = 0; class_ < MAX_CLASSES; ++class_)
4403 {
4404 // skip non existed classes
4405 if (!sChrClassesStore.LookupEntry(class_))
4406 continue;
4407
4408 PlayerClassInfo* pClassInfo = _playerClassInfo[class_];
4409 PlayerInfo* info = _playerInfo[race][class_];
4410 if (!info)
4411 continue;
4412
4413 // skip expansion races if not playing with expansion
4414 if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_THE_BURNING_CRUSADE && (race == RACE_BLOODELF || race == RACE_DRAENEI))
4415 continue;
4416
4417 // skip expansion classes if not playing with expansion
4419 continue;
4420
4421 // fatal error if no initial stats data
4422 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))
4423 {
4424 LOG_ERROR("sql.sql", "Race {} class {} initial level does not have stats data!", race, class_);
4425 exit(1);
4426 }
4427
4428 // fatal error if no initial health/mana data
4429 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))
4430 {
4431 LOG_ERROR("sql.sql", "Class {} initial level does not have health/mana data!", class_);
4432 exit(1);
4433 }
4434
4435 // fill level gaps for stats
4436 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4437 {
4438 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))
4439 {
4440 LOG_ERROR("sql.sql", "Race {} class {} level {} does not have stats data. Using stats data of level {}.", race, class_, level + 1, level);
4441 info->levelInfo[level] = info->levelInfo[level - 1];
4442 }
4443 }
4444
4445 // fill level gaps for health/mana
4446 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4447 {
4448 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))
4449 {
4450 LOG_ERROR("sql.sql", "Class {} level {} does not have health/mana data. Using stats data of level {}.", class_, level + 1, level);
4451 pClassInfo->levelInfo[level] = pClassInfo->levelInfo[level - 1];
4452 }
4453 }
4454 }
4455 }
4456
4457 LOG_INFO("server.loading", ">> Loaded {} Level Stats Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4458 LOG_INFO("server.loading", " ");
4459 }
4460
4461 // Loading xp per level data
4462 LOG_INFO("server.loading", "Loading Player Create XP Data...");
4463 {
4464 uint32 oldMSTime = getMSTime();
4465
4466 _playerXPperLevel.resize(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
4467 for (uint8 level = 0; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4468 _playerXPperLevel[level] = 0;
4469
4470 // 0 1
4471 QueryResult result = WorldDatabase.Query("SELECT Level, Experience FROM player_xp_for_level");
4472
4473 if (!result)
4474 {
4475 LOG_WARN("server.loading", ">> Loaded 0 xp for level definitions. DB table `player_xp_for_level` is empty.");
4476 LOG_INFO("server.loading", " ");
4477 exit(1);
4478 }
4479
4480 uint32 count = 0;
4481
4482 do
4483 {
4484 Field* fields = result->Fetch();
4485
4486 uint32 current_level = fields[0].Get<uint8>();
4487 uint32 current_xp = fields[1].Get<uint32>();
4488
4489 if (current_level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4490 {
4491 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
4492 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `player_xp_for_level` table, ignoring.", STRONG_MAX_LEVEL, current_level);
4493 else
4494 {
4495 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `player_xp_for_levels` table, ignoring.", current_level);
4496 ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
4497 }
4498 continue;
4499 }
4500 //PlayerXPperLevel
4501 _playerXPperLevel[current_level] = current_xp;
4502 ++count;
4503 } while (result->NextRow());
4504
4505 // fill level gaps
4506 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4507 {
4508 if (_playerXPperLevel[level] == 0)
4509 {
4510 LOG_ERROR("sql.sql", "Level {} does not have XP for level data. Using data of level [{}] + 100.", level + 1, level);
4511 _playerXPperLevel[level] = _playerXPperLevel[level - 1] + 100;
4512 }
4513 }
4514
4515 LOG_INFO("server.loading", ">> Loaded {} XP For Level Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4516 LOG_INFO("server.loading", " ");
4517 }
4518}
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:1581
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:146
@ RACE_DRAENEI
Definition SharedDefines.h:81
@ RACE_BLOODELF
Definition SharedDefines.h:80
@ RACE_HUMAN
Definition SharedDefines.h:71
@ EXPANSION_THE_BURNING_CRUSADE
Definition SharedDefines.h:54
@ EXPANSION_WRATH_OF_THE_LICH_KING
Definition SharedDefines.h:55
@ CONFIG_START_HEROIC_PLAYER_LEVEL
Definition WorldConfig.h:192
@ CONFIG_START_PLAYER_LEVEL
Definition WorldConfig.h:191
@ CONFIG_EXPANSION
Definition WorldConfig.h:228
void PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count)
Definition ObjectMgr.cpp:3865
Definition DBCStructure.h:679
uint32 model_f
Definition DBCStructure.h:685
uint32 model_m
Definition DBCStructure.h:684
Definition Player.h:285
uint32 basehealth
Definition Player.h:287
uint32 basemana
Definition Player.h:288
Definition Player.h:311
Definition Player.h:323
uint16 SkillId
Definition Player.h:324
float orientation
Definition Player.h:340
uint16 displayId_m
Definition Player.h:341
float positionX
Definition Player.h:337
uint32 areaId
Definition Player.h:336
float positionY
Definition Player.h:338
float positionZ
Definition Player.h:339
uint32 mapId
Definition Player.h:335
uint16 displayId_f
Definition Player.h:342
Definition Player.h:299

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

◆ LoadPlayerShapeshiftModels()

void ObjectMgr::LoadPlayerShapeshiftModels ( )
1862{
1863 uint32 oldMSTime = getMSTime();
1864
1865 QueryResult result = WorldDatabase.Query("SELECT ShapeshiftID, RaceID, CustomizationID, GenderID, ModelID from player_shapeshift_model");
1866
1867 if (!result)
1868 {
1869 LOG_INFO("server.loading", ">> Loaded 0 player shapeshift model records. DB table `player_shapeshift_model` is empty.");
1870 return;
1871 }
1872
1873 uint32 count = 0;
1874 do
1875 {
1876 Field* fields = result->Fetch();
1877
1878 ShapeshiftForm shapeshiftForm = ShapeshiftForm(fields[0].Get<uint8>());
1879 uint8 race = fields[1].Get<uint8>();
1880 uint8 customizationID = fields[2].Get<uint8>();
1881 uint8 genderID = Gender(fields[3].Get<uint8>());
1882 uint32 modelId = fields[4].Get<uint32>();
1883
1884 ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race);
1885 if (!raceEntry)
1886 {
1887 LOG_ERROR("sql.sql", "Race {} defined in `player_shapeshift_model` does not exists, skipped.", uint32(race));
1888 continue;
1889 }
1890
1891 CreatureDisplayInfoEntry const* displayEntry = sCreatureDisplayInfoStore.LookupEntry(modelId);
1892 if (!displayEntry)
1893 {
1894 LOG_ERROR("sql.sql", "ShapeshiftForm: {}, Race: {} defined in `player_shapeshift_model` has non-existing model ({}), skipped.", shapeshiftForm, race, modelId);
1895 continue;
1896 }
1897
1898 _playerShapeshiftModel[std::make_tuple(shapeshiftForm, race, customizationID, genderID)] = modelId;
1899 ++count;
1900 } while (result->NextRow());
1901
1902 LOG_INFO("server.loading", ">> Loaded {} player totem model records in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1903 LOG_INFO("server.loading", " ");
1904}
Gender
Definition SharedDefines.h:60
ShapeshiftForm
Definition UnitDefines.h:68

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

◆ LoadPlayerTotemModels()

void ObjectMgr::LoadPlayerTotemModels ( )
1803{
1804 uint32 oldMSTime = getMSTime();
1805
1806 QueryResult result = WorldDatabase.Query("SELECT TotemID, RaceID, ModelID from player_totem_model");
1807
1808 if (!result)
1809 {
1810 LOG_INFO("server.loading", ">> Loaded 0 player totem model records. DB table `player_totem_model` is empty.");
1811 return;
1812 }
1813
1814 uint32 count = 0;
1815 do
1816 {
1817 Field* fields = result->Fetch();
1818
1819 SummonSlot totemSlot = SummonSlot(fields[0].Get<uint8>());
1820 uint8 race = fields[1].Get<uint8>();
1821 uint32 displayId = fields[2].Get<uint32>();
1822
1823 if (totemSlot < SUMMON_SLOT_TOTEM_FIRE || totemSlot >= MAX_TOTEM_SLOT)
1824 {
1825 LOG_ERROR("sql.sql", "Wrong TotemSlot {} in `player_totem_model` table, skipped.", totemSlot);
1826 continue;
1827 }
1828
1829 ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race);
1830 if (!raceEntry)
1831 {
1832 LOG_ERROR("sql.sql", "Race {} defined in `player_totem_model` does not exists, skipped.", uint32(race));
1833 continue;
1834 }
1835
1836 CreatureDisplayInfoEntry const* displayEntry = sCreatureDisplayInfoStore.LookupEntry(displayId);
1837 if (!displayEntry)
1838 {
1839 LOG_ERROR("sql.sql", "TotemSlot: {} defined in `player_totem_model` has non-existing model ({}), skipped.", totemSlot, displayId);
1840 continue;
1841 }
1842
1843 _playerTotemModel[std::make_pair(totemSlot, Races(race))] = displayId;
1844 ++count;
1845 } while (result->NextRow());
1846
1847 LOG_INFO("server.loading", ">> Loaded {} player totem model records in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1848 LOG_INFO("server.loading", " ");
1849}
#define MAX_TOTEM_SLOT
Definition SharedDefines.h:3572
SummonSlot
Definition SharedDefines.h:3560
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 ( )
494{
495 uint32 oldMSTime = getMSTime();
496
497 _pointOfInterestLocaleStore.clear(); // need for reload case
498
499 // 0 1 2
500 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name FROM points_of_interest_locale");
501
502 if (!result)
503 return;
504
505 do
506 {
507 Field* fields = result->Fetch();
508
509 uint32 ID = fields[0].Get<uint32>();
510
511 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
512 if (locale == LOCALE_enUS)
513 continue;
514
516 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
517 } while (result->NextRow());
518
519 LOG_INFO("server.loading", ">> Loaded {} Points Of Interest Locale Strings in {} ms", (uint32)_pointOfInterestLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
520}
Definition CreatureData.h:355
std::vector< std::string > Name
Definition CreatureData.h:356

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

◆ LoadPointsOfInterest()

void ObjectMgr::LoadPointsOfInterest ( )
8055{
8056 uint32 oldMSTime = getMSTime();
8057
8058 _pointsOfInterestStore.clear(); // need for reload case
8059
8060 uint32 count = 0;
8061
8062 // 0 1 2 3 4 5 6
8063 QueryResult result = WorldDatabase.Query("SELECT ID, PositionX, PositionY, Icon, Flags, Importance, Name FROM points_of_interest");
8064
8065 if (!result)
8066 {
8067 LOG_WARN("server.loading", ">> Loaded 0 Points of Interest definitions. DB table `points_of_interest` is empty.");
8068 LOG_INFO("server.loading", " ");
8069 return;
8070 }
8071
8072 do
8073 {
8074 Field* fields = result->Fetch();
8075
8076 uint32 point_id = fields[0].Get<uint32>();
8077
8078 PointOfInterest POI;
8079 POI.ID = point_id;
8080 POI.PositionX = fields[1].Get<float>();
8081 POI.PositionY = fields[2].Get<float>();
8082 POI.Icon = fields[3].Get<uint32>();
8083 POI.Flags = fields[4].Get<uint32>();
8084 POI.Importance = fields[5].Get<uint32>();
8085 POI.Name = fields[6].Get<std::string>();
8086
8087 if (!Acore::IsValidMapCoord(POI.PositionX, POI.PositionY))
8088 {
8089 LOG_ERROR("sql.sql", "Table `points_of_interest` (ID: {}) have invalid coordinates (X: {} Y: {}), ignored.", point_id, POI.PositionX, POI.PositionY);
8090 continue;
8091 }
8092
8093 _pointsOfInterestStore[point_id] = POI;
8094
8095 ++count;
8096 } while (result->NextRow());
8097
8098 LOG_INFO("server.loading", ">> Loaded {} Points of Interest Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8099 LOG_INFO("server.loading", " ");
8100}
bool IsValidMapCoord(float c)
Definition GridDefines.h:210
Definition ObjectMgr.h:588
uint32 ID
Definition ObjectMgr.h:589

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

◆ LoadProfanityNamesFromDB()

void ObjectMgr::LoadProfanityNamesFromDB ( )
8477{
8478 uint32 oldMSTime = getMSTime();
8479
8480 _profanityNamesStore.clear(); // need for reload case
8481
8482 QueryResult result = CharacterDatabase.Query("SELECT name FROM profanity_name");
8483
8484 if (!result)
8485 {
8486 LOG_WARN("server.loading", ">> Loaded 0 profanity names. DB table `profanity_name` is empty!");
8487 return;
8488 }
8489
8490 uint32 count = 0;
8491
8492 Field* fields;
8493 do
8494 {
8495 fields = result->Fetch();
8496 std::string name = fields[0].Get<std::string>();
8497
8498 std::wstring wstr;
8499 if (!Utf8toWStr (name, wstr))
8500 {
8501 LOG_ERROR("sql.sql", "Table `profanity_name` have invalid name: {}", name);
8502 continue;
8503 }
8504
8505 wstrToLower(wstr);
8506
8507 _profanityNamesStore.insert(wstr);
8508 ++count;
8509 } while (result->NextRow());
8510
8511 LOG_INFO("server.loading", ">> Loaded {} profanity names from DB in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8512}

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

◆ LoadProfanityNamesFromDBC()

void ObjectMgr::LoadProfanityNamesFromDBC ( )
8515{
8516 if (!sWorld->getBoolConfig(CONFIG_STRICT_NAMES_PROFANITY))
8517 {
8518 LOG_WARN("server.loading", ">> Loaded 0 profanity names from DBC. Config option disabled.");
8519 return;
8520 }
8521
8522 uint32 oldMSTime = getMSTime();
8523
8524 uint32 count = 0;
8525
8526 for (NamesProfanityEntry const* profanityStore : sNamesProfanityStore)
8527 {
8528 std::wstring wstr;
8529
8530 Utf8toWStr(profanityStore->Pattern, wstr);
8531
8532 // DBC does not have clean entries, remove the junk.
8533 boost::algorithm::replace_all(wstr, "\\<", "");
8534 boost::algorithm::replace_all(wstr, "\\>", "");
8535
8536 _profanityNamesStore.insert(wstr);
8537 count++;
8538 }
8539
8540 LOG_INFO("server.loading", ">> Loaded {} profanity names from DBC in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8541 LOG_INFO("server.loading", " ");
8542}
DBCStorage< NamesProfanityEntry > sNamesProfanityStore(NamesProfanityfmt)
@ CONFIG_STRICT_NAMES_PROFANITY
Definition WorldConfig.h:141
Definition DBCStructure.h:1406

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

◆ LoadQuestAreaTriggers()

void ObjectMgr::LoadQuestAreaTriggers ( )
6433{
6434 uint32 oldMSTime = getMSTime();
6435
6436 _questAreaTriggerStore.clear(); // need for reload case
6437
6438 QueryResult result = WorldDatabase.Query("SELECT id, quest FROM areatrigger_involvedrelation");
6439
6440 if (!result)
6441 {
6442 LOG_WARN("server.loading", ">> Loaded 0 quest trigger points. DB table `areatrigger_involvedrelation` is empty.");
6443 LOG_INFO("server.loading", " ");
6444 return;
6445 }
6446
6447 uint32 count = 0;
6448
6449 do
6450 {
6451 ++count;
6452
6453 Field* fields = result->Fetch();
6454
6455 uint32 trigger_ID = fields[0].Get<uint32>();
6456 uint32 quest_ID = fields[1].Get<uint32>();
6457
6458 AreaTrigger const* atEntry = GetAreaTrigger(trigger_ID);
6459 if (!atEntry)
6460 {
6461 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", trigger_ID);
6462 continue;
6463 }
6464
6465 Quest const* quest = GetQuestTemplate(quest_ID);
6466
6467 if (!quest)
6468 {
6469 LOG_ERROR("sql.sql", "Table `areatrigger_involvedrelation` has record (id: {}) for not existing quest {}", trigger_ID, quest_ID);
6470 continue;
6471 }
6472
6474 {
6475 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);
6476
6477 // this will prevent quest completing without objective
6478 const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
6479
6480 // continue; - quest modified to required objective and trigger can be allowed.
6481 }
6482
6483 _questAreaTriggerStore[trigger_ID] = quest_ID;
6484 } while (result->NextRow());
6485
6486 LOG_INFO("server.loading", ">> Loaded {} Quest Trigger Points in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6487 LOG_INFO("server.loading", " ");
6488}
@ 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 ( )
6509{
6510 uint32 oldMSTime = getMSTime();
6511
6512 _questGreetingStore.clear(); // For reload case
6513
6514 // 0 1 2 3 4
6515 QueryResult result = WorldDatabase.Query("SELECT ID, Type, GreetEmoteType, GreetEmoteDelay, Greeting FROM quest_greeting");
6516 if (!result)
6517 {
6518 LOG_WARN("server.loading", ">> Loaded 0 quest greetings. DB table `quest_greeting` is empty.");
6519 return;
6520 }
6521
6522 do
6523 {
6524 Field* fields = result->Fetch();
6525
6526 uint32 id = fields[0].Get<uint32>();
6527 uint8 type = fields[1].Get<uint8>();
6528 switch (type)
6529 {
6530 case 0: // Creature
6531 if (!GetCreatureTemplate(id))
6532 {
6533 LOG_ERROR("sql.sql", "Table `quest_greeting`: creature template entry {} does not exist.", id);
6534 continue;
6535 }
6536 break;
6537 case 1: // GameObject
6538 if (!GetGameObjectTemplate(id))
6539 {
6540 LOG_ERROR("sql.sql", "Table `quest_greeting`: gameobject template entry {} does not exist.", id);
6541 continue;
6542 }
6543 break;
6544 default:
6545 LOG_ERROR("sql.sql", "Table `quest_greeting` has unknown type {} for id {}, skipped.", type, id);
6546 continue;
6547 }
6548
6549 std::pair<uint32, uint8> pairKey = std::make_pair(id, type);
6550 QuestGreeting& data = _questGreetingStore[pairKey];
6551
6552 data.EmoteType = fields[2].Get<uint16>();
6553 data.EmoteDelay = fields[3].Get<uint32>();
6554 AddLocaleString(fields[4].Get<std::string>(), LOCALE_enUS, data.Greeting);
6555 }
6556 while (result->NextRow());
6557
6558 LOG_INFO("server.loading", ">> Loaded {} quest_greeting in {} ms", _questGreetingStore.size(), GetMSTimeDiffToNow(oldMSTime));
6559 LOG_INFO("server.loading", " ");
6560}
Definition ObjectMgr.h:599
uint32 EmoteDelay
Definition ObjectMgr.h:601
std::vector< std::string > Greeting
Definition ObjectMgr.h:602
uint16 EmoteType
Definition ObjectMgr.h:600

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

◆ LoadQuestGreetingsLocales()

void ObjectMgr::LoadQuestGreetingsLocales ( )
6563{
6564 uint32 oldMSTime = getMSTime();
6565
6566 // 0 1 2 3
6567 QueryResult result = WorldDatabase.Query("SELECT ID, Type, Locale, Greeting FROM quest_greeting_locale");
6568 if (!result)
6569 {
6570 LOG_WARN("server.loading", ">> Loaded 0 quest_greeting locales. DB table `quest_greeting_locale` is empty.");
6571 return;
6572 }
6573
6574 uint32 localeCount = 0;
6575 do
6576 {
6577 Field* fields = result->Fetch();
6578
6579 uint32 id = fields[0].Get<uint32>();
6580 uint8 type = fields[1].Get<uint8>();
6581 switch (type)
6582 {
6583 case 0: // Creature
6584 if (!GetCreatureTemplate(id))
6585 {
6586 LOG_ERROR("sql.sql", "Table `quest_greeting_locale`: creature template entry {} does not exist.", id);
6587 continue;
6588 }
6589 break;
6590 case 1: // GameObject
6591 if (!GetGameObjectTemplate(id))
6592 {
6593 LOG_ERROR("sql.sql", "Table `quest_greeting_locale`: gameobject template entry {} does not exist.", id);
6594 continue;
6595 }
6596 break;
6597 default:
6598 continue;
6599 }
6600
6601 std::pair<uint32, uint8> pairKey = std::make_pair(id, type);
6602 QuestGreeting& data = _questGreetingStore[pairKey];
6603
6604 QuestGreetingContainer::iterator qgc = _questGreetingStore.find(pairKey);
6605 if (qgc == _questGreetingStore.end())
6606 {
6607 LOG_ERROR("sql.sql", "QuestGreeting (Id: {} Type: {}) found in table `quest_greeting_locale` but does not exist in `quest_greeting`. Skipped!", id, type);
6608 continue;
6609 }
6610
6611 LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>());
6612 if (locale == LOCALE_enUS)
6613 continue;
6614
6615 AddLocaleString(fields[3].Get<std::string>(), locale, data.Greeting);
6616 localeCount++;
6617 } while (result->NextRow());
6618
6619 LOG_INFO("server.loading", ">> Loaded {} quest greeting Locale Strings in {} ms", localeCount, GetMSTimeDiffToNow(oldMSTime));
6620 LOG_INFO("server.loading", " ");
6621}

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 ( )
5393{
5394 uint32 oldMSTime = getMSTime();
5395
5396 _questLocaleStore.clear(); // need for reload case
5397
5398 // 0 1 2 3 4 5 6 7 8 9 10
5399 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Title, Details, Objectives, EndText, CompletedText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4 FROM quest_template_locale");
5400
5401 if (!result)
5402 return;
5403
5404 do
5405 {
5406 Field* fields = result->Fetch();
5407
5408 uint32 ID = fields[0].Get<uint32>();
5409
5410 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
5411 if (locale == LOCALE_enUS)
5412 continue;
5413
5414 QuestLocale& data = _questLocaleStore[ID];
5415 AddLocaleString(fields[2].Get<std::string>(), locale, data.Title);
5416 AddLocaleString(fields[3].Get<std::string>(), locale, data.Details);
5417 AddLocaleString(fields[4].Get<std::string>(), locale, data.Objectives);
5418 AddLocaleString(fields[5].Get<std::string>(), locale, data.AreaDescription);
5419 AddLocaleString(fields[6].Get<std::string>(), locale, data.CompletedText);
5420
5421 for (uint8 i = 0; i < 4; ++i)
5422 AddLocaleString(fields[i + 7].Get<std::string>(), locale, data.ObjectiveText[i]);
5423 } while (result->NextRow());
5424
5425 LOG_INFO("server.loading", ">> Loaded {} Quest Locale Strings in {} ms", (uint32)_questLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
5426}
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 ( )
10434{
10435 uint32 oldMSTime = getMSTime();
10436
10437 _questMoneyRewards.clear();
10438
10439 // 0 1 2 3 4 5 6 7 8 9 10
10440 QueryResult result = WorldDatabase.Query("SELECT `Level`, Money0, Money1, Money2, Money3, Money4, Money5, Money6, Money7, Money8, Money9 FROM `quest_money_reward` ORDER BY `Level`");
10441 if (!result)
10442 {
10443 LOG_WARN("server.loading", ">> Loaded 0 quest money rewards. DB table `quest_money_reward` is empty.");
10444 return;
10445 }
10446
10447 uint32 count = 0;
10448 do
10449 {
10450 Field* fields = result->Fetch();
10451 uint32 Level = fields[0].Get<uint32>();
10452
10453 QuestMoneyRewardArray& questMoneyReward = _questMoneyRewards[Level];
10454 questMoneyReward.fill(0);
10455
10456 for (uint8 i = 0; i < MAX_QUEST_MONEY_REWARDS; ++i)
10457 {
10458 questMoneyReward[i] = fields[1 + i].Get<uint32>();
10459 ++count;
10460 }
10461 } while (result->NextRow());
10462
10463 LOG_INFO("server.loading", ">> Loaded {} Quest Money Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10464 LOG_INFO("server.loading", " ");
10465}
std::array< uint32, MAX_QUEST_MONEY_REWARDS > QuestMoneyRewardArray
Definition ObjectMgr.h:719

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

◆ LoadQuestOfferRewardLocale()

void ObjectMgr::LoadQuestOfferRewardLocale ( )
6624{
6625 uint32 oldMSTime = getMSTime();
6626
6627 _questOfferRewardLocaleStore.clear(); // need for reload case
6628
6629 // 0 1 2
6630 QueryResult result = WorldDatabase.Query("SELECT Id, locale, RewardText FROM quest_offer_reward_locale");
6631 if (!result)
6632 return;
6633
6634 do
6635 {
6636 Field* fields = result->Fetch();
6637
6638 uint32 id = fields[0].Get<uint32>();
6639 std::string localeName = fields[1].Get<std::string>();
6640
6641 LocaleConstant locale = GetLocaleByName(localeName);
6642 if (locale == LOCALE_enUS)
6643 continue;
6644
6646 AddLocaleString(fields[2].Get<std::string>(), locale, data.RewardText);
6647 } while (result->NextRow());
6648
6649 LOG_INFO("server.loading", ">> Loaded {} Quest Offer Reward Locale Strings in {} ms", _questOfferRewardLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6650}
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 ( )
8103{
8104 if (!sWorld->getBoolConfig(CONFIG_QUEST_POI_ENABLED))
8105 {
8106 LOG_INFO("server.loading", ">> Loaded 0 quest POI definitions. Disabled by config.");
8107 LOG_INFO("server.loading", " ");
8108 return;
8109 }
8110
8111 uint32 oldMSTime = getMSTime();
8112
8113 _questPOIStore.clear(); // need for reload case
8114
8115 uint32 count = 0;
8116
8117 // 0 1 2 3 4 5 6 7
8118 QueryResult result = WorldDatabase.Query("SELECT QuestID, id, ObjectiveIndex, MapID, WorldMapAreaId, Floor, Priority, Flags FROM quest_poi order by QuestID");
8119
8120 if (!result)
8121 {
8122 LOG_WARN("server.loading", ">> Loaded 0 quest POI definitions. DB table `quest_poi` is empty.");
8123 LOG_INFO("server.loading", " ");
8124 return;
8125 }
8126
8127 // 0 1 2 3
8128 QueryResult points = WorldDatabase.Query("SELECT QuestID, Idx1, X, Y FROM quest_poi_points ORDER BY QuestID DESC, Idx2");
8129
8130 std::vector<std::vector<std::vector<QuestPOIPoint> > > POIs;
8131
8132 if (points)
8133 {
8134 // The first result should have the highest questId
8135 Field* fields = points->Fetch();
8136 uint32 questIdMax = fields[0].Get<uint32>();
8137 POIs.resize(questIdMax + 1);
8138
8139 do
8140 {
8141 fields = points->Fetch();
8142
8143 uint32 questId = fields[0].Get<uint32>();
8144 uint32 id = fields[1].Get<uint32>();
8145 int32 x = fields[2].Get<int32>();
8146 int32 y = fields[3].Get<int32>();
8147
8148 if (POIs[questId].size() <= id + 1)
8149 POIs[questId].resize(id + 10);
8150
8151 QuestPOIPoint point(x, y);
8152 POIs[questId][id].push_back(point);
8153 } while (points->NextRow());
8154 }
8155
8156 do
8157 {
8158 Field* fields = result->Fetch();
8159
8160 uint32 questId = fields[0].Get<uint32>();
8161 uint32 id = fields[1].Get<uint32>();
8162 int32 objIndex = fields[2].Get<int32>();
8163 uint32 mapId = fields[3].Get<uint32>();
8164 uint32 WorldMapAreaId = fields[4].Get<uint32>();
8165 uint32 FloorId = fields[5].Get<uint32>();
8166 uint32 unk3 = fields[6].Get<uint32>();
8167 uint32 unk4 = fields[7].Get<uint32>();
8168
8169 QuestPOI POI(id, objIndex, mapId, WorldMapAreaId, FloorId, unk3, unk4);
8170 if (questId < POIs.size() && id < POIs[questId].size())
8171 {
8172 POI.points = POIs[questId][id];
8173 _questPOIStore[questId].push_back(POI);
8174 }
8175 else
8176 LOG_ERROR("sql.sql", "Table quest_poi references unknown quest points for quest {} POI id {}", questId, id);
8177
8178 ++count;
8179 } while (result->NextRow());
8180
8181 LOG_INFO("server.loading", ">> Loaded {} Quest POI definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8182 LOG_INFO("server.loading", " ");
8183}
@ CONFIG_QUEST_POI_ENABLED
Definition WorldConfig.h:134
Definition ObjectMgr.h:638
Definition ObjectMgr.h:647

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

◆ LoadQuestRelationsHelper()

void ObjectMgr::LoadQuestRelationsHelper ( QuestRelations map,
std::string const &  table,
bool  starter,
bool  go 
)
private
8273{
8274 uint32 oldMSTime = getMSTime();
8275
8276 map.clear(); // need for reload case
8277
8278 uint32 count = 0;
8279
8280 QueryResult result = WorldDatabase.Query("SELECT id, quest, pool_entry FROM {} qr LEFT JOIN pool_quest pq ON qr.quest = pq.entry", table);
8281
8282 if (!result)
8283 {
8284 LOG_WARN("server.loading", ">> Loaded 0 quest relations from `{}`, table is empty.", table);
8285 LOG_INFO("server.loading", " ");
8286 return;
8287 }
8288
8289 PooledQuestRelation* poolRelationMap = go ? &sPoolMgr->mQuestGORelation : &sPoolMgr->mQuestCreatureRelation;
8290 if (starter)
8291 poolRelationMap->clear();
8292
8293 do
8294 {
8295 uint32 id = result->Fetch()[0].Get<uint32>();
8296 uint32 quest = result->Fetch()[1].Get<uint32>();
8297 uint32 poolId = result->Fetch()[2].Get<uint32>();
8298
8299 if (_questTemplates.find(quest) == _questTemplates.end())
8300 {
8301 LOG_ERROR("sql.sql", "Table `{}`: Quest {} listed for entry {} does not exist.", table, quest, id);
8302 continue;
8303 }
8304
8305 if (!poolId || !starter)
8306 map.insert(QuestRelations::value_type(id, quest));
8307 else if (starter)
8308 poolRelationMap->insert(PooledQuestRelation::value_type(quest, id));
8309
8310 ++count;
8311 } while (result->NextRow());
8312
8313 LOG_INFO("server.loading", ">> Loaded {} Quest Relations From {} in {} ms", count, table, GetMSTimeDiffToNow(oldMSTime));
8314 LOG_INFO("server.loading", " ");
8315}
#define sPoolMgr
Definition PoolMgr.h:163
std::multimap< uint32, uint32 > PooledQuestRelation
Definition PoolMgr.h:98

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

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

◆ LoadQuestRequestItemsLocale()

void ObjectMgr::LoadQuestRequestItemsLocale ( )
6653{
6654 uint32 oldMSTime = getMSTime();
6655
6656 _questRequestItemsLocaleStore.clear(); // need for reload case
6657
6658 // 0 1 2
6659 QueryResult result = WorldDatabase.Query("SELECT Id, locale, CompletionText FROM quest_request_items_locale");
6660 if (!result)
6661 return;
6662
6663 do
6664 {
6665 Field* fields = result->Fetch();
6666
6667 uint32 id = fields[0].Get<uint32>();
6668 std::string localeName = fields[1].Get<std::string>();
6669
6670 LocaleConstant locale = GetLocaleByName(localeName);
6671 if (locale == LOCALE_enUS)
6672 continue;
6673
6675 AddLocaleString(fields[2].Get<std::string>(), locale, data.CompletionText);
6676 } while (result->NextRow());
6677
6678 LOG_INFO("server.loading", ">> Loaded {} Quest Request Items Locale Strings in {} ms", _questRequestItemsLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6679}
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 ( )
4625{
4626 uint32 oldMSTime = getMSTime();
4627
4628 // For reload case
4629 for (QuestMap::const_iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4630 delete itr->second;
4631 _questTemplates.clear();
4632
4633 mExclusiveQuestGroups.clear();
4634
4635 QueryResult result = WorldDatabase.Query("SELECT "
4636 //0 1 2 3 4 5 6 7 8
4637 "ID, QuestType, QuestLevel, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, TimeAllowed, AllowableRaces,"
4638 // 9 10 11 12
4639 "RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, "
4640 // 13 14 15 16 17 18 19 20
4641 "RewardNextQuest, RewardXPDifficulty, RewardMoney, RewardMoneyDifficulty, RewardDisplaySpell, RewardSpell, RewardHonor, RewardKillHonor, "
4642 // 21 22 23 24 25 26
4643 "StartItem, Flags, RewardTitle, RequiredPlayerKills, RewardTalents, RewardArenaPoints, "
4644 // 27 28 29 30 31 32 33 34
4645 "RewardItem1, RewardAmount1, RewardItem2, RewardAmount2, RewardItem3, RewardAmount3, RewardItem4, RewardAmount4, "
4646 // 35 36 37 38 39 40 41 42 43 44 45 46
4647 "RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemID6, RewardChoiceItemQuantity6, "
4648 // 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
4649 "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionID5, RewardFactionValue5, RewardFactionOverride5,"
4650 // 61 63 64 65
4651 "POIContinent, POIx, POIy, POIPriority, "
4652 // 66 67 68 69 70
4653 "LogTitle, LogDescription, QuestDescription, AreaDescription, QuestCompletionLog, "
4654 // 71 72 73 74 75 76 77 78
4655 "RequiredNpcOrGo1, RequiredNpcOrGo2, RequiredNpcOrGo3, RequiredNpcOrGo4, RequiredNpcOrGoCount1, RequiredNpcOrGoCount2, RequiredNpcOrGoCount3, RequiredNpcOrGoCount4, "
4656 // 79 80 81 82 83 84 85 86
4657 "ItemDrop1, ItemDrop2, ItemDrop3, ItemDrop4, ItemDropQuantity1, ItemDropQuantity2, ItemDropQuantity3, ItemDropQuantity4, "
4658 // 87 88 89 90 91 92 93 94 95 96 97 98
4659 "RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, "
4660 // 99 100 101 102 103
4661 "Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4"
4662 " FROM quest_template");
4663 if (!result)
4664 {
4665 LOG_WARN("server.loading", ">> Loaded 0 quests definitions. DB table `quest_template` is empty.");
4666 LOG_INFO("server.loading", " ");
4667 return;
4668 }
4669
4670 // create multimap previous quest for each existed quest
4671 // some quests can have many previous maps set by NextQuestId in previous quest
4672 // for example set of race quests can lead to single not race specific quest
4673 do
4674 {
4675 Field* fields = result->Fetch();
4676
4677 Quest* newQuest = new Quest(fields);
4678 _questTemplates[newQuest->GetQuestId()] = newQuest;
4679 } while (result->NextRow());
4680
4681 // pussywizard:
4682 {
4683 uint32 max = 0;
4684 for (QuestMap::const_iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4685 if (itr->first > max)
4686 max = itr->first;
4687 if (max)
4688 {
4689 _questTemplatesFast.clear();
4690 _questTemplatesFast.resize(max + 1, nullptr);
4691 for (QuestMap::iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4692 _questTemplatesFast[itr->first] = itr->second;
4693 }
4694 }
4695
4696 for (QuestMap::iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4697 itr->second->InitializeQueryData();
4698
4699 std::map<uint32, uint32> usedMailTemplates;
4700
4701 // Load `quest_details`
4702 // 0 1 2 3 4 5 6 7 8
4703 result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4 FROM quest_details");
4704
4705 if (!result)
4706 {
4707 LOG_WARN("server.loading", ">> Loaded 0 quest details. DB table `quest_details` is empty.");
4708 }
4709 else
4710 {
4711 do
4712 {
4713 Field* fields = result->Fetch();
4714 uint32 questId = fields[0].Get<uint32>();
4715
4716 auto itr = _questTemplates.find(questId);
4717 if (itr != _questTemplates.end())
4718 itr->second->LoadQuestDetails(fields);
4719 else
4720 LOG_ERROR("sql.sql", "Table `quest_details` has data for quest {} but such quest does not exist", questId);
4721 } while (result->NextRow());
4722 }
4723
4724 // Load `quest_request_items`
4725 // 0 1 2 3
4726 result = WorldDatabase.Query("SELECT ID, EmoteOnComplete, EmoteOnIncomplete, CompletionText FROM quest_request_items");
4727
4728 if (!result)
4729 {
4730 LOG_WARN("server.loading", ">> Loaded 0 quest request items. DB table `quest_request_items` is empty.");
4731 }
4732 else
4733 {
4734 do
4735 {
4736 Field* fields = result->Fetch();
4737 uint32 questId = fields[0].Get<uint32>();
4738
4739 auto itr = _questTemplates.find(questId);
4740 if (itr != _questTemplates.end())
4741 itr->second->LoadQuestRequestItems(fields);
4742 else
4743 LOG_ERROR("sql.sql", "Table `quest_request_items` has data for quest {} but such quest does not exist", questId);
4744 } while (result->NextRow());
4745 }
4746
4747 // Load `quest_offer_reward`
4748 // 0 1 2 3 4 5 6 7 8 9
4749 result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4, RewardText FROM quest_offer_reward");
4750
4751 if (!result)
4752 {
4753 LOG_WARN("server.loading", ">> Loaded 0 quest reward emotes. DB table `quest_offer_reward` is empty.");
4754 }
4755 else
4756 {
4757 do
4758 {
4759 Field* fields = result->Fetch();
4760 uint32 questId = fields[0].Get<uint32>();
4761
4762 auto itr = _questTemplates.find(questId);
4763 if (itr != _questTemplates.end())
4764 itr->second->LoadQuestOfferReward(fields);
4765 else
4766 LOG_ERROR("sql.sql", "Table `quest_offer_reward` has data for quest {} but such quest does not exist", questId);
4767 } while (result->NextRow());
4768 }
4769
4770 // Load `quest_template_addon`
4771 // 0 1 2 3 4 5 6 7 8
4772 result = WorldDatabase.Query("SELECT ID, MaxLevel, AllowableClasses, SourceSpellID, PrevQuestID, NextQuestID, ExclusiveGroup, RewardMailTemplateID, RewardMailDelay, "
4773 //9 10 11 12 13 14 15 16 17
4774 "RequiredSkillID, RequiredSkillPoints, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, ProvidedItemCount, RewardMailSenderEntry, SpecialFlags FROM quest_template_addon LEFT JOIN quest_mail_sender ON Id=QuestId");
4775
4776 if (!result)
4777 {
4778 LOG_WARN("server.loading", ">> Loaded 0 quest template addons. DB table `quest_template_addon` is empty.");
4779 }
4780 else
4781 {
4782 do
4783 {
4784 Field* fields = result->Fetch();
4785 uint32 questId = fields[0].Get<uint32>();
4786
4787 auto itr = _questTemplates.find(questId);
4788 if (itr != _questTemplates.end())
4789 itr->second->LoadQuestTemplateAddon(fields);
4790 else
4791 LOG_ERROR("sql.sql", "Table `quest_template_addon` has data for quest {} but such quest does not exist", questId);
4792 } while (result->NextRow());
4793 }
4794
4795 // Post processing
4796 for (QuestMap::iterator iter = _questTemplates.begin(); iter != _questTemplates.end(); ++iter)
4797 {
4798 // skip post-loading checks for disabled quests
4799 if (sDisableMgr->IsDisabledFor(DISABLE_TYPE_QUEST, iter->first, nullptr))
4800 continue;
4801
4802 Quest* qinfo = iter->second;
4803
4804 // additional quest integrity checks (GO, creature_template and item_template must be loaded already)
4805
4806 if (qinfo->GetQuestMethod() >= 3)
4807 LOG_ERROR("sql.sql", "Quest {} has `Method` = {}, expected values are 0, 1 or 2.", qinfo->GetQuestId(), qinfo->GetQuestMethod());
4808
4810 {
4811 LOG_ERROR("sql.sql", "Quest {} has `SpecialFlags` = {} > max allowed value. Correct `SpecialFlags` to value <= {}",
4814 }
4815
4816 if (qinfo->Flags & QUEST_FLAGS_DAILY && qinfo->Flags & QUEST_FLAGS_WEEKLY)
4817 {
4818 LOG_ERROR("sql.sql", "Weekly Quest {} is marked as daily quest in `Flags`, removed daily flag.", qinfo->GetQuestId());
4819 qinfo->Flags &= ~QUEST_FLAGS_DAILY;
4820 }
4821
4822 if (qinfo->Flags & QUEST_FLAGS_DAILY)
4823 {
4825 {
4826 LOG_ERROR("sql.sql", "Daily Quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
4828 }
4829 }
4830
4831 if (qinfo->Flags & QUEST_FLAGS_WEEKLY)
4832 {
4834 {
4835 LOG_ERROR("sql.sql", "Weekly Quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
4837 }
4838 }
4839
4841 {
4843 {
4844 LOG_ERROR("sql.sql", "Monthly quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
4846 }
4847 }
4848
4849 if (qinfo->Flags & QUEST_FLAGS_TRACKING)
4850 {
4851 // at auto-reward can be rewarded only RewardChoiceItemId[0]
4852 for (int j = 1; j < QUEST_REWARD_CHOICES_COUNT; ++j )
4853 {
4854 if (uint32 id = qinfo->RewardChoiceItemId[j])
4855 {
4856 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but item from `RewardChoiceItemId{}` can't be rewarded with quest flag QUEST_FLAGS_TRACKING.",
4857 qinfo->GetQuestId(), j + 1, id, j + 1);
4858 // no changes, quest ignore this data
4859 }
4860 }
4861 }
4862
4863 // client quest log visual (area case)
4864 if (qinfo->ZoneOrSort > 0)
4865 {
4866 if (!sAreaTableStore.LookupEntry(qinfo->ZoneOrSort))
4867 {
4868 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} (zone case) but zone with this id does not exist.",
4869 qinfo->GetQuestId(), qinfo->ZoneOrSort);
4870 // no changes, quest not dependent from this value but can have problems at client
4871 }
4872 }
4873 // client quest log visual (sort case)
4874 if (qinfo->ZoneOrSort < 0)
4875 {
4876 QuestSortEntry const* qSort = sQuestSortStore.LookupEntry(-int32(qinfo->ZoneOrSort));
4877 if (!qSort)
4878 {
4879 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} (sort case) but quest sort with this id does not exist.",
4880 qinfo->GetQuestId(), qinfo->ZoneOrSort);
4881 // 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)
4882 }
4883 //check for proper RequiredSkillId value (skill case)
4884 if (uint32 skill_id = SkillByQuestSort(-int32(qinfo->ZoneOrSort)))
4885 {
4886 if (qinfo->RequiredSkillId != skill_id)
4887 {
4888 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} but `RequiredSkillId` does not have a corresponding value ({}).",
4889 qinfo->GetQuestId(), qinfo->ZoneOrSort, skill_id);
4890 //override, and force proper value here?
4891 }
4892 }
4893 }
4894
4895 // RequiredClasses, can be 0/CLASSMASK_ALL_PLAYABLE to allow any class
4896 if (qinfo->RequiredClasses)
4897 {
4899 {
4900 LOG_ERROR("sql.sql", "Quest {} does not contain any playable classes in `RequiredClasses` ({}), value set to 0 (all classes).", qinfo->GetQuestId(), qinfo->RequiredClasses);
4901 qinfo->RequiredClasses = 0;
4902 }
4903 }
4904 // AllowableRaces, can be 0/RACEMASK_ALL_PLAYABLE to allow any race
4905 if (qinfo->AllowableRaces)
4906 {
4907 if (!(qinfo->AllowableRaces & RACEMASK_ALL_PLAYABLE))
4908 {
4909 LOG_ERROR("sql.sql", "Quest {} does not contain any playable races in `AllowableRaces` ({}), value set to 0 (all races).", qinfo->GetQuestId(), qinfo->AllowableRaces);
4910 qinfo->AllowableRaces = 0;
4911 }
4912 }
4913 // RequiredSkillId, can be 0
4914 if (qinfo->RequiredSkillId)
4915 {
4916 if (!sSkillLineStore.LookupEntry(qinfo->RequiredSkillId))
4917 {
4918 LOG_ERROR("sql.sql", "Quest {} has `RequiredSkillId` = {} but this skill does not exist",
4919 qinfo->GetQuestId(), qinfo->RequiredSkillId);
4920 }
4921 }
4922
4923 if (qinfo->RequiredSkillPoints)
4924 {
4925 if (qinfo->RequiredSkillPoints > sWorld->GetConfigMaxSkillValue())
4926 {
4927 LOG_ERROR("sql.sql", "Quest {} has `RequiredSkillPoints` = {} but max possible skill is {}, quest can't be done.",
4928 qinfo->GetQuestId(), qinfo->RequiredSkillPoints, sWorld->GetConfigMaxSkillValue());
4929 // no changes, quest can't be done for this requirement
4930 }
4931 }
4932 // else Skill quests can have 0 skill level, this is ok
4933
4934 if (qinfo->RequiredFactionId2 && !sFactionStore.LookupEntry(qinfo->RequiredFactionId2))
4935 {
4936 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionId2` = {} but faction template {} does not exist, quest can't be done.",
4937 qinfo->GetQuestId(), qinfo->RequiredFactionId2, qinfo->RequiredFactionId2);
4938 // no changes, quest can't be done for this requirement
4939 }
4940
4941 if (qinfo->RequiredFactionId1 && !sFactionStore.LookupEntry(qinfo->RequiredFactionId1))
4942 {
4943 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionId1` = {} but faction template {} does not exist, quest can't be done.",
4944 qinfo->GetQuestId(), qinfo->RequiredFactionId1, qinfo->RequiredFactionId1);
4945 // no changes, quest can't be done for this requirement
4946 }
4947
4948 if (qinfo->RequiredMinRepFaction && !sFactionStore.LookupEntry(qinfo->RequiredMinRepFaction))
4949 {
4950 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepFaction` = {} but faction template {} does not exist, quest can't be done.",
4951 qinfo->GetQuestId(), qinfo->RequiredMinRepFaction, qinfo->RequiredMinRepFaction);
4952 // no changes, quest can't be done for this requirement
4953 }
4954
4955 if (qinfo->RequiredMaxRepFaction && !sFactionStore.LookupEntry(qinfo->RequiredMaxRepFaction))
4956 {
4957 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepFaction` = {} but faction template {} does not exist, quest can't be done.",
4958 qinfo->GetQuestId(), qinfo->RequiredMaxRepFaction, qinfo->RequiredMaxRepFaction);
4959 // no changes, quest can't be done for this requirement
4960 }
4961
4963 {
4964 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepValue` = {} but max reputation is {}, quest can't be done.",
4966 // no changes, quest can't be done for this requirement
4967 }
4968
4969 if (qinfo->RequiredMinRepValue && qinfo->RequiredMaxRepValue && qinfo->RequiredMaxRepValue <= qinfo->RequiredMinRepValue)
4970 {
4971 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepValue` = {} and `RequiredMinRepValue` = {}, quest can't be done.",
4972 qinfo->GetQuestId(), qinfo->RequiredMaxRepValue, qinfo->RequiredMinRepValue);
4973 // no changes, quest can't be done for this requirement
4974 }
4975
4976 if (!qinfo->RequiredFactionId1 && qinfo->RequiredFactionValue1 != 0)
4977 {
4978 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionValue1` = {} but `RequiredFactionId1` is 0, value has no effect",
4979 qinfo->GetQuestId(), qinfo->RequiredFactionValue1);
4980 // warning
4981 }
4982
4983 if (!qinfo->RequiredFactionId2 && qinfo->RequiredFactionValue2 != 0)
4984 {
4985 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionValue2` = {} but `RequiredFactionId2` is 0, value has no effect",
4986 qinfo->GetQuestId(), qinfo->RequiredFactionValue2);
4987 // warning
4988 }
4989
4990 if (!qinfo->RequiredMinRepFaction && qinfo->RequiredMinRepValue != 0)
4991 {
4992 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepValue` = {} but `RequiredMinRepFaction` is 0, value has no effect",
4993 qinfo->GetQuestId(), qinfo->RequiredMinRepValue);
4994 // warning
4995 }
4996
4997 if (!qinfo->RequiredMaxRepFaction && qinfo->RequiredMaxRepValue != 0)
4998 {
4999 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepValue` = {} but `RequiredMaxRepFaction` is 0, value has no effect",
5000 qinfo->GetQuestId(), qinfo->RequiredMaxRepValue);
5001 // warning
5002 }
5003
5004 if (qinfo->RewardTitleId && !sCharTitlesStore.LookupEntry(qinfo->RewardTitleId))
5005 {
5006 LOG_ERROR("sql.sql", "Quest {} has `RewardTitleId` = {} but CharTitle Id {} does not exist, quest can't be rewarded with title.",
5007 qinfo->GetQuestId(), qinfo->GetCharTitleId(), qinfo->GetCharTitleId());
5008 qinfo->RewardTitleId = 0;
5009 // quest can't reward this title
5010 }
5011
5012 if (qinfo->StartItem)
5013 {
5014 if (!GetItemTemplate(qinfo->StartItem))
5015 {
5016 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = {} but item with entry {} does not exist, quest can't be done.",
5017 qinfo->GetQuestId(), qinfo->StartItem, qinfo->StartItem);
5018 qinfo->StartItem = 0; // quest can't be done for this requirement
5019 }
5020 else if (qinfo->StartItemCount == 0)
5021 {
5022 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = {} but `StartItemCount` = 0, set to 1 but need fix in DB.",
5023 qinfo->GetQuestId(), qinfo->StartItem);
5024 qinfo->StartItemCount = 1; // update to 1 for allow quest work for backward compatibility with DB
5025 }
5026 }
5027 else if (qinfo->StartItemCount > 0)
5028 {
5029 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = 0 but `StartItemCount` = {}, useless value.",
5030 qinfo->GetQuestId(), qinfo->StartItemCount);
5031 qinfo->StartItemCount = 0; // no quest work changes in fact
5032 }
5033
5034 if (qinfo->SourceSpellid)
5035 {
5036 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->SourceSpellid);
5037 if (!spellInfo)
5038 {
5039 LOG_ERROR("sql.sql", "Quest {} has `SourceSpellid` = {} but spell {} doesn't exist, quest can't be done.",
5040 qinfo->GetQuestId(), qinfo->SourceSpellid, qinfo->SourceSpellid);
5041 qinfo->SourceSpellid = 0; // quest can't be done for this requirement
5042 }
5043 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5044 {
5045 LOG_ERROR("sql.sql", "Quest {} has `SourceSpellid` = {} but spell {} is broken, quest can't be done.",
5046 qinfo->GetQuestId(), qinfo->SourceSpellid, qinfo->SourceSpellid);
5047 qinfo->SourceSpellid = 0; // quest can't be done for this requirement
5048 }
5049 }
5050
5051 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
5052 {
5053 uint32 id = qinfo->RequiredItemId[j];
5054 if (id)
5055 {
5056 if (qinfo->RequiredItemCount[j] == 0)
5057 {
5058 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = {} but `RequiredItemCount{}` = 0, quest can't be done.",
5059 qinfo->GetQuestId(), j + 1, id, j + 1);
5060 // no changes, quest can't be done for this requirement
5061 }
5062
5064
5065 if (!GetItemTemplate(id))
5066 {
5067 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = {} but item with entry {} does not exist, quest can't be done.",
5068 qinfo->GetQuestId(), j + 1, id, id);
5069 qinfo->RequiredItemCount[j] = 0; // prevent incorrect work of quest
5070 }
5071 }
5072 else if (qinfo->RequiredItemCount[j] > 0)
5073 {
5074 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = 0 but `RequiredItemCount{}` = {}, quest can't be done.",
5075 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RequiredItemCount[j]);
5076 qinfo->RequiredItemCount[j] = 0; // prevent incorrect work of quest
5077 }
5078 }
5079
5080 for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
5081 {
5082 uint32 id = qinfo->ItemDrop[j];
5083 if (id)
5084 {
5085 if (!GetItemTemplate(id))
5086 {
5087 LOG_ERROR("sql.sql", "Quest {} has `ItemDrop{}` = {} but item with entry {} does not exist, quest can't be done.",
5088 qinfo->GetQuestId(), j + 1, id, id);
5089 // no changes, quest can't be done for this requirement
5090 }
5091 }
5092 else
5093 {
5094 if (qinfo->ItemDropQuantity[j] > 0)
5095 {
5096 LOG_ERROR("sql.sql", "Quest {} has `ItemDrop{}` = 0 but `ItemDropQuantity{}` = {}.",
5097 qinfo->GetQuestId(), j + 1, j + 1, qinfo->ItemDropQuantity[j]);
5098 // no changes, quest ignore this data
5099 }
5100 }
5101 }
5102
5103 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
5104 {
5105 int32 id = qinfo->RequiredNpcOrGo[j];
5106 if (id < 0 && !GetGameObjectTemplate(-id))
5107 {
5108 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but gameobject {} does not exist, quest can't be done.",
5109 qinfo->GetQuestId(), j + 1, id, uint32(-id));
5110 qinfo->RequiredNpcOrGo[j] = 0; // quest can't be done for this requirement
5111 }
5112
5113 if (id > 0 && !GetCreatureTemplate(id))
5114 {
5115 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but creature with entry {} does not exist, quest can't be done.",
5116 qinfo->GetQuestId(), j + 1, id, uint32(id));
5117 qinfo->RequiredNpcOrGo[j] = 0; // quest can't be done for this requirement
5118 }
5119
5120 if (id)
5121 {
5122 // In fact SpeakTo and Kill are quite same: either you can speak to mob:SpeakTo or you can't:Kill/Cast
5123
5125
5126 if (!qinfo->RequiredNpcOrGoCount[j])
5127 {
5128 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but `RequiredNpcOrGoCount{}` = 0, quest can't be done.",
5129 qinfo->GetQuestId(), j + 1, id, j + 1);
5130 // no changes, quest can be incorrectly done, but we already report this
5131 }
5132 }
5133 else if (qinfo->RequiredNpcOrGoCount[j] > 0)
5134 {
5135 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = 0 but `RequiredNpcOrGoCount{}` = {}.",
5136 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RequiredNpcOrGoCount[j]);
5137 // no changes, quest ignore this data
5138 }
5139 }
5140
5141 for (uint8 j = 0; j < QUEST_REWARD_CHOICES_COUNT; ++j)
5142 {
5143 uint32 id = qinfo->RewardChoiceItemId[j];
5144 if (id)
5145 {
5146 if (!GetItemTemplate(id))
5147 {
5148 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but item with entry {} does not exist, quest will not reward this item.",
5149 qinfo->GetQuestId(), j + 1, id, id);
5150 qinfo->RewardChoiceItemId[j] = 0; // no changes, quest will not reward this
5151 }
5152
5153 if (!qinfo->RewardChoiceItemCount[j])
5154 {
5155 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but `RewardChoiceItemCount{}` = 0, quest can't be done.",
5156 qinfo->GetQuestId(), j + 1, id, j + 1);
5157 // no changes, quest can't be done
5158 }
5159 }
5160 else if (qinfo->RewardChoiceItemCount[j] > 0)
5161 {
5162 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = 0 but `RewardChoiceItemCount{}` = {}.",
5163 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardChoiceItemCount[j]);
5164 // no changes, quest ignore this data
5165 }
5166 }
5167
5168 for (uint8 j = 0; j < QUEST_REWARDS_COUNT; ++j)
5169 {
5170 if (!qinfo->RewardItemId[0] && qinfo->RewardItemId[j])
5171 {
5172 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId1` but has `RewardItem{}`. Reward item will not be loaded.",
5173 qinfo->GetQuestId(), j + 1);
5174 }
5175 if (!qinfo->RewardItemId[1] && j > 1 && qinfo->RewardItemId[j])
5176 {
5177 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId2` but has `RewardItem{}`. Reward item will not be loaded.",
5178 qinfo->GetQuestId(), j + 1);
5179 }
5180 if (!qinfo->RewardItemId[2] && j > 2 && qinfo->RewardItemId[j])
5181 {
5182 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId3` but has `RewardItem{}`. Reward item will not be loaded.",
5183 qinfo->GetQuestId(), j + 1);
5184 }
5185 }
5186
5187 for (uint8 j = 0; j < QUEST_REWARDS_COUNT; ++j)
5188 {
5189 uint32 id = qinfo->RewardItemId[j];
5190 if (id)
5191 {
5192 if (!GetItemTemplate(id))
5193 {
5194 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = {} but item with entry {} does not exist, quest will not reward this item.",
5195 qinfo->GetQuestId(), j + 1, id, id);
5196 qinfo->RewardItemId[j] = 0; // no changes, quest will not reward this item
5197 }
5198
5199 if (!qinfo->RewardItemIdCount[j])
5200 {
5201 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = {} but `RewardItemIdCount{}` = 0, quest will not reward this item.",
5202 qinfo->GetQuestId(), j + 1, id, j + 1);
5203 // no changes
5204 }
5205 }
5206 else if (qinfo->RewardItemIdCount[j] > 0)
5207 {
5208 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = 0 but `RewardItemIdCount{}` = {}.",
5209 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardItemIdCount[j]);
5210 // no changes, quest ignore this data
5211 }
5212 }
5213
5214 for (uint8 j = 0; j < QUEST_REPUTATIONS_COUNT; ++j)
5215 {
5216 if (qinfo->RewardFactionId[j])
5217 {
5218 if (std::abs(qinfo->RewardFactionValueId[j]) > 9)
5219 {
5220 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]);
5221 }
5222 if (!sFactionStore.LookupEntry(qinfo->RewardFactionId[j]))
5223 {
5224 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]);
5225 qinfo->RewardFactionId[j] = 0; // quest will not reward this
5226 }
5227 }
5228
5229 else if (qinfo->RewardFactionValueIdOverride[j] != 0)
5230 {
5231 LOG_ERROR("sql.sql", "Quest {} has `RewardFactionId{}` = 0 but `RewardFactionValueIdOverride{}` = {}.",
5232 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardFactionValueIdOverride[j]);
5233 // no changes, quest ignore this data
5234 }
5235 }
5236
5237 if (qinfo->RewardDisplaySpell)
5238 {
5239 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardDisplaySpell);
5240
5241 if (!spellInfo)
5242 {
5243 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} does not exist, spell removed as display reward.",
5244 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5245 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5246 }
5247
5248 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5249 {
5250 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is broken, quest will not have a spell reward.",
5251 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5252 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5253 }
5254
5255 else if (GetTalentSpellCost(qinfo->RewardDisplaySpell))
5256 {
5257 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is talent, quest will not have a spell reward.",
5258 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5259 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5260 }
5261 }
5262
5263 if (qinfo->RewardSpell > 0)
5264 {
5265 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardSpell);
5266
5267 if (!spellInfo)
5268 {
5269 LOG_ERROR("sql.sql", "Quest {} has `RewardSpell` = {} but spell {} does not exist, quest will not have a spell reward.",
5270 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5271 qinfo->RewardSpell = 0; // no spell will be casted on player
5272 }
5273
5274 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5275 {
5276 LOG_ERROR("sql.sql", "Quest {} has `RewardSpell` = {} but spell {} is broken, quest will not have a spell reward.",
5277 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5278 qinfo->RewardSpell = 0; // no spell will be casted on player
5279 }
5280
5281 else if (GetTalentSpellCost(qinfo->RewardSpell))
5282 {
5283 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is talent, quest will not have a spell reward.",
5284 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5285 qinfo->RewardSpell = 0; // no spell will be casted on player
5286 }
5287 }
5288
5289 if (qinfo->RewardMailTemplateId)
5290 {
5291 if (!sMailTemplateStore.LookupEntry(qinfo->RewardMailTemplateId))
5292 {
5293 LOG_ERROR("sql.sql", "Quest {} has `RewardMailTemplateId` = {} but mail template {} does not exist, quest will not have a mail reward.",
5294 qinfo->GetQuestId(), qinfo->RewardMailTemplateId, qinfo->RewardMailTemplateId);
5295 qinfo->RewardMailTemplateId = 0; // no mail will send to player
5296 qinfo->RewardMailDelay = 0; // no mail will send to player
5297 qinfo->RewardMailSenderEntry = 0;
5298 }
5299 else if (usedMailTemplates.find(qinfo->RewardMailTemplateId) != usedMailTemplates.end())
5300 {
5301 std::map<uint32, uint32>::const_iterator used_mt_itr = usedMailTemplates.find(qinfo->RewardMailTemplateId);
5302 LOG_ERROR("sql.sql", "Quest {} has `RewardMailTemplateId` = {} but mail template {} already used for quest {}, quest will not have a mail reward.",
5303 qinfo->GetQuestId(), qinfo->RewardMailTemplateId, qinfo->RewardMailTemplateId, used_mt_itr->second);
5304 qinfo->RewardMailTemplateId = 0; // no mail will send to player
5305 qinfo->RewardMailDelay = 0; // no mail will send to player
5306 qinfo->RewardMailSenderEntry = 0;
5307 }
5308 else
5309 usedMailTemplates[qinfo->RewardMailTemplateId] = qinfo->GetQuestId();
5310 }
5311
5312 if (qinfo->RewardNextQuest)
5313 {
5314 QuestMap::iterator qNextItr = _questTemplates.find(qinfo->RewardNextQuest);
5315 if (qNextItr == _questTemplates.end())
5316 {
5317 LOG_ERROR("sql.sql", "Quest {} has `RewardNextQuest` = {} but quest {} does not exist, quest chain will not work.",
5318 qinfo->GetQuestId(), qinfo->RewardNextQuest, qinfo->RewardNextQuest);
5319 qinfo->RewardNextQuest = 0;
5320 }
5321 else
5322 qNextItr->second->prevChainQuests.push_back(qinfo->GetQuestId());
5323 }
5324
5325 // fill additional data stores
5326 if (qinfo->PrevQuestId)
5327 {
5328 if (_questTemplates.find(std::abs(qinfo->GetPrevQuestId())) == _questTemplates.end())
5329 {
5330 LOG_ERROR("sql.sql", "Quest {} has PrevQuestId {}, but no such quest", qinfo->GetQuestId(), qinfo->GetPrevQuestId());
5331 }
5332 else
5333 {
5334 qinfo->prevQuests.push_back(qinfo->PrevQuestId);
5335 }
5336 }
5337
5338 if (qinfo->NextQuestId)
5339 {
5340 QuestMap::iterator qNextItr = _questTemplates.find(qinfo->GetNextQuestId());
5341 if (qNextItr == _questTemplates.end())
5342 {
5343 LOG_ERROR("sql.sql", "Quest {} has NextQuestId {}, but no such quest", qinfo->GetQuestId(), qinfo->GetNextQuestId());
5344 }
5345 else
5346 qNextItr->second->prevQuests.push_back(static_cast<int32>(qinfo->GetQuestId()));
5347 }
5348
5349 if (qinfo->ExclusiveGroup)
5350 mExclusiveQuestGroups.insert(std::pair<int32, uint32>(qinfo->ExclusiveGroup, qinfo->GetQuestId()));
5351 if (qinfo->TimeAllowed)
5353 if (qinfo->RequiredPlayerKills)
5355 }
5356
5357 // check QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT for spell with SPELL_EFFECT_QUEST_COMPLETE
5358 for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
5359 {
5360 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i);
5361 if (!spellInfo)
5362 continue;
5363
5364 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
5365 {
5366 if (spellInfo->Effects[j].Effect != SPELL_EFFECT_QUEST_COMPLETE)
5367 continue;
5368
5369 uint32 quest_id = spellInfo->Effects[j].MiscValue;
5370
5371 Quest const* quest = GetQuestTemplate(quest_id);
5372
5373 // some quest referenced in spells not exist (outdated spells)
5374 if (!quest)
5375 continue;
5376
5378 {
5379 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);
5380
5381 // this will prevent quest completing without objective
5382 // xinef: remove this, leave error but do not break the quest
5383 // const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
5384 }
5385 }
5386 }
5387
5388 LOG_INFO("server.loading", ">> Loaded {} Quests Definitions in {} ms", (unsigned long)_questTemplates.size(), GetMSTimeDiffToNow(oldMSTime));
5389 LOG_INFO("server.loading", " ");
5390}
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:805
uint32 SkillByQuestSort(int32 QuestSort)
Definition SharedDefines.h:3290
ExclusiveQuestGroups mExclusiveQuestGroups
Definition ObjectMgr.h:1146
uint32 ItemDropQuantity[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition QuestDef.h:303
uint32 RewardMailDelay
Definition QuestDef.h:394
uint32 RewardMailSenderEntry
Definition QuestDef.h:402
int32 RequiredNpcOrGo[QUEST_OBJECTIVES_COUNT]
Definition QuestDef.h:304
uint32 RequiredMaxRepFaction
Definition QuestDef.h:399
uint32 SourceSpellid
Definition QuestDef.h:389
uint32 RequiredMinRepFaction
Definition QuestDef.h:397
int32 RequiredFactionValue2
Definition QuestDef.h:355
int32 RequiredFactionValue1
Definition QuestDef.h:353
int32 ZoneOrSort
Definition QuestDef.h:347
uint32 RequiredNpcOrGoCount[QUEST_OBJECTIVES_COUNT]
Definition QuestDef.h:305
uint32 StartItemCount
Definition QuestDef.h:401
void SetSpecialFlag(uint32 flag)
Definition QuestDef.h:225
uint32 GetCharTitleId() const
Definition QuestDef.h:253
uint32 RewardTitleId
Definition QuestDef.h:359
uint32 RewardItemIdCount[QUEST_REWARDS_COUNT]
Definition QuestDef.h:309
uint32 RewardChoiceItemId[QUEST_REWARD_CHOICES_COUNT]
Definition QuestDef.h:306
uint32 NextQuestId
Definition QuestDef.h:391
uint32 RewardMailTemplateId
Definition QuestDef.h:393
uint32 ItemDrop[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition QuestDef.h:302
int32 RewardFactionValueIdOverride[QUEST_REPUTATIONS_COUNT]
Definition QuestDef.h:312
uint32 RequiredSkillPoints
Definition QuestDef.h:396
int32 RewardSpell
Definition QuestDef.h:378
uint32 RewardChoiceItemCount[QUEST_REWARD_CHOICES_COUNT]
Definition QuestDef.h:307
uint32 AllowableRaces
Definition QuestDef.h:351
uint32 RewardNextQuest
Definition QuestDef.h:363
uint32 RequiredPlayerKills
Definition QuestDef.h:360
int32 GetPrevQuestId() const
Definition QuestDef.h:249
uint32 StartItem
Definition QuestDef.h:365
uint32 GetQuestId() const
Definition QuestDef.h:228
int32 RequiredMaxRepValue
Definition QuestDef.h:400
uint32 RequiredClasses
Definition QuestDef.h:388
uint32 Flags
Definition QuestDef.h:358
uint32 RequiredItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition QuestDef.h:301
uint32 TimeAllowed
Definition QuestDef.h:357
uint32 RequiredFactionId1
Definition QuestDef.h:352
uint32 RequiredFactionId2
Definition QuestDef.h:354
PrevQuests prevQuests
Definition QuestDef.h:324
uint32 RewardDisplaySpell
Definition QuestDef.h:377
uint32 RequiredItemId[QUEST_ITEM_OBJECTIVES_COUNT]
Definition QuestDef.h:300
int32 PrevQuestId
Definition QuestDef.h:390
uint32 GetNextQuestId() const
Definition QuestDef.h:250
uint32 RewardFactionId[QUEST_REPUTATIONS_COUNT]
Definition QuestDef.h:310
int32 ExclusiveGroup
Definition QuestDef.h:392
uint32 RequiredSkillId
Definition QuestDef.h:395
int32 RewardFactionValueId[QUEST_REPUTATIONS_COUNT]
Definition QuestDef.h:311
uint32 RewardItemId[QUEST_REWARDS_COUNT]
Definition QuestDef.h:308
uint32 GetQuestMethod() const
Definition QuestDef.h:229
int32 RequiredMinRepValue
Definition QuestDef.h:398
uint32 SpecialFlags
Definition QuestDef.h:403
static const int32 Reputation_Cap
Definition ReputationMgr.h:67
Definition DBCStructure.h:1446

References _questTemplates, _questTemplatesFast, Quest::AllowableRaces, CLASSMASK_ALL_PLAYABLE, SpellMgr::ComputeIsSpellValid(), DISABLE_TYPE_QUEST, SpellInfo::Effects, Quest::ExclusiveGroup, Quest::Flags, Field::Get(), Quest::GetCharTitleId(), GetCreatureTemplate(), 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, RACEMASK_ALL_PLAYABLE, ReputationMgr::Reputation_Cap, Quest::RequiredClasses, Quest::RequiredFactionId1, Quest::RequiredFactionId2, Quest::RequiredFactionValue1, Quest::RequiredFactionValue2, Quest::RequiredItemCount, Quest::RequiredItemId, Quest::RequiredMaxRepFaction, Quest::RequiredMaxRepValue, Quest::RequiredMinRepFaction, Quest::RequiredMinRepValue, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, Quest::RequiredPlayerKills, Quest::RequiredSkillId, Quest::RequiredSkillPoints, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, Quest::RewardDisplaySpell, Quest::RewardFactionId, Quest::RewardFactionValueId, Quest::RewardFactionValueIdOverride, Quest::RewardItemId, Quest::RewardItemIdCount, Quest::RewardMailDelay, Quest::RewardMailSenderEntry, Quest::RewardMailTemplateId, Quest::RewardNextQuest, Quest::RewardSpell, Quest::RewardTitleId, sAreaTableStore, sCharTitlesStore, sDisableMgr, Quest::SetSpecialFlag(), sFactionStore, SkillByQuestSort(), sMailTemplateStore, Quest::SourceSpellid, Quest::SpecialFlags, SPELL_EFFECT_QUEST_COMPLETE, sQuestSortStore, sSkillLineStore, sSpellMgr, Quest::StartItem, Quest::StartItemCount, sWorld, Quest::TimeAllowed, WorldDatabase, and Quest::ZoneOrSort.

◆ LoadQuestStartersAndEnders()

void ObjectMgr::LoadQuestStartersAndEnders ( )
inline
957 {
958 LOG_INFO("server.loading", "Loading GO Start Quest Data...");
960 LOG_INFO("server.loading", "Loading GO End Quest Data...");
962 LOG_INFO("server.loading", "Loading Creature Start Quest Data...");
964 LOG_INFO("server.loading", "Loading Creature End Quest Data...");
966 }
void LoadCreatureQuestEnders()
Definition ObjectMgr.cpp:8359
void LoadGameobjectQuestEnders()
Definition ObjectMgr.cpp:8331
void LoadGameobjectQuestStarters()
Definition ObjectMgr.cpp:8317
void LoadCreatureQuestStarters()
Definition ObjectMgr.cpp:8345

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

◆ LoadReferenceVendor()

int ObjectMgr::LoadReferenceVendor ( int32  vendor,
int32  item_id,
std::set< uint32 > *  skip_vendors 
)
9440{
9441 // find all items from the reference vendor
9443 stmt->SetData(0, uint32(item));
9444 PreparedQueryResult result = WorldDatabase.Query(stmt);
9445
9446 if (!result)
9447 return 0;
9448
9449 uint32 count = 0;
9450 do
9451 {
9452 Field* fields = result->Fetch();
9453
9454 int32 item_id = fields[0].Get<int32>();
9455
9456 // if item is a negative, its a reference
9457 if (item_id < 0)
9458 count += LoadReferenceVendor(vendor, -item_id, skip_vendors);
9459 else
9460 {
9461 int32 maxcount = fields[1].Get<uint8>();
9462 uint32 incrtime = fields[2].Get<uint32>();
9463 uint32 ExtendedCost = fields[3].Get<uint32>();
9464
9465 if (!IsVendorItemValid(vendor, item_id, maxcount, incrtime, ExtendedCost, nullptr, skip_vendors))
9466 continue;
9467
9468 VendorItemData& vList = _cacheVendorItemStore[vendor];
9469
9470 vList.AddItem(item_id, maxcount, incrtime, ExtendedCost);
9471 ++count;
9472 }
9473 } while (result->NextRow());
9474
9475 return count;
9476}
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, int32 maxcount, uint32 ptime, uint32 ExtendedCost, Player *player=nullptr, std::set< uint32 > *skip_vendors=nullptr, uint32 ORnpcflag=0) const
Definition ObjectMgr.cpp:9679
int LoadReferenceVendor(int32 vendor, int32 item_id, std::set< uint32 > *skip_vendors)
Definition ObjectMgr.cpp:9439

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 ( )
7864{
7865 uint32 oldMSTime = getMSTime();
7866
7867 // For reload case
7868 _repOnKillStore.clear();
7869
7870 uint32 count = 0;
7871
7872 // 0 1 2
7873 QueryResult result = WorldDatabase.Query("SELECT creature_id, RewOnKillRepFaction1, RewOnKillRepFaction2, "
7874 // 3 4 5 6 7 8 9
7875 "IsTeamAward1, MaxStanding1, RewOnKillRepValue1, IsTeamAward2, MaxStanding2, RewOnKillRepValue2, TeamDependent "
7876 "FROM creature_onkill_reputation");
7877
7878 if (!result)
7879 {
7880 LOG_WARN("server.loading", ">> Loaded 0 creature award reputation definitions. DB table `creature_onkill_reputation` is empty.");
7881 LOG_INFO("server.loading", " ");
7882 return;
7883 }
7884
7885 do
7886 {
7887 Field* fields = result->Fetch();
7888
7889 uint32 creature_id = fields[0].Get<uint32>();
7890
7891 ReputationOnKillEntry repOnKill;
7892 repOnKill.RepFaction1 = fields[1].Get<int16>();
7893 repOnKill.RepFaction2 = fields[2].Get<int16>();
7894 repOnKill.IsTeamAward1 = fields[3].Get<bool>();
7895 repOnKill.ReputationMaxCap1 = fields[4].Get<uint8>();
7896 repOnKill.RepValue1 = fields[5].Get<float>();
7897 repOnKill.IsTeamAward2 = fields[6].Get<bool>();
7898 repOnKill.ReputationMaxCap2 = fields[7].Get<uint8>();
7899 repOnKill.RepValue2 = fields[8].Get<float>();
7900 repOnKill.TeamDependent = fields[9].Get<uint8>();
7901
7902 if (!GetCreatureTemplate(creature_id))
7903 {
7904 LOG_ERROR("sql.sql", "Table `creature_onkill_reputation` have data for not existed creature entry ({}), skipped", creature_id);
7905 continue;
7906 }
7907
7908 if (repOnKill.RepFaction1)
7909 {
7910 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(repOnKill.RepFaction1);
7911 if (!factionEntry1)
7912 {
7913 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `creature_onkill_reputation`", repOnKill.RepFaction1);
7914 continue;
7915 }
7916 }
7917
7918 if (repOnKill.RepFaction2)
7919 {
7920 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(repOnKill.RepFaction2);
7921 if (!factionEntry2)
7922 {
7923 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `creature_onkill_reputation`", repOnKill.RepFaction2);
7924 continue;
7925 }
7926 }
7927
7928 _repOnKillStore[creature_id] = repOnKill;
7929
7930 ++count;
7931 } while (result->NextRow());
7932
7933 LOG_INFO("server.loading", ">> Loaded {} Creature Award Reputation Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7934 LOG_INFO("server.loading", " ");
7935}
Definition ObjectMgr.h:568
uint32 RepFaction1
Definition ObjectMgr.h:569

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

◆ LoadReputationRewardRate()

void ObjectMgr::LoadReputationRewardRate ( )
7776{
7777 uint32 oldMSTime = getMSTime();
7778
7779 _repRewardRateStore.clear(); // for reload case
7780
7781 uint32 count = 0; // 0 1 2 3 4 5 6 7
7782 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");
7783 if (!result)
7784 {
7785 LOG_INFO("server.loading", ">> Loaded `reputation_reward_rate`, table is empty!");
7786 return;
7787 }
7788
7789 do
7790 {
7791 Field* fields = result->Fetch();
7792
7793 uint32 factionId = fields[0].Get<uint32>();
7794
7795 RepRewardRate repRate;
7796
7797 repRate.questRate = fields[1].Get<float>();
7798 repRate.questDailyRate = fields[2].Get<float>();
7799 repRate.questWeeklyRate = fields[3].Get<float>();
7800 repRate.questMonthlyRate = fields[4].Get<float>();
7801 repRate.questRepeatableRate = fields[5].Get<float>();
7802 repRate.creatureRate = fields[6].Get<float>();
7803 repRate.spellRate = fields[7].Get<float>();
7804
7805 FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
7806 if (!factionEntry)
7807 {
7808 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_reward_rate`", factionId);
7809 continue;
7810 }
7811
7812 if (repRate.questRate < 0.0f)
7813 {
7814 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_rate with invalid rate {}, skipping data for faction {}", repRate.questRate, factionId);
7815 continue;
7816 }
7817
7818 if (repRate.questDailyRate < 0.0f)
7819 {
7820 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_daily_rate with invalid rate {}, skipping data for faction {}", repRate.questDailyRate, factionId);
7821 continue;
7822 }
7823
7824 if (repRate.questWeeklyRate < 0.0f)
7825 {
7826 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_weekly_rate with invalid rate {}, skipping data for faction {}", repRate.questWeeklyRate, factionId);
7827 continue;
7828 }
7829
7830 if (repRate.questMonthlyRate < 0.0f)
7831 {
7832 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_monthly_rate with invalid rate {}, skipping data for faction {}", repRate.questMonthlyRate, factionId);
7833 continue;
7834 }
7835
7836 if (repRate.questRepeatableRate < 0.0f)
7837 {
7838 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_repeatable_rate with invalid rate {}, skipping data for faction {}", repRate.questRepeatableRate, factionId);
7839 continue;
7840 }
7841
7842 if (repRate.creatureRate < 0.0f)
7843 {
7844 LOG_ERROR("sql.sql", "Table reputation_reward_rate has creature_rate with invalid rate {}, skipping data for faction {}", repRate.creatureRate, factionId);
7845 continue;
7846 }
7847
7848 if (repRate.spellRate < 0.0f)
7849 {
7850 LOG_ERROR("sql.sql", "Table reputation_reward_rate has spell_rate with invalid rate {}, skipping data for faction {}", repRate.spellRate, factionId);
7851 continue;
7852 }
7853
7854 _repRewardRateStore[factionId] = repRate;
7855
7856 ++count;
7857 } while (result->NextRow());
7858
7859 LOG_INFO("server.loading", ">> Loaded {} Reputation Reward Rate in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7860 LOG_INFO("server.loading", " ");
7861}
Definition ObjectMgr.h:557
float questRate
Definition ObjectMgr.h:558

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

◆ LoadReputationSpilloverTemplate()

void ObjectMgr::LoadReputationSpilloverTemplate ( )
7938{
7939 uint32 oldMSTime = getMSTime();
7940
7941 _repSpilloverTemplateStore.clear(); // for reload case
7942
7943 uint32 count = 0; // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
7944 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");
7945
7946 if (!result)
7947 {
7948 LOG_INFO("server.loading", ">> Loaded `reputation_spillover_template`, table is empty.");
7949 LOG_INFO("server.loading", " ");
7950 return;
7951 }
7952
7953 do
7954 {
7955 Field* fields = result->Fetch();
7956
7957 uint32 factionId = fields[0].Get<uint16>();
7958
7959 RepSpilloverTemplate repTemplate;
7960
7961 repTemplate.faction[0] = fields[1].Get<uint16>();
7962 repTemplate.faction_rate[0] = fields[2].Get<float>();
7963 repTemplate.faction_rank[0] = fields[3].Get<uint8>();
7964 repTemplate.faction[1] = fields[4].Get<uint16>();
7965 repTemplate.faction_rate[1] = fields[5].Get<float>();
7966 repTemplate.faction_rank[1] = fields[6].Get<uint8>();
7967 repTemplate.faction[2] = fields[7].Get<uint16>();
7968 repTemplate.faction_rate[2] = fields[8].Get<float>();
7969 repTemplate.faction_rank[2] = fields[9].Get<uint8>();
7970 repTemplate.faction[3] = fields[10].Get<uint16>();
7971 repTemplate.faction_rate[3] = fields[11].Get<float>();
7972 repTemplate.faction_rank[3] = fields[12].Get<uint8>();
7973 repTemplate.faction[4] = fields[13].Get<uint16>();
7974 repTemplate.faction_rate[4] = fields[14].Get<float>();
7975 repTemplate.faction_rank[4] = fields[15].Get<uint8>();
7976 repTemplate.faction[5] = fields[16].Get<uint16>();
7977 repTemplate.faction_rate[5] = fields[17].Get<float>();
7978 repTemplate.faction_rank[5] = fields[18].Get<uint8>();
7979
7980 FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
7981
7982 if (!factionEntry)
7983 {
7984 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", factionId);
7985 continue;
7986 }
7987
7988 if (factionEntry->team == 0)
7989 {
7990 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} in `reputation_spillover_template` does not belong to any team, skipping", factionId);
7991 continue;
7992 }
7993
7994 for (uint32 i = 0; i < MAX_SPILLOVER_FACTIONS; ++i)
7995 {
7996 if (repTemplate.faction[i])
7997 {
7998 FactionEntry const* factionSpillover = sFactionStore.LookupEntry(repTemplate.faction[i]);
7999
8000 if (!factionSpillover)
8001 {
8002 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);
8003 continue;
8004 }
8005
8006 if (factionSpillover->reputationListID < 0)
8007 {
8008 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);
8009 continue;
8010 }
8011
8012 if (repTemplate.faction_rank[i] >= MAX_REPUTATION_RANK)
8013 {
8014 LOG_ERROR("sql.sql", "Rank {} used in `reputation_spillover_template` for spillover faction {} is not valid, skipping", repTemplate.faction_rank[i], repTemplate.faction[i]);
8015 continue;
8016 }
8017 }
8018 }
8019
8020 FactionEntry const* factionEntry0 = sFactionStore.LookupEntry(repTemplate.faction[0]);
8021 if (repTemplate.faction[0] && !factionEntry0)
8022 {
8023 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[0]);
8024 continue;
8025 }
8026 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(repTemplate.faction[1]);
8027 if (repTemplate.faction[1] && !factionEntry1)
8028 {
8029 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[1]);
8030 continue;
8031 }
8032 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(repTemplate.faction[2]);
8033 if (repTemplate.faction[2] && !factionEntry2)
8034 {
8035 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[2]);
8036 continue;
8037 }
8038 FactionEntry const* factionEntry3 = sFactionStore.LookupEntry(repTemplate.faction[3]);
8039 if (repTemplate.faction[3] && !factionEntry3)
8040 {
8041 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[3]);
8042 continue;
8043 }
8044
8045 _repSpilloverTemplateStore[factionId] = repTemplate;
8046
8047 ++count;
8048 } while (result->NextRow());
8049
8050 LOG_INFO("server.loading", ">> Loaded {} Reputation Spillover Template in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8051 LOG_INFO("server.loading", " ");
8052}
#define MAX_SPILLOVER_FACTIONS
Definition SharedDefines.h:258
int32 reputationListID
Definition DBCStructure.h:909
Definition ObjectMgr.h:581
uint32 faction[MAX_SPILLOVER_FACTIONS]
Definition ObjectMgr.h:582

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 ( )
8374{
8375 uint32 oldMSTime = getMSTime();
8376
8377 _reservedNamesStore.clear(); // need for reload case
8378
8379 QueryResult result = CharacterDatabase.Query("SELECT name FROM reserved_name");
8380
8381 if (!result)
8382 {
8383 LOG_WARN("server.loading", ">> Loaded 0 reserved names. DB table `reserved_name` is empty!");
8384 return;
8385 }
8386
8387 uint32 count = 0;
8388
8389 Field* fields;
8390 do
8391 {
8392 fields = result->Fetch();
8393 std::string name = fields[0].Get<std::string>();
8394
8395 std::wstring wstr;
8396 if (!Utf8toWStr (name, wstr))
8397 {
8398 LOG_ERROR("sql.sql", "Table `reserved_name` have invalid name: {}", name);
8399 continue;
8400 }
8401
8402 wstrToLower(wstr);
8403
8404 _reservedNamesStore.insert(wstr);
8405 ++count;
8406 } while (result->NextRow());
8407
8408 LOG_INFO("server.loading", ">> Loaded {} reserved names from DB in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8409}

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

◆ LoadReservedPlayerNamesDBC()

void ObjectMgr::LoadReservedPlayerNamesDBC ( )
8412{
8413 if (!sWorld->getBoolConfig(CONFIG_STRICT_NAMES_RESERVED))
8414 {
8415 LOG_WARN("server.loading", ">> Loaded 0 reserved names from DBC. Config option disabled.");
8416 return;
8417 }
8418
8419 uint32 oldMSTime = getMSTime();
8420
8421 uint32 count = 0;
8422
8423 for (NamesReservedEntry const* reservedStore : sNamesReservedStore)
8424 {
8425 std::wstring wstr;
8426
8427 Utf8toWStr(reservedStore->Pattern, wstr);
8428
8429 // DBC does not have clean entries, remove the junk.
8430 boost::algorithm::replace_all(wstr, "\\<", "");
8431 boost::algorithm::replace_all(wstr, "\\>", "");
8432
8433 _reservedNamesStore.insert(wstr);
8434 count++;
8435 }
8436
8437 LOG_INFO("server.loading", ">> Loaded {} reserved names from DBC in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8438 LOG_INFO("server.loading", " ");
8439}
DBCStorage< NamesReservedEntry > sNamesReservedStore(NamesReservedfmt)
@ CONFIG_STRICT_NAMES_RESERVED
Definition WorldConfig.h:140
Definition DBCStructure.h:1399

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

◆ LoadScriptNames()

void ObjectMgr::LoadScriptNames ( )
9760{
9761 uint32 oldMSTime = getMSTime();
9762
9763 // We insert an empty placeholder here so we can use the
9764 // script id 0 as dummy for "no script found".
9765 _scriptNamesStore.emplace_back("");
9766
9767 QueryResult result = WorldDatabase.Query(
9768 "SELECT DISTINCT(ScriptName) FROM achievement_criteria_data WHERE ScriptName <> '' AND type = 11 "
9769 "UNION "
9770 "SELECT DISTINCT(ScriptName) FROM battleground_template WHERE ScriptName <> '' "
9771 "UNION "
9772 "SELECT DISTINCT(ScriptName) FROM creature WHERE ScriptName <> '' "
9773 "UNION "
9774 "SELECT DISTINCT(ScriptName) FROM creature_template WHERE ScriptName <> '' "
9775 "UNION "
9776 "SELECT DISTINCT(ScriptName) FROM gameobject WHERE ScriptName <> '' "
9777 "UNION "
9778 "SELECT DISTINCT(ScriptName) FROM gameobject_template WHERE ScriptName <> '' "
9779 "UNION "
9780 "SELECT DISTINCT(ScriptName) FROM item_template WHERE ScriptName <> '' "
9781 "UNION "
9782 "SELECT DISTINCT(ScriptName) FROM areatrigger_scripts WHERE ScriptName <> '' "
9783 "UNION "
9784 "SELECT DISTINCT(ScriptName) FROM spell_script_names WHERE ScriptName <> '' "
9785 "UNION "
9786 "SELECT DISTINCT(ScriptName) FROM transports WHERE ScriptName <> '' "
9787 "UNION "
9788 "SELECT DISTINCT(ScriptName) FROM game_weather WHERE ScriptName <> '' "
9789 "UNION "
9790 "SELECT DISTINCT(ScriptName) FROM conditions WHERE ScriptName <> '' "
9791 "UNION "
9792 "SELECT DISTINCT(ScriptName) FROM outdoorpvp_template WHERE ScriptName <> '' "
9793 "UNION "
9794 "SELECT DISTINCT(script) FROM instance_template WHERE script <> ''");
9795
9796 if (!result)
9797 {
9798 LOG_INFO("server.loading", " ");
9799 LOG_ERROR("sql.sql", ">> Loaded empty set of Script Names!");
9800 return;
9801 }
9802
9803 _scriptNamesStore.reserve(result->GetRowCount() + 1);
9804
9805 do
9806 {
9807 _scriptNamesStore.push_back((*result)[0].Get<std::string>());
9808 } while (result->NextRow());
9809
9810 std::sort(_scriptNamesStore.begin(), _scriptNamesStore.end());
9811 LOG_INFO("server.loading", ">> Loaded {} ScriptNames in {} ms", _scriptNamesStore.size(), GetMSTimeDiffToNow(oldMSTime));
9812 LOG_INFO("server.loading", " ");
9813}

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

◆ LoadScripts()

void ObjectMgr::LoadScripts ( ScriptsType  type)
private
5429{
5430 uint32 oldMSTime = getMSTime();
5431
5432 ScriptMapMap* scripts = GetScriptsMapByType(type);
5433 if (!scripts)
5434 return;
5435
5436 std::string tableName = GetScriptsTableNameByType(type);
5437 if (tableName.empty())
5438 return;
5439
5440 if (sScriptMgr->IsScriptScheduled()) // function cannot be called when scripts are in use.
5441 return;
5442
5443 LOG_INFO("server.loading", "Loading {}...", tableName);
5444
5445 scripts->clear(); // need for reload support
5446
5447 bool isSpellScriptTable = (type == SCRIPTS_SPELL);
5448 // 0 1 2 3 4 5 6 7 8 9
5449 QueryResult result = WorldDatabase.Query("SELECT id, delay, command, datalong, datalong2, dataint, x, y, z, o{} FROM {}", isSpellScriptTable ? ", effIndex" : "", tableName);
5450
5451 if (!result)
5452 {
5453 LOG_WARN("server.loading", ">> Loaded 0 script definitions. DB table `{}` is empty!", tableName);
5454 LOG_INFO("server.loading", " ");
5455 return;
5456 }
5457
5458 uint32 count = 0;
5459
5460 do
5461 {
5462 Field* fields = result->Fetch();
5463 ScriptInfo tmp;
5464 tmp.type = type;
5465 tmp.id = fields[0].Get<uint32>();
5466 if (isSpellScriptTable)
5467 tmp.id |= fields[10].Get<uint8>() << 24;
5468 tmp.delay = fields[1].Get<uint32>();
5469 tmp.command = ScriptCommands(fields[2].Get<uint32>());
5470 tmp.Raw.nData[0] = fields[3].Get<uint32>();
5471 tmp.Raw.nData[1] = fields[4].Get<uint32>();
5472 tmp.Raw.nData[2] = fields[5].Get<int32>();
5473 tmp.Raw.fData[0] = fields[6].Get<float>();
5474 tmp.Raw.fData[1] = fields[7].Get<float>();
5475 tmp.Raw.fData[2] = fields[8].Get<float>();
5476 tmp.Raw.fData[3] = fields[9].Get<float>();
5477
5478 // generic command args check
5479 switch (tmp.command)
5480 {
5482 {
5484 {
5485 LOG_ERROR("sql.sql", "Table `{}` has invalid talk type (datalong = {}) in SCRIPT_COMMAND_TALK for script id {}",
5486 tableName, tmp.Talk.ChatType, tmp.id);
5487 continue;
5488 }
5490 {
5491 LOG_ERROR("sql.sql", "Table `{}` has invalid talk text id (dataint = {}) in SCRIPT_COMMAND_TALK for script id {}",
5492 tableName, tmp.Talk.TextID, tmp.id);
5493 continue;
5494 }
5495 break;
5496 }
5497
5499 {
5500 if (!sEmotesStore.LookupEntry(tmp.Emote.EmoteID))
5501 {
5502 LOG_ERROR("sql.sql", "Table `{}` has invalid emote id (datalong = {}) in SCRIPT_COMMAND_EMOTE for script id {}",
5503 tableName, tmp.Emote.EmoteID, tmp.id);
5504 continue;
5505 }
5506 break;
5507 }
5508
5510 {
5511 if (!sMapStore.LookupEntry(tmp.TeleportTo.MapID))
5512 {
5513 LOG_ERROR("sql.sql", "Table `{}` has invalid map (Id: {}) in SCRIPT_COMMAND_TELEPORT_TO for script id {}",
5514 tableName, tmp.TeleportTo.MapID, tmp.id);
5515 continue;
5516 }
5517
5519 {
5520 LOG_ERROR("sql.sql", "Table `{}` has invalid coordinates (X: {} Y: {} Z: {} O: {}) in SCRIPT_COMMAND_TELEPORT_TO for script id {}",
5521 tableName, tmp.TeleportTo.DestX, tmp.TeleportTo.DestY, tmp.TeleportTo.DestZ, tmp.TeleportTo.Orientation, tmp.id);
5522 continue;
5523 }
5524 break;
5525 }
5526
5528 {
5529 Quest const* quest = GetQuestTemplate(tmp.QuestExplored.QuestID);
5530 if (!quest)
5531 {
5532 LOG_ERROR("sql.sql", "Table `{}` has invalid quest (ID: {}) in SCRIPT_COMMAND_QUEST_EXPLORED in `datalong` for script id {}",
5533 tableName, tmp.QuestExplored.QuestID, tmp.id);
5534 continue;
5535 }
5536
5538 {
5539 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.",
5540 tableName, tmp.QuestExplored.QuestID, tmp.id);
5541
5542 // this will prevent quest completing without objective
5543 const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
5544
5545 // continue; - quest objective requirement set and command can be allowed
5546 }
5547
5549 {
5550 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 {}",
5551 tableName, tmp.QuestExplored.Distance, tmp.id);
5552 continue;
5553 }
5554
5556 {
5557 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",
5559 continue;
5560 }
5561
5563 {
5564 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",
5565 tableName, tmp.QuestExplored.Distance, tmp.id, INTERACTION_DISTANCE);
5566 continue;
5567 }
5568
5569 break;
5570 }
5571
5573 {
5575 {
5576 LOG_ERROR("sql.sql", "Table `{}` has invalid creature (Entry: {}) in SCRIPT_COMMAND_KILL_CREDIT for script id {}",
5577 tableName, tmp.KillCredit.CreatureEntry, tmp.id);
5578 continue;
5579 }
5580 break;
5581 }
5582
5584 {
5586 if (!data)
5587 {
5588 LOG_ERROR("sql.sql", "Table `{}` has invalid gameobject (GUID: {}) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5589 tableName, tmp.RespawnGameobject.GOGuid, tmp.id);
5590 continue;
5591 }
5592
5593 GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
5594 if (!info)
5595 {
5596 LOG_ERROR("sql.sql", "Table `{}` has gameobject with invalid entry (GUID: {} Entry: {}) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5597 tableName, tmp.RespawnGameobject.GOGuid, data->id, tmp.id);
5598 continue;
5599 }
5600
5601 if (info->type == GAMEOBJECT_TYPE_FISHINGNODE ||
5603 info->type == GAMEOBJECT_TYPE_DOOR ||
5604 info->type == GAMEOBJECT_TYPE_BUTTON ||
5605 info->type == GAMEOBJECT_TYPE_TRAP)
5606 {
5607 LOG_ERROR("sql.sql", "Table `{}` have gameobject type ({}) unsupported by command SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5608 tableName, info->entry, tmp.id);
5609 continue;
5610 }
5611 break;
5612 }
5613
5615 {
5617 {
5618 LOG_ERROR("sql.sql", "Table `{}` has invalid coordinates (X: {} Y: {} Z: {} O: {}) in SCRIPT_COMMAND_TEMP_SUMMON_CREATURE for script id {}",
5620 continue;
5621 }
5622
5624 if (!GetCreatureTemplate(entry))
5625 {
5626 LOG_ERROR("sql.sql", "Table `{}` has invalid creature (Entry: {}) in SCRIPT_COMMAND_TEMP_SUMMON_CREATURE for script id {}",
5627 tableName, tmp.TempSummonCreature.CreatureEntry, tmp.id);
5628 continue;
5629 }
5630 break;
5631 }
5632
5635 {
5637 if (!data)
5638 {
5639 LOG_ERROR("sql.sql", "Table `{}` has invalid gameobject (GUID: {}) in {} for script id {}",
5640 tableName, tmp.ToggleDoor.GOGuid, GetScriptCommandName(tmp.command), tmp.id);
5641 continue;
5642 }
5643
5644 GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
5645 if (!info)
5646 {
5647 LOG_ERROR("sql.sql", "Table `{}` has gameobject with invalid entry (GUID: {} Entry: {}) in {} for script id {}",
5648 tableName, tmp.ToggleDoor.GOGuid, data->id, GetScriptCommandName(tmp.command), tmp.id);
5649 continue;
5650 }
5651
5652 if (info->type != GAMEOBJECT_TYPE_DOOR)
5653 {
5654 LOG_ERROR("sql.sql", "Table `{}` has gameobject type ({}) non supported by command {} for script id {}",
5655 tableName, info->entry, GetScriptCommandName(tmp.command), tmp.id);
5656 continue;
5657 }
5658
5659 break;
5660 }
5661
5663 {
5664 if (!sSpellMgr->GetSpellInfo(tmp.RemoveAura.SpellID))
5665 {
5666 LOG_ERROR("sql.sql", "Table `{}` using non-existent spell (id: {}) in SCRIPT_COMMAND_REMOVE_AURA for script id {}",
5667 tableName, tmp.RemoveAura.SpellID, tmp.id);
5668 continue;
5669 }
5670 if (tmp.RemoveAura.Flags & ~0x1) // 1 bits (0, 1)
5671 {
5672 LOG_ERROR("sql.sql", "Table `{}` using unknown flags in datalong2 ({}) in SCRIPT_COMMAND_REMOVE_AURA for script id {}",
5673 tableName, tmp.RemoveAura.Flags, tmp.id);
5674 continue;
5675 }
5676 break;
5677 }
5678
5680 {
5681 if (!sSpellMgr->GetSpellInfo(tmp.CastSpell.SpellID))
5682 {
5683 LOG_ERROR("sql.sql", "Table `{}` using non-existent spell (id: {}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5684 tableName, tmp.CastSpell.SpellID, tmp.id);
5685 continue;
5686 }
5687 if (tmp.CastSpell.Flags > 4) // targeting type
5688 {
5689 LOG_ERROR("sql.sql", "Table `{}` using unknown target in datalong2 ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5690 tableName, tmp.CastSpell.Flags, tmp.id);
5691 continue;
5692 }
5693 if (tmp.CastSpell.Flags != 4 && tmp.CastSpell.CreatureEntry & ~0x1) // 1 bit (0, 1)
5694 {
5695 LOG_ERROR("sql.sql", "Table `{}` using unknown flags in dataint ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5696 tableName, tmp.CastSpell.CreatureEntry, tmp.id);
5697 continue;
5698 }
5699 else if (tmp.CastSpell.Flags == 4 && !GetCreatureTemplate(tmp.CastSpell.CreatureEntry))
5700 {
5701 LOG_ERROR("sql.sql", "Table `{}` using invalid creature entry in dataint ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5702 tableName, tmp.CastSpell.CreatureEntry, tmp.id);
5703 continue;
5704 }
5705 break;
5706 }
5707
5709 {
5711 {
5712 LOG_ERROR("sql.sql", "Table `{}` has nonexistent item (entry: {}) in SCRIPT_COMMAND_CREATE_ITEM for script id {}",
5713 tableName, tmp.CreateItem.ItemEntry, tmp.id);
5714 continue;
5715 }
5716 if (!tmp.CreateItem.Amount)
5717 {
5718 LOG_ERROR("sql.sql", "Table `{}` SCRIPT_COMMAND_CREATE_ITEM but amount is {} for script id {}",
5719 tableName, tmp.CreateItem.Amount, tmp.id);
5720 continue;
5721 }
5722 break;
5723 }
5724 default:
5725 break;
5726 }
5727
5728 if (scripts->find(tmp.id) == scripts->end())
5729 {
5730 ScriptMap emptyMap;
5731 (*scripts)[tmp.id] = emptyMap;
5732 }
5733 (*scripts)[tmp.id].insert(std::pair<uint32, ScriptInfo>(tmp.delay, tmp));
5734
5735 ++count;
5736 } while (result->NextRow());
5737
5738 LOG_INFO("server.loading", ">> Loaded {} script definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5739 LOG_INFO("server.loading", " ");
5740}
@ CHAT_TYPE_WHISPER
Definition CreatureData.h:425
#define DEFAULT_VISIBILITY_DISTANCE
Definition ObjectDefines.h:39
#define INTERACTION_DISTANCE
Definition ObjectDefines.h:24
std::multimap< uint32, ScriptInfo > ScriptMap
Definition ObjectMgr.h:385
ScriptMapMap * GetScriptsMapByType(ScriptsType type)
Definition ObjectMgr.cpp:83
ScriptCommands
Definition ObjectMgr.h:91
@ SCRIPT_COMMAND_EMOTE
Definition ObjectMgr.h:93
@ SCRIPT_COMMAND_CREATE_ITEM
Definition ObjectMgr.h:109
@ SCRIPT_COMMAND_CLOSE_DOOR
Definition ObjectMgr.h:104
@ SCRIPT_COMMAND_CAST_SPELL
Definition ObjectMgr.h:107
@ SCRIPT_COMMAND_RESPAWN_GAMEOBJECT
Definition ObjectMgr.h:101
@ SCRIPT_COMMAND_QUEST_EXPLORED
Definition ObjectMgr.h:99
@ SCRIPT_COMMAND_TALK
Definition ObjectMgr.h:92
@ SCRIPT_COMMAND_OPEN_DOOR
Definition ObjectMgr.h:103
@ SCRIPT_COMMAND_TELEPORT_TO
Definition ObjectMgr.h:98
@ SCRIPT_COMMAND_TEMP_SUMMON_CREATURE
Definition ObjectMgr.h:102
@ SCRIPT_COMMAND_KILL_CREDIT
Definition ObjectMgr.h:100
@ SCRIPT_COMMAND_REMOVE_AURA
Definition ObjectMgr.h:106
std::string GetScriptCommandName(ScriptCommands command)
Definition ObjectMgr.cpp:103
std::map< uint32, ScriptMap > ScriptMapMap
Definition ObjectMgr.h:386
std::string GetScriptsTableNameByType(ScriptsType type)
Definition ObjectMgr.cpp:63
@ SCRIPTS_SPELL
Definition ObjectMgr.h:148
@ GAMEOBJECT_TYPE_FISHINGNODE
Definition SharedDefines.h:1588
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3444
Definition ObjectMgr.h:190
float Orientation
Definition ObjectMgr.h:250
uint32 Flags
Definition ObjectMgr.h:207
ScriptsType type
Definition ObjectMgr.h:191
struct ScriptInfo::@267::@278 RespawnGameobject
uint32 QuestID
Definition ObjectMgr.h:255
struct ScriptInfo::@267::@284 CreateItem
struct ScriptInfo::@267::@276 QuestExplored
int32 TextID
Definition ObjectMgr.h:208
struct ScriptInfo::@267::@269 Raw
struct ScriptInfo::@267::@282 CastSpell
float DestX
Definition ObjectMgr.h:229
uint32 ItemEntry
Definition ObjectMgr.h:316
uint32 ChatType
Definition ObjectMgr.h:206
uint32 id
Definition ObjectMgr.h:192
struct ScriptInfo::@267::@271 Emote
uint32 delay
Definition ObjectMgr.h:193
float fData[4]
Definition ObjectMgr.h:201
struct ScriptInfo::@267::@277 KillCredit
float PosY
Definition ObjectMgr.h:278
ScriptCommands command
Definition ObjectMgr.h:194
float DestY
Definition ObjectMgr.h:230
uint32 MapID
Definition ObjectMgr.h:243
uint32 nData[3]
Definition ObjectMgr.h:200
float PosZ
Definition ObjectMgr.h:279
struct ScriptInfo::@267::@279 TempSummonCreature
struct ScriptInfo::@267::@270 Talk
float PosX
Definition ObjectMgr.h:277
uint32 Distance
Definition ObjectMgr.h:256
struct ScriptInfo::@267::@275 TeleportTo
uint32 SpellID
Definition ObjectMgr.h:294
struct ScriptInfo::@267::@281 RemoveAura
float DestZ
Definition ObjectMgr.h:231
uint32 GOGuid
Definition ObjectMgr.h:267
uint32 CreatureEntry
Definition ObjectMgr.h:261
struct ScriptInfo::@267::@280 ToggleDoor
uint32 Amount
Definition ObjectMgr.h:317
uint32 EmoteID
Definition ObjectMgr.h:213

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

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

◆ LoadSpellScriptNames()

void ObjectMgr::LoadSpellScriptNames ( )
5842{
5843 uint32 oldMSTime = getMSTime();
5844
5845 _spellScriptsStore.clear(); // need for reload case
5846
5847 QueryResult result = WorldDatabase.Query("SELECT spell_id, ScriptName FROM spell_script_names");
5848
5849 if (!result)
5850 {
5851 LOG_WARN("server.loading", ">> Loaded 0 spell script names. DB table `spell_script_names` is empty!");
5852 LOG_INFO("server.loading", " ");
5853 return;
5854 }
5855
5856 uint32 count = 0;
5857
5858 do
5859 {
5860 Field* fields = result->Fetch();
5861
5862 int32 spellId = fields[0].Get<int32>();
5863 std::string scriptName = fields[1].Get<std::string>();
5864
5865 bool allRanks = false;
5866 if (spellId <= 0)
5867 {
5868 allRanks = true;
5869 spellId = -spellId;
5870 }
5871
5872 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
5873 if (!spellInfo)
5874 {
5875 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) does not exist in `Spell.dbc`.", scriptName, fields[0].Get<int32>());
5876 continue;
5877 }
5878
5879 if (allRanks)
5880 {
5881 if (sSpellMgr->GetFirstSpellInChain(spellId) != uint32(spellId))
5882 {
5883 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) is not first rank of spell.", scriptName, fields[0].Get<int32>());
5884 continue;
5885 }
5886 while (spellInfo)
5887 {
5888 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
5889 spellInfo = spellInfo->GetNextRankSpell();
5890 }
5891 }
5892 else
5893 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
5894 ++count;
5895 } while (result->NextRow());
5896
5897 LOG_INFO("server.loading", ">> Loaded {} spell script names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5898 LOG_INFO("server.loading", " ");
5899}
SpellInfo const * GetNextRankSpell() const
Definition SpellInfo.cpp:2525

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

◆ LoadSpellScripts()

void ObjectMgr::LoadSpellScripts ( )
5743{
5745
5746 // check ids
5747 for (ScriptMapMap::const_iterator itr = sSpellScripts.begin(); itr != sSpellScripts.end(); ++itr)
5748 {
5749 uint32 spellId = uint32(itr->first) & 0x00FFFFFF;
5750 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
5751
5752 if (!spellInfo)
5753 {
5754 LOG_ERROR("sql.sql", "Table `spell_scripts` has not existing spell (Id: {}) as script id", spellId);
5755 continue;
5756 }
5757
5758 SpellEffIndex i = SpellEffIndex((uint32(itr->first) >> 24) & 0x000000FF);
5759 if (uint32(i) >= MAX_SPELL_EFFECTS)
5760 {
5761 LOG_ERROR("sql.sql", "Table `spell_scripts` has too high effect index {} for spell (Id: {}) as script id", uint32(i), spellId);
5762 }
5763
5764 //check for correct spellEffect
5765 if (!spellInfo->Effects[i].Effect || (spellInfo->Effects[i].Effect != SPELL_EFFECT_SCRIPT_EFFECT && spellInfo->Effects[i].Effect != SPELL_EFFECT_DUMMY))
5766 LOG_ERROR("sql.sql", "Table `spell_scripts` - spell {} effect {} is not SPELL_EFFECT_SCRIPT_EFFECT or SPELL_EFFECT_DUMMY", spellId, uint32(i));
5767 }
5768}
ScriptMapMap sSpellScripts
Definition ObjectMgr.cpp:59
SpellEffIndex
Definition SharedDefines.h:30
@ SPELL_EFFECT_DUMMY
Definition SharedDefines.h:792
@ SPELL_EFFECT_SCRIPT_EFFECT
Definition SharedDefines.h:866

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 ( )
6682{
6683 uint32 oldMSTime = getMSTime();
6684
6685 _tavernAreaTriggerStore.clear(); // need for reload case
6686
6687 QueryResult result = WorldDatabase.Query("SELECT id, faction FROM areatrigger_tavern");
6688
6689 if (!result)
6690 {
6691 LOG_WARN("server.loading", ">> Loaded 0 tavern triggers. DB table `areatrigger_tavern` is empty.");
6692 LOG_INFO("server.loading", " ");
6693 return;
6694 }
6695
6696 uint32 count = 0;
6697
6698 do
6699 {
6700 ++count;
6701
6702 Field* fields = result->Fetch();
6703
6704 uint32 Trigger_ID = fields[0].Get<uint32>();
6705
6706 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6707 if (!atEntry)
6708 {
6709 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6710 continue;
6711 }
6712
6713 uint32 faction = fields[1].Get<uint32>();
6714
6715 _tavernAreaTriggerStore.emplace(Trigger_ID, faction);
6716 } while (result->NextRow());
6717
6718 LOG_INFO("server.loading", ">> Loaded {} Tavern Triggers in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6719 LOG_INFO("server.loading", " ");
6720}

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

◆ LoadTempSummons()

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

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

◆ LoadTrainerSpell()

void ObjectMgr::LoadTrainerSpell ( )
9399{
9400 uint32 oldMSTime = getMSTime();
9401
9402 // For reload case
9404
9405 QueryResult result = WorldDatabase.Query("SELECT b.ID, a.SpellID, a.MoneyCost, a.ReqSkillLine, a.ReqSkillRank, a.ReqLevel, a.ReqSpell FROM npc_trainer AS a "
9406 "INNER JOIN npc_trainer AS b ON a.ID = -(b.SpellID) "
9407 "UNION SELECT * FROM npc_trainer WHERE SpellID > 0");
9408
9409 if (!result)
9410 {
9411 LOG_WARN("server.loading", ">> Loaded 0 Trainers. DB table `npc_trainer` is empty!");
9412 LOG_INFO("server.loading", " ");
9413 return;
9414 }
9415
9416 uint32 count = 0;
9417
9418 do
9419 {
9420 Field* fields = result->Fetch();
9421
9422 uint32 entry = fields[0].Get<uint32>();
9423 uint32 spell = fields[1].Get<uint32>();
9424 uint32 spellCost = fields[2].Get<uint32>();
9425 uint32 reqSkill = fields[3].Get<uint16>();
9426 uint32 reqSkillValue = fields[4].Get<uint16>();
9427 uint32 reqLevel = fields[5].Get<uint8>();
9428 uint32 reqSpell = fields[6].Get<uint32>();
9429
9430 AddSpellToTrainer(entry, spell, spellCost, reqSkill, reqSkillValue, reqLevel, reqSpell);
9431
9432 ++count;
9433 } while (result->NextRow());
9434
9435 LOG_INFO("server.loading", ">> Loaded {} Trainers in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9436 LOG_INFO("server.loading", " ");
9437}
void AddSpellToTrainer(uint32 entry, uint32 spell, uint32 spellCost, uint32 reqSkill, uint32 reqSkillValue, uint32 reqLevel, uint32 reqSpell)
Definition ObjectMgr.cpp:9313

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

◆ LoadVehicleAccessories()

void ObjectMgr::LoadVehicleAccessories ( )
3661{
3662 uint32 oldMSTime = getMSTime();
3663
3664 _vehicleAccessoryStore.clear(); // needed for reload case
3665
3666 uint32 count = 0;
3667
3668 // 0 1 2 3 4 5
3669 QueryResult result = WorldDatabase.Query("SELECT `guid`, `accessory_entry`, `seat_id`, `minion`, `summontype`, `summontimer` FROM `vehicle_accessory`");
3670
3671 if (!result)
3672 {
3673 LOG_WARN("server.loading", ">> Loaded 0 Vehicle Accessories in {} ms", GetMSTimeDiffToNow(oldMSTime));
3674 LOG_INFO("server.loading", " ");
3675 return;
3676 }
3677
3678 do
3679 {
3680 Field* fields = result->Fetch();
3681
3682 uint32 uiGUID = fields[0].Get<uint32>();
3683 uint32 uiAccessory = fields[1].Get<uint32>();
3684 int8 uiSeat = int8(fields[2].Get<int16>());
3685 bool bMinion = fields[3].Get<bool>();
3686 uint8 uiSummonType = fields[4].Get<uint8>();
3687 uint32 uiSummonTimer = fields[5].Get<uint32>();
3688
3689 if (!GetCreatureTemplate(uiAccessory))
3690 {
3691 LOG_ERROR("sql.sql", "Table `vehicle_accessory`: Accessory {} does not exist.", uiAccessory);
3692 continue;
3693 }
3694
3695 _vehicleAccessoryStore[uiGUID].push_back(VehicleAccessory(uiAccessory, uiSeat, bMinion, uiSummonType, uiSummonTimer));
3696
3697 ++count;
3698 } while (result->NextRow());
3699
3700 LOG_INFO("server.loading", ">> Loaded {} Vehicle Accessories in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3701 LOG_INFO("server.loading", " ");
3702}
Definition VehicleDefines.h:115

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

◆ LoadVehicleSeatAddon()

void ObjectMgr::LoadVehicleSeatAddon ( )
3705{
3706 uint32 oldMSTime = getMSTime();
3707
3708 _vehicleSeatAddonStore.clear(); // needed for reload case
3709
3710 uint32 count = 0;
3711
3712 // 0 1 2 3 4 5 6
3713 QueryResult result = WorldDatabase.Query("SELECT `SeatEntry`, `SeatOrientation`, `ExitParamX`, `ExitParamY`, `ExitParamZ`, `ExitParamO`, `ExitParamValue` FROM `vehicle_seat_addon`");
3714
3715 if (!result)
3716 {
3717 LOG_ERROR("server.loading", ">> Loaded 0 vehicle seat addons. DB table `vehicle_seat_addon` is empty.");
3718 return;
3719 }
3720
3721 do
3722 {
3723 Field* fields = result->Fetch();
3724
3725 uint32 seatID = fields[0].Get<uint32>();
3726 float orientation = fields[1].Get<float>();
3727 float exitX = fields[2].Get<float>();
3728 float exitY = fields[3].Get<float>();
3729 float exitZ = fields[4].Get<float>();
3730 float exitO = fields[5].Get<float>();
3731 uint8 exitParam = fields[6].Get<uint8>();
3732
3733 if (!sVehicleSeatStore.LookupEntry(seatID))
3734 {
3735 LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: {} does not exist in VehicleSeat.dbc. Skipping entry.", seatID);
3736 continue;
3737 }
3738
3739 // Sanitizing values
3740 if (orientation > float(M_PI * 2))
3741 {
3742 LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: {} is using invalid angle offset value ({}). Set Value to 0.", seatID, orientation);
3743 orientation = 0.0f;
3744 }
3745
3747 {
3748 LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: {} is using invalid exit parameter value ({}). Setting to 0 (none).", seatID, exitParam);
3749 continue;
3750 }
3751
3752 _vehicleSeatAddonStore[seatID] = VehicleSeatAddon(orientation, exitX, exitY, exitZ, exitO, exitParam);
3753
3754 ++count;
3755 } while (result->NextRow());
3756
3757 LOG_INFO("server.loading", ">> Loaded {} Vehicle Seat Addon entries in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3758}
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 ( )
3605{
3606 uint32 oldMSTime = getMSTime();
3607
3608 _vehicleTemplateAccessoryStore.clear(); // needed for reload case
3609
3610 uint32 count = 0;
3611
3612 // 0 1 2 3 4 5
3613 QueryResult result = WorldDatabase.Query("SELECT `entry`, `accessory_entry`, `seat_id`, `minion`, `summontype`, `summontimer` FROM `vehicle_template_accessory`");
3614
3615 if (!result)
3616 {
3617 LOG_WARN("server.loading", ">> Loaded 0 vehicle template accessories. DB table `vehicle_template_accessory` is empty.");
3618 LOG_INFO("server.loading", " ");
3619 return;
3620 }
3621
3622 do
3623 {
3624 Field* fields = result->Fetch();
3625
3626 uint32 uiEntry = fields[0].Get<uint32>();
3627 uint32 uiAccessory = fields[1].Get<uint32>();
3628 int8 uiSeat = int8(fields[2].Get<int8>());
3629 bool bMinion = fields[3].Get<bool>();
3630 uint8 uiSummonType = fields[4].Get<uint8>();
3631 uint32 uiSummonTimer = fields[5].Get<uint32>();
3632
3633 if (!GetCreatureTemplate(uiEntry))
3634 {
3635 LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: creature template entry {} does not exist.", uiEntry);
3636 continue;
3637 }
3638
3639 if (!GetCreatureTemplate(uiAccessory))
3640 {
3641 LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: Accessory {} does not exist.", uiAccessory);
3642 continue;
3643 }
3644
3645 if (_spellClickInfoStore.find(uiEntry) == _spellClickInfoStore.end())
3646 {
3647 LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: creature template entry {} has no data in npc_spellclick_spells", uiEntry);
3648 continue;
3649 }
3650
3651 _vehicleTemplateAccessoryStore[uiEntry].push_back(VehicleAccessory(uiAccessory, uiSeat, bMinion, uiSummonType, uiSummonTimer));
3652
3653 ++count;
3654 } while (result->NextRow());
3655
3656 LOG_INFO("server.loading", ">> Loaded {} Vehicle Template Accessories in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3657 LOG_INFO("server.loading", " ");
3658}

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

◆ LoadVendors()

void ObjectMgr::LoadVendors ( )
9479{
9480 uint32 oldMSTime = getMSTime();
9481
9482 // For reload case
9483 for (CacheVendorItemContainer::iterator itr = _cacheVendorItemStore.begin(); itr != _cacheVendorItemStore.end(); ++itr)
9484 itr->second.Clear();
9485 _cacheVendorItemStore.clear();
9486
9487 std::set<uint32> skip_vendors;
9488
9489 QueryResult result = WorldDatabase.Query("SELECT entry, item, maxcount, incrtime, ExtendedCost FROM npc_vendor ORDER BY entry, slot ASC, item, ExtendedCost");
9490 if (!result)
9491 {
9492 LOG_INFO("server.loading", " ");
9493 LOG_WARN("server.loading", ">> Loaded 0 Vendors. DB table `npc_vendor` is empty!");
9494 return;
9495 }
9496
9497 uint32 count = 0;
9498
9499 do
9500 {
9501 Field* fields = result->Fetch();
9502
9503 uint32 entry = fields[0].Get<uint32>();
9504 int32 item_id = fields[1].Get<int32>();
9505
9506 // if item is a negative, its a reference
9507 if (item_id < 0)
9508 count += LoadReferenceVendor(entry, -item_id, &skip_vendors);
9509 else
9510 {
9511 uint32 maxcount = fields[2].Get<uint8>();
9512 uint32 incrtime = fields[3].Get<uint32>();
9513 uint32 ExtendedCost = fields[4].Get<uint32>();
9514
9515 if (!IsVendorItemValid(entry, item_id, maxcount, incrtime, ExtendedCost, nullptr, &skip_vendors))
9516 continue;
9517
9518 VendorItemData& vList = _cacheVendorItemStore[entry];
9519
9520 vList.AddItem(item_id, maxcount, incrtime, ExtendedCost);
9521 ++count;
9522 }
9523 } while (result->NextRow());
9524
9525 LOG_INFO("server.loading", ">> Loaded {} Vendors in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9526 LOG_INFO("server.loading", " ");
9527}

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

◆ LoadWaypointScripts()

void ObjectMgr::LoadWaypointScripts ( )
5815{
5817
5818 std::set<uint32> actionSet;
5819
5820 for (ScriptMapMap::const_iterator itr = sWaypointScripts.begin(); itr != sWaypointScripts.end(); ++itr)
5821 actionSet.insert(itr->first);
5822
5824 PreparedQueryResult result = WorldDatabase.Query(stmt);
5825
5826 if (result)
5827 {
5828 do
5829 {
5830 Field* fields = result->Fetch();
5831 uint32 action = fields[0].Get<uint32>();
5832
5833 actionSet.erase(action);
5834 } while (result->NextRow());
5835 }
5836
5837 for (std::set<uint32>::iterator itr = actionSet.begin(); itr != actionSet.end(); ++itr)
5838 LOG_ERROR("sql.sql", "There is no waypoint which links to the waypoint script {}", *itr);
5839}
ScriptMapMap sWaypointScripts
Definition ObjectMgr.cpp:61
@ SCRIPTS_WAYPOINT
Definition ObjectMgr.h:150
@ WORLD_SEL_WAYPOINT_DATA_ACTION
Definition WorldDatabase.h:69

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

◆ NewGOData()

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

References _gameObjectDataStore.

Referenced by AddGOData().

◆ NewOrExistCreatureData()

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

References _creatureDataStore.

Referenced by AddCreData().

◆ PlayerCreateInfoAddItemHelper()

void ObjectMgr::PlayerCreateInfoAddItemHelper ( uint32  race_,
uint32  class_,
uint32  itemId,
int32  count 
)
private
3866{
3867 if (!_playerInfo[race_][class_])
3868 return;
3869
3870 if (count > 0)
3871 _playerInfo[race_][class_]->item.push_back(PlayerCreateInfoItem(itemId, count));
3872 else
3873 {
3874 if (count < -1)
3875 LOG_ERROR("sql.sql", "Invalid count {} specified on item {} be removed from original player create info (use -1)!", count, itemId);
3876
3877 for (uint32 gender = 0; gender < GENDER_NONE; ++gender)
3878 {
3879 if (CharStartOutfitEntry const* entry = GetCharStartOutfitEntry(race_, class_, gender))
3880 {
3881 bool found = false;
3882 for (uint8 x = 0; x < MAX_OUTFIT_ITEMS; ++x)
3883 {
3884 if (entry->ItemId[x] > 0 && uint32(entry->ItemId[x]) == itemId)
3885 {
3886 found = true;
3887 const_cast<CharStartOutfitEntry*>(entry)->ItemId[x] = 0;
3888 break;
3889 }
3890 }
3891
3892 if (!found)
3893 LOG_ERROR("sql.sql", "Item {} specified to be removed from original create info not found in dbc!", itemId);
3894 }
3895 }
3896 }
3897}
CharStartOutfitEntry const * GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender)
Definition DBCStores.cpp:842
Definition Player.h:275
PlayerCreateInfoItems item
Definition Player.h:343

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

Referenced by LoadPlayerInfo().

◆ RemoveCreatureFromGrid()

void ObjectMgr::RemoveCreatureFromGrid ( ObjectGuid::LowType  guid,
CreatureData const *  data 
)
2502{
2503 uint8 mask = data->spawnMask;
2504 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2505 {
2506 if (mask & 1)
2507 {
2508 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2509 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2510 cell_guids.creatures.erase(guid);
2511 }
2512 }
2513}

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

Referenced by DeleteCreatureData().

◆ RemoveGameobjectFromGrid()

void ObjectMgr::RemoveGameobjectFromGrid ( ObjectGuid::LowType  guid,
GameObjectData const *  data 
)
2808{
2809 uint8 mask = data->spawnMask;
2810 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2811 {
2812 if (mask & 1)
2813 {
2814 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2815 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2816 cell_guids.gameobjects.erase(guid);
2817 }
2818 }
2819}

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

Referenced by DeleteGOData().

◆ RemoveVendorItem()

bool ObjectMgr::RemoveVendorItem ( uint32  entry,
uint32  item,
bool  persist = true 
)
9658{
9659 CacheVendorItemContainer::iterator iter = _cacheVendorItemStore.find(entry);
9660 if (iter == _cacheVendorItemStore.end())
9661 return false;
9662
9663 if (!iter->second.RemoveItem(item))
9664 return false;
9665
9666 if (persist)
9667 {
9669
9670 stmt->SetData(0, entry);
9671 stmt->SetData(1, item);
9672
9673 WorldDatabase.Execute(stmt);
9674 }
9675
9676 return true;
9677}
@ WORLD_DEL_NPC_VENDOR
Definition WorldDatabase.h:44

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

◆ ReturnOrDeleteOldMails()

void ObjectMgr::ReturnOrDeleteOldMails ( bool  serverUp)
6310{
6311 uint32 oldMSTime = getMSTime();
6312
6313 time_t curTime = GameTime::GetGameTime().count();
6314
6316 stmt->SetData(0, uint32(curTime));
6317 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6318 if (!result)
6319 return;
6320
6321 std::map<uint32 /*messageId*/, MailItemInfoVec> itemsCache;
6322 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_EXPIRED_MAIL_ITEMS);
6323 stmt->SetData(0, uint32(curTime));
6324 if (PreparedQueryResult items = CharacterDatabase.Query(stmt))
6325 {
6326 MailItemInfo item;
6327 do
6328 {
6329 Field* fields = items->Fetch();
6330 item.item_guid = fields[0].Get<uint32>();
6331 item.item_template = fields[1].Get<uint32>();
6332 uint32 mailId = fields[2].Get<uint32>();
6333 itemsCache[mailId].push_back(item);
6334 } while (items->NextRow());
6335 }
6336
6337 uint32 deletedCount = 0;
6338 uint32 returnedCount = 0;
6339 do
6340 {
6341 Field* fields = result->Fetch();
6342 Mail* m = new Mail;
6343 m->messageID = fields[0].Get<uint32>();
6344 m->messageType = fields[1].Get<uint8>();
6345 m->sender = fields[2].Get<uint32>();
6346 m->receiver = fields[3].Get<uint32>();
6347 bool has_items = fields[4].Get<bool>();
6348 m->expire_time = time_t(fields[5].Get<uint32>());
6349 m->deliver_time = time_t(0);
6350 m->stationery = fields[6].Get<uint8>();
6351 m->checked = fields[7].Get<uint8>();
6352 m->mailTemplateId = fields[8].Get<int16>();
6353
6354 Player* player = nullptr;
6355 if (serverUp)
6357
6358 if (player) // don't modify mails of a logged in player
6359 {
6360 delete m;
6361 continue;
6362 }
6363
6364 // Delete or return mail
6365 if (has_items)
6366 {
6367 // read items from cache
6368 m->items.swap(itemsCache[m->messageID]);
6369
6370 // If it is mail from non-player, or if it's already return mail, it shouldn't be returned, but deleted
6371 if (!m->IsSentByPlayer() || m->IsSentByGM() || (m->IsCODPayment() || m->IsReturnedMail()))
6372 {
6373 for (auto const& mailedItem : m->items)
6374 {
6375 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
6376 stmt->SetData(0, mailedItem.item_guid);
6377 CharacterDatabase.Execute(stmt);
6378 }
6379
6380 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
6381 stmt->SetData(0, m->messageID);
6382 CharacterDatabase.Execute(stmt);
6383 }
6384 else
6385 {
6386 // Mail will be returned
6387 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_RETURNED);
6388 stmt->SetData(0, m->receiver);
6389 stmt->SetData(1, m->sender);
6390 stmt->SetData(2, uint32(curTime + 30 * DAY));
6391 stmt->SetData(3, uint32(curTime));
6393 stmt->SetData(5, m->messageID);
6394 CharacterDatabase.Execute(stmt);
6395 for (auto const& mailedItem : m->items)
6396 {
6397 // Update receiver in mail items for its proper delivery, and in instance_item for avoid lost item at sender delete
6398 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_ITEM_RECEIVER);
6399 stmt->SetData(0, m->sender);
6400 stmt->SetData(1, mailedItem.item_guid);
6401 CharacterDatabase.Execute(stmt);
6402
6403 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_OWNER);
6404 stmt->SetData(0, m->sender);
6405 stmt->SetData(1, mailedItem.item_guid);
6406 CharacterDatabase.Execute(stmt);
6407 }
6408
6409 // xinef: update global data
6410 sCharacterCache->IncreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->sender));
6411 sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver));
6412
6413 delete m;
6414 ++returnedCount;
6415 continue;
6416 }
6417 }
6418
6419 sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver));
6420
6421 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
6422 stmt->SetData(0, m->messageID);
6423 CharacterDatabase.Execute(stmt);
6424 delete m;
6425 ++deletedCount;
6426 } while (result->NextRow());
6427
6428 LOG_INFO("server.loading", ">> Processed {} expired mails: {} deleted and {} returned in {} ms", deletedCount + returnedCount, deletedCount, returnedCount, GetMSTimeDiffToNow(oldMSTime));
6429 LOG_INFO("server.loading", " ");
6430}
#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:382
@ 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:1071
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 
)
2121{
2122 if (!guidLow)
2123 return false;
2124
2125 CreatureData const* master = GetCreatureData(guidLow);
2126 ObjectGuid guid = ObjectGuid::Create<HighGuid::Unit>(master->id1, guidLow);
2127
2128 if (!linkedGuidLow) // we're removing the linking
2129 {
2130 _linkedRespawnStore.erase(guid);
2132 stmt->SetData(0, guidLow);
2133 WorldDatabase.Execute(stmt);
2134 return true;
2135 }
2136
2137 CreatureData const* slave = GetCreatureData(linkedGuidLow);
2138 if (!slave)
2139 {
2140 LOG_ERROR("sql.sql", "Creature '{}' linking to non-existent creature '{}'.", guidLow, linkedGuidLow);
2141 return false;
2142 }
2143
2144 MapEntry const* map = sMapStore.LookupEntry(master->mapid);
2145 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
2146 {
2147 LOG_ERROR("sql.sql", "Creature '{}' linking to '{}' on an unpermitted map.", guidLow, linkedGuidLow);
2148 return false;
2149 }
2150
2151 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
2152 {
2153 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
2154 return false;
2155 }
2156
2157 ObjectGuid linkedGuid = ObjectGuid::Create<HighGuid::Unit>(slave->id1, linkedGuidLow);
2158
2159 _linkedRespawnStore[guid] = linkedGuid;
2161 stmt->SetData(0, guidLow);
2162 stmt->SetData(1, linkedGuidLow);
2163 WorldDatabase.Execute(stmt);
2164 return true;
2165}
@ WORLD_REP_CREATURE_LINKED_RESPAWN
Definition WorldDatabase.h:33
@ WORLD_DEL_CRELINKED_RESPAWN
Definition WorldDatabase.h:32

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

◆ SetDBCLocaleIndex()

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

References DBCLocaleIndex.

◆ SetHighestGuids()

void ObjectMgr::SetHighestGuids ( )
7192{
7193 QueryResult result = CharacterDatabase.Query("SELECT MAX(guid) FROM characters");
7194 if (result)
7195 GetGuidSequenceGenerator<HighGuid::Player>().Set((*result)[0].Get<uint32>() + 1);
7196
7197 result = CharacterDatabase.Query("SELECT MAX(guid) FROM item_instance");
7198 if (result)
7199 GetGuidSequenceGenerator<HighGuid::Item>().Set((*result)[0].Get<uint32>() + 1);
7200
7201 // Cleanup other tables from not existed guids ( >= _hiItemGuid)
7202 CharacterDatabase.Execute("DELETE FROM character_inventory WHERE item >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7203 CharacterDatabase.Execute("DELETE FROM mail_items WHERE item_guid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7204 CharacterDatabase.Execute("DELETE FROM auctionhouse WHERE itemguid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7205 CharacterDatabase.Execute("DELETE FROM guild_bank_item WHERE item_guid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7206
7207 result = WorldDatabase.Query("SELECT MAX(guid) FROM transports");
7208 if (result)
7209 GetGuidSequenceGenerator<HighGuid::Mo_Transport>().Set((*result)[0].Get<uint32>() + 1);
7210
7211 result = CharacterDatabase.Query("SELECT MAX(id) FROM auctionhouse");
7212 if (result)
7213 _auctionId = (*result)[0].Get<uint32>() + 1;
7214
7215 result = CharacterDatabase.Query("SELECT MAX(id) FROM mail");
7216 if (result)
7217 _mailId = (*result)[0].Get<uint32>() + 1;
7218
7219 result = CharacterDatabase.Query("SELECT MAX(arenateamid) FROM arena_team");
7220 if (result)
7221 sArenaTeamMgr->SetNextArenaTeamId((*result)[0].Get<uint32>() + 1);
7222
7223 result = CharacterDatabase.Query("SELECT MAX(fight_id) FROM log_arena_fights");
7224 if (result)
7225 sArenaTeamMgr->SetLastArenaLogId((*result)[0].Get<uint32>());
7226
7227 result = CharacterDatabase.Query("SELECT MAX(setguid) FROM character_equipmentsets");
7228 if (result)
7229 _equipmentSetGuid = (*result)[0].Get<uint64>() + 1;
7230
7231 result = CharacterDatabase.Query("SELECT MAX(guildId) FROM guild");
7232 if (result)
7233 sGuildMgr->SetNextGuildId((*result)[0].Get<uint32>() + 1);
7234
7235 result = WorldDatabase.Query("SELECT MAX(guid) FROM creature");
7236 if (result)
7237 _creatureSpawnId = (*result)[0].Get<uint32>() + 1;
7238
7239 result = WorldDatabase.Query("SELECT MAX(guid) FROM gameobject");
7240 if (result)
7241 _gameObjectSpawnId = (*result)[0].Get<uint32>() + 1;
7242}
#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 ( )
5902{
5903 uint32 oldMSTime = getMSTime();
5904
5905 if (_spellScriptsStore.empty())
5906 {
5907 LOG_INFO("server.loading", ">> Validated 0 scripts.");
5908 LOG_INFO("server.loading", " ");
5909 return;
5910 }
5911
5912 uint32 count = 0;
5913
5914 for (SpellScriptsContainer::iterator itr = _spellScriptsStore.begin(); itr != _spellScriptsStore.end();)
5915 {
5916 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
5917 std::vector<std::pair<SpellScriptLoader*, SpellScriptsContainer::iterator> > SpellScriptLoaders;
5918 sScriptMgr->CreateSpellScriptLoaders(itr->first, SpellScriptLoaders);
5919 itr = _spellScriptsStore.upper_bound(itr->first);
5920
5921 for (std::vector<std::pair<SpellScriptLoader*, SpellScriptsContainer::iterator> >::iterator sitr = SpellScriptLoaders.begin(); sitr != SpellScriptLoaders.end(); ++sitr)
5922 {
5923 SpellScript* spellScript = sitr->first->GetSpellScript();
5924 AuraScript* auraScript = sitr->first->GetAuraScript();
5925 bool valid = true;
5926 if (!spellScript && !auraScript)
5927 {
5928 LOG_ERROR("sql.sql", "Functions GetSpellScript() and GetAuraScript() of script `{}` do not return objects - script skipped", GetScriptName(sitr->second->second));
5929 valid = false;
5930 }
5931 if (spellScript)
5932 {
5933 spellScript->_Init(&sitr->first->GetName(), spellInfo->Id);
5934 spellScript->_Register();
5935 if (!spellScript->_Validate(spellInfo))
5936 valid = false;
5937 delete spellScript;
5938 }
5939 if (auraScript)
5940 {
5941 auraScript->_Init(&sitr->first->GetName(), spellInfo->Id);
5942 auraScript->_Register();
5943 if (!auraScript->_Validate(spellInfo))
5944 valid = false;
5945 delete auraScript;
5946 }
5947 if (!valid)
5948 {
5949 _spellScriptsStore.erase(sitr->second);
5950 }
5951 }
5952 ++count;
5953 }
5954
5955 LOG_INFO("server.loading", ">> Validated {} scripts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5956 LOG_INFO("server.loading", " ");
5957}
Definition SpellScript.h:517
bool _Validate(SpellInfo const *entry) override
Definition SpellScript.cpp:662
std::string const & GetScriptName(uint32 id) const
Definition ObjectMgr.cpp:9815
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().

◆ _broadcastTextStore

BroadcastTextContainer ObjectMgr::_broadcastTextStore
private

◆ _cacheTrainerSpellStore

CacheTrainerSpellContainer ObjectMgr::_cacheTrainerSpellStore
private

◆ _cacheVendorItemStore

◆ _creatureAddonStore

CreatureAddonContainer ObjectMgr::_creatureAddonStore
private

◆ _creatureBaseStatsStore

CreatureBaseStatsContainer ObjectMgr::_creatureBaseStatsStore
private

◆ _creatureCustomIDsStore

CreatureCustomIDsContainer ObjectMgr::_creatureCustomIDsStore
private

◆ _creatureDataStore

◆ _creatureLocaleStore

CreatureLocaleContainer ObjectMgr::_creatureLocaleStore
private

◆ _creatureModelStore

CreatureModelContainer ObjectMgr::_creatureModelStore
private

◆ _creatureMovementOverrides

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

◆ _creatureQuestInvolvedRelations

◆ _creatureQuestItemStore

CreatureQuestItemMap ObjectMgr::_creatureQuestItemStore
private

◆ _creatureQuestRelations

QuestRelations ObjectMgr::_creatureQuestRelations
private

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

GameObjectDataContainer ObjectMgr::_gameObjectDataStore
private

◆ _gameObjectLocaleStore

GameObjectLocaleContainer ObjectMgr::_gameObjectLocaleStore
private

◆ _gameObjectQuestItemStore

GameObjectQuestItemMap ObjectMgr::_gameObjectQuestItemStore
private

◆ _gameObjectSpawnId

ObjectGuid::LowType ObjectMgr::_gameObjectSpawnId
private

◆ _gameObjectTemplateAddonStore

GameObjectTemplateAddonContainer ObjectMgr::_gameObjectTemplateAddonStore
private

◆ _gameObjectTemplateStore

GameObjectTemplateContainer ObjectMgr::_gameObjectTemplateStore
private

◆ _gameTeleStore

◆ _goQuestInvolvedRelations

QuestRelations ObjectMgr::_goQuestInvolvedRelations
private

◆ _goQuestRelations

QuestRelations ObjectMgr::_goQuestRelations
private

◆ _gossipMenuItemsLocaleStore

GossipMenuItemsLocaleContainer ObjectMgr::_gossipMenuItemsLocaleStore
private

◆ _gossipMenuItemsStore

◆ _gossipMenusStore

GossipMenusContainer ObjectMgr::_gossipMenusStore
private

◆ _gossipTextStore

GossipTextContainer ObjectMgr::_gossipTextStore
private

Referenced by GetGossipText(), and LoadGossipText().

◆ _guidGenerators

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

◆ _hasDifficultyEntries

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

Referenced by CheckCreatureTemplate().

◆ _hiPetNumber

uint32 ObjectMgr::_hiPetNumber
private

Referenced by GeneratePetNumber(), and LoadPetNumber().

◆ _hiPetNumberMutex

std::mutex ObjectMgr::_hiPetNumberMutex
private

Referenced by GeneratePetNumber().

◆ _instanceTemplateStore

InstanceTemplateContainer ObjectMgr::_instanceTemplateStore
private

◆ _itemLocaleStore

ItemLocaleContainer ObjectMgr::_itemLocaleStore
private

Referenced by GetItemLocale(), and LoadItemLocales().

◆ _itemSetNameLocaleStore

ItemSetNameLocaleContainer ObjectMgr::_itemSetNameLocaleStore
private

◆ _itemSetNameStore

ItemSetNameContainer ObjectMgr::_itemSetNameStore
private

◆ _itemTemplateStore

ItemTemplateContainer ObjectMgr::_itemTemplateStore
private

◆ _itemTemplateStoreFast

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

◆ _linkedRespawnStore

LinkedRespawnContainer ObjectMgr::_linkedRespawnStore
private

◆ _mailId

uint32 ObjectMgr::_mailId
private

Referenced by GenerateMailID(), and SetHighestGuids().

◆ _mailIdMutex

std::mutex ObjectMgr::_mailIdMutex
private

Referenced by GenerateMailID().

◆ _mailLevelRewardStore

MailLevelRewardContainer ObjectMgr::_mailLevelRewardStore
private

◆ _mapObjectGuidsStore

◆ _moduleStringStore

ModuleStringContainer ObjectMgr::_moduleStringStore
private

◆ _npcTextLocaleStore

NpcTextLocaleContainer ObjectMgr::_npcTextLocaleStore
private

◆ _pageTextLocaleStore

PageTextLocaleContainer ObjectMgr::_pageTextLocaleStore
private

◆ _pageTextStore

PageTextContainer ObjectMgr::_pageTextStore
private

Referenced by GetPageText(), and LoadPageTexts().

◆ _petHalfLocaleName0

HalfNameContainerLocale ObjectMgr::_petHalfLocaleName0
private

◆ _petHalfLocaleName1

HalfNameContainerLocale ObjectMgr::_petHalfLocaleName1
private

◆ _petHalfName0

HalfNameContainer ObjectMgr::_petHalfName0
private

Referenced by GeneratePetName(), and LoadPetNames().

◆ _petHalfName1

HalfNameContainer ObjectMgr::_petHalfName1
private

Referenced by GeneratePetName(), and LoadPetNames().

◆ _petInfoStore

PetLevelInfoContainer ObjectMgr::_petInfoStore
private

◆ _playerClassInfo

◆ _playerInfo

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

◆ _spellClickInfoStore

◆ _spellScriptsStore

SpellScriptsContainer ObjectMgr::_spellScriptsStore
private

◆ _tavernAreaTriggerStore

TavernAreaTriggerContainer ObjectMgr::_tavernAreaTriggerStore
private

◆ _tempSummonDataStore

TempSummonDataContainer ObjectMgr::_tempSummonDataStore
private

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

Referenced by GetSummonGroup(), and LoadTempSummons().

◆ _transportMaps

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

◆ _vehicleAccessoryStore

VehicleAccessoryContainer ObjectMgr::_vehicleAccessoryStore
private

◆ _vehicleSeatAddonStore

VehicleSeatAddonContainer ObjectMgr::_vehicleSeatAddonStore
private

◆ _vehicleTemplateAccessoryStore

VehicleAccessoryContainer ObjectMgr::_vehicleTemplateAccessoryStore
private

◆ DBCLocaleIndex

LocaleConstant ObjectMgr::DBCLocaleIndex
private

◆ FactionChangeAchievements

CharacterConversionMap ObjectMgr::FactionChangeAchievements

◆ FactionChangeItems

CharacterConversionMap ObjectMgr::FactionChangeItems

Referenced by LoadFactionChangeItems().

◆ FactionChangeQuests

CharacterConversionMap ObjectMgr::FactionChangeQuests

Referenced by LoadFactionChangeQuests().

◆ FactionChangeReputation

CharacterConversionMap ObjectMgr::FactionChangeReputation

◆ FactionChangeSpells

CharacterConversionMap ObjectMgr::FactionChangeSpells

Referenced by LoadFactionChangeSpells().

◆ FactionChangeTitles

CharacterConversionMap ObjectMgr::FactionChangeTitles

Referenced by LoadFactionChangeTitles().

◆ GameobjectInstanceSavedStateList

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

◆ mExclusiveQuestGroups

ExclusiveQuestGroups ObjectMgr::mExclusiveQuestGroups

Referenced by LoadQuests().


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