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:305
PlayerLevelInfo * levelInfo
Definition Player.h:359

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 
)
2474{
2475 uint8 mask = data->spawnMask;
2476 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2477 {
2478 if (mask & 1)
2479 {
2480 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2481 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2482 cell_guids.creatures.insert(guid);
2483 }
2484 }
2485}
uint32 MAKE_PAIR32(uint16 l, uint16 h)
Definition ObjectDefines.h:89
MapObjectGuids _mapObjectGuidsStore
Definition ObjectMgr.h:1580
GridCoord ComputeGridCoord(float x, float y)
Definition GridDefines.h:181
Definition ObjectMgr.h:478
CellGuidSet creatures
Definition ObjectMgr.h:479
Definition GridDefines.h:84
uint32 GetId() const
Definition GridDefines.h:146

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 
)
2553{
2554 CreatureTemplate const* cInfo = GetCreatureTemplate(entry);
2555 if (!cInfo)
2556 return 0;
2557
2558 uint32 level = cInfo->minlevel == cInfo->maxlevel ? cInfo->minlevel : urand(cInfo->minlevel, cInfo->maxlevel); // Only used for extracting creature base stats
2559 CreatureBaseStats const* stats = GetCreatureBaseStats(level, cInfo->unit_class);
2560 Map* map = sMapMgr->CreateBaseMap(mapId);
2561 if (!map)
2562 return 0;
2563
2565 CreatureData& data = NewOrExistCreatureData(spawnId);
2566 data.spawnMask = spawnId;
2567 data.id1 = entry;
2568 data.id2 = 0;
2569 data.id3 = 0;
2570 data.mapid = mapId;
2571 data.displayid = 0;
2572 data.equipmentId = 0;
2573 data.posX = x;
2574 data.posY = y;
2575 data.posZ = z;
2576 data.orientation = o;
2577 data.spawntimesecs = spawntimedelay;
2578 data.wander_distance = 0;
2579 data.currentwaypoint = 0;
2580 data.curhealth = stats->GenerateHealth(cInfo);
2581 data.curmana = stats->GenerateMana(cInfo);
2582 data.movementType = cInfo->MovementType;
2583 data.spawnMask = 1;
2585 data.dbData = false;
2586 data.npcflag = cInfo->npcflag;
2587 data.unit_flags = cInfo->unit_flags;
2588 data.dynamicflags = cInfo->dynamicflags;
2589
2590 AddCreatureToGrid(spawnId, &data);
2591
2592 // Spawn if necessary (loaded grids only)
2593 if (!map->Instanceable() && map->IsGridLoaded(x, y))
2594 {
2595 Creature* creature = new Creature();
2596 if (!creature->LoadCreatureFromDB(spawnId, map, true, true))
2597 {
2598 LOG_ERROR("sql.sql", "AddCreature: Cannot add creature entry {} to map", entry);
2599 delete creature;
2600 return 0;
2601 }
2602 }
2603
2604 return spawnId;
2605}
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:61
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
Definition Creature.h:43
bool LoadCreatureFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true, bool allowDuplicate=false)
Definition Creature.cpp:1703
Definition Map.h:158
bool IsGridLoaded(GridCoord const &gridCoord) const
Definition Map.cpp:217
bool Instanceable() const
Definition Map.h:289
uint32 LowType
Definition ObjectGuid.h:122
CreatureBaseStats const * GetCreatureBaseStats(uint8 level, uint8 unitClass)
Definition ObjectMgr.cpp:9950
void AddCreatureToGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition ObjectMgr.cpp:2473
ObjectGuid::LowType GenerateCreatureSpawnId()
Definition ObjectMgr.cpp:7264
CreatureData & NewOrExistCreatureData(ObjectGuid::LowType spawnId)
Definition ObjectMgr.h:1216
CreatureTemplate const * GetCreatureTemplate(uint32 entry)
Definition ObjectMgr.cpp:10298
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 
)
2780{
2781 uint8 mask = data->spawnMask;
2782 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2783 {
2784 if (mask & 1)
2785 {
2786 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2787 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2788 cell_guids.gameobjects.insert(guid);
2789 }
2790 }
2791}
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)
9182{
9183 // find max id
9184 uint32 new_id = 0;
9185 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9186 if (itr->first > new_id)
9187 new_id = itr->first;
9188
9189 // use next
9190 ++new_id;
9191
9192 if (!Utf8toWStr(tele.name, tele.wnameLow))
9193 return false;
9194
9195 wstrToLower(tele.wnameLow);
9196
9197 _gameTeleStore[new_id] = tele;
9198
9200
9201 stmt->SetData(0, new_id);
9202 stmt->SetData(1, tele.position_x);
9203 stmt->SetData(2, tele.position_y);
9204 stmt->SetData(3, tele.position_z);
9205 stmt->SetData(4, tele.orientation);
9206 stmt->SetData(5, uint16(tele.mapId));
9207 stmt->SetData(6, tele.name);
9208
9209 WorldDatabase.Execute(stmt);
9210
9211 return true;
9212}
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 
)
2502{
2503 GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
2504 if (!goinfo)
2505 return 0;
2506
2507 Map* map = sMapMgr->CreateBaseMap(mapId);
2508 if (!map)
2509 return 0;
2510
2512
2513 GameObjectData& data = NewGOData(spawnId);
2514 data.id = entry;
2515 data.mapid = mapId;
2516 data.posX = x;
2517 data.posY = y;
2518 data.posZ = z;
2519 data.orientation = o;
2520 data.rotation.x = rotation0;
2521 data.rotation.y = rotation1;
2522 data.rotation.z = rotation2;
2523 data.rotation.w = rotation3;
2524 data.spawntimesecs = spawntimedelay;
2525 data.animprogress = 100;
2526 data.spawnMask = 1;
2527 data.go_state = GO_STATE_READY;
2529 data.artKit = goinfo->type == GAMEOBJECT_TYPE_CAPTURE_POINT ? 21 : 0;
2530 data.dbData = false;
2531
2532 AddGameobjectToGrid(spawnId, &data);
2533
2534 // Spawn if necessary (loaded grids only)
2535 // We use spawn coords to spawn
2536 if (!map->Instanceable() && map->IsGridLoaded(x, y))
2537 {
2539 if (!go->LoadGameObjectFromDB(spawnId, map))
2540 {
2541 LOG_ERROR("sql.sql", "AddGOData: cannot add gameobject entry {} to map", entry);
2542 delete go;
2543 return 0;
2544 }
2545 }
2546
2547 LOG_DEBUG("maps", "AddGOData: spawnId {} entry {} map {} x {} y {} z {} o {}", spawnId, entry, mapId, x, y, z, o);
2548
2549 return spawnId;
2550}
@ GO_STATE_READY
Definition GameObjectData.h:690
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
@ GAMEOBJECT_TYPE_CAPTURE_POINT
Definition SharedDefines.h:1589
Definition GameObject.h:120
bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition GameObject.cpp:1108
void AddGameobjectToGrid(ObjectGuid::LowType guid, GameObjectData const *data)
Definition ObjectMgr.cpp:2779
GameObjectTemplate const * GetGameObjectTemplate(uint32 entry)
Definition ObjectMgr.cpp:10274
ObjectGuid::LowType GenerateGameObjectSpawnId()
Definition ObjectMgr.cpp:7274
GameObjectData & NewGOData(ObjectGuid::LowType guid)
Definition ObjectMgr.h:1301
bool IsGameObjectStaticTransport(uint32 entry)
Definition ObjectMgr.cpp:10283
Definition Transport.h:113
Definition GameObjectData.h:696
bool dbData
Definition GameObjectData.h:712
float orientation
Definition GameObjectData.h:704
float posZ
Definition GameObjectData.h:703
uint8 artKit
Definition GameObjectData.h:711
int32 spawntimesecs
Definition GameObjectData.h:706
uint8 spawnMask
Definition GameObjectData.h:710
G3D::Quat rotation
Definition GameObjectData.h:705
uint32 animprogress
Definition GameObjectData.h:708
uint16 mapid
Definition GameObjectData.h:699
float posX
Definition GameObjectData.h:701
uint32 phaseMask
Definition GameObjectData.h:700
float posY
Definition GameObjectData.h:702
uint32 id
Definition GameObjectData.h:698
GOState go_state
Definition GameObjectData.h:709
Definition 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)
8549{
8550 if (!IsProfanityName(name))
8551 {
8552 std::wstring wstr;
8553 if (!Utf8toWStr(name, wstr))
8554 {
8555 LOG_ERROR("server", "Could not add invalid name to profanity player names: {}", name);
8556 return;
8557 }
8558 wstrToLower(wstr);
8559
8560 _profanityNamesStore.insert(wstr);
8561
8563 stmt->SetData(0, name);
8564 CharacterDatabase.Execute(stmt);
8565 }
8566}
@ 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:8533

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

◆ AddReservedPlayerName()

void ObjectMgr::AddReservedPlayerName ( std::string const &  name)
8446{
8447 if (!IsReservedName(name))
8448 {
8449 std::wstring wstr;
8450 if (!Utf8toWStr(name, wstr))
8451 {
8452 LOG_ERROR("server", "Could not add invalid name to reserved player names: {}", name);
8453 return;
8454 }
8455 wstrToLower(wstr);
8456
8457 _reservedNamesStore.insert(wstr);
8458
8460 stmt->SetData(0, name);
8461 CharacterDatabase.Execute(stmt);
8462 }
8463}
@ CHAR_INS_RESERVED_PLAYER_NAME
Definition CharacterDatabase.h:519
bool IsReservedName(std::string_view name) const
Definition ObjectMgr.cpp:8430
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 
)
9303{
9304 if (entry >= ACORE_TRAINER_START_REF)
9305 return;
9306
9307 CreatureTemplate const* cInfo = GetCreatureTemplate(entry);
9308 if (!cInfo)
9309 {
9310 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry for a non-existing creature template (Entry: {}), ignoring", entry);
9311 return;
9312 }
9313
9314 if (!(cInfo->npcflag & UNIT_NPC_FLAG_TRAINER))
9315 {
9316 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry for a creature template (Entry: {}) without trainer flag, ignoring", entry);
9317 return;
9318 }
9319
9320 SpellInfo const* spellinfo = sSpellMgr->GetSpellInfo(spell);
9321 if (!spellinfo)
9322 {
9323 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a non-existing spell (Spell: {}), ignoring", entry, spell);
9324 return;
9325 }
9326
9327 if (!SpellMgr::ComputeIsSpellValid(spellinfo))
9328 {
9329 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a broken spell (Spell: {}), ignoring", entry, spell);
9330 return;
9331 }
9332
9333 if (GetTalentSpellCost(spell))
9334 {
9335 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a non-existing spell (Spell: {}) which is a talent, ignoring", entry, spell);
9336 return;
9337 }
9338
9339 if (reqSpell && !sSpellMgr->GetSpellInfo(reqSpell))
9340 {
9341 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a non-existing reqSpell (Spell: {}), ignoring", entry, reqSpell);
9342 return;
9343 }
9344
9346
9347 TrainerSpell& trainerSpell = data.spellList[spell];
9348 trainerSpell.spell = spell;
9349 trainerSpell.spellCost = spellCost;
9350 trainerSpell.reqSkill = reqSkill;
9351 trainerSpell.reqSkillValue = reqSkillValue;
9352 trainerSpell.reqLevel = reqLevel;
9353 trainerSpell.reqSpell = reqSpell;
9354
9355 if (!trainerSpell.reqLevel)
9356 trainerSpell.reqLevel = spellinfo->SpellLevel;
9357
9358 // calculate learned spell for profession case when stored cast-spell
9359 trainerSpell.learnedSpell[0] = spell;
9360 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
9361 {
9362 if (spellinfo->Effects[i].Effect != SPELL_EFFECT_LEARN_SPELL)
9363 continue;
9364 if (trainerSpell.learnedSpell[0] == spell)
9365 trainerSpell.learnedSpell[0] = 0;
9366 // player must be able to cast spell on himself
9367 if (spellinfo->Effects[i].TargetA.GetTarget() != 0 && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_TARGET_ALLY
9368 && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_TARGET_ANY && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_CASTER)
9369 {
9370 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);
9371 continue;
9372 }
9373
9374 trainerSpell.learnedSpell[i] = spellinfo->Effects[i].TriggerSpell;
9375
9376 if (trainerSpell.learnedSpell[i])
9377 {
9378 SpellInfo const* learnedSpellInfo = sSpellMgr->GetSpellInfo(trainerSpell.learnedSpell[i]);
9379 if (learnedSpellInfo && learnedSpellInfo->IsProfession())
9380 data.trainerType = 2;
9381 }
9382 }
9383
9384 return;
9385}
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:814
@ TARGET_UNIT_TARGET_ALLY
Definition SharedDefines.h:1425
@ TARGET_UNIT_TARGET_ANY
Definition SharedDefines.h:1429
@ TARGET_UNIT_CASTER
Definition SharedDefines.h:1410
#define sSpellMgr
Definition SpellMgr.h:825
@ UNIT_NPC_FLAG_TRAINER
Definition UnitDefines.h:319
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 
)
9628{
9629 VendorItemData& vList = _cacheVendorItemStore[entry];
9630 vList.AddItem(item, maxcount, incrtime, extendedCost);
9631
9632 if (persist)
9633 {
9635
9636 stmt->SetData(0, entry);
9637 stmt->SetData(1, item);
9638 stmt->SetData(2, maxcount);
9639 stmt->SetData(3, incrtime);
9640 stmt->SetData(4, extendedCost);
9641
9642 WorldDatabase.Execute(stmt);
9643 }
9644}
@ 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
4538{
4539 // base data (last known level)
4540 *info = _playerInfo[race][_class]->levelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1];
4541
4542 // if conversion from uint32 to uint8 causes unexpected behaviour, change lvl to uint32
4543 for (uint8 lvl = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1; lvl < level; ++lvl)
4544 {
4545 switch (_class)
4546 {
4547 case CLASS_WARRIOR:
4548 info->stats[STAT_STRENGTH] += (lvl > 23 ? 2 : (lvl > 1 ? 1 : 0));
4549 info->stats[STAT_STAMINA] += (lvl > 23 ? 2 : (lvl > 1 ? 1 : 0));
4550 info->stats[STAT_AGILITY] += (lvl > 36 ? 1 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4551 info->stats[STAT_INTELLECT] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4552 info->stats[STAT_SPIRIT] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4553 break;
4554 case CLASS_PALADIN:
4555 info->stats[STAT_STRENGTH] += (lvl > 3 ? 1 : 0);
4556 info->stats[STAT_STAMINA] += (lvl > 33 ? 2 : (lvl > 1 ? 1 : 0));
4557 info->stats[STAT_AGILITY] += (lvl > 38 ? 1 : (lvl > 7 && !(lvl % 2) ? 1 : 0));
4558 info->stats[STAT_INTELLECT] += (lvl > 6 && (lvl % 2) ? 1 : 0);
4559 info->stats[STAT_SPIRIT] += (lvl > 7 ? 1 : 0);
4560 break;
4561 case CLASS_HUNTER:
4562 info->stats[STAT_STRENGTH] += (lvl > 4 ? 1 : 0);
4563 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4564 info->stats[STAT_AGILITY] += (lvl > 33 ? 2 : (lvl > 1 ? 1 : 0));
4565 info->stats[STAT_INTELLECT] += (lvl > 8 && (lvl % 2) ? 1 : 0);
4566 info->stats[STAT_SPIRIT] += (lvl > 38 ? 1 : (lvl > 9 && !(lvl % 2) ? 1 : 0));
4567 break;
4568 case CLASS_ROGUE:
4569 info->stats[STAT_STRENGTH] += (lvl > 5 ? 1 : 0);
4570 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4571 info->stats[STAT_AGILITY] += (lvl > 16 ? 2 : (lvl > 1 ? 1 : 0));
4572 info->stats[STAT_INTELLECT] += (lvl > 8 && !(lvl % 2) ? 1 : 0);
4573 info->stats[STAT_SPIRIT] += (lvl > 38 ? 1 : (lvl > 9 && !(lvl % 2) ? 1 : 0));
4574 break;
4575 case CLASS_PRIEST:
4576 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4577 info->stats[STAT_STAMINA] += (lvl > 5 ? 1 : 0);
4578 info->stats[STAT_AGILITY] += (lvl > 38 ? 1 : (lvl > 8 && (lvl % 2) ? 1 : 0));
4579 info->stats[STAT_INTELLECT] += (lvl > 22 ? 2 : (lvl > 1 ? 1 : 0));
4580 info->stats[STAT_SPIRIT] += (lvl > 3 ? 1 : 0);
4581 break;
4582 case CLASS_SHAMAN:
4583 info->stats[STAT_STRENGTH] += (lvl > 34 ? 1 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4584 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4585 info->stats[STAT_AGILITY] += (lvl > 7 && !(lvl % 2) ? 1 : 0);
4586 info->stats[STAT_INTELLECT] += (lvl > 5 ? 1 : 0);
4587 info->stats[STAT_SPIRIT] += (lvl > 4 ? 1 : 0);
4588 break;
4589 case CLASS_MAGE:
4590 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4591 info->stats[STAT_STAMINA] += (lvl > 5 ? 1 : 0);
4592 info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4593 info->stats[STAT_INTELLECT] += (lvl > 24 ? 2 : (lvl > 1 ? 1 : 0));
4594 info->stats[STAT_SPIRIT] += (lvl > 33 ? 2 : (lvl > 2 ? 1 : 0));
4595 break;
4596 case CLASS_WARLOCK:
4597 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4598 info->stats[STAT_STAMINA] += (lvl > 38 ? 2 : (lvl > 3 ? 1 : 0));
4599 info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4600 info->stats[STAT_INTELLECT] += (lvl > 33 ? 2 : (lvl > 2 ? 1 : 0));
4601 info->stats[STAT_SPIRIT] += (lvl > 38 ? 2 : (lvl > 3 ? 1 : 0));
4602 break;
4603 case CLASS_DRUID:
4604 info->stats[STAT_STRENGTH] += (lvl > 38 ? 2 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4605 info->stats[STAT_STAMINA] += (lvl > 32 ? 2 : (lvl > 4 ? 1 : 0));
4606 info->stats[STAT_AGILITY] += (lvl > 38 ? 2 : (lvl > 8 && (lvl % 2) ? 1 : 0));
4607 info->stats[STAT_INTELLECT] += (lvl > 38 ? 3 : (lvl > 4 ? 1 : 0));
4608 info->stats[STAT_SPIRIT] += (lvl > 38 ? 3 : (lvl > 5 ? 1 : 0));
4609 }
4610 }
4611}
@ CLASS_HUNTER
Definition SharedDefines.h:143
@ CLASS_DRUID
Definition SharedDefines.h:151
@ CLASS_SHAMAN
Definition SharedDefines.h:147
@ CLASS_PRIEST
Definition SharedDefines.h:145
@ CLASS_WARRIOR
Definition SharedDefines.h:141
@ CLASS_WARLOCK
Definition SharedDefines.h:149
@ CLASS_MAGE
Definition SharedDefines.h:148
@ CLASS_PALADIN
Definition SharedDefines.h:142
@ CLASS_ROGUE
Definition SharedDefines.h:144
@ STAT_SPIRIT
Definition SharedDefines.h:262
@ STAT_INTELLECT
Definition SharedDefines.h:261
@ STAT_AGILITY
Definition SharedDefines.h:259
@ STAT_STRENGTH
Definition SharedDefines.h:258
@ STAT_STAMINA
Definition SharedDefines.h:260
@ CONFIG_MAX_PLAYER_LEVEL
Definition WorldConfig.h:186
#define sWorld
Definition World.h:320
std::array< uint32, MAX_STATS > stats
Definition Player.h:315

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 
)
9001{
9002 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
9003 if (!fArea)
9004 {
9005 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
9006 return;
9007 }
9008
9009 _fishingBaseForAreaStore[entry] = skill;
9010
9011 LOG_INFO("server.loading", ">> Fishing base skill level of area {} changed to {}", entry, skill);
9012 LOG_INFO("server.loading", " ");
9013}
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 
)
1246{
1247 if (creatureMovement.Ground >= CreatureGroundMovementType::Max)
1248 {
1249 LOG_ERROR("sql.sql", "`{}`.`Ground` wrong value ({}) for Id {}, setting to Run.", table, uint32(creatureMovement.Ground), id);
1250 creatureMovement.Ground = CreatureGroundMovementType::Run;
1251 }
1252
1253 if (creatureMovement.Flight >= CreatureFlightMovementType::Max)
1254 {
1255 LOG_ERROR("sql.sql", "`{}`.`Flight` wrong value ({}) for Id {}, setting to None.", table, uint32(creatureMovement.Flight), id);
1256 creatureMovement.Flight = CreatureFlightMovementType::None;
1257 }
1258
1259 if (creatureMovement.Chase >= CreatureChaseMovementType::Max)
1260 {
1261 LOG_ERROR("sql.sql", "`{}`.`Chase` wrong value ({}) for Id {}, setting to Run.", table, uint32(creatureMovement.Chase), id);
1262 creatureMovement.Chase = CreatureChaseMovementType::Run;
1263 }
1264
1265 if (creatureMovement.Random >= CreatureRandomMovementType::Max)
1266 {
1267 LOG_ERROR("sql.sql", "`{}`.`Random` wrong value ({}) for Id {}, setting to Walk.", table, uint32(creatureMovement.Random), id);
1268 creatureMovement.Random = CreatureRandomMovementType::Walk;
1269 }
1270}
CreatureRandomMovementType Random
Definition CreatureData.h:127
CreatureFlightMovementType Flight
Definition CreatureData.h:123
CreatureChaseMovementType Chase
Definition CreatureData.h:126
CreatureGroundMovementType Ground
Definition CreatureData.h:122

References CreatureMovementData::Chase, CreatureMovementData::Flight, CreatureMovementData::Ground, LOG_ERROR, 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 if (std::accumulate(cInfo->Models.begin(), cInfo->Models.end(), 0.0f, [](float sum, CreatureModel const& model) { return sum + model.Probability; }) <= 0.0f)
1126 LOG_ERROR("sql.sql", "Creature (Entry: {}) has zero total chance for all models in creature_template_model.", cInfo->Entry);
1127
1128 if (!cInfo->unit_class || ((1 << (cInfo->unit_class - 1)) & CLASSMASK_ALL_CREATURES) == 0)
1129 {
1130 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid unit_class ({}) in creature_template. Set to 1 (UNIT_CLASS_WARRIOR).", cInfo->Entry, cInfo->unit_class);
1131 const_cast<CreatureTemplate*>(cInfo)->unit_class = UNIT_CLASS_WARRIOR;
1132 }
1133
1134 if (cInfo->dmgschool >= MAX_SPELL_SCHOOL)
1135 {
1136 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid spell school value ({}) in `dmgschool`.", cInfo->Entry, cInfo->dmgschool);
1137 const_cast<CreatureTemplate*>(cInfo)->dmgschool = SPELL_SCHOOL_NORMAL;
1138 }
1139
1140 if (cInfo->BaseAttackTime == 0)
1141 const_cast<CreatureTemplate*>(cInfo)->BaseAttackTime = BASE_ATTACK_TIME;
1142
1143 if (cInfo->RangeAttackTime == 0)
1144 const_cast<CreatureTemplate*>(cInfo)->RangeAttackTime = BASE_ATTACK_TIME;
1145
1146 if ((cInfo->npcflag & UNIT_NPC_FLAG_TRAINER) && cInfo->trainer_type >= MAX_TRAINER_TYPE)
1147 LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong trainer type {}.", cInfo->Entry, cInfo->trainer_type);
1148
1149 if (cInfo->speed_walk == 0.0f)
1150 {
1151 LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong value ({}) in speed_walk, set to 1.", cInfo->Entry, cInfo->speed_walk);
1152 const_cast<CreatureTemplate*>(cInfo)->speed_walk = 1.0f;
1153 }
1154
1155 if (cInfo->speed_run == 0.0f)
1156 {
1157 LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong value ({}) in speed_run, set to 1.14286.", cInfo->Entry, cInfo->speed_run);
1158 const_cast<CreatureTemplate*>(cInfo)->speed_run = 1.14286f;
1159 }
1160
1161 if (cInfo->type && !sCreatureTypeStore.LookupEntry(cInfo->type))
1162 {
1163 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid creature type ({}) in `type`.", cInfo->Entry, cInfo->type);
1164 const_cast<CreatureTemplate*>(cInfo)->type = CREATURE_TYPE_HUMANOID;
1165 }
1166
1167 // must exist or used hidden but used in data horse case
1168 if (cInfo->family && !sCreatureFamilyStore.LookupEntry(cInfo->family) && cInfo->family != CREATURE_FAMILY_HORSE_CUSTOM)
1169 {
1170 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid creature family ({}) in `family`.", cInfo->Entry, cInfo->family);
1171 const_cast<CreatureTemplate*>(cInfo)->family = 0;
1172 }
1173
1174 CheckCreatureMovement("creature_template_movement", cInfo->Entry, const_cast<CreatureTemplate*>(cInfo)->Movement);
1175
1176 if (cInfo->HoverHeight < 0.0f)
1177 {
1178 LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong value ({}) in `HoverHeight`", cInfo->Entry, cInfo->HoverHeight);
1179 const_cast<CreatureTemplate*>(cInfo)->HoverHeight = 1.0f;
1180 }
1181
1182 if (cInfo->VehicleId)
1183 {
1184 VehicleEntry const* vehId = sVehicleStore.LookupEntry(cInfo->VehicleId);
1185 if (!vehId)
1186 {
1187 LOG_ERROR("sql.sql", "Creature (Entry: {}) has a non-existing VehicleId ({}). This *WILL* cause the client to freeze!", cInfo->Entry, cInfo->VehicleId);
1188 const_cast<CreatureTemplate*>(cInfo)->VehicleId = 0;
1189 }
1190 }
1191
1192 if (cInfo->PetSpellDataId)
1193 {
1194 CreatureSpellDataEntry const* spellDataId = sCreatureSpellDataStore.LookupEntry(cInfo->PetSpellDataId);
1195 if (!spellDataId)
1196 LOG_ERROR("sql.sql", "Creature (Entry: {}) has non-existing PetSpellDataId ({}).", cInfo->Entry, cInfo->PetSpellDataId);
1197 }
1198
1199 for (uint8 j = 0; j < MAX_CREATURE_SPELLS; ++j)
1200 {
1201 if (cInfo->spells[j] && !sSpellMgr->GetSpellInfo(cInfo->spells[j]))
1202 {
1203 LOG_ERROR("sql.sql", "Creature (Entry: {}) has non-existing Spell{} ({}), set to 0.", cInfo->Entry, j + 1, cInfo->spells[j]);
1204 const_cast<CreatureTemplate*>(cInfo)->spells[j] = 0;
1205 }
1206 }
1207
1208 if (cInfo->MovementType >= MAX_DB_MOTION_TYPE)
1209 {
1210 LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong movement generator type ({}), ignored and set to IDLE.", cInfo->Entry, cInfo->MovementType);
1211 const_cast<CreatureTemplate*>(cInfo)->MovementType = IDLE_MOTION_TYPE;
1212 }
1213
1214 if (cInfo->expansion > (MAX_EXPANSIONS - 1))
1215 {
1216 LOG_ERROR("sql.sql", "Table `creature_template` lists creature (Entry: {}) with expansion {}. Ignored and set to 0.", cInfo->Entry, cInfo->expansion);
1217 const_cast<CreatureTemplate*>(cInfo)->expansion = 0;
1218 }
1219
1220 if (uint32 badFlags = (cInfo->flags_extra & ~CREATURE_FLAG_EXTRA_DB_ALLOWED))
1221 {
1222 LOG_ERROR("sql.sql", "Table `creature_template` lists creature (Entry: {}) with disallowed `flags_extra` {}, removing incorrect flag.", cInfo->Entry, badFlags);
1223 const_cast<CreatureTemplate*>(cInfo)->flags_extra &= CREATURE_FLAG_EXTRA_DB_ALLOWED;
1224 }
1225
1226 const_cast<CreatureTemplate*>(cInfo)->DamageModifier *= Creature::_GetDamageMod(cInfo->rank);
1227
1228 // Hack for modules
1229 for (auto& itr : _creatureCustomIDsStore)
1230 {
1231 if (cInfo->Entry == itr)
1232 return;
1233 }
1234
1235 if ((cInfo->GossipMenuId && !(cInfo->npcflag & UNIT_NPC_FLAG_GOSSIP)) && !(cInfo->flags_extra & CREATURE_FLAG_EXTRA_MODULE))
1236 {
1237 LOG_ERROR("sql.sql", "Creature (Entry: {}) has assigned gossip menu {}, but npcflag does not include UNIT_NPC_FLAG_GOSSIP (1).", cInfo->Entry, cInfo->GossipMenuId);
1238 }
1239 else if ((!cInfo->GossipMenuId && (cInfo->npcflag & UNIT_NPC_FLAG_GOSSIP)) && !(cInfo->flags_extra & CREATURE_FLAG_EXTRA_MODULE))
1240 {
1241 LOG_INFO("sql.sql", "Creature (Entry: {}) has npcflag UNIT_NPC_FLAG_GOSSIP (1), but gossip menu is unassigned.", cInfo->Entry);
1242 }
1243}
#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:283
constexpr auto MAX_SPELL_SCHOOL
Definition SharedDefines.h:292
@ CREATURE_FAMILY_HORSE_CUSTOM
Definition SharedDefines.h:2659
@ UNIT_CLASS_WARRIOR
Definition SharedDefines.h:166
@ CREATURE_TYPE_HUMANOID
Definition SharedDefines.h:2634
#define CLASSMASK_ALL_CREATURES
Definition SharedDefines.h:172
@ MAX_EXPANSIONS
Definition SharedDefines.h:56
#define MAX_TRAINER_TYPE
Definition SharedDefines.h:2623
@ UNIT_NPC_FLAG_GOSSIP
Definition UnitDefines.h:315
#define BASE_ATTACK_TIME
Definition Unit.h:42
static constexpr uint32 MAX_CREATURE_SPELLS
Definition Unit.h:46
spells
Definition boss_krystallus.cpp:26
static float _GetDamageMod(int32 Rank)
Definition Creature.cpp:1603
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:1245
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_ERROR, LOG_INFO, MAX_CREATURE_SPELLS, MAX_DB_MOTION_TYPE, MAX_DIFFICULTY, MAX_EXPANSIONS, MAX_KILL_CREDIT, MAX_SPELL_SCHOOL, MAX_TRAINER_TYPE, CreatureTemplate::Models, CreatureTemplate::Movement, CreatureTemplate::MovementType, CreatureTemplate::npcflag, CreatureTemplate::PetSpellDataId, CreatureTemplate::RangeAttackTime, CreatureTemplate::rank, sCreatureAIRegistry, sCreatureFamilyStore, sCreatureSpellDataStore, sCreatureTypeStore, CreatureTemplate::ScriptID, sFactionTemplateStore, CreatureTemplate::speed_run, CreatureTemplate::speed_walk, SPELL_SCHOOL_NORMAL, CreatureTemplate::spells, sSpellMgr, sVehicleStore, CreatureTemplate::trainer_class, CreatureTemplate::trainer_race, CreatureTemplate::trainer_spell, CreatureTemplate::trainer_type, CreatureTemplate::type, CreatureTemplate::unit_class, UNIT_CLASS_WARRIOR, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAG_TRAINER, and CreatureTemplate::VehicleId.

Referenced by LoadCreatureTemplates().

◆ CheckDeclinedNames()

bool ObjectMgr::CheckDeclinedNames ( std::wstring  w_ownname,
DeclinedName const &  names 
)
static
9016{
9017 // get main part of the name
9018 std::wstring mainpart = GetMainPartOfName(w_ownname, 0);
9019 // prepare flags
9020 bool x = true;
9021 bool y = true;
9022
9023 // check declined names
9024 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
9025 {
9026 std::wstring wname;
9027 if (!Utf8toWStr(names.name[i], wname))
9028 return false;
9029
9030 if (mainpart != GetMainPartOfName(wname, i + 1))
9031 x = false;
9032
9033 if (w_ownname != wname)
9034 y = false;
9035 }
9036 return (x || y);
9037}
#define MAX_DECLINED_NAME_CASES
Definition Unit.h:529
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
8721{
8722 std::wstring wname;
8723 if (!Utf8toWStr(name, wname))
8724 return PET_NAME_INVALID;
8725
8726 if (wname.size() > MAX_PET_NAME)
8727 return PET_NAME_TOO_LONG;
8728
8729 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PET_NAME);
8730 if (wname.size() < minName)
8731 return PET_NAME_TOO_SHORT;
8732
8733 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PET_NAMES);
8734 if (!isValidString(wname, strictMask, false))
8736
8737 // Check Reserved Name
8738 if (sObjectMgr->IsReservedName(name))
8739 return PET_NAME_RESERVED;
8740
8741 // Check Profanity Name
8742 if (sObjectMgr->IsProfanityName(name))
8743 return PET_NAME_PROFANE;
8744
8745 return PET_NAME_SUCCESS;
8746}
bool isValidString(std::wstring wstr, uint32 strictMask, bool numericOrSpace, bool create=false)
Definition ObjectMgr.cpp:8605
#define sObjectMgr
Definition ObjectMgr.h:1650
#define MAX_PET_NAME
Definition ObjectMgr.h:684
@ PET_NAME_INVALID
Definition SharedDefines.h:3915
@ PET_NAME_RESERVED
Definition SharedDefines.h:3921
@ PET_NAME_SUCCESS
Definition SharedDefines.h:3913
@ PET_NAME_MIXED_LANGUAGES
Definition SharedDefines.h:3919
@ PET_NAME_TOO_SHORT
Definition SharedDefines.h:3917
@ PET_NAME_TOO_LONG
Definition SharedDefines.h:3918
@ PET_NAME_PROFANE
Definition SharedDefines.h:3920
@ CONFIG_STRICT_PET_NAMES
Definition WorldConfig.h:173
@ CONFIG_MIN_PET_NAME
Definition WorldConfig.h:176

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
8642{
8643 std::wstring wname;
8644
8645 // Check for invalid characters
8646 if (!Utf8toWStr(name, wname))
8648
8649 // Check for too long name
8650 if (wname.size() > MAX_PLAYER_NAME)
8651 return CHAR_NAME_TOO_LONG;
8652
8653 // Check for too short name
8654 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PLAYER_NAME);
8655 if (wname.size() < minName)
8656 return CHAR_NAME_TOO_SHORT;
8657
8658 // Check for mixed languages
8659 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PLAYER_NAMES);
8660 if (!isValidString(wname, strictMask, false, create))
8662
8663 // Check for three consecutive letters
8664 wstrToLower(wname);
8665 for (std::size_t i = 2; i < wname.size(); ++i)
8666 if (wname[i] == wname[i - 1] && wname[i] == wname[i - 2])
8668
8669 // Check Reserved Name
8670 if (sObjectMgr->IsReservedName(name))
8671 return CHAR_NAME_RESERVED;
8672
8673 // Check Profanity Name
8674 if (sObjectMgr->IsProfanityName(name))
8675 return CHAR_NAME_PROFANE;
8676
8677 return CHAR_NAME_SUCCESS;
8678}
#define MAX_PLAYER_NAME
Definition ObjectMgr.h:682
@ CHAR_NAME_TOO_SHORT
Definition SharedDefines.h:3677
@ CHAR_NAME_THREE_CONSECUTIVE
Definition SharedDefines.h:3685
@ CHAR_NAME_INVALID_CHARACTER
Definition SharedDefines.h:3679
@ CHAR_NAME_TOO_LONG
Definition SharedDefines.h:3678
@ CHAR_NAME_RESERVED
Definition SharedDefines.h:3682
@ CHAR_NAME_MIXED_LANGUAGES
Definition SharedDefines.h:3680
@ CHAR_NAME_PROFANE
Definition SharedDefines.h:3681
@ CHAR_NAME_SUCCESS
Definition SharedDefines.h:3674
@ CONFIG_STRICT_PLAYER_NAMES
Definition WorldConfig.h:170
@ CONFIG_MIN_PLAYER_NAME
Definition WorldConfig.h:174

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

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

◆ ChooseCreatureFlags()

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

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

Referenced by Creature::UpdateEntry().

◆ ChooseDisplayId()

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

References CREATURE_FLAG_EXTRA_TRIGGER, CreatureData::displayid, CreatureTemplate::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)
8242{
8243 // remove mapid*cellid -> guid_set map
8244 CreatureData const* data = GetCreatureData(guid);
8245 if (data)
8246 RemoveCreatureFromGrid(guid, data);
8247
8248 _creatureDataStore.erase(guid);
8249}
CreatureDataContainer _creatureDataStore
Definition ObjectMgr.h:1583
void RemoveCreatureFromGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition ObjectMgr.cpp:2487
CreatureData const * GetCreatureData(ObjectGuid::LowType spawnId) const
Definition ObjectMgr.h:1207

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

◆ DeleteGameTele()

bool ObjectMgr::DeleteGameTele ( std::string_view  name)
9215{
9216 // explicit name case
9217 std::wstring wname;
9218 if (!Utf8toWStr(name, wname))
9219 return false;
9220
9221 // converting string that we try to find to lower case
9222 wstrToLower(wname);
9223
9224 for (GameTeleContainer::iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9225 {
9226 if (itr->second.wnameLow == wname)
9227 {
9229
9230 stmt->SetData(0, itr->second.name);
9231
9232 WorldDatabase.Execute(stmt);
9233
9234 _gameTeleStore.erase(itr);
9235 return true;
9236 }
9237 }
9238
9239 return false;
9240}
@ 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)
8252{
8253 // remove mapid*cellid -> guid_set map
8254 GameObjectData const* data = GetGameObjectData(guid);
8255 if (data)
8256 RemoveGameobjectFromGrid(guid, data);
8257
8258 _gameObjectDataStore.erase(guid);
8259}
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:2793

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

◆ GenerateAuctionID()

uint32 ObjectMgr::GenerateAuctionID ( )
7234{
7235 if (_auctionId >= 0xFFFFFFFE)
7236 {
7237 LOG_ERROR("server.worldserver", "Auctions ids overflow!! Can't continue, shutting down server. ");
7239 }
7240 return _auctionId++;
7241}
static void StopNow(uint8 exitcode)
Definition World.h:190
@ ERROR_EXIT_CODE
Definition World.h:54

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

◆ GenerateCreatureSpawnId()

uint32 ObjectMgr::GenerateCreatureSpawnId ( )
7265{
7266 if (_creatureSpawnId >= uint32(0xFFFFFF))
7267 {
7268 LOG_ERROR("server.worldserver", "Creature spawn id overflow!! Can't continue, shutting down server. Search on forum for TCE00007 for more info.");
7270 }
7271 return _creatureSpawnId++;
7272}

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

Referenced by AddCreData().

◆ GenerateEquipmentSetGuid()

uint64 ObjectMgr::GenerateEquipmentSetGuid ( )
7244{
7245 if (_equipmentSetGuid >= uint64(0xFFFFFFFFFFFFFFFELL))
7246 {
7247 LOG_ERROR("server.worldserver", "EquipmentSet guid overflow!! Can't continue, shutting down server. ");
7249 }
7250 return _equipmentSetGuid++;
7251}
std::uint64_t uint64
Definition Define.h:106

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

◆ GenerateGameObjectSpawnId()

uint32 ObjectMgr::GenerateGameObjectSpawnId ( )
7275{
7276 if (_gameObjectSpawnId >= uint32(0xFFFFFF))
7277 {
7278 LOG_ERROR("server.worldserver", "GameObject spawn id overflow!! Can't continue, shutting down server. Search on forum for TCE00007 for more info. ");
7280 }
7281 return _gameObjectSpawnId++;
7282}

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

Referenced by AddGOData().

◆ GenerateMailID()

uint32 ObjectMgr::GenerateMailID ( )
7254{
7255 if (_mailId >= 0xFFFFFFFE)
7256 {
7257 LOG_ERROR("server.worldserver", "Mail ids overflow!! Can't continue, shutting down server. ");
7259 }
7260 std::lock_guard<std::mutex> guard(_mailIdMutex);
7261 return _mailId++;
7262}
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)
7741{
7742 std::vector<std::string>& list0 = _petHalfName0[entry];
7743 std::vector<std::string>& list1 = _petHalfName1[entry];
7744
7745 if (list0.empty() || list1.empty())
7746 {
7747 CreatureTemplate const* cinfo = GetCreatureTemplate(entry);
7748 char const* petname = GetPetName(cinfo->family, sWorld->GetDefaultDbcLocale());
7749 if (!petname)
7750 return cinfo->Name;
7751
7752 return std::string(petname);
7753 }
7754
7755 return *(list0.begin() + urand(0, list0.size() - 1)) + *(list1.begin() + urand(0, list1.size() - 1));
7756}
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 
)
7728{
7729 std::vector<std::string>& list0 = _petHalfLocaleName0[std::make_pair(entry, locale)];
7730 std::vector<std::string>& list1 = _petHalfLocaleName1[std::make_pair(entry, locale)];
7731
7732 if (list0.empty() || list1.empty())
7733 {
7734 return GeneratePetName(entry);
7735 }
7736
7737 return *(list0.begin() + urand(0, list0.size() - 1)) + *(list1.begin() + urand(0, list1.size() - 1));
7738}
HalfNameContainerLocale _petHalfLocaleName0
Definition ObjectMgr.h:1574
HalfNameContainerLocale _petHalfLocaleName1
Definition ObjectMgr.h:1575
std::string GeneratePetName(uint32 entry)
Definition ObjectMgr.cpp:7740

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

◆ GeneratePetNumber()

uint32 ObjectMgr::GeneratePetNumber ( )
7759{
7760 std::lock_guard<std::mutex> guard(_hiPetNumberMutex);
7761 return ++_hiPetNumber;
7762}
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
8947{
8948 AcoreString const* as = GetAcoreString(entry);
8949 if (as && !as->Content.empty())
8950 {
8951 if (as->Content.size() > std::size_t(locale) && !as->Content[locale].empty())
8952 return as->Content[locale];
8953
8954 return as->Content[DEFAULT_LOCALE];
8955 }
8956
8957 std::string msg = Acore::StringFormat("No entry for acore_string ({}) in DB.", entry);
8958 LOG_ERROR("sql.sql", msg);
8959 return msg;
8960}
#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)
9040{
9041 AreaTriggerScriptContainer::const_iterator i = _areaTriggerScriptStore.find(trigger_id);
9042 if (i != _areaTriggerScriptStore.end())
9043 return i->second;
9044 return 0;
9045}

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 
)
9054{
9055 if (!factionEntry)
9056 return 0;
9057
9058 uint32 raceMask = (1 << (race - 1));
9059 uint32 classMask = (1 << (playerClass - 1));
9060
9061 for (int i = 0; i < 4; i++)
9062 {
9063 if ((!factionEntry->BaseRepClassMask[i] ||
9064 factionEntry->BaseRepClassMask[i] & classMask) &&
9065 (!factionEntry->BaseRepRaceMask[i] ||
9066 factionEntry->BaseRepRaceMask[i] & raceMask))
9067 return factionEntry->BaseRepValue[i];
9068 }
9069
9070 return 0;
9071}

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

◆ GetBaseXP()

uint32 ObjectMgr::GetBaseXP ( uint8  level)
7669{
7670 return _baseXPTable[level] ? _baseXPTable[level] : 0;
7671}
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)
1435{
1436 CreatureAddonContainer::const_iterator itr = _creatureAddonStore.find(lowguid);
1437 if (itr != _creatureAddonStore.end())
1438 return &(itr->second);
1439
1440 return nullptr;
1441}
CreatureAddonContainer _creatureAddonStore
Definition ObjectMgr.h:1588

References _creatureAddonStore.

◆ GetCreatureBaseStats()

CreatureBaseStats const * ObjectMgr::GetCreatureBaseStats ( uint8  level,
uint8  unitClass 
)
9951{
9952 CreatureBaseStatsContainer::const_iterator it = _creatureBaseStatsStore.find(MAKE_PAIR16(level, unitClass));
9953
9954 if (it != _creatureBaseStatsStore.end())
9955 return &(it->second);
9956
9957 struct DefaultCreatureBaseStats : public CreatureBaseStats
9958 {
9959 DefaultCreatureBaseStats()
9960 {
9961 BaseArmor = 1;
9962 for (uint8 j = 0; j < MAX_EXPANSIONS; ++j)
9963 {
9964 BaseHealth[j] = 1;
9965 BaseDamage[j] = 0.0f;
9966 }
9967 BaseMana = 0;
9968 AttackPower = 0;
9969 RangedAttackPower = 0;
9970 }
9971 };
9972 static const DefaultCreatureBaseStats defStats;
9973 return &defStats;
9974}
uint16 MAKE_PAIR16(uint8 l, uint8 h)
Definition ObjectDefines.h:84
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
1639{
1640 CreatureModelContainer::const_iterator itr = _creatureModelStore.find(modelId);
1641 if (itr != _creatureModelStore.end())
1642 return &(itr->second);
1643
1644 return nullptr;
1645}
CreatureModelContainer _creatureModelStore
Definition ObjectMgr.h:1587

References _creatureModelStore.

Referenced by GetCreatureModelRandomGender(), and LoadCreatureTemplateModels().

◆ GetCreatureModelRandomGender()

CreatureModelInfo const * ObjectMgr::GetCreatureModelRandomGender ( CreatureModel model,
CreatureTemplate const *  creatureTemplate 
) const
1682{
1683 CreatureModelInfo const* modelInfo = GetCreatureModelInfo(model->CreatureDisplayID);
1684 if (!modelInfo)
1685 return nullptr;
1686
1687 // If a model for another gender exists, 50% chance to use it
1688 if (modelInfo->modelid_other_gender != 0 && urand(0, 1) == 0)
1689 {
1690 CreatureModelInfo const* minfo_tmp = GetCreatureModelInfo(modelInfo->modelid_other_gender);
1691 if (!minfo_tmp)
1692 LOG_ERROR("sql.sql", "Model (Entry: {}) has modelid_other_gender {} not found in table `creature_model_info`. ", model->CreatureDisplayID, modelInfo->modelid_other_gender);
1693 else
1694 {
1695 // Model ID changed
1696 model->CreatureDisplayID = modelInfo->modelid_other_gender;
1697 if (creatureTemplate)
1698 {
1699 auto itr = std::find_if(creatureTemplate->Models.begin(), creatureTemplate->Models.end(), [&](CreatureModel const& templateModel)
1700 {
1701 return templateModel.CreatureDisplayID == modelInfo->modelid_other_gender;
1702 });
1703 if (itr != creatureTemplate->Models.end())
1704 *model = *itr;
1705 }
1706 return minfo_tmp;
1707 }
1708 }
1709
1710 return modelInfo;
1711}
CreatureModelInfo const * GetCreatureModelInfo(uint32 modelId) const
Definition ObjectMgr.cpp:1638
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
1453{
1455}
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)
1444{
1445 CreatureAddonContainer::const_iterator itr = _creatureTemplateAddonStore.find(entry);
1446 if (itr != _creatureTemplateAddonStore.end())
1447 return &(itr->second);
1448
1449 return nullptr;
1450}
CreatureAddonContainer _creatureTemplateAddonStore
Definition ObjectMgr.h: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 
)
1458{
1459 EquipmentInfoContainer::const_iterator itr = _equipmentInfoStore.find(entry);
1460 if (itr == _equipmentInfoStore.end())
1461 return nullptr;
1462
1463 if (itr->second.empty())
1464 return nullptr;
1465
1466 if (id == -1) // select a random element
1467 {
1468 EquipmentInfoContainerInternal::const_iterator ritr = itr->second.begin();
1469 std::advance(ritr, urand(0u, itr->second.size() - 1));
1470 id = std::distance(itr->second.begin(), ritr) + 1;
1471 return &ritr->second;
1472 }
1473 else
1474 {
1475 EquipmentInfoContainerInternal::const_iterator itr2 = itr->second.find(id);
1476 if (itr2 != itr->second.end())
1477 return &itr2->second;
1478 }
1479
1480 return nullptr;
1481}
EquipmentInfoContainer _equipmentInfoStore
Definition ObjectMgr.h: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)
1426{
1427 GameObjectAddonContainer::const_iterator itr = _gameObjectAddonStore.find(lowguid);
1428 if (itr != _gameObjectAddonStore.end())
1429 return &(itr->second);
1430
1431 return nullptr;
1432}
GameObjectAddonContainer _gameObjectAddonStore
Definition ObjectMgr.h: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)
10275{
10276 GameObjectTemplateContainer::const_iterator itr = _gameObjectTemplateStore.find(entry);
10277 if (itr != _gameObjectTemplateStore.end())
10278 return &(itr->second);
10279
10280 return nullptr;
10281}
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
10290{
10291 auto itr = _gameObjectTemplateAddonStore.find(entry);
10292 if (itr != _gameObjectTemplateAddonStore.end())
10293 return &itr->second;
10294
10295 return nullptr;
10296}
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
9159{
9160 // explicit name case
9161 std::wstring wname;
9162 if (!Utf8toWStr(name, wname))
9163 return nullptr;
9164
9165 // converting string that we try to find to lower case
9166 wstrToLower(wname);
9167
9168 // Alternative first GameTele what contains wnameLow as substring in case no GameTele location found
9169 const GameTele* alt = nullptr;
9170 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9171 {
9172 if (itr->second.wnameLow == wname)
9173 return &itr->second;
9174 else if (!exactSearch && !alt && itr->second.wnameLow.find(wname) != std::wstring::npos)
9175 alt = &itr->second;
9176 }
9177
9178 return alt;
9179}
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
7133{
7134 bool useParentDbValue = false;
7135 uint32 parentId = 0;
7136 MapEntry const* mapEntry = sMapStore.LookupEntry(Map);
7137 if (!mapEntry || mapEntry->entrance_map < 0)
7138 return nullptr;
7139
7140 if (mapEntry->IsDungeon())
7141 {
7142 InstanceTemplate const* iTemplate = sObjectMgr->GetInstanceTemplate(Map);
7143
7144 if (!iTemplate)
7145 return nullptr;
7146
7147 parentId = iTemplate->Parent;
7148 useParentDbValue = true;
7149 }
7150
7151 uint32 entrance_map = uint32(mapEntry->entrance_map);
7152 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
7153 if ((!useParentDbValue && itr->second.target_mapId == entrance_map) || (useParentDbValue && itr->second.target_mapId == parentId))
7154 {
7155 AreaTrigger const* atEntry = GetAreaTrigger(itr->first);
7156 if (atEntry && atEntry->map == Map)
7157 return &itr->second;
7158 }
7159 return nullptr;
7160}
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:119
uint32 Parent
Definition Map.h:120
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
6180{
6181 GossipTextContainer::const_iterator itr = _gossipTextStore.find(Text_ID);
6182 if (itr != _gossipTextStore.end())
6183 return &itr->second;
6184 return nullptr;
6185}
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)
6086{
6087 InstanceTemplateContainer::const_iterator itr = _instanceTemplateStore.find(uint16(mapID));
6088 if (itr != _instanceTemplateStore.end())
6089 return &(itr->second);
6090
6091 return nullptr;
6092}
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)
3477{
3478 return entry < _itemTemplateStoreFast.size() ? _itemTemplateStoreFast[entry] : nullptr;
3479}
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

7166{
7167 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
7168 {
7169 if (itr->second.target_mapId == Map) // Id is used to determine correct Scarlet Monastery instance
7170 {
7171 // xinef: no need to check, already done at loading
7172 //AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first);
7173 //if (atEntry)
7174 return &itr->second;
7175 }
7176 }
7177 return nullptr;
7178}

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
1893{
1894 uint8 customizationID;
1895
1896 if (player->GetTeamId() == TEAM_ALLIANCE)
1897 customizationID = player->GetByteValue(PLAYER_BYTES, 3); // Use Hair Color
1898 else
1899 customizationID = player->GetByteValue(PLAYER_BYTES, 0); // Use Skin Color
1900
1901 auto itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), customizationID, player->getGender()));
1902 if (itr != _playerShapeshiftModel.end())
1903 return itr->second; // Explicit combination
1904
1905 itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), customizationID, GENDER_NONE));
1906 if (itr != _playerShapeshiftModel.end())
1907 return itr->second; // Combination applied to both genders
1908
1909 itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), 255, player->getGender()));
1910 if (itr != _playerShapeshiftModel.end())
1911 return itr->second; // Default gender-dependent model
1912
1913 itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), 255, GENDER_NONE));
1914 if (itr != _playerShapeshiftModel.end())
1915 return itr->second; // Last resort
1916
1917 LOG_DEBUG("entities.player", "ShapeshiftForm {} with RaceID ({}) have no shapeshift model data defined, using fallback data.", form, player->getRace());
1918 return 0;
1919}
@ GENDER_NONE
Definition SharedDefines.h:63
@ TEAM_ALLIANCE
Definition SharedDefines.h:760
@ PLAYER_BYTES
Definition UpdateFields.h:181
PlayerShapeshiftModelMap _playerShapeshiftModel
Definition ObjectMgr.h:1637
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition Object.cpp:323
TeamId GetTeamId(bool original=false) const
Definition Player.h:2127
uint8 getGender() const
Definition Unit.h:798
uint8 getRace(bool original=false) const
Definition Unit.cpp:20865

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
1838{
1839 auto itr = _playerTotemModel.find(std::make_pair(totemSlot, race));
1840 if (itr != _playerTotemModel.end())
1841 return itr->second;
1842
1843 LOG_ERROR("misc", "TotemSlot {} with RaceID ({}) have no totem model data defined, set to default model.", totemSlot, race);
1844 return 0;
1845}
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
8898{
8899 ModuleString const* ms = GetModuleString(module, id);
8900 if (ms && !ms->Content.empty())
8901 {
8902 if (ms->Content.size() > size_t(locale) && !ms->Content[locale].empty())
8903 return &ms->Content[locale];
8904
8905 return &ms->Content[DEFAULT_LOCALE];
8906 }
8907
8908 LOG_ERROR("sql.sql", "Module string module {} id {} not found in DB.", module, id);
8909
8910 return (std::string*)"error";
8911}
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 
)
6750{
6751 bool found = false;
6752 float dist = 10000;
6753 uint32 id = 0;
6754
6755 for (uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i)
6756 {
6757 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(i);
6758
6759 if (!node || node->map_id != mapid || (!node->MountCreatureID[teamId == TEAM_ALLIANCE ? 1 : 0] && node->MountCreatureID[0] != 32981)) // dk flight
6760 continue;
6761
6762 uint8 field = (uint8)((i - 1) / 32);
6763 uint32 submask = 1 << ((i - 1) % 32);
6764
6765 // skip not taxi network nodes
6766 if (field >= TaxiMaskSize || (sTaxiNodesMask[field] & submask) == 0)
6767 {
6768 continue;
6769 }
6770
6771 float dist2 = (node->x - x) * (node->x - x) + (node->y - y) * (node->y - y) + (node->z - z) * (node->z - z);
6772 if (found)
6773 {
6774 if (dist2 < dist)
6775 {
6776 dist = dist2;
6777 id = i;
6778 }
6779 }
6780 else
6781 {
6782 found = true;
6783 dist = dist2;
6784 id = i;
6785 }
6786 }
6787
6788 return id;
6789}
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)
6002{
6003 PageTextContainer::const_iterator itr = _pageTextStore.find(pageEntry);
6004 if (itr != _pageTextStore.end())
6005 return &(itr->second);
6006
6007 return nullptr;
6008}
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
3843{
3844 if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
3845 level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
3846
3847 PetLevelInfoContainer::const_iterator itr = _petInfoStore.find(creature_id);
3848 if (itr == _petInfoStore.end())
3849 return nullptr;
3850
3851 return &itr->second[level - 1]; // data for level 1 stored in [0] array element, ...
3852}

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
4510{
4511 if (level < 1 || class_ >= MAX_CLASSES)
4512 return;
4513
4514 PlayerClassInfo const* pInfo = _playerClassInfo[class_];
4515
4516 if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4517 level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
4518
4519 *info = pInfo->levelInfo[level - 1];
4520}
Definition Player.h:302

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

◆ GetPlayerInfo()

PlayerInfo const * ObjectMgr::GetPlayerInfo ( uint32  race,
uint32  class_ 
) const
10321{
10322 if (race >= MAX_RACES)
10323 return nullptr;
10324 if (class_ >= MAX_CLASSES)
10325 return nullptr;
10326 PlayerInfo const* info = _playerInfo[race][class_];
10327 if (!info)
10328 return nullptr;
10329 return info;
10330}
Definition Player.h:341

References _playerInfo, MAX_CLASSES, and MAX_RACES.

◆ GetPlayerLevelInfo()

void ObjectMgr::GetPlayerLevelInfo ( uint32  race,
uint32  class_,
uint8  level,
PlayerLevelInfo info 
) const
4523{
4524 if (level < 1 || race >= MAX_RACES || class_ >= MAX_CLASSES)
4525 return;
4526
4527 PlayerInfo const* pInfo = _playerInfo[race][class_];
4528 if (!pInfo)
4529 return;
4530
4531 if (level <= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4532 *info = pInfo->levelInfo[level - 1];
4533 else
4534 BuildPlayerLevelInfo(race, class_, level, info);
4535}
void BuildPlayerLevelInfo(uint8 race, uint8 class_, uint8 level, PlayerLevelInfo *plinfo) const
Definition ObjectMgr.cpp:4537

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
6480{
6481 uint8 typeIndex;
6482 if (type == TYPEID_UNIT)
6483 typeIndex = 0;
6484 else if (type == TYPEID_GAMEOBJECT)
6485 typeIndex = 1;
6486 else
6487 return nullptr;
6488
6489 std::pair<uint32, uint8> pairKey = std::make_pair(id, typeIndex);
6490 QuestGreetingContainer::const_iterator itr = _questGreetingStore.find(pairKey);
6491 if (itr == _questGreetingStore.end())
6492 return nullptr;
6493
6494 return &itr->second;
6495}
@ 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
10457{
10458 if (questMoneyDifficulty < MAX_QUEST_MONEY_REWARDS)
10459 {
10460 auto const& itr = _questMoneyRewards.find(level);
10461 if (itr != _questMoneyRewards.end())
10462 {
10463 return itr->second.at(questMoneyDifficulty);
10464 }
10465 }
10466
10467 return 0;
10468}
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)
9811{
9812 // use binary search to find the script name in the sorted vector
9813 // assume "" is the first element
9814 if (name.empty())
9815 return 0;
9816
9817 ScriptNameContainer::const_iterator itr = std::lower_bound(_scriptNamesStore.begin(), _scriptNamesStore.end(), name);
9818 if (itr == _scriptNamesStore.end() || (*itr != name))
9819 return 0;
9820
9821 return uint32(itr - _scriptNamesStore.begin());
9822}
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
9805{
9806 static std::string const empty = "";
9807 return (id < _scriptNamesStore.size()) ? _scriptNamesStore[id] : empty;
9808}

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)
9048{
9049 return SpellScriptsBounds(_spellScriptsStore.lower_bound(spell_id), _spellScriptsStore.upper_bound(spell_id));
9050}
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 
)
6816{
6817 CreatureModel mountModel;
6818 CreatureTemplate const* mount_info = nullptr;
6819
6820 // select mount creature id
6821 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(id);
6822 if (node)
6823 {
6824 uint32 mount_entry = node->MountCreatureID[teamId == TEAM_ALLIANCE ? 1 : 0];
6825
6826 // Fix for Alliance not being able to use Acherus taxi
6827 // only one mount type for both sides
6828 if (mount_entry == 0 && allowed_alt_team)
6829 {
6830 // Simply reverse the selection. At least one team in theory should have a valid mount ID to choose.
6831 mount_entry = node->MountCreatureID[teamId];
6832 }
6833
6834 mount_info = GetCreatureTemplate(mount_entry);
6835 if (mount_info)
6836 {
6837 CreatureModel const* model = mount_info->GetRandomValidModel();
6838 if (!model)
6839 {
6840 LOG_ERROR("sql.sql", "No displayid found for the taxi mount with the entry {}! Can't load it!", mount_entry);
6841 return 0;
6842 }
6843 mountModel = *model;
6844 }
6845 }
6846
6847 // minfo is not actually used but the mount_id was updated
6848 GetCreatureModelRandomGender(&mountModel, mount_info);
6849
6850 return mountModel.CreatureDisplayID;
6851}
CreatureModelInfo const * GetCreatureModelRandomGender(CreatureModel *model, CreatureTemplate const *creatureTemplate) const
Definition ObjectMgr.cpp:1681
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 
)
6792{
6793 TaxiPathSetBySource::iterator src_i = sTaxiPathSetBySource.find(source);
6794 if (src_i == sTaxiPathSetBySource.end())
6795 {
6796 path = 0;
6797 cost = 0;
6798 return;
6799 }
6800
6801 TaxiPathSetForSource& pathSet = src_i->second;
6802
6803 TaxiPathSetForSource::iterator dest_i = pathSet.find(destination);
6804 if (dest_i == pathSet.end())
6805 {
6806 path = 0;
6807 cost = 0;
6808 return;
6809 }
6810
6811 cost = dest_i->second->price;
6812 path = dest_i->second->ID;
6813}
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
10304{
10305 if (Creature* cre = veh->GetBase()->ToCreature())
10306 {
10307 // Give preference to GUID-based accessories
10308 VehicleAccessoryContainer::const_iterator itr = _vehicleAccessoryStore.find(cre->GetSpawnId());
10309 if (itr != _vehicleAccessoryStore.end())
10310 return &itr->second;
10311 }
10312
10313 // Otherwise return entry-based
10314 VehicleAccessoryContainer::const_iterator itr = _vehicleTemplateAccessoryStore.find(veh->GetCreatureEntry());
10315 if (itr != _vehicleTemplateAccessoryStore.end())
10316 return &itr->second;
10317 return nullptr;
10318}
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
7674{
7675 if (level < _playerXPperLevel.size())
7676 return _playerXPperLevel[level];
7677 return 0;
7678}
PlayerXPperLevel _playerXPperLevel
Definition ObjectMgr.h:1562

References _playerXPperLevel.

◆ InitializeSpellInfoPrecomputedData()

void ObjectMgr::InitializeSpellInfoPrecomputedData ( )
5949{
5950 uint32 limit = sSpellStore.GetNumRows();
5951 for(uint32 i = 0; i <= limit; ++i)
5952 if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i))
5953 {
5954 const_cast<SpellInfo*>(spellInfo)->SetStackableWithRanks(spellInfo->ComputeIsStackableWithRanks());
5955 const_cast<SpellInfo*>(spellInfo)->SetCritCapable(spellInfo->ComputeIsCritCapable());
5956 const_cast<SpellInfo*>(spellInfo)->SetSpellValid(SpellMgr::ComputeIsSpellValid(spellInfo, false));
5957 }
5958}
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)
10284{
10285 GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
10286 return goinfo && goinfo->type == GAMEOBJECT_TYPE_TRANSPORT;
10287}
@ GAMEOBJECT_TYPE_TRANSPORT
Definition SharedDefines.h:1571

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

Referenced by AddGOData().

◆ IsProfanityName()

bool ObjectMgr::IsProfanityName ( std::string_view  name) const
8534{
8535 // pussywizard
8536 if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
8537 return true;
8538
8539 std::wstring wstr;
8540 if (!Utf8toWStr (name, wstr))
8541 return false;
8542
8543 wstrToLower(wstr);
8544
8545 return _profanityNamesStore.find(wstr) != _profanityNamesStore.end();
8546}

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

Referenced by AddProfanityPlayerName().

◆ IsReservedName()

bool ObjectMgr::IsReservedName ( std::string_view  name) const
8431{
8432 // pussywizard
8433 if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
8434 return true;
8435
8436 std::wstring wstr;
8437 if (!Utf8toWStr (name, wstr))
8438 return false;
8439
8440 wstrToLower(wstr);
8441
8442 return _reservedNamesStore.find(wstr) != _reservedNamesStore.end();
8443}

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
8707{
8708 std::wstring wname;
8709 if (!Utf8toWStr(name, wname))
8710 return false;
8711
8712 if (wname.size() > MAX_CHANNEL_NAME)
8713 return false;
8714
8715 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_CHANNEL_NAMES);
8716
8717 return isValidString(wname, strictMask, true);
8718}
#define MAX_CHANNEL_NAME
Definition ObjectMgr.h:686
@ CONFIG_STRICT_CHANNEL_NAMES
Definition WorldConfig.h:172

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

◆ IsValidCharterName()

bool ObjectMgr::IsValidCharterName ( std::string_view  name)
static
8681{
8682 std::wstring wname;
8683 if (!Utf8toWStr(name, wname))
8684 return false;
8685
8686 if (wname.size() > MAX_CHARTER_NAME)
8687 return false;
8688
8689 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_CHARTER_NAME);
8690 if (wname.size() < minName)
8691 return false;
8692
8693 // Check Reserved Name
8694 if (sObjectMgr->IsReservedName(name))
8695 return false;
8696
8697 // Check Profanity Name
8698 if (sObjectMgr->IsProfanityName(name))
8699 return false;
8700
8701 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_CHARTER_NAMES);
8702
8703 return isValidString(wname, strictMask, true);
8704}
#define MAX_CHARTER_NAME
Definition ObjectMgr.h:685
@ CONFIG_MIN_CHARTER_NAME
Definition WorldConfig.h:175
@ CONFIG_STRICT_CHARTER_NAMES
Definition WorldConfig.h:171

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
9669{
9670 /*
9671 CreatureTemplate const* cInfo = GetCreatureTemplate(vendor_entry);
9672 if (!cInfo)
9673 {
9674 if (player)
9675 ChatHandler(player->GetSession()).SendSysMessage(LANG_COMMAND_VENDORSELECTION);
9676 else
9677 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have data for not existed creature template (Entry: {}), ignore", vendor_entry);
9678 return false;
9679 }
9680
9681 if (!((cInfo->npcflag | ORnpcflag) & UNIT_NPC_FLAG_VENDOR))
9682 {
9683 if (!skip_vendors || skip_vendors->count(vendor_entry) == 0)
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 creature template (Entry: {}) without vendor flag, ignore", vendor_entry);
9689
9690 if (skip_vendors)
9691 skip_vendors->insert(vendor_entry);
9692 }
9693 return false;
9694 }
9695 */
9696
9697 if (!sObjectMgr->GetItemTemplate(item_id))
9698 {
9699 if (player)
9701 else
9702 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` for Vendor (Entry: {}) have in item list non-existed item ({}), ignore", vendor_entry, item_id);
9703 return false;
9704 }
9705
9706 if (ExtendedCost && !sItemExtendedCostStore.LookupEntry(ExtendedCost))
9707 {
9708 if (player)
9710 else
9711 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have Item (Entry: {}) with wrong ExtendedCost ({}) for vendor ({}), ignore", item_id, ExtendedCost, vendor_entry);
9712 return false;
9713 }
9714
9715 if (maxcount > 0 && incrtime == 0)
9716 {
9717 if (player)
9718 ChatHandler(player->GetSession()).PSendSysMessage("MaxCount != 0 ({}) but IncrTime == 0", maxcount);
9719 else
9720 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);
9721 return false;
9722 }
9723 else if (maxcount == 0 && incrtime > 0)
9724 {
9725 if (player)
9726 ChatHandler(player->GetSession()).PSendSysMessage("MaxCount == 0 but IncrTime<>= 0");
9727 else
9728 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);
9729 return false;
9730 }
9731
9732 VendorItemData const* vItems = GetNpcVendorItemList(vendor_entry);
9733 if (!vItems)
9734 return true; // later checks for non-empty lists
9735
9736 if (vItems->FindItemCostPair(item_id, ExtendedCost))
9737 {
9738 if (player)
9739 ChatHandler(player->GetSession()).PSendSysMessage(LANG_ITEM_ALREADY_IN_LIST, item_id, ExtendedCost);
9740 else
9741 LOG_ERROR("sql.sql", "Table `npc_vendor` has duplicate items {} (with extended cost {}) for vendor (Entry: {}), ignoring", item_id, ExtendedCost, vendor_entry);
9742 return false;
9743 }
9744
9745 return true;
9746}
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:2016
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 ( )
6965{
6966 uint32 oldMSTime = getMSTime();
6967
6968 if (!_accessRequirementStore.empty())
6969 {
6970 for (DungeonProgressionRequirementsContainer::iterator itr = _accessRequirementStore.begin(); itr != _accessRequirementStore.end(); ++itr)
6971 {
6972 std::unordered_map<uint8, DungeonProgressionRequirements*> difficulties = itr->second;
6973 for (auto difficultiesItr = difficulties.begin(); difficultiesItr != difficulties.end(); ++difficultiesItr)
6974 {
6975 for (auto questItr = difficultiesItr->second->quests.begin(); questItr != difficultiesItr->second->quests.end(); ++questItr)
6976 {
6977 delete* questItr;
6978 }
6979
6980 for (auto achievementItr = difficultiesItr->second->achievements.begin(); achievementItr != difficultiesItr->second->achievements.end(); ++achievementItr)
6981 {
6982 delete* achievementItr;
6983 }
6984
6985 for (auto itemsItr = difficultiesItr->second->items.begin(); itemsItr != difficultiesItr->second->items.end(); ++itemsItr)
6986 {
6987 delete* itemsItr;
6988 }
6989
6990 delete difficultiesItr->second;
6991 }
6992 }
6993
6994 _accessRequirementStore.clear(); // need for reload case
6995 }
6996 // 0 1 2 3 4 5
6997 QueryResult access_template_result = WorldDatabase.Query("SELECT id, map_id, difficulty, min_level, max_level, min_avg_item_level FROM dungeon_access_template");
6998 if (!access_template_result)
6999 {
7000 LOG_WARN("server.loading", ">> Loaded 0 access requirement definitions. DB table `dungeon_access_template` is empty.");
7001 LOG_INFO("server.loading", " ");
7002 return;
7003 }
7004
7005 uint32 count = 0;
7006 uint32 countProgressionRequirements = 0;
7007
7008 do
7009 {
7010 Field* fields = access_template_result->Fetch();
7011
7012 //Get the common variables for the access requirements
7013 uint8 dungeon_access_id = fields[0].Get<uint8>();
7014 uint32 mapid = fields[1].Get<uint32>();
7015 uint8 difficulty = fields[2].Get<uint8>();
7016
7017 //Set up the access requirements
7019 ar->levelMin = fields[3].Get<uint8>();
7020 ar->levelMax = fields[4].Get<uint8>();
7021 ar->reqItemLevel = fields[5].Get<uint16>();
7022
7023 // 0 1 2 3 4 6
7024 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);
7025 if (progression_requirements_results)
7026 {
7027 do
7028 {
7029 Field* progression_requirement_row = progression_requirements_results->Fetch();
7030
7031 const uint8 requirement_type = progression_requirement_row[0].Get<uint8>();
7032 const uint32 requirement_id = progression_requirement_row[1].Get<uint32>();
7033 const std::string requirement_note = progression_requirement_row[2].Get<std::string>();
7034 const uint8 requirement_faction = progression_requirement_row[3].Get<uint8>();
7035 const uint8 requirement_priority = progression_requirement_row[4].IsNull() ? UINT8_MAX : progression_requirement_row[4].Get<uint8>();
7036 const bool requirement_checkLeaderOnly = progression_requirement_row[5].Get<bool>();
7037
7038 ProgressionRequirement* progression_requirement = new ProgressionRequirement();
7039 progression_requirement->id = requirement_id;
7040 progression_requirement->note = requirement_note;
7041 progression_requirement->faction = (TeamId)requirement_faction;
7042 progression_requirement->priority = requirement_priority;
7043 progression_requirement->checkLeaderOnly = requirement_checkLeaderOnly;
7044
7045 std::vector<ProgressionRequirement*>* currentRequirementsList = nullptr;
7046
7047 switch (requirement_type)
7048 {
7049 case 0:
7050 {
7051 //Achievement
7052 if (!sAchievementStore.LookupEntry(progression_requirement->id))
7053 {
7054 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);
7055 break;
7056 }
7057
7058 currentRequirementsList = &ar->achievements;
7059 break;
7060 }
7061 case 1:
7062 {
7063 //Quest
7064 if (!GetQuestTemplate(progression_requirement->id))
7065 {
7066 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);
7067 break;
7068 }
7069
7070 currentRequirementsList = &ar->quests;
7071 break;
7072 }
7073 case 2:
7074 {
7075 //Item
7076 ItemTemplate const* pProto = GetItemTemplate(progression_requirement->id);
7077 if (!pProto)
7078 {
7079 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);
7080 break;
7081 }
7082
7083 currentRequirementsList = &ar->items;
7084 break;
7085 }
7086 default:
7087 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);
7088 break;
7089 }
7090
7091 //Check if array is valid and delete the progression requirement
7092 if (!currentRequirementsList)
7093 {
7094 delete progression_requirement;
7095 continue;
7096 }
7097
7098 //Insert into the array
7099 if (currentRequirementsList->size() > requirement_priority)
7100 {
7101 currentRequirementsList->insert(currentRequirementsList->begin() + requirement_priority, progression_requirement);
7102 }
7103 else
7104 {
7105 currentRequirementsList->push_back(progression_requirement);
7106 }
7107
7108 } while (progression_requirements_results->NextRow());
7109 }
7110
7111 //Sort all arrays for priority
7112 auto sortFunction = [](const ProgressionRequirement* const a, const ProgressionRequirement* const b) {return a->priority > b->priority; };
7113 std::sort(ar->achievements.begin(), ar->achievements.end(), sortFunction);
7114 std::sort(ar->quests.begin(), ar->quests.end(), sortFunction);
7115 std::sort(ar->items.begin(), ar->items.end(), sortFunction);
7116
7117 countProgressionRequirements += ar->achievements.size();
7118 countProgressionRequirements += ar->quests.size();
7119 countProgressionRequirements += ar->items.size();
7120 count++;
7121
7122 _accessRequirementStore[mapid][difficulty] = ar;
7123 } while (access_template_result->NextRow());
7124
7125 LOG_INFO("server.loading", ">> Loaded {} Rows From dungeon_access_template And {} Rows From dungeon_access_requirements in {} ms", count, countProgressionRequirements, GetMSTimeDiffToNow(oldMSTime));
7126 LOG_INFO("server.loading", " ");
7127}
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:759
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:3476
Quest const * GetQuestTemplate(uint32 quest_id) const
Definition ObjectMgr.h:834
Definition Player.h:949
Definition ItemTemplate.h:619
Definition Player.h:940
uint32 priority
Definition Player.h:944

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 ( )
8914{
8915 uint32 oldMSTime = getMSTime();
8916
8917 _acoreStringStore.clear(); // for reload case
8918 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");
8919 if (!result)
8920 {
8921 LOG_WARN("server.loading", ">> Loaded 0 acore strings. DB table `acore_strings` is empty.");
8922 LOG_INFO("server.loading", " ");
8923 return false;
8924 }
8925
8926 do
8927 {
8928 Field* fields = result->Fetch();
8929
8930 uint32 entry = fields[0].Get<uint32>();
8931
8932 AcoreString& data = _acoreStringStore[entry];
8933
8934 data.Content.resize(DEFAULT_LOCALE + 1);
8935
8936 for (uint8 i = 0; i < TOTAL_LOCALES; ++i)
8937 AddLocaleString(fields[i + 1].Get<std::string>(), LocaleConstant(i), data.Content);
8938 } while (result->NextRow());
8939
8940 LOG_INFO("server.loading", ">> Loaded {} Acore Strings in {} ms", (uint32)_acoreStringStore.size(), GetMSTimeDiffToNow(oldMSTime));
8941 LOG_INFO("server.loading", " ");
8942
8943 return true;
8944}
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 ( )
6854{
6855 uint32 oldMSTime = getMSTime();
6856
6857 _areaTriggerStore.clear();
6858
6859 QueryResult result = WorldDatabase.Query("SELECT entry, map, x, y, z, radius, length, width, height, orientation FROM areatrigger");
6860
6861 if (!result)
6862 {
6863 LOG_WARN("server.loading", ">> Loaded 0 area trigger definitions. DB table `areatrigger` is empty.");
6864 LOG_INFO("server.loading", " ");
6865 return;
6866 }
6867
6868 uint32 count = 0;
6869
6870 do
6871 {
6872 Field* fields = result->Fetch();
6873
6874 ++count;
6875
6876 AreaTrigger at;
6877
6878 at.entry = fields[0].Get<uint32>();
6879 at.map = fields[1].Get<uint32>();
6880 at.x = fields[2].Get<float>();
6881 at.y = fields[3].Get<float>();
6882 at.z = fields[4].Get<float>();
6883 at.radius = fields[5].Get<float>();
6884 at.length = fields[6].Get<float>();
6885 at.width = fields[7].Get<float>();
6886 at.height = fields[8].Get<float>();
6887 at.orientation = fields[9].Get<float>();
6888
6889 MapEntry const* mapEntry = sMapStore.LookupEntry(at.map);
6890 if (!mapEntry)
6891 {
6892 LOG_ERROR("sql.sql", "Area trigger (ID:{}) map (ID: {}) does not exist in `Map.dbc`.", at.entry, at.map);
6893 continue;
6894 }
6895
6896 _areaTriggerStore[at.entry] = at;
6897 } while (result->NextRow());
6898
6899 LOG_INFO("server.loading", ">> Loaded {} Area Trigger Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6900 LOG_INFO("server.loading", " ");
6901}
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 ( )
6712{
6713 uint32 oldMSTime = getMSTime();
6714
6715 _areaTriggerScriptStore.clear(); // need for reload case
6716 QueryResult result = WorldDatabase.Query("SELECT entry, ScriptName FROM areatrigger_scripts");
6717
6718 if (!result)
6719 {
6720 LOG_WARN("server.loading", ">> Loaded 0 Areatrigger Scripts. DB Table `areatrigger_scripts` Is Empty.");
6721 LOG_INFO("server.loading", " ");
6722 return;
6723 }
6724
6725 uint32 count = 0;
6726
6727 do
6728 {
6729 ++count;
6730
6731 Field* fields = result->Fetch();
6732
6733 uint32 Trigger_ID = fields[0].Get<uint32>();
6734 std::string scriptName = fields[1].Get<std::string>();
6735
6736 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6737 if (!atEntry)
6738 {
6739 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6740 continue;
6741 }
6742 _areaTriggerScriptStore[Trigger_ID] = GetScriptId(scriptName);
6743 } while (result->NextRow());
6744
6745 LOG_INFO("server.loading", ">> Loaded {} Areatrigger Scripts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6746 LOG_INFO("server.loading", " ");
6747}
uint32 GetScriptId(std::string const &name)
Definition ObjectMgr.cpp:9810

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

◆ LoadAreaTriggerTeleports()

void ObjectMgr::LoadAreaTriggerTeleports ( )
6904{
6905 uint32 oldMSTime = getMSTime();
6906
6907 _areaTriggerTeleportStore.clear(); // need for reload case
6908
6909 // 0 1 2 3 4 5
6910 QueryResult result = WorldDatabase.Query("SELECT ID, target_map, target_position_x, target_position_y, target_position_z, target_orientation FROM areatrigger_teleport");
6911
6912 if (!result)
6913 {
6914 LOG_WARN("server.loading", ">> Loaded 0 area trigger teleport definitions. DB table `areatrigger_teleport` is empty.");
6915 LOG_INFO("server.loading", " ");
6916 return;
6917 }
6918
6919 uint32 count = 0;
6920
6921 do
6922 {
6923 Field* fields = result->Fetch();
6924
6925 ++count;
6926
6927 uint32 Trigger_ID = fields[0].Get<uint32>();
6928
6930
6931 at.target_mapId = fields[1].Get<uint16>();
6932 at.target_X = fields[2].Get<float>();
6933 at.target_Y = fields[3].Get<float>();
6934 at.target_Z = fields[4].Get<float>();
6935 at.target_Orientation = fields[5].Get<float>();
6936
6937 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6938 if (!atEntry)
6939 {
6940 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6941 continue;
6942 }
6943
6944 MapEntry const* mapEntry = sMapStore.LookupEntry(at.target_mapId);
6945 if (!mapEntry)
6946 {
6947 LOG_ERROR("sql.sql", "Area trigger (ID:{}) target map (ID: {}) does not exist in `Map.dbc`.", Trigger_ID, at.target_mapId);
6948 continue;
6949 }
6950
6951 if (at.target_X == 0 && at.target_Y == 0 && at.target_Z == 0)
6952 {
6953 LOG_ERROR("sql.sql", "Area trigger (ID:{}) target coordinates not provided.", Trigger_ID);
6954 continue;
6955 }
6956
6957 _areaTriggerTeleportStore[Trigger_ID] = at;
6958 } while (result->NextRow());
6959
6960 LOG_INFO("server.loading", ">> Loaded {} Area Trigger Teleport Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6961 LOG_INFO("server.loading", " ");
6962}
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 ( )
9910{
9911 uint32 oldMSTime = getMSTime();
9912
9913 // 0 1 2 3
9914 QueryResult result = WorldDatabase.Query("SELECT ID, locale, MaleText, FemaleText FROM broadcast_text_locale");
9915
9916 if (!result)
9917 {
9918 LOG_WARN("server.loading", ">> Loaded 0 broadcast text locales. DB table `broadcast_text_locale` is empty.");
9919 LOG_INFO("server.loading", " ");
9920 return;
9921 }
9922
9923 uint32 locales_count = 0;
9924 do
9925 {
9926 Field* fields = result->Fetch();
9927
9928 uint32 id = fields[0].Get<uint32>();
9929
9930 BroadcastTextContainer::iterator bct = _broadcastTextStore.find(id);
9931 if (bct == _broadcastTextStore.end())
9932 {
9933 LOG_ERROR("sql.sql", "BroadcastText (Id: {}) found in table `broadcast_text_locale` but does not exist in `broadcast_text`. Skipped!", id);
9934 continue;
9935 }
9936
9937 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
9938 if (locale == LOCALE_enUS)
9939 continue;
9940
9941 AddLocaleString(fields[2].Get<std::string>(), locale, bct->second.MaleText);
9942 AddLocaleString(fields[3].Get<std::string>(), locale, bct->second.FemaleText);
9943 locales_count++;
9944 } while (result->NextRow());
9945
9946 LOG_INFO("server.loading", ">> Loaded {} Broadcast Text Locales in {} ms", locales_count, GetMSTimeDiffToNow(oldMSTime));
9947 LOG_INFO("server.loading", " ");
9948}
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 ( )
9825{
9826 uint32 oldMSTime = getMSTime();
9827
9828 _broadcastTextStore.clear(); // for reload case
9829
9830 // 0 1 2 3 4 5 6 7 8 9 10 11 12
9831 QueryResult result = WorldDatabase.Query("SELECT ID, LanguageID, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3, SoundEntriesID, EmotesID, Flags FROM broadcast_text");
9832 if (!result)
9833 {
9834 LOG_WARN("server.loading", ">> Loaded 0 broadcast texts. DB table `broadcast_text` is empty.");
9835 LOG_INFO("server.loading", " ");
9836 return;
9837 }
9838
9839 _broadcastTextStore.rehash(result->GetRowCount());
9840
9841 do
9842 {
9843 Field* fields = result->Fetch();
9844
9845 BroadcastText bct;
9846
9847 bct.Id = fields[0].Get<uint32>();
9848 bct.LanguageID = fields[1].Get<uint32>();
9849 bct.MaleText[DEFAULT_LOCALE] = fields[2].Get<std::string>();
9850 bct.FemaleText[DEFAULT_LOCALE] = fields[3].Get<std::string>();
9851 bct.EmoteId1 = fields[4].Get<uint32>();
9852 bct.EmoteId2 = fields[5].Get<uint32>();
9853 bct.EmoteId3 = fields[6].Get<uint32>();
9854 bct.EmoteDelay1 = fields[7].Get<uint32>();
9855 bct.EmoteDelay2 = fields[8].Get<uint32>();
9856 bct.EmoteDelay3 = fields[9].Get<uint32>();
9857 bct.SoundEntriesId = fields[10].Get<uint32>();
9858 bct.EmotesID = fields[11].Get<uint32>();
9859 bct.Flags = fields[12].Get<uint32>();
9860
9861 if (bct.SoundEntriesId)
9862 {
9863 if (!sSoundEntriesStore.LookupEntry(bct.SoundEntriesId))
9864 {
9865 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has SoundEntriesId {} but sound does not exist.", bct.Id, bct.SoundEntriesId);
9866 bct.SoundEntriesId = 0;
9867 }
9868 }
9869
9871 {
9872 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` using Language {} but Language does not exist.", bct.Id, bct.LanguageID);
9874 }
9875
9876 if (bct.EmoteId1)
9877 {
9878 if (!sEmotesStore.LookupEntry(bct.EmoteId1))
9879 {
9880 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId1 {} but emote does not exist.", bct.Id, bct.EmoteId1);
9881 bct.EmoteId1 = 0;
9882 }
9883 }
9884
9885 if (bct.EmoteId2)
9886 {
9887 if (!sEmotesStore.LookupEntry(bct.EmoteId2))
9888 {
9889 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId2 {} but emote does not exist.", bct.Id, bct.EmoteId2);
9890 bct.EmoteId2 = 0;
9891 }
9892 }
9893
9894 if (bct.EmoteId3)
9895 {
9896 if (!sEmotesStore.LookupEntry(bct.EmoteId3))
9897 {
9898 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId3 {} but emote does not exist.", bct.Id, bct.EmoteId3);
9899 bct.EmoteId3 = 0;
9900 }
9901 }
9902
9903 _broadcastTextStore[bct.Id] = bct;
9904 } while (result->NextRow());
9905
9906 LOG_INFO("server.loading", ">> Loaded {} Broadcast Texts in {} ms", _broadcastTextStore.size(), GetMSTimeDiffToNow(oldMSTime));
9907}
DBCStorage< SoundEntriesEntry > sSoundEntriesStore(SoundEntriesfmt)
DBCStorage< EmotesEntry > sEmotesStore(EmotesEntryfmt)
LanguageDesc const * GetLanguageDescByID(uint32 lang)
Definition ObjectMgr.cpp:253
@ LANG_UNIVERSAL
Definition SharedDefines.h:735
Definition ObjectMgr.h:434
uint32 EmoteDelay2
Definition ObjectMgr.h:449
uint32 Id
Definition ObjectMgr.h:441
std::vector< std::string > FemaleText
Definition ObjectMgr.h:444
uint32 EmotesID
Definition ObjectMgr.h:452
uint32 LanguageID
Definition ObjectMgr.h:442
uint32 EmoteId2
Definition ObjectMgr.h:446
uint32 EmoteDelay1
Definition ObjectMgr.h:448
uint32 SoundEntriesId
Definition ObjectMgr.h:451
std::vector< std::string > MaleText
Definition ObjectMgr.h:443
uint32 EmoteId3
Definition ObjectMgr.h:447
uint32 EmoteId1
Definition ObjectMgr.h:445
uint32 EmoteDelay3
Definition ObjectMgr.h:450
uint32 Flags
Definition ObjectMgr.h:453

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

◆ LoadCreatureAddons()

void ObjectMgr::LoadCreatureAddons ( )
1273{
1274 uint32 oldMSTime = getMSTime();
1275
1276 // 0 1 2 3 4 5 6 7
1277 QueryResult result = WorldDatabase.Query("SELECT guid, path_id, mount, bytes1, bytes2, emote, visibilityDistanceType, auras FROM creature_addon");
1278
1279 if (!result)
1280 {
1281 LOG_WARN("server.loading", ">> Loaded 0 creature addon definitions. DB table `creature_addon` is empty.");
1282 LOG_INFO("server.loading", " ");
1283 return;
1284 }
1285
1286 uint32 count = 0;
1287 do
1288 {
1289 Field* fields = result->Fetch();
1290
1291 ObjectGuid::LowType guid = fields[0].Get<uint32>();
1292
1293 CreatureData const* creData = GetCreatureData(guid);
1294 if (!creData)
1295 {
1296 LOG_ERROR("sql.sql", "Creature (GUID: {}) does not exist but has a record in `creature_addon`", guid);
1297 continue;
1298 }
1299
1300 CreatureAddon& creatureAddon = _creatureAddonStore[guid];
1301
1302 creatureAddon.path_id = fields[1].Get<uint32>();
1303 if (creData->movementType == WAYPOINT_MOTION_TYPE && !creatureAddon.path_id)
1304 {
1305 const_cast<CreatureData*>(creData)->movementType = IDLE_MOTION_TYPE;
1306 LOG_ERROR("sql.sql", "Creature (GUID {}) has movement type set to WAYPOINT_MOTION_TYPE but no path assigned", guid);
1307 }
1308
1309 creatureAddon.mount = fields[2].Get<uint32>();
1310 creatureAddon.bytes1 = fields[3].Get<uint32>();
1311 creatureAddon.bytes2 = fields[4].Get<uint32>();
1312 creatureAddon.emote = fields[5].Get<uint32>();
1313 creatureAddon.visibilityDistanceType = VisibilityDistanceType(fields[6].Get<uint8>());
1314
1315 for (std::string_view aura : Acore::Tokenize(fields[7].Get<std::string_view>(), ' ', false))
1316 {
1317 SpellInfo const* spellInfo = nullptr;
1318
1319 if (Optional<uint32> spellId = Acore::StringTo<uint32>(aura))
1320 {
1321 spellInfo = sSpellMgr->GetSpellInfo(*spellId);
1322 }
1323
1324 if (!spellInfo)
1325 {
1326 LOG_ERROR("sql.sql", "Creature (GUID: {}) has wrong spell '{}' defined in `auras` field in `creature_addon`.", guid, aura);
1327 continue;
1328 }
1329
1330 if (std::find(creatureAddon.auras.begin(), creatureAddon.auras.end(), spellInfo->Id) != creatureAddon.auras.end())
1331 {
1332 LOG_ERROR("sql.sql", "Creature (GUID: {}) has duplicate aura (spell {}) in `auras` field in `creature_addon`.", guid, spellInfo->Id);
1333 continue;
1334 }
1335
1336 if (spellInfo->GetDuration() > 0)
1337 {
1338 LOG_DEBUG/*ERROR*/("sql.sql", "Creature (Entry: {}) has temporary aura (spell {}) in `auras` field in `creature_template_addon`.", guid, spellInfo->Id);
1339 // continue;
1340 }
1341
1342 creatureAddon.auras.push_back(spellInfo->Id);
1343 }
1344
1345 if (creatureAddon.mount)
1346 {
1347 if (!sCreatureDisplayInfoStore.LookupEntry(creatureAddon.mount))
1348 {
1349 LOG_ERROR("sql.sql", "Creature (GUID: {}) has invalid displayInfoId ({}) for mount defined in `creature_addon`", guid, creatureAddon.mount);
1350 creatureAddon.mount = 0;
1351 }
1352 }
1353
1354 if (!sEmotesStore.LookupEntry(creatureAddon.emote))
1355 {
1356 LOG_ERROR("sql.sql", "Creature (GUID: {}) has invalid emote ({}) defined in `creature_addon`.", guid, creatureAddon.emote);
1357 creatureAddon.emote = 0;
1358 }
1359
1361 {
1362 LOG_ERROR("sql.sql", "Creature (GUID: {}) has invalid visibilityDistanceType ({}) defined in `creature_addon`.", guid, AsUnderlyingType(creatureAddon.visibilityDistanceType));
1364 }
1365
1366 ++count;
1367 } while (result->NextRow());
1368
1369 LOG_INFO("server.loading", ">> Loaded {} Creature Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1370 LOG_INFO("server.loading", " ");
1371}
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
@ WAYPOINT_MOTION_TYPE
Definition MotionMaster.h:41
VisibilityDistanceType
Definition ObjectDefines.h:63
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 ( )
9977{
9978 uint32 oldMSTime = getMSTime();
9979
9980 QueryResult result = WorldDatabase.Query("SELECT level, class, basehp0, basehp1, basehp2, basemana, basearmor, attackpower, rangedattackpower, damage_base, damage_exp1, damage_exp2 FROM creature_classlevelstats");
9981
9982 if (!result)
9983 {
9984 LOG_WARN("server.loading", ">> Loaded 0 creature base stats. DB table `creature_classlevelstats` is empty.");
9985 LOG_INFO("server.loading", " ");
9986 return;
9987 }
9988
9989 uint32 count = 0;
9990 do
9991 {
9992 Field* fields = result->Fetch();
9993
9994 uint8 Level = fields[0].Get<uint8>();
9995 uint8 Class = fields[1].Get<uint8>();
9996
9997 if (!Class || ((1 << (Class - 1)) & CLASSMASK_ALL_CREATURES) == 0)
9998 LOG_ERROR("sql.sql", "Creature base stats for level {} has invalid class {}", Level, Class);
9999
10000 CreatureBaseStats stats;
10001
10002 for (uint8 i = 0; i < MAX_EXPANSIONS; ++i)
10003 {
10004 stats.BaseHealth[i] = fields[2 + i].Get<uint32>();
10005
10006 if (stats.BaseHealth[i] == 0)
10007 {
10008 LOG_ERROR("sql.sql", "Creature base stats for class {}, level {} has invalid zero base HP[{}] - set to 1", Class, Level, i);
10009 stats.BaseHealth[i] = 1;
10010 }
10011
10012 // xinef: if no data is available, get them from lower expansions
10013 if (stats.BaseHealth[i] <= 1)
10014 {
10015 for (uint8 j = i; j > 0;)
10016 {
10017 --j;
10018 if (stats.BaseHealth[j] > 1)
10019 {
10020 stats.BaseHealth[i] = stats.BaseHealth[j];
10021 break;
10022 }
10023 }
10024 }
10025
10026 stats.BaseDamage[i] = fields[9 + i].Get<float>();
10027 if (stats.BaseDamage[i] < 0.0f)
10028 {
10029 LOG_ERROR("sql.sql", "Creature base stats for class {}, level {} has invalid negative base damage[{}] - set to 0.0", Class, Level, i);
10030 stats.BaseDamage[i] = 0.0f;
10031 }
10032 }
10033
10034 stats.BaseMana = fields[5].Get<uint32>();
10035 stats.BaseArmor = fields[6].Get<uint32>();
10036
10037 stats.AttackPower = fields[7].Get<uint32>();
10038 stats.RangedAttackPower = fields[8].Get<uint32>();
10039
10041
10042 ++count;
10043 } while (result->NextRow());
10044
10046 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
10047 {
10048 for (uint16 lvl = itr->second.minlevel; lvl <= itr->second.maxlevel; ++lvl)
10049 {
10050 if (_creatureBaseStatsStore.find(MAKE_PAIR16(lvl, itr->second.unit_class)) == _creatureBaseStatsStore.end())
10051 LOG_ERROR("sql.sql", "Missing base stats for creature class {} level {}", itr->second.unit_class, lvl);
10052 }
10053 }
10054
10055 LOG_INFO("server.loading", ">> Loaded {} Creature Base Stats in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10056 LOG_INFO("server.loading", " ");
10057}
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:74

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

◆ LoadCreatureLocales()

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

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

◆ LoadCreatureModelInfo()

void ObjectMgr::LoadCreatureModelInfo ( )
1714{
1715 uint32 oldMSTime = getMSTime();
1716
1717 // 0 1 2 3 4
1718 QueryResult result = WorldDatabase.Query("SELECT DisplayID, BoundingRadius, CombatReach, Gender, DisplayID_Other_Gender FROM creature_model_info");
1719
1720 if (!result)
1721 {
1722 LOG_WARN("server.loading", ">> Loaded 0 creature model definitions. DB table `creature_model_info` is empty.");
1723 LOG_INFO("server.loading", " ");
1724 return;
1725 }
1726
1727 _creatureModelStore.rehash(result->GetRowCount());
1728 uint32 count = 0;
1729
1730 // List of ModelDataIDs that use Invisible models
1731 uint32 triggerCreatureModelDataID[14] = { 1731, 1752, 2206, 2296, 2372, 2382, 2481, 2512, 2513, 2611, 2636, 2790, 3230, 3274 };
1732
1733 do
1734 {
1735 Field* fields = result->Fetch();
1736
1737 uint32 displayId = fields[0].Get<uint32>();
1738 CreatureDisplayInfoEntry const* creatureDisplay = sCreatureDisplayInfoStore.LookupEntry(displayId);
1739 uint32 modelId = fields[0].Get<uint32>();
1740
1741 CreatureModelInfo& modelInfo = _creatureModelStore[modelId];
1742
1743 modelInfo.bounding_radius = fields[1].Get<float>();
1744 modelInfo.combat_reach = fields[2].Get<float>();
1745 modelInfo.gender = fields[3].Get<uint8>();
1746 modelInfo.modelid_other_gender = fields[4].Get<uint32>();
1747 modelInfo.is_trigger = false;
1748
1749 // Checks
1750
1751 if (!sCreatureDisplayInfoStore.LookupEntry(modelId))
1752 LOG_ERROR("sql.sql", "Table `creature_model_info` has model for not existed display id ({}).", modelId);
1753
1754 if (modelInfo.gender > GENDER_NONE)
1755 {
1756 LOG_ERROR("sql.sql", "Table `creature_model_info` has wrong gender ({}) for display id ({}).", uint32(modelInfo.gender), modelId);
1757 modelInfo.gender = GENDER_MALE;
1758 }
1759
1760 if (modelInfo.modelid_other_gender && !sCreatureDisplayInfoStore.LookupEntry(modelInfo.modelid_other_gender))
1761 {
1762 LOG_ERROR("sql.sql", "Table `creature_model_info` has not existed alt.gender model ({}) for existed display id ({}).", modelInfo.modelid_other_gender, modelId);
1763 modelInfo.modelid_other_gender = 0;
1764 }
1765
1766 if (modelInfo.combat_reach < 0.1f)
1767 modelInfo.combat_reach = DEFAULT_COMBAT_REACH;
1768
1769 if (CreatureModelDataEntry const* modelData = sCreatureModelDataStore.LookupEntry(creatureDisplay->ModelId))
1770 {
1771 for (uint32 i = 0; i < 14; i++)
1772 {
1773 if (modelData->Id == triggerCreatureModelDataID[i])
1774 {
1775 modelInfo.is_trigger = true;
1776 break;
1777 }
1778 }
1779 }
1780
1781 ++count;
1782 } while (result->NextRow());
1783
1784 LOG_INFO("server.loading", ">> Loaded {} Creature Model Based Info in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1785 LOG_INFO("server.loading", " ");
1786}
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
#define DEFAULT_COMBAT_REACH
Definition ObjectDefines.h:46
@ 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 ( )
1562{
1563 uint32 oldMSTime = getMSTime();
1564
1566
1567 // Load the data from creature_movement_override and if NULL fallback to creature_template_movement
1568 QueryResult result = WorldDatabase.Query("SELECT cmo.SpawnId,"
1569 "COALESCE(cmo.Ground, ctm.Ground),"
1570 "COALESCE(cmo.Swim, ctm.Swim),"
1571 "COALESCE(cmo.Flight, ctm.Flight),"
1572 "COALESCE(cmo.Rooted, ctm.Rooted),"
1573 "COALESCE(cmo.Chase, ctm.Chase),"
1574 "COALESCE(cmo.Random, ctm.Random),"
1575 "COALESCE(cmo.InteractionPauseTimer, ctm.InteractionPauseTimer) "
1576 "FROM creature_movement_override AS cmo "
1577 "LEFT JOIN creature AS c ON c.guid = cmo.SpawnId "
1578 "LEFT JOIN creature_template_movement AS ctm ON ctm.CreatureId = c.id1");
1579 if (!result)
1580 {
1581 LOG_WARN("server.loading", ">> Loaded 0 creature movement overrides. DB table `creature_movement_override` is empty!");
1582 return;
1583 }
1584
1585 do
1586 {
1587 Field* fields = result->Fetch();
1588 ObjectGuid::LowType spawnId = fields[0].Get<uint32>();
1589 if (!GetCreatureData(spawnId))
1590 {
1591 LOG_ERROR("sql.sql", "Creature (GUID: {}) does not exist but has a record in `creature_movement_override`", spawnId);
1592 continue;
1593 }
1594
1596 if (!fields[1].IsNull())
1597 {
1598 movement.Ground = static_cast<CreatureGroundMovementType>(fields[1].Get<uint8>());
1599 }
1600
1601 if (!fields[2].IsNull())
1602 {
1603 movement.Swim = fields[2].Get<bool>();
1604 }
1605
1606 if (!fields[3].IsNull())
1607 {
1608 movement.Flight = static_cast<CreatureFlightMovementType>(fields[3].Get<uint8>());
1609 }
1610
1611 if (!fields[4].IsNull())
1612 {
1613 movement.Rooted = fields[4].Get<bool>();
1614 }
1615
1616 if (!fields[5].IsNull())
1617 {
1618 movement.Chase = static_cast<CreatureChaseMovementType>(fields[5].Get<uint8>());
1619 }
1620
1621 if (!fields[6].IsNull())
1622 {
1623 movement.Random = static_cast<CreatureRandomMovementType>(fields[6].Get<uint8>());
1624 }
1625
1626 if (!fields[7].IsNull())
1627 {
1628 movement.InteractionPauseTimer = fields[7].Get<uint32>();
1629 }
1630
1631 CheckCreatureMovement("creature_movement_override", spawnId, movement);
1632 } while (result->NextRow());
1633
1634 LOG_INFO("server.loading", ">> Loaded {} Movement Overrides in {} ms", _creatureMovementOverrides.size(), GetMSTimeDiffToNow(oldMSTime));
1635 LOG_INFO("server.loading", " ");
1636}
CreatureFlightMovementType
Definition CreatureData.h:92
CreatureChaseMovementType
Definition CreatureData.h:101
CreatureGroundMovementType
Definition CreatureData.h:83
CreatureRandomMovementType
Definition CreatureData.h:110
Definition CreatureData.h:119
bool Swim
Definition CreatureData.h:124
bool Rooted
Definition CreatureData.h:125
uint32 InteractionPauseTimer
Definition CreatureData.h:128

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

◆ LoadCreatureQuestEnders()

void ObjectMgr::LoadCreatureQuestEnders ( )
8349{
8350 LoadQuestRelationsHelper(_creatureQuestInvolvedRelations, "creature_questender", false, false);
8351
8352 for (QuestRelations::iterator itr = _creatureQuestInvolvedRelations.begin(); itr != _creatureQuestInvolvedRelations.end(); ++itr)
8353 {
8354 CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
8355 if (!cInfo)
8356 LOG_ERROR("sql.sql", "Table `creature_questender` have data for not existed creature entry ({}) and existed quest {}", itr->first, itr->second);
8357 else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
8358 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);
8359 }
8360}
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:316
void LoadQuestRelationsHelper(QuestRelations &map, std::string const &table, bool starter, bool go)
Definition ObjectMgr.cpp:8261

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadCreatureQuestItems()

void ObjectMgr::LoadCreatureQuestItems ( )
10378{
10379 uint32 oldMSTime = getMSTime();
10380
10381 // 0 1 2
10382 QueryResult result = WorldDatabase.Query("SELECT CreatureEntry, ItemId, Idx FROM creature_questitem ORDER BY Idx ASC");
10383
10384 if (!result)
10385 {
10386 LOG_WARN("server.loading", ">> Loaded 0 creature quest items. DB table `creature_questitem` is empty.");
10387 return;
10388 }
10389
10390 uint32 count = 0;
10391 do
10392 {
10393 Field* fields = result->Fetch();
10394
10395 uint32 entry = fields[0].Get<uint32>();
10396 uint32 item = fields[1].Get<uint32>();
10397 uint32 idx = fields[2].Get<uint32>();
10398
10399 CreatureTemplate const* creatureInfo = GetCreatureTemplate(entry);
10400 if (!creatureInfo)
10401 {
10402 LOG_ERROR("sql.sql", "Table `creature_questitem` has data for nonexistent creature (entry: {}, idx: {}), skipped", entry, idx);
10403 continue;
10404 };
10405
10406 ItemEntry const* dbcData = sItemStore.LookupEntry(item);
10407 if (!dbcData)
10408 {
10409 LOG_ERROR("sql.sql", "Table `creature_questitem` has nonexistent item (ID: {}) in creature (entry: {}, idx: {}), skipped", item, entry, idx);
10410 continue;
10411 };
10412
10413 _creatureQuestItemStore[entry].push_back(item);
10414
10415 ++count;
10416 } while (result->NextRow());
10417
10418 LOG_INFO("server.loading", ">> Loaded {} Creature Quest Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10419 LOG_INFO("server.loading", " ");
10420}
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 ( )
8335{
8336 LoadQuestRelationsHelper(_creatureQuestRelations, "creature_queststarter", true, false);
8337
8338 for (QuestRelations::iterator itr = _creatureQuestRelations.begin(); itr != _creatureQuestRelations.end(); ++itr)
8339 {
8340 CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
8341 if (!cInfo)
8342 LOG_ERROR("sql.sql", "Table `creature_queststarter` have data for not existed creature entry ({}) and existed quest {}", itr->first, itr->second);
8343 else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
8344 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);
8345 }
8346}

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadCreatures()

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

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:727
@ SPELL_SCHOOL_HOLY
Definition SharedDefines.h:284
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}
Models
Definition boss_black_knight.cpp:95

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

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplateResistances()

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

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

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplates()

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

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

◆ LoadCreatureTemplateSpells()

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

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

Referenced by LoadCreatureTemplates().

◆ LoadEquipmentTemplates()

void ObjectMgr::LoadEquipmentTemplates ( )
1484{
1485 uint32 oldMSTime = getMSTime();
1486
1487 // 0 1 2 3 4
1488 QueryResult result = WorldDatabase.Query("SELECT CreatureID, ID, ItemID1, ItemID2, ItemID3 FROM creature_equip_template");
1489
1490 if (!result)
1491 {
1492 LOG_WARN("server.loading", ">> Loaded 0 creature equipment templates. DB table `creature_equip_template` is empty!");
1493 LOG_INFO("server.loading", " ");
1494 return;
1495 }
1496
1497 uint32 count = 0;
1498 do
1499 {
1500 Field* fields = result->Fetch();
1501
1502 uint32 entry = fields[0].Get<uint32>();
1503
1504 if (!GetCreatureTemplate(entry))
1505 {
1506 LOG_ERROR("sql.sql", "Creature template (CreatureID: {}) does not exist but has a record in `creature_equip_template`", entry);
1507 continue;
1508 }
1509
1510 uint8 id = fields[1].Get<uint8>();
1511 if (!id)
1512 {
1513 LOG_ERROR("sql.sql", "Creature equipment template with id 0 found for creature {}, skipped.", entry);
1514 continue;
1515 }
1516
1517 EquipmentInfo& equipmentInfo = _equipmentInfoStore[entry][id];
1518
1519 equipmentInfo.ItemEntry[0] = fields[2].Get<uint32>();
1520 equipmentInfo.ItemEntry[1] = fields[3].Get<uint32>();
1521 equipmentInfo.ItemEntry[2] = fields[4].Get<uint32>();
1522
1523 for (uint8 i = 0; i < MAX_EQUIPMENT_ITEMS; ++i)
1524 {
1525 if (!equipmentInfo.ItemEntry[i])
1526 continue;
1527
1528 ItemEntry const* dbcItem = sItemStore.LookupEntry(equipmentInfo.ItemEntry[i]);
1529
1530 if (!dbcItem)
1531 {
1532 LOG_ERROR("sql.sql", "Unknown item (ID={}) in creature_equip_template.ItemID{} for CreatureID = {} and ID = {}, forced to 0.",
1533 equipmentInfo.ItemEntry[i], i + 1, entry, id);
1534 equipmentInfo.ItemEntry[i] = 0;
1535 continue;
1536 }
1537
1538 if (dbcItem->InventoryType != INVTYPE_WEAPON &&
1539 dbcItem->InventoryType != INVTYPE_SHIELD &&
1540 dbcItem->InventoryType != INVTYPE_RANGED &&
1541 dbcItem->InventoryType != INVTYPE_2HWEAPON &&
1544 dbcItem->InventoryType != INVTYPE_HOLDABLE &&
1545 dbcItem->InventoryType != INVTYPE_THROWN &&
1547 {
1548 LOG_ERROR("sql.sql", "Item (ID={}) in creature_equip_template.ItemID{} for CreatureID = {} and ID = {} is not equipable in a hand, forced to 0.",
1549 equipmentInfo.ItemEntry[i], i + 1, entry, id);
1550 equipmentInfo.ItemEntry[i] = 0;
1551 }
1552 }
1553
1554 ++count;
1555 } while (result->NextRow());
1556
1557 LOG_INFO("server.loading", ">> Loaded {} Equipment Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1558 LOG_INFO("server.loading", " ");
1559}
#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 ( )
5760{
5762
5763 std::set<uint32> evt_scripts;
5764 // Load all possible script entries from gameobjects
5766 for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
5767 if (uint32 eventId = itr->second.GetEventScriptId())
5768 evt_scripts.insert(eventId);
5769
5770 // Load all possible script entries from spells
5771 for (uint32 i = 1; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
5772 if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(i))
5773 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
5774 if (spell->Effects[j].Effect == SPELL_EFFECT_SEND_EVENT)
5775 if (spell->Effects[j].MiscValue)
5776 evt_scripts.insert(spell->Effects[j].MiscValue);
5777
5778 for (std::size_t path_idx = 0; path_idx < sTaxiPathNodesByPath.size(); ++path_idx)
5779 {
5780 for (std::size_t node_idx = 0; node_idx < sTaxiPathNodesByPath[path_idx].size(); ++node_idx)
5781 {
5782 TaxiPathNodeEntry const* node = sTaxiPathNodesByPath[path_idx][node_idx];
5783
5784 if (node->arrivalEventID)
5785 evt_scripts.insert(node->arrivalEventID);
5786
5787 if (node->departureEventID)
5788 evt_scripts.insert(node->departureEventID);
5789 }
5790 }
5791
5792 // Then check if all scripts are in above list of possible script entries
5793 for (ScriptMapMap::const_iterator itr = sEventScripts.begin(); itr != sEventScripts.end(); ++itr)
5794 {
5795 std::set<uint32>::const_iterator itr2 = evt_scripts.find(itr->first);
5796 if (itr2 == evt_scripts.end())
5797 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 {}",
5798 itr->first, SPELL_EFFECT_SEND_EVENT);
5799 }
5800}
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:839
GameObjectTemplateContainer const * GetGameObjectTemplates() const
Definition ObjectMgr.h:761
void LoadScripts(ScriptsType type)
Definition ObjectMgr.cpp:5417
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 ( )
7641{
7642 uint32 oldMSTime = getMSTime();
7643
7644 QueryResult result = WorldDatabase.Query("SELECT level, basexp FROM exploration_basexp");
7645
7646 if (!result)
7647 {
7648 LOG_WARN("server.loading", ">> Loaded 0 BaseXP definitions. DB table `exploration_basexp` is empty.");
7649 LOG_INFO("server.loading", " ");
7650 return;
7651 }
7652
7653 uint32 count = 0;
7654
7655 do
7656 {
7657 Field* fields = result->Fetch();
7658 uint8 level = fields[0].Get<uint8>();
7659 uint32 basexp = fields[1].Get<int32>();
7660 _baseXPTable[level] = basexp;
7661 ++count;
7662 } while (result->NextRow());
7663
7664 LOG_INFO("server.loading", ">> Loaded {} BaseXP Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7665 LOG_INFO("server.loading", " ");
7666}
std::int32_t int32
Definition Define.h:103

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

◆ LoadFactionChangeAchievements()

void ObjectMgr::LoadFactionChangeAchievements ( )
10060{
10061 uint32 oldMSTime = getMSTime();
10062
10063 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_achievement");
10064
10065 if (!result)
10066 {
10067 LOG_WARN("server.loading", ">> Loaded 0 faction change achievement pairs. DB table `player_factionchange_achievement` is empty.");
10068 LOG_INFO("server.loading", " ");
10069 return;
10070 }
10071
10072 uint32 count = 0;
10073
10074 do
10075 {
10076 Field* fields = result->Fetch();
10077
10078 uint32 alliance = fields[0].Get<uint32>();
10079 uint32 horde = fields[1].Get<uint32>();
10080
10081 if (!sAchievementStore.LookupEntry(alliance))
10082 LOG_ERROR("sql.sql", "Achievement {} (alliance_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", alliance);
10083 else if (!sAchievementStore.LookupEntry(horde))
10084 LOG_ERROR("sql.sql", "Achievement {} (horde_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", horde);
10085 else
10086 FactionChangeAchievements[alliance] = horde;
10087
10088 ++count;
10089 } while (result->NextRow());
10090
10091 LOG_INFO("server.loading", ">> Loaded {} faction change achievement pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10092 LOG_INFO("server.loading", " ");
10093}
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 ( )
10096{
10097 uint32 oldMSTime = getMSTime();
10098
10099 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_items");
10100
10101 if (!result)
10102 {
10103 LOG_WARN("server.loading", ">> Loaded 0 faction change item pairs. DB table `player_factionchange_items` is empty.");
10104 LOG_INFO("server.loading", " ");
10105 return;
10106 }
10107
10108 uint32 count = 0;
10109
10110 do
10111 {
10112 Field* fields = result->Fetch();
10113
10114 uint32 alliance = fields[0].Get<uint32>();
10115 uint32 horde = fields[1].Get<uint32>();
10116
10117 if (!GetItemTemplate(alliance))
10118 LOG_ERROR("sql.sql", "Item {} (alliance_id) referenced in `player_factionchange_items` does not exist, pair skipped!", alliance);
10119 else if (!GetItemTemplate(horde))
10120 LOG_ERROR("sql.sql", "Item {} (horde_id) referenced in `player_factionchange_items` does not exist, pair skipped!", horde);
10121 else
10122 FactionChangeItems[alliance] = horde;
10123
10124 ++count;
10125 } while (result->NextRow());
10126
10127 LOG_INFO("server.loading", ">> Loaded {} faction change item pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10128 LOG_INFO("server.loading", " ");
10129}
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 ( )
10132{
10133 uint32 oldMSTime = getMSTime();
10134
10135 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_quests");
10136
10137 if (!result)
10138 {
10139 LOG_WARN("server.loading", ">> Loaded 0 faction change quest pairs. DB table `player_factionchange_quests` is empty.");
10140 LOG_INFO("server.loading", " ");
10141 return;
10142 }
10143
10144 uint32 count = 0;
10145
10146 do
10147 {
10148 Field* fields = result->Fetch();
10149
10150 uint32 alliance = fields[0].Get<uint32>();
10151 uint32 horde = fields[1].Get<uint32>();
10152
10153 if (!GetQuestTemplate(alliance))
10154 LOG_ERROR("sql.sql", "Quest {} (alliance_id) referenced in `player_factionchange_quests` does not exist, pair skipped!", alliance);
10155 else if (!GetQuestTemplate(horde))
10156 LOG_ERROR("sql.sql", "Quest {} (horde_id) referenced in `player_factionchange_quests` does not exist, pair skipped!", horde);
10157 else
10158 FactionChangeQuests[alliance] = horde;
10159
10160 ++count;
10161 } while (result->NextRow());
10162
10163 LOG_INFO("server.loading", ">> Loaded {} faction change quest pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10164 LOG_INFO("server.loading", " ");
10165}
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 ( )
10168{
10169 uint32 oldMSTime = getMSTime();
10170
10171 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_reputations");
10172
10173 if (!result)
10174 {
10175 LOG_WARN("server.loading", ">> Loaded 0 faction change reputation pairs. DB table `player_factionchange_reputations` is empty.");
10176 LOG_INFO("server.loading", " ");
10177 return;
10178 }
10179
10180 uint32 count = 0;
10181
10182 do
10183 {
10184 Field* fields = result->Fetch();
10185
10186 uint32 alliance = fields[0].Get<uint32>();
10187 uint32 horde = fields[1].Get<uint32>();
10188
10189 if (!sFactionStore.LookupEntry(alliance))
10190 LOG_ERROR("sql.sql", "Reputation {} (alliance_id) referenced in `player_factionchange_reputations` does not exist, pair skipped!", alliance);
10191 else if (!sFactionStore.LookupEntry(horde))
10192 LOG_ERROR("sql.sql", "Reputation {} (horde_id) referenced in `player_factionchange_reputations` does not exist, pair skipped!", horde);
10193 else
10194 FactionChangeReputation[alliance] = horde;
10195
10196 ++count;
10197 } while (result->NextRow());
10198
10199 LOG_INFO("server.loading", ">> Loaded {} faction change reputation pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10200 LOG_INFO("server.loading", " ");
10201}
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 ( )
10204{
10205 uint32 oldMSTime = getMSTime();
10206
10207 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_spells");
10208
10209 if (!result)
10210 {
10211 LOG_WARN("server.loading", ">> Loaded 0 faction change spell pairs. DB table `player_factionchange_spells` is empty.");
10212 LOG_INFO("server.loading", " ");
10213 return;
10214 }
10215
10216 uint32 count = 0;
10217
10218 do
10219 {
10220 Field* fields = result->Fetch();
10221
10222 uint32 alliance = fields[0].Get<uint32>();
10223 uint32 horde = fields[1].Get<uint32>();
10224
10225 if (!sSpellMgr->GetSpellInfo(alliance))
10226 LOG_ERROR("sql.sql", "Spell {} (alliance_id) referenced in `player_factionchange_spells` does not exist, pair skipped!", alliance);
10227 else if (!sSpellMgr->GetSpellInfo(horde))
10228 LOG_ERROR("sql.sql", "Spell {} (horde_id) referenced in `player_factionchange_spells` does not exist, pair skipped!", horde);
10229 else
10230 FactionChangeSpells[alliance] = horde;
10231
10232 ++count;
10233 } while (result->NextRow());
10234
10235 LOG_INFO("server.loading", ">> Loaded {} faction change spell pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10236 LOG_INFO("server.loading", " ");
10237}
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 ( )
10240{
10241 uint32 oldMSTime = getMSTime();
10242
10243 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_titles");
10244
10245 if (!result)
10246 {
10247 LOG_WARN("server.loading", ">> Loaded 0 faction change title pairs. DB table `player_factionchange_title` is empty.");
10248 return;
10249 }
10250
10251 uint32 count = 0;
10252
10253 do
10254 {
10255 Field* fields = result->Fetch();
10256
10257 uint32 alliance = fields[0].Get<uint32>();
10258 uint32 horde = fields[1].Get<uint32>();
10259
10260 if (!sCharTitlesStore.LookupEntry(alliance))
10261 LOG_ERROR("sql.sql", "Title {} (alliance_id) referenced in `player_factionchange_title` does not exist, pair skipped!", alliance);
10262 else if (!sCharTitlesStore.LookupEntry(horde))
10263 LOG_ERROR("sql.sql", "Title {} (horde_id) referenced in `player_factionchange_title` does not exist, pair skipped!", horde);
10264 else
10265 FactionChangeTitles[alliance] = horde;
10266
10267 ++count;
10268 } while (result->NextRow());
10269
10270 LOG_INFO("server.loading", ">> Loaded {} faction change title pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10271 LOG_INFO("server.loading", " ");
10272}
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 ( )
8963{
8964 uint32 oldMSTime = getMSTime();
8965
8966 _fishingBaseForAreaStore.clear(); // for reload case
8967
8968 QueryResult result = WorldDatabase.Query("SELECT entry, skill FROM skill_fishing_base_level");
8969
8970 if (!result)
8971 {
8972 LOG_WARN("server.loading", ">> Loaded 0 areas for fishing base skill level. DB table `skill_fishing_base_level` is empty.");
8973 LOG_INFO("server.loading", " ");
8974 return;
8975 }
8976
8977 uint32 count = 0;
8978
8979 do
8980 {
8981 Field* fields = result->Fetch();
8982 uint32 entry = fields[0].Get<uint32>();
8983 int32 skill = fields[1].Get<int16>();
8984
8985 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
8986 if (!fArea)
8987 {
8988 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
8989 continue;
8990 }
8991
8992 _fishingBaseForAreaStore[entry] = skill;
8993 ++count;
8994 } while (result->NextRow());
8995
8996 LOG_INFO("server.loading", ">> Loaded {} areas for fishing base skill level in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8997 LOG_INFO("server.loading", " ");
8998}

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

◆ LoadGameObjectAddons()

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

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

◆ LoadGameObjectForQuests()

void ObjectMgr::LoadGameObjectForQuests ( )
8749{
8750 uint32 oldMSTime = getMSTime();
8751
8752 if (GetGameObjectTemplates()->empty())
8753 {
8754 LOG_WARN("server.loading", ">> Loaded 0 GameObjects for quests");
8755 LOG_INFO("server.loading", " ");
8756 return;
8757 }
8758
8759 uint32 count = 0;
8760
8761 // collect GO entries for GO that must activated
8763 for (GameObjectTemplateContainer::iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
8764 {
8765 itr->second.IsForQuests = false;
8766 switch (itr->second.type)
8767 {
8769 itr->second.IsForQuests = true;
8770 ++count;
8771 break;
8773 {
8774 // scan GO chest with loot including quest items
8775 uint32 loot_id = (itr->second.GetLootId());
8776
8777 // find quest loot for GO
8778 if (itr->second.chest.questId || LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
8779 {
8780 itr->second.IsForQuests = true;
8781 ++count;
8782 }
8783 break;
8784 }
8786 {
8787 if (itr->second._generic.questID > 0) //quests objects
8788 {
8789 itr->second.IsForQuests = true;
8790 ++count;
8791 }
8792 break;
8793 }
8795 {
8796 if (itr->second.spellFocus.questID > 0) //quests objects
8797 {
8798 itr->second.IsForQuests = true;
8799 ++count;
8800 }
8801 break;
8802 }
8804 {
8805 if (itr->second.goober.questId > 0) //quests objects
8806 {
8807 itr->second.IsForQuests = true;
8808 ++count;
8809 }
8810 break;
8811 }
8812 default:
8813 break;
8814 }
8815 }
8816
8817 LOG_INFO("server.loading", ">> Loaded {} GameObjects for quests in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8818 LOG_INFO("server.loading", " ");
8819}
LootStore LootTemplates_Gameobject("gameobject_loot_template", "gameobject entry", true)
@ GAMEOBJECT_TYPE_SPELL_FOCUS
Definition SharedDefines.h:1568
@ GAMEOBJECT_TYPE_GENERIC
Definition SharedDefines.h:1565
@ GAMEOBJECT_TYPE_CHEST
Definition SharedDefines.h:1563
@ GAMEOBJECT_TYPE_QUESTGIVER
Definition SharedDefines.h:1562
@ GAMEOBJECT_TYPE_GOOBER
Definition SharedDefines.h:1570
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 ( )
7285{
7286 uint32 oldMSTime = getMSTime();
7287
7288 _gameObjectLocaleStore.clear(); // need for reload case
7289
7290 // 0 1 2 3
7291 QueryResult result = WorldDatabase.Query("SELECT entry, locale, name, castBarCaption FROM gameobject_template_locale");
7292 if (!result)
7293 return;
7294
7295 do
7296 {
7297 Field* fields = result->Fetch();
7298
7299 uint32 ID = fields[0].Get<uint32>();
7300
7301 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
7302 if (locale == LOCALE_enUS)
7303 continue;
7304
7306 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
7307 AddLocaleString(fields[3].Get<std::string>(), locale, data.CastBarCaption);
7308 } while (result->NextRow());
7309
7310 LOG_INFO("server.loading", ">> Loaded {} Gameobject Locale Strings in {} ms", (uint32)_gameObjectLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
7311}
Definition GameObjectData.h:674
std::vector< std::string > Name
Definition GameObjectData.h:675
std::vector< std::string > CastBarCaption
Definition GameObjectData.h:676

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

◆ LoadGameobjectQuestEnders()

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

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameObjectQuestItems()

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

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

◆ LoadGameobjectQuestStarters()

void ObjectMgr::LoadGameobjectQuestStarters ( )
8307{
8308 LoadQuestRelationsHelper(_goQuestRelations, "gameobject_queststarter", true, true);
8309
8310 for (QuestRelations::iterator itr = _goQuestRelations.begin(); itr != _goQuestRelations.end(); ++itr)
8311 {
8312 GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
8313 if (!goInfo)
8314 LOG_ERROR("sql.sql", "Table `gameobject_queststarter` have data for not existed gameobject entry ({}) and existed quest {}", itr->first, itr->second);
8315 else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
8316 LOG_ERROR("sql.sql", "Table `gameobject_queststarter` have data gameobject entry ({}) for quest {}, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
8317 }
8318}

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameobjects()

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

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 ( )
7373{
7374 uint32 oldMSTime = getMSTime();
7375
7376 // 0 1 2 3 4 5 6 7
7377 QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, size, "
7378 // 8 9 10 11 12 13 14 15 16 17 18 19 20
7379 "Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, "
7380 // 21 22 23 24 25 26 27 28 29 30 31 32 33
7381 "Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, AIName, ScriptName "
7382 "FROM gameobject_template");
7383
7384 if (!result)
7385 {
7386 LOG_WARN("server.loading", ">> Loaded 0 gameobject definitions. DB table `gameobject_template` is empty.");
7387 LOG_INFO("server.loading", " ");
7388 return;
7389 }
7390
7391 _gameObjectTemplateStore.rehash(result->GetRowCount());
7392 uint32 count = 0;
7393 do
7394 {
7395 Field* fields = result->Fetch();
7396
7397 uint32 entry = fields[0].Get<uint32>();
7398
7400
7401 got.entry = entry;
7402 got.type = uint32(fields[1].Get<uint8>());
7403 got.displayId = fields[2].Get<uint32>();
7404 got.name = fields[3].Get<std::string>();
7405 got.IconName = fields[4].Get<std::string>();
7406 got.castBarCaption = fields[5].Get<std::string>();
7407 got.unk1 = fields[6].Get<std::string>();
7408 got.size = fields[7].Get<float>();
7409
7410 for (uint8 i = 0; i < MAX_GAMEOBJECT_DATA; ++i)
7411 got.raw.data[i] = fields[8 + i].Get<int32>(); // data1 and data6 can be -1
7412
7413 got.AIName = fields[32].Get<std::string>();
7414 got.ScriptId = GetScriptId(fields[33].Get<std::string>());
7415 got.IsForQuests = false;
7416
7417 // Checks
7418 if (!got.AIName.empty() && !sGameObjectAIRegistry->HasItem(got.AIName))
7419 {
7420 LOG_ERROR("sql.sql", "GameObject (Entry: {}) has non-registered `AIName` '{}' set, removing", got.entry, got.AIName);
7421 }
7422
7423 switch (got.type)
7424 {
7425 case GAMEOBJECT_TYPE_DOOR: //0
7426 {
7427 if (got.door.lockId)
7428 CheckGOLockId(&got, got.door.lockId, 1);
7429 CheckGONoDamageImmuneId(&got, got.door.noDamageImmune, 3);
7430 break;
7431 }
7432 case GAMEOBJECT_TYPE_BUTTON: //1
7433 {
7434 if (got.button.lockId)
7435 CheckGOLockId(&got, got.button.lockId, 1);
7436 CheckGONoDamageImmuneId(&got, got.button.noDamageImmune, 4);
7437 break;
7438 }
7440 {
7441 if (got.questgiver.lockId)
7442 CheckGOLockId(&got, got.questgiver.lockId, 0);
7443 CheckGONoDamageImmuneId(&got, got.questgiver.noDamageImmune, 5);
7444 break;
7445 }
7446 case GAMEOBJECT_TYPE_CHEST: //3
7447 {
7448 if (got.chest.lockId)
7449 CheckGOLockId(&got, got.chest.lockId, 0);
7450
7451 CheckGOConsumable(&got, got.chest.consumable, 3);
7452
7453 if (got.chest.linkedTrapId) // linked trap
7454 CheckGOLinkedTrapId(&got, got.chest.linkedTrapId, 7);
7455 break;
7456 }
7457 case GAMEOBJECT_TYPE_TRAP: //6
7458 {
7459 if (got.trap.lockId)
7460 CheckGOLockId(&got, got.trap.lockId, 0);
7461 break;
7462 }
7463 case GAMEOBJECT_TYPE_CHAIR: //7
7464 CheckAndFixGOChairHeightId(&got, got.chair.height, 1);
7465 break;
7467 {
7468 if (got.spellFocus.focusId)
7469 {
7470 if (!sSpellFocusObjectStore.LookupEntry(got.spellFocus.focusId))
7471 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data0={} but SpellFocus (Id: {}) not exist.",
7472 entry, got.type, got.spellFocus.focusId, got.spellFocus.focusId);
7473 }
7474
7475 if (got.spellFocus.linkedTrapId) // linked trap
7476 CheckGOLinkedTrapId(&got, got.spellFocus.linkedTrapId, 2);
7477 break;
7478 }
7479 case GAMEOBJECT_TYPE_GOOBER: //10
7480 {
7481 if (got.goober.lockId)
7482 CheckGOLockId(&got, got.goober.lockId, 0);
7483
7484 CheckGOConsumable(&got, got.goober.consumable, 3);
7485
7486 if (got.goober.pageId) // pageId
7487 {
7488 if (!GetPageText(got.goober.pageId))
7489 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data7={} but PageText (Entry {}) not exist.",
7490 entry, got.type, got.goober.pageId, got.goober.pageId);
7491 }
7492 CheckGONoDamageImmuneId(&got, got.goober.noDamageImmune, 11);
7493 if (got.goober.linkedTrapId) // linked trap
7494 CheckGOLinkedTrapId(&got, got.goober.linkedTrapId, 12);
7495 break;
7496 }
7498 {
7499 if (got.areadamage.lockId)
7500 CheckGOLockId(&got, got.areadamage.lockId, 0);
7501 break;
7502 }
7503 case GAMEOBJECT_TYPE_CAMERA: //13
7504 {
7505 if (got.camera.lockId)
7506 CheckGOLockId(&got, got.camera.lockId, 0);
7507 break;
7508 }
7510 {
7511 if (got.moTransport.taxiPathId)
7512 {
7513 if (got.moTransport.taxiPathId >= sTaxiPathNodesByPath.size() || sTaxiPathNodesByPath[got.moTransport.taxiPathId].empty())
7514 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data0={} but TaxiPath (Id: {}) not exist.",
7515 entry, got.type, got.moTransport.taxiPathId, got.moTransport.taxiPathId);
7516 }
7517 if (uint32 transportMap = got.moTransport.mapID)
7518 _transportMaps.insert(transportMap);
7519 break;
7520 }
7522 break;
7524 {
7525 // always must have spell
7526 CheckGOSpellId(&got, got.spellcaster.spellId, 0);
7527 break;
7528 }
7529 case GAMEOBJECT_TYPE_FLAGSTAND: //24
7530 {
7531 if (got.flagstand.lockId)
7532 CheckGOLockId(&got, got.flagstand.lockId, 0);
7533 CheckGONoDamageImmuneId(&got, got.flagstand.noDamageImmune, 5);
7534 break;
7535 }
7537 {
7538 if (got.fishinghole.lockId)
7539 CheckGOLockId(&got, got.fishinghole.lockId, 4);
7540 break;
7541 }
7542 case GAMEOBJECT_TYPE_FLAGDROP: //26
7543 {
7544 if (got.flagdrop.lockId)
7545 CheckGOLockId(&got, got.flagdrop.lockId, 0);
7546 CheckGONoDamageImmuneId(&got, got.flagdrop.noDamageImmune, 3);
7547 break;
7548 }
7550 CheckAndFixGOChairHeightId(&got, got.barberChair.chairheight, 0);
7551 break;
7552 }
7553
7554 ++count;
7555 } while (result->NextRow());
7556
7557 LOG_INFO("server.loading", ">> Loaded {} Game Object Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7558 LOG_INFO("server.loading", " ");
7559}
DBCStorage< SpellFocusObjectEntry > sSpellFocusObjectStore(SpellFocusObjectfmt)
#define sGameObjectAIRegistry
Definition GameObjectAIFactory.h:49
void CheckGONoDamageImmuneId(GameObjectTemplate *goTemplate, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7353
void CheckGOSpellId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7332
void CheckAndFixGOChairHeightId(GameObjectTemplate const *goInfo, uint32 const &dataN, uint32 N)
Definition ObjectMgr.cpp:7341
void CheckGOConsumable(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7362
void CheckGOLinkedTrapId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7322
void CheckGOLockId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7313
@ GAMEOBJECT_TYPE_CAMERA
Definition SharedDefines.h:1573
@ GAMEOBJECT_TYPE_BUTTON
Definition SharedDefines.h:1561
@ GAMEOBJECT_TYPE_MO_TRANSPORT
Definition SharedDefines.h:1575
@ GAMEOBJECT_TYPE_SUMMONING_RITUAL
Definition SharedDefines.h:1578
@ GAMEOBJECT_TYPE_FISHINGHOLE
Definition SharedDefines.h:1585
@ GAMEOBJECT_TYPE_FLAGDROP
Definition SharedDefines.h:1586
@ GAMEOBJECT_TYPE_SPELLCASTER
Definition SharedDefines.h:1582
@ GAMEOBJECT_TYPE_FLAGSTAND
Definition SharedDefines.h:1584
@ GAMEOBJECT_TYPE_CHAIR
Definition SharedDefines.h:1567
@ GAMEOBJECT_TYPE_AREADAMAGE
Definition SharedDefines.h:1572
@ GAMEOBJECT_TYPE_BARBER_CHAIR
Definition SharedDefines.h:1592
@ GAMEOBJECT_TYPE_DOOR
Definition SharedDefines.h:1560
#define MAX_GAMEOBJECT_DATA
Definition SharedDefines.h:1599
PageText const * GetPageText(uint32 pageEntry)
Definition ObjectMgr.cpp:6001
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 ( )
7562{
7563 uint32 oldMSTime = getMSTime();
7564
7565 // 0 1 2 3 4 5 6 7 8
7566 QueryResult result = WorldDatabase.Query("SELECT entry, faction, flags, mingold, maxgold, artkit0, artkit1, artkit2, artkit3 FROM gameobject_template_addon");
7567
7568 if (!result)
7569 {
7570 LOG_WARN("server.loading", ">> Loaded 0 gameobject template addon definitions. DB table `gameobject_template_addon` is empty.");
7571 LOG_INFO("server.loading", " ");
7572 return;
7573 }
7574
7575 uint32 count = 0;
7576 do
7577 {
7578 Field* fields = result->Fetch();
7579
7580 uint32 entry = fields[0].Get<uint32>();
7581
7582 GameObjectTemplate const* got = GetGameObjectTemplate(entry);
7583 if (!got)
7584 {
7585 LOG_ERROR("sql.sql",
7586 "GameObject template (Entry: {}) does not exist but has a record in `gameobject_template_addon`",
7587 entry);
7588 continue;
7589 }
7590
7592 gameObjectAddon.faction = uint32(fields[1].Get<uint16>());
7593 gameObjectAddon.flags = fields[2].Get<uint32>();
7594 gameObjectAddon.mingold = fields[3].Get<uint32>();
7595 gameObjectAddon.maxgold = fields[4].Get<uint32>();
7596
7597 for (uint32 i = 0; i < gameObjectAddon.artKits.size(); i++)
7598 {
7599 uint32 artKitID = fields[5 + i].Get<uint32>();
7600 if (!artKitID)
7601 continue;
7602
7603 if (!sGameObjectArtKitStore.LookupEntry(artKitID))
7604 {
7605 LOG_ERROR("sql.sql", "GameObject (Entry: {}) has invalid `artkit{}` {} defined, set to zero instead.", entry, i, artKitID);
7606 continue;
7607 }
7608
7609 gameObjectAddon.artKits[i] = artKitID;
7610 }
7611
7612 // checks
7613 if (gameObjectAddon.faction && !sFactionTemplateStore.LookupEntry(gameObjectAddon.faction))
7614 LOG_ERROR("sql.sql",
7615 "GameObject (Entry: {}) has invalid faction ({}) defined in `gameobject_template_addon`.",
7616 entry, gameObjectAddon.faction);
7617
7618 if (gameObjectAddon.maxgold > 0)
7619 {
7620 switch (got->type)
7621 {
7624 break;
7625 default:
7626 LOG_ERROR("sql.sql",
7627 "GameObject (Entry {} GoType: {}) cannot be looted but has maxgold set in `gameobject_template_addon`.",
7628 entry, got->type);
7629 break;
7630 }
7631 }
7632
7633 ++count;
7634 } while (result->NextRow());
7635
7636 LOG_INFO("server.loading", ">> Loaded {} Game Object Template Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7637 LOG_INFO("server.loading", " ");
7638}
DBCStorage< GameObjectArtKitEntry > sGameObjectArtKitStore(GameObjectArtKitfmt)
Definition GameObjectData.h:664
uint32 mingold
Definition GameObjectData.h:668
uint32 flags
Definition GameObjectData.h:667
uint32 faction
Definition GameObjectData.h:666
std::array< uint32, 4 > artKits
Definition GameObjectData.h:670
uint32 maxgold
Definition GameObjectData.h:669

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

◆ LoadGameTele()

void ObjectMgr::LoadGameTele ( )
9103{
9104 uint32 oldMSTime = getMSTime();
9105
9106 _gameTeleStore.clear(); // for reload case
9107
9108 // 0 1 2 3 4 5 6
9109 QueryResult result = WorldDatabase.Query("SELECT id, position_x, position_y, position_z, orientation, map, name FROM game_tele");
9110
9111 if (!result)
9112 {
9113 LOG_WARN("server.loading", ">> Loaded 0 GameTeleports. DB table `game_tele` is empty!");
9114 LOG_INFO("server.loading", " ");
9115 return;
9116 }
9117
9118 uint32 count = 0;
9119
9120 do
9121 {
9122 Field* fields = result->Fetch();
9123
9124 uint32 id = fields[0].Get<uint32>();
9125
9126 GameTele gt;
9127
9128 gt.position_x = fields[1].Get<float>();
9129 gt.position_y = fields[2].Get<float>();
9130 gt.position_z = fields[3].Get<float>();
9131 gt.orientation = fields[4].Get<float>();
9132 gt.mapId = fields[5].Get<uint16>();
9133 gt.name = fields[6].Get<std::string>();
9134
9135 if (!MapMgr::IsValidMapCoord(gt.mapId, gt.position_x, gt.position_y, gt.position_z, gt.orientation))
9136 {
9137 LOG_ERROR("sql.sql", "Wrong position for id {} (name: {}) in `game_tele` table, ignoring.", id, gt.name);
9138 continue;
9139 }
9140
9141 if (!Utf8toWStr(gt.name, gt.wnameLow))
9142 {
9143 LOG_ERROR("sql.sql", "Wrong UTF8 name for id {} in `game_tele` table, ignoring.", id);
9144 continue;
9145 }
9146
9147 wstrToLower(gt.wnameLow);
9148
9149 _gameTeleStore[id] = gt;
9150
9151 ++count;
9152 } while (result->NextRow());
9153
9154 LOG_INFO("server.loading", ">> Loaded {} GameTeleports in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9155 LOG_INFO("server.loading", " ");
9156}
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 ( )
9519{
9520 uint32 oldMSTime = getMSTime();
9521
9522 _gossipMenusStore.clear();
9523
9524 QueryResult result = WorldDatabase.Query("SELECT MenuID, TextID FROM gossip_menu");
9525
9526 if (!result)
9527 {
9528 LOG_WARN("server.loading", ">> Loaded 0 gossip_menu entries. DB table `gossip_menu` is empty!");
9529 LOG_INFO("server.loading", " ");
9530 return;
9531 }
9532
9533 do
9534 {
9535 Field* fields = result->Fetch();
9536
9537 GossipMenus gMenu;
9538
9539 gMenu.MenuID = fields[0].Get<uint32>();
9540 gMenu.TextID = fields[1].Get<uint32>();
9541
9542 if (!GetGossipText(gMenu.TextID))
9543 {
9544 LOG_ERROR("sql.sql", "Table gossip_menu entry {} are using non-existing TextID {}", gMenu.MenuID, gMenu.TextID);
9545 continue;
9546 }
9547
9548 _gossipMenusStore.insert(GossipMenusContainer::value_type(gMenu.MenuID, gMenu));
9549 } while (result->NextRow());
9550
9551 LOG_INFO("server.loading", ">> Loaded {} gossip_menu entries in {} ms", (uint32)_gossipMenusStore.size(), GetMSTimeDiffToNow(oldMSTime));
9552 LOG_INFO("server.loading", " ");
9553}
GossipText const * GetGossipText(uint32 Text_ID) const
Definition ObjectMgr.cpp:6179
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 ( )
9556{
9557 uint32 oldMSTime = getMSTime();
9558
9559 _gossipMenuItemsStore.clear();
9560
9561 QueryResult result = WorldDatabase.Query(
9562 // 0 1 2 3 4 5 6 7 8 9 10 11 12
9563 "SELECT MenuID, OptionID, OptionIcon, OptionText, OptionBroadcastTextID, OptionType, OptionNpcFlag, ActionMenuID, ActionPoiID, BoxCoded, BoxMoney, BoxText, BoxBroadcastTextID "
9564 "FROM gossip_menu_option ORDER BY MenuID, OptionID");
9565
9566 if (!result)
9567 {
9568 LOG_WARN("server.loading", ">> Loaded 0 gossip_menu_option IDs. DB table `gossip_menu_option` is empty!");
9569 LOG_INFO("server.loading", " ");
9570 return;
9571 }
9572
9573 do
9574 {
9575 Field* fields = result->Fetch();
9576
9577 GossipMenuItems gMenuItem;
9578
9579 gMenuItem.MenuID = fields[0].Get<uint32>();
9580 gMenuItem.OptionID = fields[1].Get<uint16>();
9581 gMenuItem.OptionIcon = fields[2].Get<uint32>();
9582 gMenuItem.OptionText = fields[3].Get<std::string>();
9583 gMenuItem.OptionBroadcastTextID = fields[4].Get<uint32>();
9584 gMenuItem.OptionType = fields[5].Get<uint8>();
9585 gMenuItem.OptionNpcFlag = fields[6].Get<uint32>();
9586 gMenuItem.ActionMenuID = fields[7].Get<uint32>();
9587 gMenuItem.ActionPoiID = fields[8].Get<uint32>();
9588 gMenuItem.BoxCoded = fields[9].Get<bool>();
9589 gMenuItem.BoxMoney = fields[10].Get<uint32>();
9590 gMenuItem.BoxText = fields[11].Get<std::string>();
9591 gMenuItem.BoxBroadcastTextID = fields[12].Get<uint32>();
9592
9593 if (gMenuItem.OptionIcon >= GOSSIP_ICON_MAX)
9594 {
9595 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);
9596 gMenuItem.OptionIcon = GOSSIP_ICON_CHAT;
9597 }
9598
9600 {
9601 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has non-existing or incompatible OptionBroadcastTextID {}, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.OptionBroadcastTextID);
9602 gMenuItem.OptionBroadcastTextID = 0;
9603 }
9604
9605 if (gMenuItem.OptionType >= GOSSIP_OPTION_MAX)
9606 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);
9607
9608 if (gMenuItem.ActionPoiID && !GetPointOfInterest(gMenuItem.ActionPoiID))
9609 {
9610 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} use non-existing ActionPoiID {}, ignoring", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.ActionPoiID);
9611 gMenuItem.ActionPoiID = 0;
9612 }
9613
9614 if (gMenuItem.BoxBroadcastTextID && !GetBroadcastText(gMenuItem.BoxBroadcastTextID))
9615 {
9616 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has non-existing or incompatible BoxBroadcastTextID {}, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.BoxBroadcastTextID);
9617 gMenuItem.BoxBroadcastTextID = 0;
9618 }
9619
9620 _gossipMenuItemsStore.insert(GossipMenuItemsContainer::value_type(gMenuItem.MenuID, gMenuItem));
9621 } while (result->NextRow());
9622
9623 LOG_INFO("server.loading", ">> Loaded {} gossip_menu_option entries in {} ms", uint32(_gossipMenuItemsStore.size()), GetMSTimeDiffToNow(oldMSTime));
9624 LOG_INFO("server.loading", " ");
9625}
@ 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 ( )
6188{
6189 uint32 oldMSTime = getMSTime();
6190
6191 QueryResult result = WorldDatabase.Query("SELECT ID, "
6192 "text0_0, text0_1, BroadcastTextID0, lang0, Probability0, em0_0, em0_1, em0_2, em0_3, em0_4, em0_5, "
6193 "text1_0, text1_1, BroadcastTextID1, lang1, Probability1, em1_0, em1_1, em1_2, em1_3, em1_4, em1_5, "
6194 "text2_0, text2_1, BroadcastTextID2, lang2, Probability2, em2_0, em2_1, em2_2, em2_3, em2_4, em2_5, "
6195 "text3_0, text3_1, BroadcastTextID3, lang3, Probability3, em3_0, em3_1, em3_2, em3_3, em3_4, em3_5, "
6196 "text4_0, text4_1, BroadcastTextID4, lang4, Probability4, em4_0, em4_1, em4_2, em4_3, em4_4, em4_5, "
6197 "text5_0, text5_1, BroadcastTextID5, lang5, Probability5, em5_0, em5_1, em5_2, em5_3, em5_4, em5_5, "
6198 "text6_0, text6_1, BroadcastTextID6, lang6, Probability6, em6_0, em6_1, em6_2, em6_3, em6_4, em6_5, "
6199 "text7_0, text7_1, BroadcastTextID7, lang7, Probability7, em7_0, em7_1, em7_2, em7_3, em7_4, em7_5 "
6200 "FROM npc_text");
6201
6202 if (!result)
6203 {
6204 LOG_WARN("server.loading", ">> Loaded 0 npc texts, table is empty!");
6205 LOG_INFO("server.loading", " ");
6206 return;
6207 }
6208
6209 _gossipTextStore.rehash(result->GetRowCount());
6210
6211 uint32 count = 0;
6212 uint8 cic;
6213
6214 do
6215 {
6216 cic = 0;
6217
6218 Field* fields = result->Fetch();
6219
6220 uint32 id = fields[cic++].Get<uint32>();
6221 if (!id)
6222 {
6223 LOG_ERROR("sql.sql", "Table `npc_text` has record wit reserved id 0, ignore.");
6224 continue;
6225 }
6226
6227 GossipText& gText = _gossipTextStore[id];
6228
6229 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6230 {
6231 gText.Options[i].Text_0 = fields[cic++].Get<std::string>();
6232 gText.Options[i].Text_1 = fields[cic++].Get<std::string>();
6233 gText.Options[i].BroadcastTextID = fields[cic++].Get<uint32>();
6234 gText.Options[i].Language = fields[cic++].Get<uint8>();
6235 gText.Options[i].Probability = fields[cic++].Get<float>();
6236
6237 for (uint8 j = 0; j < MAX_GOSSIP_TEXT_EMOTES; ++j)
6238 {
6239 gText.Options[i].Emotes[j]._Delay = fields[cic++].Get<uint16>();
6240 gText.Options[i].Emotes[j]._Emote = fields[cic++].Get<uint16>();
6241 }
6242 }
6243
6244 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; i++)
6245 {
6246 if (gText.Options[i].BroadcastTextID)
6247 {
6249 {
6250 LOG_ERROR("sql.sql", "GossipText (Id: {}) in table `npc_text` has non-existing or incompatible BroadcastTextID{} {}.", id, i, gText.Options[i].BroadcastTextID);
6251 gText.Options[i].BroadcastTextID = 0;
6252 }
6253 }
6254 }
6255
6256 count++;
6257 } while (result->NextRow());
6258
6259 LOG_INFO("server.loading", ">> Loaded {} Npc Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6260 LOG_INFO("server.loading", " ");
6261}
#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 ( )
6095{
6096 uint32 oldMSTime = getMSTime();
6097
6098 // 0 1 2 3
6099 QueryResult result = WorldDatabase.Query("SELECT entry, creditType, creditEntry, lastEncounterDungeon FROM instance_encounters");
6100 if (!result)
6101 {
6102 LOG_WARN("server.loading", ">> Loaded 0 instance encounters, table is empty!");
6103 LOG_INFO("server.loading", " ");
6104 return;
6105 }
6106
6107 uint32 count = 0;
6108 std::map<uint32, DungeonEncounterEntry const*> dungeonLastBosses;
6109 do
6110 {
6111 Field* fields = result->Fetch();
6112 uint32 entry = fields[0].Get<uint32>();
6113 uint8 creditType = fields[1].Get<uint8>();
6114 uint32 creditEntry = fields[2].Get<uint32>();
6115 uint32 lastEncounterDungeon = fields[3].Get<uint16>();
6116 DungeonEncounterEntry const* dungeonEncounter = sDungeonEncounterStore.LookupEntry(entry);
6117 if (!dungeonEncounter)
6118 {
6119 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid encounter id {}, skipped!", entry);
6120 continue;
6121 }
6122
6123 if (lastEncounterDungeon && !sLFGMgr->GetLFGDungeonEntry(lastEncounterDungeon))
6124 {
6125 LOG_ERROR("sql.sql", "Table `instance_encounters` has an encounter {} ({}) marked as final for invalid dungeon id {}, skipped!", entry, dungeonEncounter->encounterName[0], lastEncounterDungeon);
6126 continue;
6127 }
6128
6129 std::map<uint32, DungeonEncounterEntry const*>::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon);
6130 if (lastEncounterDungeon)
6131 {
6132 if (itr != dungeonLastBosses.end())
6133 {
6134 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]);
6135 continue;
6136 }
6137
6138 dungeonLastBosses[lastEncounterDungeon] = dungeonEncounter;
6139 }
6140
6141 switch (creditType)
6142 {
6144 {
6145 CreatureTemplate const* creatureInfo = GetCreatureTemplate(creditEntry);
6146 if (!creatureInfo)
6147 {
6148 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid creature (entry {}) linked to the encounter {} ({}), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
6149 continue;
6150 }
6151 const_cast<CreatureTemplate*>(creatureInfo)->flags_extra |= CREATURE_FLAG_EXTRA_DUNGEON_BOSS;
6152 break;
6153 }
6155 {
6156 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(creditEntry);
6157 if (!spellInfo)
6158 {
6159 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid spell (entry {}) linked to the encounter {} ({}), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
6160 continue;
6161 }
6162 const_cast<SpellInfo*>(spellInfo)->AttributesCu |= SPELL_ATTR0_CU_ENCOUNTER_REWARD;
6163 break;
6164 }
6165 default:
6166 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid credit type ({}) for encounter {} ({}), skipped!", creditType, entry, dungeonEncounter->encounterName[0]);
6167 continue;
6168 }
6169
6170 DungeonEncounterList& encounters = _dungeonEncounterStore[MAKE_PAIR32(dungeonEncounter->mapId, dungeonEncounter->difficulty)];
6171 encounters.push_back(new DungeonEncounter(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon));
6172 ++count;
6173 } while (result->NextRow());
6174
6175 LOG_INFO("server.loading", ">> Loaded {} Instance Encounters in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6176 LOG_INFO("server.loading", " ");
6177}
@ CREATURE_FLAG_EXTRA_DUNGEON_BOSS
Definition CreatureData.h:73
DBCStorage< DungeonEncounterEntry > sDungeonEncounterStore(DungeonEncounterfmt)
#define sLFGMgr
Definition LFGMgr.h:641
EncounterCreditType
Definition Map.h:152
@ ENCOUNTER_CREDIT_KILL_CREATURE
Definition Map.h:153
@ ENCOUNTER_CREDIT_CAST_SPELL
Definition Map.h:154
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 ( )
6044{
6045 uint32 oldMSTime = getMSTime();
6046
6047 // 0 1 2 4
6048 QueryResult result = WorldDatabase.Query("SELECT map, parent, script, allowMount FROM instance_template");
6049
6050 if (!result)
6051 {
6052 LOG_WARN("server.loading", ">> Loaded 0 instance templates. DB table `instance_template` is empty!");
6053 LOG_INFO("server.loading", " ");
6054 return;
6055 }
6056
6057 uint32 count = 0;
6058 do
6059 {
6060 Field* fields = result->Fetch();
6061
6062 uint16 mapID = fields[0].Get<uint16>();
6063
6064 if (!MapMgr::IsValidMAP(mapID, true))
6065 {
6066 LOG_ERROR("sql.sql", "ObjectMgr::LoadInstanceTemplate: bad mapid {} for template!", mapID);
6067 continue;
6068 }
6069
6070 InstanceTemplate instanceTemplate;
6071
6072 instanceTemplate.AllowMount = fields[3].Get<bool>();
6073 instanceTemplate.Parent = uint32(fields[1].Get<uint16>());
6074 instanceTemplate.ScriptId = GetScriptId(fields[2].Get<std::string>());
6075
6076 _instanceTemplateStore[mapID] = instanceTemplate;
6077
6078 ++count;
6079 } while (result->NextRow());
6080
6081 LOG_INFO("server.loading", ">> Loaded {} Instance Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6082 LOG_INFO("server.loading", " ");
6083}
static bool IsValidMAP(uint32 mapid, bool startUp)
Definition MapMgr.cpp:311
bool AllowMount
Definition Map.h:122
uint32 ScriptId
Definition Map.h:121

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 ( )
2808{
2809 uint32 oldMSTime = getMSTime();
2810
2811 _itemLocaleStore.clear(); // need for reload case
2812
2813 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name, Description FROM item_template_locale");
2814 if (!result)
2815 return;
2816
2817 do
2818 {
2819 Field* fields = result->Fetch();
2820
2821 uint32 ID = fields[0].Get<uint32>();
2822
2823 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
2824 if (locale == LOCALE_enUS)
2825 continue;
2826
2827 ItemLocale& data = _itemLocaleStore[ID];
2828 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
2829 AddLocaleString(fields[3].Get<std::string>(), locale, data.Description);
2830 } while (result->NextRow());
2831
2832 LOG_INFO("server.loading", ">> Loaded {} Item Locale Strings in {} ms", (uint32)_itemLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
2833}
Definition ItemTemplate.h:837
std::vector< std::string > Description
Definition ItemTemplate.h:839
std::vector< std::string > Name
Definition ItemTemplate.h:838

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

◆ LoadItemSetNameLocales()

void ObjectMgr::LoadItemSetNameLocales ( )
3482{
3483 uint32 oldMSTime = getMSTime();
3484
3485 _itemSetNameLocaleStore.clear(); // need for reload case
3486
3487 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name FROM item_set_names_locale");
3488
3489 if (!result)
3490 return;
3491
3492 do
3493 {
3494 Field* fields = result->Fetch();
3495
3496 uint32 ID = fields[0].Get<uint32>();
3497
3498 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
3499 if (locale == LOCALE_enUS)
3500 continue;
3501
3503 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
3504 } while (result->NextRow());
3505
3506 LOG_INFO("server.loading", ">> Loaded {} Item Set Name Locale Strings in {} ms", uint32(_itemSetNameLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
3507}
Definition ItemTemplate.h:849
std::vector< std::string > Name
Definition ItemTemplate.h:850

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

◆ LoadItemSetNames()

void ObjectMgr::LoadItemSetNames ( )
3510{
3511 uint32 oldMSTime = getMSTime();
3512
3513 _itemSetNameStore.clear(); // needed for reload case
3514
3515 std::set<uint32> itemSetItems;
3516
3517 // fill item set member ids
3518 for (uint32 entryId = 0; entryId < sItemSetStore.GetNumRows(); ++entryId)
3519 {
3520 ItemSetEntry const* setEntry = sItemSetStore.LookupEntry(entryId);
3521 if (!setEntry)
3522 continue;
3523
3524 for (uint32 i = 0; i < MAX_ITEM_SET_ITEMS; ++i)
3525 if (setEntry->itemId[i])
3526 itemSetItems.insert(setEntry->itemId[i]);
3527 }
3528
3529 // 0 1 2
3530 QueryResult result = WorldDatabase.Query("SELECT `entry`, `name`, `InventoryType` FROM `item_set_names`");
3531
3532 if (!result)
3533 {
3534 LOG_WARN("server.loading", ">> Loaded 0 item set names. DB table `item_set_names` is empty.");
3535 LOG_INFO("server.loading", " ");
3536 return;
3537 }
3538
3539 _itemSetNameStore.rehash(result->GetRowCount());
3540 uint32 count = 0;
3541
3542 do
3543 {
3544 Field* fields = result->Fetch();
3545
3546 uint32 entry = fields[0].Get<uint32>();
3547 if (itemSetItems.find(entry) == itemSetItems.end())
3548 {
3549 LOG_ERROR("sql.sql", "Item set name (Entry: {}) not found in ItemSet.dbc, data useless.", entry);
3550 continue;
3551 }
3552
3553 ItemSetNameEntry& data = _itemSetNameStore[entry];
3554 data.name = fields[1].Get<std::string>();
3555
3556 uint32 invType = fields[2].Get<uint8>();
3557 if (invType >= MAX_INVTYPE)
3558 {
3559 LOG_ERROR("sql.sql", "Item set name (Entry: {}) has wrong InventoryType value ({})", entry, invType);
3560 invType = INVTYPE_NON_EQUIP;
3561 }
3562
3563 data.InventoryType = invType;
3564 itemSetItems.erase(entry);
3565 ++count;
3566 } while (result->NextRow());
3567
3568 if (!itemSetItems.empty())
3569 {
3570 ItemTemplate const* pProto;
3571 for (std::set<uint32>::iterator itr = itemSetItems.begin(); itr != itemSetItems.end(); ++itr)
3572 {
3573 uint32 entry = *itr;
3574 // add data from item_template if available
3575 pProto = GetItemTemplate(entry);
3576 if (pProto)
3577 {
3578 LOG_ERROR("sql.sql", "Item set part (Entry: {}) does not have entry in `item_set_names`, adding data from `item_template`.", entry);
3579 ItemSetNameEntry& data = _itemSetNameStore[entry];
3580 data.name = pProto->Name1;
3581 data.InventoryType = pProto->InventoryType;
3582 ++count;
3583 }
3584 else
3585 LOG_ERROR("sql.sql", "Item set part (Entry: {}) does not have entry in `item_set_names`, set will not display properly.", entry);
3586 }
3587 }
3588
3589 LOG_INFO("server.loading", ">> Loaded {} Item Set Names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3590 LOG_INFO("server.loading", " ");
3591}
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:843
uint32 InventoryType
Definition ItemTemplate.h:845
std::string name
Definition ItemTemplate.h:844
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 ( )
2860{
2861 uint32 oldMSTime = getMSTime();
2862
2863 // 0 1 2 3 4 5 6 7 8 9 10 11 12
2864 QueryResult result = WorldDatabase.Query("SELECT entry, class, subclass, SoundOverrideSubclass, name, displayid, Quality, Flags, FlagsExtra, BuyCount, BuyPrice, SellPrice, InventoryType, "
2865 // 13 14 15 16 17 18 19 20
2866 "AllowableClass, AllowableRace, ItemLevel, RequiredLevel, RequiredSkill, RequiredSkillRank, requiredspell, requiredhonorrank, "
2867 // 21 22 23 24 25 26 27
2868 "RequiredCityRank, RequiredReputationFaction, RequiredReputationRank, maxcount, stackable, ContainerSlots, stat_type1, "
2869 // 28 29 30 31 32 33 34 35 36 37
2870 "stat_value1, stat_type2, stat_value2, stat_type3, stat_value3, stat_type4, stat_value4, stat_type5, stat_value5, stat_type6, "
2871 // 38 39 40 41 42 43 44 45 46
2872 "stat_value6, stat_type7, stat_value7, stat_type8, stat_value8, stat_type9, stat_value9, stat_type10, stat_value10, "
2873 // 47 48 49 50 51 52 53 54 55 56 57
2874 "ScalingStatDistribution, ScalingStatValue, dmg_min1, dmg_max1, dmg_type1, dmg_min2, dmg_max2, dmg_type2, armor, holy_res, fire_res, "
2875 // 58 59 60 61 62 63 64 65 66 67
2876 "nature_res, frost_res, shadow_res, arcane_res, delay, ammo_type, RangedModRange, spellid_1, spelltrigger_1, spellcharges_1, "
2877 // 68 69 70 71 72 73 74
2878 "spellppmRate_1, spellcooldown_1, spellcategory_1, spellcategorycooldown_1, spellid_2, spelltrigger_2, spellcharges_2, "
2879 // 75 76 77 78 79 80 81
2880 "spellppmRate_2, spellcooldown_2, spellcategory_2, spellcategorycooldown_2, spellid_3, spelltrigger_3, spellcharges_3, "
2881 // 82 83 84 85 86 87 88
2882 "spellppmRate_3, spellcooldown_3, spellcategory_3, spellcategorycooldown_3, spellid_4, spelltrigger_4, spellcharges_4, "
2883 // 89 90 91 92 93 94 95
2884 "spellppmRate_4, spellcooldown_4, spellcategory_4, spellcategorycooldown_4, spellid_5, spelltrigger_5, spellcharges_5, "
2885 // 96 97 98 99 100 101 102 103 104
2886 "spellppmRate_5, spellcooldown_5, spellcategory_5, spellcategorycooldown_5, bonding, description, PageText, LanguageID, PageMaterial, "
2887 // 105 106 107 108 109 110 111 112 113 114 115 116
2888 "startquest, lockid, Material, sheath, RandomProperty, RandomSuffix, block, itemset, MaxDurability, area, Map, BagFamily, "
2889 // 117 118 119 120 121 122 123 124
2890 "TotemCategory, socketColor_1, socketContent_1, socketColor_2, socketContent_2, socketColor_3, socketContent_3, socketBonus, "
2891 // 125 126 127 128 129 130 131 132
2892 "GemProperties, RequiredDisenchantSkill, ArmorDamageModifier, duration, ItemLimitCategory, HolidayId, ScriptName, DisenchantID, "
2893 // 133 134 135 136
2894 "FoodType, minMoneyLoot, maxMoneyLoot, flagsCustom FROM item_template");
2895
2896 if (!result)
2897 {
2898 LOG_WARN("server.loading", ">> Loaded 0 item templates. DB table `item_template` is empty.");
2899 LOG_INFO("server.loading", " ");
2900 return;
2901 }
2902
2903 _itemTemplateStore.reserve(result->GetRowCount());
2904 uint32 count = 0;
2905 // original inspiration https://github.com/TrinityCore/TrinityCore/commit/0c44bd33ee7b42c924859139a9f4b04cf2b91261
2906 bool enforceDBCAttributes = sWorld->getBoolConfig(CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES);
2907
2908 do
2909 {
2910 Field* fields = result->Fetch();
2911
2912 uint32 entry = fields[0].Get<uint32>();
2913
2914 ItemTemplate& itemTemplate = _itemTemplateStore[entry];
2915
2916 itemTemplate.ItemId = entry;
2917 itemTemplate.Class = uint32(fields[1].Get<uint8>());
2918 itemTemplate.SubClass = uint32(fields[2].Get<uint8>());
2919 itemTemplate.SoundOverrideSubclass = int32(fields[3].Get<int8>());
2920 itemTemplate.Name1 = fields[4].Get<std::string>();
2921 itemTemplate.DisplayInfoID = fields[5].Get<uint32>();
2922 itemTemplate.Quality = uint32(fields[6].Get<uint8>());
2923 itemTemplate.Flags = ItemFlags(fields[7].Get<uint32>());
2924 itemTemplate.Flags2 = ItemFlags2(fields[8].Get<uint32>());
2925 itemTemplate.BuyCount = uint32(fields[9].Get<uint8>());
2926 itemTemplate.BuyPrice = int32(fields[10].Get<int64>());
2927 itemTemplate.SellPrice = uint32(fields[11].Get<uint32>());
2928 itemTemplate.InventoryType = uint32(fields[12].Get<uint8>());
2929 itemTemplate.AllowableClass = fields[13].Get<int32>();
2930 itemTemplate.AllowableRace = fields[14].Get<int32>();
2931 itemTemplate.ItemLevel = uint32(fields[15].Get<uint16>());
2932 itemTemplate.RequiredLevel = uint32(fields[16].Get<uint8>());
2933 itemTemplate.RequiredSkill = uint32(fields[17].Get<uint16>());
2934 itemTemplate.RequiredSkillRank = uint32(fields[18].Get<uint16>());
2935 itemTemplate.RequiredSpell = fields[19].Get<uint32>();
2936 itemTemplate.RequiredHonorRank = fields[20].Get<uint32>();
2937 itemTemplate.RequiredCityRank = fields[21].Get<uint32>();
2938 itemTemplate.RequiredReputationFaction = uint32(fields[22].Get<uint16>());
2939 itemTemplate.RequiredReputationRank = uint32(fields[23].Get<uint16>());
2940 itemTemplate.MaxCount = fields[24].Get<int32>();
2941 itemTemplate.Stackable = fields[25].Get<int32>();
2942 itemTemplate.ContainerSlots = uint32(fields[26].Get<uint8>());
2943
2944 uint8 statsCount = 0;
2945 while (statsCount < MAX_ITEM_PROTO_STATS)
2946 {
2947 uint32 statType = uint32(fields[27 + statsCount * 2].Get<uint8>());
2948 int32 statValue = fields[28 + statsCount * 2].Get<int32>();
2949 if (statType == 0)
2950 break;
2951
2952 itemTemplate.ItemStat[statsCount].ItemStatType = statType;
2953 itemTemplate.ItemStat[statsCount].ItemStatValue = statValue;
2954 statsCount++;
2955 }
2956 itemTemplate.StatsCount = statsCount;
2957
2958 itemTemplate.ScalingStatDistribution = uint32(fields[47].Get<uint16>());
2959 itemTemplate.ScalingStatValue = fields[48].Get<int32>();
2960
2961 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2962 {
2963 itemTemplate.Damage[i].DamageMin = fields[49 + i * 3].Get<float>();
2964 itemTemplate.Damage[i].DamageMax = fields[50 + i * 3].Get<float>();
2965 itemTemplate.Damage[i].DamageType = uint32(fields[51 + i * 3].Get<uint8>());
2966 }
2967
2968 itemTemplate.Armor = fields[55].Get<uint32>();
2969 itemTemplate.HolyRes = fields[56].Get<int32>();
2970 itemTemplate.FireRes = fields[57].Get<int32>();
2971 itemTemplate.NatureRes = fields[58].Get<int32>();
2972 itemTemplate.FrostRes = fields[59].Get<int32>();
2973 itemTemplate.ShadowRes = fields[60].Get<int32>();
2974 itemTemplate.ArcaneRes = fields[61].Get<int32>();
2975 itemTemplate.Delay = uint32(fields[62].Get<uint16>());
2976 itemTemplate.AmmoType = uint32(fields[63].Get<uint8>());
2977 itemTemplate.RangedModRange = fields[64].Get<float>();
2978
2979 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
2980 {
2981 itemTemplate.Spells[i].SpellId = fields[65 + i * 7 ].Get<int32>();
2982 itemTemplate.Spells[i].SpellTrigger = uint32(fields[66 + i * 7].Get<uint8>());
2983 itemTemplate.Spells[i].SpellCharges = int32(fields[67 + i * 7].Get<int16>());
2984 itemTemplate.Spells[i].SpellPPMRate = fields[68 + i * 7].Get<float>();
2985 itemTemplate.Spells[i].SpellCooldown = fields[69 + i * 7].Get<int32>();
2986 itemTemplate.Spells[i].SpellCategory = uint32(fields[70 + i * 7].Get<uint16>());
2987 itemTemplate.Spells[i].SpellCategoryCooldown = fields[71 + i * 7].Get<int32>();
2988 }
2989
2990 itemTemplate.Bonding = uint32(fields[100].Get<uint8>());
2991 itemTemplate.Description = fields[101].Get<std::string>();
2992 itemTemplate.PageText = fields[102].Get<uint32>();
2993 itemTemplate.LanguageID = uint32(fields[103].Get<uint8>());
2994 itemTemplate.PageMaterial = uint32(fields[104].Get<uint8>());
2995 itemTemplate.StartQuest = fields[105].Get<uint32>();
2996 itemTemplate.LockID = fields[106].Get<uint32>();
2997 itemTemplate.Material = int32(fields[107].Get<int8>());
2998 itemTemplate.Sheath = uint32(fields[108].Get<uint8>());
2999 itemTemplate.RandomProperty = fields[109].Get<int32>();
3000 itemTemplate.RandomSuffix = fields[110].Get<int32>();
3001 itemTemplate.Block = fields[111].Get<uint32>();
3002 itemTemplate.ItemSet = fields[112].Get<uint32>();
3003 itemTemplate.MaxDurability = uint32(fields[113].Get<uint16>());
3004 itemTemplate.Area = fields[114].Get<uint32>();
3005 itemTemplate.Map = uint32(fields[115].Get<uint16>());
3006 itemTemplate.BagFamily = fields[116].Get<uint32>();
3007 itemTemplate.TotemCategory = fields[117].Get<uint32>();
3008
3009 for (uint8 i = 0; i < MAX_ITEM_PROTO_SOCKETS; ++i)
3010 {
3011 itemTemplate.Socket[i].Color = uint32(fields[118 + i * 2].Get<uint8>());
3012 itemTemplate.Socket[i].Content = fields[119 + i * 2].Get<uint32>();
3013 }
3014
3015 itemTemplate.socketBonus = fields[124].Get<uint32>();
3016 itemTemplate.GemProperties = fields[125].Get<uint32>();
3017 itemTemplate.RequiredDisenchantSkill = uint32(fields[126].Get<int16>());
3018 itemTemplate.ArmorDamageModifier = fields[127].Get<float>();
3019 itemTemplate.Duration = fields[128].Get<uint32>();
3020 itemTemplate.ItemLimitCategory = uint32(fields[129].Get<int16>());
3021 itemTemplate.HolidayId = fields[130].Get<uint32>();
3022 itemTemplate.ScriptId = GetScriptId(fields[131].Get<std::string>());
3023 itemTemplate.DisenchantID = fields[132].Get<uint32>();
3024 itemTemplate.FoodType = uint32(fields[133].Get<uint8>());
3025 itemTemplate.MinMoneyLoot = fields[134].Get<uint32>();
3026 itemTemplate.MaxMoneyLoot = fields[135].Get<uint32>();
3027 itemTemplate.FlagsCu = ItemFlagsCustom(fields[136].Get<uint32>());
3028
3029 // Checks
3030 ItemEntry const* dbcitem = sItemStore.LookupEntry(entry);
3031
3032 if (!dbcitem)
3033 {
3034 LOG_DEBUG("sql.sql", "Item (Entry: {}) does not exist in item.dbc! (not correct id?).", entry);
3035 continue;
3036 }
3037
3038 if (enforceDBCAttributes)
3039 {
3040 if (itemTemplate.Class != dbcitem->ClassID)
3041 {
3042 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Class value ({}), must be ({}).", entry, itemTemplate.Class, dbcitem->ClassID);
3043 itemTemplate.Class = dbcitem->ClassID;
3044 }
3045 if (itemTemplate.SubClass != dbcitem->SubclassID)
3046 {
3047 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Subclass value ({}) for class {}, must be ({}).", entry, itemTemplate.SubClass, itemTemplate.Class, dbcitem->SubclassID);
3048 itemTemplate.SubClass = dbcitem->SubclassID;
3049 }
3050 if (itemTemplate.SoundOverrideSubclass != dbcitem->SoundOverrideSubclassID)
3051 {
3052 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct SoundOverrideSubclass ({}), must be {}.", entry, itemTemplate.SoundOverrideSubclass, dbcitem->SoundOverrideSubclassID);
3053 itemTemplate.SoundOverrideSubclass = dbcitem->SoundOverrideSubclassID;
3054 }
3055 if (itemTemplate.Material != dbcitem->Material)
3056 {
3057 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct material ({}), must be {}.", entry, itemTemplate.Material, dbcitem->Material);
3058 itemTemplate.Material = dbcitem->Material;
3059 }
3060 if (itemTemplate.InventoryType != dbcitem->InventoryType)
3061 {
3062 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong InventoryType value ({}), must be {}.", entry, itemTemplate.InventoryType, dbcitem->InventoryType);
3063 itemTemplate.InventoryType = dbcitem->InventoryType;
3064 }
3065 if (itemTemplate.DisplayInfoID != dbcitem->DisplayInfoID)
3066 {
3067 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct display id ({}), must be {}.", entry, itemTemplate.DisplayInfoID, dbcitem->DisplayInfoID);
3068 itemTemplate.DisplayInfoID = dbcitem->DisplayInfoID;
3069 }
3070 if (itemTemplate.Sheath != dbcitem->SheatheType)
3071 {
3072 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Sheath ({}), must be {}.", entry, itemTemplate.Sheath, dbcitem->SheatheType);
3073 itemTemplate.Sheath = dbcitem->SheatheType;
3074 }
3075 }
3076
3077 if (itemTemplate.Quality >= MAX_ITEM_QUALITY)
3078 {
3079 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Quality value ({})", entry, itemTemplate.Quality);
3080 itemTemplate.Quality = ITEM_QUALITY_NORMAL;
3081 }
3082
3083 if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_HORDE))
3084 {
3085 if (FactionEntry const* faction = sFactionStore.LookupEntry(HORDE))
3086 if ((itemTemplate.AllowableRace & faction->BaseRepRaceMask[0]) == 0)
3087 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.",
3088 entry, itemTemplate.AllowableRace, ITEM_FLAG2_FACTION_HORDE);
3089
3090 if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE))
3091 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.",
3093 }
3094 else if (itemTemplate.HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE))
3095 {
3096 if (FactionEntry const* faction = sFactionStore.LookupEntry(ALLIANCE))
3097 if ((itemTemplate.AllowableRace & faction->BaseRepRaceMask[0]) == 0)
3098 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.",
3099 entry, itemTemplate.AllowableRace, ITEM_FLAG2_FACTION_ALLIANCE);
3100 }
3101
3102 if (itemTemplate.BuyCount <= 0)
3103 {
3104 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong BuyCount value ({}), set to default(1).", entry, itemTemplate.BuyCount);
3105 itemTemplate.BuyCount = 1;
3106 }
3107
3108 if (itemTemplate.RequiredSkill >= MAX_SKILL_TYPE)
3109 {
3110 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong RequiredSkill value ({})", entry, itemTemplate.RequiredSkill);
3111 itemTemplate.RequiredSkill = 0;
3112 }
3113
3114 {
3115 // can be used in equip slot, as page read use in inventory, or spell casting at use
3116 bool req = itemTemplate.InventoryType != INVTYPE_NON_EQUIP || itemTemplate.PageText;
3117 if (!req)
3118 for (uint8 j = 0; j < MAX_ITEM_PROTO_SPELLS; ++j)
3119 {
3120 if (itemTemplate.Spells[j].SpellId)
3121 {
3122 req = true;
3123 break;
3124 }
3125 }
3126
3127 if (req)
3128 {
3129 if (!(itemTemplate.AllowableClass & CLASSMASK_ALL_PLAYABLE))
3130 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have any playable classes ({}) in `AllowableClass` and can't be equipped or used.", entry, itemTemplate.AllowableClass);
3131
3132 if (!(itemTemplate.AllowableRace & RACEMASK_ALL_PLAYABLE))
3133 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have any playable races ({}) in `AllowableRace` and can't be equipped or used.", entry, itemTemplate.AllowableRace);
3134 }
3135 }
3136
3137 if (itemTemplate.RequiredSpell && !sSpellMgr->GetSpellInfo(itemTemplate.RequiredSpell))
3138 {
3139 LOG_ERROR("sql.sql", "Item (Entry: {}) has a wrong (non-existing) spell in RequiredSpell ({})", entry, itemTemplate.RequiredSpell);
3140 itemTemplate.RequiredSpell = 0;
3141 }
3142
3143 if (itemTemplate.RequiredReputationRank >= MAX_REPUTATION_RANK)
3144 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong reputation rank in RequiredReputationRank ({}), item can't be used.", entry, itemTemplate.RequiredReputationRank);
3145
3146 if (itemTemplate.RequiredReputationFaction)
3147 {
3148 if (!sFactionStore.LookupEntry(itemTemplate.RequiredReputationFaction))
3149 {
3150 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (not existing) faction in RequiredReputationFaction ({})", entry, itemTemplate.RequiredReputationFaction);
3151 itemTemplate.RequiredReputationFaction = 0;
3152 }
3153
3154 if (itemTemplate.RequiredReputationRank == MIN_REPUTATION_RANK)
3155 LOG_ERROR("sql.sql", "Item (Entry: {}) has min. reputation rank in RequiredReputationRank (0) but RequiredReputationFaction > 0, faction setting is useless.", entry);
3156 }
3157
3158 if (itemTemplate.MaxCount < -1)
3159 {
3160 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large negative in maxcount ({}), replace by value (-1) no storing limits.", entry, itemTemplate.MaxCount);
3161 itemTemplate.MaxCount = -1;
3162 }
3163
3164 if (itemTemplate.Stackable == 0)
3165 {
3166 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong value in stackable ({}), replace by default 1.", entry, itemTemplate.Stackable);
3167 itemTemplate.Stackable = 1;
3168 }
3169 else if (itemTemplate.Stackable < -1)
3170 {
3171 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large negative in stackable ({}), replace by value (-1) no stacking limits.", entry, itemTemplate.Stackable);
3172 itemTemplate.Stackable = -1;
3173 }
3174
3175 if (itemTemplate.ContainerSlots > MAX_BAG_SIZE)
3176 {
3177 LOG_ERROR("sql.sql", "Item (Entry: {}) has too large value in ContainerSlots ({}), replace by hardcoded limit ({}).", entry, itemTemplate.ContainerSlots, MAX_BAG_SIZE);
3178 itemTemplate.ContainerSlots = MAX_BAG_SIZE;
3179 }
3180
3181 for (uint8 j = 0; j < itemTemplate.StatsCount; ++j)
3182 {
3183 // for ItemStatValue != 0
3184 if (itemTemplate.ItemStat[j].ItemStatValue && itemTemplate.ItemStat[j].ItemStatType >= MAX_ITEM_MOD)
3185 {
3186 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (non-existing?) stat_type{} ({})", entry, j + 1, itemTemplate.ItemStat[j].ItemStatType);
3187 itemTemplate.ItemStat[j].ItemStatType = 0;
3188 }
3189
3190 switch (itemTemplate.ItemStat[j].ItemStatType)
3191 {
3194 LOG_WARN("sql.sql", "Item (Entry: {}) has deprecated stat_type{} ({})", entry, j + 1, itemTemplate.ItemStat[j].ItemStatType);
3195 break;
3196 default:
3197 break;
3198 }
3199 }
3200
3201 for (uint8 j = 0; j < MAX_ITEM_PROTO_DAMAGES; ++j)
3202 {
3203 if (itemTemplate.Damage[j].DamageType >= MAX_SPELL_SCHOOL)
3204 {
3205 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong dmg_type{} ({})", entry, j + 1, itemTemplate.Damage[j].DamageType);
3206 itemTemplate.Damage[j].DamageType = 0;
3207 }
3208 }
3209
3210 // special format
3211 if ((itemTemplate.Spells[0].SpellId == 483) || (itemTemplate.Spells[0].SpellId == 55884))
3212 {
3213 // spell_1
3214 if (itemTemplate.Spells[0].SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
3215 {
3216 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);
3217 itemTemplate.Spells[0].SpellId = 0;
3218 itemTemplate.Spells[0].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3219 itemTemplate.Spells[1].SpellId = 0;
3220 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3221 }
3222
3223 // spell_2 have learning spell
3224 if (itemTemplate.Spells[1].SpellTrigger != ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
3225 {
3226 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);
3227 itemTemplate.Spells[0].SpellId = 0;
3228 itemTemplate.Spells[1].SpellId = 0;
3229 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3230 }
3231 else if (!itemTemplate.Spells[1].SpellId)
3232 {
3233 LOG_ERROR("sql.sql", "Item (Entry: {}) does not have an expected spell in spellid_{} in special learning format.", entry, 1 + 1);
3234 itemTemplate.Spells[0].SpellId = 0;
3235 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3236 }
3237 else if (itemTemplate.Spells[1].SpellId != -1)
3238 {
3239 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemTemplate.Spells[1].SpellId);
3240 if (!spellInfo && !sDisableMgr->IsDisabledFor(DISABLE_TYPE_SPELL, itemTemplate.Spells[1].SpellId, nullptr))
3241 {
3242 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (not existing) spell in spellid_{} ({})", entry, 1 + 1, itemTemplate.Spells[1].SpellId);
3243 itemTemplate.Spells[0].SpellId = 0;
3244 itemTemplate.Spells[1].SpellId = 0;
3245 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3246 }
3247 // allowed only in special format
3248 else if ((itemTemplate.Spells[1].SpellId == 483) || (itemTemplate.Spells[1].SpellId == 55884))
3249 {
3250 LOG_ERROR("sql.sql", "Item (Entry: {}) has broken spell in spellid_{} ({})", entry, 1 + 1, itemTemplate.Spells[1].SpellId);
3251 itemTemplate.Spells[0].SpellId = 0;
3252 itemTemplate.Spells[1].SpellId = 0;
3253 itemTemplate.Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3254 }
3255 }
3256
3257 // spell_3*, spell_4*, spell_5* is empty
3258 for (uint8 j = 2; j < MAX_ITEM_PROTO_SPELLS; ++j)
3259 {
3260 if (itemTemplate.Spells[j].SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
3261 {
3262 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong item spell trigger value in spelltrigger_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellTrigger);
3263 itemTemplate.Spells[j].SpellId = 0;
3264 itemTemplate.Spells[j].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3265 }
3266 else if (itemTemplate.Spells[j].SpellId != 0)
3267 {
3268 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong spell in spellid_{} ({}) for learning special format", entry, j + 1, itemTemplate.Spells[j].SpellId);
3269 itemTemplate.Spells[j].SpellId = 0;
3270 }
3271 }
3272 }
3273 // normal spell list
3274 else
3275 {
3276 for (uint8 j = 0; j < MAX_ITEM_PROTO_SPELLS; ++j)
3277 {
3278 if (itemTemplate.Spells[j].SpellTrigger >= MAX_ITEM_SPELLTRIGGER || itemTemplate.Spells[j].SpellTrigger == ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
3279 {
3280 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong item spell trigger value in spelltrigger_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellTrigger);
3281 itemTemplate.Spells[j].SpellId = 0;
3282 itemTemplate.Spells[j].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
3283 }
3284
3285 if (itemTemplate.Spells[j].SpellId && itemTemplate.Spells[j].SpellId != -1)
3286 {
3287 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemTemplate.Spells[j].SpellId);
3288 if (!spellInfo && !sDisableMgr->IsDisabledFor(DISABLE_TYPE_SPELL, itemTemplate.Spells[j].SpellId, nullptr))
3289 {
3290 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong (not existing) spell in spellid_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellId);
3291 itemTemplate.Spells[j].SpellId = 0;
3292 }
3293 // allowed only in special format
3294 else if ((itemTemplate.Spells[j].SpellId == 483) || (itemTemplate.Spells[j].SpellId == 55884))
3295 {
3296 LOG_ERROR("sql.sql", "Item (Entry: {}) has broken spell in spellid_{} ({})", entry, j + 1, itemTemplate.Spells[j].SpellId);
3297 itemTemplate.Spells[j].SpellId = 0;
3298 }
3299 }
3300 }
3301 }
3302
3303 if (itemTemplate.Bonding >= MAX_BIND_TYPE)
3304 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Bonding value ({})", entry, itemTemplate.Bonding);
3305
3306 if (itemTemplate.PageText && !GetPageText(itemTemplate.PageText))
3307 LOG_ERROR("sql.sql", "Item (Entry: {}) has non existing first page (Id:{})", entry, itemTemplate.PageText);
3308
3309 if (itemTemplate.LockID && !sLockStore.LookupEntry(itemTemplate.LockID))
3310 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong LockID ({})", entry, itemTemplate.LockID);
3311
3312 if (itemTemplate.RandomProperty)
3313 {
3314 // To be implemented later
3315 if (itemTemplate.RandomProperty == -1)
3316 itemTemplate.RandomProperty = 0;
3317
3318 else if (!sItemRandomPropertiesStore.LookupEntry(GetItemEnchantMod(itemTemplate.RandomProperty)))
3319 {
3320 LOG_ERROR("sql.sql", "Item (Entry: {}) has unknown (wrong or not listed in `item_enchantment_template`) RandomProperty ({})", entry, itemTemplate.RandomProperty);
3321 itemTemplate.RandomProperty = 0;
3322 }
3323 }
3324
3325 if (itemTemplate.RandomSuffix && !sItemRandomSuffixStore.LookupEntry(GetItemEnchantMod(itemTemplate.RandomSuffix)))
3326 {
3327 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong RandomSuffix ({})", entry, itemTemplate.RandomSuffix);
3328 itemTemplate.RandomSuffix = 0;
3329 }
3330
3331 if (itemTemplate.ItemSet && !sItemSetStore.LookupEntry(itemTemplate.ItemSet))
3332 {
3333 LOG_ERROR("sql.sql", "Item (Entry: {}) have wrong ItemSet ({})", entry, itemTemplate.ItemSet);
3334 itemTemplate.ItemSet = 0;
3335 }
3336
3337 if (itemTemplate.Area && !sAreaTableStore.LookupEntry(itemTemplate.Area))
3338 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Area ({})", entry, itemTemplate.Area);
3339
3340 if (itemTemplate.Map && !sMapStore.LookupEntry(itemTemplate.Map))
3341 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong Map ({})", entry, itemTemplate.Map);
3342
3343 if (itemTemplate.BagFamily)
3344 {
3345 // check bits
3346 for (uint32 j = 0; j < sizeof(itemTemplate.BagFamily) * 8; ++j)
3347 {
3348 uint32 mask = 1 << j;
3349 if ((itemTemplate.BagFamily & mask) == 0)
3350 continue;
3351
3352 ItemBagFamilyEntry const* bf = sItemBagFamilyStore.LookupEntry(j + 1);
3353 if (!bf)
3354 {
3355 LOG_ERROR("sql.sql", "Item (Entry: {}) has bag family bit set not listed in ItemBagFamily.dbc, remove bit", entry);
3356 itemTemplate.BagFamily &= ~mask;
3357 continue;
3358 }
3359
3361 {
3362 CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(itemTemplate.ItemId);
3363 if (!ctEntry)
3364 {
3365 LOG_ERROR("sql.sql", "Item (Entry: {}) has currency bag family bit set in BagFamily but not listed in CurrencyTypes.dbc, remove bit", entry);
3366 itemTemplate.BagFamily &= ~mask;
3367 }
3368 }
3369 }
3370 }
3371
3372 if (itemTemplate.TotemCategory && !sTotemCategoryStore.LookupEntry(itemTemplate.TotemCategory))
3373 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong TotemCategory ({})", entry, itemTemplate.TotemCategory);
3374
3375 for (uint8 j = 0; j < MAX_ITEM_PROTO_SOCKETS; ++j)
3376 {
3377 if (itemTemplate.Socket[j].Color && (itemTemplate.Socket[j].Color & SOCKET_COLOR_ALL) != itemTemplate.Socket[j].Color)
3378 {
3379 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong socketColor_{} ({})", entry, j + 1, itemTemplate.Socket[j].Color);
3380 itemTemplate.Socket[j].Color = 0;
3381 }
3382 }
3383
3384 if (itemTemplate.GemProperties && !sGemPropertiesStore.LookupEntry(itemTemplate.GemProperties))
3385 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong GemProperties ({})", entry, itemTemplate.GemProperties);
3386
3387 if (itemTemplate.FoodType >= MAX_PET_DIET)
3388 {
3389 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong FoodType value ({})", entry, itemTemplate.FoodType);
3390 itemTemplate.FoodType = 0;
3391 }
3392
3393 if (itemTemplate.ItemLimitCategory && !sItemLimitCategoryStore.LookupEntry(itemTemplate.ItemLimitCategory))
3394 {
3395 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong LimitCategory value ({})", entry, itemTemplate.ItemLimitCategory);
3396 itemTemplate.ItemLimitCategory = 0;
3397 }
3398
3399 if (itemTemplate.HolidayId && !sHolidaysStore.LookupEntry(itemTemplate.HolidayId))
3400 {
3401 LOG_ERROR("sql.sql", "Item (Entry: {}) has wrong HolidayId value ({})", entry, itemTemplate.HolidayId);
3402 itemTemplate.HolidayId = 0;
3403 }
3404
3405 if (itemTemplate.HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME) && !itemTemplate.Duration)
3406 {
3407 LOG_ERROR("sql.sql", "Item (Entry {}) has flag ITEM_FLAGS_CU_DURATION_REAL_TIME but it does not have duration limit", entry);
3408 itemTemplate.FlagsCu = static_cast<ItemFlagsCustom>(static_cast<uint32>(itemTemplate.FlagsCu) & ~ITEM_FLAGS_CU_DURATION_REAL_TIME);
3409 }
3410
3411 // Set after checks to ensure valid item quality
3412 itemTemplate.BuyPrice *= sWorld->getRate(qualityToBuyValueConfig[itemTemplate.Quality]);
3413 itemTemplate.SellPrice *= sWorld->getRate(qualityToSellValueConfig[itemTemplate.Quality]);
3414
3415 // Fill categories map
3416 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
3417 if (itemTemplate.Spells[i].SpellId && itemTemplate.Spells[i].SpellCategory && itemTemplate.Spells[i].SpellCategoryCooldown)
3418 {
3419 SpellCategoryStore::iterator ct = sSpellsByCategoryStore.find(itemTemplate.Spells[i].SpellCategory);
3420 if (ct != sSpellsByCategoryStore.end())
3421 {
3422 ct->second.emplace(true, itemTemplate.Spells[i].SpellId);
3423 }
3424 else
3425 sSpellsByCategoryStore[itemTemplate.Spells[i].SpellCategory].emplace(true, itemTemplate.Spells[i].SpellId);
3426 }
3427
3428 ++count;
3429 } while (result->NextRow());
3430
3431 // pussywizard:
3432 {
3433 uint32 max = 0;
3434 for (ItemTemplateContainer::const_iterator itr = _itemTemplateStore.begin(); itr != _itemTemplateStore.end(); ++itr)
3435 if (itr->first > max)
3436 max = itr->first;
3437 if (max)
3438 {
3439 _itemTemplateStoreFast.clear();
3440 _itemTemplateStoreFast.resize(max + 1, nullptr);
3441 for (ItemTemplateContainer::iterator itr = _itemTemplateStore.begin(); itr != _itemTemplateStore.end(); ++itr)
3442 _itemTemplateStoreFast[itr->first] = &(itr->second);
3443 }
3444 }
3445
3446 for (ItemTemplateContainer::iterator itr = _itemTemplateStore.begin(); itr != _itemTemplateStore.end(); ++itr)
3447 itr->second.InitializeQueryData();
3448
3449 // Check if item templates for DBC referenced character start outfit are present
3450 std::set<uint32> notFoundOutfit;
3451 for (uint32 i = 1; i < sCharStartOutfitStore.GetNumRows(); ++i)
3452 {
3453 CharStartOutfitEntry const* entry = sCharStartOutfitStore.LookupEntry(i);
3454 if (!entry)
3455 continue;
3456
3457 for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j)
3458 {
3459 if (entry->ItemId[j] <= 0)
3460 continue;
3461
3462 uint32 item_id = entry->ItemId[j];
3463
3464 if (!GetItemTemplate(item_id))
3465 notFoundOutfit.insert(item_id);
3466 }
3467 }
3468
3469 for (std::set<uint32>::const_iterator itr = notFoundOutfit.begin(); itr != notFoundOutfit.end(); ++itr)
3470 LOG_ERROR("sql.sql", "Item (Entry: {}) does not exist in `item_template` but is referenced in `CharStartOutfit.dbc`", *itr);
3471
3472 LOG_INFO("server.loading", ">> Loaded {} Item Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3473 LOG_INFO("server.loading", " ");
3474}
#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:2847
ServerConfigs const qualityToBuyValueConfig[MAX_ITEM_QUALITY]
Definition ObjectMgr.cpp:2835
#define MAX_REPUTATION_RANK
Definition SharedDefines.h:245
#define MIN_REPUTATION_RANK
Definition SharedDefines.h:244
#define MAX_PET_DIET
Definition SharedDefines.h:3470
@ ITEM_QUALITY_NORMAL
Definition SharedDefines.h:330
#define MAX_ITEM_QUALITY
Definition SharedDefines.h:339
#define MAX_SKILL_TYPE
Definition SharedDefines.h:3257
@ ALLIANCE
Definition SharedDefines.h:768
@ HORDE
Definition SharedDefines.h:767
#define CLASSMASK_ALL_PLAYABLE
Definition SharedDefines.h:157
#define RACEMASK_ALL_PLAYABLE
Definition SharedDefines.h:97
@ CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES
Definition WorldConfig.h:96
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 ( )
1922{
1923 uint32 oldMSTime = getMSTime();
1924
1925 _linkedRespawnStore.clear();
1926 // 0 1 2
1927 QueryResult result = WorldDatabase.Query("SELECT guid, linkedGuid, linkType FROM linked_respawn ORDER BY guid ASC");
1928
1929 if (!result)
1930 {
1931 LOG_WARN("server.loading", ">> Loaded 0 linked respawns. DB table `linked_respawn` is empty.");
1932 LOG_INFO("server.loading", " ");
1933 return;
1934 }
1935
1936 do
1937 {
1938 Field* fields = result->Fetch();
1939
1940 ObjectGuid::LowType guidLow = fields[0].Get<uint32>();
1941 ObjectGuid::LowType linkedGuidLow = fields[1].Get<uint32>();
1942 uint8 linkType = fields[2].Get<uint8>();
1943
1944 ObjectGuid guid, linkedGuid;
1945 bool error = false;
1946 switch (linkType)
1947 {
1949 {
1950 const CreatureData* slave = GetCreatureData(guidLow);
1951 if (!slave)
1952 {
1953 LOG_ERROR("sql.sql", "LinkedRespawn: Creature (guid) {} not found in creature table", guidLow);
1954 error = true;
1955 break;
1956 }
1957
1958 const CreatureData* master = GetCreatureData(linkedGuidLow);
1959 if (!master)
1960 {
1961 LOG_ERROR("sql.sql", "LinkedRespawn: Creature (linkedGuid) {} not found in creature table", linkedGuidLow);
1962 error = true;
1963 break;
1964 }
1965
1966 MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
1967 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
1968 {
1969 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to Creature '{}' on an unpermitted map.", guidLow, linkedGuidLow);
1970 error = true;
1971 break;
1972 }
1973
1974 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
1975 {
1976 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to Creature '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
1977 error = true;
1978 break;
1979 }
1980
1981 guid = ObjectGuid::Create<HighGuid::Unit>(slave->id1, guidLow);
1982 linkedGuid = ObjectGuid::Create<HighGuid::Unit>(master->id1, linkedGuidLow);
1983 break;
1984 }
1985 case CREATURE_TO_GO:
1986 {
1987 const CreatureData* slave = GetCreatureData(guidLow);
1988 if (!slave)
1989 {
1990 LOG_ERROR("sql.sql", "LinkedRespawn: Creature (guid) {} not found in creature table", guidLow);
1991 error = true;
1992 break;
1993 }
1994
1995 const GameObjectData* master = GetGameObjectData(linkedGuidLow);
1996 if (!master)
1997 {
1998 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (linkedGuid) {} not found in gameobject table", linkedGuidLow);
1999 error = true;
2000 break;
2001 }
2002
2003 MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
2004 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
2005 {
2006 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to Gameobject '{}' on an unpermitted map.", guidLow, linkedGuidLow);
2007 error = true;
2008 break;
2009 }
2010
2011 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
2012 {
2013 LOG_ERROR("sql.sql", "LinkedRespawn: Creature '{}' linking to Gameobject '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
2014 error = true;
2015 break;
2016 }
2017
2018 guid = ObjectGuid::Create<HighGuid::Unit>(slave->id1, guidLow);
2019 linkedGuid = ObjectGuid::Create<HighGuid::GameObject>(master->id, linkedGuidLow);
2020 break;
2021 }
2022 case GO_TO_GO:
2023 {
2024 const GameObjectData* slave = GetGameObjectData(guidLow);
2025 if (!slave)
2026 {
2027 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (guid) {} not found in gameobject table", guidLow);
2028 error = true;
2029 break;
2030 }
2031
2032 const GameObjectData* master = GetGameObjectData(linkedGuidLow);
2033 if (!master)
2034 {
2035 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (linkedGuid) {} not found in gameobject table", linkedGuidLow);
2036 error = true;
2037 break;
2038 }
2039
2040 MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
2041 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
2042 {
2043 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '{}' linking to Gameobject '{}' on an unpermitted map.", guidLow, linkedGuidLow);
2044 error = true;
2045 break;
2046 }
2047
2048 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
2049 {
2050 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '{}' linking to Gameobject '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
2051 error = true;
2052 break;
2053 }
2054
2055 guid = ObjectGuid::Create<HighGuid::GameObject>(slave->id, guidLow);
2056 linkedGuid = ObjectGuid::Create<HighGuid::GameObject>(master->id, linkedGuidLow);
2057 break;
2058 }
2059 case GO_TO_CREATURE:
2060 {
2061 const GameObjectData* slave = GetGameObjectData(guidLow);
2062 if (!slave)
2063 {
2064 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (guid) {} not found in gameobject table", guidLow);
2065 error = true;
2066 break;
2067 }
2068
2069 const CreatureData* master = GetCreatureData(linkedGuidLow);
2070 if (!master)
2071 {
2072 LOG_ERROR("sql.sql", "LinkedRespawn: Creature (linkedGuid) {} not found in creature table", linkedGuidLow);
2073 error = true;
2074 break;
2075 }
2076
2077 MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
2078 if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
2079 {
2080 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '{}' linking to Creature '{}' on an unpermitted map.", guidLow, linkedGuidLow);
2081 error = true;
2082 break;
2083 }
2084
2085 if (!(master->spawnMask & slave->spawnMask)) // they must have a possibility to meet (normal/heroic difficulty)
2086 {
2087 LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '{}' linking to Creature '{}' with not corresponding spawnMask", guidLow, linkedGuidLow);
2088 error = true;
2089 break;
2090 }
2091
2092 guid = ObjectGuid::Create<HighGuid::GameObject>(slave->id, guidLow);
2093 linkedGuid = ObjectGuid::Create<HighGuid::Unit>(master->id1, linkedGuidLow);
2094 break;
2095 }
2096 }
2097
2098 if (!error)
2099 _linkedRespawnStore[guid] = linkedGuid;
2100 } while (result->NextRow());
2101
2102 LOG_INFO("server.loading", ">> Loaded {} Linked Respawns In {} ms", uint64(_linkedRespawnStore.size()), GetMSTimeDiffToNow(oldMSTime));
2103 LOG_INFO("server.loading", " ");
2104}
Definition ObjectGuid.h:118
bool Instanceable() const
Definition DBCStructure.h: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 ( )
9243{
9244 uint32 oldMSTime = getMSTime();
9245
9246 _mailLevelRewardStore.clear(); // for reload case
9247
9248 // 0 1 2 3
9249 QueryResult result = WorldDatabase.Query("SELECT level, raceMask, mailTemplateId, senderEntry FROM mail_level_reward");
9250
9251 if (!result)
9252 {
9253 LOG_WARN("server.loading", ">> Loaded 0 level dependent mail rewards. DB table `mail_level_reward` is empty.");
9254 LOG_INFO("server.loading", " ");
9255 return;
9256 }
9257
9258 uint32 count = 0;
9259
9260 do
9261 {
9262 Field* fields = result->Fetch();
9263
9264 uint8 level = fields[0].Get<uint8>();
9265 uint32 raceMask = fields[1].Get<uint32>();
9266 uint32 mailTemplateId = fields[2].Get<uint32>();
9267 uint32 senderEntry = fields[3].Get<uint32>();
9268
9269 if (level > MAX_LEVEL)
9270 {
9271 LOG_ERROR("sql.sql", "Table `mail_level_reward` have data for level {} that more supported by client ({}), ignoring.", level, MAX_LEVEL);
9272 continue;
9273 }
9274
9275 if (!(raceMask & RACEMASK_ALL_PLAYABLE))
9276 {
9277 LOG_ERROR("sql.sql", "Table `mail_level_reward` have raceMask ({}) for level {} that not include any player races, ignoring.", raceMask, level);
9278 continue;
9279 }
9280
9281 if (!sMailTemplateStore.LookupEntry(mailTemplateId))
9282 {
9283 LOG_ERROR("sql.sql", "Table `mail_level_reward` have invalid mailTemplateId ({}) for level {} that invalid not include any player races, ignoring.", mailTemplateId, level);
9284 continue;
9285 }
9286
9287 if (!GetCreatureTemplate(senderEntry))
9288 {
9289 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);
9290 continue;
9291 }
9292
9293 _mailLevelRewardStore[level].push_back(MailLevelReward(raceMask, mailTemplateId, senderEntry));
9294
9295 ++count;
9296 } while (result->NextRow());
9297
9298 LOG_INFO("server.loading", ">> Loaded {} Level Dependent Mail Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9299 LOG_INFO("server.loading", " ");
9300}
#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 ( )
8822{
8823 uint32 oldMSTime = getMSTime();
8824
8825 _moduleStringStore.clear(); // for reload case
8826 QueryResult result = WorldDatabase.Query("SELECT module, id, string FROM module_string");
8827 if (!result)
8828 {
8829 LOG_WARN("server.loading", ">> Loaded 0 module strings. DB table `module_string` is empty.");
8830 LOG_INFO("server.loading", " ");
8831 return false;
8832 }
8833
8834 do
8835 {
8836 Field* fields = result->Fetch();
8837
8838 std::string module = fields[0].Get<std::string>();
8839 uint32 id = fields[1].Get<uint32>();
8840
8841 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
8842 ModuleString& data = _moduleStringStore[pairKey];
8843
8844 AddLocaleString(fields[2].Get<std::string>(), LOCALE_enUS, data.Content);
8845 } while (result->NextRow());
8846
8847 LOG_INFO("server.loading", ">> Loaded {} Module Strings in {} ms", _moduleStringStore.size(), GetMSTimeDiffToNow(oldMSTime));
8848 LOG_INFO("server.loading", " ");
8849
8850 return true;
8851}

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

◆ LoadModuleStringsLocale()

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

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

◆ LoadNPCSpellClickSpells()

void ObjectMgr::LoadNPCSpellClickSpells ( )
8175{
8176 uint32 oldMSTime = getMSTime();
8177
8178 _spellClickInfoStore.clear();
8179 // 0 1 2 3
8180 QueryResult result = WorldDatabase.Query("SELECT npc_entry, spell_id, cast_flags, user_type FROM npc_spellclick_spells");
8181
8182 if (!result)
8183 {
8184 LOG_WARN("server.loading", ">> Loaded 0 spellclick spells. DB table `npc_spellclick_spells` is empty.");
8185 LOG_INFO("server.loading", " ");
8186 return;
8187 }
8188
8189 uint32 count = 0;
8190
8191 do
8192 {
8193 Field* fields = result->Fetch();
8194
8195 uint32 npc_entry = fields[0].Get<uint32>();
8196 CreatureTemplate const* cInfo = GetCreatureTemplate(npc_entry);
8197 if (!cInfo)
8198 {
8199 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown creature_template {}. Skipping entry.", npc_entry);
8200 continue;
8201 }
8202
8203 uint32 spellid = fields[1].Get<uint32>();
8204 SpellInfo const* spellinfo = sSpellMgr->GetSpellInfo(spellid);
8205 if (!spellinfo)
8206 {
8207 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown spellid {}. Skipping entry.", spellid);
8208 continue;
8209 }
8210
8211 uint8 userType = fields[3].Get<uint16>();
8212 if (userType >= SPELL_CLICK_USER_MAX)
8213 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown user type {}. Skipping entry.", uint32(userType));
8214
8215 uint8 castFlags = fields[2].Get<uint8>();
8216 SpellClickInfo info;
8217 info.spellId = spellid;
8218 info.castFlags = castFlags;
8219 info.userType = SpellClickUserTypes(userType);
8220 _spellClickInfoStore.insert(SpellClickInfoContainer::value_type(npc_entry, info));
8221
8222 ++count;
8223 } while (result->NextRow());
8224
8225 // all spellclick data loaded, now we check if there are creatures with NPC_FLAG_SPELLCLICK but with no data
8226 // NOTE: It *CAN* be the other way around: no spellclick flag but with spellclick data, in case of creature-only vehicle accessories
8228 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
8229 {
8230 if ((itr->second.npcflag & UNIT_NPC_FLAG_SPELLCLICK) && _spellClickInfoStore.find(itr->second.Entry) == _spellClickInfoStore.end())
8231 {
8232 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);
8233 const_cast<CreatureTemplate*>(&itr->second)->npcflag &= ~UNIT_NPC_FLAG_SPELLCLICK;
8234 }
8235 }
8236
8237 LOG_INFO("server.loading", ">> Loaded {} Spellclick Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8238 LOG_INFO("server.loading", " ");
8239}
SpellClickUserTypes
Definition SharedDefines.h:680
@ SPELL_CLICK_USER_MAX
Definition SharedDefines.h:685
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:339
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 ( )
6264{
6265 uint32 oldMSTime = getMSTime();
6266
6267 _npcTextLocaleStore.clear(); // need for reload case
6268
6269 QueryResult result = WorldDatabase.Query("SELECT ID, Locale, "
6270 // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
6271 "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 "
6272 "FROM npc_text_locale");
6273
6274 if (!result)
6275 return;
6276
6277 do
6278 {
6279 Field* fields = result->Fetch();
6280
6281 uint32 ID = fields[0].Get<uint32>();
6282
6283 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
6284 if (locale == LOCALE_enUS)
6285 continue;
6286
6288 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6289 {
6290 AddLocaleString(fields[2 + i * 2].Get<std::string>(), locale, data.Text_0[i]);
6291 AddLocaleString(fields[3 + i * 2].Get<std::string>(), locale, data.Text_1[i]);
6292 }
6293 } while (result->NextRow());
6294
6295 LOG_INFO("server.loading", ">> Loaded {} Npc Text Locale Strings in {} ms", (uint32)_npcTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6296}
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 ( )
6011{
6012 uint32 oldMSTime = getMSTime();
6013
6014 _pageTextLocaleStore.clear(); // need for reload case
6015
6016 // 0 1 2
6017 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Text FROM page_text_locale");
6018
6019 if (!result)
6020 {
6021 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text_locale` is empty!");
6022 LOG_INFO("server.loading", " ");
6023 return;
6024 }
6025
6026 do
6027 {
6028 Field* fields = result->Fetch();
6029
6030 uint32 ID = fields[0].Get<uint32>();
6031
6032 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
6033 if (locale == LOCALE_enUS)
6034 continue;
6035
6037 AddLocaleString(fields[2].Get<std::string>(), locale, data.Text);
6038 } while (result->NextRow());
6039
6040 LOG_INFO("server.loading", ">> Loaded {} Page Text Locale Strings in {} ms", (uint32)_pageTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6041}
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 ( )
5961{
5962 uint32 oldMSTime = getMSTime();
5963
5964 // 0 1 2
5965 QueryResult result = WorldDatabase.Query("SELECT ID, Text, NextPageID FROM page_text");
5966
5967 if (!result)
5968 {
5969 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text` is empty!");
5970 LOG_INFO("server.loading", " ");
5971 return;
5972 }
5973
5974 uint32 count = 0;
5975 do
5976 {
5977 Field* fields = result->Fetch();
5978
5979 PageText& pageText = _pageTextStore[fields[0].Get<uint32>()];
5980
5981 pageText.Text = fields[1].Get<std::string>();
5982 pageText.NextPage = fields[2].Get<uint32>();
5983
5984 ++count;
5985 } while (result->NextRow());
5986
5987 for (PageTextContainer::const_iterator itr = _pageTextStore.begin(); itr != _pageTextStore.end(); ++itr)
5988 {
5989 if (itr->second.NextPage)
5990 {
5991 PageTextContainer::const_iterator itr2 = _pageTextStore.find(itr->second.NextPage);
5992 if (itr2 == _pageTextStore.end())
5993 LOG_ERROR("sql.sql", "Page text (Id: {}) has not existing next page (Id: {})", itr->first, itr->second.NextPage);
5994 }
5995 }
5996
5997 LOG_INFO("server.loading", ">> Loaded {} Page Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5998 LOG_INFO("server.loading", " ");
5999}
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 ( )
3750{
3751 uint32 oldMSTime = getMSTime();
3752
3753 // 0 1 2 3 4 5 6 7 8 9 10 11
3754 QueryResult result = WorldDatabase.Query("SELECT creature_entry, level, hp, mana, str, agi, sta, inte, spi, armor, min_dmg, max_dmg FROM pet_levelstats");
3755
3756 if (!result)
3757 {
3758 LOG_WARN("server.loading", ">> Loaded 0 level pet stats definitions. DB table `pet_levelstats` is empty.");
3759 LOG_INFO("server.loading", " ");
3760 return;
3761 }
3762
3763 uint32 count = 0;
3764
3765 do
3766 {
3767 Field* fields = result->Fetch();
3768
3769 uint32 creature_id = fields[0].Get<uint32>();
3770 if (!GetCreatureTemplate(creature_id))
3771 {
3772 LOG_ERROR("sql.sql", "Wrong creature id {} in `pet_levelstats` table, ignoring.", creature_id);
3773 continue;
3774 }
3775
3776 uint32 current_level = fields[1].Get<uint8>();
3777 if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
3778 {
3779 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
3780 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `pet_levelstats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
3781 else
3782 {
3783 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `pet_levelstats` table, ignoring.", current_level);
3784 ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
3785 }
3786 continue;
3787 }
3788 else if (current_level < 1)
3789 {
3790 LOG_ERROR("sql.sql", "Wrong (<1) level {} in `pet_levelstats` table, ignoring.", current_level);
3791 continue;
3792 }
3793
3794 PetLevelInfo*& pInfoMapEntry = _petInfoStore[creature_id];
3795
3796 if (!pInfoMapEntry)
3797 pInfoMapEntry = new PetLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
3798
3799 // data for level 1 stored in [0] array element, ...
3800 PetLevelInfo* pLevelInfo = &pInfoMapEntry[current_level - 1];
3801
3802 pLevelInfo->health = fields[2].Get<uint32>();
3803 pLevelInfo->mana = fields[3].Get<uint32>();
3804 pLevelInfo->armor = fields[9].Get<uint32>();
3805 pLevelInfo->min_dmg = fields[10].Get<uint32>();
3806 pLevelInfo->max_dmg = fields[11].Get<uint32>();
3807 for (uint8 i = 0; i < MAX_STATS; i++)
3808 {
3809 pLevelInfo->stats[i] = fields[i + 4].Get<uint32>();
3810 }
3811
3812 ++count;
3813 } while (result->NextRow());
3814
3815 // Fill gaps and check integrity
3816 for (PetLevelInfoContainer::iterator itr = _petInfoStore.begin(); itr != _petInfoStore.end(); ++itr)
3817 {
3818 PetLevelInfo* pInfo = itr->second;
3819
3820 // fatal error if no level 1 data
3821 if (!pInfo || pInfo[0].health == 0)
3822 {
3823 LOG_ERROR("sql.sql", "Creature {} does not have pet stats data for Level 1!", itr->first);
3824 exit(1);
3825 }
3826
3827 // fill level gaps
3828 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
3829 {
3830 if (pInfo[level].health == 0)
3831 {
3832 LOG_ERROR("sql.sql", "Creature {} has no data for Level {} pet stats data, using data of Level {}.", itr->first, level + 1, level);
3833 pInfo[level] = pInfo[level - 1];
3834 }
3835 }
3836 }
3837
3838 LOG_INFO("server.loading", ">> Loaded {} Level Pet Stats Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3839 LOG_INFO("server.loading", " ");
3840}
#define STRONG_MAX_LEVEL
Definition DBCEnums.h:43
#define MAX_STATS
Definition SharedDefines.h:265
Definition ObjectMgr.h:528
uint32 max_dmg
Definition ObjectMgr.h:539
uint32 mana
Definition ObjectMgr.h:536
uint32 min_dmg
Definition ObjectMgr.h:538
uint32 health
Definition ObjectMgr.h:535
std::array< uint32, MAX_STATS > stats
Definition ObjectMgr.h:534
uint32 armor
Definition ObjectMgr.h:537

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

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 ( )
7713{
7714 uint32 oldMSTime = getMSTime();
7715
7716 QueryResult result = CharacterDatabase.Query("SELECT MAX(id) FROM character_pet");
7717 if (result)
7718 {
7719 Field* fields = result->Fetch();
7720 _hiPetNumber = fields[0].Get<uint32>() + 1;
7721 }
7722
7723 LOG_INFO("server.loading", ">> Loaded The Max Pet Number: {} in {} ms", _hiPetNumber - 1, GetMSTimeDiffToNow(oldMSTime));
7724 LOG_INFO("server.loading", " ");
7725}

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

◆ LoadPlayerInfo()

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

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 ( )
1848{
1849 uint32 oldMSTime = getMSTime();
1850
1851 QueryResult result = WorldDatabase.Query("SELECT ShapeshiftID, RaceID, CustomizationID, GenderID, ModelID from player_shapeshift_model");
1852
1853 if (!result)
1854 {
1855 LOG_INFO("server.loading", ">> Loaded 0 player shapeshift model records. DB table `player_shapeshift_model` is empty.");
1856 return;
1857 }
1858
1859 uint32 count = 0;
1860 do
1861 {
1862 Field* fields = result->Fetch();
1863
1864 ShapeshiftForm shapeshiftForm = ShapeshiftForm(fields[0].Get<uint8>());
1865 uint8 race = fields[1].Get<uint8>();
1866 uint8 customizationID = fields[2].Get<uint8>();
1867 uint8 genderID = Gender(fields[3].Get<uint8>());
1868 uint32 modelId = fields[4].Get<uint32>();
1869
1870 ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race);
1871 if (!raceEntry)
1872 {
1873 LOG_ERROR("sql.sql", "Race {} defined in `player_shapeshift_model` does not exists, skipped.", uint32(race));
1874 continue;
1875 }
1876
1877 CreatureDisplayInfoEntry const* displayEntry = sCreatureDisplayInfoStore.LookupEntry(modelId);
1878 if (!displayEntry)
1879 {
1880 LOG_ERROR("sql.sql", "ShapeshiftForm: {}, Race: {} defined in `player_shapeshift_model` has non-existing model ({}), skipped.", shapeshiftForm, race, modelId);
1881 continue;
1882 }
1883
1884 _playerShapeshiftModel[std::make_tuple(shapeshiftForm, race, customizationID, genderID)] = modelId;
1885 ++count;
1886 } while (result->NextRow());
1887
1888 LOG_INFO("server.loading", ">> Loaded {} player totem model records in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1889 LOG_INFO("server.loading", " ");
1890}
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 ( )
1789{
1790 uint32 oldMSTime = getMSTime();
1791
1792 QueryResult result = WorldDatabase.Query("SELECT TotemID, RaceID, ModelID from player_totem_model");
1793
1794 if (!result)
1795 {
1796 LOG_INFO("server.loading", ">> Loaded 0 player totem model records. DB table `player_totem_model` is empty.");
1797 return;
1798 }
1799
1800 uint32 count = 0;
1801 do
1802 {
1803 Field* fields = result->Fetch();
1804
1805 SummonSlot totemSlot = SummonSlot(fields[0].Get<uint8>());
1806 uint8 race = fields[1].Get<uint8>();
1807 uint32 displayId = fields[2].Get<uint32>();
1808
1809 if (totemSlot < SUMMON_SLOT_TOTEM_FIRE || totemSlot >= MAX_TOTEM_SLOT)
1810 {
1811 LOG_ERROR("sql.sql", "Wrong TotemSlot {} in `player_totem_model` table, skipped.", totemSlot);
1812 continue;
1813 }
1814
1815 ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race);
1816 if (!raceEntry)
1817 {
1818 LOG_ERROR("sql.sql", "Race {} defined in `player_totem_model` does not exists, skipped.", uint32(race));
1819 continue;
1820 }
1821
1822 CreatureDisplayInfoEntry const* displayEntry = sCreatureDisplayInfoStore.LookupEntry(displayId);
1823 if (!displayEntry)
1824 {
1825 LOG_ERROR("sql.sql", "TotemSlot: {} defined in `player_totem_model` has non-existing model ({}), skipped.", totemSlot, displayId);
1826 continue;
1827 }
1828
1829 _playerTotemModel[std::make_pair(totemSlot, Races(race))] = displayId;
1830 ++count;
1831 } while (result->NextRow());
1832
1833 LOG_INFO("server.loading", ">> Loaded {} player totem model records in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1834 LOG_INFO("server.loading", " ");
1835}
#define MAX_TOTEM_SLOT
Definition SharedDefines.h:3561
SummonSlot
Definition SharedDefines.h:3549
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 ( )
8044{
8045 uint32 oldMSTime = getMSTime();
8046
8047 _pointsOfInterestStore.clear(); // need for reload case
8048
8049 uint32 count = 0;
8050
8051 // 0 1 2 3 4 5 6
8052 QueryResult result = WorldDatabase.Query("SELECT ID, PositionX, PositionY, Icon, Flags, Importance, Name FROM points_of_interest");
8053
8054 if (!result)
8055 {
8056 LOG_WARN("server.loading", ">> Loaded 0 Points of Interest definitions. DB table `points_of_interest` is empty.");
8057 LOG_INFO("server.loading", " ");
8058 return;
8059 }
8060
8061 do
8062 {
8063 Field* fields = result->Fetch();
8064
8065 uint32 point_id = fields[0].Get<uint32>();
8066
8067 PointOfInterest POI;
8068 POI.ID = point_id;
8069 POI.PositionX = fields[1].Get<float>();
8070 POI.PositionY = fields[2].Get<float>();
8071 POI.Icon = fields[3].Get<uint32>();
8072 POI.Flags = fields[4].Get<uint32>();
8073 POI.Importance = fields[5].Get<uint32>();
8074 POI.Name = fields[6].Get<std::string>();
8075
8076 if (!Acore::IsValidMapCoord(POI.PositionX, POI.PositionY))
8077 {
8078 LOG_ERROR("sql.sql", "Table `points_of_interest` (ID: {}) have invalid coordinates (X: {} Y: {}), ignored.", point_id, POI.PositionX, POI.PositionY);
8079 continue;
8080 }
8081
8082 _pointsOfInterestStore[point_id] = POI;
8083
8084 ++count;
8085 } while (result->NextRow());
8086
8087 LOG_INFO("server.loading", ">> Loaded {} Points of Interest Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8088 LOG_INFO("server.loading", " ");
8089}
bool IsValidMapCoord(float c)
Definition GridDefines.h:206
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 ( )
8466{
8467 uint32 oldMSTime = getMSTime();
8468
8469 _profanityNamesStore.clear(); // need for reload case
8470
8471 QueryResult result = CharacterDatabase.Query("SELECT name FROM profanity_name");
8472
8473 if (!result)
8474 {
8475 LOG_WARN("server.loading", ">> Loaded 0 profanity names. DB table `profanity_name` is empty!");
8476 return;
8477 }
8478
8479 uint32 count = 0;
8480
8481 Field* fields;
8482 do
8483 {
8484 fields = result->Fetch();
8485 std::string name = fields[0].Get<std::string>();
8486
8487 std::wstring wstr;
8488 if (!Utf8toWStr (name, wstr))
8489 {
8490 LOG_ERROR("sql.sql", "Table `profanity_name` have invalid name: {}", name);
8491 continue;
8492 }
8493
8494 wstrToLower(wstr);
8495
8496 _profanityNamesStore.insert(wstr);
8497 ++count;
8498 } while (result->NextRow());
8499
8500 LOG_INFO("server.loading", ">> Loaded {} profanity names from DB in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8501}

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

◆ LoadProfanityNamesFromDBC()

void ObjectMgr::LoadProfanityNamesFromDBC ( )
8504{
8505 if (!sWorld->getBoolConfig(CONFIG_STRICT_NAMES_PROFANITY))
8506 {
8507 LOG_WARN("server.loading", ">> Loaded 0 profanity names from DBC. Config option disabled.");
8508 return;
8509 }
8510
8511 uint32 oldMSTime = getMSTime();
8512
8513 uint32 count = 0;
8514
8515 for (NamesProfanityEntry const* profanityStore : sNamesProfanityStore)
8516 {
8517 std::wstring wstr;
8518
8519 Utf8toWStr(profanityStore->Pattern, wstr);
8520
8521 // DBC does not have clean entries, remove the junk.
8522 boost::algorithm::replace_all(wstr, "\\<", "");
8523 boost::algorithm::replace_all(wstr, "\\>", "");
8524
8525 _profanityNamesStore.insert(wstr);
8526 count++;
8527 }
8528
8529 LOG_INFO("server.loading", ">> Loaded {} profanity names from DBC in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8530 LOG_INFO("server.loading", " ");
8531}
DBCStorage< NamesProfanityEntry > sNamesProfanityStore(NamesProfanityfmt)
@ CONFIG_STRICT_NAMES_PROFANITY
Definition WorldConfig.h:139
Definition DBCStructure.h:1406

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

◆ LoadQuestAreaTriggers()

void ObjectMgr::LoadQuestAreaTriggers ( )
6422{
6423 uint32 oldMSTime = getMSTime();
6424
6425 _questAreaTriggerStore.clear(); // need for reload case
6426
6427 QueryResult result = WorldDatabase.Query("SELECT id, quest FROM areatrigger_involvedrelation");
6428
6429 if (!result)
6430 {
6431 LOG_WARN("server.loading", ">> Loaded 0 quest trigger points. DB table `areatrigger_involvedrelation` is empty.");
6432 LOG_INFO("server.loading", " ");
6433 return;
6434 }
6435
6436 uint32 count = 0;
6437
6438 do
6439 {
6440 ++count;
6441
6442 Field* fields = result->Fetch();
6443
6444 uint32 trigger_ID = fields[0].Get<uint32>();
6445 uint32 quest_ID = fields[1].Get<uint32>();
6446
6447 AreaTrigger const* atEntry = GetAreaTrigger(trigger_ID);
6448 if (!atEntry)
6449 {
6450 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", trigger_ID);
6451 continue;
6452 }
6453
6454 Quest const* quest = GetQuestTemplate(quest_ID);
6455
6456 if (!quest)
6457 {
6458 LOG_ERROR("sql.sql", "Table `areatrigger_involvedrelation` has record (id: {}) for not existing quest {}", trigger_ID, quest_ID);
6459 continue;
6460 }
6461
6463 {
6464 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);
6465
6466 // this will prevent quest completing without objective
6467 const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
6468
6469 // continue; - quest modified to required objective and trigger can be allowed.
6470 }
6471
6472 _questAreaTriggerStore[trigger_ID] = quest_ID;
6473 } while (result->NextRow());
6474
6475 LOG_INFO("server.loading", ">> Loaded {} Quest Trigger Points in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6476 LOG_INFO("server.loading", " ");
6477}
@ 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 ( )
6498{
6499 uint32 oldMSTime = getMSTime();
6500
6501 _questGreetingStore.clear(); // For reload case
6502
6503 // 0 1 2 3 4
6504 QueryResult result = WorldDatabase.Query("SELECT ID, Type, GreetEmoteType, GreetEmoteDelay, Greeting FROM quest_greeting");
6505 if (!result)
6506 {
6507 LOG_WARN("server.loading", ">> Loaded 0 quest greetings. DB table `quest_greeting` is empty.");
6508 return;
6509 }
6510
6511 do
6512 {
6513 Field* fields = result->Fetch();
6514
6515 uint32 id = fields[0].Get<uint32>();
6516 uint8 type = fields[1].Get<uint8>();
6517 switch (type)
6518 {
6519 case 0: // Creature
6520 if (!GetCreatureTemplate(id))
6521 {
6522 LOG_ERROR("sql.sql", "Table `quest_greeting`: creature template entry {} does not exist.", id);
6523 continue;
6524 }
6525 break;
6526 case 1: // GameObject
6527 if (!GetGameObjectTemplate(id))
6528 {
6529 LOG_ERROR("sql.sql", "Table `quest_greeting`: gameobject template entry {} does not exist.", id);
6530 continue;
6531 }
6532 break;
6533 default:
6534 LOG_ERROR("sql.sql", "Table `quest_greeting` has unknown type {} for id {}, skipped.", type, id);
6535 continue;
6536 }
6537
6538 std::pair<uint32, uint8> pairKey = std::make_pair(id, type);
6539 QuestGreeting& data = _questGreetingStore[pairKey];
6540
6541 data.EmoteType = fields[2].Get<uint16>();
6542 data.EmoteDelay = fields[3].Get<uint32>();
6543 AddLocaleString(fields[4].Get<std::string>(), LOCALE_enUS, data.Greeting);
6544 }
6545 while (result->NextRow());
6546
6547 LOG_INFO("server.loading", ">> Loaded {} quest_greeting in {} ms", _questGreetingStore.size(), GetMSTimeDiffToNow(oldMSTime));
6548 LOG_INFO("server.loading", " ");
6549}
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 ( )
6552{
6553 uint32 oldMSTime = getMSTime();
6554
6555 // 0 1 2 3
6556 QueryResult result = WorldDatabase.Query("SELECT ID, Type, Locale, Greeting FROM quest_greeting_locale");
6557 if (!result)
6558 {
6559 LOG_WARN("server.loading", ">> Loaded 0 quest_greeting locales. DB table `quest_greeting_locale` is empty.");
6560 return;
6561 }
6562
6563 uint32 localeCount = 0;
6564 do
6565 {
6566 Field* fields = result->Fetch();
6567
6568 uint32 id = fields[0].Get<uint32>();
6569 uint8 type = fields[1].Get<uint8>();
6570 switch (type)
6571 {
6572 case 0: // Creature
6573 if (!GetCreatureTemplate(id))
6574 {
6575 LOG_ERROR("sql.sql", "Table `quest_greeting_locale`: creature template entry {} does not exist.", id);
6576 continue;
6577 }
6578 break;
6579 case 1: // GameObject
6580 if (!GetGameObjectTemplate(id))
6581 {
6582 LOG_ERROR("sql.sql", "Table `quest_greeting_locale`: gameobject template entry {} does not exist.", id);
6583 continue;
6584 }
6585 break;
6586 default:
6587 continue;
6588 }
6589
6590 std::pair<uint32, uint8> pairKey = std::make_pair(id, type);
6591 QuestGreeting& data = _questGreetingStore[pairKey];
6592
6593 QuestGreetingContainer::iterator qgc = _questGreetingStore.find(pairKey);
6594 if (qgc == _questGreetingStore.end())
6595 {
6596 LOG_ERROR("sql.sql", "QuestGreeting (Id: {} Type: {}) found in table `quest_greeting_locale` but does not exist in `quest_greeting`. Skipped!", id, type);
6597 continue;
6598 }
6599
6600 LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>());
6601 if (locale == LOCALE_enUS)
6602 continue;
6603
6604 AddLocaleString(fields[3].Get<std::string>(), locale, data.Greeting);
6605 localeCount++;
6606 } while (result->NextRow());
6607
6608 LOG_INFO("server.loading", ">> Loaded {} quest greeting Locale Strings in {} ms", localeCount, GetMSTimeDiffToNow(oldMSTime));
6609 LOG_INFO("server.loading", " ");
6610}

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 ( )
5382{
5383 uint32 oldMSTime = getMSTime();
5384
5385 _questLocaleStore.clear(); // need for reload case
5386
5387 // 0 1 2 3 4 5 6 7 8 9 10
5388 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Title, Details, Objectives, EndText, CompletedText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4 FROM quest_template_locale");
5389
5390 if (!result)
5391 return;
5392
5393 do
5394 {
5395 Field* fields = result->Fetch();
5396
5397 uint32 ID = fields[0].Get<uint32>();
5398
5399 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
5400 if (locale == LOCALE_enUS)
5401 continue;
5402
5403 QuestLocale& data = _questLocaleStore[ID];
5404 AddLocaleString(fields[2].Get<std::string>(), locale, data.Title);
5405 AddLocaleString(fields[3].Get<std::string>(), locale, data.Details);
5406 AddLocaleString(fields[4].Get<std::string>(), locale, data.Objectives);
5407 AddLocaleString(fields[5].Get<std::string>(), locale, data.AreaDescription);
5408 AddLocaleString(fields[6].Get<std::string>(), locale, data.CompletedText);
5409
5410 for (uint8 i = 0; i < 4; ++i)
5411 AddLocaleString(fields[i + 7].Get<std::string>(), locale, data.ObjectiveText[i]);
5412 } while (result->NextRow());
5413
5414 LOG_INFO("server.loading", ">> Loaded {} Quest Locale Strings in {} ms", (uint32)_questLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
5415}
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 ( )
10423{
10424 uint32 oldMSTime = getMSTime();
10425
10426 _questMoneyRewards.clear();
10427
10428 // 0 1 2 3 4 5 6 7 8 9 10
10429 QueryResult result = WorldDatabase.Query("SELECT `Level`, Money0, Money1, Money2, Money3, Money4, Money5, Money6, Money7, Money8, Money9 FROM `quest_money_reward` ORDER BY `Level`");
10430 if (!result)
10431 {
10432 LOG_WARN("server.loading", ">> Loaded 0 quest money rewards. DB table `quest_money_reward` is empty.");
10433 return;
10434 }
10435
10436 uint32 count = 0;
10437 do
10438 {
10439 Field* fields = result->Fetch();
10440 uint32 Level = fields[0].Get<uint32>();
10441
10442 QuestMoneyRewardArray& questMoneyReward = _questMoneyRewards[Level];
10443 questMoneyReward.fill(0);
10444
10445 for (uint8 i = 0; i < MAX_QUEST_MONEY_REWARDS; ++i)
10446 {
10447 questMoneyReward[i] = fields[1 + i].Get<uint32>();
10448 ++count;
10449 }
10450 } while (result->NextRow());
10451
10452 LOG_INFO("server.loading", ">> Loaded {} Quest Money Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10453 LOG_INFO("server.loading", " ");
10454}
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 ( )
6613{
6614 uint32 oldMSTime = getMSTime();
6615
6616 _questOfferRewardLocaleStore.clear(); // need for reload case
6617
6618 // 0 1 2
6619 QueryResult result = WorldDatabase.Query("SELECT Id, locale, RewardText FROM quest_offer_reward_locale");
6620 if (!result)
6621 return;
6622
6623 do
6624 {
6625 Field* fields = result->Fetch();
6626
6627 uint32 id = fields[0].Get<uint32>();
6628 std::string localeName = fields[1].Get<std::string>();
6629
6630 LocaleConstant locale = GetLocaleByName(localeName);
6631 if (locale == LOCALE_enUS)
6632 continue;
6633
6635 AddLocaleString(fields[2].Get<std::string>(), locale, data.RewardText);
6636 } while (result->NextRow());
6637
6638 LOG_INFO("server.loading", ">> Loaded {} Quest Offer Reward Locale Strings in {} ms", _questOfferRewardLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6639}
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 ( )
8092{
8093 if (!sWorld->getBoolConfig(CONFIG_QUEST_POI_ENABLED))
8094 {
8095 LOG_INFO("server.loading", ">> Loaded 0 quest POI definitions. Disabled by config.");
8096 LOG_INFO("server.loading", " ");
8097 return;
8098 }
8099
8100 uint32 oldMSTime = getMSTime();
8101
8102 _questPOIStore.clear(); // need for reload case
8103
8104 uint32 count = 0;
8105
8106 // 0 1 2 3 4 5 6 7
8107 QueryResult result = WorldDatabase.Query("SELECT QuestID, id, ObjectiveIndex, MapID, WorldMapAreaId, Floor, Priority, Flags FROM quest_poi order by QuestID");
8108
8109 if (!result)
8110 {
8111 LOG_WARN("server.loading", ">> Loaded 0 quest POI definitions. DB table `quest_poi` is empty.");
8112 LOG_INFO("server.loading", " ");
8113 return;
8114 }
8115
8116 // 0 1 2 3
8117 QueryResult points = WorldDatabase.Query("SELECT QuestID, Idx1, X, Y FROM quest_poi_points ORDER BY QuestID DESC, Idx2");
8118
8119 std::vector<std::vector<std::vector<QuestPOIPoint> > > POIs;
8120
8121 if (points)
8122 {
8123 // The first result should have the highest questId
8124 Field* fields = points->Fetch();
8125 uint32 questIdMax = fields[0].Get<uint32>();
8126 POIs.resize(questIdMax + 1);
8127
8128 do
8129 {
8130 fields = points->Fetch();
8131
8132 uint32 questId = fields[0].Get<uint32>();
8133 uint32 id = fields[1].Get<uint32>();
8134 int32 x = fields[2].Get<int32>();
8135 int32 y = fields[3].Get<int32>();
8136
8137 if (POIs[questId].size() <= id + 1)
8138 POIs[questId].resize(id + 10);
8139
8140 QuestPOIPoint point(x, y);
8141 POIs[questId][id].push_back(point);
8142 } while (points->NextRow());
8143 }
8144
8145 do
8146 {
8147 Field* fields = result->Fetch();
8148
8149 uint32 questId = fields[0].Get<uint32>();
8150 uint32 id = fields[1].Get<uint32>();
8151 int32 objIndex = fields[2].Get<int32>();
8152 uint32 mapId = fields[3].Get<uint32>();
8153 uint32 WorldMapAreaId = fields[4].Get<uint32>();
8154 uint32 FloorId = fields[5].Get<uint32>();
8155 uint32 unk3 = fields[6].Get<uint32>();
8156 uint32 unk4 = fields[7].Get<uint32>();
8157
8158 QuestPOI POI(id, objIndex, mapId, WorldMapAreaId, FloorId, unk3, unk4);
8159 if (questId < POIs.size() && id < POIs[questId].size())
8160 {
8161 POI.points = POIs[questId][id];
8162 _questPOIStore[questId].push_back(POI);
8163 }
8164 else
8165 LOG_ERROR("sql.sql", "Table quest_poi references unknown quest points for quest {} POI id {}", questId, id);
8166
8167 ++count;
8168 } while (result->NextRow());
8169
8170 LOG_INFO("server.loading", ">> Loaded {} Quest POI definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8171 LOG_INFO("server.loading", " ");
8172}
@ CONFIG_QUEST_POI_ENABLED
Definition WorldConfig.h:132
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
8262{
8263 uint32 oldMSTime = getMSTime();
8264
8265 map.clear(); // need for reload case
8266
8267 uint32 count = 0;
8268
8269 QueryResult result = WorldDatabase.Query("SELECT id, quest, pool_entry FROM {} qr LEFT JOIN pool_quest pq ON qr.quest = pq.entry", table);
8270
8271 if (!result)
8272 {
8273 LOG_WARN("server.loading", ">> Loaded 0 quest relations from `{}`, table is empty.", table);
8274 LOG_INFO("server.loading", " ");
8275 return;
8276 }
8277
8278 PooledQuestRelation* poolRelationMap = go ? &sPoolMgr->mQuestGORelation : &sPoolMgr->mQuestCreatureRelation;
8279 if (starter)
8280 poolRelationMap->clear();
8281
8282 do
8283 {
8284 uint32 id = result->Fetch()[0].Get<uint32>();
8285 uint32 quest = result->Fetch()[1].Get<uint32>();
8286 uint32 poolId = result->Fetch()[2].Get<uint32>();
8287
8288 if (_questTemplates.find(quest) == _questTemplates.end())
8289 {
8290 LOG_ERROR("sql.sql", "Table `{}`: Quest {} listed for entry {} does not exist.", table, quest, id);
8291 continue;
8292 }
8293
8294 if (!poolId || !starter)
8295 map.insert(QuestRelations::value_type(id, quest));
8296 else if (starter)
8297 poolRelationMap->insert(PooledQuestRelation::value_type(quest, id));
8298
8299 ++count;
8300 } while (result->NextRow());
8301
8302 LOG_INFO("server.loading", ">> Loaded {} Quest Relations From {} in {} ms", count, table, GetMSTimeDiffToNow(oldMSTime));
8303 LOG_INFO("server.loading", " ");
8304}
#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 ( )
6642{
6643 uint32 oldMSTime = getMSTime();
6644
6645 _questRequestItemsLocaleStore.clear(); // need for reload case
6646
6647 // 0 1 2
6648 QueryResult result = WorldDatabase.Query("SELECT Id, locale, CompletionText FROM quest_request_items_locale");
6649 if (!result)
6650 return;
6651
6652 do
6653 {
6654 Field* fields = result->Fetch();
6655
6656 uint32 id = fields[0].Get<uint32>();
6657 std::string localeName = fields[1].Get<std::string>();
6658
6659 LocaleConstant locale = GetLocaleByName(localeName);
6660 if (locale == LOCALE_enUS)
6661 continue;
6662
6664 AddLocaleString(fields[2].Get<std::string>(), locale, data.CompletionText);
6665 } while (result->NextRow());
6666
6667 LOG_INFO("server.loading", ">> Loaded {} Quest Request Items Locale Strings in {} ms", _questRequestItemsLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6668}
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 ( )
4614{
4615 uint32 oldMSTime = getMSTime();
4616
4617 // For reload case
4618 for (QuestMap::const_iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4619 delete itr->second;
4620 _questTemplates.clear();
4621
4622 mExclusiveQuestGroups.clear();
4623
4624 QueryResult result = WorldDatabase.Query("SELECT "
4625 //0 1 2 3 4 5 6 7 8
4626 "ID, QuestType, QuestLevel, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, TimeAllowed, AllowableRaces,"
4627 // 9 10 11 12
4628 "RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, "
4629 // 13 14 15 16 17 18 19 20
4630 "RewardNextQuest, RewardXPDifficulty, RewardMoney, RewardMoneyDifficulty, RewardDisplaySpell, RewardSpell, RewardHonor, RewardKillHonor, "
4631 // 21 22 23 24 25 26
4632 "StartItem, Flags, RewardTitle, RequiredPlayerKills, RewardTalents, RewardArenaPoints, "
4633 // 27 28 29 30 31 32 33 34
4634 "RewardItem1, RewardAmount1, RewardItem2, RewardAmount2, RewardItem3, RewardAmount3, RewardItem4, RewardAmount4, "
4635 // 35 36 37 38 39 40 41 42 43 44 45 46
4636 "RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemID6, RewardChoiceItemQuantity6, "
4637 // 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
4638 "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionID5, RewardFactionValue5, RewardFactionOverride5,"
4639 // 61 63 64 65
4640 "POIContinent, POIx, POIy, POIPriority, "
4641 // 66 67 68 69 70
4642 "LogTitle, LogDescription, QuestDescription, AreaDescription, QuestCompletionLog, "
4643 // 71 72 73 74 75 76 77 78
4644 "RequiredNpcOrGo1, RequiredNpcOrGo2, RequiredNpcOrGo3, RequiredNpcOrGo4, RequiredNpcOrGoCount1, RequiredNpcOrGoCount2, RequiredNpcOrGoCount3, RequiredNpcOrGoCount4, "
4645 // 79 80 81 82 83 84 85 86
4646 "ItemDrop1, ItemDrop2, ItemDrop3, ItemDrop4, ItemDropQuantity1, ItemDropQuantity2, ItemDropQuantity3, ItemDropQuantity4, "
4647 // 87 88 89 90 91 92 93 94 95 96 97 98
4648 "RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, "
4649 // 99 100 101 102 103
4650 "Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4"
4651 " FROM quest_template");
4652 if (!result)
4653 {
4654 LOG_WARN("server.loading", ">> Loaded 0 quests definitions. DB table `quest_template` is empty.");
4655 LOG_INFO("server.loading", " ");
4656 return;
4657 }
4658
4659 // create multimap previous quest for each existed quest
4660 // some quests can have many previous maps set by NextQuestId in previous quest
4661 // for example set of race quests can lead to single not race specific quest
4662 do
4663 {
4664 Field* fields = result->Fetch();
4665
4666 Quest* newQuest = new Quest(fields);
4667 _questTemplates[newQuest->GetQuestId()] = newQuest;
4668 } while (result->NextRow());
4669
4670 // pussywizard:
4671 {
4672 uint32 max = 0;
4673 for (QuestMap::const_iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4674 if (itr->first > max)
4675 max = itr->first;
4676 if (max)
4677 {
4678 _questTemplatesFast.clear();
4679 _questTemplatesFast.resize(max + 1, nullptr);
4680 for (QuestMap::iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4681 _questTemplatesFast[itr->first] = itr->second;
4682 }
4683 }
4684
4685 for (QuestMap::iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4686 itr->second->InitializeQueryData();
4687
4688 std::map<uint32, uint32> usedMailTemplates;
4689
4690 // Load `quest_details`
4691 // 0 1 2 3 4 5 6 7 8
4692 result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4 FROM quest_details");
4693
4694 if (!result)
4695 {
4696 LOG_WARN("server.loading", ">> Loaded 0 quest details. DB table `quest_details` is empty.");
4697 }
4698 else
4699 {
4700 do
4701 {
4702 Field* fields = result->Fetch();
4703 uint32 questId = fields[0].Get<uint32>();
4704
4705 auto itr = _questTemplates.find(questId);
4706 if (itr != _questTemplates.end())
4707 itr->second->LoadQuestDetails(fields);
4708 else
4709 LOG_ERROR("sql.sql", "Table `quest_details` has data for quest {} but such quest does not exist", questId);
4710 } while (result->NextRow());
4711 }
4712
4713 // Load `quest_request_items`
4714 // 0 1 2 3
4715 result = WorldDatabase.Query("SELECT ID, EmoteOnComplete, EmoteOnIncomplete, CompletionText FROM quest_request_items");
4716
4717 if (!result)
4718 {
4719 LOG_WARN("server.loading", ">> Loaded 0 quest request items. DB table `quest_request_items` is empty.");
4720 }
4721 else
4722 {
4723 do
4724 {
4725 Field* fields = result->Fetch();
4726 uint32 questId = fields[0].Get<uint32>();
4727
4728 auto itr = _questTemplates.find(questId);
4729 if (itr != _questTemplates.end())
4730 itr->second->LoadQuestRequestItems(fields);
4731 else
4732 LOG_ERROR("sql.sql", "Table `quest_request_items` has data for quest {} but such quest does not exist", questId);
4733 } while (result->NextRow());
4734 }
4735
4736 // Load `quest_offer_reward`
4737 // 0 1 2 3 4 5 6 7 8 9
4738 result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4, RewardText FROM quest_offer_reward");
4739
4740 if (!result)
4741 {
4742 LOG_WARN("server.loading", ">> Loaded 0 quest reward emotes. DB table `quest_offer_reward` is empty.");
4743 }
4744 else
4745 {
4746 do
4747 {
4748 Field* fields = result->Fetch();
4749 uint32 questId = fields[0].Get<uint32>();
4750
4751 auto itr = _questTemplates.find(questId);
4752 if (itr != _questTemplates.end())
4753 itr->second->LoadQuestOfferReward(fields);
4754 else
4755 LOG_ERROR("sql.sql", "Table `quest_offer_reward` has data for quest {} but such quest does not exist", questId);
4756 } while (result->NextRow());
4757 }
4758
4759 // Load `quest_template_addon`
4760 // 0 1 2 3 4 5 6 7 8
4761 result = WorldDatabase.Query("SELECT ID, MaxLevel, AllowableClasses, SourceSpellID, PrevQuestID, NextQuestID, ExclusiveGroup, RewardMailTemplateID, RewardMailDelay, "
4762 //9 10 11 12 13 14 15 16 17
4763 "RequiredSkillID, RequiredSkillPoints, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, ProvidedItemCount, RewardMailSenderEntry, SpecialFlags FROM quest_template_addon LEFT JOIN quest_mail_sender ON Id=QuestId");
4764
4765 if (!result)
4766 {
4767 LOG_WARN("server.loading", ">> Loaded 0 quest template addons. DB table `quest_template_addon` is empty.");
4768 }
4769 else
4770 {
4771 do
4772 {
4773 Field* fields = result->Fetch();
4774 uint32 questId = fields[0].Get<uint32>();
4775
4776 auto itr = _questTemplates.find(questId);
4777 if (itr != _questTemplates.end())
4778 itr->second->LoadQuestTemplateAddon(fields);
4779 else
4780 LOG_ERROR("sql.sql", "Table `quest_template_addon` has data for quest {} but such quest does not exist", questId);
4781 } while (result->NextRow());
4782 }
4783
4784 // Post processing
4785 for (QuestMap::iterator iter = _questTemplates.begin(); iter != _questTemplates.end(); ++iter)
4786 {
4787 // skip post-loading checks for disabled quests
4788 if (sDisableMgr->IsDisabledFor(DISABLE_TYPE_QUEST, iter->first, nullptr))
4789 continue;
4790
4791 Quest* qinfo = iter->second;
4792
4793 // additional quest integrity checks (GO, creature_template and item_template must be loaded already)
4794
4795 if (qinfo->GetQuestMethod() >= 3)
4796 LOG_ERROR("sql.sql", "Quest {} has `Method` = {}, expected values are 0, 1 or 2.", qinfo->GetQuestId(), qinfo->GetQuestMethod());
4797
4799 {
4800 LOG_ERROR("sql.sql", "Quest {} has `SpecialFlags` = {} > max allowed value. Correct `SpecialFlags` to value <= {}",
4803 }
4804
4805 if (qinfo->Flags & QUEST_FLAGS_DAILY && qinfo->Flags & QUEST_FLAGS_WEEKLY)
4806 {
4807 LOG_ERROR("sql.sql", "Weekly Quest {} is marked as daily quest in `Flags`, removed daily flag.", qinfo->GetQuestId());
4808 qinfo->Flags &= ~QUEST_FLAGS_DAILY;
4809 }
4810
4811 if (qinfo->Flags & QUEST_FLAGS_DAILY)
4812 {
4814 {
4815 LOG_ERROR("sql.sql", "Daily Quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
4817 }
4818 }
4819
4820 if (qinfo->Flags & QUEST_FLAGS_WEEKLY)
4821 {
4823 {
4824 LOG_ERROR("sql.sql", "Weekly Quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
4826 }
4827 }
4828
4830 {
4832 {
4833 LOG_ERROR("sql.sql", "Monthly quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
4835 }
4836 }
4837
4838 if (qinfo->Flags & QUEST_FLAGS_TRACKING)
4839 {
4840 // at auto-reward can be rewarded only RewardChoiceItemId[0]
4841 for (int j = 1; j < QUEST_REWARD_CHOICES_COUNT; ++j )
4842 {
4843 if (uint32 id = qinfo->RewardChoiceItemId[j])
4844 {
4845 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but item from `RewardChoiceItemId{}` can't be rewarded with quest flag QUEST_FLAGS_TRACKING.",
4846 qinfo->GetQuestId(), j + 1, id, j + 1);
4847 // no changes, quest ignore this data
4848 }
4849 }
4850 }
4851
4852 // client quest log visual (area case)
4853 if (qinfo->ZoneOrSort > 0)
4854 {
4855 if (!sAreaTableStore.LookupEntry(qinfo->ZoneOrSort))
4856 {
4857 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} (zone case) but zone with this id does not exist.",
4858 qinfo->GetQuestId(), qinfo->ZoneOrSort);
4859 // no changes, quest not dependent from this value but can have problems at client
4860 }
4861 }
4862 // client quest log visual (sort case)
4863 if (qinfo->ZoneOrSort < 0)
4864 {
4865 QuestSortEntry const* qSort = sQuestSortStore.LookupEntry(-int32(qinfo->ZoneOrSort));
4866 if (!qSort)
4867 {
4868 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} (sort case) but quest sort 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 (note some may be 0, we must allow this so no check)
4871 }
4872 //check for proper RequiredSkillId value (skill case)
4873 if (uint32 skill_id = SkillByQuestSort(-int32(qinfo->ZoneOrSort)))
4874 {
4875 if (qinfo->RequiredSkillId != skill_id)
4876 {
4877 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} but `RequiredSkillId` does not have a corresponding value ({}).",
4878 qinfo->GetQuestId(), qinfo->ZoneOrSort, skill_id);
4879 //override, and force proper value here?
4880 }
4881 }
4882 }
4883
4884 // RequiredClasses, can be 0/CLASSMASK_ALL_PLAYABLE to allow any class
4885 if (qinfo->RequiredClasses)
4886 {
4888 {
4889 LOG_ERROR("sql.sql", "Quest {} does not contain any playable classes in `RequiredClasses` ({}), value set to 0 (all classes).", qinfo->GetQuestId(), qinfo->RequiredClasses);
4890 qinfo->RequiredClasses = 0;
4891 }
4892 }
4893 // AllowableRaces, can be 0/RACEMASK_ALL_PLAYABLE to allow any race
4894 if (qinfo->AllowableRaces)
4895 {
4896 if (!(qinfo->AllowableRaces & RACEMASK_ALL_PLAYABLE))
4897 {
4898 LOG_ERROR("sql.sql", "Quest {} does not contain any playable races in `AllowableRaces` ({}), value set to 0 (all races).", qinfo->GetQuestId(), qinfo->AllowableRaces);
4899 qinfo->AllowableRaces = 0;
4900 }
4901 }
4902 // RequiredSkillId, can be 0
4903 if (qinfo->RequiredSkillId)
4904 {
4905 if (!sSkillLineStore.LookupEntry(qinfo->RequiredSkillId))
4906 {
4907 LOG_ERROR("sql.sql", "Quest {} has `RequiredSkillId` = {} but this skill does not exist",
4908 qinfo->GetQuestId(), qinfo->RequiredSkillId);
4909 }
4910 }
4911
4912 if (qinfo->RequiredSkillPoints)
4913 {
4914 if (qinfo->RequiredSkillPoints > sWorld->GetConfigMaxSkillValue())
4915 {
4916 LOG_ERROR("sql.sql", "Quest {} has `RequiredSkillPoints` = {} but max possible skill is {}, quest can't be done.",
4917 qinfo->GetQuestId(), qinfo->RequiredSkillPoints, sWorld->GetConfigMaxSkillValue());
4918 // no changes, quest can't be done for this requirement
4919 }
4920 }
4921 // else Skill quests can have 0 skill level, this is ok
4922
4923 if (qinfo->RequiredFactionId2 && !sFactionStore.LookupEntry(qinfo->RequiredFactionId2))
4924 {
4925 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionId2` = {} but faction template {} does not exist, quest can't be done.",
4926 qinfo->GetQuestId(), qinfo->RequiredFactionId2, qinfo->RequiredFactionId2);
4927 // no changes, quest can't be done for this requirement
4928 }
4929
4930 if (qinfo->RequiredFactionId1 && !sFactionStore.LookupEntry(qinfo->RequiredFactionId1))
4931 {
4932 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionId1` = {} but faction template {} does not exist, quest can't be done.",
4933 qinfo->GetQuestId(), qinfo->RequiredFactionId1, qinfo->RequiredFactionId1);
4934 // no changes, quest can't be done for this requirement
4935 }
4936
4937 if (qinfo->RequiredMinRepFaction && !sFactionStore.LookupEntry(qinfo->RequiredMinRepFaction))
4938 {
4939 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepFaction` = {} but faction template {} does not exist, quest can't be done.",
4940 qinfo->GetQuestId(), qinfo->RequiredMinRepFaction, qinfo->RequiredMinRepFaction);
4941 // no changes, quest can't be done for this requirement
4942 }
4943
4944 if (qinfo->RequiredMaxRepFaction && !sFactionStore.LookupEntry(qinfo->RequiredMaxRepFaction))
4945 {
4946 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepFaction` = {} but faction template {} does not exist, quest can't be done.",
4947 qinfo->GetQuestId(), qinfo->RequiredMaxRepFaction, qinfo->RequiredMaxRepFaction);
4948 // no changes, quest can't be done for this requirement
4949 }
4950
4952 {
4953 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepValue` = {} but max reputation is {}, quest can't be done.",
4955 // no changes, quest can't be done for this requirement
4956 }
4957
4958 if (qinfo->RequiredMinRepValue && qinfo->RequiredMaxRepValue && qinfo->RequiredMaxRepValue <= qinfo->RequiredMinRepValue)
4959 {
4960 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepValue` = {} and `RequiredMinRepValue` = {}, quest can't be done.",
4961 qinfo->GetQuestId(), qinfo->RequiredMaxRepValue, qinfo->RequiredMinRepValue);
4962 // no changes, quest can't be done for this requirement
4963 }
4964
4965 if (!qinfo->RequiredFactionId1 && qinfo->RequiredFactionValue1 != 0)
4966 {
4967 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionValue1` = {} but `RequiredFactionId1` is 0, value has no effect",
4968 qinfo->GetQuestId(), qinfo->RequiredFactionValue1);
4969 // warning
4970 }
4971
4972 if (!qinfo->RequiredFactionId2 && qinfo->RequiredFactionValue2 != 0)
4973 {
4974 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionValue2` = {} but `RequiredFactionId2` is 0, value has no effect",
4975 qinfo->GetQuestId(), qinfo->RequiredFactionValue2);
4976 // warning
4977 }
4978
4979 if (!qinfo->RequiredMinRepFaction && qinfo->RequiredMinRepValue != 0)
4980 {
4981 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepValue` = {} but `RequiredMinRepFaction` is 0, value has no effect",
4982 qinfo->GetQuestId(), qinfo->RequiredMinRepValue);
4983 // warning
4984 }
4985
4986 if (!qinfo->RequiredMaxRepFaction && qinfo->RequiredMaxRepValue != 0)
4987 {
4988 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepValue` = {} but `RequiredMaxRepFaction` is 0, value has no effect",
4989 qinfo->GetQuestId(), qinfo->RequiredMaxRepValue);
4990 // warning
4991 }
4992
4993 if (qinfo->RewardTitleId && !sCharTitlesStore.LookupEntry(qinfo->RewardTitleId))
4994 {
4995 LOG_ERROR("sql.sql", "Quest {} has `RewardTitleId` = {} but CharTitle Id {} does not exist, quest can't be rewarded with title.",
4996 qinfo->GetQuestId(), qinfo->GetCharTitleId(), qinfo->GetCharTitleId());
4997 qinfo->RewardTitleId = 0;
4998 // quest can't reward this title
4999 }
5000
5001 if (qinfo->StartItem)
5002 {
5003 if (!GetItemTemplate(qinfo->StartItem))
5004 {
5005 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = {} but item with entry {} does not exist, quest can't be done.",
5006 qinfo->GetQuestId(), qinfo->StartItem, qinfo->StartItem);
5007 qinfo->StartItem = 0; // quest can't be done for this requirement
5008 }
5009 else if (qinfo->StartItemCount == 0)
5010 {
5011 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = {} but `StartItemCount` = 0, set to 1 but need fix in DB.",
5012 qinfo->GetQuestId(), qinfo->StartItem);
5013 qinfo->StartItemCount = 1; // update to 1 for allow quest work for backward compatibility with DB
5014 }
5015 }
5016 else if (qinfo->StartItemCount > 0)
5017 {
5018 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = 0 but `StartItemCount` = {}, useless value.",
5019 qinfo->GetQuestId(), qinfo->StartItemCount);
5020 qinfo->StartItemCount = 0; // no quest work changes in fact
5021 }
5022
5023 if (qinfo->SourceSpellid)
5024 {
5025 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->SourceSpellid);
5026 if (!spellInfo)
5027 {
5028 LOG_ERROR("sql.sql", "Quest {} has `SourceSpellid` = {} but spell {} doesn't exist, quest can't be done.",
5029 qinfo->GetQuestId(), qinfo->SourceSpellid, qinfo->SourceSpellid);
5030 qinfo->SourceSpellid = 0; // quest can't be done for this requirement
5031 }
5032 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5033 {
5034 LOG_ERROR("sql.sql", "Quest {} has `SourceSpellid` = {} but spell {} is broken, quest can't be done.",
5035 qinfo->GetQuestId(), qinfo->SourceSpellid, qinfo->SourceSpellid);
5036 qinfo->SourceSpellid = 0; // quest can't be done for this requirement
5037 }
5038 }
5039
5040 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
5041 {
5042 uint32 id = qinfo->RequiredItemId[j];
5043 if (id)
5044 {
5045 if (qinfo->RequiredItemCount[j] == 0)
5046 {
5047 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = {} but `RequiredItemCount{}` = 0, quest can't be done.",
5048 qinfo->GetQuestId(), j + 1, id, j + 1);
5049 // no changes, quest can't be done for this requirement
5050 }
5051
5053
5054 if (!GetItemTemplate(id))
5055 {
5056 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = {} but item with entry {} does not exist, quest can't be done.",
5057 qinfo->GetQuestId(), j + 1, id, id);
5058 qinfo->RequiredItemCount[j] = 0; // prevent incorrect work of quest
5059 }
5060 }
5061 else if (qinfo->RequiredItemCount[j] > 0)
5062 {
5063 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = 0 but `RequiredItemCount{}` = {}, quest can't be done.",
5064 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RequiredItemCount[j]);
5065 qinfo->RequiredItemCount[j] = 0; // prevent incorrect work of quest
5066 }
5067 }
5068
5069 for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
5070 {
5071 uint32 id = qinfo->ItemDrop[j];
5072 if (id)
5073 {
5074 if (!GetItemTemplate(id))
5075 {
5076 LOG_ERROR("sql.sql", "Quest {} has `ItemDrop{}` = {} but item with entry {} does not exist, quest can't be done.",
5077 qinfo->GetQuestId(), j + 1, id, id);
5078 // no changes, quest can't be done for this requirement
5079 }
5080 }
5081 else
5082 {
5083 if (qinfo->ItemDropQuantity[j] > 0)
5084 {
5085 LOG_ERROR("sql.sql", "Quest {} has `ItemDrop{}` = 0 but `ItemDropQuantity{}` = {}.",
5086 qinfo->GetQuestId(), j + 1, j + 1, qinfo->ItemDropQuantity[j]);
5087 // no changes, quest ignore this data
5088 }
5089 }
5090 }
5091
5092 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
5093 {
5094 int32 id = qinfo->RequiredNpcOrGo[j];
5095 if (id < 0 && !GetGameObjectTemplate(-id))
5096 {
5097 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but gameobject {} does not exist, quest can't be done.",
5098 qinfo->GetQuestId(), j + 1, id, uint32(-id));
5099 qinfo->RequiredNpcOrGo[j] = 0; // quest can't be done for this requirement
5100 }
5101
5102 if (id > 0 && !GetCreatureTemplate(id))
5103 {
5104 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but creature with entry {} does not exist, quest can't be done.",
5105 qinfo->GetQuestId(), j + 1, id, uint32(id));
5106 qinfo->RequiredNpcOrGo[j] = 0; // quest can't be done for this requirement
5107 }
5108
5109 if (id)
5110 {
5111 // In fact SpeakTo and Kill are quite same: either you can speak to mob:SpeakTo or you can't:Kill/Cast
5112
5114
5115 if (!qinfo->RequiredNpcOrGoCount[j])
5116 {
5117 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but `RequiredNpcOrGoCount{}` = 0, quest can't be done.",
5118 qinfo->GetQuestId(), j + 1, id, j + 1);
5119 // no changes, quest can be incorrectly done, but we already report this
5120 }
5121 }
5122 else if (qinfo->RequiredNpcOrGoCount[j] > 0)
5123 {
5124 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = 0 but `RequiredNpcOrGoCount{}` = {}.",
5125 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RequiredNpcOrGoCount[j]);
5126 // no changes, quest ignore this data
5127 }
5128 }
5129
5130 for (uint8 j = 0; j < QUEST_REWARD_CHOICES_COUNT; ++j)
5131 {
5132 uint32 id = qinfo->RewardChoiceItemId[j];
5133 if (id)
5134 {
5135 if (!GetItemTemplate(id))
5136 {
5137 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but item with entry {} does not exist, quest will not reward this item.",
5138 qinfo->GetQuestId(), j + 1, id, id);
5139 qinfo->RewardChoiceItemId[j] = 0; // no changes, quest will not reward this
5140 }
5141
5142 if (!qinfo->RewardChoiceItemCount[j])
5143 {
5144 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but `RewardChoiceItemCount{}` = 0, quest can't be done.",
5145 qinfo->GetQuestId(), j + 1, id, j + 1);
5146 // no changes, quest can't be done
5147 }
5148 }
5149 else if (qinfo->RewardChoiceItemCount[j] > 0)
5150 {
5151 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = 0 but `RewardChoiceItemCount{}` = {}.",
5152 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardChoiceItemCount[j]);
5153 // no changes, quest ignore this data
5154 }
5155 }
5156
5157 for (uint8 j = 0; j < QUEST_REWARDS_COUNT; ++j)
5158 {
5159 if (!qinfo->RewardItemId[0] && qinfo->RewardItemId[j])
5160 {
5161 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId1` but has `RewardItem{}`. Reward item will not be loaded.",
5162 qinfo->GetQuestId(), j + 1);
5163 }
5164 if (!qinfo->RewardItemId[1] && j > 1 && qinfo->RewardItemId[j])
5165 {
5166 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId2` but has `RewardItem{}`. Reward item will not be loaded.",
5167 qinfo->GetQuestId(), j + 1);
5168 }
5169 if (!qinfo->RewardItemId[2] && j > 2 && qinfo->RewardItemId[j])
5170 {
5171 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId3` but has `RewardItem{}`. Reward item will not be loaded.",
5172 qinfo->GetQuestId(), j + 1);
5173 }
5174 }
5175
5176 for (uint8 j = 0; j < QUEST_REWARDS_COUNT; ++j)
5177 {
5178 uint32 id = qinfo->RewardItemId[j];
5179 if (id)
5180 {
5181 if (!GetItemTemplate(id))
5182 {
5183 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = {} but item with entry {} does not exist, quest will not reward this item.",
5184 qinfo->GetQuestId(), j + 1, id, id);
5185 qinfo->RewardItemId[j] = 0; // no changes, quest will not reward this item
5186 }
5187
5188 if (!qinfo->RewardItemIdCount[j])
5189 {
5190 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = {} but `RewardItemIdCount{}` = 0, quest will not reward this item.",
5191 qinfo->GetQuestId(), j + 1, id, j + 1);
5192 // no changes
5193 }
5194 }
5195 else if (qinfo->RewardItemIdCount[j] > 0)
5196 {
5197 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = 0 but `RewardItemIdCount{}` = {}.",
5198 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardItemIdCount[j]);
5199 // no changes, quest ignore this data
5200 }
5201 }
5202
5203 for (uint8 j = 0; j < QUEST_REPUTATIONS_COUNT; ++j)
5204 {
5205 if (qinfo->RewardFactionId[j])
5206 {
5207 if (std::abs(qinfo->RewardFactionValueId[j]) > 9)
5208 {
5209 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]);
5210 }
5211 if (!sFactionStore.LookupEntry(qinfo->RewardFactionId[j]))
5212 {
5213 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]);
5214 qinfo->RewardFactionId[j] = 0; // quest will not reward this
5215 }
5216 }
5217
5218 else if (qinfo->RewardFactionValueIdOverride[j] != 0)
5219 {
5220 LOG_ERROR("sql.sql", "Quest {} has `RewardFactionId{}` = 0 but `RewardFactionValueIdOverride{}` = {}.",
5221 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardFactionValueIdOverride[j]);
5222 // no changes, quest ignore this data
5223 }
5224 }
5225
5226 if (qinfo->RewardDisplaySpell)
5227 {
5228 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardDisplaySpell);
5229
5230 if (!spellInfo)
5231 {
5232 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} does not exist, spell removed as display reward.",
5233 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5234 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5235 }
5236
5237 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5238 {
5239 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is broken, quest will not have a spell reward.",
5240 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5241 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5242 }
5243
5244 else if (GetTalentSpellCost(qinfo->RewardDisplaySpell))
5245 {
5246 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is talent, quest will not have a spell reward.",
5247 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5248 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5249 }
5250 }
5251
5252 if (qinfo->RewardSpell > 0)
5253 {
5254 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardSpell);
5255
5256 if (!spellInfo)
5257 {
5258 LOG_ERROR("sql.sql", "Quest {} has `RewardSpell` = {} but spell {} does not exist, quest will not have a spell reward.",
5259 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5260 qinfo->RewardSpell = 0; // no spell will be casted on player
5261 }
5262
5263 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5264 {
5265 LOG_ERROR("sql.sql", "Quest {} has `RewardSpell` = {} but spell {} is broken, quest will not have a spell reward.",
5266 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5267 qinfo->RewardSpell = 0; // no spell will be casted on player
5268 }
5269
5270 else if (GetTalentSpellCost(qinfo->RewardSpell))
5271 {
5272 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is talent, quest will not have a spell reward.",
5273 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5274 qinfo->RewardSpell = 0; // no spell will be casted on player
5275 }
5276 }
5277
5278 if (qinfo->RewardMailTemplateId)
5279 {
5280 if (!sMailTemplateStore.LookupEntry(qinfo->RewardMailTemplateId))
5281 {
5282 LOG_ERROR("sql.sql", "Quest {} has `RewardMailTemplateId` = {} but mail template {} does not exist, quest will not have a mail reward.",
5283 qinfo->GetQuestId(), qinfo->RewardMailTemplateId, qinfo->RewardMailTemplateId);
5284 qinfo->RewardMailTemplateId = 0; // no mail will send to player
5285 qinfo->RewardMailDelay = 0; // no mail will send to player
5286 qinfo->RewardMailSenderEntry = 0;
5287 }
5288 else if (usedMailTemplates.find(qinfo->RewardMailTemplateId) != usedMailTemplates.end())
5289 {
5290 std::map<uint32, uint32>::const_iterator used_mt_itr = usedMailTemplates.find(qinfo->RewardMailTemplateId);
5291 LOG_ERROR("sql.sql", "Quest {} has `RewardMailTemplateId` = {} but mail template {} already used for quest {}, quest will not have a mail reward.",
5292 qinfo->GetQuestId(), qinfo->RewardMailTemplateId, qinfo->RewardMailTemplateId, used_mt_itr->second);
5293 qinfo->RewardMailTemplateId = 0; // no mail will send to player
5294 qinfo->RewardMailDelay = 0; // no mail will send to player
5295 qinfo->RewardMailSenderEntry = 0;
5296 }
5297 else
5298 usedMailTemplates[qinfo->RewardMailTemplateId] = qinfo->GetQuestId();
5299 }
5300
5301 if (qinfo->RewardNextQuest)
5302 {
5303 QuestMap::iterator qNextItr = _questTemplates.find(qinfo->RewardNextQuest);
5304 if (qNextItr == _questTemplates.end())
5305 {
5306 LOG_ERROR("sql.sql", "Quest {} has `RewardNextQuest` = {} but quest {} does not exist, quest chain will not work.",
5307 qinfo->GetQuestId(), qinfo->RewardNextQuest, qinfo->RewardNextQuest);
5308 qinfo->RewardNextQuest = 0;
5309 }
5310 else
5311 qNextItr->second->prevChainQuests.push_back(qinfo->GetQuestId());
5312 }
5313
5314 // fill additional data stores
5315 if (qinfo->PrevQuestId)
5316 {
5317 if (_questTemplates.find(std::abs(qinfo->GetPrevQuestId())) == _questTemplates.end())
5318 {
5319 LOG_ERROR("sql.sql", "Quest {} has PrevQuestId {}, but no such quest", qinfo->GetQuestId(), qinfo->GetPrevQuestId());
5320 }
5321 else
5322 {
5323 qinfo->prevQuests.push_back(qinfo->PrevQuestId);
5324 }
5325 }
5326
5327 if (qinfo->NextQuestId)
5328 {
5329 QuestMap::iterator qNextItr = _questTemplates.find(qinfo->GetNextQuestId());
5330 if (qNextItr == _questTemplates.end())
5331 {
5332 LOG_ERROR("sql.sql", "Quest {} has NextQuestId {}, but no such quest", qinfo->GetQuestId(), qinfo->GetNextQuestId());
5333 }
5334 else
5335 qNextItr->second->prevQuests.push_back(static_cast<int32>(qinfo->GetQuestId()));
5336 }
5337
5338 if (qinfo->ExclusiveGroup)
5339 mExclusiveQuestGroups.insert(std::pair<int32, uint32>(qinfo->ExclusiveGroup, qinfo->GetQuestId()));
5340 if (qinfo->TimeAllowed)
5342 if (qinfo->RequiredPlayerKills)
5344 }
5345
5346 // check QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT for spell with SPELL_EFFECT_QUEST_COMPLETE
5347 for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
5348 {
5349 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i);
5350 if (!spellInfo)
5351 continue;
5352
5353 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
5354 {
5355 if (spellInfo->Effects[j].Effect != SPELL_EFFECT_QUEST_COMPLETE)
5356 continue;
5357
5358 uint32 quest_id = spellInfo->Effects[j].MiscValue;
5359
5360 Quest const* quest = GetQuestTemplate(quest_id);
5361
5362 // some quest referenced in spells not exist (outdated spells)
5363 if (!quest)
5364 continue;
5365
5367 {
5368 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);
5369
5370 // this will prevent quest completing without objective
5371 // xinef: remove this, leave error but do not break the quest
5372 // const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
5373 }
5374 }
5375 }
5376
5377 LOG_INFO("server.loading", ">> Loaded {} Quests Definitions in {} ms", (unsigned long)_questTemplates.size(), GetMSTimeDiffToNow(oldMSTime));
5378 LOG_INFO("server.loading", " ");
5379}
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:794
uint32 SkillByQuestSort(int32 QuestSort)
Definition SharedDefines.h:3279
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:8348
void LoadGameobjectQuestEnders()
Definition ObjectMgr.cpp:8320
void LoadGameobjectQuestStarters()
Definition ObjectMgr.cpp:8306
void LoadCreatureQuestStarters()
Definition ObjectMgr.cpp:8334

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

◆ LoadReferenceVendor()

int ObjectMgr::LoadReferenceVendor ( int32  vendor,
int32  item_id,
std::set< uint32 > *  skip_vendors 
)
9429{
9430 // find all items from the reference vendor
9432 stmt->SetData(0, uint32(item));
9433 PreparedQueryResult result = WorldDatabase.Query(stmt);
9434
9435 if (!result)
9436 return 0;
9437
9438 uint32 count = 0;
9439 do
9440 {
9441 Field* fields = result->Fetch();
9442
9443 int32 item_id = fields[0].Get<int32>();
9444
9445 // if item is a negative, its a reference
9446 if (item_id < 0)
9447 count += LoadReferenceVendor(vendor, -item_id, skip_vendors);
9448 else
9449 {
9450 int32 maxcount = fields[1].Get<uint8>();
9451 uint32 incrtime = fields[2].Get<uint32>();
9452 uint32 ExtendedCost = fields[3].Get<uint32>();
9453
9454 if (!IsVendorItemValid(vendor, item_id, maxcount, incrtime, ExtendedCost, nullptr, skip_vendors))
9455 continue;
9456
9457 VendorItemData& vList = _cacheVendorItemStore[vendor];
9458
9459 vList.AddItem(item_id, maxcount, incrtime, ExtendedCost);
9460 ++count;
9461 }
9462 } while (result->NextRow());
9463
9464 return count;
9465}
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:9668
int LoadReferenceVendor(int32 vendor, int32 item_id, std::set< uint32 > *skip_vendors)
Definition ObjectMgr.cpp:9428

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 ( )
7853{
7854 uint32 oldMSTime = getMSTime();
7855
7856 // For reload case
7857 _repOnKillStore.clear();
7858
7859 uint32 count = 0;
7860
7861 // 0 1 2
7862 QueryResult result = WorldDatabase.Query("SELECT creature_id, RewOnKillRepFaction1, RewOnKillRepFaction2, "
7863 // 3 4 5 6 7 8 9
7864 "IsTeamAward1, MaxStanding1, RewOnKillRepValue1, IsTeamAward2, MaxStanding2, RewOnKillRepValue2, TeamDependent "
7865 "FROM creature_onkill_reputation");
7866
7867 if (!result)
7868 {
7869 LOG_WARN("server.loading", ">> Loaded 0 creature award reputation definitions. DB table `creature_onkill_reputation` is empty.");
7870 LOG_INFO("server.loading", " ");
7871 return;
7872 }
7873
7874 do
7875 {
7876 Field* fields = result->Fetch();
7877
7878 uint32 creature_id = fields[0].Get<uint32>();
7879
7880 ReputationOnKillEntry repOnKill;
7881 repOnKill.RepFaction1 = fields[1].Get<int16>();
7882 repOnKill.RepFaction2 = fields[2].Get<int16>();
7883 repOnKill.IsTeamAward1 = fields[3].Get<bool>();
7884 repOnKill.ReputationMaxCap1 = fields[4].Get<uint8>();
7885 repOnKill.RepValue1 = fields[5].Get<float>();
7886 repOnKill.IsTeamAward2 = fields[6].Get<bool>();
7887 repOnKill.ReputationMaxCap2 = fields[7].Get<uint8>();
7888 repOnKill.RepValue2 = fields[8].Get<float>();
7889 repOnKill.TeamDependent = fields[9].Get<uint8>();
7890
7891 if (!GetCreatureTemplate(creature_id))
7892 {
7893 LOG_ERROR("sql.sql", "Table `creature_onkill_reputation` have data for not existed creature entry ({}), skipped", creature_id);
7894 continue;
7895 }
7896
7897 if (repOnKill.RepFaction1)
7898 {
7899 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(repOnKill.RepFaction1);
7900 if (!factionEntry1)
7901 {
7902 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `creature_onkill_reputation`", repOnKill.RepFaction1);
7903 continue;
7904 }
7905 }
7906
7907 if (repOnKill.RepFaction2)
7908 {
7909 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(repOnKill.RepFaction2);
7910 if (!factionEntry2)
7911 {
7912 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `creature_onkill_reputation`", repOnKill.RepFaction2);
7913 continue;
7914 }
7915 }
7916
7917 _repOnKillStore[creature_id] = repOnKill;
7918
7919 ++count;
7920 } while (result->NextRow());
7921
7922 LOG_INFO("server.loading", ">> Loaded {} Creature Award Reputation Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7923 LOG_INFO("server.loading", " ");
7924}
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 ( )
7765{
7766 uint32 oldMSTime = getMSTime();
7767
7768 _repRewardRateStore.clear(); // for reload case
7769
7770 uint32 count = 0; // 0 1 2 3 4 5 6 7
7771 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");
7772 if (!result)
7773 {
7774 LOG_INFO("server.loading", ">> Loaded `reputation_reward_rate`, table is empty!");
7775 return;
7776 }
7777
7778 do
7779 {
7780 Field* fields = result->Fetch();
7781
7782 uint32 factionId = fields[0].Get<uint32>();
7783
7784 RepRewardRate repRate;
7785
7786 repRate.questRate = fields[1].Get<float>();
7787 repRate.questDailyRate = fields[2].Get<float>();
7788 repRate.questWeeklyRate = fields[3].Get<float>();
7789 repRate.questMonthlyRate = fields[4].Get<float>();
7790 repRate.questRepeatableRate = fields[5].Get<float>();
7791 repRate.creatureRate = fields[6].Get<float>();
7792 repRate.spellRate = fields[7].Get<float>();
7793
7794 FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
7795 if (!factionEntry)
7796 {
7797 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_reward_rate`", factionId);
7798 continue;
7799 }
7800
7801 if (repRate.questRate < 0.0f)
7802 {
7803 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_rate with invalid rate {}, skipping data for faction {}", repRate.questRate, factionId);
7804 continue;
7805 }
7806
7807 if (repRate.questDailyRate < 0.0f)
7808 {
7809 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_daily_rate with invalid rate {}, skipping data for faction {}", repRate.questDailyRate, factionId);
7810 continue;
7811 }
7812
7813 if (repRate.questWeeklyRate < 0.0f)
7814 {
7815 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_weekly_rate with invalid rate {}, skipping data for faction {}", repRate.questWeeklyRate, factionId);
7816 continue;
7817 }
7818
7819 if (repRate.questMonthlyRate < 0.0f)
7820 {
7821 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_monthly_rate with invalid rate {}, skipping data for faction {}", repRate.questMonthlyRate, factionId);
7822 continue;
7823 }
7824
7825 if (repRate.questRepeatableRate < 0.0f)
7826 {
7827 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_repeatable_rate with invalid rate {}, skipping data for faction {}", repRate.questRepeatableRate, factionId);
7828 continue;
7829 }
7830
7831 if (repRate.creatureRate < 0.0f)
7832 {
7833 LOG_ERROR("sql.sql", "Table reputation_reward_rate has creature_rate with invalid rate {}, skipping data for faction {}", repRate.creatureRate, factionId);
7834 continue;
7835 }
7836
7837 if (repRate.spellRate < 0.0f)
7838 {
7839 LOG_ERROR("sql.sql", "Table reputation_reward_rate has spell_rate with invalid rate {}, skipping data for faction {}", repRate.spellRate, factionId);
7840 continue;
7841 }
7842
7843 _repRewardRateStore[factionId] = repRate;
7844
7845 ++count;
7846 } while (result->NextRow());
7847
7848 LOG_INFO("server.loading", ">> Loaded {} Reputation Reward Rate in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7849 LOG_INFO("server.loading", " ");
7850}
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 ( )
7927{
7928 uint32 oldMSTime = getMSTime();
7929
7930 _repSpilloverTemplateStore.clear(); // for reload case
7931
7932 uint32 count = 0; // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
7933 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");
7934
7935 if (!result)
7936 {
7937 LOG_INFO("server.loading", ">> Loaded `reputation_spillover_template`, table is empty.");
7938 LOG_INFO("server.loading", " ");
7939 return;
7940 }
7941
7942 do
7943 {
7944 Field* fields = result->Fetch();
7945
7946 uint32 factionId = fields[0].Get<uint16>();
7947
7948 RepSpilloverTemplate repTemplate;
7949
7950 repTemplate.faction[0] = fields[1].Get<uint16>();
7951 repTemplate.faction_rate[0] = fields[2].Get<float>();
7952 repTemplate.faction_rank[0] = fields[3].Get<uint8>();
7953 repTemplate.faction[1] = fields[4].Get<uint16>();
7954 repTemplate.faction_rate[1] = fields[5].Get<float>();
7955 repTemplate.faction_rank[1] = fields[6].Get<uint8>();
7956 repTemplate.faction[2] = fields[7].Get<uint16>();
7957 repTemplate.faction_rate[2] = fields[8].Get<float>();
7958 repTemplate.faction_rank[2] = fields[9].Get<uint8>();
7959 repTemplate.faction[3] = fields[10].Get<uint16>();
7960 repTemplate.faction_rate[3] = fields[11].Get<float>();
7961 repTemplate.faction_rank[3] = fields[12].Get<uint8>();
7962 repTemplate.faction[4] = fields[13].Get<uint16>();
7963 repTemplate.faction_rate[4] = fields[14].Get<float>();
7964 repTemplate.faction_rank[4] = fields[15].Get<uint8>();
7965 repTemplate.faction[5] = fields[16].Get<uint16>();
7966 repTemplate.faction_rate[5] = fields[17].Get<float>();
7967 repTemplate.faction_rank[5] = fields[18].Get<uint8>();
7968
7969 FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
7970
7971 if (!factionEntry)
7972 {
7973 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", factionId);
7974 continue;
7975 }
7976
7977 if (factionEntry->team == 0)
7978 {
7979 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} in `reputation_spillover_template` does not belong to any team, skipping", factionId);
7980 continue;
7981 }
7982
7983 for (uint32 i = 0; i < MAX_SPILLOVER_FACTIONS; ++i)
7984 {
7985 if (repTemplate.faction[i])
7986 {
7987 FactionEntry const* factionSpillover = sFactionStore.LookupEntry(repTemplate.faction[i]);
7988
7989 if (!factionSpillover)
7990 {
7991 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);
7992 continue;
7993 }
7994
7995 if (factionSpillover->reputationListID < 0)
7996 {
7997 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);
7998 continue;
7999 }
8000
8001 if (repTemplate.faction_rank[i] >= MAX_REPUTATION_RANK)
8002 {
8003 LOG_ERROR("sql.sql", "Rank {} used in `reputation_spillover_template` for spillover faction {} is not valid, skipping", repTemplate.faction_rank[i], repTemplate.faction[i]);
8004 continue;
8005 }
8006 }
8007 }
8008
8009 FactionEntry const* factionEntry0 = sFactionStore.LookupEntry(repTemplate.faction[0]);
8010 if (repTemplate.faction[0] && !factionEntry0)
8011 {
8012 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[0]);
8013 continue;
8014 }
8015 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(repTemplate.faction[1]);
8016 if (repTemplate.faction[1] && !factionEntry1)
8017 {
8018 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[1]);
8019 continue;
8020 }
8021 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(repTemplate.faction[2]);
8022 if (repTemplate.faction[2] && !factionEntry2)
8023 {
8024 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[2]);
8025 continue;
8026 }
8027 FactionEntry const* factionEntry3 = sFactionStore.LookupEntry(repTemplate.faction[3]);
8028 if (repTemplate.faction[3] && !factionEntry3)
8029 {
8030 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[3]);
8031 continue;
8032 }
8033
8034 _repSpilloverTemplateStore[factionId] = repTemplate;
8035
8036 ++count;
8037 } while (result->NextRow());
8038
8039 LOG_INFO("server.loading", ">> Loaded {} Reputation Spillover Template in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8040 LOG_INFO("server.loading", " ");
8041}
#define MAX_SPILLOVER_FACTIONS
Definition SharedDefines.h:247
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 ( )
8363{
8364 uint32 oldMSTime = getMSTime();
8365
8366 _reservedNamesStore.clear(); // need for reload case
8367
8368 QueryResult result = CharacterDatabase.Query("SELECT name FROM reserved_name");
8369
8370 if (!result)
8371 {
8372 LOG_WARN("server.loading", ">> Loaded 0 reserved names. DB table `reserved_name` is empty!");
8373 return;
8374 }
8375
8376 uint32 count = 0;
8377
8378 Field* fields;
8379 do
8380 {
8381 fields = result->Fetch();
8382 std::string name = fields[0].Get<std::string>();
8383
8384 std::wstring wstr;
8385 if (!Utf8toWStr (name, wstr))
8386 {
8387 LOG_ERROR("sql.sql", "Table `reserved_name` have invalid name: {}", name);
8388 continue;
8389 }
8390
8391 wstrToLower(wstr);
8392
8393 _reservedNamesStore.insert(wstr);
8394 ++count;
8395 } while (result->NextRow());
8396
8397 LOG_INFO("server.loading", ">> Loaded {} reserved names from DB in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8398}

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

◆ LoadReservedPlayerNamesDBC()

void ObjectMgr::LoadReservedPlayerNamesDBC ( )
8401{
8402 if (!sWorld->getBoolConfig(CONFIG_STRICT_NAMES_RESERVED))
8403 {
8404 LOG_WARN("server.loading", ">> Loaded 0 reserved names from DBC. Config option disabled.");
8405 return;
8406 }
8407
8408 uint32 oldMSTime = getMSTime();
8409
8410 uint32 count = 0;
8411
8412 for (NamesReservedEntry const* reservedStore : sNamesReservedStore)
8413 {
8414 std::wstring wstr;
8415
8416 Utf8toWStr(reservedStore->Pattern, wstr);
8417
8418 // DBC does not have clean entries, remove the junk.
8419 boost::algorithm::replace_all(wstr, "\\<", "");
8420 boost::algorithm::replace_all(wstr, "\\>", "");
8421
8422 _reservedNamesStore.insert(wstr);
8423 count++;
8424 }
8425
8426 LOG_INFO("server.loading", ">> Loaded {} reserved names from DBC in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8427 LOG_INFO("server.loading", " ");
8428}
DBCStorage< NamesReservedEntry > sNamesReservedStore(NamesReservedfmt)
@ CONFIG_STRICT_NAMES_RESERVED
Definition WorldConfig.h:138
Definition DBCStructure.h:1399

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

◆ LoadScriptNames()

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

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

◆ LoadScripts()

void ObjectMgr::LoadScripts ( ScriptsType  type)
private
5418{
5419 uint32 oldMSTime = getMSTime();
5420
5421 ScriptMapMap* scripts = GetScriptsMapByType(type);
5422 if (!scripts)
5423 return;
5424
5425 std::string tableName = GetScriptsTableNameByType(type);
5426 if (tableName.empty())
5427 return;
5428
5429 if (sScriptMgr->IsScriptScheduled()) // function cannot be called when scripts are in use.
5430 return;
5431
5432 LOG_INFO("server.loading", "Loading {}...", tableName);
5433
5434 scripts->clear(); // need for reload support
5435
5436 bool isSpellScriptTable = (type == SCRIPTS_SPELL);
5437 // 0 1 2 3 4 5 6 7 8 9
5438 QueryResult result = WorldDatabase.Query("SELECT id, delay, command, datalong, datalong2, dataint, x, y, z, o{} FROM {}", isSpellScriptTable ? ", effIndex" : "", tableName);
5439
5440 if (!result)
5441 {
5442 LOG_WARN("server.loading", ">> Loaded 0 script definitions. DB table `{}` is empty!", tableName);
5443 LOG_INFO("server.loading", " ");
5444 return;
5445 }
5446
5447 uint32 count = 0;
5448
5449 do
5450 {
5451 Field* fields = result->Fetch();
5452 ScriptInfo tmp;
5453 tmp.type = type;
5454 tmp.id = fields[0].Get<uint32>();
5455 if (isSpellScriptTable)
5456 tmp.id |= fields[10].Get<uint8>() << 24;
5457 tmp.delay = fields[1].Get<uint32>();
5458 tmp.command = ScriptCommands(fields[2].Get<uint32>());
5459 tmp.Raw.nData[0] = fields[3].Get<uint32>();
5460 tmp.Raw.nData[1] = fields[4].Get<uint32>();
5461 tmp.Raw.nData[2] = fields[5].Get<int32>();
5462 tmp.Raw.fData[0] = fields[6].Get<float>();
5463 tmp.Raw.fData[1] = fields[7].Get<float>();
5464 tmp.Raw.fData[2] = fields[8].Get<float>();
5465 tmp.Raw.fData[3] = fields[9].Get<float>();
5466
5467 // generic command args check
5468 switch (tmp.command)
5469 {
5471 {
5473 {
5474 LOG_ERROR("sql.sql", "Table `{}` has invalid talk type (datalong = {}) in SCRIPT_COMMAND_TALK for script id {}",
5475 tableName, tmp.Talk.ChatType, tmp.id);
5476 continue;
5477 }
5479 {
5480 LOG_ERROR("sql.sql", "Table `{}` has invalid talk text id (dataint = {}) in SCRIPT_COMMAND_TALK for script id {}",
5481 tableName, tmp.Talk.TextID, tmp.id);
5482 continue;
5483 }
5484 break;
5485 }
5486
5488 {
5489 if (!sEmotesStore.LookupEntry(tmp.Emote.EmoteID))
5490 {
5491 LOG_ERROR("sql.sql", "Table `{}` has invalid emote id (datalong = {}) in SCRIPT_COMMAND_EMOTE for script id {}",
5492 tableName, tmp.Emote.EmoteID, tmp.id);
5493 continue;
5494 }
5495 break;
5496 }
5497
5499 {
5500 if (!sMapStore.LookupEntry(tmp.TeleportTo.MapID))
5501 {
5502 LOG_ERROR("sql.sql", "Table `{}` has invalid map (Id: {}) in SCRIPT_COMMAND_TELEPORT_TO for script id {}",
5503 tableName, tmp.TeleportTo.MapID, tmp.id);
5504 continue;
5505 }
5506
5508 {
5509 LOG_ERROR("sql.sql", "Table `{}` has invalid coordinates (X: {} Y: {} Z: {} O: {}) in SCRIPT_COMMAND_TELEPORT_TO for script id {}",
5510 tableName, tmp.TeleportTo.DestX, tmp.TeleportTo.DestY, tmp.TeleportTo.DestZ, tmp.TeleportTo.Orientation, tmp.id);
5511 continue;
5512 }
5513 break;
5514 }
5515
5517 {
5518 Quest const* quest = GetQuestTemplate(tmp.QuestExplored.QuestID);
5519 if (!quest)
5520 {
5521 LOG_ERROR("sql.sql", "Table `{}` has invalid quest (ID: {}) in SCRIPT_COMMAND_QUEST_EXPLORED in `datalong` for script id {}",
5522 tableName, tmp.QuestExplored.QuestID, tmp.id);
5523 continue;
5524 }
5525
5527 {
5528 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.",
5529 tableName, tmp.QuestExplored.QuestID, tmp.id);
5530
5531 // this will prevent quest completing without objective
5532 const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
5533
5534 // continue; - quest objective requirement set and command can be allowed
5535 }
5536
5538 {
5539 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 {}",
5540 tableName, tmp.QuestExplored.Distance, tmp.id);
5541 continue;
5542 }
5543
5545 {
5546 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",
5548 continue;
5549 }
5550
5552 {
5553 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",
5554 tableName, tmp.QuestExplored.Distance, tmp.id, INTERACTION_DISTANCE);
5555 continue;
5556 }
5557
5558 break;
5559 }
5560
5562 {
5564 {
5565 LOG_ERROR("sql.sql", "Table `{}` has invalid creature (Entry: {}) in SCRIPT_COMMAND_KILL_CREDIT for script id {}",
5566 tableName, tmp.KillCredit.CreatureEntry, tmp.id);
5567 continue;
5568 }
5569 break;
5570 }
5571
5573 {
5575 if (!data)
5576 {
5577 LOG_ERROR("sql.sql", "Table `{}` has invalid gameobject (GUID: {}) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5578 tableName, tmp.RespawnGameobject.GOGuid, tmp.id);
5579 continue;
5580 }
5581
5582 GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
5583 if (!info)
5584 {
5585 LOG_ERROR("sql.sql", "Table `{}` has gameobject with invalid entry (GUID: {} Entry: {}) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5586 tableName, tmp.RespawnGameobject.GOGuid, data->id, tmp.id);
5587 continue;
5588 }
5589
5590 if (info->type == GAMEOBJECT_TYPE_FISHINGNODE ||
5592 info->type == GAMEOBJECT_TYPE_DOOR ||
5593 info->type == GAMEOBJECT_TYPE_BUTTON ||
5594 info->type == GAMEOBJECT_TYPE_TRAP)
5595 {
5596 LOG_ERROR("sql.sql", "Table `{}` have gameobject type ({}) unsupported by command SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5597 tableName, info->entry, tmp.id);
5598 continue;
5599 }
5600 break;
5601 }
5602
5604 {
5606 {
5607 LOG_ERROR("sql.sql", "Table `{}` has invalid coordinates (X: {} Y: {} Z: {} O: {}) in SCRIPT_COMMAND_TEMP_SUMMON_CREATURE for script id {}",
5609 continue;
5610 }
5611
5613 if (!GetCreatureTemplate(entry))
5614 {
5615 LOG_ERROR("sql.sql", "Table `{}` has invalid creature (Entry: {}) in SCRIPT_COMMAND_TEMP_SUMMON_CREATURE for script id {}",
5616 tableName, tmp.TempSummonCreature.CreatureEntry, tmp.id);
5617 continue;
5618 }
5619 break;
5620 }
5621
5624 {
5626 if (!data)
5627 {
5628 LOG_ERROR("sql.sql", "Table `{}` has invalid gameobject (GUID: {}) in {} for script id {}",
5629 tableName, tmp.ToggleDoor.GOGuid, GetScriptCommandName(tmp.command), tmp.id);
5630 continue;
5631 }
5632
5633 GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
5634 if (!info)
5635 {
5636 LOG_ERROR("sql.sql", "Table `{}` has gameobject with invalid entry (GUID: {} Entry: {}) in {} for script id {}",
5637 tableName, tmp.ToggleDoor.GOGuid, data->id, GetScriptCommandName(tmp.command), tmp.id);
5638 continue;
5639 }
5640
5641 if (info->type != GAMEOBJECT_TYPE_DOOR)
5642 {
5643 LOG_ERROR("sql.sql", "Table `{}` has gameobject type ({}) non supported by command {} for script id {}",
5644 tableName, info->entry, GetScriptCommandName(tmp.command), tmp.id);
5645 continue;
5646 }
5647
5648 break;
5649 }
5650
5652 {
5653 if (!sSpellMgr->GetSpellInfo(tmp.RemoveAura.SpellID))
5654 {
5655 LOG_ERROR("sql.sql", "Table `{}` using non-existent spell (id: {}) in SCRIPT_COMMAND_REMOVE_AURA for script id {}",
5656 tableName, tmp.RemoveAura.SpellID, tmp.id);
5657 continue;
5658 }
5659 if (tmp.RemoveAura.Flags & ~0x1) // 1 bits (0, 1)
5660 {
5661 LOG_ERROR("sql.sql", "Table `{}` using unknown flags in datalong2 ({}) in SCRIPT_COMMAND_REMOVE_AURA for script id {}",
5662 tableName, tmp.RemoveAura.Flags, tmp.id);
5663 continue;
5664 }
5665 break;
5666 }
5667
5669 {
5670 if (!sSpellMgr->GetSpellInfo(tmp.CastSpell.SpellID))
5671 {
5672 LOG_ERROR("sql.sql", "Table `{}` using non-existent spell (id: {}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5673 tableName, tmp.CastSpell.SpellID, tmp.id);
5674 continue;
5675 }
5676 if (tmp.CastSpell.Flags > 4) // targeting type
5677 {
5678 LOG_ERROR("sql.sql", "Table `{}` using unknown target in datalong2 ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5679 tableName, tmp.CastSpell.Flags, tmp.id);
5680 continue;
5681 }
5682 if (tmp.CastSpell.Flags != 4 && tmp.CastSpell.CreatureEntry & ~0x1) // 1 bit (0, 1)
5683 {
5684 LOG_ERROR("sql.sql", "Table `{}` using unknown flags in dataint ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5685 tableName, tmp.CastSpell.CreatureEntry, tmp.id);
5686 continue;
5687 }
5688 else if (tmp.CastSpell.Flags == 4 && !GetCreatureTemplate(tmp.CastSpell.CreatureEntry))
5689 {
5690 LOG_ERROR("sql.sql", "Table `{}` using invalid creature entry in dataint ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5691 tableName, tmp.CastSpell.CreatureEntry, tmp.id);
5692 continue;
5693 }
5694 break;
5695 }
5696
5698 {
5700 {
5701 LOG_ERROR("sql.sql", "Table `{}` has nonexistent item (entry: {}) in SCRIPT_COMMAND_CREATE_ITEM for script id {}",
5702 tableName, tmp.CreateItem.ItemEntry, tmp.id);
5703 continue;
5704 }
5705 if (!tmp.CreateItem.Amount)
5706 {
5707 LOG_ERROR("sql.sql", "Table `{}` SCRIPT_COMMAND_CREATE_ITEM but amount is {} for script id {}",
5708 tableName, tmp.CreateItem.Amount, tmp.id);
5709 continue;
5710 }
5711 break;
5712 }
5713 default:
5714 break;
5715 }
5716
5717 if (scripts->find(tmp.id) == scripts->end())
5718 {
5719 ScriptMap emptyMap;
5720 (*scripts)[tmp.id] = emptyMap;
5721 }
5722 (*scripts)[tmp.id].insert(std::pair<uint32, ScriptInfo>(tmp.delay, tmp));
5723
5724 ++count;
5725 } while (result->NextRow());
5726
5727 LOG_INFO("server.loading", ">> Loaded {} script definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5728 LOG_INFO("server.loading", " ");
5729}
@ CHAT_TYPE_WHISPER
Definition CreatureData.h:425
#define DEFAULT_VISIBILITY_DISTANCE
Definition ObjectDefines.h:40
#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:1577
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3433
Definition ObjectMgr.h:190
float Orientation
Definition ObjectMgr.h:250
struct ScriptInfo::@266::@277 RespawnGameobject
uint32 Flags
Definition ObjectMgr.h:207
ScriptsType type
Definition ObjectMgr.h:191
uint32 QuestID
Definition ObjectMgr.h:255
int32 TextID
Definition ObjectMgr.h:208
struct ScriptInfo::@266::@279 ToggleDoor
struct ScriptInfo::@266::@281 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::@266::@268 Raw
struct ScriptInfo::@266::@269 Talk
uint32 delay
Definition ObjectMgr.h:193
struct ScriptInfo::@266::@270 Emote
float fData[4]
Definition ObjectMgr.h:201
struct ScriptInfo::@266::@280 RemoveAura
struct ScriptInfo::@266::@274 TeleportTo
float PosY
Definition ObjectMgr.h:278
ScriptCommands command
Definition ObjectMgr.h:194
float DestY
Definition ObjectMgr.h:230
struct ScriptInfo::@266::@275 QuestExplored
uint32 MapID
Definition ObjectMgr.h:243
uint32 nData[3]
Definition ObjectMgr.h:200
float PosZ
Definition ObjectMgr.h:279
struct ScriptInfo::@266::@283 CreateItem
float PosX
Definition ObjectMgr.h:277
uint32 Distance
Definition ObjectMgr.h:256
struct ScriptInfo::@266::@276 KillCredit
uint32 SpellID
Definition ObjectMgr.h:294
float DestZ
Definition ObjectMgr.h:231
uint32 GOGuid
Definition ObjectMgr.h:267
uint32 CreatureEntry
Definition ObjectMgr.h:261
uint32 Amount
Definition ObjectMgr.h:317
struct ScriptInfo::@266::@278 TempSummonCreature
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 ( )
5831{
5832 uint32 oldMSTime = getMSTime();
5833
5834 _spellScriptsStore.clear(); // need for reload case
5835
5836 QueryResult result = WorldDatabase.Query("SELECT spell_id, ScriptName FROM spell_script_names");
5837
5838 if (!result)
5839 {
5840 LOG_WARN("server.loading", ">> Loaded 0 spell script names. DB table `spell_script_names` is empty!");
5841 LOG_INFO("server.loading", " ");
5842 return;
5843 }
5844
5845 uint32 count = 0;
5846
5847 do
5848 {
5849 Field* fields = result->Fetch();
5850
5851 int32 spellId = fields[0].Get<int32>();
5852 std::string scriptName = fields[1].Get<std::string>();
5853
5854 bool allRanks = false;
5855 if (spellId <= 0)
5856 {
5857 allRanks = true;
5858 spellId = -spellId;
5859 }
5860
5861 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
5862 if (!spellInfo)
5863 {
5864 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) does not exist in `Spell.dbc`.", scriptName, fields[0].Get<int32>());
5865 continue;
5866 }
5867
5868 if (allRanks)
5869 {
5870 if (sSpellMgr->GetFirstSpellInChain(spellId) != uint32(spellId))
5871 {
5872 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) is not first rank of spell.", scriptName, fields[0].Get<int32>());
5873 continue;
5874 }
5875 while (spellInfo)
5876 {
5877 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
5878 spellInfo = spellInfo->GetNextRankSpell();
5879 }
5880 }
5881 else
5882 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
5883 ++count;
5884 } while (result->NextRow());
5885
5886 LOG_INFO("server.loading", ">> Loaded {} spell script names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5887 LOG_INFO("server.loading", " ");
5888}
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 ( )
5732{
5734
5735 // check ids
5736 for (ScriptMapMap::const_iterator itr = sSpellScripts.begin(); itr != sSpellScripts.end(); ++itr)
5737 {
5738 uint32 spellId = uint32(itr->first) & 0x00FFFFFF;
5739 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
5740
5741 if (!spellInfo)
5742 {
5743 LOG_ERROR("sql.sql", "Table `spell_scripts` has not existing spell (Id: {}) as script id", spellId);
5744 continue;
5745 }
5746
5747 SpellEffIndex i = SpellEffIndex((uint32(itr->first) >> 24) & 0x000000FF);
5748 if (uint32(i) >= MAX_SPELL_EFFECTS)
5749 {
5750 LOG_ERROR("sql.sql", "Table `spell_scripts` has too high effect index {} for spell (Id: {}) as script id", uint32(i), spellId);
5751 }
5752
5753 //check for correct spellEffect
5754 if (!spellInfo->Effects[i].Effect || (spellInfo->Effects[i].Effect != SPELL_EFFECT_SCRIPT_EFFECT && spellInfo->Effects[i].Effect != SPELL_EFFECT_DUMMY))
5755 LOG_ERROR("sql.sql", "Table `spell_scripts` - spell {} effect {} is not SPELL_EFFECT_SCRIPT_EFFECT or SPELL_EFFECT_DUMMY", spellId, uint32(i));
5756 }
5757}
ScriptMapMap sSpellScripts
Definition ObjectMgr.cpp:59
SpellEffIndex
Definition SharedDefines.h:30
@ SPELL_EFFECT_DUMMY
Definition SharedDefines.h:781
@ SPELL_EFFECT_SCRIPT_EFFECT
Definition SharedDefines.h:855

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

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

◆ LoadTempSummons()

void ObjectMgr::LoadTempSummons ( )
2154{
2155 uint32 oldMSTime = getMSTime();
2156
2157 // 0 1 2 3 4 5 6 7 8 9
2158 QueryResult result = WorldDatabase.Query("SELECT summonerId, summonerType, groupId, entry, position_x, position_y, position_z, orientation, summonType, summonTime FROM creature_summon_groups");
2159
2160 if (!result)
2161 {
2162 LOG_WARN("server.loading", ">> Loaded 0 temp summons. DB table `creature_summon_groups` is empty.");
2163 return;
2164 }
2165
2166 uint32 count = 0;
2167 do
2168 {
2169 Field* fields = result->Fetch();
2170
2171 uint32 summonerId = fields[0].Get<uint32>();
2172 SummonerType summonerType = SummonerType(fields[1].Get<uint8>());
2173 uint8 group = fields[2].Get<uint8>();
2174
2175 switch (summonerType)
2176 {
2178 if (!GetCreatureTemplate(summonerId))
2179 {
2180 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has summoner with non existing entry {} for creature summoner type, skipped.", summonerId);
2181 continue;
2182 }
2183 break;
2185 if (!GetGameObjectTemplate(summonerId))
2186 {
2187 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has summoner with non existing entry {} for gameobject summoner type, skipped.", summonerId);
2188 continue;
2189 }
2190 break;
2191 case SUMMONER_TYPE_MAP:
2192 if (!sMapStore.LookupEntry(summonerId))
2193 {
2194 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has summoner with non existing entry {} for map summoner type, skipped.", summonerId);
2195 continue;
2196 }
2197 break;
2198 default:
2199 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has unhandled summoner type {} for summoner {}, skipped.", summonerType, summonerId);
2200 continue;
2201 }
2202
2203 TempSummonData data;
2204 data.entry = fields[3].Get<uint32>();
2205
2206 if (!GetCreatureTemplate(data.entry))
2207 {
2208 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has creature in group [Summoner ID: {}, Summoner Type: {}, Group ID: {}] with non existing creature entry {}, skipped.", summonerId, summonerType, group, data.entry);
2209 continue;
2210 }
2211
2212 float posX = fields[4].Get<float>();
2213 float posY = fields[5].Get<float>();
2214 float posZ = fields[6].Get<float>();
2215 float orientation = fields[7].Get<float>();
2216
2217 data.pos.Relocate(posX, posY, posZ, orientation);
2218
2219 data.type = TempSummonType(fields[8].Get<uint8>());
2220
2222 {
2223 LOG_ERROR("sql.sql", "Table `creature_summon_groups` has unhandled temp summon type {} in group [Summoner ID: {}, Summoner Type: {}, Group ID: {}] for creature entry {}, skipped.", data.type, summonerId, summonerType, group, data.entry);
2224 continue;
2225 }
2226
2227 data.time = fields[9].Get<uint32>();
2228
2229 TempSummonGroupKey key(summonerId, summonerType, group);
2230 _tempSummonDataStore[key].push_back(data);
2231
2232 ++count;
2233 } while (result->NextRow());
2234
2235 LOG_INFO("server.loading", ">> Loaded {} Temporary Summons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2236 LOG_INFO("server.loading", " ");
2237}
TempSummonType
Definition Object.h:46
@ TEMPSUMMON_MANUAL_DESPAWN
Definition Object.h:54
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 ( )
9388{
9389 uint32 oldMSTime = getMSTime();
9390
9391 // For reload case
9393
9394 QueryResult result = WorldDatabase.Query("SELECT b.ID, a.SpellID, a.MoneyCost, a.ReqSkillLine, a.ReqSkillRank, a.ReqLevel, a.ReqSpell FROM npc_trainer AS a "
9395 "INNER JOIN npc_trainer AS b ON a.ID = -(b.SpellID) "
9396 "UNION SELECT * FROM npc_trainer WHERE SpellID > 0");
9397
9398 if (!result)
9399 {
9400 LOG_WARN("server.loading", ">> Loaded 0 Trainers. DB table `npc_trainer` is empty!");
9401 LOG_INFO("server.loading", " ");
9402 return;
9403 }
9404
9405 uint32 count = 0;
9406
9407 do
9408 {
9409 Field* fields = result->Fetch();
9410
9411 uint32 entry = fields[0].Get<uint32>();
9412 uint32 spell = fields[1].Get<uint32>();
9413 uint32 spellCost = fields[2].Get<uint32>();
9414 uint32 reqSkill = fields[3].Get<uint16>();
9415 uint32 reqSkillValue = fields[4].Get<uint16>();
9416 uint32 reqLevel = fields[5].Get<uint8>();
9417 uint32 reqSpell = fields[6].Get<uint32>();
9418
9419 AddSpellToTrainer(entry, spell, spellCost, reqSkill, reqSkillValue, reqLevel, reqSpell);
9420
9421 ++count;
9422 } while (result->NextRow());
9423
9424 LOG_INFO("server.loading", ">> Loaded {} Trainers in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9425 LOG_INFO("server.loading", " ");
9426}
void AddSpellToTrainer(uint32 entry, uint32 spell, uint32 spellCost, uint32 reqSkill, uint32 reqSkillValue, uint32 reqLevel, uint32 reqSpell)
Definition ObjectMgr.cpp:9302

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

◆ LoadVehicleAccessories()

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

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

◆ LoadVehicleSeatAddon()

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

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

◆ LoadVendors()

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

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

◆ LoadWaypointScripts()

void ObjectMgr::LoadWaypointScripts ( )
5804{
5806
5807 std::set<uint32> actionSet;
5808
5809 for (ScriptMapMap::const_iterator itr = sWaypointScripts.begin(); itr != sWaypointScripts.end(); ++itr)
5810 actionSet.insert(itr->first);
5811
5813 PreparedQueryResult result = WorldDatabase.Query(stmt);
5814
5815 if (result)
5816 {
5817 do
5818 {
5819 Field* fields = result->Fetch();
5820 uint32 action = fields[0].Get<uint32>();
5821
5822 actionSet.erase(action);
5823 } while (result->NextRow());
5824 }
5825
5826 for (std::set<uint32>::iterator itr = actionSet.begin(); itr != actionSet.end(); ++itr)
5827 LOG_ERROR("sql.sql", "There is no waypoint which links to the waypoint script {}", *itr);
5828}
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
3855{
3856 if (!_playerInfo[race_][class_])
3857 return;
3858
3859 if (count > 0)
3860 _playerInfo[race_][class_]->item.push_back(PlayerCreateInfoItem(itemId, count));
3861 else
3862 {
3863 if (count < -1)
3864 LOG_ERROR("sql.sql", "Invalid count {} specified on item {} be removed from original player create info (use -1)!", count, itemId);
3865
3866 for (uint32 gender = 0; gender < GENDER_NONE; ++gender)
3867 {
3868 if (CharStartOutfitEntry const* entry = GetCharStartOutfitEntry(race_, class_, gender))
3869 {
3870 bool found = false;
3871 for (uint8 x = 0; x < MAX_OUTFIT_ITEMS; ++x)
3872 {
3873 if (entry->ItemId[x] > 0 && uint32(entry->ItemId[x]) == itemId)
3874 {
3875 found = true;
3876 const_cast<CharStartOutfitEntry*>(entry)->ItemId[x] = 0;
3877 break;
3878 }
3879 }
3880
3881 if (!found)
3882 LOG_ERROR("sql.sql", "Item {} specified to be removed from original create info not found in dbc!", itemId);
3883 }
3884 }
3885 }
3886}
CharStartOutfitEntry const * GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender)
Definition DBCStores.cpp:842
Definition Player.h:285
PlayerCreateInfoItems item
Definition Player.h:353

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 
)
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.erase(guid);
2497 }
2498 }
2499}

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 
)
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.erase(guid);
2803 }
2804 }
2805}

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 
)
9647{
9648 CacheVendorItemContainer::iterator iter = _cacheVendorItemStore.find(entry);
9649 if (iter == _cacheVendorItemStore.end())
9650 return false;
9651
9652 if (!iter->second.RemoveItem(item))
9653 return false;
9654
9655 if (persist)
9656 {
9658
9659 stmt->SetData(0, entry);
9660 stmt->SetData(1, item);
9661
9662 WorldDatabase.Execute(stmt);
9663 }
9664
9665 return true;
9666}
@ WORLD_DEL_NPC_VENDOR
Definition WorldDatabase.h:44

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

◆ ReturnOrDeleteOldMails()

void ObjectMgr::ReturnOrDeleteOldMails ( bool  serverUp)
6299{
6300 uint32 oldMSTime = getMSTime();
6301
6302 time_t curTime = GameTime::GetGameTime().count();
6303
6305 stmt->SetData(0, uint32(curTime));
6306 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6307 if (!result)
6308 return;
6309
6310 std::map<uint32 /*messageId*/, MailItemInfoVec> itemsCache;
6311 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_EXPIRED_MAIL_ITEMS);
6312 stmt->SetData(0, uint32(curTime));
6313 if (PreparedQueryResult items = CharacterDatabase.Query(stmt))
6314 {
6315 MailItemInfo item;
6316 do
6317 {
6318 Field* fields = items->Fetch();
6319 item.item_guid = fields[0].Get<uint32>();
6320 item.item_template = fields[1].Get<uint32>();
6321 uint32 mailId = fields[2].Get<uint32>();
6322 itemsCache[mailId].push_back(item);
6323 } while (items->NextRow());
6324 }
6325
6326 uint32 deletedCount = 0;
6327 uint32 returnedCount = 0;
6328 do
6329 {
6330 Field* fields = result->Fetch();
6331 Mail* m = new Mail;
6332 m->messageID = fields[0].Get<uint32>();
6333 m->messageType = fields[1].Get<uint8>();
6334 m->sender = fields[2].Get<uint32>();
6335 m->receiver = fields[3].Get<uint32>();
6336 bool has_items = fields[4].Get<bool>();
6337 m->expire_time = time_t(fields[5].Get<uint32>());
6338 m->deliver_time = time_t(0);
6339 m->stationery = fields[6].Get<uint8>();
6340 m->checked = fields[7].Get<uint8>();
6341 m->mailTemplateId = fields[8].Get<int16>();
6342
6343 Player* player = nullptr;
6344 if (serverUp)
6346
6347 if (player) // don't modify mails of a logged in player
6348 {
6349 delete m;
6350 continue;
6351 }
6352
6353 // Delete or return mail
6354 if (has_items)
6355 {
6356 // read items from cache
6357 m->items.swap(itemsCache[m->messageID]);
6358
6359 // If it is mail from non-player, or if it's already return mail, it shouldn't be returned, but deleted
6360 if (!m->IsSentByPlayer() || m->IsSentByGM() || (m->IsCODPayment() || m->IsReturnedMail()))
6361 {
6362 for (auto const& mailedItem : m->items)
6363 {
6364 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
6365 stmt->SetData(0, mailedItem.item_guid);
6366 CharacterDatabase.Execute(stmt);
6367 }
6368
6369 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
6370 stmt->SetData(0, m->messageID);
6371 CharacterDatabase.Execute(stmt);
6372 }
6373 else
6374 {
6375 // Mail will be returned
6376 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_RETURNED);
6377 stmt->SetData(0, m->receiver);
6378 stmt->SetData(1, m->sender);
6379 stmt->SetData(2, uint32(curTime + 30 * DAY));
6380 stmt->SetData(3, uint32(curTime));
6382 stmt->SetData(5, m->messageID);
6383 CharacterDatabase.Execute(stmt);
6384 for (auto const& mailedItem : m->items)
6385 {
6386 // Update receiver in mail items for its proper delivery, and in instance_item for avoid lost item at sender delete
6387 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_ITEM_RECEIVER);
6388 stmt->SetData(0, m->sender);
6389 stmt->SetData(1, mailedItem.item_guid);
6390 CharacterDatabase.Execute(stmt);
6391
6392 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_OWNER);
6393 stmt->SetData(0, m->sender);
6394 stmt->SetData(1, mailedItem.item_guid);
6395 CharacterDatabase.Execute(stmt);
6396 }
6397
6398 // xinef: update global data
6399 sCharacterCache->IncreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->sender));
6400 sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver));
6401
6402 delete m;
6403 ++returnedCount;
6404 continue;
6405 }
6406 }
6407
6408 sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver));
6409
6410 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
6411 stmt->SetData(0, m->messageID);
6412 CharacterDatabase.Execute(stmt);
6413 delete m;
6414 ++deletedCount;
6415 } while (result->NextRow());
6416
6417 LOG_INFO("server.loading", ">> Processed {} expired mails: {} deleted and {} returned in {} ms", deletedCount + returnedCount, deletedCount, returnedCount, GetMSTimeDiffToNow(oldMSTime));
6418 LOG_INFO("server.loading", " ");
6419}
#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:1083
Seconds GetGameTime()
Definition GameTime.cpp:38
Player * FindPlayerByLowGUID(ObjectGuid::LowType lowguid)
Definition ObjectAccessor.cpp:251
Definition Mail.h:160
ObjectGuid::LowType item_guid
Definition Mail.h:161
uint32 item_template
Definition Mail.h:162
Definition Mail.h:167
bool IsSentByGM() const
Definition Mail.h:208
bool IsCODPayment() const
Definition Mail.h:209
ObjectGuid::LowType receiver
Definition Mail.h:173
uint8 messageType
Definition Mail.h:169
bool IsSentByPlayer() const
Definition Mail.h:207
uint32 messageID
Definition Mail.h:168
time_t expire_time
Definition Mail.h:178
uint32 sender
Definition Mail.h:172
uint8 stationery
Definition Mail.h:170
std::vector< MailItemInfo > items
Definition Mail.h:176
time_t deliver_time
Definition Mail.h:179
bool IsReturnedMail() const
Definition Mail.h:210
uint32 checked
Definition Mail.h:182
uint16 mailTemplateId
Definition Mail.h:171

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

◆ SetCreatureLinkedRespawn()

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

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