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:66
std::uint8_t uint8
Definition Define.h:109
#define MAX_RACES
Definition SharedDefines.h:95
#define MAX_CLASSES
Definition SharedDefines.h:155
PlayerInfo * _playerInfo[MAX_RACES][MAX_CLASSES]
Definition ObjectMgr.h: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 
)
2471{
2472 uint8 mask = data->spawnMask;
2473 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2474 {
2475 if (mask & 1)
2476 {
2477 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2478 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2479 cell_guids.creatures.insert(guid);
2480 }
2481 }
2482}
uint32 MAKE_PAIR32(uint16 l, uint16 h)
Definition ObjectDefines.h:87
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 
)
2550{
2551 CreatureTemplate const* cInfo = GetCreatureTemplate(entry);
2552 if (!cInfo)
2553 return 0;
2554
2555 uint32 level = cInfo->minlevel == cInfo->maxlevel ? cInfo->minlevel : urand(cInfo->minlevel, cInfo->maxlevel); // Only used for extracting creature base stats
2556 CreatureBaseStats const* stats = GetCreatureBaseStats(level, cInfo->unit_class);
2557 Map* map = sMapMgr->CreateBaseMap(mapId);
2558 if (!map)
2559 return 0;
2560
2562 CreatureData& data = NewOrExistCreatureData(spawnId);
2563 data.spawnMask = spawnId;
2564 data.id1 = entry;
2565 data.id2 = 0;
2566 data.id3 = 0;
2567 data.mapid = mapId;
2568 data.displayid = 0;
2569 data.equipmentId = 0;
2570 data.posX = x;
2571 data.posY = y;
2572 data.posZ = z;
2573 data.orientation = o;
2574 data.spawntimesecs = spawntimedelay;
2575 data.wander_distance = 0;
2576 data.currentwaypoint = 0;
2577 data.curhealth = stats->GenerateHealth(cInfo);
2578 data.curmana = stats->GenerateMana(cInfo);
2579 data.movementType = cInfo->MovementType;
2580 data.spawnMask = 1;
2582 data.dbData = false;
2583 data.npcflag = cInfo->npcflag;
2584 data.unit_flags = cInfo->unit_flags;
2585 data.dynamicflags = cInfo->dynamicflags;
2586
2587 AddCreatureToGrid(spawnId, &data);
2588
2589 // Spawn if necessary (loaded grids only)
2590 if (!map->Instanceable() && map->IsGridLoaded(x, y))
2591 {
2592 Creature* creature = new Creature();
2593 if (!creature->LoadCreatureFromDB(spawnId, map, true, true))
2594 {
2595 LOG_ERROR("sql.sql", "AddCreature: Cannot add creature entry {} to map", entry);
2596 delete creature;
2597 return 0;
2598 }
2599 }
2600
2601 return spawnId;
2602}
std::uint32_t uint32
Definition Define.h:107
#define LOG_ERROR(filterType__,...)
Definition Log.h:157
#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:1698
Definition Map.h:156
bool IsGridLoaded(GridCoord const &gridCoord) const
Definition Map.cpp:291
bool Instanceable() const
Definition Map.h:294
uint32 LowType
Definition ObjectGuid.h:122
CreatureBaseStats const * GetCreatureBaseStats(uint8 level, uint8 unitClass)
Definition ObjectMgr.cpp:9914
void AddCreatureToGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition ObjectMgr.cpp:2470
ObjectGuid::LowType GenerateCreatureSpawnId()
Definition ObjectMgr.cpp:7228
CreatureData & NewOrExistCreatureData(ObjectGuid::LowType spawnId)
Definition ObjectMgr.h:1216
CreatureTemplate const * GetCreatureTemplate(uint32 entry)
Definition ObjectMgr.cpp:10262
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 
)
2774{
2775 uint8 mask = data->spawnMask;
2776 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2777 {
2778 if (mask & 1)
2779 {
2780 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2781 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2782 cell_guids.gameobjects.insert(guid);
2783 }
2784 }
2785}
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)
9146{
9147 // find max id
9148 uint32 new_id = 0;
9149 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9150 if (itr->first > new_id)
9151 new_id = itr->first;
9152
9153 // use next
9154 ++new_id;
9155
9156 if (!Utf8toWStr(tele.name, tele.wnameLow))
9157 return false;
9158
9159 wstrToLower(tele.wnameLow);
9160
9161 _gameTeleStore[new_id] = tele;
9162
9164
9165 stmt->SetData(0, new_id);
9166 stmt->SetData(1, tele.position_x);
9167 stmt->SetData(2, tele.position_y);
9168 stmt->SetData(3, tele.position_z);
9169 stmt->SetData(4, tele.orientation);
9170 stmt->SetData(5, uint16(tele.mapId));
9171 stmt->SetData(6, tele.name);
9172
9173 WorldDatabase.Execute(stmt);
9174
9175 return true;
9176}
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 
)
2499{
2500 GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
2501 if (!goinfo)
2502 return 0;
2503
2504 Map* map = sMapMgr->CreateBaseMap(mapId);
2505 if (!map)
2506 return 0;
2507
2509
2510 GameObjectData& data = NewGOData(spawnId);
2511 data.id = entry;
2512 data.mapid = mapId;
2513 data.posX = x;
2514 data.posY = y;
2515 data.posZ = z;
2516 data.orientation = o;
2517 data.rotation.x = rotation0;
2518 data.rotation.y = rotation1;
2519 data.rotation.z = rotation2;
2520 data.rotation.w = rotation3;
2521 data.spawntimesecs = spawntimedelay;
2522 data.animprogress = 100;
2523 data.spawnMask = 1;
2524 data.go_state = GO_STATE_READY;
2526 data.artKit = goinfo->type == GAMEOBJECT_TYPE_CAPTURE_POINT ? 21 : 0;
2527 data.dbData = false;
2528
2529 AddGameobjectToGrid(spawnId, &data);
2530
2531 // Spawn if necessary (loaded grids only)
2532 // We use spawn coords to spawn
2533 if (!map->Instanceable() && map->IsGridLoaded(x, y))
2534 {
2535 GameObject* go = sObjectMgr->IsGameObjectStaticTransport(data.id) ? new StaticTransport() : new GameObject();
2536 if (!go->LoadGameObjectFromDB(spawnId, map))
2537 {
2538 LOG_ERROR("sql.sql", "AddGOData: cannot add gameobject entry {} to map", entry);
2539 delete go;
2540 return 0;
2541 }
2542 }
2543
2544 LOG_DEBUG("maps", "AddGOData: spawnId {} entry {} map {} x {} y {} z {} o {}", spawnId, entry, mapId, x, y, z, o);
2545
2546 return spawnId;
2547}
@ GO_STATE_READY
Definition GameObjectData.h:690
#define LOG_DEBUG(filterType__,...)
Definition Log.h:169
#define sObjectMgr
Definition ObjectMgr.h:1650
@ 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:2773
GameObjectTemplate const * GetGameObjectTemplate(uint32 entry)
Definition ObjectMgr.cpp:10238
ObjectGuid::LowType GenerateGameObjectSpawnId()
Definition ObjectMgr.cpp:7238
GameObjectData & NewGOData(ObjectGuid::LowType guid)
Definition ObjectMgr.h:1301
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(), Map::IsGridLoaded(), GameObject::LoadGameObjectFromDB(), LOG_DEBUG, LOG_ERROR, GameObjectData::mapid, NewGOData(), GameObjectData::orientation, GameObjectData::phaseMask, PHASEMASK_NORMAL, GameObjectData::posX, GameObjectData::posY, GameObjectData::posZ, GameObjectData::rotation, sMapMgr, sObjectMgr, GameObjectData::spawnMask, GameObjectData::spawntimesecs, and GameObjectTemplate::type.

◆ AddLocaleString()

◆ AddProfanityPlayerName()

void ObjectMgr::AddProfanityPlayerName ( std::string const &  name)
8513{
8514 if (!IsProfanityName(name))
8515 {
8516 std::wstring wstr;
8517 if (!Utf8toWStr(name, wstr))
8518 {
8519 LOG_ERROR("server", "Could not add invalid name to profanity player names: {}", name);
8520 return;
8521 }
8522 wstrToLower(wstr);
8523
8524 _profanityNamesStore.insert(wstr);
8525
8527 stmt->SetData(0, name);
8528 CharacterDatabase.Execute(stmt);
8529 }
8530}
@ 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:8497

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

◆ AddReservedPlayerName()

void ObjectMgr::AddReservedPlayerName ( std::string const &  name)
8410{
8411 if (!IsReservedName(name))
8412 {
8413 std::wstring wstr;
8414 if (!Utf8toWStr(name, wstr))
8415 {
8416 LOG_ERROR("server", "Could not add invalid name to reserved player names: {}", name);
8417 return;
8418 }
8419 wstrToLower(wstr);
8420
8421 _reservedNamesStore.insert(wstr);
8422
8424 stmt->SetData(0, name);
8425 CharacterDatabase.Execute(stmt);
8426 }
8427}
@ CHAR_INS_RESERVED_PLAYER_NAME
Definition CharacterDatabase.h:519
bool IsReservedName(std::string_view name) const
Definition ObjectMgr.cpp:8394
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 
)
9267{
9268 if (entry >= ACORE_TRAINER_START_REF)
9269 return;
9270
9271 CreatureTemplate const* cInfo = GetCreatureTemplate(entry);
9272 if (!cInfo)
9273 {
9274 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry for a non-existing creature template (Entry: {}), ignoring", entry);
9275 return;
9276 }
9277
9278 if (!(cInfo->npcflag & UNIT_NPC_FLAG_TRAINER))
9279 {
9280 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry for a creature template (Entry: {}) without trainer flag, ignoring", entry);
9281 return;
9282 }
9283
9284 SpellInfo const* spellinfo = sSpellMgr->GetSpellInfo(spell);
9285 if (!spellinfo)
9286 {
9287 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a non-existing spell (Spell: {}), ignoring", entry, spell);
9288 return;
9289 }
9290
9291 if (!SpellMgr::ComputeIsSpellValid(spellinfo))
9292 {
9293 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a broken spell (Spell: {}), ignoring", entry, spell);
9294 return;
9295 }
9296
9297 if (GetTalentSpellCost(spell))
9298 {
9299 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a non-existing spell (Spell: {}) which is a talent, ignoring", entry, spell);
9300 return;
9301 }
9302
9303 if (reqSpell && !sSpellMgr->GetSpellInfo(reqSpell))
9304 {
9305 LOG_ERROR("sql.sql", "Table `npc_trainer` contains an entry (Entry: {}) for a non-existing reqSpell (Spell: {}), ignoring", entry, reqSpell);
9306 return;
9307 }
9308
9310
9311 TrainerSpell& trainerSpell = data.spellList[spell];
9312 trainerSpell.spell = spell;
9313 trainerSpell.spellCost = spellCost;
9314 trainerSpell.reqSkill = reqSkill;
9315 trainerSpell.reqSkillValue = reqSkillValue;
9316 trainerSpell.reqLevel = reqLevel;
9317 trainerSpell.reqSpell = reqSpell;
9318
9319 if (!trainerSpell.reqLevel)
9320 trainerSpell.reqLevel = spellinfo->SpellLevel;
9321
9322 // calculate learned spell for profession case when stored cast-spell
9323 trainerSpell.learnedSpell[0] = spell;
9324 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
9325 {
9326 if (spellinfo->Effects[i].Effect != SPELL_EFFECT_LEARN_SPELL)
9327 continue;
9328 if (trainerSpell.learnedSpell[0] == spell)
9329 trainerSpell.learnedSpell[0] = 0;
9330 // player must be able to cast spell on himself
9331 if (spellinfo->Effects[i].TargetA.GetTarget() != 0 && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_TARGET_ALLY
9332 && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_TARGET_ANY && spellinfo->Effects[i].TargetA.GetTarget() != TARGET_UNIT_CASTER)
9333 {
9334 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);
9335 continue;
9336 }
9337
9338 trainerSpell.learnedSpell[i] = spellinfo->Effects[i].TriggerSpell;
9339
9340 if (trainerSpell.learnedSpell[i])
9341 {
9342 SpellInfo const* learnedSpellInfo = sSpellMgr->GetSpellInfo(trainerSpell.learnedSpell[i]);
9343 if (learnedSpellInfo && learnedSpellInfo->IsProfession())
9344 data.trainerType = 2;
9345 }
9346 }
9347
9348 return;
9349}
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 
)
9592{
9593 VendorItemData& vList = _cacheVendorItemStore[entry];
9594 vList.AddItem(item, maxcount, incrtime, extendedCost);
9595
9596 if (persist)
9597 {
9599
9600 stmt->SetData(0, entry);
9601 stmt->SetData(1, item);
9602 stmt->SetData(2, maxcount);
9603 stmt->SetData(3, incrtime);
9604 stmt->SetData(4, extendedCost);
9605
9606 WorldDatabase.Execute(stmt);
9607 }
9608}
@ 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
4502{
4503 // base data (last known level)
4504 *info = _playerInfo[race][_class]->levelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1];
4505
4506 // if conversion from uint32 to uint8 causes unexpected behaviour, change lvl to uint32
4507 for (uint8 lvl = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1; lvl < level; ++lvl)
4508 {
4509 switch (_class)
4510 {
4511 case CLASS_WARRIOR:
4512 info->stats[STAT_STRENGTH] += (lvl > 23 ? 2 : (lvl > 1 ? 1 : 0));
4513 info->stats[STAT_STAMINA] += (lvl > 23 ? 2 : (lvl > 1 ? 1 : 0));
4514 info->stats[STAT_AGILITY] += (lvl > 36 ? 1 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4515 info->stats[STAT_INTELLECT] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4516 info->stats[STAT_SPIRIT] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4517 break;
4518 case CLASS_PALADIN:
4519 info->stats[STAT_STRENGTH] += (lvl > 3 ? 1 : 0);
4520 info->stats[STAT_STAMINA] += (lvl > 33 ? 2 : (lvl > 1 ? 1 : 0));
4521 info->stats[STAT_AGILITY] += (lvl > 38 ? 1 : (lvl > 7 && !(lvl % 2) ? 1 : 0));
4522 info->stats[STAT_INTELLECT] += (lvl > 6 && (lvl % 2) ? 1 : 0);
4523 info->stats[STAT_SPIRIT] += (lvl > 7 ? 1 : 0);
4524 break;
4525 case CLASS_HUNTER:
4526 info->stats[STAT_STRENGTH] += (lvl > 4 ? 1 : 0);
4527 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4528 info->stats[STAT_AGILITY] += (lvl > 33 ? 2 : (lvl > 1 ? 1 : 0));
4529 info->stats[STAT_INTELLECT] += (lvl > 8 && (lvl % 2) ? 1 : 0);
4530 info->stats[STAT_SPIRIT] += (lvl > 38 ? 1 : (lvl > 9 && !(lvl % 2) ? 1 : 0));
4531 break;
4532 case CLASS_ROGUE:
4533 info->stats[STAT_STRENGTH] += (lvl > 5 ? 1 : 0);
4534 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4535 info->stats[STAT_AGILITY] += (lvl > 16 ? 2 : (lvl > 1 ? 1 : 0));
4536 info->stats[STAT_INTELLECT] += (lvl > 8 && !(lvl % 2) ? 1 : 0);
4537 info->stats[STAT_SPIRIT] += (lvl > 38 ? 1 : (lvl > 9 && !(lvl % 2) ? 1 : 0));
4538 break;
4539 case CLASS_PRIEST:
4540 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4541 info->stats[STAT_STAMINA] += (lvl > 5 ? 1 : 0);
4542 info->stats[STAT_AGILITY] += (lvl > 38 ? 1 : (lvl > 8 && (lvl % 2) ? 1 : 0));
4543 info->stats[STAT_INTELLECT] += (lvl > 22 ? 2 : (lvl > 1 ? 1 : 0));
4544 info->stats[STAT_SPIRIT] += (lvl > 3 ? 1 : 0);
4545 break;
4546 case CLASS_SHAMAN:
4547 info->stats[STAT_STRENGTH] += (lvl > 34 ? 1 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4548 info->stats[STAT_STAMINA] += (lvl > 4 ? 1 : 0);
4549 info->stats[STAT_AGILITY] += (lvl > 7 && !(lvl % 2) ? 1 : 0);
4550 info->stats[STAT_INTELLECT] += (lvl > 5 ? 1 : 0);
4551 info->stats[STAT_SPIRIT] += (lvl > 4 ? 1 : 0);
4552 break;
4553 case CLASS_MAGE:
4554 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4555 info->stats[STAT_STAMINA] += (lvl > 5 ? 1 : 0);
4556 info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4557 info->stats[STAT_INTELLECT] += (lvl > 24 ? 2 : (lvl > 1 ? 1 : 0));
4558 info->stats[STAT_SPIRIT] += (lvl > 33 ? 2 : (lvl > 2 ? 1 : 0));
4559 break;
4560 case CLASS_WARLOCK:
4561 info->stats[STAT_STRENGTH] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4562 info->stats[STAT_STAMINA] += (lvl > 38 ? 2 : (lvl > 3 ? 1 : 0));
4563 info->stats[STAT_AGILITY] += (lvl > 9 && !(lvl % 2) ? 1 : 0);
4564 info->stats[STAT_INTELLECT] += (lvl > 33 ? 2 : (lvl > 2 ? 1 : 0));
4565 info->stats[STAT_SPIRIT] += (lvl > 38 ? 2 : (lvl > 3 ? 1 : 0));
4566 break;
4567 case CLASS_DRUID:
4568 info->stats[STAT_STRENGTH] += (lvl > 38 ? 2 : (lvl > 6 && (lvl % 2) ? 1 : 0));
4569 info->stats[STAT_STAMINA] += (lvl > 32 ? 2 : (lvl > 4 ? 1 : 0));
4570 info->stats[STAT_AGILITY] += (lvl > 38 ? 2 : (lvl > 8 && (lvl % 2) ? 1 : 0));
4571 info->stats[STAT_INTELLECT] += (lvl > 38 ? 3 : (lvl > 4 ? 1 : 0));
4572 info->stats[STAT_SPIRIT] += (lvl > 38 ? 3 : (lvl > 5 ? 1 : 0));
4573 }
4574 }
4575}
@ CONFIG_MAX_PLAYER_LEVEL
Definition IWorld.h:236
@ 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
#define sWorld
Definition World.h:357
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 
)
8965{
8966 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
8967 if (!fArea)
8968 {
8969 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
8970 return;
8971 }
8972
8973 _fishingBaseForAreaStore[entry] = skill;
8974
8975 LOG_INFO("server.loading", ">> Fishing base skill level of area {} changed to {}", entry, skill);
8976 LOG_INFO("server.loading", " ");
8977}
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
#define LOG_INFO(filterType__,...)
Definition Log.h:165
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:1598
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
8980{
8981 // get main part of the name
8982 std::wstring mainpart = GetMainPartOfName(w_ownname, 0);
8983 // prepare flags
8984 bool x = true;
8985 bool y = true;
8986
8987 // check declined names
8988 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
8989 {
8990 std::wstring wname;
8991 if (!Utf8toWStr(names.name[i], wname))
8992 return false;
8993
8994 if (mainpart != GetMainPartOfName(wname, i + 1))
8995 x = false;
8996
8997 if (w_ownname != wname)
8998 y = false;
8999 }
9000 return (x || y);
9001}
#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
8685{
8686 std::wstring wname;
8687 if (!Utf8toWStr(name, wname))
8688 return PET_NAME_INVALID;
8689
8690 if (wname.size() > MAX_PET_NAME)
8691 return PET_NAME_TOO_LONG;
8692
8693 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PET_NAME);
8694 if (wname.size() < minName)
8695 return PET_NAME_TOO_SHORT;
8696
8697 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PET_NAMES);
8698 if (!isValidString(wname, strictMask, false))
8700
8701 // Check Reserved Name
8702 if (sObjectMgr->IsReservedName(name))
8703 return PET_NAME_RESERVED;
8704
8705 // Check Profanity Name
8706 if (sObjectMgr->IsProfanityName(name))
8707 return PET_NAME_PROFANE;
8708
8709 return PET_NAME_SUCCESS;
8710}
@ CONFIG_STRICT_PET_NAMES
Definition IWorld.h:223
@ CONFIG_MIN_PET_NAME
Definition IWorld.h:226
bool isValidString(std::wstring wstr, uint32 strictMask, bool numericOrSpace, bool create=false)
Definition ObjectMgr.cpp:8569
#define MAX_PET_NAME
Definition ObjectMgr.h:684
@ PET_NAME_INVALID
Definition SharedDefines.h:3676
@ PET_NAME_RESERVED
Definition SharedDefines.h:3682
@ PET_NAME_SUCCESS
Definition SharedDefines.h:3674
@ PET_NAME_MIXED_LANGUAGES
Definition SharedDefines.h:3680
@ PET_NAME_TOO_SHORT
Definition SharedDefines.h:3678
@ PET_NAME_TOO_LONG
Definition SharedDefines.h:3679
@ PET_NAME_PROFANE
Definition SharedDefines.h:3681

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
8606{
8607 std::wstring wname;
8608
8609 // Check for invalid characters
8610 if (!Utf8toWStr(name, wname))
8612
8613 // Check for too long name
8614 if (wname.size() > MAX_PLAYER_NAME)
8615 return CHAR_NAME_TOO_LONG;
8616
8617 // Check for too short name
8618 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PLAYER_NAME);
8619 if (wname.size() < minName)
8620 return CHAR_NAME_TOO_SHORT;
8621
8622 // Check for mixed languages
8623 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PLAYER_NAMES);
8624 if (!isValidString(wname, strictMask, false, create))
8626
8627 // Check for three consecutive letters
8628 wstrToLower(wname);
8629 for (std::size_t i = 2; i < wname.size(); ++i)
8630 if (wname[i] == wname[i - 1] && wname[i] == wname[i - 2])
8632
8633 // Check Reserved Name
8634 if (sObjectMgr->IsReservedName(name))
8635 return CHAR_NAME_RESERVED;
8636
8637 // Check Profanity Name
8638 if (sObjectMgr->IsProfanityName(name))
8639 return CHAR_NAME_PROFANE;
8640
8641 return CHAR_NAME_SUCCESS;
8642}
@ CONFIG_STRICT_PLAYER_NAMES
Definition IWorld.h:220
@ CONFIG_MIN_PLAYER_NAME
Definition IWorld.h:224
#define MAX_PLAYER_NAME
Definition ObjectMgr.h:682
@ CHAR_NAME_TOO_SHORT
Definition SharedDefines.h:3438
@ CHAR_NAME_THREE_CONSECUTIVE
Definition SharedDefines.h:3446
@ CHAR_NAME_INVALID_CHARACTER
Definition SharedDefines.h:3440
@ CHAR_NAME_TOO_LONG
Definition SharedDefines.h:3439
@ CHAR_NAME_RESERVED
Definition SharedDefines.h:3443
@ CHAR_NAME_MIXED_LANGUAGES
Definition SharedDefines.h:3441
@ CHAR_NAME_PROFANE
Definition SharedDefines.h:3442
@ CHAR_NAME_SUCCESS
Definition SharedDefines.h:3435

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)
8206{
8207 // remove mapid*cellid -> guid_set map
8208 CreatureData const* data = GetCreatureData(guid);
8209 if (data)
8210 RemoveCreatureFromGrid(guid, data);
8211
8212 _creatureDataStore.erase(guid);
8213}
CreatureDataContainer _creatureDataStore
Definition ObjectMgr.h:1583
void RemoveCreatureFromGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition ObjectMgr.cpp:2484
CreatureData const * GetCreatureData(ObjectGuid::LowType spawnId) const
Definition ObjectMgr.h:1207

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

◆ DeleteGameTele()

bool ObjectMgr::DeleteGameTele ( std::string_view  name)
9179{
9180 // explicit name case
9181 std::wstring wname;
9182 if (!Utf8toWStr(name, wname))
9183 return false;
9184
9185 // converting string that we try to find to lower case
9186 wstrToLower(wname);
9187
9188 for (GameTeleContainer::iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9189 {
9190 if (itr->second.wnameLow == wname)
9191 {
9193
9194 stmt->SetData(0, itr->second.name);
9195
9196 WorldDatabase.Execute(stmt);
9197
9198 _gameTeleStore.erase(itr);
9199 return true;
9200 }
9201 }
9202
9203 return false;
9204}
@ 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)
8216{
8217 // remove mapid*cellid -> guid_set map
8218 GameObjectData const* data = GetGameObjectData(guid);
8219 if (data)
8220 RemoveGameobjectFromGrid(guid, data);
8221
8222 _gameObjectDataStore.erase(guid);
8223}
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:2787

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

◆ GenerateAuctionID()

uint32 ObjectMgr::GenerateAuctionID ( )
7198{
7199 if (_auctionId >= 0xFFFFFFFE)
7200 {
7201 LOG_ERROR("server.worldserver", "Auctions ids overflow!! Can't continue, shutting down server. ");
7203 }
7204 return _auctionId++;
7205}
static void StopNow(uint8 exitcode)
Definition World.h:195
@ ERROR_EXIT_CODE
Definition World.h:54

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

◆ GenerateCreatureSpawnId()

uint32 ObjectMgr::GenerateCreatureSpawnId ( )
7229{
7230 if (_creatureSpawnId >= uint32(0xFFFFFF))
7231 {
7232 LOG_ERROR("server.worldserver", "Creature spawn id overflow!! Can't continue, shutting down server. Search on forum for TCE00007 for more info.");
7234 }
7235 return _creatureSpawnId++;
7236}

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

Referenced by AddCreData().

◆ GenerateEquipmentSetGuid()

uint64 ObjectMgr::GenerateEquipmentSetGuid ( )
7208{
7209 if (_equipmentSetGuid >= uint64(0xFFFFFFFFFFFFFFFELL))
7210 {
7211 LOG_ERROR("server.worldserver", "EquipmentSet guid overflow!! Can't continue, shutting down server. ");
7213 }
7214 return _equipmentSetGuid++;
7215}
std::uint64_t uint64
Definition Define.h:106

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

◆ GenerateGameObjectSpawnId()

uint32 ObjectMgr::GenerateGameObjectSpawnId ( )
7239{
7240 if (_gameObjectSpawnId >= uint32(0xFFFFFF))
7241 {
7242 LOG_ERROR("server.worldserver", "GameObject spawn id overflow!! Can't continue, shutting down server. Search on forum for TCE00007 for more info. ");
7244 }
7245 return _gameObjectSpawnId++;
7246}

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

Referenced by AddGOData().

◆ GenerateMailID()

uint32 ObjectMgr::GenerateMailID ( )
7218{
7219 if (_mailId >= 0xFFFFFFFE)
7220 {
7221 LOG_ERROR("server.worldserver", "Mail ids overflow!! Can't continue, shutting down server. ");
7223 }
7224 std::lock_guard<std::mutex> guard(_mailIdMutex);
7225 return _mailId++;
7226}
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)
7705{
7706 std::vector<std::string>& list0 = _petHalfName0[entry];
7707 std::vector<std::string>& list1 = _petHalfName1[entry];
7708
7709 if (list0.empty() || list1.empty())
7710 {
7711 CreatureTemplate const* cinfo = GetCreatureTemplate(entry);
7712 char const* petname = GetPetName(cinfo->family, sWorld->GetDefaultDbcLocale());
7713 if (!petname)
7714 return cinfo->Name;
7715
7716 return std::string(petname);
7717 }
7718
7719 return *(list0.begin() + urand(0, list0.size() - 1)) + *(list1.begin() + urand(0, list1.size() - 1));
7720}
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 
)
7692{
7693 std::vector<std::string>& list0 = _petHalfLocaleName0[std::make_pair(entry, locale)];
7694 std::vector<std::string>& list1 = _petHalfLocaleName1[std::make_pair(entry, locale)];
7695
7696 if (list0.empty() || list1.empty())
7697 {
7698 return GeneratePetName(entry);
7699 }
7700
7701 return *(list0.begin() + urand(0, list0.size() - 1)) + *(list1.begin() + urand(0, list1.size() - 1));
7702}
HalfNameContainerLocale _petHalfLocaleName0
Definition ObjectMgr.h:1574
HalfNameContainerLocale _petHalfLocaleName1
Definition ObjectMgr.h:1575
std::string GeneratePetName(uint32 entry)
Definition ObjectMgr.cpp:7704

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

◆ GeneratePetNumber()

uint32 ObjectMgr::GeneratePetNumber ( )
7723{
7724 std::lock_guard<std::mutex> guard(_hiPetNumberMutex);
7725 return ++_hiPetNumber;
7726}
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
8911{
8912 AcoreString const* as = GetAcoreString(entry);
8913 if (as && !as->Content.empty())
8914 {
8915 if (as->Content.size() > std::size_t(locale) && !as->Content[locale].empty())
8916 return as->Content[locale];
8917
8918 return as->Content[DEFAULT_LOCALE];
8919 }
8920
8921 std::string msg = Acore::StringFormat("No entry for acore_string ({}) in DB.", entry);
8922 LOG_ERROR("sql.sql", msg);
8923 return msg;
8924}
#define DEFAULT_LOCALE
Definition Common.h:79
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)
9004{
9005 AreaTriggerScriptContainer::const_iterator i = _areaTriggerScriptStore.find(trigger_id);
9006 if (i != _areaTriggerScriptStore.end())
9007 return i->second;
9008 return 0;
9009}

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 
)
9018{
9019 if (!factionEntry)
9020 return 0;
9021
9022 uint32 raceMask = (1 << (race - 1));
9023 uint32 classMask = (1 << (playerClass - 1));
9024
9025 for (int i = 0; i < 4; i++)
9026 {
9027 if ((!factionEntry->BaseRepClassMask[i] ||
9028 factionEntry->BaseRepClassMask[i] & classMask) &&
9029 (!factionEntry->BaseRepRaceMask[i] ||
9030 factionEntry->BaseRepRaceMask[i] & raceMask))
9031 return factionEntry->BaseRepValue[i];
9032 }
9033
9034 return 0;
9035}

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

◆ GetBaseXP()

uint32 ObjectMgr::GetBaseXP ( uint8  level)
7633{
7634 return _baseXPTable[level] ? _baseXPTable[level] : 0;
7635}
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 
)
9915{
9916 CreatureBaseStatsContainer::const_iterator it = _creatureBaseStatsStore.find(MAKE_PAIR16(level, unitClass));
9917
9918 if (it != _creatureBaseStatsStore.end())
9919 return &(it->second);
9920
9921 struct DefaultCreatureBaseStats : public CreatureBaseStats
9922 {
9923 DefaultCreatureBaseStats()
9924 {
9925 BaseArmor = 1;
9926 for (uint8 j = 0; j < MAX_EXPANSIONS; ++j)
9927 {
9928 BaseHealth[j] = 1;
9929 BaseDamage[j] = 0.0f;
9930 }
9931 BaseMana = 0;
9932 AttackPower = 0;
9933 RangedAttackPower = 0;
9934 }
9935 };
9936 static const DefaultCreatureBaseStats defStats;
9937 return &defStats;
9938}
uint16 MAKE_PAIR16(uint8 l, uint8 h)
Definition ObjectDefines.h:82
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(), 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.

◆ 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)
10239{
10240 GameObjectTemplateContainer::const_iterator itr = _gameObjectTemplateStore.find(entry);
10241 if (itr != _gameObjectTemplateStore.end())
10242 return &(itr->second);
10243
10244 return nullptr;
10245}
GameObjectTemplateContainer _gameObjectTemplateStore
Definition ObjectMgr.h:1599

References _gameObjectTemplateStore.

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

◆ GetGameObjectTemplateAddon()

GameObjectTemplateAddon const * ObjectMgr::GetGameObjectTemplateAddon ( uint32  entry) const
10254{
10255 auto itr = _gameObjectTemplateAddonStore.find(entry);
10256 if (itr != _gameObjectTemplateAddonStore.end())
10257 return &itr->second;
10258
10259 return nullptr;
10260}
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
9123{
9124 // explicit name case
9125 std::wstring wname;
9126 if (!Utf8toWStr(name, wname))
9127 return nullptr;
9128
9129 // converting string that we try to find to lower case
9130 wstrToLower(wname);
9131
9132 // Alternative first GameTele what contains wnameLow as substring in case no GameTele location found
9133 const GameTele* alt = nullptr;
9134 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9135 {
9136 if (itr->second.wnameLow == wname)
9137 return &itr->second;
9138 else if (!exactSearch && !alt && itr->second.wnameLow.find(wname) != std::wstring::npos)
9139 alt = &itr->second;
9140 }
9141
9142 return alt;
9143}
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
7097{
7098 bool useParentDbValue = false;
7099 uint32 parentId = 0;
7100 MapEntry const* mapEntry = sMapStore.LookupEntry(Map);
7101 if (!mapEntry || mapEntry->entrance_map < 0)
7102 return nullptr;
7103
7104 if (mapEntry->IsDungeon())
7105 {
7106 InstanceTemplate const* iTemplate = sObjectMgr->GetInstanceTemplate(Map);
7107
7108 if (!iTemplate)
7109 return nullptr;
7110
7111 parentId = iTemplate->Parent;
7112 useParentDbValue = true;
7113 }
7114
7115 uint32 entrance_map = uint32(mapEntry->entrance_map);
7116 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
7117 if ((!useParentDbValue && itr->second.target_mapId == entrance_map) || (useParentDbValue && itr->second.target_mapId == parentId))
7118 {
7119 AreaTrigger const* atEntry = GetAreaTrigger(itr->first);
7120 if (atEntry && atEntry->map == Map)
7121 return &itr->second;
7122 }
7123 return nullptr;
7124}
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:117
uint32 Parent
Definition Map.h:118
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
6144{
6145 GossipTextContainer::const_iterator itr = _gossipTextStore.find(Text_ID);
6146 if (itr != _gossipTextStore.end())
6147 return &itr->second;
6148 return nullptr;
6149}
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)
6050{
6051 InstanceTemplateContainer::const_iterator itr = _instanceTemplateStore.find(uint16(mapID));
6052 if (itr != _instanceTemplateStore.end())
6053 return &(itr->second);
6054
6055 return nullptr;
6056}
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)
3441{
3442 return entry < _itemTemplateStoreFast.size() ? _itemTemplateStoreFast[entry] : nullptr;
3443}
std::vector< ItemTemplate * > _itemTemplateStoreFast
Definition ObjectMgr.h:1606

References _itemTemplateStoreFast.

Referenced by LoadAccessRequirements(), LoadFactionChangeItems(), LoadItemTemplates(), LoadPlayerInfo(), 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

7130{
7131 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
7132 {
7133 if (itr->second.target_mapId == Map) // Id is used to determine correct Scarlet Monastery instance
7134 {
7135 // xinef: no need to check, already done at loading
7136 //AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first);
7137 //if (atEntry)
7138 return &itr->second;
7139 }
7140 }
7141 return nullptr;
7142}

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:2118
uint8 getGender() const
Definition Unit.h:798
uint8 getRace(bool original=false) const
Definition Unit.cpp:20820

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
8862{
8863 ModuleString const* ms = GetModuleString(module, id);
8864 if (ms && !ms->Content.empty())
8865 {
8866 if (ms->Content.size() > size_t(locale) && !ms->Content[locale].empty())
8867 return &ms->Content[locale];
8868
8869 return &ms->Content[DEFAULT_LOCALE];
8870 }
8871
8872 LOG_ERROR("sql.sql", "Module string module {} id {} not found in DB.", module, id);
8873
8874 return (std::string*)"error";
8875}
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 
)
6714{
6715 bool found = false;
6716 float dist = 10000;
6717 uint32 id = 0;
6718
6719 for (uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i)
6720 {
6721 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(i);
6722
6723 if (!node || node->map_id != mapid || (!node->MountCreatureID[teamId == TEAM_ALLIANCE ? 1 : 0] && node->MountCreatureID[0] != 32981)) // dk flight
6724 continue;
6725
6726 uint8 field = (uint8)((i - 1) / 32);
6727 uint32 submask = 1 << ((i - 1) % 32);
6728
6729 // skip not taxi network nodes
6730 if (field >= TaxiMaskSize || (sTaxiNodesMask[field] & submask) == 0)
6731 {
6732 continue;
6733 }
6734
6735 float dist2 = (node->x - x) * (node->x - x) + (node->y - y) * (node->y - y) + (node->z - z) * (node->z - z);
6736 if (found)
6737 {
6738 if (dist2 < dist)
6739 {
6740 dist = dist2;
6741 id = i;
6742 }
6743 }
6744 else
6745 {
6746 found = true;
6747 dist = dist2;
6748 id = i;
6749 }
6750 }
6751
6752 return id;
6753}
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)
5966{
5967 PageTextContainer::const_iterator itr = _pageTextStore.find(pageEntry);
5968 if (itr != _pageTextStore.end())
5969 return &(itr->second);
5970
5971 return nullptr;
5972}
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
3807{
3808 if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
3809 level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
3810
3811 PetLevelInfoContainer::const_iterator itr = _petInfoStore.find(creature_id);
3812 if (itr == _petInfoStore.end())
3813 return nullptr;
3814
3815 return &itr->second[level - 1]; // data for level 1 stored in [0] array element, ...
3816}

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
4474{
4475 if (level < 1 || class_ >= MAX_CLASSES)
4476 return;
4477
4478 PlayerClassInfo const* pInfo = _playerClassInfo[class_];
4479
4480 if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4481 level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
4482
4483 *info = pInfo->levelInfo[level - 1];
4484}
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
10285{
10286 if (race >= MAX_RACES)
10287 return nullptr;
10288 if (class_ >= MAX_CLASSES)
10289 return nullptr;
10290 PlayerInfo const* info = _playerInfo[race][class_];
10291 if (!info)
10292 return nullptr;
10293 return info;
10294}
Definition Player.h:341

References _playerInfo, MAX_CLASSES, and MAX_RACES.

◆ GetPlayerLevelInfo()

void ObjectMgr::GetPlayerLevelInfo ( uint32  race,
uint32  class_,
uint8  level,
PlayerLevelInfo info 
) const
4487{
4488 if (level < 1 || race >= MAX_RACES || class_ >= MAX_CLASSES)
4489 return;
4490
4491 PlayerInfo const* pInfo = _playerInfo[race][class_];
4492 if (!pInfo)
4493 return;
4494
4495 if (level <= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4496 *info = pInfo->levelInfo[level - 1];
4497 else
4498 BuildPlayerLevelInfo(race, class_, level, info);
4499}
void BuildPlayerLevelInfo(uint8 race, uint8 class_, uint8 level, PlayerLevelInfo *plinfo) const
Definition ObjectMgr.cpp:4501

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
6444{
6445 uint8 typeIndex;
6446 if (type == TYPEID_UNIT)
6447 typeIndex = 0;
6448 else if (type == TYPEID_GAMEOBJECT)
6449 typeIndex = 1;
6450 else
6451 return nullptr;
6452
6453 std::pair<uint32, uint8> pairKey = std::make_pair(id, typeIndex);
6454 QuestGreetingContainer::const_iterator itr = _questGreetingStore.find(pairKey);
6455 if (itr == _questGreetingStore.end())
6456 return nullptr;
6457
6458 return &itr->second;
6459}
@ 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
10421{
10422 if (questMoneyDifficulty < MAX_QUEST_MONEY_REWARDS)
10423 {
10424 auto const& itr = _questMoneyRewards.find(level);
10425 if (itr != _questMoneyRewards.end())
10426 {
10427 return itr->second.at(questMoneyDifficulty);
10428 }
10429 }
10430
10431 return 0;
10432}
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(), 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)
9775{
9776 // use binary search to find the script name in the sorted vector
9777 // assume "" is the first element
9778 if (name.empty())
9779 return 0;
9780
9781 ScriptNameContainer::const_iterator itr = std::lower_bound(_scriptNamesStore.begin(), _scriptNamesStore.end(), name);
9782 if (itr == _scriptNamesStore.end() || (*itr != name))
9783 return 0;
9784
9785 return uint32(itr - _scriptNamesStore.begin());
9786}
ScriptNameContainer _scriptNamesStore
Definition ObjectMgr.h:1525

References _scriptNamesStore.

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

◆ GetScriptName()

std::string const & ObjectMgr::GetScriptName ( uint32  id) const
9769{
9770 static std::string const empty = "";
9771 return (id < _scriptNamesStore.size()) ? _scriptNamesStore[id] : empty;
9772}

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)
9012{
9013 return SpellScriptsBounds(_spellScriptsStore.lower_bound(spell_id), _spellScriptsStore.upper_bound(spell_id));
9014}
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 
)
6780{
6781 CreatureModel mountModel;
6782 CreatureTemplate const* mount_info = nullptr;
6783
6784 // select mount creature id
6785 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(id);
6786 if (node)
6787 {
6788 uint32 mount_entry = node->MountCreatureID[teamId == TEAM_ALLIANCE ? 1 : 0];
6789
6790 // Fix for Alliance not being able to use Acherus taxi
6791 // only one mount type for both sides
6792 if (mount_entry == 0 && allowed_alt_team)
6793 {
6794 // Simply reverse the selection. At least one team in theory should have a valid mount ID to choose.
6795 mount_entry = node->MountCreatureID[teamId];
6796 }
6797
6798 mount_info = GetCreatureTemplate(mount_entry);
6799 if (mount_info)
6800 {
6801 CreatureModel const* model = mount_info->GetRandomValidModel();
6802 if (!model)
6803 {
6804 LOG_ERROR("sql.sql", "No displayid found for the taxi mount with the entry {}! Can't load it!", mount_entry);
6805 return 0;
6806 }
6807 mountModel = *model;
6808 }
6809 }
6810
6811 // minfo is not actually used but the mount_id was updated
6812 GetCreatureModelRandomGender(&mountModel, mount_info);
6813
6814 return mountModel.CreatureDisplayID;
6815}
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 
)
6756{
6757 TaxiPathSetBySource::iterator src_i = sTaxiPathSetBySource.find(source);
6758 if (src_i == sTaxiPathSetBySource.end())
6759 {
6760 path = 0;
6761 cost = 0;
6762 return;
6763 }
6764
6765 TaxiPathSetForSource& pathSet = src_i->second;
6766
6767 TaxiPathSetForSource::iterator dest_i = pathSet.find(destination);
6768 if (dest_i == pathSet.end())
6769 {
6770 path = 0;
6771 cost = 0;
6772 return;
6773 }
6774
6775 cost = dest_i->second->price;
6776 path = dest_i->second->ID;
6777}
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
10268{
10269 if (Creature* cre = veh->GetBase()->ToCreature())
10270 {
10271 // Give preference to GUID-based accessories
10272 VehicleAccessoryContainer::const_iterator itr = _vehicleAccessoryStore.find(cre->GetSpawnId());
10273 if (itr != _vehicleAccessoryStore.end())
10274 return &itr->second;
10275 }
10276
10277 // Otherwise return entry-based
10278 VehicleAccessoryContainer::const_iterator itr = _vehicleTemplateAccessoryStore.find(veh->GetCreatureEntry());
10279 if (itr != _vehicleTemplateAccessoryStore.end())
10280 return &itr->second;
10281 return nullptr;
10282}
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
7638{
7639 if (level < _playerXPperLevel.size())
7640 return _playerXPperLevel[level];
7641 return 0;
7642}
PlayerXPperLevel _playerXPperLevel
Definition ObjectMgr.h:1562

References _playerXPperLevel.

◆ InitializeSpellInfoPrecomputedData()

void ObjectMgr::InitializeSpellInfoPrecomputedData ( )
5913{
5914 uint32 limit = sSpellStore.GetNumRows();
5915 for(uint32 i = 0; i <= limit; ++i)
5916 if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i))
5917 {
5918 const_cast<SpellInfo*>(spellInfo)->SetStackableWithRanks(spellInfo->ComputeIsStackableWithRanks());
5919 const_cast<SpellInfo*>(spellInfo)->SetCritCapable(spellInfo->ComputeIsCritCapable());
5920 const_cast<SpellInfo*>(spellInfo)->SetSpellValid(SpellMgr::ComputeIsSpellValid(spellInfo, false));
5921 }
5922}
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)
10248{
10249 GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
10250 return goinfo && goinfo->type == GAMEOBJECT_TYPE_TRANSPORT;
10251}
@ GAMEOBJECT_TYPE_TRANSPORT
Definition SharedDefines.h:1571

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

◆ IsProfanityName()

bool ObjectMgr::IsProfanityName ( std::string_view  name) const
8498{
8499 // pussywizard
8500 if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
8501 return true;
8502
8503 std::wstring wstr;
8504 if (!Utf8toWStr (name, wstr))
8505 return false;
8506
8507 wstrToLower(wstr);
8508
8509 return _profanityNamesStore.find(wstr) != _profanityNamesStore.end();
8510}

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

Referenced by AddProfanityPlayerName().

◆ IsReservedName()

bool ObjectMgr::IsReservedName ( std::string_view  name) const
8395{
8396 // pussywizard
8397 if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
8398 return true;
8399
8400 std::wstring wstr;
8401 if (!Utf8toWStr (name, wstr))
8402 return false;
8403
8404 wstrToLower(wstr);
8405
8406 return _reservedNamesStore.find(wstr) != _reservedNamesStore.end();
8407}

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
8671{
8672 std::wstring wname;
8673 if (!Utf8toWStr(name, wname))
8674 return false;
8675
8676 if (wname.size() > MAX_CHANNEL_NAME)
8677 return false;
8678
8679 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_CHANNEL_NAMES);
8680
8681 return isValidString(wname, strictMask, true);
8682}
@ CONFIG_STRICT_CHANNEL_NAMES
Definition IWorld.h:222
#define MAX_CHANNEL_NAME
Definition ObjectMgr.h:686

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

◆ IsValidCharterName()

bool ObjectMgr::IsValidCharterName ( std::string_view  name)
static
8645{
8646 std::wstring wname;
8647 if (!Utf8toWStr(name, wname))
8648 return false;
8649
8650 if (wname.size() > MAX_CHARTER_NAME)
8651 return false;
8652
8653 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_CHARTER_NAME);
8654 if (wname.size() < minName)
8655 return false;
8656
8657 // Check Reserved Name
8658 if (sObjectMgr->IsReservedName(name))
8659 return false;
8660
8661 // Check Profanity Name
8662 if (sObjectMgr->IsProfanityName(name))
8663 return false;
8664
8665 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_CHARTER_NAMES);
8666
8667 return isValidString(wname, strictMask, true);
8668}
@ CONFIG_MIN_CHARTER_NAME
Definition IWorld.h:225
@ CONFIG_STRICT_CHARTER_NAMES
Definition IWorld.h:221
#define MAX_CHARTER_NAME
Definition ObjectMgr.h:685

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
9633{
9634 /*
9635 CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(vendor_entry);
9636 if (!cInfo)
9637 {
9638 if (player)
9639 ChatHandler(player->GetSession()).SendSysMessage(LANG_COMMAND_VENDORSELECTION);
9640 else
9641 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have data for not existed creature template (Entry: {}), ignore", vendor_entry);
9642 return false;
9643 }
9644
9645 if (!((cInfo->npcflag | ORnpcflag) & UNIT_NPC_FLAG_VENDOR))
9646 {
9647 if (!skip_vendors || skip_vendors->count(vendor_entry) == 0)
9648 {
9649 if (player)
9650 ChatHandler(player->GetSession()).SendSysMessage(LANG_COMMAND_VENDORSELECTION);
9651 else
9652 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have data for not creature template (Entry: {}) without vendor flag, ignore", vendor_entry);
9653
9654 if (skip_vendors)
9655 skip_vendors->insert(vendor_entry);
9656 }
9657 return false;
9658 }
9659 */
9660
9661 if (!sObjectMgr->GetItemTemplate(item_id))
9662 {
9663 if (player)
9665 else
9666 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` for Vendor (Entry: {}) have in item list non-existed item ({}), ignore", vendor_entry, item_id);
9667 return false;
9668 }
9669
9670 if (ExtendedCost && !sItemExtendedCostStore.LookupEntry(ExtendedCost))
9671 {
9672 if (player)
9674 else
9675 LOG_ERROR("sql.sql", "Table `(game_event_)npc_vendor` have Item (Entry: {}) with wrong ExtendedCost ({}) for vendor ({}), ignore", item_id, ExtendedCost, vendor_entry);
9676 return false;
9677 }
9678
9679 if (maxcount > 0 && incrtime == 0)
9680 {
9681 if (player)
9682 ChatHandler(player->GetSession()).PSendSysMessage("MaxCount != 0 ({}) but IncrTime == 0", maxcount);
9683 else
9684 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);
9685 return false;
9686 }
9687 else if (maxcount == 0 && incrtime > 0)
9688 {
9689 if (player)
9690 ChatHandler(player->GetSession()).PSendSysMessage("MaxCount == 0 but IncrTime<>= 0");
9691 else
9692 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);
9693 return false;
9694 }
9695
9696 VendorItemData const* vItems = GetNpcVendorItemList(vendor_entry);
9697 if (!vItems)
9698 return true; // later checks for non-empty lists
9699
9700 if (vItems->FindItemCostPair(item_id, ExtendedCost))
9701 {
9702 if (player)
9703 ChatHandler(player->GetSession()).PSendSysMessage(LANG_ITEM_ALREADY_IN_LIST, item_id, ExtendedCost);
9704 else
9705 LOG_ERROR("sql.sql", "Table `npc_vendor` has duplicate items {} (with extended cost {}) for vendor (Entry: {}), ignoring", item_id, ExtendedCost, vendor_entry);
9706 return false;
9707 }
9708
9709 return true;
9710}
DBCStorage< ItemExtendedCostEntry > sItemExtendedCostStore(ItemExtendedCostEntryfmt)
@ LANG_ITEM_ALREADY_IN_LIST
Definition Language.h:249
@ LANG_ITEM_NOT_FOUND
Definition Language.h:246
@ LANG_EXTENDED_COST_NOT_EXIST
Definition Language.h:373
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:2007
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 ( )
6929{
6930 uint32 oldMSTime = getMSTime();
6931
6932 if (!_accessRequirementStore.empty())
6933 {
6934 for (DungeonProgressionRequirementsContainer::iterator itr = _accessRequirementStore.begin(); itr != _accessRequirementStore.end(); ++itr)
6935 {
6936 std::unordered_map<uint8, DungeonProgressionRequirements*> difficulties = itr->second;
6937 for (auto difficultiesItr = difficulties.begin(); difficultiesItr != difficulties.end(); ++difficultiesItr)
6938 {
6939 for (auto questItr = difficultiesItr->second->quests.begin(); questItr != difficultiesItr->second->quests.end(); ++questItr)
6940 {
6941 delete* questItr;
6942 }
6943
6944 for (auto achievementItr = difficultiesItr->second->achievements.begin(); achievementItr != difficultiesItr->second->achievements.end(); ++achievementItr)
6945 {
6946 delete* achievementItr;
6947 }
6948
6949 for (auto itemsItr = difficultiesItr->second->items.begin(); itemsItr != difficultiesItr->second->items.end(); ++itemsItr)
6950 {
6951 delete* itemsItr;
6952 }
6953
6954 delete difficultiesItr->second;
6955 }
6956 }
6957
6958 _accessRequirementStore.clear(); // need for reload case
6959 }
6960 // 0 1 2 3 4 5
6961 QueryResult access_template_result = WorldDatabase.Query("SELECT id, map_id, difficulty, min_level, max_level, min_avg_item_level FROM dungeon_access_template");
6962 if (!access_template_result)
6963 {
6964 LOG_WARN("server.loading", ">> Loaded 0 access requirement definitions. DB table `dungeon_access_template` is empty.");
6965 LOG_INFO("server.loading", " ");
6966 return;
6967 }
6968
6969 uint32 count = 0;
6970 uint32 countProgressionRequirements = 0;
6971
6972 do
6973 {
6974 Field* fields = access_template_result->Fetch();
6975
6976 //Get the common variables for the access requirements
6977 uint8 dungeon_access_id = fields[0].Get<uint8>();
6978 uint32 mapid = fields[1].Get<uint32>();
6979 uint8 difficulty = fields[2].Get<uint8>();
6980
6981 //Set up the access requirements
6983 ar->levelMin = fields[3].Get<uint8>();
6984 ar->levelMax = fields[4].Get<uint8>();
6985 ar->reqItemLevel = fields[5].Get<uint16>();
6986
6987 // 0 1 2 3 4 6
6988 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);
6989 if (progression_requirements_results)
6990 {
6991 do
6992 {
6993 Field* progression_requirement_row = progression_requirements_results->Fetch();
6994
6995 const uint8 requirement_type = progression_requirement_row[0].Get<uint8>();
6996 const uint32 requirement_id = progression_requirement_row[1].Get<uint32>();
6997 const std::string requirement_note = progression_requirement_row[2].Get<std::string>();
6998 const uint8 requirement_faction = progression_requirement_row[3].Get<uint8>();
6999 const uint8 requirement_priority = progression_requirement_row[4].IsNull() ? UINT8_MAX : progression_requirement_row[4].Get<uint8>();
7000 const bool requirement_checkLeaderOnly = progression_requirement_row[5].Get<bool>();
7001
7002 ProgressionRequirement* progression_requirement = new ProgressionRequirement();
7003 progression_requirement->id = requirement_id;
7004 progression_requirement->note = requirement_note;
7005 progression_requirement->faction = (TeamId)requirement_faction;
7006 progression_requirement->priority = requirement_priority;
7007 progression_requirement->checkLeaderOnly = requirement_checkLeaderOnly;
7008
7009 std::vector<ProgressionRequirement*>* currentRequirementsList = nullptr;
7010
7011 switch (requirement_type)
7012 {
7013 case 0:
7014 {
7015 //Achievement
7016 if (!sAchievementStore.LookupEntry(progression_requirement->id))
7017 {
7018 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);
7019 break;
7020 }
7021
7022 currentRequirementsList = &ar->achievements;
7023 break;
7024 }
7025 case 1:
7026 {
7027 //Quest
7028 if (!GetQuestTemplate(progression_requirement->id))
7029 {
7030 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);
7031 break;
7032 }
7033
7034 currentRequirementsList = &ar->quests;
7035 break;
7036 }
7037 case 2:
7038 {
7039 //Item
7040 ItemTemplate const* pProto = GetItemTemplate(progression_requirement->id);
7041 if (!pProto)
7042 {
7043 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);
7044 break;
7045 }
7046
7047 currentRequirementsList = &ar->items;
7048 break;
7049 }
7050 default:
7051 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);
7052 break;
7053 }
7054
7055 //Check if array is valid and delete the progression requirement
7056 if (!currentRequirementsList)
7057 {
7058 delete progression_requirement;
7059 continue;
7060 }
7061
7062 //Insert into the array
7063 if (currentRequirementsList->size() > requirement_priority)
7064 {
7065 currentRequirementsList->insert(currentRequirementsList->begin() + requirement_priority, progression_requirement);
7066 }
7067 else
7068 {
7069 currentRequirementsList->push_back(progression_requirement);
7070 }
7071
7072 } while (progression_requirements_results->NextRow());
7073 }
7074
7075 //Sort all arrays for priority
7076 auto sortFunction = [](const ProgressionRequirement* const a, const ProgressionRequirement* const b) {return a->priority > b->priority; };
7077 std::sort(ar->achievements.begin(), ar->achievements.end(), sortFunction);
7078 std::sort(ar->quests.begin(), ar->quests.end(), sortFunction);
7079 std::sort(ar->items.begin(), ar->items.end(), sortFunction);
7080
7081 countProgressionRequirements += ar->achievements.size();
7082 countProgressionRequirements += ar->quests.size();
7083 countProgressionRequirements += ar->items.size();
7084 count++;
7085
7086 _accessRequirementStore[mapid][difficulty] = ar;
7087 } while (access_template_result->NextRow());
7088
7089 LOG_INFO("server.loading", ">> Loaded {} Rows From dungeon_access_template And {} Rows From dungeon_access_requirements in {} ms", count, countProgressionRequirements, GetMSTimeDiffToNow(oldMSTime));
7090 LOG_INFO("server.loading", " ");
7091}
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
#define LOG_WARN(filterType__,...)
Definition Log.h:161
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:3440
Quest const * GetQuestTemplate(uint32 quest_id) const
Definition ObjectMgr.h:834
Definition Player.h:948
Definition ItemTemplate.h:619
Definition Player.h:939
uint32 priority
Definition Player.h:943

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 ( )
8878{
8879 uint32 oldMSTime = getMSTime();
8880
8881 _acoreStringStore.clear(); // for reload case
8882 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");
8883 if (!result)
8884 {
8885 LOG_WARN("server.loading", ">> Loaded 0 acore strings. DB table `acore_strings` is empty.");
8886 LOG_INFO("server.loading", " ");
8887 return false;
8888 }
8889
8890 do
8891 {
8892 Field* fields = result->Fetch();
8893
8894 uint32 entry = fields[0].Get<uint32>();
8895
8896 AcoreString& data = _acoreStringStore[entry];
8897
8898 data.Content.resize(DEFAULT_LOCALE + 1);
8899
8900 for (uint8 i = 0; i < TOTAL_LOCALES; ++i)
8901 AddLocaleString(fields[i + 1].Get<std::string>(), LocaleConstant(i), data.Content);
8902 } while (result->NextRow());
8903
8904 LOG_INFO("server.loading", ">> Loaded {} Acore Strings in {} ms", (uint32)_acoreStringStore.size(), GetMSTimeDiffToNow(oldMSTime));
8905 LOG_INFO("server.loading", " ");
8906
8907 return true;
8908}
LocaleConstant
Definition Common.h:65
@ TOTAL_LOCALES
Definition Common.h:76
static void AddLocaleString(std::string &&s, LocaleConstant locale, std::vector< std::string > &data)
Definition ObjectMgr.cpp:382

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

◆ LoadAreaTriggers()

void ObjectMgr::LoadAreaTriggers ( )
6818{
6819 uint32 oldMSTime = getMSTime();
6820
6821 _areaTriggerStore.clear();
6822
6823 QueryResult result = WorldDatabase.Query("SELECT entry, map, x, y, z, radius, length, width, height, orientation FROM areatrigger");
6824
6825 if (!result)
6826 {
6827 LOG_WARN("server.loading", ">> Loaded 0 area trigger definitions. DB table `areatrigger` is empty.");
6828 LOG_INFO("server.loading", " ");
6829 return;
6830 }
6831
6832 uint32 count = 0;
6833
6834 do
6835 {
6836 Field* fields = result->Fetch();
6837
6838 ++count;
6839
6840 AreaTrigger at;
6841
6842 at.entry = fields[0].Get<uint32>();
6843 at.map = fields[1].Get<uint32>();
6844 at.x = fields[2].Get<float>();
6845 at.y = fields[3].Get<float>();
6846 at.z = fields[4].Get<float>();
6847 at.radius = fields[5].Get<float>();
6848 at.length = fields[6].Get<float>();
6849 at.width = fields[7].Get<float>();
6850 at.height = fields[8].Get<float>();
6851 at.orientation = fields[9].Get<float>();
6852
6853 MapEntry const* mapEntry = sMapStore.LookupEntry(at.map);
6854 if (!mapEntry)
6855 {
6856 LOG_ERROR("sql.sql", "Area trigger (ID:{}) map (ID: {}) does not exist in `Map.dbc`.", at.entry, at.map);
6857 continue;
6858 }
6859
6860 _areaTriggerStore[at.entry] = at;
6861 } while (result->NextRow());
6862
6863 LOG_INFO("server.loading", ">> Loaded {} Area Trigger Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6864 LOG_INFO("server.loading", " ");
6865}
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 ( )
6676{
6677 uint32 oldMSTime = getMSTime();
6678
6679 _areaTriggerScriptStore.clear(); // need for reload case
6680 QueryResult result = WorldDatabase.Query("SELECT entry, ScriptName FROM areatrigger_scripts");
6681
6682 if (!result)
6683 {
6684 LOG_WARN("server.loading", ">> Loaded 0 Areatrigger Scripts. DB Table `areatrigger_scripts` Is Empty.");
6685 LOG_INFO("server.loading", " ");
6686 return;
6687 }
6688
6689 uint32 count = 0;
6690
6691 do
6692 {
6693 ++count;
6694
6695 Field* fields = result->Fetch();
6696
6697 uint32 Trigger_ID = fields[0].Get<uint32>();
6698 std::string scriptName = fields[1].Get<std::string>();
6699
6700 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6701 if (!atEntry)
6702 {
6703 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6704 continue;
6705 }
6706 _areaTriggerScriptStore[Trigger_ID] = GetScriptId(scriptName);
6707 } while (result->NextRow());
6708
6709 LOG_INFO("server.loading", ">> Loaded {} Areatrigger Scripts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6710 LOG_INFO("server.loading", " ");
6711}
uint32 GetScriptId(std::string const &name)
Definition ObjectMgr.cpp:9774

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

◆ LoadAreaTriggerTeleports()

void ObjectMgr::LoadAreaTriggerTeleports ( )
6868{
6869 uint32 oldMSTime = getMSTime();
6870
6871 _areaTriggerTeleportStore.clear(); // need for reload case
6872
6873 // 0 1 2 3 4 5
6874 QueryResult result = WorldDatabase.Query("SELECT ID, target_map, target_position_x, target_position_y, target_position_z, target_orientation FROM areatrigger_teleport");
6875
6876 if (!result)
6877 {
6878 LOG_WARN("server.loading", ">> Loaded 0 area trigger teleport definitions. DB table `areatrigger_teleport` is empty.");
6879 LOG_INFO("server.loading", " ");
6880 return;
6881 }
6882
6883 uint32 count = 0;
6884
6885 do
6886 {
6887 Field* fields = result->Fetch();
6888
6889 ++count;
6890
6891 uint32 Trigger_ID = fields[0].Get<uint32>();
6892
6894
6895 at.target_mapId = fields[1].Get<uint16>();
6896 at.target_X = fields[2].Get<float>();
6897 at.target_Y = fields[3].Get<float>();
6898 at.target_Z = fields[4].Get<float>();
6899 at.target_Orientation = fields[5].Get<float>();
6900
6901 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6902 if (!atEntry)
6903 {
6904 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6905 continue;
6906 }
6907
6908 MapEntry const* mapEntry = sMapStore.LookupEntry(at.target_mapId);
6909 if (!mapEntry)
6910 {
6911 LOG_ERROR("sql.sql", "Area trigger (ID:{}) target map (ID: {}) does not exist in `Map.dbc`.", Trigger_ID, at.target_mapId);
6912 continue;
6913 }
6914
6915 if (at.target_X == 0 && at.target_Y == 0 && at.target_Z == 0)
6916 {
6917 LOG_ERROR("sql.sql", "Area trigger (ID:{}) target coordinates not provided.", Trigger_ID);
6918 continue;
6919 }
6920
6921 _areaTriggerTeleportStore[Trigger_ID] = at;
6922 } while (result->NextRow());
6923
6924 LOG_INFO("server.loading", ">> Loaded {} Area Trigger Teleport Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6925 LOG_INFO("server.loading", " ");
6926}
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 ( )
9874{
9875 uint32 oldMSTime = getMSTime();
9876
9877 // 0 1 2 3
9878 QueryResult result = WorldDatabase.Query("SELECT ID, locale, MaleText, FemaleText FROM broadcast_text_locale");
9879
9880 if (!result)
9881 {
9882 LOG_WARN("server.loading", ">> Loaded 0 broadcast text locales. DB table `broadcast_text_locale` is empty.");
9883 LOG_INFO("server.loading", " ");
9884 return;
9885 }
9886
9887 uint32 locales_count = 0;
9888 do
9889 {
9890 Field* fields = result->Fetch();
9891
9892 uint32 id = fields[0].Get<uint32>();
9893
9894 BroadcastTextContainer::iterator bct = _broadcastTextStore.find(id);
9895 if (bct == _broadcastTextStore.end())
9896 {
9897 LOG_ERROR("sql.sql", "BroadcastText (Id: {}) found in table `broadcast_text_locale` but does not exist in `broadcast_text`. Skipped!", id);
9898 continue;
9899 }
9900
9901 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
9902 if (locale == LOCALE_enUS)
9903 continue;
9904
9905 AddLocaleString(fields[2].Get<std::string>(), locale, bct->second.MaleText);
9906 AddLocaleString(fields[3].Get<std::string>(), locale, bct->second.FemaleText);
9907 locales_count++;
9908 } while (result->NextRow());
9909
9910 LOG_INFO("server.loading", ">> Loaded {} Broadcast Text Locales in {} ms", locales_count, GetMSTimeDiffToNow(oldMSTime));
9911 LOG_INFO("server.loading", " ");
9912}
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 ( )
9789{
9790 uint32 oldMSTime = getMSTime();
9791
9792 _broadcastTextStore.clear(); // for reload case
9793
9794 // 0 1 2 3 4 5 6 7 8 9 10 11 12
9795 QueryResult result = WorldDatabase.Query("SELECT ID, LanguageID, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3, SoundEntriesID, EmotesID, Flags FROM broadcast_text");
9796 if (!result)
9797 {
9798 LOG_WARN("server.loading", ">> Loaded 0 broadcast texts. DB table `broadcast_text` is empty.");
9799 LOG_INFO("server.loading", " ");
9800 return;
9801 }
9802
9803 _broadcastTextStore.rehash(result->GetRowCount());
9804
9805 do
9806 {
9807 Field* fields = result->Fetch();
9808
9809 BroadcastText bct;
9810
9811 bct.Id = fields[0].Get<uint32>();
9812 bct.LanguageID = fields[1].Get<uint32>();
9813 bct.MaleText[DEFAULT_LOCALE] = fields[2].Get<std::string>();
9814 bct.FemaleText[DEFAULT_LOCALE] = fields[3].Get<std::string>();
9815 bct.EmoteId1 = fields[4].Get<uint32>();
9816 bct.EmoteId2 = fields[5].Get<uint32>();
9817 bct.EmoteId3 = fields[6].Get<uint32>();
9818 bct.EmoteDelay1 = fields[7].Get<uint32>();
9819 bct.EmoteDelay2 = fields[8].Get<uint32>();
9820 bct.EmoteDelay3 = fields[9].Get<uint32>();
9821 bct.SoundEntriesId = fields[10].Get<uint32>();
9822 bct.EmotesID = fields[11].Get<uint32>();
9823 bct.Flags = fields[12].Get<uint32>();
9824
9825 if (bct.SoundEntriesId)
9826 {
9827 if (!sSoundEntriesStore.LookupEntry(bct.SoundEntriesId))
9828 {
9829 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has SoundEntriesId {} but sound does not exist.", bct.Id, bct.SoundEntriesId);
9830 bct.SoundEntriesId = 0;
9831 }
9832 }
9833
9835 {
9836 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` using Language {} but Language does not exist.", bct.Id, bct.LanguageID);
9838 }
9839
9840 if (bct.EmoteId1)
9841 {
9842 if (!sEmotesStore.LookupEntry(bct.EmoteId1))
9843 {
9844 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId1 {} but emote does not exist.", bct.Id, bct.EmoteId1);
9845 bct.EmoteId1 = 0;
9846 }
9847 }
9848
9849 if (bct.EmoteId2)
9850 {
9851 if (!sEmotesStore.LookupEntry(bct.EmoteId2))
9852 {
9853 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId2 {} but emote does not exist.", bct.Id, bct.EmoteId2);
9854 bct.EmoteId2 = 0;
9855 }
9856 }
9857
9858 if (bct.EmoteId3)
9859 {
9860 if (!sEmotesStore.LookupEntry(bct.EmoteId3))
9861 {
9862 LOG_DEBUG("misc", "BroadcastText (Id: {}) in table `broadcast_text` has EmoteId3 {} but emote does not exist.", bct.Id, bct.EmoteId3);
9863 bct.EmoteId3 = 0;
9864 }
9865 }
9866
9867 _broadcastTextStore[bct.Id] = bct;
9868 } while (result->NextRow());
9869
9870 LOG_INFO("server.loading", ">> Loaded {} Broadcast Texts in {} ms", _broadcastTextStore.size(), GetMSTimeDiffToNow(oldMSTime));
9871}
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:61
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:2339
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 ( )
9941{
9942 uint32 oldMSTime = getMSTime();
9943
9944 QueryResult result = WorldDatabase.Query("SELECT level, class, basehp0, basehp1, basehp2, basemana, basearmor, attackpower, rangedattackpower, damage_base, damage_exp1, damage_exp2 FROM creature_classlevelstats");
9945
9946 if (!result)
9947 {
9948 LOG_WARN("server.loading", ">> Loaded 0 creature base stats. DB table `creature_classlevelstats` is empty.");
9949 LOG_INFO("server.loading", " ");
9950 return;
9951 }
9952
9953 uint32 count = 0;
9954 do
9955 {
9956 Field* fields = result->Fetch();
9957
9958 uint8 Level = fields[0].Get<uint8>();
9959 uint8 Class = fields[1].Get<uint8>();
9960
9961 if (!Class || ((1 << (Class - 1)) & CLASSMASK_ALL_CREATURES) == 0)
9962 LOG_ERROR("sql.sql", "Creature base stats for level {} has invalid class {}", Level, Class);
9963
9964 CreatureBaseStats stats;
9965
9966 for (uint8 i = 0; i < MAX_EXPANSIONS; ++i)
9967 {
9968 stats.BaseHealth[i] = fields[2 + i].Get<uint32>();
9969
9970 if (stats.BaseHealth[i] == 0)
9971 {
9972 LOG_ERROR("sql.sql", "Creature base stats for class {}, level {} has invalid zero base HP[{}] - set to 1", Class, Level, i);
9973 stats.BaseHealth[i] = 1;
9974 }
9975
9976 // xinef: if no data is available, get them from lower expansions
9977 if (stats.BaseHealth[i] <= 1)
9978 {
9979 for (uint8 j = i; j > 0;)
9980 {
9981 --j;
9982 if (stats.BaseHealth[j] > 1)
9983 {
9984 stats.BaseHealth[i] = stats.BaseHealth[j];
9985 break;
9986 }
9987 }
9988 }
9989
9990 stats.BaseDamage[i] = fields[9 + i].Get<float>();
9991 if (stats.BaseDamage[i] < 0.0f)
9992 {
9993 LOG_ERROR("sql.sql", "Creature base stats for class {}, level {} has invalid negative base damage[{}] - set to 0.0", Class, Level, i);
9994 stats.BaseDamage[i] = 0.0f;
9995 }
9996 }
9997
9998 stats.BaseMana = fields[5].Get<uint32>();
9999 stats.BaseArmor = fields[6].Get<uint32>();
10000
10001 stats.AttackPower = fields[7].Get<uint32>();
10002 stats.RangedAttackPower = fields[8].Get<uint32>();
10003
10005
10006 ++count;
10007 } while (result->NextRow());
10008
10009 CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
10010 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
10011 {
10012 for (uint16 lvl = itr->second.minlevel; lvl <= itr->second.maxlevel; ++lvl)
10013 {
10014 if (_creatureBaseStatsStore.find(MAKE_PAIR16(lvl, itr->second.unit_class)) == _creatureBaseStatsStore.end())
10015 LOG_ERROR("sql.sql", "Missing base stats for creature class {} level {}", itr->second.unit_class, lvl);
10016 }
10017 }
10018
10019 LOG_INFO("server.loading", ">> Loaded {} Creature Base Stats in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10020 LOG_INFO("server.loading", " ");
10021}
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.
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(), getMSTime(), GetMSTimeDiffToNow(), Level, LOG_ERROR, LOG_INFO, LOG_WARN, MAKE_PAIR16(), MAX_EXPANSIONS, CreatureBaseStats::RangedAttackPower, sObjectMgr, and WorldDatabase.

◆ LoadCreatureCustomIDs()

void ObjectMgr::LoadCreatureCustomIDs ( )

Load config option Creatures.CustomIDs into Store.

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

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

◆ LoadCreatureLocales()

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

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

◆ LoadCreatureModelInfo()

void ObjectMgr::LoadCreatureModelInfo ( )
1714{
1715 uint32 oldMSTime = getMSTime();
1716
1717 // 0 1 2 3 4
1718 QueryResult result = WorldDatabase.Query("SELECT DisplayID, BoundingRadius, CombatReach, Gender, DisplayID_Other_Gender FROM creature_model_info");
1719
1720 if (!result)
1721 {
1722 LOG_WARN("server.loading", ">> Loaded 0 creature model definitions. DB table `creature_model_info` is empty.");
1723 LOG_INFO("server.loading", " ");
1724 return;
1725 }
1726
1727 _creatureModelStore.rehash(result->GetRowCount());
1728 uint32 count = 0;
1729
1730 // List of ModelDataIDs that use Invisible models
1731 uint32 triggerCreatureModelDataID[14] = { 1731, 1752, 2206, 2296, 2372, 2382, 2481, 2512, 2513, 2611, 2636, 2790, 3230, 3274 };
1732
1733 do
1734 {
1735 Field* fields = result->Fetch();
1736
1737 uint32 displayId = fields[0].Get<uint32>();
1738 CreatureDisplayInfoEntry const* creatureDisplay = sCreatureDisplayInfoStore.LookupEntry(displayId);
1739 uint32 modelId = fields[0].Get<uint32>();
1740
1741 CreatureModelInfo& modelInfo = _creatureModelStore[modelId];
1742
1743 modelInfo.bounding_radius = fields[1].Get<float>();
1744 modelInfo.combat_reach = fields[2].Get<float>();
1745 modelInfo.gender = fields[3].Get<uint8>();
1746 modelInfo.modelid_other_gender = fields[4].Get<uint32>();
1747 modelInfo.is_trigger = false;
1748
1749 // Checks
1750
1751 if (!sCreatureDisplayInfoStore.LookupEntry(modelId))
1752 LOG_ERROR("sql.sql", "Table `creature_model_info` has model for not existed display id ({}).", modelId);
1753
1754 if (modelInfo.gender > GENDER_NONE)
1755 {
1756 LOG_ERROR("sql.sql", "Table `creature_model_info` has wrong gender ({}) for display id ({}).", uint32(modelInfo.gender), modelId);
1757 modelInfo.gender = GENDER_MALE;
1758 }
1759
1760 if (modelInfo.modelid_other_gender && !sCreatureDisplayInfoStore.LookupEntry(modelInfo.modelid_other_gender))
1761 {
1762 LOG_ERROR("sql.sql", "Table `creature_model_info` has not existed alt.gender model ({}) for existed display id ({}).", modelInfo.modelid_other_gender, modelId);
1763 modelInfo.modelid_other_gender = 0;
1764 }
1765
1766 if (modelInfo.combat_reach < 0.1f)
1767 modelInfo.combat_reach = DEFAULT_COMBAT_REACH;
1768
1769 if (CreatureModelDataEntry const* modelData = sCreatureModelDataStore.LookupEntry(creatureDisplay->ModelId))
1770 {
1771 for (uint32 i = 0; i < 14; i++)
1772 {
1773 if (modelData->Id == triggerCreatureModelDataID[i])
1774 {
1775 modelInfo.is_trigger = true;
1776 break;
1777 }
1778 }
1779 }
1780
1781 ++count;
1782 } while (result->NextRow());
1783
1784 LOG_INFO("server.loading", ">> Loaded {} Creature Model Based Info in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1785 LOG_INFO("server.loading", " ");
1786}
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 ( )
8313{
8314 LoadQuestRelationsHelper(_creatureQuestInvolvedRelations, "creature_questender", false, false);
8315
8316 for (QuestRelations::iterator itr = _creatureQuestInvolvedRelations.begin(); itr != _creatureQuestInvolvedRelations.end(); ++itr)
8317 {
8318 CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
8319 if (!cInfo)
8320 LOG_ERROR("sql.sql", "Table `creature_questender` have data for not existed creature entry ({}) and existed quest {}", itr->first, itr->second);
8321 else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
8322 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);
8323 }
8324}
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:316
void LoadQuestRelationsHelper(QuestRelations &map, std::string const &table, bool starter, bool go)
Definition ObjectMgr.cpp:8225

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadCreatureQuestItems()

void ObjectMgr::LoadCreatureQuestItems ( )
10342{
10343 uint32 oldMSTime = getMSTime();
10344
10345 // 0 1 2
10346 QueryResult result = WorldDatabase.Query("SELECT CreatureEntry, ItemId, Idx FROM creature_questitem ORDER BY Idx ASC");
10347
10348 if (!result)
10349 {
10350 LOG_WARN("server.loading", ">> Loaded 0 creature quest items. DB table `creature_questitem` is empty.");
10351 return;
10352 }
10353
10354 uint32 count = 0;
10355 do
10356 {
10357 Field* fields = result->Fetch();
10358
10359 uint32 entry = fields[0].Get<uint32>();
10360 uint32 item = fields[1].Get<uint32>();
10361 uint32 idx = fields[2].Get<uint32>();
10362
10363 CreatureTemplate const* creatureInfo = GetCreatureTemplate(entry);
10364 if (!creatureInfo)
10365 {
10366 LOG_ERROR("sql.sql", "Table `creature_questitem` has data for nonexistent creature (entry: {}, idx: {}), skipped", entry, idx);
10367 continue;
10368 };
10369
10370 ItemEntry const* dbcData = sItemStore.LookupEntry(item);
10371 if (!dbcData)
10372 {
10373 LOG_ERROR("sql.sql", "Table `creature_questitem` has nonexistent item (ID: {}) in creature (entry: {}, idx: {}), skipped", item, entry, idx);
10374 continue;
10375 };
10376
10377 _creatureQuestItemStore[entry].push_back(item);
10378
10379 ++count;
10380 } while (result->NextRow());
10381
10382 LOG_INFO("server.loading", ">> Loaded {} Creature Quest Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10383 LOG_INFO("server.loading", " ");
10384}
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 ( )
8299{
8300 LoadQuestRelationsHelper(_creatureQuestRelations, "creature_queststarter", true, false);
8301
8302 for (QuestRelations::iterator itr = _creatureQuestRelations.begin(); itr != _creatureQuestRelations.end(); ++itr)
8303 {
8304 CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
8305 if (!cInfo)
8306 LOG_ERROR("sql.sql", "Table `creature_queststarter` have data for not existed creature entry ({}) and existed quest {}", itr->first, itr->second);
8307 else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
8308 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);
8309 }
8310}

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

References _creatureSparringStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sObjectMgr, 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 (!sObjectMgr->GetCreatureTemplate(entry))
875 {
876 LOG_ERROR("sql.sql", "Creature template (Entry: {}) does not exist but has a record in `creature_template_addon`", entry);
877 continue;
878 }
879
880 CreatureAddon& creatureAddon = _creatureTemplateAddonStore[entry];
881
882 creatureAddon.path_id = fields[1].Get<uint32>();
883 creatureAddon.mount = fields[2].Get<uint32>();
884 creatureAddon.bytes1 = fields[3].Get<uint32>();
885 creatureAddon.bytes2 = fields[4].Get<uint32>();
886 creatureAddon.emote = fields[5].Get<uint32>();
887 creatureAddon.visibilityDistanceType = VisibilityDistanceType(fields[6].Get<uint8>());
888
889 for (std::string_view aura : Acore::Tokenize(fields[7].Get<std::string_view>(), ' ', false))
890 {
891 SpellInfo const* spellInfo = nullptr;
892
893 if (Optional<uint32> spellId = Acore::StringTo<uint32>(aura))
894 {
895 spellInfo = sSpellMgr->GetSpellInfo(*spellId);
896 }
897
898 if (!spellInfo)
899 {
900 LOG_ERROR("sql.sql", "Creature (Entry: {}) has wrong spell '{}' defined in `auras` field in `creature_template_addon`.", entry, aura);
901 continue;
902 }
903
904 if (std::find(creatureAddon.auras.begin(), creatureAddon.auras.end(), spellInfo->Id) != creatureAddon.auras.end())
905 {
906 LOG_ERROR("sql.sql", "Creature (Entry: {}) has duplicate aura (spell {}) in `auras` field in `creature_template_addon`.", entry, spellInfo->Id);
907 continue;
908 }
909
910 if (spellInfo->GetDuration() > 0)
911 {
912 LOG_DEBUG/*ERROR*/("sql.sql", "Creature (Entry: {}) has temporary aura (spell {}) in `auras` field in `creature_template_addon`.", entry, spellInfo->Id);
913 // continue;
914 }
915
916 creatureAddon.auras.push_back(spellInfo->Id);
917 }
918
919 if (creatureAddon.mount)
920 {
921 if (!sCreatureDisplayInfoStore.LookupEntry(creatureAddon.mount))
922 {
923 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid displayInfoId ({}) for mount defined in `creature_template_addon`", entry, creatureAddon.mount);
924 creatureAddon.mount = 0;
925 }
926 }
927
928 if (!sEmotesStore.LookupEntry(creatureAddon.emote))
929 {
930 LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid emote ({}) defined in `creature_addon`.", entry, creatureAddon.emote);
931 creatureAddon.emote = 0;
932 }
933
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(), SpellInfo::GetDuration(), getMSTime(), GetMSTimeDiffToNow(), SpellInfo::Id, LOG_DEBUG, LOG_ERROR, LOG_INFO, LOG_WARN, Max, CreatureAddon::mount, Normal, CreatureAddon::path_id, sCreatureDisplayInfoStore, sEmotesStore, sObjectMgr, sSpellMgr, Acore::Tokenize(), CreatureAddon::visibilityDistanceType, and WorldDatabase.

◆ LoadCreatureTemplateModels()

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

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

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplateResistances()

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

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

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplates()

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

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

◆ LoadCreatureTemplateSpells()

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

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

Referenced by LoadCreatureTemplates().

◆ LoadEquipmentTemplates()

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

◆ LoadEventScripts()

void ObjectMgr::LoadEventScripts ( )
5724{
5726
5727 std::set<uint32> evt_scripts;
5728 // Load all possible script entries from gameobjects
5729 GameObjectTemplateContainer const* gotc = sObjectMgr->GetGameObjectTemplates();
5730 for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
5731 if (uint32 eventId = itr->second.GetEventScriptId())
5732 evt_scripts.insert(eventId);
5733
5734 // Load all possible script entries from spells
5735 for (uint32 i = 1; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
5736 if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(i))
5737 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
5738 if (spell->Effects[j].Effect == SPELL_EFFECT_SEND_EVENT)
5739 if (spell->Effects[j].MiscValue)
5740 evt_scripts.insert(spell->Effects[j].MiscValue);
5741
5742 for (std::size_t path_idx = 0; path_idx < sTaxiPathNodesByPath.size(); ++path_idx)
5743 {
5744 for (std::size_t node_idx = 0; node_idx < sTaxiPathNodesByPath[path_idx].size(); ++node_idx)
5745 {
5746 TaxiPathNodeEntry const* node = sTaxiPathNodesByPath[path_idx][node_idx];
5747
5748 if (node->arrivalEventID)
5749 evt_scripts.insert(node->arrivalEventID);
5750
5751 if (node->departureEventID)
5752 evt_scripts.insert(node->departureEventID);
5753 }
5754 }
5755
5756 // Then check if all scripts are in above list of possible script entries
5757 for (ScriptMapMap::const_iterator itr = sEventScripts.begin(); itr != sEventScripts.end(); ++itr)
5758 {
5759 std::set<uint32>::const_iterator itr2 = evt_scripts.find(itr->first);
5760 if (itr2 == evt_scripts.end())
5761 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 {}",
5762 itr->first, SPELL_EFFECT_SEND_EVENT);
5763 }
5764}
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
void LoadScripts(ScriptsType type)
Definition ObjectMgr.cpp:5381
Definition DBCStructure.h:1974
uint32 arrivalEventID
Definition DBCStructure.h:1984
uint32 departureEventID
Definition DBCStructure.h:1985

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

◆ LoadExplorationBaseXP()

void ObjectMgr::LoadExplorationBaseXP ( )
7605{
7606 uint32 oldMSTime = getMSTime();
7607
7608 QueryResult result = WorldDatabase.Query("SELECT level, basexp FROM exploration_basexp");
7609
7610 if (!result)
7611 {
7612 LOG_WARN("server.loading", ">> Loaded 0 BaseXP definitions. DB table `exploration_basexp` is empty.");
7613 LOG_INFO("server.loading", " ");
7614 return;
7615 }
7616
7617 uint32 count = 0;
7618
7619 do
7620 {
7621 Field* fields = result->Fetch();
7622 uint8 level = fields[0].Get<uint8>();
7623 uint32 basexp = fields[1].Get<int32>();
7624 _baseXPTable[level] = basexp;
7625 ++count;
7626 } while (result->NextRow());
7627
7628 LOG_INFO("server.loading", ">> Loaded {} BaseXP Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7629 LOG_INFO("server.loading", " ");
7630}
std::int32_t int32
Definition Define.h:103

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

◆ LoadFactionChangeAchievements()

void ObjectMgr::LoadFactionChangeAchievements ( )
10024{
10025 uint32 oldMSTime = getMSTime();
10026
10027 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_achievement");
10028
10029 if (!result)
10030 {
10031 LOG_WARN("server.loading", ">> Loaded 0 faction change achievement pairs. DB table `player_factionchange_achievement` is empty.");
10032 LOG_INFO("server.loading", " ");
10033 return;
10034 }
10035
10036 uint32 count = 0;
10037
10038 do
10039 {
10040 Field* fields = result->Fetch();
10041
10042 uint32 alliance = fields[0].Get<uint32>();
10043 uint32 horde = fields[1].Get<uint32>();
10044
10045 if (!sAchievementStore.LookupEntry(alliance))
10046 LOG_ERROR("sql.sql", "Achievement {} (alliance_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", alliance);
10047 else if (!sAchievementStore.LookupEntry(horde))
10048 LOG_ERROR("sql.sql", "Achievement {} (horde_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", horde);
10049 else
10050 FactionChangeAchievements[alliance] = horde;
10051
10052 ++count;
10053 } while (result->NextRow());
10054
10055 LOG_INFO("server.loading", ">> Loaded {} faction change achievement pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10056 LOG_INFO("server.loading", " ");
10057}
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 ( )
10060{
10061 uint32 oldMSTime = getMSTime();
10062
10063 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_items");
10064
10065 if (!result)
10066 {
10067 LOG_WARN("server.loading", ">> Loaded 0 faction change item pairs. DB table `player_factionchange_items` 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 (!GetItemTemplate(alliance))
10082 LOG_ERROR("sql.sql", "Item {} (alliance_id) referenced in `player_factionchange_items` does not exist, pair skipped!", alliance);
10083 else if (!GetItemTemplate(horde))
10084 LOG_ERROR("sql.sql", "Item {} (horde_id) referenced in `player_factionchange_items` does not exist, pair skipped!", horde);
10085 else
10086 FactionChangeItems[alliance] = horde;
10087
10088 ++count;
10089 } while (result->NextRow());
10090
10091 LOG_INFO("server.loading", ">> Loaded {} faction change item pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10092 LOG_INFO("server.loading", " ");
10093}
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 ( )
10096{
10097 uint32 oldMSTime = getMSTime();
10098
10099 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_quests");
10100
10101 if (!result)
10102 {
10103 LOG_WARN("server.loading", ">> Loaded 0 faction change quest pairs. DB table `player_factionchange_quests` 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 (!sObjectMgr->GetQuestTemplate(alliance))
10118 LOG_ERROR("sql.sql", "Quest {} (alliance_id) referenced in `player_factionchange_quests` does not exist, pair skipped!", alliance);
10119 else if (!sObjectMgr->GetQuestTemplate(horde))
10120 LOG_ERROR("sql.sql", "Quest {} (horde_id) referenced in `player_factionchange_quests` does not exist, pair skipped!", horde);
10121 else
10122 FactionChangeQuests[alliance] = horde;
10123
10124 ++count;
10125 } while (result->NextRow());
10126
10127 LOG_INFO("server.loading", ">> Loaded {} faction change quest pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10128 LOG_INFO("server.loading", " ");
10129}
CharacterConversionMap FactionChangeQuests
Definition ObjectMgr.h:1434

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

◆ LoadFactionChangeReputations()

void ObjectMgr::LoadFactionChangeReputations ( )
10132{
10133 uint32 oldMSTime = getMSTime();
10134
10135 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_reputations");
10136
10137 if (!result)
10138 {
10139 LOG_WARN("server.loading", ">> Loaded 0 faction change reputation pairs. DB table `player_factionchange_reputations` 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 (!sFactionStore.LookupEntry(alliance))
10154 LOG_ERROR("sql.sql", "Reputation {} (alliance_id) referenced in `player_factionchange_reputations` does not exist, pair skipped!", alliance);
10155 else if (!sFactionStore.LookupEntry(horde))
10156 LOG_ERROR("sql.sql", "Reputation {} (horde_id) referenced in `player_factionchange_reputations` does not exist, pair skipped!", horde);
10157 else
10158 FactionChangeReputation[alliance] = horde;
10159
10160 ++count;
10161 } while (result->NextRow());
10162
10163 LOG_INFO("server.loading", ">> Loaded {} faction change reputation pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10164 LOG_INFO("server.loading", " ");
10165}
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 ( )
10168{
10169 uint32 oldMSTime = getMSTime();
10170
10171 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_spells");
10172
10173 if (!result)
10174 {
10175 LOG_WARN("server.loading", ">> Loaded 0 faction change spell pairs. DB table `player_factionchange_spells` 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 (!sSpellMgr->GetSpellInfo(alliance))
10190 LOG_ERROR("sql.sql", "Spell {} (alliance_id) referenced in `player_factionchange_spells` does not exist, pair skipped!", alliance);
10191 else if (!sSpellMgr->GetSpellInfo(horde))
10192 LOG_ERROR("sql.sql", "Spell {} (horde_id) referenced in `player_factionchange_spells` does not exist, pair skipped!", horde);
10193 else
10194 FactionChangeSpells[alliance] = horde;
10195
10196 ++count;
10197 } while (result->NextRow());
10198
10199 LOG_INFO("server.loading", ">> Loaded {} faction change spell pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10200 LOG_INFO("server.loading", " ");
10201}
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 ( )
10204{
10205 uint32 oldMSTime = getMSTime();
10206
10207 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_titles");
10208
10209 if (!result)
10210 {
10211 LOG_WARN("server.loading", ">> Loaded 0 faction change title pairs. DB table `player_factionchange_title` is empty.");
10212 return;
10213 }
10214
10215 uint32 count = 0;
10216
10217 do
10218 {
10219 Field* fields = result->Fetch();
10220
10221 uint32 alliance = fields[0].Get<uint32>();
10222 uint32 horde = fields[1].Get<uint32>();
10223
10224 if (!sCharTitlesStore.LookupEntry(alliance))
10225 LOG_ERROR("sql.sql", "Title {} (alliance_id) referenced in `player_factionchange_title` does not exist, pair skipped!", alliance);
10226 else if (!sCharTitlesStore.LookupEntry(horde))
10227 LOG_ERROR("sql.sql", "Title {} (horde_id) referenced in `player_factionchange_title` does not exist, pair skipped!", horde);
10228 else
10229 FactionChangeTitles[alliance] = horde;
10230
10231 ++count;
10232 } while (result->NextRow());
10233
10234 LOG_INFO("server.loading", ">> Loaded {} faction change title pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10235 LOG_INFO("server.loading", " ");
10236}
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 ( )
8927{
8928 uint32 oldMSTime = getMSTime();
8929
8930 _fishingBaseForAreaStore.clear(); // for reload case
8931
8932 QueryResult result = WorldDatabase.Query("SELECT entry, skill FROM skill_fishing_base_level");
8933
8934 if (!result)
8935 {
8936 LOG_WARN("server.loading", ">> Loaded 0 areas for fishing base skill level. DB table `skill_fishing_base_level` is empty.");
8937 LOG_INFO("server.loading", " ");
8938 return;
8939 }
8940
8941 uint32 count = 0;
8942
8943 do
8944 {
8945 Field* fields = result->Fetch();
8946 uint32 entry = fields[0].Get<uint32>();
8947 int32 skill = fields[1].Get<int16>();
8948
8949 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
8950 if (!fArea)
8951 {
8952 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
8953 continue;
8954 }
8955
8956 _fishingBaseForAreaStore[entry] = skill;
8957 ++count;
8958 } while (result->NextRow());
8959
8960 LOG_INFO("server.loading", ">> Loaded {} areas for fishing base skill level in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8961 LOG_INFO("server.loading", " ");
8962}

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 ( )
8713{
8714 uint32 oldMSTime = getMSTime();
8715
8716 if (sObjectMgr->GetGameObjectTemplates()->empty())
8717 {
8718 LOG_WARN("server.loading", ">> Loaded 0 GameObjects for quests");
8719 LOG_INFO("server.loading", " ");
8720 return;
8721 }
8722
8723 uint32 count = 0;
8724
8725 // collect GO entries for GO that must activated
8726 GameObjectTemplateContainer* gotc = const_cast<GameObjectTemplateContainer*>(sObjectMgr->GetGameObjectTemplates());
8727 for (GameObjectTemplateContainer::iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
8728 {
8729 itr->second.IsForQuests = false;
8730 switch (itr->second.type)
8731 {
8733 itr->second.IsForQuests = true;
8734 ++count;
8735 break;
8737 {
8738 // scan GO chest with loot including quest items
8739 uint32 loot_id = (itr->second.GetLootId());
8740
8741 // find quest loot for GO
8742 if (itr->second.chest.questId || LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
8743 {
8744 itr->second.IsForQuests = true;
8745 ++count;
8746 }
8747 break;
8748 }
8750 {
8751 if (itr->second._generic.questID > 0) //quests objects
8752 {
8753 itr->second.IsForQuests = true;
8754 ++count;
8755 }
8756 break;
8757 }
8759 {
8760 if (itr->second.spellFocus.questID > 0) //quests objects
8761 {
8762 itr->second.IsForQuests = true;
8763 ++count;
8764 }
8765 break;
8766 }
8768 {
8769 if (itr->second.goober.questId > 0) //quests objects
8770 {
8771 itr->second.IsForQuests = true;
8772 ++count;
8773 }
8774 break;
8775 }
8776 default:
8777 break;
8778 }
8779 }
8780
8781 LOG_INFO("server.loading", ">> Loaded {} GameObjects for quests in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8782 LOG_INFO("server.loading", " ");
8783}
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, getMSTime(), GetMSTimeDiffToNow(), LootStore::HaveQuestLootFor(), LOG_INFO, LOG_WARN, LootTemplates_Gameobject, and sObjectMgr.

◆ LoadGameObjectLocales()

void ObjectMgr::LoadGameObjectLocales ( )
7249{
7250 uint32 oldMSTime = getMSTime();
7251
7252 _gameObjectLocaleStore.clear(); // need for reload case
7253
7254 // 0 1 2 3
7255 QueryResult result = WorldDatabase.Query("SELECT entry, locale, name, castBarCaption FROM gameobject_template_locale");
7256 if (!result)
7257 return;
7258
7259 do
7260 {
7261 Field* fields = result->Fetch();
7262
7263 uint32 ID = fields[0].Get<uint32>();
7264
7265 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
7266 if (locale == LOCALE_enUS)
7267 continue;
7268
7270 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
7271 AddLocaleString(fields[3].Get<std::string>(), locale, data.CastBarCaption);
7272 } while (result->NextRow());
7273
7274 LOG_INFO("server.loading", ">> Loaded {} Gameobject Locale Strings in {} ms", (uint32)_gameObjectLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
7275}
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 ( )
8285{
8286 LoadQuestRelationsHelper(_goQuestInvolvedRelations, "gameobject_questender", false, true);
8287
8288 for (QuestRelations::iterator itr = _goQuestInvolvedRelations.begin(); itr != _goQuestInvolvedRelations.end(); ++itr)
8289 {
8290 GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
8291 if (!goInfo)
8292 LOG_ERROR("sql.sql", "Table `gameobject_questender` have data for not existed gameobject entry ({}) and existed quest {}", itr->first, itr->second);
8293 else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
8294 LOG_ERROR("sql.sql", "Table `gameobject_questender` have data gameobject entry ({}) for quest {}, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
8295 }
8296}

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameObjectQuestItems()

void ObjectMgr::LoadGameObjectQuestItems ( )
10297{
10298 uint32 oldMSTime = getMSTime();
10299
10300 // 0 1 2
10301 QueryResult result = WorldDatabase.Query("SELECT GameObjectEntry, ItemId, Idx FROM gameobject_questitem ORDER BY Idx ASC");
10302
10303 if (!result)
10304 {
10305 LOG_WARN("server.loading", ">> Loaded 0 gameobject quest items. DB table `gameobject_questitem` is empty.");
10306 return;
10307 }
10308
10309 uint32 count = 0;
10310 do
10311 {
10312 Field* fields = result->Fetch();
10313
10314 uint32 entry = fields[0].Get<uint32>();
10315 uint32 item = fields[1].Get<uint32>();
10316 uint32 idx = fields[2].Get<uint32>();
10317
10318 GameObjectTemplate const* goInfo = GetGameObjectTemplate(entry);
10319 if (!goInfo)
10320 {
10321 LOG_ERROR("sql.sql", "Table `gameobject_questitem` has data for nonexistent gameobject (entry: {}, idx: {}), skipped", entry, idx);
10322 continue;
10323 };
10324
10325 ItemEntry const* dbcData = sItemStore.LookupEntry(item);
10326 if (!dbcData)
10327 {
10328 LOG_ERROR("sql.sql", "Table `gameobject_questitem` has nonexistent item (ID: {}) in gameobject (entry: {}, idx: {}), skipped", item, entry, idx);
10329 continue;
10330 };
10331
10332 _gameObjectQuestItemStore[entry].push_back(item);
10333
10334 ++count;
10335 } while (result->NextRow());
10336
10337 LOG_INFO("server.loading", ">> Loaded {} Gameobject Quest Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10338 LOG_INFO("server.loading", " ");
10339}

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

◆ LoadGameobjectQuestStarters()

void ObjectMgr::LoadGameobjectQuestStarters ( )
8271{
8272 LoadQuestRelationsHelper(_goQuestRelations, "gameobject_queststarter", true, true);
8273
8274 for (QuestRelations::iterator itr = _goQuestRelations.begin(); itr != _goQuestRelations.end(); ++itr)
8275 {
8276 GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
8277 if (!goInfo)
8278 LOG_ERROR("sql.sql", "Table `gameobject_queststarter` have data for not existed gameobject entry ({}) and existed quest {}", itr->first, itr->second);
8279 else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
8280 LOG_ERROR("sql.sql", "Table `gameobject_queststarter` have data gameobject entry ({}) for quest {}, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
8281 }
8282}

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameobjects()

void ObjectMgr::LoadGameobjects ( )
2605{
2606 uint32 oldMSTime = getMSTime();
2607
2608 // 0 1 2 3 4 5 6
2609 QueryResult result = WorldDatabase.Query("SELECT gameobject.guid, id, map, position_x, position_y, position_z, orientation, "
2610 // 7 8 9 10 11 12 13 14 15 16 17
2611 "rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state, spawnMask, phaseMask, eventEntry, pool_entry, "
2612 // 18
2613 "ScriptName "
2614 "FROM gameobject LEFT OUTER JOIN game_event_gameobject ON gameobject.guid = game_event_gameobject.guid "
2615 "LEFT OUTER JOIN pool_gameobject ON gameobject.guid = pool_gameobject.guid");
2616
2617 if (!result)
2618 {
2619 LOG_WARN("server.loading", ">> Loaded 0 gameobjects. DB table `gameobject` is empty.");
2620 LOG_INFO("server.loading", " ");
2621 return;
2622 }
2623
2624 // build single time for check spawnmask
2625 std::map<uint32, uint32> spawnMasks;
2626 for (uint32 i = 0; i < sMapStore.GetNumRows(); ++i)
2627 if (sMapStore.LookupEntry(i))
2628 for (int k = 0; k < MAX_DIFFICULTY; ++k)
2630 spawnMasks[i] |= (1 << k);
2631
2632 _gameObjectDataStore.rehash(result->GetRowCount());
2633 do
2634 {
2635 Field* fields = result->Fetch();
2636
2637 ObjectGuid::LowType guid = fields[0].Get<uint32>();
2638 uint32 entry = fields[1].Get<uint32>();
2639
2640 GameObjectTemplate const* gInfo = GetGameObjectTemplate(entry);
2641 if (!gInfo)
2642 {
2643 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {}) with non existing gameobject entry {}, skipped.", guid, entry);
2644 continue;
2645 }
2646
2647 if (!gInfo->displayId)
2648 {
2649 switch (gInfo->type)
2650 {
2653 break;
2654 default:
2655 LOG_ERROR("sql.sql", "Gameobject (GUID: {} Entry {} GoType: {}) doesn't have a displayId ({}), not loaded.", guid, entry, gInfo->type, gInfo->displayId);
2656 break;
2657 }
2658 }
2659
2660 if (gInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(gInfo->displayId))
2661 {
2662 LOG_ERROR("sql.sql", "Gameobject (GUID: {} Entry {} GoType: {}) has an invalid displayId ({}), not loaded.", guid, entry, gInfo->type, gInfo->displayId);
2663 continue;
2664 }
2665
2667
2668 data.id = entry;
2669 data.mapid = fields[2].Get<uint16>();
2670 data.posX = fields[3].Get<float>();
2671 data.posY = fields[4].Get<float>();
2672 data.posZ = fields[5].Get<float>();
2673 data.orientation = fields[6].Get<float>();
2674 data.rotation.x = fields[7].Get<float>();
2675 data.rotation.y = fields[8].Get<float>();
2676 data.rotation.z = fields[9].Get<float>();
2677 data.rotation.w = fields[10].Get<float>();
2678 data.spawntimesecs = fields[11].Get<int32>();
2679 data.ScriptId = GetScriptId(fields[18].Get<std::string>());
2680 if (!data.ScriptId)
2681 data.ScriptId = gInfo->ScriptId;
2682
2683 MapEntry const* mapEntry = sMapStore.LookupEntry(data.mapid);
2684 if (!mapEntry)
2685 {
2686 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) spawned on a non-existed map (Id: {}), skip", guid, data.id, data.mapid);
2687 continue;
2688 }
2689
2690 if (data.spawntimesecs == 0 && gInfo->IsDespawnAtAction())
2691 {
2692 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);
2693 }
2694
2695 data.animprogress = fields[12].Get<uint8>();
2696 data.artKit = 0;
2697
2698 uint32 go_state = fields[13].Get<uint8>();
2699 if (go_state >= MAX_GO_STATE)
2700 {
2701 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid `state` ({}) value, skip", guid, data.id, go_state);
2702 continue;
2703 }
2704 data.go_state = GOState(go_state);
2705
2706 data.spawnMask = fields[14].Get<uint8>();
2707
2708 if (!_transportMaps.count(data.mapid) && data.spawnMask & ~spawnMasks[data.mapid])
2709 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);
2710
2711 data.phaseMask = fields[15].Get<uint32>();
2712 int16 gameEvent = fields[16].Get<int16>();
2713 uint32 PoolId = fields[17].Get<uint32>();
2714
2715 if (data.rotation.x < -1.0f || data.rotation.x > 1.0f)
2716 {
2717 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationX ({}) value, skip", guid, data.id, data.rotation.x);
2718 continue;
2719 }
2720
2721 if (data.rotation.y < -1.0f || data.rotation.y > 1.0f)
2722 {
2723 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationY ({}) value, skip", guid, data.id, data.rotation.y);
2724 continue;
2725 }
2726
2727 if (data.rotation.z < -1.0f || data.rotation.z > 1.0f)
2728 {
2729 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationZ ({}) value, skip", guid, data.id, data.rotation.z);
2730 continue;
2731 }
2732
2733 if (data.rotation.w < -1.0f || data.rotation.w > 1.0f)
2734 {
2735 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid rotationW ({}) value, skip", guid, data.id, data.rotation.w);
2736 continue;
2737 }
2738
2739 if (!MapMgr::IsValidMapCoord(data.mapid, data.posX, data.posY, data.posZ, data.orientation))
2740 {
2741 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with invalid coordinates, skip", guid, data.id);
2742 continue;
2743 }
2744
2745 if (data.phaseMask == 0)
2746 {
2747 LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) with `phaseMask`=0 (not visible for anyone), set to 1.", guid, data.id);
2748 data.phaseMask = 1;
2749 }
2750
2752 {
2753 uint32 zoneId = sMapMgr->GetZoneId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
2754 uint32 areaId = sMapMgr->GetAreaId(data.phaseMask, data.mapid, data.posX, data.posY, data.posZ);
2755
2757
2758 stmt->SetData(0, zoneId);
2759 stmt->SetData(1, areaId);
2760 stmt->SetData(2, guid);
2761
2762 WorldDatabase.Execute(stmt);
2763 }
2764
2765 if (gameEvent == 0 && PoolId == 0) // if not this is to be managed by GameEvent System or Pool system
2766 AddGameobjectToGrid(guid, &data);
2767 } while (result->NextRow());
2768
2769 LOG_INFO("server.loading", ">> Loaded {} Gameobjects in {} ms", (unsigned long)_gameObjectDataStore.size(), GetMSTimeDiffToNow(oldMSTime));
2770 LOG_INFO("server.loading", " ");
2771}
DBCStorage< GameObjectDisplayInfoEntry > sGameObjectDisplayInfoStore(GameObjectDisplayInfofmt)
#define MAX_GO_STATE
Definition GameObjectData.h:27
GOState
Definition GameObjectData.h:688
@ CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA
Definition IWorld.h:151
@ GAMEOBJECT_TYPE_TRAP
Definition SharedDefines.h:1566
@ 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 ( )
7337{
7338 uint32 oldMSTime = getMSTime();
7339
7340 // 0 1 2 3 4 5 6 7
7341 QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, size, "
7342 // 8 9 10 11 12 13 14 15 16 17 18 19 20
7343 "Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, "
7344 // 21 22 23 24 25 26 27 28 29 30 31 32 33
7345 "Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, AIName, ScriptName "
7346 "FROM gameobject_template");
7347
7348 if (!result)
7349 {
7350 LOG_WARN("server.loading", ">> Loaded 0 gameobject definitions. DB table `gameobject_template` is empty.");
7351 LOG_INFO("server.loading", " ");
7352 return;
7353 }
7354
7355 _gameObjectTemplateStore.rehash(result->GetRowCount());
7356 uint32 count = 0;
7357 do
7358 {
7359 Field* fields = result->Fetch();
7360
7361 uint32 entry = fields[0].Get<uint32>();
7362
7364
7365 got.entry = entry;
7366 got.type = uint32(fields[1].Get<uint8>());
7367 got.displayId = fields[2].Get<uint32>();
7368 got.name = fields[3].Get<std::string>();
7369 got.IconName = fields[4].Get<std::string>();
7370 got.castBarCaption = fields[5].Get<std::string>();
7371 got.unk1 = fields[6].Get<std::string>();
7372 got.size = fields[7].Get<float>();
7373
7374 for (uint8 i = 0; i < MAX_GAMEOBJECT_DATA; ++i)
7375 got.raw.data[i] = fields[8 + i].Get<int32>(); // data1 and data6 can be -1
7376
7377 got.AIName = fields[32].Get<std::string>();
7378 got.ScriptId = GetScriptId(fields[33].Get<std::string>());
7379 got.IsForQuests = false;
7380
7381 // Checks
7382 if (!got.AIName.empty() && !sGameObjectAIRegistry->HasItem(got.AIName))
7383 {
7384 LOG_ERROR("sql.sql", "GameObject (Entry: {}) has non-registered `AIName` '{}' set, removing", got.entry, got.AIName);
7385 }
7386
7387 switch (got.type)
7388 {
7389 case GAMEOBJECT_TYPE_DOOR: //0
7390 {
7391 if (got.door.lockId)
7392 CheckGOLockId(&got, got.door.lockId, 1);
7393 CheckGONoDamageImmuneId(&got, got.door.noDamageImmune, 3);
7394 break;
7395 }
7396 case GAMEOBJECT_TYPE_BUTTON: //1
7397 {
7398 if (got.button.lockId)
7399 CheckGOLockId(&got, got.button.lockId, 1);
7400 CheckGONoDamageImmuneId(&got, got.button.noDamageImmune, 4);
7401 break;
7402 }
7404 {
7405 if (got.questgiver.lockId)
7406 CheckGOLockId(&got, got.questgiver.lockId, 0);
7407 CheckGONoDamageImmuneId(&got, got.questgiver.noDamageImmune, 5);
7408 break;
7409 }
7410 case GAMEOBJECT_TYPE_CHEST: //3
7411 {
7412 if (got.chest.lockId)
7413 CheckGOLockId(&got, got.chest.lockId, 0);
7414
7415 CheckGOConsumable(&got, got.chest.consumable, 3);
7416
7417 if (got.chest.linkedTrapId) // linked trap
7418 CheckGOLinkedTrapId(&got, got.chest.linkedTrapId, 7);
7419 break;
7420 }
7421 case GAMEOBJECT_TYPE_TRAP: //6
7422 {
7423 if (got.trap.lockId)
7424 CheckGOLockId(&got, got.trap.lockId, 0);
7425 break;
7426 }
7427 case GAMEOBJECT_TYPE_CHAIR: //7
7428 CheckAndFixGOChairHeightId(&got, got.chair.height, 1);
7429 break;
7431 {
7432 if (got.spellFocus.focusId)
7433 {
7434 if (!sSpellFocusObjectStore.LookupEntry(got.spellFocus.focusId))
7435 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data0={} but SpellFocus (Id: {}) not exist.",
7436 entry, got.type, got.spellFocus.focusId, got.spellFocus.focusId);
7437 }
7438
7439 if (got.spellFocus.linkedTrapId) // linked trap
7440 CheckGOLinkedTrapId(&got, got.spellFocus.linkedTrapId, 2);
7441 break;
7442 }
7443 case GAMEOBJECT_TYPE_GOOBER: //10
7444 {
7445 if (got.goober.lockId)
7446 CheckGOLockId(&got, got.goober.lockId, 0);
7447
7448 CheckGOConsumable(&got, got.goober.consumable, 3);
7449
7450 if (got.goober.pageId) // pageId
7451 {
7452 if (!GetPageText(got.goober.pageId))
7453 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data7={} but PageText (Entry {}) not exist.",
7454 entry, got.type, got.goober.pageId, got.goober.pageId);
7455 }
7456 CheckGONoDamageImmuneId(&got, got.goober.noDamageImmune, 11);
7457 if (got.goober.linkedTrapId) // linked trap
7458 CheckGOLinkedTrapId(&got, got.goober.linkedTrapId, 12);
7459 break;
7460 }
7462 {
7463 if (got.areadamage.lockId)
7464 CheckGOLockId(&got, got.areadamage.lockId, 0);
7465 break;
7466 }
7467 case GAMEOBJECT_TYPE_CAMERA: //13
7468 {
7469 if (got.camera.lockId)
7470 CheckGOLockId(&got, got.camera.lockId, 0);
7471 break;
7472 }
7474 {
7475 if (got.moTransport.taxiPathId)
7476 {
7477 if (got.moTransport.taxiPathId >= sTaxiPathNodesByPath.size() || sTaxiPathNodesByPath[got.moTransport.taxiPathId].empty())
7478 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data0={} but TaxiPath (Id: {}) not exist.",
7479 entry, got.type, got.moTransport.taxiPathId, got.moTransport.taxiPathId);
7480 }
7481 if (uint32 transportMap = got.moTransport.mapID)
7482 _transportMaps.insert(transportMap);
7483 break;
7484 }
7486 break;
7488 {
7489 // always must have spell
7490 CheckGOSpellId(&got, got.spellcaster.spellId, 0);
7491 break;
7492 }
7493 case GAMEOBJECT_TYPE_FLAGSTAND: //24
7494 {
7495 if (got.flagstand.lockId)
7496 CheckGOLockId(&got, got.flagstand.lockId, 0);
7497 CheckGONoDamageImmuneId(&got, got.flagstand.noDamageImmune, 5);
7498 break;
7499 }
7501 {
7502 if (got.fishinghole.lockId)
7503 CheckGOLockId(&got, got.fishinghole.lockId, 4);
7504 break;
7505 }
7506 case GAMEOBJECT_TYPE_FLAGDROP: //26
7507 {
7508 if (got.flagdrop.lockId)
7509 CheckGOLockId(&got, got.flagdrop.lockId, 0);
7510 CheckGONoDamageImmuneId(&got, got.flagdrop.noDamageImmune, 3);
7511 break;
7512 }
7514 CheckAndFixGOChairHeightId(&got, got.barberChair.chairheight, 0);
7515 break;
7516 }
7517
7518 ++count;
7519 } while (result->NextRow());
7520
7521 LOG_INFO("server.loading", ">> Loaded {} Game Object Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7522 LOG_INFO("server.loading", " ");
7523}
DBCStorage< SpellFocusObjectEntry > sSpellFocusObjectStore(SpellFocusObjectfmt)
#define sGameObjectAIRegistry
Definition GameObjectAIFactory.h:49
void CheckGONoDamageImmuneId(GameObjectTemplate *goTemplate, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7317
void CheckGOSpellId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7296
void CheckAndFixGOChairHeightId(GameObjectTemplate const *goInfo, uint32 const &dataN, uint32 N)
Definition ObjectMgr.cpp:7305
void CheckGOConsumable(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7326
void CheckGOLinkedTrapId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7286
void CheckGOLockId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7277
@ 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:5965
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 ( )
7526{
7527 uint32 oldMSTime = getMSTime();
7528
7529 // 0 1 2 3 4 5 6 7 8
7530 QueryResult result = WorldDatabase.Query("SELECT entry, faction, flags, mingold, maxgold, artkit0, artkit1, artkit2, artkit3 FROM gameobject_template_addon");
7531
7532 if (!result)
7533 {
7534 LOG_WARN("server.loading", ">> Loaded 0 gameobject template addon definitions. DB table `gameobject_template_addon` is empty.");
7535 LOG_INFO("server.loading", " ");
7536 return;
7537 }
7538
7539 uint32 count = 0;
7540 do
7541 {
7542 Field* fields = result->Fetch();
7543
7544 uint32 entry = fields[0].Get<uint32>();
7545
7546 GameObjectTemplate const* got = sObjectMgr->GetGameObjectTemplate(entry);
7547 if (!got)
7548 {
7549 LOG_ERROR("sql.sql",
7550 "GameObject template (Entry: {}) does not exist but has a record in `gameobject_template_addon`",
7551 entry);
7552 continue;
7553 }
7554
7556 gameObjectAddon.faction = uint32(fields[1].Get<uint16>());
7557 gameObjectAddon.flags = fields[2].Get<uint32>();
7558 gameObjectAddon.mingold = fields[3].Get<uint32>();
7559 gameObjectAddon.maxgold = fields[4].Get<uint32>();
7560
7561 for (uint32 i = 0; i < gameObjectAddon.artKits.size(); i++)
7562 {
7563 uint32 artKitID = fields[5 + i].Get<uint32>();
7564 if (!artKitID)
7565 continue;
7566
7567 if (!sGameObjectArtKitStore.LookupEntry(artKitID))
7568 {
7569 LOG_ERROR("sql.sql", "GameObject (Entry: {}) has invalid `artkit{}` {} defined, set to zero instead.", entry, i, artKitID);
7570 continue;
7571 }
7572
7573 gameObjectAddon.artKits[i] = artKitID;
7574 }
7575
7576 // checks
7577 if (gameObjectAddon.faction && !sFactionTemplateStore.LookupEntry(gameObjectAddon.faction))
7578 LOG_ERROR("sql.sql",
7579 "GameObject (Entry: {}) has invalid faction ({}) defined in `gameobject_template_addon`.",
7580 entry, gameObjectAddon.faction);
7581
7582 if (gameObjectAddon.maxgold > 0)
7583 {
7584 switch (got->type)
7585 {
7588 break;
7589 default:
7590 LOG_ERROR("sql.sql",
7591 "GameObject (Entry {} GoType: {}) cannot be looted but has maxgold set in `gameobject_template_addon`.",
7592 entry, got->type);
7593 break;
7594 }
7595 }
7596
7597 ++count;
7598 } while (result->NextRow());
7599
7600 LOG_INFO("server.loading", ">> Loaded {} Game Object Template Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7601 LOG_INFO("server.loading", " ");
7602}
DBCStorage< GameObjectArtKitEntry > sGameObjectArtKitStore(GameObjectArtKitfmt)
Definition GameObjectData.h:664
uint32 mingold
Definition GameObjectData.h:668
uint32 flags
Definition GameObjectData.h:667
uint32 faction
Definition GameObjectData.h:666
std::array< uint32, 4 > artKits
Definition GameObjectData.h:670
uint32 maxgold
Definition GameObjectData.h:669

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

◆ LoadGameTele()

void ObjectMgr::LoadGameTele ( )
9067{
9068 uint32 oldMSTime = getMSTime();
9069
9070 _gameTeleStore.clear(); // for reload case
9071
9072 // 0 1 2 3 4 5 6
9073 QueryResult result = WorldDatabase.Query("SELECT id, position_x, position_y, position_z, orientation, map, name FROM game_tele");
9074
9075 if (!result)
9076 {
9077 LOG_WARN("server.loading", ">> Loaded 0 GameTeleports. DB table `game_tele` is empty!");
9078 LOG_INFO("server.loading", " ");
9079 return;
9080 }
9081
9082 uint32 count = 0;
9083
9084 do
9085 {
9086 Field* fields = result->Fetch();
9087
9088 uint32 id = fields[0].Get<uint32>();
9089
9090 GameTele gt;
9091
9092 gt.position_x = fields[1].Get<float>();
9093 gt.position_y = fields[2].Get<float>();
9094 gt.position_z = fields[3].Get<float>();
9095 gt.orientation = fields[4].Get<float>();
9096 gt.mapId = fields[5].Get<uint16>();
9097 gt.name = fields[6].Get<std::string>();
9098
9099 if (!MapMgr::IsValidMapCoord(gt.mapId, gt.position_x, gt.position_y, gt.position_z, gt.orientation))
9100 {
9101 LOG_ERROR("sql.sql", "Wrong position for id {} (name: {}) in `game_tele` table, ignoring.", id, gt.name);
9102 continue;
9103 }
9104
9105 if (!Utf8toWStr(gt.name, gt.wnameLow))
9106 {
9107 LOG_ERROR("sql.sql", "Wrong UTF8 name for id {} in `game_tele` table, ignoring.", id);
9108 continue;
9109 }
9110
9111 wstrToLower(gt.wnameLow);
9112
9113 _gameTeleStore[id] = gt;
9114
9115 ++count;
9116 } while (result->NextRow());
9117
9118 LOG_INFO("server.loading", ">> Loaded {} GameTeleports in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9119 LOG_INFO("server.loading", " ");
9120}
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 ( )
9483{
9484 uint32 oldMSTime = getMSTime();
9485
9486 _gossipMenusStore.clear();
9487
9488 QueryResult result = WorldDatabase.Query("SELECT MenuID, TextID FROM gossip_menu");
9489
9490 if (!result)
9491 {
9492 LOG_WARN("server.loading", ">> Loaded 0 gossip_menu entries. DB table `gossip_menu` is empty!");
9493 LOG_INFO("server.loading", " ");
9494 return;
9495 }
9496
9497 do
9498 {
9499 Field* fields = result->Fetch();
9500
9501 GossipMenus gMenu;
9502
9503 gMenu.MenuID = fields[0].Get<uint32>();
9504 gMenu.TextID = fields[1].Get<uint32>();
9505
9506 if (!GetGossipText(gMenu.TextID))
9507 {
9508 LOG_ERROR("sql.sql", "Table gossip_menu entry {} are using non-existing TextID {}", gMenu.MenuID, gMenu.TextID);
9509 continue;
9510 }
9511
9512 _gossipMenusStore.insert(GossipMenusContainer::value_type(gMenu.MenuID, gMenu));
9513 } while (result->NextRow());
9514
9515 LOG_INFO("server.loading", ">> Loaded {} gossip_menu entries in {} ms", (uint32)_gossipMenusStore.size(), GetMSTimeDiffToNow(oldMSTime));
9516 LOG_INFO("server.loading", " ");
9517}
GossipText const * GetGossipText(uint32 Text_ID) const
Definition ObjectMgr.cpp:6143
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 ( )
9520{
9521 uint32 oldMSTime = getMSTime();
9522
9523 _gossipMenuItemsStore.clear();
9524
9525 QueryResult result = WorldDatabase.Query(
9526 // 0 1 2 3 4 5 6 7 8 9 10 11 12
9527 "SELECT MenuID, OptionID, OptionIcon, OptionText, OptionBroadcastTextID, OptionType, OptionNpcFlag, ActionMenuID, ActionPoiID, BoxCoded, BoxMoney, BoxText, BoxBroadcastTextID "
9528 "FROM gossip_menu_option ORDER BY MenuID, OptionID");
9529
9530 if (!result)
9531 {
9532 LOG_WARN("server.loading", ">> Loaded 0 gossip_menu_option IDs. DB table `gossip_menu_option` is empty!");
9533 LOG_INFO("server.loading", " ");
9534 return;
9535 }
9536
9537 do
9538 {
9539 Field* fields = result->Fetch();
9540
9541 GossipMenuItems gMenuItem;
9542
9543 gMenuItem.MenuID = fields[0].Get<uint32>();
9544 gMenuItem.OptionID = fields[1].Get<uint16>();
9545 gMenuItem.OptionIcon = fields[2].Get<uint32>();
9546 gMenuItem.OptionText = fields[3].Get<std::string>();
9547 gMenuItem.OptionBroadcastTextID = fields[4].Get<uint32>();
9548 gMenuItem.OptionType = fields[5].Get<uint8>();
9549 gMenuItem.OptionNpcFlag = fields[6].Get<uint32>();
9550 gMenuItem.ActionMenuID = fields[7].Get<uint32>();
9551 gMenuItem.ActionPoiID = fields[8].Get<uint32>();
9552 gMenuItem.BoxCoded = fields[9].Get<bool>();
9553 gMenuItem.BoxMoney = fields[10].Get<uint32>();
9554 gMenuItem.BoxText = fields[11].Get<std::string>();
9555 gMenuItem.BoxBroadcastTextID = fields[12].Get<uint32>();
9556
9557 if (gMenuItem.OptionIcon >= GOSSIP_ICON_MAX)
9558 {
9559 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);
9560 gMenuItem.OptionIcon = GOSSIP_ICON_CHAT;
9561 }
9562
9564 {
9565 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has non-existing or incompatible OptionBroadcastTextID {}, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.OptionBroadcastTextID);
9566 gMenuItem.OptionBroadcastTextID = 0;
9567 }
9568
9569 if (gMenuItem.OptionType >= GOSSIP_OPTION_MAX)
9570 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);
9571
9572 if (gMenuItem.ActionPoiID && !GetPointOfInterest(gMenuItem.ActionPoiID))
9573 {
9574 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} use non-existing ActionPoiID {}, ignoring", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.ActionPoiID);
9575 gMenuItem.ActionPoiID = 0;
9576 }
9577
9578 if (gMenuItem.BoxBroadcastTextID && !GetBroadcastText(gMenuItem.BoxBroadcastTextID))
9579 {
9580 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has non-existing or incompatible BoxBroadcastTextID {}, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.BoxBroadcastTextID);
9581 gMenuItem.BoxBroadcastTextID = 0;
9582 }
9583
9584 _gossipMenuItemsStore.insert(GossipMenuItemsContainer::value_type(gMenuItem.MenuID, gMenuItem));
9585 } while (result->NextRow());
9586
9587 LOG_INFO("server.loading", ">> Loaded {} gossip_menu_option entries in {} ms", uint32(_gossipMenuItemsStore.size()), GetMSTimeDiffToNow(oldMSTime));
9588 LOG_INFO("server.loading", " ");
9589}
@ 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 ( )
6152{
6153 uint32 oldMSTime = getMSTime();
6154
6155 QueryResult result = WorldDatabase.Query("SELECT ID, "
6156 "text0_0, text0_1, BroadcastTextID0, lang0, Probability0, em0_0, em0_1, em0_2, em0_3, em0_4, em0_5, "
6157 "text1_0, text1_1, BroadcastTextID1, lang1, Probability1, em1_0, em1_1, em1_2, em1_3, em1_4, em1_5, "
6158 "text2_0, text2_1, BroadcastTextID2, lang2, Probability2, em2_0, em2_1, em2_2, em2_3, em2_4, em2_5, "
6159 "text3_0, text3_1, BroadcastTextID3, lang3, Probability3, em3_0, em3_1, em3_2, em3_3, em3_4, em3_5, "
6160 "text4_0, text4_1, BroadcastTextID4, lang4, Probability4, em4_0, em4_1, em4_2, em4_3, em4_4, em4_5, "
6161 "text5_0, text5_1, BroadcastTextID5, lang5, Probability5, em5_0, em5_1, em5_2, em5_3, em5_4, em5_5, "
6162 "text6_0, text6_1, BroadcastTextID6, lang6, Probability6, em6_0, em6_1, em6_2, em6_3, em6_4, em6_5, "
6163 "text7_0, text7_1, BroadcastTextID7, lang7, Probability7, em7_0, em7_1, em7_2, em7_3, em7_4, em7_5 "
6164 "FROM npc_text");
6165
6166 if (!result)
6167 {
6168 LOG_WARN("server.loading", ">> Loaded 0 npc texts, table is empty!");
6169 LOG_INFO("server.loading", " ");
6170 return;
6171 }
6172
6173 _gossipTextStore.rehash(result->GetRowCount());
6174
6175 uint32 count = 0;
6176 uint8 cic;
6177
6178 do
6179 {
6180 cic = 0;
6181
6182 Field* fields = result->Fetch();
6183
6184 uint32 id = fields[cic++].Get<uint32>();
6185 if (!id)
6186 {
6187 LOG_ERROR("sql.sql", "Table `npc_text` has record wit reserved id 0, ignore.");
6188 continue;
6189 }
6190
6191 GossipText& gText = _gossipTextStore[id];
6192
6193 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6194 {
6195 gText.Options[i].Text_0 = fields[cic++].Get<std::string>();
6196 gText.Options[i].Text_1 = fields[cic++].Get<std::string>();
6197 gText.Options[i].BroadcastTextID = fields[cic++].Get<uint32>();
6198 gText.Options[i].Language = fields[cic++].Get<uint8>();
6199 gText.Options[i].Probability = fields[cic++].Get<float>();
6200
6201 for (uint8 j = 0; j < MAX_GOSSIP_TEXT_EMOTES; ++j)
6202 {
6203 gText.Options[i].Emotes[j]._Delay = fields[cic++].Get<uint16>();
6204 gText.Options[i].Emotes[j]._Emote = fields[cic++].Get<uint16>();
6205 }
6206 }
6207
6208 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; i++)
6209 {
6210 if (gText.Options[i].BroadcastTextID)
6211 {
6213 {
6214 LOG_ERROR("sql.sql", "GossipText (Id: {}) in table `npc_text` has non-existing or incompatible BroadcastTextID{} {}.", id, i, gText.Options[i].BroadcastTextID);
6215 gText.Options[i].BroadcastTextID = 0;
6216 }
6217 }
6218 }
6219
6220 count++;
6221 } while (result->NextRow());
6222
6223 LOG_INFO("server.loading", ">> Loaded {} Npc Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6224 LOG_INFO("server.loading", " ");
6225}
#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 ( )
6059{
6060 uint32 oldMSTime = getMSTime();
6061
6062 // 0 1 2 3
6063 QueryResult result = WorldDatabase.Query("SELECT entry, creditType, creditEntry, lastEncounterDungeon FROM instance_encounters");
6064 if (!result)
6065 {
6066 LOG_WARN("server.loading", ">> Loaded 0 instance encounters, table is empty!");
6067 LOG_INFO("server.loading", " ");
6068 return;
6069 }
6070
6071 uint32 count = 0;
6072 std::map<uint32, DungeonEncounterEntry const*> dungeonLastBosses;
6073 do
6074 {
6075 Field* fields = result->Fetch();
6076 uint32 entry = fields[0].Get<uint32>();
6077 uint8 creditType = fields[1].Get<uint8>();
6078 uint32 creditEntry = fields[2].Get<uint32>();
6079 uint32 lastEncounterDungeon = fields[3].Get<uint16>();
6080 DungeonEncounterEntry const* dungeonEncounter = sDungeonEncounterStore.LookupEntry(entry);
6081 if (!dungeonEncounter)
6082 {
6083 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid encounter id {}, skipped!", entry);
6084 continue;
6085 }
6086
6087 if (lastEncounterDungeon && !sLFGMgr->GetLFGDungeonEntry(lastEncounterDungeon))
6088 {
6089 LOG_ERROR("sql.sql", "Table `instance_encounters` has an encounter {} ({}) marked as final for invalid dungeon id {}, skipped!", entry, dungeonEncounter->encounterName[0], lastEncounterDungeon);
6090 continue;
6091 }
6092
6093 std::map<uint32, DungeonEncounterEntry const*>::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon);
6094 if (lastEncounterDungeon)
6095 {
6096 if (itr != dungeonLastBosses.end())
6097 {
6098 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]);
6099 continue;
6100 }
6101
6102 dungeonLastBosses[lastEncounterDungeon] = dungeonEncounter;
6103 }
6104
6105 switch (creditType)
6106 {
6108 {
6109 CreatureTemplate const* creatureInfo = GetCreatureTemplate(creditEntry);
6110 if (!creatureInfo)
6111 {
6112 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid creature (entry {}) linked to the encounter {} ({}), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
6113 continue;
6114 }
6115 const_cast<CreatureTemplate*>(creatureInfo)->flags_extra |= CREATURE_FLAG_EXTRA_DUNGEON_BOSS;
6116 break;
6117 }
6119 {
6120 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(creditEntry);
6121 if (!spellInfo)
6122 {
6123 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid spell (entry {}) linked to the encounter {} ({}), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
6124 continue;
6125 }
6126 const_cast<SpellInfo*>(spellInfo)->AttributesCu |= SPELL_ATTR0_CU_ENCOUNTER_REWARD;
6127 break;
6128 }
6129 default:
6130 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid credit type ({}) for encounter {} ({}), skipped!", creditType, entry, dungeonEncounter->encounterName[0]);
6131 continue;
6132 }
6133
6134 DungeonEncounterList& encounters = _dungeonEncounterStore[MAKE_PAIR32(dungeonEncounter->mapId, dungeonEncounter->difficulty)];
6135 encounters.push_back(new DungeonEncounter(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon));
6136 ++count;
6137 } while (result->NextRow());
6138
6139 LOG_INFO("server.loading", ">> Loaded {} Instance Encounters in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6140 LOG_INFO("server.loading", " ");
6141}
@ CREATURE_FLAG_EXTRA_DUNGEON_BOSS
Definition CreatureData.h:73
DBCStorage< DungeonEncounterEntry > sDungeonEncounterStore(DungeonEncounterfmt)
#define sLFGMgr
Definition LFGMgr.h:641
EncounterCreditType
Definition Map.h:150
@ ENCOUNTER_CREDIT_KILL_CREATURE
Definition Map.h:151
@ ENCOUNTER_CREDIT_CAST_SPELL
Definition Map.h:152
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 ( )
6008{
6009 uint32 oldMSTime = getMSTime();
6010
6011 // 0 1 2 4
6012 QueryResult result = WorldDatabase.Query("SELECT map, parent, script, allowMount FROM instance_template");
6013
6014 if (!result)
6015 {
6016 LOG_WARN("server.loading", ">> Loaded 0 instance templates. DB table `instance_template` is empty!");
6017 LOG_INFO("server.loading", " ");
6018 return;
6019 }
6020
6021 uint32 count = 0;
6022 do
6023 {
6024 Field* fields = result->Fetch();
6025
6026 uint16 mapID = fields[0].Get<uint16>();
6027
6028 if (!MapMgr::IsValidMAP(mapID, true))
6029 {
6030 LOG_ERROR("sql.sql", "ObjectMgr::LoadInstanceTemplate: bad mapid {} for template!", mapID);
6031 continue;
6032 }
6033
6034 InstanceTemplate instanceTemplate;
6035
6036 instanceTemplate.AllowMount = fields[3].Get<bool>();
6037 instanceTemplate.Parent = uint32(fields[1].Get<uint16>());
6038 instanceTemplate.ScriptId = sObjectMgr->GetScriptId(fields[2].Get<std::string>());
6039
6040 _instanceTemplateStore[mapID] = instanceTemplate;
6041
6042 ++count;
6043 } while (result->NextRow());
6044
6045 LOG_INFO("server.loading", ">> Loaded {} Instance Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6046 LOG_INFO("server.loading", " ");
6047}
static bool IsValidMAP(uint32 mapid, bool startUp)
Definition MapMgr.cpp:311
bool AllowMount
Definition Map.h:120
uint32 ScriptId
Definition Map.h:119

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

◆ LoadItemLocales()

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

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

◆ LoadItemSetNameLocales()

void ObjectMgr::LoadItemSetNameLocales ( )
3446{
3447 uint32 oldMSTime = getMSTime();
3448
3449 _itemSetNameLocaleStore.clear(); // need for reload case
3450
3451 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name FROM item_set_names_locale");
3452
3453 if (!result)
3454 return;
3455
3456 do
3457 {
3458 Field* fields = result->Fetch();
3459
3460 uint32 ID = fields[0].Get<uint32>();
3461
3462 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
3463 if (locale == LOCALE_enUS)
3464 continue;
3465
3467 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
3468 } while (result->NextRow());
3469
3470 LOG_INFO("server.loading", ">> Loaded {} Item Set Name Locale Strings in {} ms", uint32(_itemSetNameLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime));
3471}
Definition ItemTemplate.h:850
std::vector< std::string > Name
Definition ItemTemplate.h:851

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

◆ LoadItemSetNames()

void ObjectMgr::LoadItemSetNames ( )
3474{
3475 uint32 oldMSTime = getMSTime();
3476
3477 _itemSetNameStore.clear(); // needed for reload case
3478
3479 std::set<uint32> itemSetItems;
3480
3481 // fill item set member ids
3482 for (uint32 entryId = 0; entryId < sItemSetStore.GetNumRows(); ++entryId)
3483 {
3484 ItemSetEntry const* setEntry = sItemSetStore.LookupEntry(entryId);
3485 if (!setEntry)
3486 continue;
3487
3488 for (uint32 i = 0; i < MAX_ITEM_SET_ITEMS; ++i)
3489 if (setEntry->itemId[i])
3490 itemSetItems.insert(setEntry->itemId[i]);
3491 }
3492
3493 // 0 1 2
3494 QueryResult result = WorldDatabase.Query("SELECT `entry`, `name`, `InventoryType` FROM `item_set_names`");
3495
3496 if (!result)
3497 {
3498 LOG_WARN("server.loading", ">> Loaded 0 item set names. DB table `item_set_names` is empty.");
3499 LOG_INFO("server.loading", " ");
3500 return;
3501 }
3502
3503 _itemSetNameStore.rehash(result->GetRowCount());
3504 uint32 count = 0;
3505
3506 do
3507 {
3508 Field* fields = result->Fetch();
3509
3510 uint32 entry = fields[0].Get<uint32>();
3511 if (itemSetItems.find(entry) == itemSetItems.end())
3512 {
3513 LOG_ERROR("sql.sql", "Item set name (Entry: {}) not found in ItemSet.dbc, data useless.", entry);
3514 continue;
3515 }
3516
3517 ItemSetNameEntry& data = _itemSetNameStore[entry];
3518 data.name = fields[1].Get<std::string>();
3519
3520 uint32 invType = fields[2].Get<uint8>();
3521 if (invType >= MAX_INVTYPE)
3522 {
3523 LOG_ERROR("sql.sql", "Item set name (Entry: {}) has wrong InventoryType value ({})", entry, invType);
3524 invType = INVTYPE_NON_EQUIP;
3525 }
3526
3527 data.InventoryType = invType;
3528 itemSetItems.erase(entry);
3529 ++count;
3530 } while (result->NextRow());
3531
3532 if (!itemSetItems.empty())
3533 {
3534 ItemTemplate const* pProto;
3535 for (std::set<uint32>::iterator itr = itemSetItems.begin(); itr != itemSetItems.end(); ++itr)
3536 {
3537 uint32 entry = *itr;
3538 // add data from item_template if available
3539 pProto = sObjectMgr->GetItemTemplate(entry);
3540 if (pProto)
3541 {
3542 LOG_ERROR("sql.sql", "Item set part (Entry: {}) does not have entry in `item_set_names`, adding data from `item_template`.", entry);
3543 ItemSetNameEntry& data = _itemSetNameStore[entry];
3544 data.name = pProto->Name1;
3545 data.InventoryType = pProto->InventoryType;
3546 ++count;
3547 }
3548 else
3549 LOG_ERROR("sql.sql", "Item set part (Entry: {}) does not have entry in `item_set_names`, set will not display properly.", entry);
3550 }
3551 }
3552
3553 LOG_INFO("server.loading", ">> Loaded {} Item Set Names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3554 LOG_INFO("server.loading", " ");
3555}
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:844
uint32 InventoryType
Definition ItemTemplate.h:846
std::string name
Definition ItemTemplate.h:845
std::string Name1
Definition ItemTemplate.h:624
uint32 InventoryType
Definition ItemTemplate.h:632

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

◆ LoadItemTemplates()

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

◆ LoadLinkedRespawn()

void ObjectMgr::LoadLinkedRespawn ( )
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 ( )
9207{
9208 uint32 oldMSTime = getMSTime();
9209
9210 _mailLevelRewardStore.clear(); // for reload case
9211
9212 // 0 1 2 3
9213 QueryResult result = WorldDatabase.Query("SELECT level, raceMask, mailTemplateId, senderEntry FROM mail_level_reward");
9214
9215 if (!result)
9216 {
9217 LOG_WARN("server.loading", ">> Loaded 0 level dependent mail rewards. DB table `mail_level_reward` is empty.");
9218 LOG_INFO("server.loading", " ");
9219 return;
9220 }
9221
9222 uint32 count = 0;
9223
9224 do
9225 {
9226 Field* fields = result->Fetch();
9227
9228 uint8 level = fields[0].Get<uint8>();
9229 uint32 raceMask = fields[1].Get<uint32>();
9230 uint32 mailTemplateId = fields[2].Get<uint32>();
9231 uint32 senderEntry = fields[3].Get<uint32>();
9232
9233 if (level > MAX_LEVEL)
9234 {
9235 LOG_ERROR("sql.sql", "Table `mail_level_reward` have data for level {} that more supported by client ({}), ignoring.", level, MAX_LEVEL);
9236 continue;
9237 }
9238
9239 if (!(raceMask & RACEMASK_ALL_PLAYABLE))
9240 {
9241 LOG_ERROR("sql.sql", "Table `mail_level_reward` have raceMask ({}) for level {} that not include any player races, ignoring.", raceMask, level);
9242 continue;
9243 }
9244
9245 if (!sMailTemplateStore.LookupEntry(mailTemplateId))
9246 {
9247 LOG_ERROR("sql.sql", "Table `mail_level_reward` have invalid mailTemplateId ({}) for level {} that invalid not include any player races, ignoring.", mailTemplateId, level);
9248 continue;
9249 }
9250
9251 if (!GetCreatureTemplate(senderEntry))
9252 {
9253 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);
9254 continue;
9255 }
9256
9257 _mailLevelRewardStore[level].push_back(MailLevelReward(raceMask, mailTemplateId, senderEntry));
9258
9259 ++count;
9260 } while (result->NextRow());
9261
9262 LOG_INFO("server.loading", ">> Loaded {} Level Dependent Mail Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9263 LOG_INFO("server.loading", " ");
9264}
#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 ( )
8786{
8787 uint32 oldMSTime = getMSTime();
8788
8789 _moduleStringStore.clear(); // for reload case
8790 QueryResult result = WorldDatabase.Query("SELECT module, id, string FROM module_string");
8791 if (!result)
8792 {
8793 LOG_WARN("server.loading", ">> Loaded 0 module strings. DB table `module_string` is empty.");
8794 LOG_INFO("server.loading", " ");
8795 return false;
8796 }
8797
8798 do
8799 {
8800 Field* fields = result->Fetch();
8801
8802 std::string module = fields[0].Get<std::string>();
8803 uint32 id = fields[1].Get<uint32>();
8804
8805 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
8806 ModuleString& data = _moduleStringStore[pairKey];
8807
8808 AddLocaleString(fields[2].Get<std::string>(), LOCALE_enUS, data.Content);
8809 } while (result->NextRow());
8810
8811 LOG_INFO("server.loading", ">> Loaded {} Module Strings in {} ms", _moduleStringStore.size(), GetMSTimeDiffToNow(oldMSTime));
8812 LOG_INFO("server.loading", " ");
8813
8814 return true;
8815}

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

◆ LoadModuleStringsLocale()

bool ObjectMgr::LoadModuleStringsLocale ( )
8818{
8819 uint32 oldMSTime = getMSTime();
8820
8821 QueryResult result = WorldDatabase.Query("SELECT module, id, locale, string FROM module_string_locale");
8822 if (!result)
8823 {
8824 LOG_WARN("server.loading", ">> Loaded 0 module strings locale. DB table `module_string_locale` is empty.");
8825 LOG_INFO("server.loading", " ");
8826 return false;
8827 }
8828
8829 uint32 localeCount = 0;
8830 do
8831 {
8832 Field* fields = result->Fetch();
8833
8834 std::string module = fields[0].Get<std::string>();
8835 uint32 id = fields[1].Get<uint32>();
8836
8837 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
8838 ModuleString& data = _moduleStringStore[pairKey];
8839
8840 ModuleStringContainer::iterator ms = _moduleStringStore.find(pairKey);
8841 if (ms == _moduleStringStore.end())
8842 {
8843 LOG_ERROR("sql.sql", "ModuleString (Module: {} Id: {}) found in table `module_string_locale` but does not exist in `module_string`. Skipped!", module, id);
8844 continue;
8845 }
8846
8847 LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>());
8848 if (locale == LOCALE_enUS)
8849 continue;
8850
8851 AddLocaleString(fields[3].Get<std::string>(), locale, data.Content);
8852 localeCount++;
8853 } while (result->NextRow());
8854
8855 LOG_INFO("server.loading", ">> Loaded {} Module Strings Locales in {} ms", localeCount, GetMSTimeDiffToNow(oldMSTime));
8856 LOG_INFO("server.loading", " ");
8857
8858 return true;
8859}

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

◆ LoadNPCSpellClickSpells()

void ObjectMgr::LoadNPCSpellClickSpells ( )
8139{
8140 uint32 oldMSTime = getMSTime();
8141
8142 _spellClickInfoStore.clear();
8143 // 0 1 2 3
8144 QueryResult result = WorldDatabase.Query("SELECT npc_entry, spell_id, cast_flags, user_type FROM npc_spellclick_spells");
8145
8146 if (!result)
8147 {
8148 LOG_WARN("server.loading", ">> Loaded 0 spellclick spells. DB table `npc_spellclick_spells` is empty.");
8149 LOG_INFO("server.loading", " ");
8150 return;
8151 }
8152
8153 uint32 count = 0;
8154
8155 do
8156 {
8157 Field* fields = result->Fetch();
8158
8159 uint32 npc_entry = fields[0].Get<uint32>();
8160 CreatureTemplate const* cInfo = GetCreatureTemplate(npc_entry);
8161 if (!cInfo)
8162 {
8163 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown creature_template {}. Skipping entry.", npc_entry);
8164 continue;
8165 }
8166
8167 uint32 spellid = fields[1].Get<uint32>();
8168 SpellInfo const* spellinfo = sSpellMgr->GetSpellInfo(spellid);
8169 if (!spellinfo)
8170 {
8171 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown spellid {}. Skipping entry.", spellid);
8172 continue;
8173 }
8174
8175 uint8 userType = fields[3].Get<uint16>();
8176 if (userType >= SPELL_CLICK_USER_MAX)
8177 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown user type {}. Skipping entry.", uint32(userType));
8178
8179 uint8 castFlags = fields[2].Get<uint8>();
8180 SpellClickInfo info;
8181 info.spellId = spellid;
8182 info.castFlags = castFlags;
8183 info.userType = SpellClickUserTypes(userType);
8184 _spellClickInfoStore.insert(SpellClickInfoContainer::value_type(npc_entry, info));
8185
8186 ++count;
8187 } while (result->NextRow());
8188
8189 // all spellclick data loaded, now we check if there are creatures with NPC_FLAG_SPELLCLICK but with no data
8190 // NOTE: It *CAN* be the other way around: no spellclick flag but with spellclick data, in case of creature-only vehicle accessories
8191 CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
8192 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
8193 {
8194 if ((itr->second.npcflag & UNIT_NPC_FLAG_SPELLCLICK) && _spellClickInfoStore.find(itr->second.Entry) == _spellClickInfoStore.end())
8195 {
8196 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);
8197 const_cast<CreatureTemplate*>(&itr->second)->npcflag &= ~UNIT_NPC_FLAG_SPELLCLICK;
8198 }
8199 }
8200
8201 LOG_INFO("server.loading", ">> Loaded {} Spellclick Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8202 LOG_INFO("server.loading", " ");
8203}
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(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sObjectMgr, SPELL_CLICK_USER_MAX, SpellClickInfo::spellId, sSpellMgr, UNIT_NPC_FLAG_SPELLCLICK, and WorldDatabase.

◆ LoadNpcTextLocales()

void ObjectMgr::LoadNpcTextLocales ( )
6228{
6229 uint32 oldMSTime = getMSTime();
6230
6231 _npcTextLocaleStore.clear(); // need for reload case
6232
6233 QueryResult result = WorldDatabase.Query("SELECT ID, Locale, "
6234 // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
6235 "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 "
6236 "FROM npc_text_locale");
6237
6238 if (!result)
6239 return;
6240
6241 do
6242 {
6243 Field* fields = result->Fetch();
6244
6245 uint32 ID = fields[0].Get<uint32>();
6246
6247 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
6248 if (locale == LOCALE_enUS)
6249 continue;
6250
6252 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6253 {
6254 AddLocaleString(fields[2 + i * 2].Get<std::string>(), locale, data.Text_0[i]);
6255 AddLocaleString(fields[3 + i * 2].Get<std::string>(), locale, data.Text_1[i]);
6256 }
6257 } while (result->NextRow());
6258
6259 LOG_INFO("server.loading", ">> Loaded {} Npc Text Locale Strings in {} ms", (uint32)_npcTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6260}
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 ( )
5975{
5976 uint32 oldMSTime = getMSTime();
5977
5978 _pageTextLocaleStore.clear(); // need for reload case
5979
5980 // 0 1 2
5981 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Text FROM page_text_locale");
5982
5983 if (!result)
5984 {
5985 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text_locale` is empty!");
5986 LOG_INFO("server.loading", " ");
5987 return;
5988 }
5989
5990 do
5991 {
5992 Field* fields = result->Fetch();
5993
5994 uint32 ID = fields[0].Get<uint32>();
5995
5996 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
5997 if (locale == LOCALE_enUS)
5998 continue;
5999
6001 AddLocaleString(fields[2].Get<std::string>(), locale, data.Text);
6002 } while (result->NextRow());
6003
6004 LOG_INFO("server.loading", ">> Loaded {} Page Text Locale Strings in {} ms", (uint32)_pageTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6005}
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 ( )
5925{
5926 uint32 oldMSTime = getMSTime();
5927
5928 // 0 1 2
5929 QueryResult result = WorldDatabase.Query("SELECT ID, Text, NextPageID FROM page_text");
5930
5931 if (!result)
5932 {
5933 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text` is empty!");
5934 LOG_INFO("server.loading", " ");
5935 return;
5936 }
5937
5938 uint32 count = 0;
5939 do
5940 {
5941 Field* fields = result->Fetch();
5942
5943 PageText& pageText = _pageTextStore[fields[0].Get<uint32>()];
5944
5945 pageText.Text = fields[1].Get<std::string>();
5946 pageText.NextPage = fields[2].Get<uint32>();
5947
5948 ++count;
5949 } while (result->NextRow());
5950
5951 for (PageTextContainer::const_iterator itr = _pageTextStore.begin(); itr != _pageTextStore.end(); ++itr)
5952 {
5953 if (itr->second.NextPage)
5954 {
5955 PageTextContainer::const_iterator itr2 = _pageTextStore.find(itr->second.NextPage);
5956 if (itr2 == _pageTextStore.end())
5957 LOG_ERROR("sql.sql", "Page text (Id: {}) has not existing next page (Id: {})", itr->first, itr->second.NextPage);
5958 }
5959 }
5960
5961 LOG_INFO("server.loading", ">> Loaded {} Page Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5962 LOG_INFO("server.loading", " ");
5963}
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 ( )
3714{
3715 uint32 oldMSTime = getMSTime();
3716
3717 // 0 1 2 3 4 5 6 7 8 9 10 11
3718 QueryResult result = WorldDatabase.Query("SELECT creature_entry, level, hp, mana, str, agi, sta, inte, spi, armor, min_dmg, max_dmg FROM pet_levelstats");
3719
3720 if (!result)
3721 {
3722 LOG_WARN("server.loading", ">> Loaded 0 level pet stats definitions. DB table `pet_levelstats` is empty.");
3723 LOG_INFO("server.loading", " ");
3724 return;
3725 }
3726
3727 uint32 count = 0;
3728
3729 do
3730 {
3731 Field* fields = result->Fetch();
3732
3733 uint32 creature_id = fields[0].Get<uint32>();
3734 if (!sObjectMgr->GetCreatureTemplate(creature_id))
3735 {
3736 LOG_ERROR("sql.sql", "Wrong creature id {} in `pet_levelstats` table, ignoring.", creature_id);
3737 continue;
3738 }
3739
3740 uint32 current_level = fields[1].Get<uint8>();
3741 if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
3742 {
3743 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
3744 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `pet_levelstats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
3745 else
3746 {
3747 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `pet_levelstats` table, ignoring.", current_level);
3748 ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
3749 }
3750 continue;
3751 }
3752 else if (current_level < 1)
3753 {
3754 LOG_ERROR("sql.sql", "Wrong (<1) level {} in `pet_levelstats` table, ignoring.", current_level);
3755 continue;
3756 }
3757
3758 PetLevelInfo*& pInfoMapEntry = _petInfoStore[creature_id];
3759
3760 if (!pInfoMapEntry)
3761 pInfoMapEntry = new PetLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
3762
3763 // data for level 1 stored in [0] array element, ...
3764 PetLevelInfo* pLevelInfo = &pInfoMapEntry[current_level - 1];
3765
3766 pLevelInfo->health = fields[2].Get<uint32>();
3767 pLevelInfo->mana = fields[3].Get<uint32>();
3768 pLevelInfo->armor = fields[9].Get<uint32>();
3769 pLevelInfo->min_dmg = fields[10].Get<uint32>();
3770 pLevelInfo->max_dmg = fields[11].Get<uint32>();
3771 for (uint8 i = 0; i < MAX_STATS; i++)
3772 {
3773 pLevelInfo->stats[i] = fields[i + 4].Get<uint32>();
3774 }
3775
3776 ++count;
3777 } while (result->NextRow());
3778
3779 // Fill gaps and check integrity
3780 for (PetLevelInfoContainer::iterator itr = _petInfoStore.begin(); itr != _petInfoStore.end(); ++itr)
3781 {
3782 PetLevelInfo* pInfo = itr->second;
3783
3784 // fatal error if no level 1 data
3785 if (!pInfo || pInfo[0].health == 0)
3786 {
3787 LOG_ERROR("sql.sql", "Creature {} does not have pet stats data for Level 1!", itr->first);
3788 exit(1);
3789 }
3790
3791 // fill level gaps
3792 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
3793 {
3794 if (pInfo[level].health == 0)
3795 {
3796 LOG_ERROR("sql.sql", "Creature {} has no data for Level {} pet stats data, using data of Level {}.", itr->first, level + 1, level);
3797 pInfo[level] = pInfo[level - 1];
3798 }
3799 }
3800 }
3801
3802 LOG_INFO("server.loading", ">> Loaded {} Level Pet Stats Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3803 LOG_INFO("server.loading", " ");
3804}
#define STRONG_MAX_LEVEL
Definition DBCEnums.h:43
#define MAX_STATS
Definition SharedDefines.h:265
Definition ObjectMgr.h:528
uint32 max_dmg
Definition ObjectMgr.h:539
uint32 mana
Definition ObjectMgr.h:536
uint32 min_dmg
Definition ObjectMgr.h:538
uint32 health
Definition ObjectMgr.h:535
std::array< uint32, MAX_STATS > stats
Definition ObjectMgr.h:534
uint32 armor
Definition ObjectMgr.h:537

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

◆ LoadPetNames()

void ObjectMgr::LoadPetNames ( )
7645{
7646 uint32 oldMSTime = getMSTime();
7647 // 0 1 2
7648 QueryResult result = WorldDatabase.Query("SELECT word, entry, half FROM pet_name_generation");
7649
7650 if (!result)
7651 {
7652 LOG_WARN("server.loading", ">> Loaded 0 pet name parts. DB table `pet_name_generation` is empty!");
7653 LOG_INFO("server.loading", " ");
7654 return;
7655 }
7656
7657 uint32 count = 0;
7658
7659 do
7660 {
7661 Field* fields = result->Fetch();
7662 std::string word = fields[0].Get<std::string>();
7663 uint32 entry = fields[1].Get<uint32>();
7664 bool half = fields[2].Get<bool>();
7665 if (half)
7666 _petHalfName1[entry].push_back(word);
7667 else
7668 _petHalfName0[entry].push_back(word);
7669 ++count;
7670 } while (result->NextRow());
7671
7672 LOG_INFO("server.loading", ">> Loaded {} Pet Name Parts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7673 LOG_INFO("server.loading", " ");
7674}

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 ( )
7677{
7678 uint32 oldMSTime = getMSTime();
7679
7680 QueryResult result = CharacterDatabase.Query("SELECT MAX(id) FROM character_pet");
7681 if (result)
7682 {
7683 Field* fields = result->Fetch();
7684 _hiPetNumber = fields[0].Get<uint32>() + 1;
7685 }
7686
7687 LOG_INFO("server.loading", ">> Loaded The Max Pet Number: {} in {} ms", _hiPetNumber - 1, GetMSTimeDiffToNow(oldMSTime));
7688 LOG_INFO("server.loading", " ");
7689}

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

◆ LoadPlayerInfo()

void ObjectMgr::LoadPlayerInfo ( )
3853{
3854 // Load playercreate
3855 {
3856 uint32 oldMSTime = getMSTime();
3857 // 0 1 2 3 4 5 6
3858 QueryResult result = WorldDatabase.Query("SELECT race, class, map, zone, position_x, position_y, position_z, orientation FROM playercreateinfo");
3859
3860 if (!result)
3861 {
3862 LOG_INFO("server.loading", " ");
3863 LOG_WARN("server.loading", ">> Loaded 0 player create definitions. DB table `playercreateinfo` is empty.");
3864 exit(1);
3865 }
3866 else
3867 {
3868 uint32 count = 0;
3869
3870 do
3871 {
3872 Field* fields = result->Fetch();
3873
3874 uint32 current_race = fields[0].Get<uint8>();
3875 uint32 current_class = fields[1].Get<uint8>();
3876 uint32 mapId = fields[2].Get<uint16>();
3877 uint32 areaId = fields[3].Get<uint32>(); // zone
3878 float positionX = fields[4].Get<float>();
3879 float positionY = fields[5].Get<float>();
3880 float positionZ = fields[6].Get<float>();
3881 float orientation = fields[7].Get<float>();
3882
3883 if (current_race >= MAX_RACES)
3884 {
3885 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo` table, ignoring.", current_race);
3886 continue;
3887 }
3888
3889 ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(current_race);
3890 if (!rEntry)
3891 {
3892 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo` table, ignoring.", current_race);
3893 continue;
3894 }
3895
3896 if (current_class >= MAX_CLASSES)
3897 {
3898 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo` table, ignoring.", current_class);
3899 continue;
3900 }
3901
3902 if (!sChrClassesStore.LookupEntry(current_class))
3903 {
3904 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo` table, ignoring.", current_class);
3905 continue;
3906 }
3907
3908 // accept DB data only for valid position (and non instanceable)
3909 if (!MapMgr::IsValidMapCoord(mapId, positionX, positionY, positionZ, orientation))
3910 {
3911 LOG_ERROR("sql.sql", "Wrong home position for class {} race {} pair in `playercreateinfo` table, ignoring.", current_class, current_race);
3912 continue;
3913 }
3914
3915 if (sMapStore.LookupEntry(mapId)->Instanceable())
3916 {
3917 LOG_ERROR("sql.sql", "Home position in instanceable map for class {} race {} pair in `playercreateinfo` table, ignoring.", current_class, current_race);
3918 continue;
3919 }
3920
3921 PlayerInfo* info = new PlayerInfo();
3922 info->mapId = mapId;
3923 info->areaId = areaId;
3924 info->positionX = positionX;
3925 info->positionY = positionY;
3926 info->positionZ = positionZ;
3927 info->orientation = orientation;
3928 info->displayId_m = rEntry->model_m;
3929 info->displayId_f = rEntry->model_f;
3930 _playerInfo[current_race][current_class] = info;
3931
3932 ++count;
3933 } while (result->NextRow());
3934
3935 LOG_INFO("server.loading", ">> Loaded {} Player Create Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3936 LOG_INFO("server.loading", " ");
3937 }
3938 }
3939
3940 // Load playercreate items
3941 LOG_INFO("server.loading", "Loading Player Create Items Data...");
3942 {
3943 uint32 oldMSTime = getMSTime();
3944 // 0 1 2 3
3945 QueryResult result = WorldDatabase.Query("SELECT race, class, itemid, amount FROM playercreateinfo_item");
3946
3947 if (!result)
3948 {
3949 LOG_WARN("server.loading", ">> Loaded 0 Custom Player Create Items. DB Table `playercreateinfo_item` Is Empty.");
3950 LOG_INFO("server.loading", " ");
3951 }
3952 else
3953 {
3954 uint32 count = 0;
3955
3956 do
3957 {
3958 Field* fields = result->Fetch();
3959
3960 uint32 current_race = fields[0].Get<uint8>();
3961 if (current_race >= MAX_RACES)
3962 {
3963 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo_item` table, ignoring.", current_race);
3964 continue;
3965 }
3966
3967 uint32 current_class = fields[1].Get<uint8>();
3968 if (current_class >= MAX_CLASSES)
3969 {
3970 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo_item` table, ignoring.", current_class);
3971 continue;
3972 }
3973
3974 uint32 item_id = fields[2].Get<uint32>();
3975
3976 if (!GetItemTemplate(item_id))
3977 {
3978 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);
3979 continue;
3980 }
3981
3982 int32 amount = fields[3].Get<int32>();
3983
3984 if (!amount)
3985 {
3986 LOG_ERROR("sql.sql", "Item id {} (class {} race {}) have amount == 0 in `playercreateinfo_item` table, ignoring.", item_id, current_race, current_class);
3987 continue;
3988 }
3989
3990 if (!current_race || !current_class)
3991 {
3992 uint32 min_race = current_race ? current_race : 1;
3993 uint32 max_race = current_race ? current_race + 1 : MAX_RACES;
3994 uint32 min_class = current_class ? current_class : 1;
3995 uint32 max_class = current_class ? current_class + 1 : MAX_CLASSES;
3996 for (uint32 r = min_race; r < max_race; ++r)
3997 for (uint32 c = min_class; c < max_class; ++c)
3998 PlayerCreateInfoAddItemHelper(r, c, item_id, amount);
3999 }
4000 else
4001 PlayerCreateInfoAddItemHelper(current_race, current_class, item_id, amount);
4002
4003 ++count;
4004 } while (result->NextRow());
4005
4006 LOG_INFO("server.loading", ">> Loaded {} Custom Player Create Items in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4007 LOG_INFO("server.loading", " ");
4008 }
4009 }
4010
4011 // Load playercreate skills
4012 LOG_INFO("server.loading", "Loading Player Create Skill Data...");
4013 {
4014 uint32 oldMSTime = getMSTime();
4015
4016 QueryResult result = WorldDatabase.Query("SELECT raceMask, classMask, skill, `rank` FROM playercreateinfo_skills");
4017
4018 if (!result)
4019 {
4020 LOG_WARN("server.loading", ">> Loaded 0 Player Create Skills. DB Table `playercreateinfo_skills` Is Empty.");
4021 }
4022 else
4023 {
4024 uint32 count = 0;
4025
4026 do
4027 {
4028 Field* fields = result->Fetch();
4029 uint32 raceMask = fields[0].Get<uint32>();
4030 uint32 classMask = fields[1].Get<uint32>();
4032 skill.SkillId = fields[2].Get<uint16>();
4033 skill.Rank = fields[3].Get<uint16>();
4034
4035 if (skill.Rank >= MAX_SKILL_STEP)
4036 {
4037 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);
4038 continue;
4039 }
4040
4041 if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE))
4042 {
4043 LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_skills` table, ignoring.", raceMask);
4044 continue;
4045 }
4046
4047 if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE))
4048 {
4049 LOG_ERROR("sql.sql", "Wrong class mask {} in `playercreateinfo_skills` table, ignoring.", classMask);
4050 continue;
4051 }
4052
4053 if (!sSkillLineStore.LookupEntry(skill.SkillId))
4054 {
4055 LOG_ERROR("sql.sql", "Wrong skill id {} in `playercreateinfo_skills` table, ignoring.", skill.SkillId);
4056 continue;
4057 }
4058
4059 for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
4060 {
4061 if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask))
4062 {
4063 for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
4064 {
4065 if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
4066 {
4067 if (!GetSkillRaceClassInfo(skill.SkillId, raceIndex, classIndex))
4068 continue;
4069
4070 if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
4071 {
4072 info->skills.push_back(skill);
4073 ++count;
4074 }
4075 }
4076 }
4077 }
4078 }
4079 } while (result->NextRow());
4080
4081 LOG_INFO("server.loading", ">> Loaded {} Player Create Skills in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4082 LOG_INFO("server.loading", " ");
4083 }
4084 }
4085
4086 // Load playercreate spells
4087 LOG_INFO("server.loading", "Loading Player Create Spell Data...");
4088 {
4089 uint32 oldMSTime = getMSTime();
4090
4091 QueryResult result = WorldDatabase.Query("SELECT racemask, classmask, Spell FROM playercreateinfo_spell_custom");
4092
4093 if (!result)
4094 {
4095 LOG_WARN("server.loading", ">> Loaded 0 player create spells. DB table `playercreateinfo_spell_custom` is empty.");
4096 }
4097 else
4098 {
4099 uint32 count = 0;
4100
4101 do
4102 {
4103 Field* fields = result->Fetch();
4104 uint32 raceMask = fields[0].Get<uint32>();
4105 uint32 classMask = fields[1].Get<uint32>();
4106 uint32 spellId = fields[2].Get<uint32>();
4107
4108 if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE))
4109 {
4110 LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_spell_custom` table, ignoring.", raceMask);
4111 continue;
4112 }
4113
4114 if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE))
4115 {
4116 LOG_ERROR("sql.sql", "Wrong class mask {} in `playercreateinfo_spell_custom` table, ignoring.", classMask);
4117 continue;
4118 }
4119
4120 for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
4121 {
4122 if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask))
4123 {
4124 for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
4125 {
4126 if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
4127 {
4128 if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
4129 {
4130 info->customSpells.push_back(spellId);
4131 ++count;
4132 }
4133 }
4134 }
4135 }
4136 }
4137 } while (result->NextRow());
4138
4139 LOG_INFO("server.loading", ">> Loaded {} Custom Player Create Spells in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4140 LOG_INFO("server.loading", " ");
4141 }
4142 }
4143
4144 // Load playercreate cast spell
4145 LOG_INFO("server.loading", "Loading Player Create Cast Spell Data...");
4146 {
4147 uint32 oldMSTime = getMSTime();
4148
4149 QueryResult result = WorldDatabase.Query("SELECT raceMask, classMask, spell FROM playercreateinfo_cast_spell");
4150
4151 if (!result)
4152 {
4153 LOG_WARN("server.loading", ">> Loaded 0 Player Create Cast Spells. DB Table `playercreateinfo_cast_spell` Is Empty.");
4154 }
4155 else
4156 {
4157 uint32 count = 0;
4158
4159 do
4160 {
4161 Field* fields = result->Fetch();
4162 uint32 raceMask = fields[0].Get<uint32>();
4163 uint32 classMask = fields[1].Get<uint32>();
4164 uint32 spellId = fields[2].Get<uint32>();
4165
4166 if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE))
4167 {
4168 LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_cast_spell` table, ignoring.", raceMask);
4169 continue;
4170 }
4171
4172 if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE))
4173 {
4174 LOG_ERROR("sql.sql", "Wrong class mask {} in `playercreateinfo_cast_spell` table, ignoring.", classMask);
4175 continue;
4176 }
4177
4178 for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
4179 {
4180 if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask))
4181 {
4182 for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
4183 {
4184 if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
4185 {
4186 if (PlayerInfo* info = _playerInfo[raceIndex][classIndex])
4187 {
4188 info->castSpells.push_back(spellId);
4189 ++count;
4190 }
4191 }
4192 }
4193 }
4194 }
4195 } while (result->NextRow());
4196
4197 LOG_INFO("server.loading", ">> Loaded {} Player Create Cast Spells in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4198 LOG_INFO("server.loading", " ");
4199 }
4200 }
4201
4202 // Load playercreate actions
4203 LOG_INFO("server.loading", "Loading Player Create Action Data...");
4204 {
4205 uint32 oldMSTime = getMSTime();
4206
4207 // 0 1 2 3 4
4208 QueryResult result = WorldDatabase.Query("SELECT race, class, button, action, type FROM playercreateinfo_action");
4209
4210 if (!result)
4211 {
4212 LOG_WARN("server.loading", ">> Loaded 0 Player Create Actions. DB Table `playercreateinfo_action` Is Empty.");
4213 LOG_INFO("server.loading", " ");
4214 }
4215 else
4216 {
4217 uint32 count = 0;
4218
4219 do
4220 {
4221 Field* fields = result->Fetch();
4222
4223 uint32 current_race = fields[0].Get<uint8>();
4224 if (current_race >= MAX_RACES)
4225 {
4226 LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo_action` table, ignoring.", current_race);
4227 continue;
4228 }
4229
4230 uint32 current_class = fields[1].Get<uint8>();
4231 if (current_class >= MAX_CLASSES)
4232 {
4233 LOG_ERROR("sql.sql", "Wrong class {} in `playercreateinfo_action` table, ignoring.", current_class);
4234 continue;
4235 }
4236
4237 if (PlayerInfo* info = _playerInfo[current_race][current_class])
4238 info->action.push_back(PlayerCreateInfoAction(fields[2].Get<uint16>(), fields[3].Get<uint32>(), fields[4].Get<uint16>()));
4239
4240 ++count;
4241 } while (result->NextRow());
4242
4243 LOG_INFO("server.loading", ">> Loaded {} Player Create Actions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4244 LOG_INFO("server.loading", " ");
4245 }
4246 }
4247
4248 // Loading levels data (class/race dependent)
4249 LOG_INFO("server.loading", "Loading Player Create Level Stats Data...");
4250 {
4251 struct RaceStats
4252 {
4253 int16 StatModifier[MAX_STATS];
4254 };
4255
4256 std::array<RaceStats, MAX_RACES> raceStatModifiers;
4257
4258 uint32 oldMSTime = getMSTime();
4259
4260 // 0 1 2 3 4 5
4261 QueryResult raceStatsResult = WorldDatabase.Query("SELECT Race, Strength, Agility, Stamina, Intellect, Spirit FROM player_race_stats");
4262
4263 if (!raceStatsResult)
4264 {
4265 LOG_WARN("server.loading", ">> Loaded 0 race stats definitions. DB table `player_race_stats` is empty.");
4266 LOG_INFO("server.loading", " ");
4267 exit(1);
4268 }
4269
4270 do
4271 {
4272 Field* fields = raceStatsResult->Fetch();
4273
4274 uint32 current_race = fields[0].Get<uint8>();
4275 if (current_race >= MAX_RACES)
4276 {
4277 LOG_ERROR("sql.sql", "Wrong race {} in `player_race_stats` table, ignoring.", current_race);
4278 continue;
4279 }
4280
4281 for (uint32 i = 0; i < MAX_STATS; ++i)
4282 raceStatModifiers[current_race].StatModifier[i] = fields[i + 1].Get<int16>();
4283
4284 } while (raceStatsResult->NextRow());
4285
4286 // 0 1 2 3 4 5 6 7 8
4287 QueryResult result = WorldDatabase.Query("SELECT Class, Level, Strength, Agility, Stamina, Intellect, Spirit, BaseHP, BaseMana FROM player_class_stats");
4288
4289 if (!result)
4290 {
4291 LOG_ERROR("server.loading", ">> Loaded 0 level stats definitions. DB table `player_class_stats` is empty.");
4292 exit(1);
4293 }
4294
4295 uint32 count = 0;
4296
4297 do
4298 {
4299 Field* fields = result->Fetch();
4300
4301 uint32 current_class = fields[0].Get<uint8>();
4302 if (current_class >= MAX_CLASSES)
4303 {
4304 LOG_ERROR("sql.sql", "Wrong class {} in `player_class_stats` table, ignoring.", current_class);
4305 continue;
4306 }
4307
4308 uint32 current_level = fields[1].Get<uint8>();
4309 if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4310 {
4311 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
4312 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `player_class_stats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
4313 else
4314 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `player_class_stats` table, ignoring.", current_level);
4315
4316 continue;
4317 }
4318
4319 for (std::size_t race = 0; race < raceStatModifiers.size(); ++race)
4320 {
4321 if (PlayerInfo* info = _playerInfo[race][current_class])
4322 {
4323 if (!info->levelInfo)
4324 info->levelInfo = new PlayerLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
4325
4326 PlayerLevelInfo& levelInfo = info->levelInfo[current_level - 1];
4327 for (int i = 0; i < MAX_STATS; ++i)
4328 levelInfo.stats[i] = fields[i + 2].Get<uint16>() + raceStatModifiers[race].StatModifier[i];
4329 }
4330 }
4331
4332 PlayerClassInfo* info = _playerClassInfo[current_class];
4333 if (!info)
4334 {
4335 info = new PlayerClassInfo();
4337 _playerClassInfo[current_class] = info;
4338 }
4339
4340 PlayerClassLevelInfo& levelInfo = info->levelInfo[current_level - 1];
4341
4342 levelInfo.basehealth = fields[7].Get<uint32>();
4343 levelInfo.basemana = fields[8].Get<uint32>();
4344
4345 ++count;
4346 } while (result->NextRow());
4347
4348 // Fill gaps and check integrity
4349 for (int race = 0; race < MAX_RACES; ++race)
4350 {
4351 // skip non existed races
4352 if (!sChrRacesStore.LookupEntry(race))
4353 continue;
4354
4355 for (int class_ = 0; class_ < MAX_CLASSES; ++class_)
4356 {
4357 // skip non existed classes
4358 if (!sChrClassesStore.LookupEntry(class_))
4359 continue;
4360
4361 PlayerClassInfo* pClassInfo = _playerClassInfo[class_];
4362 PlayerInfo* info = _playerInfo[race][class_];
4363 if (!info)
4364 continue;
4365
4366 // skip expansion races if not playing with expansion
4367 if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_THE_BURNING_CRUSADE && (race == RACE_BLOODELF || race == RACE_DRAENEI))
4368 continue;
4369
4370 // skip expansion classes if not playing with expansion
4372 continue;
4373
4374 // fatal error if no initial stats data
4375 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))
4376 {
4377 LOG_ERROR("sql.sql", "Race {} class {} initial level does not have stats data!", race, class_);
4378 exit(1);
4379 }
4380
4381 // fatal error if no initial health/mana data
4382 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))
4383 {
4384 LOG_ERROR("sql.sql", "Class {} initial level does not have health/mana data!", class_);
4385 exit(1);
4386 }
4387
4388 // fill level gaps for stats
4389 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4390 {
4391 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))
4392 {
4393 LOG_ERROR("sql.sql", "Race {} class {} level {} does not have stats data. Using stats data of level {}.", race, class_, level + 1, level);
4394 info->levelInfo[level] = info->levelInfo[level - 1];
4395 }
4396 }
4397
4398 // fill level gaps for health/mana
4399 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4400 {
4401 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))
4402 {
4403 LOG_ERROR("sql.sql", "Class {} level {} does not have health/mana data. Using stats data of level {}.", class_, level + 1, level);
4404 pClassInfo->levelInfo[level] = pClassInfo->levelInfo[level - 1];
4405 }
4406 }
4407 }
4408 }
4409
4410 LOG_INFO("server.loading", ">> Loaded {} Level Stats Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4411 LOG_INFO("server.loading", " ");
4412 }
4413
4414 // Loading xp per level data
4415 LOG_INFO("server.loading", "Loading Player Create XP Data...");
4416 {
4417 uint32 oldMSTime = getMSTime();
4418
4419 _playerXPperLevel.resize(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
4420 for (uint8 level = 0; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4421 _playerXPperLevel[level] = 0;
4422
4423 // 0 1
4424 QueryResult result = WorldDatabase.Query("SELECT Level, Experience FROM player_xp_for_level");
4425
4426 if (!result)
4427 {
4428 LOG_WARN("server.loading", ">> Loaded 0 xp for level definitions. DB table `player_xp_for_level` is empty.");
4429 LOG_INFO("server.loading", " ");
4430 exit(1);
4431 }
4432
4433 uint32 count = 0;
4434
4435 do
4436 {
4437 Field* fields = result->Fetch();
4438
4439 uint32 current_level = fields[0].Get<uint8>();
4440 uint32 current_xp = fields[1].Get<uint32>();
4441
4442 if (current_level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4443 {
4444 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
4445 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `player_xp_for_level` table, ignoring.", STRONG_MAX_LEVEL, current_level);
4446 else
4447 {
4448 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `player_xp_for_levels` table, ignoring.", current_level);
4449 ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
4450 }
4451 continue;
4452 }
4453 //PlayerXPperLevel
4454 _playerXPperLevel[current_level] = current_xp;
4455 ++count;
4456 } while (result->NextRow());
4457
4458 // fill level gaps
4459 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
4460 {
4461 if (_playerXPperLevel[level] == 0)
4462 {
4463 LOG_ERROR("sql.sql", "Level {} does not have XP for level data. Using data of level [{}] + 100.", level + 1, level);
4464 _playerXPperLevel[level] = _playerXPperLevel[level - 1] + 100;
4465 }
4466 }
4467
4468 LOG_INFO("server.loading", ">> Loaded {} XP For Level Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
4469 LOG_INFO("server.loading", " ");
4470 }
4471}
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
@ CONFIG_START_HEROIC_PLAYER_LEVEL
Definition IWorld.h:239
@ CONFIG_START_PLAYER_LEVEL
Definition IWorld.h:238
@ CONFIG_EXPANSION
Definition IWorld.h:276
@ 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
void PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count)
Definition ObjectMgr.cpp:3818
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:3322
SummonSlot
Definition SharedDefines.h:3310
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 ( )
8008{
8009 uint32 oldMSTime = getMSTime();
8010
8011 _pointsOfInterestStore.clear(); // need for reload case
8012
8013 uint32 count = 0;
8014
8015 // 0 1 2 3 4 5 6
8016 QueryResult result = WorldDatabase.Query("SELECT ID, PositionX, PositionY, Icon, Flags, Importance, Name FROM points_of_interest");
8017
8018 if (!result)
8019 {
8020 LOG_WARN("server.loading", ">> Loaded 0 Points of Interest definitions. DB table `points_of_interest` is empty.");
8021 LOG_INFO("server.loading", " ");
8022 return;
8023 }
8024
8025 do
8026 {
8027 Field* fields = result->Fetch();
8028
8029 uint32 point_id = fields[0].Get<uint32>();
8030
8031 PointOfInterest POI;
8032 POI.ID = point_id;
8033 POI.PositionX = fields[1].Get<float>();
8034 POI.PositionY = fields[2].Get<float>();
8035 POI.Icon = fields[3].Get<uint32>();
8036 POI.Flags = fields[4].Get<uint32>();
8037 POI.Importance = fields[5].Get<uint32>();
8038 POI.Name = fields[6].Get<std::string>();
8039
8040 if (!Acore::IsValidMapCoord(POI.PositionX, POI.PositionY))
8041 {
8042 LOG_ERROR("sql.sql", "Table `points_of_interest` (ID: {}) have invalid coordinates (X: {} Y: {}), ignored.", point_id, POI.PositionX, POI.PositionY);
8043 continue;
8044 }
8045
8046 _pointsOfInterestStore[point_id] = POI;
8047
8048 ++count;
8049 } while (result->NextRow());
8050
8051 LOG_INFO("server.loading", ">> Loaded {} Points of Interest Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8052 LOG_INFO("server.loading", " ");
8053}
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 ( )
8430{
8431 uint32 oldMSTime = getMSTime();
8432
8433 _profanityNamesStore.clear(); // need for reload case
8434
8435 QueryResult result = CharacterDatabase.Query("SELECT name FROM profanity_name");
8436
8437 if (!result)
8438 {
8439 LOG_WARN("server.loading", ">> Loaded 0 profanity names. DB table `profanity_name` is empty!");
8440 return;
8441 }
8442
8443 uint32 count = 0;
8444
8445 Field* fields;
8446 do
8447 {
8448 fields = result->Fetch();
8449 std::string name = fields[0].Get<std::string>();
8450
8451 std::wstring wstr;
8452 if (!Utf8toWStr (name, wstr))
8453 {
8454 LOG_ERROR("sql.sql", "Table `profanity_name` have invalid name: {}", name);
8455 continue;
8456 }
8457
8458 wstrToLower(wstr);
8459
8460 _profanityNamesStore.insert(wstr);
8461 ++count;
8462 } while (result->NextRow());
8463
8464 LOG_INFO("server.loading", ">> Loaded {} profanity names from DB in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8465}

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

◆ LoadProfanityNamesFromDBC()

void ObjectMgr::LoadProfanityNamesFromDBC ( )
8468{
8469 if (!sWorld->getBoolConfig(CONFIG_STRICT_NAMES_PROFANITY))
8470 {
8471 LOG_WARN("server.loading", ">> Loaded 0 profanity names from DBC. Config option disabled.");
8472 return;
8473 }
8474
8475 uint32 oldMSTime = getMSTime();
8476
8477 uint32 count = 0;
8478
8479 for (NamesProfanityEntry const* profanityStore : sNamesProfanityStore)
8480 {
8481 std::wstring wstr;
8482
8483 Utf8toWStr(profanityStore->Pattern, wstr);
8484
8485 // DBC does not have clean entries, remove the junk.
8486 boost::algorithm::replace_all(wstr, "\\<", "");
8487 boost::algorithm::replace_all(wstr, "\\>", "");
8488
8489 _profanityNamesStore.insert(wstr);
8490 count++;
8491 }
8492
8493 LOG_INFO("server.loading", ">> Loaded {} profanity names from DBC in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8494 LOG_INFO("server.loading", " ");
8495}
DBCStorage< NamesProfanityEntry > sNamesProfanityStore(NamesProfanityfmt)
@ CONFIG_STRICT_NAMES_PROFANITY
Definition IWorld.h:179
Definition DBCStructure.h:1406

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

◆ LoadQuestAreaTriggers()

void ObjectMgr::LoadQuestAreaTriggers ( )
6386{
6387 uint32 oldMSTime = getMSTime();
6388
6389 _questAreaTriggerStore.clear(); // need for reload case
6390
6391 QueryResult result = WorldDatabase.Query("SELECT id, quest FROM areatrigger_involvedrelation");
6392
6393 if (!result)
6394 {
6395 LOG_WARN("server.loading", ">> Loaded 0 quest trigger points. DB table `areatrigger_involvedrelation` is empty.");
6396 LOG_INFO("server.loading", " ");
6397 return;
6398 }
6399
6400 uint32 count = 0;
6401
6402 do
6403 {
6404 ++count;
6405
6406 Field* fields = result->Fetch();
6407
6408 uint32 trigger_ID = fields[0].Get<uint32>();
6409 uint32 quest_ID = fields[1].Get<uint32>();
6410
6411 AreaTrigger const* atEntry = GetAreaTrigger(trigger_ID);
6412 if (!atEntry)
6413 {
6414 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", trigger_ID);
6415 continue;
6416 }
6417
6418 Quest const* quest = GetQuestTemplate(quest_ID);
6419
6420 if (!quest)
6421 {
6422 LOG_ERROR("sql.sql", "Table `areatrigger_involvedrelation` has record (id: {}) for not existing quest {}", trigger_ID, quest_ID);
6423 continue;
6424 }
6425
6427 {
6428 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);
6429
6430 // this will prevent quest completing without objective
6431 const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
6432
6433 // continue; - quest modified to required objective and trigger can be allowed.
6434 }
6435
6436 _questAreaTriggerStore[trigger_ID] = quest_ID;
6437 } while (result->NextRow());
6438
6439 LOG_INFO("server.loading", ">> Loaded {} Quest Trigger Points in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6440 LOG_INFO("server.loading", " ");
6441}
@ 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 ( )
6462{
6463 uint32 oldMSTime = getMSTime();
6464
6465 _questGreetingStore.clear(); // For reload case
6466
6467 // 0 1 2 3 4
6468 QueryResult result = WorldDatabase.Query("SELECT ID, Type, GreetEmoteType, GreetEmoteDelay, Greeting FROM quest_greeting");
6469 if (!result)
6470 {
6471 LOG_WARN("server.loading", ">> Loaded 0 quest greetings. DB table `quest_greeting` is empty.");
6472 return;
6473 }
6474
6475 do
6476 {
6477 Field* fields = result->Fetch();
6478
6479 uint32 id = fields[0].Get<uint32>();
6480 uint8 type = fields[1].Get<uint8>();
6481 switch (type)
6482 {
6483 case 0: // Creature
6484 if (!sObjectMgr->GetCreatureTemplate(id))
6485 {
6486 LOG_ERROR("sql.sql", "Table `quest_greeting`: creature template entry {} does not exist.", id);
6487 continue;
6488 }
6489 break;
6490 case 1: // GameObject
6491 if (!sObjectMgr->GetGameObjectTemplate(id))
6492 {
6493 LOG_ERROR("sql.sql", "Table `quest_greeting`: gameobject template entry {} does not exist.", id);
6494 continue;
6495 }
6496 break;
6497 default:
6498 LOG_ERROR("sql.sql", "Table `quest_greeting` has unknown type {} for id {}, skipped.", type, id);
6499 continue;
6500 }
6501
6502 std::pair<uint32, uint8> pairKey = std::make_pair(id, type);
6503 QuestGreeting& data = _questGreetingStore[pairKey];
6504
6505 data.EmoteType = fields[2].Get<uint16>();
6506 data.EmoteDelay = fields[3].Get<uint32>();
6507 AddLocaleString(fields[4].Get<std::string>(), LOCALE_enUS, data.Greeting);
6508 }
6509 while (result->NextRow());
6510
6511 LOG_INFO("server.loading", ">> Loaded {} quest_greeting in {} ms", _questGreetingStore.size(), GetMSTimeDiffToNow(oldMSTime));
6512 LOG_INFO("server.loading", " ");
6513}
Definition ObjectMgr.h:599
uint32 EmoteDelay
Definition ObjectMgr.h:601
std::vector< std::string > Greeting
Definition ObjectMgr.h:602
uint16 EmoteType
Definition ObjectMgr.h:600

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

◆ LoadQuestGreetingsLocales()

void ObjectMgr::LoadQuestGreetingsLocales ( )
6516{
6517 uint32 oldMSTime = getMSTime();
6518
6519 // 0 1 2 3
6520 QueryResult result = WorldDatabase.Query("SELECT ID, Type, Locale, Greeting FROM quest_greeting_locale");
6521 if (!result)
6522 {
6523 LOG_WARN("server.loading", ">> Loaded 0 quest_greeting locales. DB table `quest_greeting_locale` is empty.");
6524 return;
6525 }
6526
6527 uint32 localeCount = 0;
6528 do
6529 {
6530 Field* fields = result->Fetch();
6531
6532 uint32 id = fields[0].Get<uint32>();
6533 uint8 type = fields[1].Get<uint8>();
6534 switch (type)
6535 {
6536 case 0: // Creature
6537 if (!sObjectMgr->GetCreatureTemplate(id))
6538 {
6539 LOG_ERROR("sql.sql", "Table `quest_greeting_locale`: creature template entry {} does not exist.", id);
6540 continue;
6541 }
6542 break;
6543 case 1: // GameObject
6544 if (!sObjectMgr->GetGameObjectTemplate(id))
6545 {
6546 LOG_ERROR("sql.sql", "Table `quest_greeting_locale`: gameobject template entry {} does not exist.", id);
6547 continue;
6548 }
6549 break;
6550 default:
6551 continue;
6552 }
6553
6554 std::pair<uint32, uint8> pairKey = std::make_pair(id, type);
6555 QuestGreeting& data = _questGreetingStore[pairKey];
6556
6557 QuestGreetingContainer::iterator qgc = _questGreetingStore.find(pairKey);
6558 if (qgc == _questGreetingStore.end())
6559 {
6560 LOG_ERROR("sql.sql", "QuestGreeting (Id: {} Type: {}) found in table `quest_greeting_locale` but does not exist in `quest_greeting`. Skipped!", id, type);
6561 continue;
6562 }
6563
6564 LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>());
6565 if (locale == LOCALE_enUS)
6566 continue;
6567
6568 AddLocaleString(fields[3].Get<std::string>(), locale, data.Greeting);
6569 localeCount++;
6570 } while (result->NextRow());
6571
6572 LOG_INFO("server.loading", ">> Loaded {} quest greeting Locale Strings in {} ms", localeCount, GetMSTimeDiffToNow(oldMSTime));
6573 LOG_INFO("server.loading", " ");
6574}

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

◆ LoadQuestLocales()

void ObjectMgr::LoadQuestLocales ( )
5346{
5347 uint32 oldMSTime = getMSTime();
5348
5349 _questLocaleStore.clear(); // need for reload case
5350
5351 // 0 1 2 3 4 5 6 7 8 9 10
5352 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Title, Details, Objectives, EndText, CompletedText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4 FROM quest_template_locale");
5353
5354 if (!result)
5355 return;
5356
5357 do
5358 {
5359 Field* fields = result->Fetch();
5360
5361 uint32 ID = fields[0].Get<uint32>();
5362
5363 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
5364 if (locale == LOCALE_enUS)
5365 continue;
5366
5367 QuestLocale& data = _questLocaleStore[ID];
5368 AddLocaleString(fields[2].Get<std::string>(), locale, data.Title);
5369 AddLocaleString(fields[3].Get<std::string>(), locale, data.Details);
5370 AddLocaleString(fields[4].Get<std::string>(), locale, data.Objectives);
5371 AddLocaleString(fields[5].Get<std::string>(), locale, data.AreaDescription);
5372 AddLocaleString(fields[6].Get<std::string>(), locale, data.CompletedText);
5373
5374 for (uint8 i = 0; i < 4; ++i)
5375 AddLocaleString(fields[i + 7].Get<std::string>(), locale, data.ObjectiveText[i]);
5376 } while (result->NextRow());
5377
5378 LOG_INFO("server.loading", ">> Loaded {} Quest Locale Strings in {} ms", (uint32)_questLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
5379}
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 ( )
10387{
10388 uint32 oldMSTime = getMSTime();
10389
10390 _questMoneyRewards.clear();
10391
10392 // 0 1 2 3 4 5 6 7 8 9 10
10393 QueryResult result = WorldDatabase.Query("SELECT `Level`, Money0, Money1, Money2, Money3, Money4, Money5, Money6, Money7, Money8, Money9 FROM `quest_money_reward` ORDER BY `Level`");
10394 if (!result)
10395 {
10396 LOG_WARN("server.loading", ">> Loaded 0 quest money rewards. DB table `quest_money_reward` is empty.");
10397 return;
10398 }
10399
10400 uint32 count = 0;
10401 do
10402 {
10403 Field* fields = result->Fetch();
10404 uint32 Level = fields[0].Get<uint32>();
10405
10406 QuestMoneyRewardArray& questMoneyReward = _questMoneyRewards[Level];
10407 questMoneyReward.fill(0);
10408
10409 for (uint8 i = 0; i < MAX_QUEST_MONEY_REWARDS; ++i)
10410 {
10411 questMoneyReward[i] = fields[1 + i].Get<uint32>();
10412 ++count;
10413 }
10414 } while (result->NextRow());
10415
10416 LOG_INFO("server.loading", ">> Loaded {} Quest Money Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10417 LOG_INFO("server.loading", " ");
10418}
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 ( )
6577{
6578 uint32 oldMSTime = getMSTime();
6579
6580 _questOfferRewardLocaleStore.clear(); // need for reload case
6581
6582 // 0 1 2
6583 QueryResult result = WorldDatabase.Query("SELECT Id, locale, RewardText FROM quest_offer_reward_locale");
6584 if (!result)
6585 return;
6586
6587 do
6588 {
6589 Field* fields = result->Fetch();
6590
6591 uint32 id = fields[0].Get<uint32>();
6592 std::string localeName = fields[1].Get<std::string>();
6593
6594 LocaleConstant locale = GetLocaleByName(localeName);
6595 if (locale == LOCALE_enUS)
6596 continue;
6597
6599 AddLocaleString(fields[2].Get<std::string>(), locale, data.RewardText);
6600 } while (result->NextRow());
6601
6602 LOG_INFO("server.loading", ">> Loaded {} Quest Offer Reward Locale Strings in {} ms", _questOfferRewardLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6603}
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 ( )
8056{
8057 if (!sWorld->getBoolConfig(CONFIG_QUEST_POI_ENABLED))
8058 {
8059 LOG_INFO("server.loading", ">> Loaded 0 quest POI definitions. Disabled by config.");
8060 LOG_INFO("server.loading", " ");
8061 return;
8062 }
8063
8064 uint32 oldMSTime = getMSTime();
8065
8066 _questPOIStore.clear(); // need for reload case
8067
8068 uint32 count = 0;
8069
8070 // 0 1 2 3 4 5 6 7
8071 QueryResult result = WorldDatabase.Query("SELECT QuestID, id, ObjectiveIndex, MapID, WorldMapAreaId, Floor, Priority, Flags FROM quest_poi order by QuestID");
8072
8073 if (!result)
8074 {
8075 LOG_WARN("server.loading", ">> Loaded 0 quest POI definitions. DB table `quest_poi` is empty.");
8076 LOG_INFO("server.loading", " ");
8077 return;
8078 }
8079
8080 // 0 1 2 3
8081 QueryResult points = WorldDatabase.Query("SELECT QuestID, Idx1, X, Y FROM quest_poi_points ORDER BY QuestID DESC, Idx2");
8082
8083 std::vector<std::vector<std::vector<QuestPOIPoint> > > POIs;
8084
8085 if (points)
8086 {
8087 // The first result should have the highest questId
8088 Field* fields = points->Fetch();
8089 uint32 questIdMax = fields[0].Get<uint32>();
8090 POIs.resize(questIdMax + 1);
8091
8092 do
8093 {
8094 fields = points->Fetch();
8095
8096 uint32 questId = fields[0].Get<uint32>();
8097 uint32 id = fields[1].Get<uint32>();
8098 int32 x = fields[2].Get<int32>();
8099 int32 y = fields[3].Get<int32>();
8100
8101 if (POIs[questId].size() <= id + 1)
8102 POIs[questId].resize(id + 10);
8103
8104 QuestPOIPoint point(x, y);
8105 POIs[questId][id].push_back(point);
8106 } while (points->NextRow());
8107 }
8108
8109 do
8110 {
8111 Field* fields = result->Fetch();
8112
8113 uint32 questId = fields[0].Get<uint32>();
8114 uint32 id = fields[1].Get<uint32>();
8115 int32 objIndex = fields[2].Get<int32>();
8116 uint32 mapId = fields[3].Get<uint32>();
8117 uint32 WorldMapAreaId = fields[4].Get<uint32>();
8118 uint32 FloorId = fields[5].Get<uint32>();
8119 uint32 unk3 = fields[6].Get<uint32>();
8120 uint32 unk4 = fields[7].Get<uint32>();
8121
8122 QuestPOI POI(id, objIndex, mapId, WorldMapAreaId, FloorId, unk3, unk4);
8123 if (questId < POIs.size() && id < POIs[questId].size())
8124 {
8125 POI.points = POIs[questId][id];
8126 _questPOIStore[questId].push_back(POI);
8127 }
8128 else
8129 LOG_ERROR("sql.sql", "Table quest_poi references unknown quest points for quest {} POI id {}", questId, id);
8130
8131 ++count;
8132 } while (result->NextRow());
8133
8134 LOG_INFO("server.loading", ">> Loaded {} Quest POI definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8135 LOG_INFO("server.loading", " ");
8136}
@ CONFIG_QUEST_POI_ENABLED
Definition IWorld.h:172
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
8226{
8227 uint32 oldMSTime = getMSTime();
8228
8229 map.clear(); // need for reload case
8230
8231 uint32 count = 0;
8232
8233 QueryResult result = WorldDatabase.Query("SELECT id, quest, pool_entry FROM {} qr LEFT JOIN pool_quest pq ON qr.quest = pq.entry", table);
8234
8235 if (!result)
8236 {
8237 LOG_WARN("server.loading", ">> Loaded 0 quest relations from `{}`, table is empty.", table);
8238 LOG_INFO("server.loading", " ");
8239 return;
8240 }
8241
8242 PooledQuestRelation* poolRelationMap = go ? &sPoolMgr->mQuestGORelation : &sPoolMgr->mQuestCreatureRelation;
8243 if (starter)
8244 poolRelationMap->clear();
8245
8246 do
8247 {
8248 uint32 id = result->Fetch()[0].Get<uint32>();
8249 uint32 quest = result->Fetch()[1].Get<uint32>();
8250 uint32 poolId = result->Fetch()[2].Get<uint32>();
8251
8252 if (_questTemplates.find(quest) == _questTemplates.end())
8253 {
8254 LOG_ERROR("sql.sql", "Table `{}`: Quest {} listed for entry {} does not exist.", table, quest, id);
8255 continue;
8256 }
8257
8258 if (!poolId || !starter)
8259 map.insert(QuestRelations::value_type(id, quest));
8260 else if (starter)
8261 poolRelationMap->insert(PooledQuestRelation::value_type(quest, id));
8262
8263 ++count;
8264 } while (result->NextRow());
8265
8266 LOG_INFO("server.loading", ">> Loaded {} Quest Relations From {} in {} ms", count, table, GetMSTimeDiffToNow(oldMSTime));
8267 LOG_INFO("server.loading", " ");
8268}
#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 ( )
6606{
6607 uint32 oldMSTime = getMSTime();
6608
6609 _questRequestItemsLocaleStore.clear(); // need for reload case
6610
6611 // 0 1 2
6612 QueryResult result = WorldDatabase.Query("SELECT Id, locale, CompletionText FROM quest_request_items_locale");
6613 if (!result)
6614 return;
6615
6616 do
6617 {
6618 Field* fields = result->Fetch();
6619
6620 uint32 id = fields[0].Get<uint32>();
6621 std::string localeName = fields[1].Get<std::string>();
6622
6623 LocaleConstant locale = GetLocaleByName(localeName);
6624 if (locale == LOCALE_enUS)
6625 continue;
6626
6628 AddLocaleString(fields[2].Get<std::string>(), locale, data.CompletionText);
6629 } while (result->NextRow());
6630
6631 LOG_INFO("server.loading", ">> Loaded {} Quest Request Items Locale Strings in {} ms", _questRequestItemsLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6632}
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 ( )
4578{
4579 uint32 oldMSTime = getMSTime();
4580
4581 // For reload case
4582 for (QuestMap::const_iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4583 delete itr->second;
4584 _questTemplates.clear();
4585
4586 mExclusiveQuestGroups.clear();
4587
4588 QueryResult result = WorldDatabase.Query("SELECT "
4589 //0 1 2 3 4 5 6 7 8
4590 "ID, QuestType, QuestLevel, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, TimeAllowed, AllowableRaces,"
4591 // 9 10 11 12
4592 "RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, "
4593 // 13 14 15 16 17 18 19 20
4594 "RewardNextQuest, RewardXPDifficulty, RewardMoney, RewardMoneyDifficulty, RewardDisplaySpell, RewardSpell, RewardHonor, RewardKillHonor, "
4595 // 21 22 23 24 25 26
4596 "StartItem, Flags, RewardTitle, RequiredPlayerKills, RewardTalents, RewardArenaPoints, "
4597 // 27 28 29 30 31 32 33 34
4598 "RewardItem1, RewardAmount1, RewardItem2, RewardAmount2, RewardItem3, RewardAmount3, RewardItem4, RewardAmount4, "
4599 // 35 36 37 38 39 40 41 42 43 44 45 46
4600 "RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemID6, RewardChoiceItemQuantity6, "
4601 // 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
4602 "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionID5, RewardFactionValue5, RewardFactionOverride5,"
4603 // 61 63 64 65
4604 "POIContinent, POIx, POIy, POIPriority, "
4605 // 66 67 68 69 70
4606 "LogTitle, LogDescription, QuestDescription, AreaDescription, QuestCompletionLog, "
4607 // 71 72 73 74 75 76 77 78
4608 "RequiredNpcOrGo1, RequiredNpcOrGo2, RequiredNpcOrGo3, RequiredNpcOrGo4, RequiredNpcOrGoCount1, RequiredNpcOrGoCount2, RequiredNpcOrGoCount3, RequiredNpcOrGoCount4, "
4609 // 79 80 81 82 83 84 85 86
4610 "ItemDrop1, ItemDrop2, ItemDrop3, ItemDrop4, ItemDropQuantity1, ItemDropQuantity2, ItemDropQuantity3, ItemDropQuantity4, "
4611 // 87 88 89 90 91 92 93 94 95 96 97 98
4612 "RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, "
4613 // 99 100 101 102 103
4614 "Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4"
4615 " FROM quest_template");
4616 if (!result)
4617 {
4618 LOG_WARN("server.loading", ">> Loaded 0 quests definitions. DB table `quest_template` is empty.");
4619 LOG_INFO("server.loading", " ");
4620 return;
4621 }
4622
4623 // create multimap previous quest for each existed quest
4624 // some quests can have many previous maps set by NextQuestId in previous quest
4625 // for example set of race quests can lead to single not race specific quest
4626 do
4627 {
4628 Field* fields = result->Fetch();
4629
4630 Quest* newQuest = new Quest(fields);
4631 _questTemplates[newQuest->GetQuestId()] = newQuest;
4632 } while (result->NextRow());
4633
4634 // pussywizard:
4635 {
4636 uint32 max = 0;
4637 for (QuestMap::const_iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4638 if (itr->first > max)
4639 max = itr->first;
4640 if (max)
4641 {
4642 _questTemplatesFast.clear();
4643 _questTemplatesFast.resize(max + 1, nullptr);
4644 for (QuestMap::iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4645 _questTemplatesFast[itr->first] = itr->second;
4646 }
4647 }
4648
4649 for (QuestMap::iterator itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr)
4650 itr->second->InitializeQueryData();
4651
4652 std::map<uint32, uint32> usedMailTemplates;
4653
4654 // Load `quest_details`
4655 // 0 1 2 3 4 5 6 7 8
4656 result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4 FROM quest_details");
4657
4658 if (!result)
4659 {
4660 LOG_WARN("server.loading", ">> Loaded 0 quest details. DB table `quest_details` is empty.");
4661 }
4662 else
4663 {
4664 do
4665 {
4666 Field* fields = result->Fetch();
4667 uint32 questId = fields[0].Get<uint32>();
4668
4669 auto itr = _questTemplates.find(questId);
4670 if (itr != _questTemplates.end())
4671 itr->second->LoadQuestDetails(fields);
4672 else
4673 LOG_ERROR("sql.sql", "Table `quest_details` has data for quest {} but such quest does not exist", questId);
4674 } while (result->NextRow());
4675 }
4676
4677 // Load `quest_request_items`
4678 // 0 1 2 3
4679 result = WorldDatabase.Query("SELECT ID, EmoteOnComplete, EmoteOnIncomplete, CompletionText FROM quest_request_items");
4680
4681 if (!result)
4682 {
4683 LOG_WARN("server.loading", ">> Loaded 0 quest request items. DB table `quest_request_items` is empty.");
4684 }
4685 else
4686 {
4687 do
4688 {
4689 Field* fields = result->Fetch();
4690 uint32 questId = fields[0].Get<uint32>();
4691
4692 auto itr = _questTemplates.find(questId);
4693 if (itr != _questTemplates.end())
4694 itr->second->LoadQuestRequestItems(fields);
4695 else
4696 LOG_ERROR("sql.sql", "Table `quest_request_items` has data for quest {} but such quest does not exist", questId);
4697 } while (result->NextRow());
4698 }
4699
4700 // Load `quest_offer_reward`
4701 // 0 1 2 3 4 5 6 7 8 9
4702 result = WorldDatabase.Query("SELECT ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4, RewardText FROM quest_offer_reward");
4703
4704 if (!result)
4705 {
4706 LOG_WARN("server.loading", ">> Loaded 0 quest reward emotes. DB table `quest_offer_reward` is empty.");
4707 }
4708 else
4709 {
4710 do
4711 {
4712 Field* fields = result->Fetch();
4713 uint32 questId = fields[0].Get<uint32>();
4714
4715 auto itr = _questTemplates.find(questId);
4716 if (itr != _questTemplates.end())
4717 itr->second->LoadQuestOfferReward(fields);
4718 else
4719 LOG_ERROR("sql.sql", "Table `quest_offer_reward` has data for quest {} but such quest does not exist", questId);
4720 } while (result->NextRow());
4721 }
4722
4723 // Load `quest_template_addon`
4724 // 0 1 2 3 4 5 6 7 8
4725 result = WorldDatabase.Query("SELECT ID, MaxLevel, AllowableClasses, SourceSpellID, PrevQuestID, NextQuestID, ExclusiveGroup, RewardMailTemplateID, RewardMailDelay, "
4726 //9 10 11 12 13 14 15 16 17
4727 "RequiredSkillID, RequiredSkillPoints, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, ProvidedItemCount, RewardMailSenderEntry, SpecialFlags FROM quest_template_addon LEFT JOIN quest_mail_sender ON Id=QuestId");
4728
4729 if (!result)
4730 {
4731 LOG_WARN("server.loading", ">> Loaded 0 quest template addons. DB table `quest_template_addon` is empty.");
4732 }
4733 else
4734 {
4735 do
4736 {
4737 Field* fields = result->Fetch();
4738 uint32 questId = fields[0].Get<uint32>();
4739
4740 auto itr = _questTemplates.find(questId);
4741 if (itr != _questTemplates.end())
4742 itr->second->LoadQuestTemplateAddon(fields);
4743 else
4744 LOG_ERROR("sql.sql", "Table `quest_template_addon` has data for quest {} but such quest does not exist", questId);
4745 } while (result->NextRow());
4746 }
4747
4748 // Post processing
4749 for (QuestMap::iterator iter = _questTemplates.begin(); iter != _questTemplates.end(); ++iter)
4750 {
4751 // skip post-loading checks for disabled quests
4752 if (sDisableMgr->IsDisabledFor(DISABLE_TYPE_QUEST, iter->first, nullptr))
4753 continue;
4754
4755 Quest* qinfo = iter->second;
4756
4757 // additional quest integrity checks (GO, creature_template and item_template must be loaded already)
4758
4759 if (qinfo->GetQuestMethod() >= 3)
4760 LOG_ERROR("sql.sql", "Quest {} has `Method` = {}, expected values are 0, 1 or 2.", qinfo->GetQuestId(), qinfo->GetQuestMethod());
4761
4763 {
4764 LOG_ERROR("sql.sql", "Quest {} has `SpecialFlags` = {} > max allowed value. Correct `SpecialFlags` to value <= {}",
4767 }
4768
4769 if (qinfo->Flags & QUEST_FLAGS_DAILY && qinfo->Flags & QUEST_FLAGS_WEEKLY)
4770 {
4771 LOG_ERROR("sql.sql", "Weekly Quest {} is marked as daily quest in `Flags`, removed daily flag.", qinfo->GetQuestId());
4772 qinfo->Flags &= ~QUEST_FLAGS_DAILY;
4773 }
4774
4775 if (qinfo->Flags & QUEST_FLAGS_DAILY)
4776 {
4778 {
4779 LOG_ERROR("sql.sql", "Daily Quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
4781 }
4782 }
4783
4784 if (qinfo->Flags & QUEST_FLAGS_WEEKLY)
4785 {
4787 {
4788 LOG_ERROR("sql.sql", "Weekly Quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
4790 }
4791 }
4792
4794 {
4796 {
4797 LOG_ERROR("sql.sql", "Monthly quest {} not marked as repeatable in `SpecialFlags`, added.", qinfo->GetQuestId());
4799 }
4800 }
4801
4802 if (qinfo->Flags & QUEST_FLAGS_TRACKING)
4803 {
4804 // at auto-reward can be rewarded only RewardChoiceItemId[0]
4805 for (int j = 1; j < QUEST_REWARD_CHOICES_COUNT; ++j )
4806 {
4807 if (uint32 id = qinfo->RewardChoiceItemId[j])
4808 {
4809 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but item from `RewardChoiceItemId{}` can't be rewarded with quest flag QUEST_FLAGS_TRACKING.",
4810 qinfo->GetQuestId(), j + 1, id, j + 1);
4811 // no changes, quest ignore this data
4812 }
4813 }
4814 }
4815
4816 // client quest log visual (area case)
4817 if (qinfo->ZoneOrSort > 0)
4818 {
4819 if (!sAreaTableStore.LookupEntry(qinfo->ZoneOrSort))
4820 {
4821 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} (zone case) but zone with this id does not exist.",
4822 qinfo->GetQuestId(), qinfo->ZoneOrSort);
4823 // no changes, quest not dependent from this value but can have problems at client
4824 }
4825 }
4826 // client quest log visual (sort case)
4827 if (qinfo->ZoneOrSort < 0)
4828 {
4829 QuestSortEntry const* qSort = sQuestSortStore.LookupEntry(-int32(qinfo->ZoneOrSort));
4830 if (!qSort)
4831 {
4832 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} (sort case) but quest sort with this id does not exist.",
4833 qinfo->GetQuestId(), qinfo->ZoneOrSort);
4834 // 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)
4835 }
4836 //check for proper RequiredSkillId value (skill case)
4837 if (uint32 skill_id = SkillByQuestSort(-int32(qinfo->ZoneOrSort)))
4838 {
4839 if (qinfo->RequiredSkillId != skill_id)
4840 {
4841 LOG_ERROR("sql.sql", "Quest {} has `ZoneOrSort` = {} but `RequiredSkillId` does not have a corresponding value ({}).",
4842 qinfo->GetQuestId(), qinfo->ZoneOrSort, skill_id);
4843 //override, and force proper value here?
4844 }
4845 }
4846 }
4847
4848 // RequiredClasses, can be 0/CLASSMASK_ALL_PLAYABLE to allow any class
4849 if (qinfo->RequiredClasses)
4850 {
4852 {
4853 LOG_ERROR("sql.sql", "Quest {} does not contain any playable classes in `RequiredClasses` ({}), value set to 0 (all classes).", qinfo->GetQuestId(), qinfo->RequiredClasses);
4854 qinfo->RequiredClasses = 0;
4855 }
4856 }
4857 // AllowableRaces, can be 0/RACEMASK_ALL_PLAYABLE to allow any race
4858 if (qinfo->AllowableRaces)
4859 {
4860 if (!(qinfo->AllowableRaces & RACEMASK_ALL_PLAYABLE))
4861 {
4862 LOG_ERROR("sql.sql", "Quest {} does not contain any playable races in `AllowableRaces` ({}), value set to 0 (all races).", qinfo->GetQuestId(), qinfo->AllowableRaces);
4863 qinfo->AllowableRaces = 0;
4864 }
4865 }
4866 // RequiredSkillId, can be 0
4867 if (qinfo->RequiredSkillId)
4868 {
4869 if (!sSkillLineStore.LookupEntry(qinfo->RequiredSkillId))
4870 {
4871 LOG_ERROR("sql.sql", "Quest {} has `RequiredSkillId` = {} but this skill does not exist",
4872 qinfo->GetQuestId(), qinfo->RequiredSkillId);
4873 }
4874 }
4875
4876 if (qinfo->RequiredSkillPoints)
4877 {
4878 if (qinfo->RequiredSkillPoints > sWorld->GetConfigMaxSkillValue())
4879 {
4880 LOG_ERROR("sql.sql", "Quest {} has `RequiredSkillPoints` = {} but max possible skill is {}, quest can't be done.",
4881 qinfo->GetQuestId(), qinfo->RequiredSkillPoints, sWorld->GetConfigMaxSkillValue());
4882 // no changes, quest can't be done for this requirement
4883 }
4884 }
4885 // else Skill quests can have 0 skill level, this is ok
4886
4887 if (qinfo->RequiredFactionId2 && !sFactionStore.LookupEntry(qinfo->RequiredFactionId2))
4888 {
4889 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionId2` = {} but faction template {} does not exist, quest can't be done.",
4890 qinfo->GetQuestId(), qinfo->RequiredFactionId2, qinfo->RequiredFactionId2);
4891 // no changes, quest can't be done for this requirement
4892 }
4893
4894 if (qinfo->RequiredFactionId1 && !sFactionStore.LookupEntry(qinfo->RequiredFactionId1))
4895 {
4896 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionId1` = {} but faction template {} does not exist, quest can't be done.",
4897 qinfo->GetQuestId(), qinfo->RequiredFactionId1, qinfo->RequiredFactionId1);
4898 // no changes, quest can't be done for this requirement
4899 }
4900
4901 if (qinfo->RequiredMinRepFaction && !sFactionStore.LookupEntry(qinfo->RequiredMinRepFaction))
4902 {
4903 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepFaction` = {} but faction template {} does not exist, quest can't be done.",
4904 qinfo->GetQuestId(), qinfo->RequiredMinRepFaction, qinfo->RequiredMinRepFaction);
4905 // no changes, quest can't be done for this requirement
4906 }
4907
4908 if (qinfo->RequiredMaxRepFaction && !sFactionStore.LookupEntry(qinfo->RequiredMaxRepFaction))
4909 {
4910 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepFaction` = {} but faction template {} does not exist, quest can't be done.",
4911 qinfo->GetQuestId(), qinfo->RequiredMaxRepFaction, qinfo->RequiredMaxRepFaction);
4912 // no changes, quest can't be done for this requirement
4913 }
4914
4916 {
4917 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepValue` = {} but max reputation is {}, quest can't be done.",
4919 // no changes, quest can't be done for this requirement
4920 }
4921
4922 if (qinfo->RequiredMinRepValue && qinfo->RequiredMaxRepValue && qinfo->RequiredMaxRepValue <= qinfo->RequiredMinRepValue)
4923 {
4924 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepValue` = {} and `RequiredMinRepValue` = {}, quest can't be done.",
4925 qinfo->GetQuestId(), qinfo->RequiredMaxRepValue, qinfo->RequiredMinRepValue);
4926 // no changes, quest can't be done for this requirement
4927 }
4928
4929 if (!qinfo->RequiredFactionId1 && qinfo->RequiredFactionValue1 != 0)
4930 {
4931 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionValue1` = {} but `RequiredFactionId1` is 0, value has no effect",
4932 qinfo->GetQuestId(), qinfo->RequiredFactionValue1);
4933 // warning
4934 }
4935
4936 if (!qinfo->RequiredFactionId2 && qinfo->RequiredFactionValue2 != 0)
4937 {
4938 LOG_ERROR("sql.sql", "Quest {} has `RequiredFactionValue2` = {} but `RequiredFactionId2` is 0, value has no effect",
4939 qinfo->GetQuestId(), qinfo->RequiredFactionValue2);
4940 // warning
4941 }
4942
4943 if (!qinfo->RequiredMinRepFaction && qinfo->RequiredMinRepValue != 0)
4944 {
4945 LOG_ERROR("sql.sql", "Quest {} has `RequiredMinRepValue` = {} but `RequiredMinRepFaction` is 0, value has no effect",
4946 qinfo->GetQuestId(), qinfo->RequiredMinRepValue);
4947 // warning
4948 }
4949
4950 if (!qinfo->RequiredMaxRepFaction && qinfo->RequiredMaxRepValue != 0)
4951 {
4952 LOG_ERROR("sql.sql", "Quest {} has `RequiredMaxRepValue` = {} but `RequiredMaxRepFaction` is 0, value has no effect",
4953 qinfo->GetQuestId(), qinfo->RequiredMaxRepValue);
4954 // warning
4955 }
4956
4957 if (qinfo->RewardTitleId && !sCharTitlesStore.LookupEntry(qinfo->RewardTitleId))
4958 {
4959 LOG_ERROR("sql.sql", "Quest {} has `RewardTitleId` = {} but CharTitle Id {} does not exist, quest can't be rewarded with title.",
4960 qinfo->GetQuestId(), qinfo->GetCharTitleId(), qinfo->GetCharTitleId());
4961 qinfo->RewardTitleId = 0;
4962 // quest can't reward this title
4963 }
4964
4965 if (qinfo->StartItem)
4966 {
4967 if (!sObjectMgr->GetItemTemplate(qinfo->StartItem))
4968 {
4969 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = {} but item with entry {} does not exist, quest can't be done.",
4970 qinfo->GetQuestId(), qinfo->StartItem, qinfo->StartItem);
4971 qinfo->StartItem = 0; // quest can't be done for this requirement
4972 }
4973 else if (qinfo->StartItemCount == 0)
4974 {
4975 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = {} but `StartItemCount` = 0, set to 1 but need fix in DB.",
4976 qinfo->GetQuestId(), qinfo->StartItem);
4977 qinfo->StartItemCount = 1; // update to 1 for allow quest work for backward compatibility with DB
4978 }
4979 }
4980 else if (qinfo->StartItemCount > 0)
4981 {
4982 LOG_ERROR("sql.sql", "Quest {} has `StartItem` = 0 but `StartItemCount` = {}, useless value.",
4983 qinfo->GetQuestId(), qinfo->StartItemCount);
4984 qinfo->StartItemCount = 0; // no quest work changes in fact
4985 }
4986
4987 if (qinfo->SourceSpellid)
4988 {
4989 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->SourceSpellid);
4990 if (!spellInfo)
4991 {
4992 LOG_ERROR("sql.sql", "Quest {} has `SourceSpellid` = {} but spell {} doesn't exist, quest can't be done.",
4993 qinfo->GetQuestId(), qinfo->SourceSpellid, qinfo->SourceSpellid);
4994 qinfo->SourceSpellid = 0; // quest can't be done for this requirement
4995 }
4996 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
4997 {
4998 LOG_ERROR("sql.sql", "Quest {} has `SourceSpellid` = {} but spell {} is broken, quest can't be done.",
4999 qinfo->GetQuestId(), qinfo->SourceSpellid, qinfo->SourceSpellid);
5000 qinfo->SourceSpellid = 0; // quest can't be done for this requirement
5001 }
5002 }
5003
5004 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
5005 {
5006 uint32 id = qinfo->RequiredItemId[j];
5007 if (id)
5008 {
5009 if (qinfo->RequiredItemCount[j] == 0)
5010 {
5011 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = {} but `RequiredItemCount{}` = 0, quest can't be done.",
5012 qinfo->GetQuestId(), j + 1, id, j + 1);
5013 // no changes, quest can't be done for this requirement
5014 }
5015
5017
5018 if (!sObjectMgr->GetItemTemplate(id))
5019 {
5020 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = {} but item with entry {} does not exist, quest can't be done.",
5021 qinfo->GetQuestId(), j + 1, id, id);
5022 qinfo->RequiredItemCount[j] = 0; // prevent incorrect work of quest
5023 }
5024 }
5025 else if (qinfo->RequiredItemCount[j] > 0)
5026 {
5027 LOG_ERROR("sql.sql", "Quest {} has `RequiredItemId{}` = 0 but `RequiredItemCount{}` = {}, quest can't be done.",
5028 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RequiredItemCount[j]);
5029 qinfo->RequiredItemCount[j] = 0; // prevent incorrect work of quest
5030 }
5031 }
5032
5033 for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
5034 {
5035 uint32 id = qinfo->ItemDrop[j];
5036 if (id)
5037 {
5038 if (!sObjectMgr->GetItemTemplate(id))
5039 {
5040 LOG_ERROR("sql.sql", "Quest {} has `ItemDrop{}` = {} but item with entry {} does not exist, quest can't be done.",
5041 qinfo->GetQuestId(), j + 1, id, id);
5042 // no changes, quest can't be done for this requirement
5043 }
5044 }
5045 else
5046 {
5047 if (qinfo->ItemDropQuantity[j] > 0)
5048 {
5049 LOG_ERROR("sql.sql", "Quest {} has `ItemDrop{}` = 0 but `ItemDropQuantity{}` = {}.",
5050 qinfo->GetQuestId(), j + 1, j + 1, qinfo->ItemDropQuantity[j]);
5051 // no changes, quest ignore this data
5052 }
5053 }
5054 }
5055
5056 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
5057 {
5058 int32 id = qinfo->RequiredNpcOrGo[j];
5059 if (id < 0 && !sObjectMgr->GetGameObjectTemplate(-id))
5060 {
5061 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but gameobject {} does not exist, quest can't be done.",
5062 qinfo->GetQuestId(), j + 1, id, uint32(-id));
5063 qinfo->RequiredNpcOrGo[j] = 0; // quest can't be done for this requirement
5064 }
5065
5066 if (id > 0 && !sObjectMgr->GetCreatureTemplate(id))
5067 {
5068 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but creature with entry {} does not exist, quest can't be done.",
5069 qinfo->GetQuestId(), j + 1, id, uint32(id));
5070 qinfo->RequiredNpcOrGo[j] = 0; // quest can't be done for this requirement
5071 }
5072
5073 if (id)
5074 {
5075 // In fact SpeakTo and Kill are quite same: either you can speak to mob:SpeakTo or you can't:Kill/Cast
5076
5078
5079 if (!qinfo->RequiredNpcOrGoCount[j])
5080 {
5081 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = {} but `RequiredNpcOrGoCount{}` = 0, quest can't be done.",
5082 qinfo->GetQuestId(), j + 1, id, j + 1);
5083 // no changes, quest can be incorrectly done, but we already report this
5084 }
5085 }
5086 else if (qinfo->RequiredNpcOrGoCount[j] > 0)
5087 {
5088 LOG_ERROR("sql.sql", "Quest {} has `RequiredNpcOrGo{}` = 0 but `RequiredNpcOrGoCount{}` = {}.",
5089 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RequiredNpcOrGoCount[j]);
5090 // no changes, quest ignore this data
5091 }
5092 }
5093
5094 for (uint8 j = 0; j < QUEST_REWARD_CHOICES_COUNT; ++j)
5095 {
5096 uint32 id = qinfo->RewardChoiceItemId[j];
5097 if (id)
5098 {
5099 if (!sObjectMgr->GetItemTemplate(id))
5100 {
5101 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but item with entry {} does not exist, quest will not reward this item.",
5102 qinfo->GetQuestId(), j + 1, id, id);
5103 qinfo->RewardChoiceItemId[j] = 0; // no changes, quest will not reward this
5104 }
5105
5106 if (!qinfo->RewardChoiceItemCount[j])
5107 {
5108 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = {} but `RewardChoiceItemCount{}` = 0, quest can't be done.",
5109 qinfo->GetQuestId(), j + 1, id, j + 1);
5110 // no changes, quest can't be done
5111 }
5112 }
5113 else if (qinfo->RewardChoiceItemCount[j] > 0)
5114 {
5115 LOG_ERROR("sql.sql", "Quest {} has `RewardChoiceItemId{}` = 0 but `RewardChoiceItemCount{}` = {}.",
5116 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardChoiceItemCount[j]);
5117 // no changes, quest ignore this data
5118 }
5119 }
5120
5121 for (uint8 j = 0; j < QUEST_REWARDS_COUNT; ++j)
5122 {
5123 if (!qinfo->RewardItemId[0] && qinfo->RewardItemId[j])
5124 {
5125 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId1` but has `RewardItem{}`. Reward item will not be loaded.",
5126 qinfo->GetQuestId(), j + 1);
5127 }
5128 if (!qinfo->RewardItemId[1] && j > 1 && qinfo->RewardItemId[j])
5129 {
5130 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId2` but has `RewardItem{}`. Reward item will not be loaded.",
5131 qinfo->GetQuestId(), j + 1);
5132 }
5133 if (!qinfo->RewardItemId[2] && j > 2 && qinfo->RewardItemId[j])
5134 {
5135 LOG_ERROR("sql.sql", "Quest {} has no `RewardItemId3` but has `RewardItem{}`. Reward item will not be loaded.",
5136 qinfo->GetQuestId(), j + 1);
5137 }
5138 }
5139
5140 for (uint8 j = 0; j < QUEST_REWARDS_COUNT; ++j)
5141 {
5142 uint32 id = qinfo->RewardItemId[j];
5143 if (id)
5144 {
5145 if (!sObjectMgr->GetItemTemplate(id))
5146 {
5147 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = {} but item with entry {} does not exist, quest will not reward this item.",
5148 qinfo->GetQuestId(), j + 1, id, id);
5149 qinfo->RewardItemId[j] = 0; // no changes, quest will not reward this item
5150 }
5151
5152 if (!qinfo->RewardItemIdCount[j])
5153 {
5154 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = {} but `RewardItemIdCount{}` = 0, quest will not reward this item.",
5155 qinfo->GetQuestId(), j + 1, id, j + 1);
5156 // no changes
5157 }
5158 }
5159 else if (qinfo->RewardItemIdCount[j] > 0)
5160 {
5161 LOG_ERROR("sql.sql", "Quest {} has `RewardItemId{}` = 0 but `RewardItemIdCount{}` = {}.",
5162 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardItemIdCount[j]);
5163 // no changes, quest ignore this data
5164 }
5165 }
5166
5167 for (uint8 j = 0; j < QUEST_REPUTATIONS_COUNT; ++j)
5168 {
5169 if (qinfo->RewardFactionId[j])
5170 {
5171 if (std::abs(qinfo->RewardFactionValueId[j]) > 9)
5172 {
5173 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]);
5174 }
5175 if (!sFactionStore.LookupEntry(qinfo->RewardFactionId[j]))
5176 {
5177 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]);
5178 qinfo->RewardFactionId[j] = 0; // quest will not reward this
5179 }
5180 }
5181
5182 else if (qinfo->RewardFactionValueIdOverride[j] != 0)
5183 {
5184 LOG_ERROR("sql.sql", "Quest {} has `RewardFactionId{}` = 0 but `RewardFactionValueIdOverride{}` = {}.",
5185 qinfo->GetQuestId(), j + 1, j + 1, qinfo->RewardFactionValueIdOverride[j]);
5186 // no changes, quest ignore this data
5187 }
5188 }
5189
5190 if (qinfo->RewardDisplaySpell)
5191 {
5192 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardDisplaySpell);
5193
5194 if (!spellInfo)
5195 {
5196 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} does not exist, spell removed as display reward.",
5197 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5198 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5199 }
5200
5201 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5202 {
5203 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is broken, quest will not have a spell reward.",
5204 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5205 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5206 }
5207
5208 else if (GetTalentSpellCost(qinfo->RewardDisplaySpell))
5209 {
5210 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is talent, quest will not have a spell reward.",
5211 qinfo->GetQuestId(), qinfo->RewardDisplaySpell, qinfo->RewardDisplaySpell);
5212 qinfo->RewardDisplaySpell = 0; // no spell reward will display for this quest
5213 }
5214 }
5215
5216 if (qinfo->RewardSpell > 0)
5217 {
5218 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(qinfo->RewardSpell);
5219
5220 if (!spellInfo)
5221 {
5222 LOG_ERROR("sql.sql", "Quest {} has `RewardSpell` = {} but spell {} does not exist, quest will not have a spell reward.",
5223 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5224 qinfo->RewardSpell = 0; // no spell will be casted on player
5225 }
5226
5227 else if (!SpellMgr::ComputeIsSpellValid(spellInfo))
5228 {
5229 LOG_ERROR("sql.sql", "Quest {} has `RewardSpell` = {} but spell {} is broken, quest will not have a spell reward.",
5230 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5231 qinfo->RewardSpell = 0; // no spell will be casted on player
5232 }
5233
5234 else if (GetTalentSpellCost(qinfo->RewardSpell))
5235 {
5236 LOG_ERROR("sql.sql", "Quest {} has `RewardDisplaySpell` = {} but spell {} is talent, quest will not have a spell reward.",
5237 qinfo->GetQuestId(), qinfo->RewardSpell, qinfo->RewardSpell);
5238 qinfo->RewardSpell = 0; // no spell will be casted on player
5239 }
5240 }
5241
5242 if (qinfo->RewardMailTemplateId)
5243 {
5244 if (!sMailTemplateStore.LookupEntry(qinfo->RewardMailTemplateId))
5245 {
5246 LOG_ERROR("sql.sql", "Quest {} has `RewardMailTemplateId` = {} but mail template {} does not exist, quest will not have a mail reward.",
5247 qinfo->GetQuestId(), qinfo->RewardMailTemplateId, qinfo->RewardMailTemplateId);
5248 qinfo->RewardMailTemplateId = 0; // no mail will send to player
5249 qinfo->RewardMailDelay = 0; // no mail will send to player
5250 qinfo->RewardMailSenderEntry = 0;
5251 }
5252 else if (usedMailTemplates.find(qinfo->RewardMailTemplateId) != usedMailTemplates.end())
5253 {
5254 std::map<uint32, uint32>::const_iterator used_mt_itr = usedMailTemplates.find(qinfo->RewardMailTemplateId);
5255 LOG_ERROR("sql.sql", "Quest {} has `RewardMailTemplateId` = {} but mail template {} already used for quest {}, quest will not have a mail reward.",
5256 qinfo->GetQuestId(), qinfo->RewardMailTemplateId, qinfo->RewardMailTemplateId, used_mt_itr->second);
5257 qinfo->RewardMailTemplateId = 0; // no mail will send to player
5258 qinfo->RewardMailDelay = 0; // no mail will send to player
5259 qinfo->RewardMailSenderEntry = 0;
5260 }
5261 else
5262 usedMailTemplates[qinfo->RewardMailTemplateId] = qinfo->GetQuestId();
5263 }
5264
5265 if (qinfo->RewardNextQuest)
5266 {
5267 QuestMap::iterator qNextItr = _questTemplates.find(qinfo->RewardNextQuest);
5268 if (qNextItr == _questTemplates.end())
5269 {
5270 LOG_ERROR("sql.sql", "Quest {} has `RewardNextQuest` = {} but quest {} does not exist, quest chain will not work.",
5271 qinfo->GetQuestId(), qinfo->RewardNextQuest, qinfo->RewardNextQuest);
5272 qinfo->RewardNextQuest = 0;
5273 }
5274 else
5275 qNextItr->second->prevChainQuests.push_back(qinfo->GetQuestId());
5276 }
5277
5278 // fill additional data stores
5279 if (qinfo->PrevQuestId)
5280 {
5281 if (_questTemplates.find(std::abs(qinfo->GetPrevQuestId())) == _questTemplates.end())
5282 {
5283 LOG_ERROR("sql.sql", "Quest {} has PrevQuestId {}, but no such quest", qinfo->GetQuestId(), qinfo->GetPrevQuestId());
5284 }
5285 else
5286 {
5287 qinfo->prevQuests.push_back(qinfo->PrevQuestId);
5288 }
5289 }
5290
5291 if (qinfo->NextQuestId)
5292 {
5293 QuestMap::iterator qNextItr = _questTemplates.find(qinfo->GetNextQuestId());
5294 if (qNextItr == _questTemplates.end())
5295 {
5296 LOG_ERROR("sql.sql", "Quest {} has NextQuestId {}, but no such quest", qinfo->GetQuestId(), qinfo->GetNextQuestId());
5297 }
5298 else
5299 qNextItr->second->prevQuests.push_back(static_cast<int32>(qinfo->GetQuestId()));
5300 }
5301
5302 if (qinfo->ExclusiveGroup)
5303 mExclusiveQuestGroups.insert(std::pair<int32, uint32>(qinfo->ExclusiveGroup, qinfo->GetQuestId()));
5304 if (qinfo->TimeAllowed)
5306 if (qinfo->RequiredPlayerKills)
5308 }
5309
5310 // check QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT for spell with SPELL_EFFECT_QUEST_COMPLETE
5311 for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
5312 {
5313 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i);
5314 if (!spellInfo)
5315 continue;
5316
5317 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
5318 {
5319 if (spellInfo->Effects[j].Effect != SPELL_EFFECT_QUEST_COMPLETE)
5320 continue;
5321
5322 uint32 quest_id = spellInfo->Effects[j].MiscValue;
5323
5324 Quest const* quest = GetQuestTemplate(quest_id);
5325
5326 // some quest referenced in spells not exist (outdated spells)
5327 if (!quest)
5328 continue;
5329
5331 {
5332 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);
5333
5334 // this will prevent quest completing without objective
5335 // xinef: remove this, leave error but do not break the quest
5336 // const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
5337 }
5338 }
5339 }
5340
5341 LOG_INFO("server.loading", ">> Loaded {} Quests Definitions in {} ms", (unsigned long)_questTemplates.size(), GetMSTimeDiffToNow(oldMSTime));
5342 LOG_INFO("server.loading", " ");
5343}
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:3040
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(), GetGameObjectTemplate(), 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, sObjectMgr, Quest::SourceSpellid, Quest::SpecialFlags, SPELL_EFFECT_QUEST_COMPLETE, sQuestSortStore, sSkillLineStore, sSpellMgr, Quest::StartItem, Quest::StartItemCount, sWorld, Quest::TimeAllowed, WorldDatabase, and Quest::ZoneOrSort.

◆ LoadQuestStartersAndEnders()

void ObjectMgr::LoadQuestStartersAndEnders ( )
inline
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:8312
void LoadGameobjectQuestEnders()
Definition ObjectMgr.cpp:8284
void LoadGameobjectQuestStarters()
Definition ObjectMgr.cpp:8270
void LoadCreatureQuestStarters()
Definition ObjectMgr.cpp:8298

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

◆ LoadReferenceVendor()

int ObjectMgr::LoadReferenceVendor ( int32  vendor,
int32  item_id,
std::set< uint32 > *  skip_vendors 
)
9393{
9394 // find all items from the reference vendor
9396 stmt->SetData(0, uint32(item));
9397 PreparedQueryResult result = WorldDatabase.Query(stmt);
9398
9399 if (!result)
9400 return 0;
9401
9402 uint32 count = 0;
9403 do
9404 {
9405 Field* fields = result->Fetch();
9406
9407 int32 item_id = fields[0].Get<int32>();
9408
9409 // if item is a negative, its a reference
9410 if (item_id < 0)
9411 count += LoadReferenceVendor(vendor, -item_id, skip_vendors);
9412 else
9413 {
9414 int32 maxcount = fields[1].Get<uint8>();
9415 uint32 incrtime = fields[2].Get<uint32>();
9416 uint32 ExtendedCost = fields[3].Get<uint32>();
9417
9418 if (!IsVendorItemValid(vendor, item_id, maxcount, incrtime, ExtendedCost, nullptr, skip_vendors))
9419 continue;
9420
9421 VendorItemData& vList = _cacheVendorItemStore[vendor];
9422
9423 vList.AddItem(item_id, maxcount, incrtime, ExtendedCost);
9424 ++count;
9425 }
9426 } while (result->NextRow());
9427
9428 return count;
9429}
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:9632
int LoadReferenceVendor(int32 vendor, int32 item_id, std::set< uint32 > *skip_vendors)
Definition ObjectMgr.cpp:9392

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 ( )
7817{
7818 uint32 oldMSTime = getMSTime();
7819
7820 // For reload case
7821 _repOnKillStore.clear();
7822
7823 uint32 count = 0;
7824
7825 // 0 1 2
7826 QueryResult result = WorldDatabase.Query("SELECT creature_id, RewOnKillRepFaction1, RewOnKillRepFaction2, "
7827 // 3 4 5 6 7 8 9
7828 "IsTeamAward1, MaxStanding1, RewOnKillRepValue1, IsTeamAward2, MaxStanding2, RewOnKillRepValue2, TeamDependent "
7829 "FROM creature_onkill_reputation");
7830
7831 if (!result)
7832 {
7833 LOG_WARN("server.loading", ">> Loaded 0 creature award reputation definitions. DB table `creature_onkill_reputation` is empty.");
7834 LOG_INFO("server.loading", " ");
7835 return;
7836 }
7837
7838 do
7839 {
7840 Field* fields = result->Fetch();
7841
7842 uint32 creature_id = fields[0].Get<uint32>();
7843
7844 ReputationOnKillEntry repOnKill;
7845 repOnKill.RepFaction1 = fields[1].Get<int16>();
7846 repOnKill.RepFaction2 = fields[2].Get<int16>();
7847 repOnKill.IsTeamAward1 = fields[3].Get<bool>();
7848 repOnKill.ReputationMaxCap1 = fields[4].Get<uint8>();
7849 repOnKill.RepValue1 = fields[5].Get<float>();
7850 repOnKill.IsTeamAward2 = fields[6].Get<bool>();
7851 repOnKill.ReputationMaxCap2 = fields[7].Get<uint8>();
7852 repOnKill.RepValue2 = fields[8].Get<float>();
7853 repOnKill.TeamDependent = fields[9].Get<uint8>();
7854
7855 if (!GetCreatureTemplate(creature_id))
7856 {
7857 LOG_ERROR("sql.sql", "Table `creature_onkill_reputation` have data for not existed creature entry ({}), skipped", creature_id);
7858 continue;
7859 }
7860
7861 if (repOnKill.RepFaction1)
7862 {
7863 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(repOnKill.RepFaction1);
7864 if (!factionEntry1)
7865 {
7866 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `creature_onkill_reputation`", repOnKill.RepFaction1);
7867 continue;
7868 }
7869 }
7870
7871 if (repOnKill.RepFaction2)
7872 {
7873 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(repOnKill.RepFaction2);
7874 if (!factionEntry2)
7875 {
7876 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `creature_onkill_reputation`", repOnKill.RepFaction2);
7877 continue;
7878 }
7879 }
7880
7881 _repOnKillStore[creature_id] = repOnKill;
7882
7883 ++count;
7884 } while (result->NextRow());
7885
7886 LOG_INFO("server.loading", ">> Loaded {} Creature Award Reputation Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7887 LOG_INFO("server.loading", " ");
7888}
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 ( )
7729{
7730 uint32 oldMSTime = getMSTime();
7731
7732 _repRewardRateStore.clear(); // for reload case
7733
7734 uint32 count = 0; // 0 1 2 3 4 5 6 7
7735 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");
7736 if (!result)
7737 {
7738 LOG_INFO("server.loading", ">> Loaded `reputation_reward_rate`, table is empty!");
7739 return;
7740 }
7741
7742 do
7743 {
7744 Field* fields = result->Fetch();
7745
7746 uint32 factionId = fields[0].Get<uint32>();
7747
7748 RepRewardRate repRate;
7749
7750 repRate.questRate = fields[1].Get<float>();
7751 repRate.questDailyRate = fields[2].Get<float>();
7752 repRate.questWeeklyRate = fields[3].Get<float>();
7753 repRate.questMonthlyRate = fields[4].Get<float>();
7754 repRate.questRepeatableRate = fields[5].Get<float>();
7755 repRate.creatureRate = fields[6].Get<float>();
7756 repRate.spellRate = fields[7].Get<float>();
7757
7758 FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
7759 if (!factionEntry)
7760 {
7761 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_reward_rate`", factionId);
7762 continue;
7763 }
7764
7765 if (repRate.questRate < 0.0f)
7766 {
7767 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_rate with invalid rate {}, skipping data for faction {}", repRate.questRate, factionId);
7768 continue;
7769 }
7770
7771 if (repRate.questDailyRate < 0.0f)
7772 {
7773 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_daily_rate with invalid rate {}, skipping data for faction {}", repRate.questDailyRate, factionId);
7774 continue;
7775 }
7776
7777 if (repRate.questWeeklyRate < 0.0f)
7778 {
7779 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_weekly_rate with invalid rate {}, skipping data for faction {}", repRate.questWeeklyRate, factionId);
7780 continue;
7781 }
7782
7783 if (repRate.questMonthlyRate < 0.0f)
7784 {
7785 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_monthly_rate with invalid rate {}, skipping data for faction {}", repRate.questMonthlyRate, factionId);
7786 continue;
7787 }
7788
7789 if (repRate.questRepeatableRate < 0.0f)
7790 {
7791 LOG_ERROR("sql.sql", "Table reputation_reward_rate has quest_repeatable_rate with invalid rate {}, skipping data for faction {}", repRate.questRepeatableRate, factionId);
7792 continue;
7793 }
7794
7795 if (repRate.creatureRate < 0.0f)
7796 {
7797 LOG_ERROR("sql.sql", "Table reputation_reward_rate has creature_rate with invalid rate {}, skipping data for faction {}", repRate.creatureRate, factionId);
7798 continue;
7799 }
7800
7801 if (repRate.spellRate < 0.0f)
7802 {
7803 LOG_ERROR("sql.sql", "Table reputation_reward_rate has spell_rate with invalid rate {}, skipping data for faction {}", repRate.spellRate, factionId);
7804 continue;
7805 }
7806
7807 _repRewardRateStore[factionId] = repRate;
7808
7809 ++count;
7810 } while (result->NextRow());
7811
7812 LOG_INFO("server.loading", ">> Loaded {} Reputation Reward Rate in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7813 LOG_INFO("server.loading", " ");
7814}
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 ( )
7891{
7892 uint32 oldMSTime = getMSTime();
7893
7894 _repSpilloverTemplateStore.clear(); // for reload case
7895
7896 uint32 count = 0; // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
7897 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");
7898
7899 if (!result)
7900 {
7901 LOG_INFO("server.loading", ">> Loaded `reputation_spillover_template`, table is empty.");
7902 LOG_INFO("server.loading", " ");
7903 return;
7904 }
7905
7906 do
7907 {
7908 Field* fields = result->Fetch();
7909
7910 uint32 factionId = fields[0].Get<uint16>();
7911
7912 RepSpilloverTemplate repTemplate;
7913
7914 repTemplate.faction[0] = fields[1].Get<uint16>();
7915 repTemplate.faction_rate[0] = fields[2].Get<float>();
7916 repTemplate.faction_rank[0] = fields[3].Get<uint8>();
7917 repTemplate.faction[1] = fields[4].Get<uint16>();
7918 repTemplate.faction_rate[1] = fields[5].Get<float>();
7919 repTemplate.faction_rank[1] = fields[6].Get<uint8>();
7920 repTemplate.faction[2] = fields[7].Get<uint16>();
7921 repTemplate.faction_rate[2] = fields[8].Get<float>();
7922 repTemplate.faction_rank[2] = fields[9].Get<uint8>();
7923 repTemplate.faction[3] = fields[10].Get<uint16>();
7924 repTemplate.faction_rate[3] = fields[11].Get<float>();
7925 repTemplate.faction_rank[3] = fields[12].Get<uint8>();
7926 repTemplate.faction[4] = fields[13].Get<uint16>();
7927 repTemplate.faction_rate[4] = fields[14].Get<float>();
7928 repTemplate.faction_rank[4] = fields[15].Get<uint8>();
7929 repTemplate.faction[5] = fields[16].Get<uint16>();
7930 repTemplate.faction_rate[5] = fields[17].Get<float>();
7931 repTemplate.faction_rank[5] = fields[18].Get<uint8>();
7932
7933 FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
7934
7935 if (!factionEntry)
7936 {
7937 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", factionId);
7938 continue;
7939 }
7940
7941 if (factionEntry->team == 0)
7942 {
7943 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} in `reputation_spillover_template` does not belong to any team, skipping", factionId);
7944 continue;
7945 }
7946
7947 for (uint32 i = 0; i < MAX_SPILLOVER_FACTIONS; ++i)
7948 {
7949 if (repTemplate.faction[i])
7950 {
7951 FactionEntry const* factionSpillover = sFactionStore.LookupEntry(repTemplate.faction[i]);
7952
7953 if (!factionSpillover)
7954 {
7955 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);
7956 continue;
7957 }
7958
7959 if (factionSpillover->reputationListID < 0)
7960 {
7961 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);
7962 continue;
7963 }
7964
7965 if (repTemplate.faction_rank[i] >= MAX_REPUTATION_RANK)
7966 {
7967 LOG_ERROR("sql.sql", "Rank {} used in `reputation_spillover_template` for spillover faction {} is not valid, skipping", repTemplate.faction_rank[i], repTemplate.faction[i]);
7968 continue;
7969 }
7970 }
7971 }
7972
7973 FactionEntry const* factionEntry0 = sFactionStore.LookupEntry(repTemplate.faction[0]);
7974 if (repTemplate.faction[0] && !factionEntry0)
7975 {
7976 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[0]);
7977 continue;
7978 }
7979 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(repTemplate.faction[1]);
7980 if (repTemplate.faction[1] && !factionEntry1)
7981 {
7982 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[1]);
7983 continue;
7984 }
7985 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(repTemplate.faction[2]);
7986 if (repTemplate.faction[2] && !factionEntry2)
7987 {
7988 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[2]);
7989 continue;
7990 }
7991 FactionEntry const* factionEntry3 = sFactionStore.LookupEntry(repTemplate.faction[3]);
7992 if (repTemplate.faction[3] && !factionEntry3)
7993 {
7994 LOG_ERROR("sql.sql", "Faction (faction.dbc) {} does not exist but is used in `reputation_spillover_template`", repTemplate.faction[3]);
7995 continue;
7996 }
7997
7998 _repSpilloverTemplateStore[factionId] = repTemplate;
7999
8000 ++count;
8001 } while (result->NextRow());
8002
8003 LOG_INFO("server.loading", ">> Loaded {} Reputation Spillover Template in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8004 LOG_INFO("server.loading", " ");
8005}
#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 ( )
8327{
8328 uint32 oldMSTime = getMSTime();
8329
8330 _reservedNamesStore.clear(); // need for reload case
8331
8332 QueryResult result = CharacterDatabase.Query("SELECT name FROM reserved_name");
8333
8334 if (!result)
8335 {
8336 LOG_WARN("server.loading", ">> Loaded 0 reserved names. DB table `reserved_name` is empty!");
8337 return;
8338 }
8339
8340 uint32 count = 0;
8341
8342 Field* fields;
8343 do
8344 {
8345 fields = result->Fetch();
8346 std::string name = fields[0].Get<std::string>();
8347
8348 std::wstring wstr;
8349 if (!Utf8toWStr (name, wstr))
8350 {
8351 LOG_ERROR("sql.sql", "Table `reserved_name` have invalid name: {}", name);
8352 continue;
8353 }
8354
8355 wstrToLower(wstr);
8356
8357 _reservedNamesStore.insert(wstr);
8358 ++count;
8359 } while (result->NextRow());
8360
8361 LOG_INFO("server.loading", ">> Loaded {} reserved names from DB in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8362}

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

◆ LoadReservedPlayerNamesDBC()

void ObjectMgr::LoadReservedPlayerNamesDBC ( )
8365{
8366 if (!sWorld->getBoolConfig(CONFIG_STRICT_NAMES_RESERVED))
8367 {
8368 LOG_WARN("server.loading", ">> Loaded 0 reserved names from DBC. Config option disabled.");
8369 return;
8370 }
8371
8372 uint32 oldMSTime = getMSTime();
8373
8374 uint32 count = 0;
8375
8376 for (NamesReservedEntry const* reservedStore : sNamesReservedStore)
8377 {
8378 std::wstring wstr;
8379
8380 Utf8toWStr(reservedStore->Pattern, wstr);
8381
8382 // DBC does not have clean entries, remove the junk.
8383 boost::algorithm::replace_all(wstr, "\\<", "");
8384 boost::algorithm::replace_all(wstr, "\\>", "");
8385
8386 _reservedNamesStore.insert(wstr);
8387 count++;
8388 }
8389
8390 LOG_INFO("server.loading", ">> Loaded {} reserved names from DBC in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8391 LOG_INFO("server.loading", " ");
8392}
DBCStorage< NamesReservedEntry > sNamesReservedStore(NamesReservedfmt)
@ CONFIG_STRICT_NAMES_RESERVED
Definition IWorld.h:178
Definition DBCStructure.h:1399

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

◆ LoadScriptNames()

void ObjectMgr::LoadScriptNames ( )
9713{
9714 uint32 oldMSTime = getMSTime();
9715
9716 // We insert an empty placeholder here so we can use the
9717 // script id 0 as dummy for "no script found".
9718 _scriptNamesStore.emplace_back("");
9719
9720 QueryResult result = WorldDatabase.Query(
9721 "SELECT DISTINCT(ScriptName) FROM achievement_criteria_data WHERE ScriptName <> '' AND type = 11 "
9722 "UNION "
9723 "SELECT DISTINCT(ScriptName) FROM battleground_template WHERE ScriptName <> '' "
9724 "UNION "
9725 "SELECT DISTINCT(ScriptName) FROM creature WHERE ScriptName <> '' "
9726 "UNION "
9727 "SELECT DISTINCT(ScriptName) FROM creature_template WHERE ScriptName <> '' "
9728 "UNION "
9729 "SELECT DISTINCT(ScriptName) FROM gameobject WHERE ScriptName <> '' "
9730 "UNION "
9731 "SELECT DISTINCT(ScriptName) FROM gameobject_template WHERE ScriptName <> '' "
9732 "UNION "
9733 "SELECT DISTINCT(ScriptName) FROM item_template WHERE ScriptName <> '' "
9734 "UNION "
9735 "SELECT DISTINCT(ScriptName) FROM areatrigger_scripts WHERE ScriptName <> '' "
9736 "UNION "
9737 "SELECT DISTINCT(ScriptName) FROM spell_script_names WHERE ScriptName <> '' "
9738 "UNION "
9739 "SELECT DISTINCT(ScriptName) FROM transports WHERE ScriptName <> '' "
9740 "UNION "
9741 "SELECT DISTINCT(ScriptName) FROM game_weather WHERE ScriptName <> '' "
9742 "UNION "
9743 "SELECT DISTINCT(ScriptName) FROM conditions WHERE ScriptName <> '' "
9744 "UNION "
9745 "SELECT DISTINCT(ScriptName) FROM outdoorpvp_template WHERE ScriptName <> '' "
9746 "UNION "
9747 "SELECT DISTINCT(script) FROM instance_template WHERE script <> ''");
9748
9749 if (!result)
9750 {
9751 LOG_INFO("server.loading", " ");
9752 LOG_ERROR("sql.sql", ">> Loaded empty set of Script Names!");
9753 return;
9754 }
9755
9756 _scriptNamesStore.reserve(result->GetRowCount() + 1);
9757
9758 do
9759 {
9760 _scriptNamesStore.push_back((*result)[0].Get<std::string>());
9761 } while (result->NextRow());
9762
9763 std::sort(_scriptNamesStore.begin(), _scriptNamesStore.end());
9764 LOG_INFO("server.loading", ">> Loaded {} ScriptNames in {} ms", _scriptNamesStore.size(), GetMSTimeDiffToNow(oldMSTime));
9765 LOG_INFO("server.loading", " ");
9766}

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

◆ LoadScripts()

void ObjectMgr::LoadScripts ( ScriptsType  type)
private
5382{
5383 uint32 oldMSTime = getMSTime();
5384
5385 ScriptMapMap* scripts = GetScriptsMapByType(type);
5386 if (!scripts)
5387 return;
5388
5389 std::string tableName = GetScriptsTableNameByType(type);
5390 if (tableName.empty())
5391 return;
5392
5393 if (sScriptMgr->IsScriptScheduled()) // function cannot be called when scripts are in use.
5394 return;
5395
5396 LOG_INFO("server.loading", "Loading {}...", tableName);
5397
5398 scripts->clear(); // need for reload support
5399
5400 bool isSpellScriptTable = (type == SCRIPTS_SPELL);
5401 // 0 1 2 3 4 5 6 7 8 9
5402 QueryResult result = WorldDatabase.Query("SELECT id, delay, command, datalong, datalong2, dataint, x, y, z, o{} FROM {}", isSpellScriptTable ? ", effIndex" : "", tableName);
5403
5404 if (!result)
5405 {
5406 LOG_WARN("server.loading", ">> Loaded 0 script definitions. DB table `{}` is empty!", tableName);
5407 LOG_INFO("server.loading", " ");
5408 return;
5409 }
5410
5411 uint32 count = 0;
5412
5413 do
5414 {
5415 Field* fields = result->Fetch();
5416 ScriptInfo tmp;
5417 tmp.type = type;
5418 tmp.id = fields[0].Get<uint32>();
5419 if (isSpellScriptTable)
5420 tmp.id |= fields[10].Get<uint8>() << 24;
5421 tmp.delay = fields[1].Get<uint32>();
5422 tmp.command = ScriptCommands(fields[2].Get<uint32>());
5423 tmp.Raw.nData[0] = fields[3].Get<uint32>();
5424 tmp.Raw.nData[1] = fields[4].Get<uint32>();
5425 tmp.Raw.nData[2] = fields[5].Get<int32>();
5426 tmp.Raw.fData[0] = fields[6].Get<float>();
5427 tmp.Raw.fData[1] = fields[7].Get<float>();
5428 tmp.Raw.fData[2] = fields[8].Get<float>();
5429 tmp.Raw.fData[3] = fields[9].Get<float>();
5430
5431 // generic command args check
5432 switch (tmp.command)
5433 {
5435 {
5437 {
5438 LOG_ERROR("sql.sql", "Table `{}` has invalid talk type (datalong = {}) in SCRIPT_COMMAND_TALK for script id {}",
5439 tableName, tmp.Talk.ChatType, tmp.id);
5440 continue;
5441 }
5443 {
5444 LOG_ERROR("sql.sql", "Table `{}` has invalid talk text id (dataint = {}) in SCRIPT_COMMAND_TALK for script id {}",
5445 tableName, tmp.Talk.TextID, tmp.id);
5446 continue;
5447 }
5448 break;
5449 }
5450
5452 {
5453 if (!sEmotesStore.LookupEntry(tmp.Emote.EmoteID))
5454 {
5455 LOG_ERROR("sql.sql", "Table `{}` has invalid emote id (datalong = {}) in SCRIPT_COMMAND_EMOTE for script id {}",
5456 tableName, tmp.Emote.EmoteID, tmp.id);
5457 continue;
5458 }
5459 break;
5460 }
5461
5463 {
5464 if (!sMapStore.LookupEntry(tmp.TeleportTo.MapID))
5465 {
5466 LOG_ERROR("sql.sql", "Table `{}` has invalid map (Id: {}) in SCRIPT_COMMAND_TELEPORT_TO for script id {}",
5467 tableName, tmp.TeleportTo.MapID, tmp.id);
5468 continue;
5469 }
5470
5472 {
5473 LOG_ERROR("sql.sql", "Table `{}` has invalid coordinates (X: {} Y: {} Z: {} O: {}) in SCRIPT_COMMAND_TELEPORT_TO for script id {}",
5474 tableName, tmp.TeleportTo.DestX, tmp.TeleportTo.DestY, tmp.TeleportTo.DestZ, tmp.TeleportTo.Orientation, tmp.id);
5475 continue;
5476 }
5477 break;
5478 }
5479
5481 {
5482 Quest const* quest = GetQuestTemplate(tmp.QuestExplored.QuestID);
5483 if (!quest)
5484 {
5485 LOG_ERROR("sql.sql", "Table `{}` has invalid quest (ID: {}) in SCRIPT_COMMAND_QUEST_EXPLORED in `datalong` for script id {}",
5486 tableName, tmp.QuestExplored.QuestID, tmp.id);
5487 continue;
5488 }
5489
5491 {
5492 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.",
5493 tableName, tmp.QuestExplored.QuestID, tmp.id);
5494
5495 // this will prevent quest completing without objective
5496 const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
5497
5498 // continue; - quest objective requirement set and command can be allowed
5499 }
5500
5502 {
5503 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 {}",
5504 tableName, tmp.QuestExplored.Distance, tmp.id);
5505 continue;
5506 }
5507
5509 {
5510 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",
5512 continue;
5513 }
5514
5516 {
5517 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",
5518 tableName, tmp.QuestExplored.Distance, tmp.id, INTERACTION_DISTANCE);
5519 continue;
5520 }
5521
5522 break;
5523 }
5524
5526 {
5528 {
5529 LOG_ERROR("sql.sql", "Table `{}` has invalid creature (Entry: {}) in SCRIPT_COMMAND_KILL_CREDIT for script id {}",
5530 tableName, tmp.KillCredit.CreatureEntry, tmp.id);
5531 continue;
5532 }
5533 break;
5534 }
5535
5537 {
5539 if (!data)
5540 {
5541 LOG_ERROR("sql.sql", "Table `{}` has invalid gameobject (GUID: {}) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5542 tableName, tmp.RespawnGameobject.GOGuid, tmp.id);
5543 continue;
5544 }
5545
5546 GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
5547 if (!info)
5548 {
5549 LOG_ERROR("sql.sql", "Table `{}` has gameobject with invalid entry (GUID: {} Entry: {}) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5550 tableName, tmp.RespawnGameobject.GOGuid, data->id, tmp.id);
5551 continue;
5552 }
5553
5554 if (info->type == GAMEOBJECT_TYPE_FISHINGNODE ||
5556 info->type == GAMEOBJECT_TYPE_DOOR ||
5557 info->type == GAMEOBJECT_TYPE_BUTTON ||
5558 info->type == GAMEOBJECT_TYPE_TRAP)
5559 {
5560 LOG_ERROR("sql.sql", "Table `{}` have gameobject type ({}) unsupported by command SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5561 tableName, info->entry, tmp.id);
5562 continue;
5563 }
5564 break;
5565 }
5566
5568 {
5570 {
5571 LOG_ERROR("sql.sql", "Table `{}` has invalid coordinates (X: {} Y: {} Z: {} O: {}) in SCRIPT_COMMAND_TEMP_SUMMON_CREATURE for script id {}",
5573 continue;
5574 }
5575
5577 if (!GetCreatureTemplate(entry))
5578 {
5579 LOG_ERROR("sql.sql", "Table `{}` has invalid creature (Entry: {}) in SCRIPT_COMMAND_TEMP_SUMMON_CREATURE for script id {}",
5580 tableName, tmp.TempSummonCreature.CreatureEntry, tmp.id);
5581 continue;
5582 }
5583 break;
5584 }
5585
5588 {
5590 if (!data)
5591 {
5592 LOG_ERROR("sql.sql", "Table `{}` has invalid gameobject (GUID: {}) in {} for script id {}",
5593 tableName, tmp.ToggleDoor.GOGuid, GetScriptCommandName(tmp.command), tmp.id);
5594 continue;
5595 }
5596
5597 GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
5598 if (!info)
5599 {
5600 LOG_ERROR("sql.sql", "Table `{}` has gameobject with invalid entry (GUID: {} Entry: {}) in {} for script id {}",
5601 tableName, tmp.ToggleDoor.GOGuid, data->id, GetScriptCommandName(tmp.command), tmp.id);
5602 continue;
5603 }
5604
5605 if (info->type != GAMEOBJECT_TYPE_DOOR)
5606 {
5607 LOG_ERROR("sql.sql", "Table `{}` has gameobject type ({}) non supported by command {} for script id {}",
5608 tableName, info->entry, GetScriptCommandName(tmp.command), tmp.id);
5609 continue;
5610 }
5611
5612 break;
5613 }
5614
5616 {
5617 if (!sSpellMgr->GetSpellInfo(tmp.RemoveAura.SpellID))
5618 {
5619 LOG_ERROR("sql.sql", "Table `{}` using non-existent spell (id: {}) in SCRIPT_COMMAND_REMOVE_AURA for script id {}",
5620 tableName, tmp.RemoveAura.SpellID, tmp.id);
5621 continue;
5622 }
5623 if (tmp.RemoveAura.Flags & ~0x1) // 1 bits (0, 1)
5624 {
5625 LOG_ERROR("sql.sql", "Table `{}` using unknown flags in datalong2 ({}) in SCRIPT_COMMAND_REMOVE_AURA for script id {}",
5626 tableName, tmp.RemoveAura.Flags, tmp.id);
5627 continue;
5628 }
5629 break;
5630 }
5631
5633 {
5634 if (!sSpellMgr->GetSpellInfo(tmp.CastSpell.SpellID))
5635 {
5636 LOG_ERROR("sql.sql", "Table `{}` using non-existent spell (id: {}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5637 tableName, tmp.CastSpell.SpellID, tmp.id);
5638 continue;
5639 }
5640 if (tmp.CastSpell.Flags > 4) // targeting type
5641 {
5642 LOG_ERROR("sql.sql", "Table `{}` using unknown target in datalong2 ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5643 tableName, tmp.CastSpell.Flags, tmp.id);
5644 continue;
5645 }
5646 if (tmp.CastSpell.Flags != 4 && tmp.CastSpell.CreatureEntry & ~0x1) // 1 bit (0, 1)
5647 {
5648 LOG_ERROR("sql.sql", "Table `{}` using unknown flags in dataint ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5649 tableName, tmp.CastSpell.CreatureEntry, tmp.id);
5650 continue;
5651 }
5652 else if (tmp.CastSpell.Flags == 4 && !GetCreatureTemplate(tmp.CastSpell.CreatureEntry))
5653 {
5654 LOG_ERROR("sql.sql", "Table `{}` using invalid creature entry in dataint ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5655 tableName, tmp.CastSpell.CreatureEntry, tmp.id);
5656 continue;
5657 }
5658 break;
5659 }
5660
5662 {
5664 {
5665 LOG_ERROR("sql.sql", "Table `{}` has nonexistent item (entry: {}) in SCRIPT_COMMAND_CREATE_ITEM for script id {}",
5666 tableName, tmp.CreateItem.ItemEntry, tmp.id);
5667 continue;
5668 }
5669 if (!tmp.CreateItem.Amount)
5670 {
5671 LOG_ERROR("sql.sql", "Table `{}` SCRIPT_COMMAND_CREATE_ITEM but amount is {} for script id {}",
5672 tableName, tmp.CreateItem.Amount, tmp.id);
5673 continue;
5674 }
5675 break;
5676 }
5677 default:
5678 break;
5679 }
5680
5681 if (scripts->find(tmp.id) == scripts->end())
5682 {
5683 ScriptMap emptyMap;
5684 (*scripts)[tmp.id] = emptyMap;
5685 }
5686 (*scripts)[tmp.id].insert(std::pair<uint32, ScriptInfo>(tmp.delay, tmp));
5687
5688 ++count;
5689 } while (result->NextRow());
5690
5691 LOG_INFO("server.loading", ">> Loaded {} script definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5692 LOG_INFO("server.loading", " ");
5693}
@ 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:3194
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 ( )
5795{
5796 uint32 oldMSTime = getMSTime();
5797
5798 _spellScriptsStore.clear(); // need for reload case
5799
5800 QueryResult result = WorldDatabase.Query("SELECT spell_id, ScriptName FROM spell_script_names");
5801
5802 if (!result)
5803 {
5804 LOG_WARN("server.loading", ">> Loaded 0 spell script names. DB table `spell_script_names` is empty!");
5805 LOG_INFO("server.loading", " ");
5806 return;
5807 }
5808
5809 uint32 count = 0;
5810
5811 do
5812 {
5813 Field* fields = result->Fetch();
5814
5815 int32 spellId = fields[0].Get<int32>();
5816 std::string scriptName = fields[1].Get<std::string>();
5817
5818 bool allRanks = false;
5819 if (spellId <= 0)
5820 {
5821 allRanks = true;
5822 spellId = -spellId;
5823 }
5824
5825 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
5826 if (!spellInfo)
5827 {
5828 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) does not exist in `Spell.dbc`.", scriptName, fields[0].Get<int32>());
5829 continue;
5830 }
5831
5832 if (allRanks)
5833 {
5834 if (sSpellMgr->GetFirstSpellInChain(spellId) != uint32(spellId))
5835 {
5836 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) is not first rank of spell.", scriptName, fields[0].Get<int32>());
5837 continue;
5838 }
5839 while (spellInfo)
5840 {
5841 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
5842 spellInfo = spellInfo->GetNextRankSpell();
5843 }
5844 }
5845 else
5846 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
5847 ++count;
5848 } while (result->NextRow());
5849
5850 LOG_INFO("server.loading", ">> Loaded {} spell script names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5851 LOG_INFO("server.loading", " ");
5852}
SpellInfo const * GetNextRankSpell() const
Definition SpellInfo.cpp:2514

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

◆ LoadSpellScripts()

void ObjectMgr::LoadSpellScripts ( )
5696{
5698
5699 // check ids
5700 for (ScriptMapMap::const_iterator itr = sSpellScripts.begin(); itr != sSpellScripts.end(); ++itr)
5701 {
5702 uint32 spellId = uint32(itr->first) & 0x00FFFFFF;
5703 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
5704
5705 if (!spellInfo)
5706 {
5707 LOG_ERROR("sql.sql", "Table `spell_scripts` has not existing spell (Id: {}) as script id", spellId);
5708 continue;
5709 }
5710
5711 SpellEffIndex i = SpellEffIndex((uint32(itr->first) >> 24) & 0x000000FF);
5712 if (uint32(i) >= MAX_SPELL_EFFECTS)
5713 {
5714 LOG_ERROR("sql.sql", "Table `spell_scripts` has too high effect index {} for spell (Id: {}) as script id", uint32(i), spellId);
5715 }
5716
5717 //check for correct spellEffect
5718 if (!spellInfo->Effects[i].Effect || (spellInfo->Effects[i].Effect != SPELL_EFFECT_SCRIPT_EFFECT && spellInfo->Effects[i].Effect != SPELL_EFFECT_DUMMY))
5719 LOG_ERROR("sql.sql", "Table `spell_scripts` - spell {} effect {} is not SPELL_EFFECT_SCRIPT_EFFECT or SPELL_EFFECT_DUMMY", spellId, uint32(i));
5720 }
5721}
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 ( )
6635{
6636 uint32 oldMSTime = getMSTime();
6637
6638 _tavernAreaTriggerStore.clear(); // need for reload case
6639
6640 QueryResult result = WorldDatabase.Query("SELECT id, faction FROM areatrigger_tavern");
6641
6642 if (!result)
6643 {
6644 LOG_WARN("server.loading", ">> Loaded 0 tavern triggers. DB table `areatrigger_tavern` is empty.");
6645 LOG_INFO("server.loading", " ");
6646 return;
6647 }
6648
6649 uint32 count = 0;
6650
6651 do
6652 {
6653 ++count;
6654
6655 Field* fields = result->Fetch();
6656
6657 uint32 Trigger_ID = fields[0].Get<uint32>();
6658
6659 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6660 if (!atEntry)
6661 {
6662 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6663 continue;
6664 }
6665
6666 uint32 faction = fields[1].Get<uint32>();
6667
6668 _tavernAreaTriggerStore.emplace(Trigger_ID, faction);
6669 } while (result->NextRow());
6670
6671 LOG_INFO("server.loading", ">> Loaded {} Tavern Triggers in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6672 LOG_INFO("server.loading", " ");
6673}

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 ( )
9352{
9353 uint32 oldMSTime = getMSTime();
9354
9355 // For reload case
9357
9358 QueryResult result = WorldDatabase.Query("SELECT b.ID, a.SpellID, a.MoneyCost, a.ReqSkillLine, a.ReqSkillRank, a.ReqLevel, a.ReqSpell FROM npc_trainer AS a "
9359 "INNER JOIN npc_trainer AS b ON a.ID = -(b.SpellID) "
9360 "UNION SELECT * FROM npc_trainer WHERE SpellID > 0");
9361
9362 if (!result)
9363 {
9364 LOG_WARN("server.loading", ">> Loaded 0 Trainers. DB table `npc_trainer` is empty!");
9365 LOG_INFO("server.loading", " ");
9366 return;
9367 }
9368
9369 uint32 count = 0;
9370
9371 do
9372 {
9373 Field* fields = result->Fetch();
9374
9375 uint32 entry = fields[0].Get<uint32>();
9376 uint32 spell = fields[1].Get<uint32>();
9377 uint32 spellCost = fields[2].Get<uint32>();
9378 uint32 reqSkill = fields[3].Get<uint16>();
9379 uint32 reqSkillValue = fields[4].Get<uint16>();
9380 uint32 reqLevel = fields[5].Get<uint8>();
9381 uint32 reqSpell = fields[6].Get<uint32>();
9382
9383 AddSpellToTrainer(entry, spell, spellCost, reqSkill, reqSkillValue, reqLevel, reqSpell);
9384
9385 ++count;
9386 } while (result->NextRow());
9387
9388 LOG_INFO("server.loading", ">> Loaded {} Trainers in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9389 LOG_INFO("server.loading", " ");
9390}
void AddSpellToTrainer(uint32 entry, uint32 spell, uint32 spellCost, uint32 reqSkill, uint32 reqSkillValue, uint32 reqLevel, uint32 reqSpell)
Definition ObjectMgr.cpp:9266

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

◆ LoadVehicleAccessories()

void ObjectMgr::LoadVehicleAccessories ( )
3614{
3615 uint32 oldMSTime = getMSTime();
3616
3617 _vehicleAccessoryStore.clear(); // needed for reload case
3618
3619 uint32 count = 0;
3620
3621 // 0 1 2 3 4 5
3622 QueryResult result = WorldDatabase.Query("SELECT `guid`, `accessory_entry`, `seat_id`, `minion`, `summontype`, `summontimer` FROM `vehicle_accessory`");
3623
3624 if (!result)
3625 {
3626 LOG_WARN("server.loading", ">> Loaded 0 Vehicle Accessories in {} ms", GetMSTimeDiffToNow(oldMSTime));
3627 LOG_INFO("server.loading", " ");
3628 return;
3629 }
3630
3631 do
3632 {
3633 Field* fields = result->Fetch();
3634
3635 uint32 uiGUID = fields[0].Get<uint32>();
3636 uint32 uiAccessory = fields[1].Get<uint32>();
3637 int8 uiSeat = int8(fields[2].Get<int16>());
3638 bool bMinion = fields[3].Get<bool>();
3639 uint8 uiSummonType = fields[4].Get<uint8>();
3640 uint32 uiSummonTimer = fields[5].Get<uint32>();
3641
3642 if (!sObjectMgr->GetCreatureTemplate(uiAccessory))
3643 {
3644 LOG_ERROR("sql.sql", "Table `vehicle_accessory`: Accessory {} does not exist.", uiAccessory);
3645 continue;
3646 }
3647
3648 _vehicleAccessoryStore[uiGUID].push_back(VehicleAccessory(uiAccessory, uiSeat, bMinion, uiSummonType, uiSummonTimer));
3649
3650 ++count;
3651 } while (result->NextRow());
3652
3653 LOG_INFO("server.loading", ">> Loaded {} Vehicle Accessories in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3654 LOG_INFO("server.loading", " ");
3655}
Definition VehicleDefines.h:115

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

◆ LoadVehicleSeatAddon()

void ObjectMgr::LoadVehicleSeatAddon ( )
3658{
3659 uint32 oldMSTime = getMSTime();
3660
3661 _vehicleSeatAddonStore.clear(); // needed for reload case
3662
3663 uint32 count = 0;
3664
3665 // 0 1 2 3 4 5 6
3666 QueryResult result = WorldDatabase.Query("SELECT `SeatEntry`, `SeatOrientation`, `ExitParamX`, `ExitParamY`, `ExitParamZ`, `ExitParamO`, `ExitParamValue` FROM `vehicle_seat_addon`");
3667
3668 if (!result)
3669 {
3670 LOG_ERROR("server.loading", ">> Loaded 0 vehicle seat addons. DB table `vehicle_seat_addon` is empty.");
3671 return;
3672 }
3673
3674 do
3675 {
3676 Field* fields = result->Fetch();
3677
3678 uint32 seatID = fields[0].Get<uint32>();
3679 float orientation = fields[1].Get<float>();
3680 float exitX = fields[2].Get<float>();
3681 float exitY = fields[3].Get<float>();
3682 float exitZ = fields[4].Get<float>();
3683 float exitO = fields[5].Get<float>();
3684 uint8 exitParam = fields[6].Get<uint8>();
3685
3686 if (!sVehicleSeatStore.LookupEntry(seatID))
3687 {
3688 LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: {} does not exist in VehicleSeat.dbc. Skipping entry.", seatID);
3689 continue;
3690 }
3691
3692 // Sanitizing values
3693 if (orientation > float(M_PI * 2))
3694 {
3695 LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: {} is using invalid angle offset value ({}). Set Value to 0.", seatID, orientation);
3696 orientation = 0.0f;
3697 }
3698
3700 {
3701 LOG_ERROR("sql.sql", "Table `vehicle_seat_addon`: SeatID: {} is using invalid exit parameter value ({}). Setting to 0 (none).", seatID, exitParam);
3702 continue;
3703 }
3704
3705 _vehicleSeatAddonStore[seatID] = VehicleSeatAddon(orientation, exitX, exitY, exitZ, exitO, exitParam);
3706
3707 ++count;
3708 } while (result->NextRow());
3709
3710 LOG_INFO("server.loading", ">> Loaded {} Vehicle Seat Addon entries in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3711}
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 ( )
3558{
3559 uint32 oldMSTime = getMSTime();
3560
3561 _vehicleTemplateAccessoryStore.clear(); // needed for reload case
3562
3563 uint32 count = 0;
3564
3565 // 0 1 2 3 4 5
3566 QueryResult result = WorldDatabase.Query("SELECT `entry`, `accessory_entry`, `seat_id`, `minion`, `summontype`, `summontimer` FROM `vehicle_template_accessory`");
3567
3568 if (!result)
3569 {
3570 LOG_WARN("server.loading", ">> Loaded 0 vehicle template accessories. DB table `vehicle_template_accessory` is empty.");
3571 LOG_INFO("server.loading", " ");
3572 return;
3573 }
3574
3575 do
3576 {
3577 Field* fields = result->Fetch();
3578
3579 uint32 uiEntry = fields[0].Get<uint32>();
3580 uint32 uiAccessory = fields[1].Get<uint32>();
3581 int8 uiSeat = int8(fields[2].Get<int8>());
3582 bool bMinion = fields[3].Get<bool>();
3583 uint8 uiSummonType = fields[4].Get<uint8>();
3584 uint32 uiSummonTimer = fields[5].Get<uint32>();
3585
3586 if (!sObjectMgr->GetCreatureTemplate(uiEntry))
3587 {
3588 LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: creature template entry {} does not exist.", uiEntry);
3589 continue;
3590 }
3591
3592 if (!sObjectMgr->GetCreatureTemplate(uiAccessory))
3593 {
3594 LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: Accessory {} does not exist.", uiAccessory);
3595 continue;
3596 }
3597
3598 if (_spellClickInfoStore.find(uiEntry) == _spellClickInfoStore.end())
3599 {
3600 LOG_ERROR("sql.sql", "Table `vehicle_template_accessory`: creature template entry {} has no data in npc_spellclick_spells", uiEntry);
3601 continue;
3602 }
3603
3604 _vehicleTemplateAccessoryStore[uiEntry].push_back(VehicleAccessory(uiAccessory, uiSeat, bMinion, uiSummonType, uiSummonTimer));
3605
3606 ++count;
3607 } while (result->NextRow());
3608
3609 LOG_INFO("server.loading", ">> Loaded {} Vehicle Template Accessories in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3610 LOG_INFO("server.loading", " ");
3611}

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

◆ LoadVendors()

void ObjectMgr::LoadVendors ( )
9432{
9433 uint32 oldMSTime = getMSTime();
9434
9435 // For reload case
9436 for (CacheVendorItemContainer::iterator itr = _cacheVendorItemStore.begin(); itr != _cacheVendorItemStore.end(); ++itr)
9437 itr->second.Clear();
9438 _cacheVendorItemStore.clear();
9439
9440 std::set<uint32> skip_vendors;
9441
9442 QueryResult result = WorldDatabase.Query("SELECT entry, item, maxcount, incrtime, ExtendedCost FROM npc_vendor ORDER BY entry, slot ASC, item, ExtendedCost");
9443 if (!result)
9444 {
9445 LOG_INFO("server.loading", " ");
9446 LOG_WARN("server.loading", ">> Loaded 0 Vendors. DB table `npc_vendor` is empty!");
9447 return;
9448 }
9449
9450 uint32 count = 0;
9451
9452 do
9453 {
9454 Field* fields = result->Fetch();
9455
9456 uint32 entry = fields[0].Get<uint32>();
9457 int32 item_id = fields[1].Get<int32>();
9458
9459 // if item is a negative, its a reference
9460 if (item_id < 0)
9461 count += LoadReferenceVendor(entry, -item_id, &skip_vendors);
9462 else
9463 {
9464 uint32 maxcount = fields[2].Get<uint8>();
9465 uint32 incrtime = fields[3].Get<uint32>();
9466 uint32 ExtendedCost = fields[4].Get<uint32>();
9467
9468 if (!IsVendorItemValid(entry, item_id, maxcount, incrtime, ExtendedCost, nullptr, &skip_vendors))
9469 continue;
9470
9471 VendorItemData& vList = _cacheVendorItemStore[entry];
9472
9473 vList.AddItem(item_id, maxcount, incrtime, ExtendedCost);
9474 ++count;
9475 }
9476 } while (result->NextRow());
9477
9478 LOG_INFO("server.loading", ">> Loaded {} Vendors in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9479 LOG_INFO("server.loading", " ");
9480}

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

◆ LoadWaypointScripts()

void ObjectMgr::LoadWaypointScripts ( )
5768{
5770
5771 std::set<uint32> actionSet;
5772
5773 for (ScriptMapMap::const_iterator itr = sWaypointScripts.begin(); itr != sWaypointScripts.end(); ++itr)
5774 actionSet.insert(itr->first);
5775
5777 PreparedQueryResult result = WorldDatabase.Query(stmt);
5778
5779 if (result)
5780 {
5781 do
5782 {
5783 Field* fields = result->Fetch();
5784 uint32 action = fields[0].Get<uint32>();
5785
5786 actionSet.erase(action);
5787 } while (result->NextRow());
5788 }
5789
5790 for (std::set<uint32>::iterator itr = actionSet.begin(); itr != actionSet.end(); ++itr)
5791 LOG_ERROR("sql.sql", "There is no waypoint which links to the waypoint script {}", *itr);
5792}
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
3819{
3820 if (!_playerInfo[race_][class_])
3821 return;
3822
3823 if (count > 0)
3824 _playerInfo[race_][class_]->item.push_back(PlayerCreateInfoItem(itemId, count));
3825 else
3826 {
3827 if (count < -1)
3828 LOG_ERROR("sql.sql", "Invalid count {} specified on item {} be removed from original player create info (use -1)!", count, itemId);
3829
3830 for (uint32 gender = 0; gender < GENDER_NONE; ++gender)
3831 {
3832 if (CharStartOutfitEntry const* entry = GetCharStartOutfitEntry(race_, class_, gender))
3833 {
3834 bool found = false;
3835 for (uint8 x = 0; x < MAX_OUTFIT_ITEMS; ++x)
3836 {
3837 if (entry->ItemId[x] > 0 && uint32(entry->ItemId[x]) == itemId)
3838 {
3839 found = true;
3840 const_cast<CharStartOutfitEntry*>(entry)->ItemId[x] = 0;
3841 break;
3842 }
3843 }
3844
3845 if (!found)
3846 LOG_ERROR("sql.sql", "Item {} specified to be removed from original create info not found in dbc!", itemId);
3847 }
3848 }
3849 }
3850}
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 
)
2485{
2486 uint8 mask = data->spawnMask;
2487 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2488 {
2489 if (mask & 1)
2490 {
2491 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2492 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2493 cell_guids.creatures.erase(guid);
2494 }
2495 }
2496}

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 
)
2788{
2789 uint8 mask = data->spawnMask;
2790 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2791 {
2792 if (mask & 1)
2793 {
2794 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2795 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2796 cell_guids.gameobjects.erase(guid);
2797 }
2798 }
2799}

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 
)
9611{
9612 CacheVendorItemContainer::iterator iter = _cacheVendorItemStore.find(entry);
9613 if (iter == _cacheVendorItemStore.end())
9614 return false;
9615
9616 if (!iter->second.RemoveItem(item))
9617 return false;
9618
9619 if (persist)
9620 {
9622
9623 stmt->SetData(0, entry);
9624 stmt->SetData(1, item);
9625
9626 WorldDatabase.Execute(stmt);
9627 }
9628
9629 return true;
9630}
@ WORLD_DEL_NPC_VENDOR
Definition WorldDatabase.h:44

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

◆ ReturnOrDeleteOldMails()

void ObjectMgr::ReturnOrDeleteOldMails ( bool  serverUp)
6263{
6264 uint32 oldMSTime = getMSTime();
6265
6266 time_t curTime = GameTime::GetGameTime().count();
6267
6269 stmt->SetData(0, uint32(curTime));
6270 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6271 if (!result)
6272 return;
6273
6274 std::map<uint32 /*messageId*/, MailItemInfoVec> itemsCache;
6275 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_EXPIRED_MAIL_ITEMS);
6276 stmt->SetData(0, uint32(curTime));
6277 if (PreparedQueryResult items = CharacterDatabase.Query(stmt))
6278 {
6279 MailItemInfo item;
6280 do
6281 {
6282 Field* fields = items->Fetch();
6283 item.item_guid = fields[0].Get<uint32>();
6284 item.item_template = fields[1].Get<uint32>();
6285 uint32 mailId = fields[2].Get<uint32>();
6286 itemsCache[mailId].push_back(item);
6287 } while (items->NextRow());
6288 }
6289
6290 uint32 deletedCount = 0;
6291 uint32 returnedCount = 0;
6292 do
6293 {
6294 Field* fields = result->Fetch();
6295 Mail* m = new Mail;
6296 m->messageID = fields[0].Get<uint32>();
6297 m->messageType = fields[1].Get<uint8>();
6298 m->sender = fields[2].Get<uint32>();
6299 m->receiver = fields[3].Get<uint32>();
6300 bool has_items = fields[4].Get<bool>();
6301 m->expire_time = time_t(fields[5].Get<uint32>());
6302 m->deliver_time = time_t(0);
6303 m->stationery = fields[6].Get<uint8>();
6304 m->checked = fields[7].Get<uint8>();
6305 m->mailTemplateId = fields[8].Get<int16>();
6306
6307 Player* player = nullptr;
6308 if (serverUp)
6310
6311 if (player) // don't modify mails of a logged in player
6312 {
6313 delete m;
6314 continue;
6315 }
6316
6317 // Delete or return mail
6318 if (has_items)
6319 {
6320 // read items from cache
6321 m->items.swap(itemsCache[m->messageID]);
6322
6323 // If it is mail from non-player, or if it's already return mail, it shouldn't be returned, but deleted
6324 if (!m->IsSentByPlayer() || m->IsSentByGM() || (m->IsCODPayment() || m->IsReturnedMail()))
6325 {
6326 for (auto const& mailedItem : m->items)
6327 {
6328 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
6329 stmt->SetData(0, mailedItem.item_guid);
6330 CharacterDatabase.Execute(stmt);
6331 }
6332
6333 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
6334 stmt->SetData(0, m->messageID);
6335 CharacterDatabase.Execute(stmt);
6336 }
6337 else
6338 {
6339 // Mail will be returned
6340 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_RETURNED);
6341 stmt->SetData(0, m->receiver);
6342 stmt->SetData(1, m->sender);
6343 stmt->SetData(2, uint32(curTime + 30 * DAY));
6344 stmt->SetData(3, uint32(curTime));
6346 stmt->SetData(5, m->messageID);
6347 CharacterDatabase.Execute(stmt);
6348 for (auto const& mailedItem : m->items)
6349 {
6350 // Update receiver in mail items for its proper delivery, and in instance_item for avoid lost item at sender delete
6351 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_ITEM_RECEIVER);
6352 stmt->SetData(0, m->sender);
6353 stmt->SetData(1, mailedItem.item_guid);
6354 CharacterDatabase.Execute(stmt);
6355
6356 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_OWNER);
6357 stmt->SetData(0, m->sender);
6358 stmt->SetData(1, mailedItem.item_guid);
6359 CharacterDatabase.Execute(stmt);
6360 }
6361
6362 // xinef: update global data
6363 sCharacterCache->IncreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->sender));
6364 sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver));
6365
6366 delete m;
6367 ++returnedCount;
6368 continue;
6369 }
6370 }
6371
6372 sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver));
6373
6374 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
6375 stmt->SetData(0, m->messageID);
6376 CharacterDatabase.Execute(stmt);
6377 delete m;
6378 ++deletedCount;
6379 } while (result->NextRow());
6380
6381 LOG_INFO("server.loading", ">> Processed {} expired mails: {} deleted and {} returned in {} ms", deletedCount + returnedCount, deletedCount, returnedCount, GetMSTimeDiffToNow(oldMSTime));
6382 LOG_INFO("server.loading", " ");
6383}
#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:1082
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 ( )
7145{
7146 QueryResult result = CharacterDatabase.Query("SELECT MAX(guid) FROM characters");
7147 if (result)
7148 GetGuidSequenceGenerator<HighGuid::Player>().Set((*result)[0].Get<uint32>() + 1);
7149
7150 result = CharacterDatabase.Query("SELECT MAX(guid) FROM item_instance");
7151 if (result)
7152 GetGuidSequenceGenerator<HighGuid::Item>().Set((*result)[0].Get<uint32>() + 1);
7153
7154 // Cleanup other tables from not existed guids ( >= _hiItemGuid)
7155 CharacterDatabase.Execute("DELETE FROM character_inventory WHERE item >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7156 CharacterDatabase.Execute("DELETE FROM mail_items WHERE item_guid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7157 CharacterDatabase.Execute("DELETE FROM auctionhouse WHERE itemguid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7158 CharacterDatabase.Execute("DELETE FROM guild_bank_item WHERE item_guid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7159
7160 result = WorldDatabase.Query("SELECT MAX(guid) FROM transports");
7161 if (result)
7162 GetGuidSequenceGenerator<HighGuid::Mo_Transport>().Set((*result)[0].Get<uint32>() + 1);
7163
7164 result = CharacterDatabase.Query("SELECT MAX(id) FROM auctionhouse");
7165 if (result)
7166 _auctionId = (*result)[0].Get<uint32>() + 1;
7167
7168 result = CharacterDatabase.Query("SELECT MAX(id) FROM mail");
7169 if (result)
7170 _mailId = (*result)[0].Get<uint32>() + 1;
7171
7172 result = CharacterDatabase.Query("SELECT MAX(arenateamid) FROM arena_team");
7173 if (result)
7174 sArenaTeamMgr->SetNextArenaTeamId((*result)[0].Get<uint32>() + 1);
7175
7176 result = CharacterDatabase.Query("SELECT MAX(fight_id) FROM log_arena_fights");
7177 if (result)
7178 sArenaTeamMgr->SetLastArenaLogId((*result)[0].Get<uint32>());
7179
7180 result = CharacterDatabase.Query("SELECT MAX(setguid) FROM character_equipmentsets");
7181 if (result)
7182 _equipmentSetGuid = (*result)[0].Get<uint64>() + 1;
7183
7184 result = CharacterDatabase.Query("SELECT MAX(guildId) FROM guild");
7185 if (result)
7186 sGuildMgr->SetNextGuildId((*result)[0].Get<uint32>() + 1);
7187
7188 result = WorldDatabase.Query("SELECT MAX(guid) FROM creature");
7189 if (result)
7190 _creatureSpawnId = (*result)[0].Get<uint32>() + 1;
7191
7192 result = WorldDatabase.Query("SELECT MAX(guid) FROM gameobject");
7193 if (result)
7194 _gameObjectSpawnId = (*result)[0].Get<uint32>() + 1;
7195}
#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 ( )
5855{
5856 uint32 oldMSTime = getMSTime();
5857
5858 if (_spellScriptsStore.empty())
5859 {
5860 LOG_INFO("server.loading", ">> Validated 0 scripts.");
5861 LOG_INFO("server.loading", " ");
5862 return;
5863 }
5864
5865 uint32 count = 0;
5866
5867 for (SpellScriptsContainer::iterator itr = _spellScriptsStore.begin(); itr != _spellScriptsStore.end();)
5868 {
5869 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
5870 std::vector<std::pair<SpellScriptLoader*, SpellScriptsContainer::iterator> > SpellScriptLoaders;
5871 sScriptMgr->CreateSpellScriptLoaders(itr->first, SpellScriptLoaders);
5872 itr = _spellScriptsStore.upper_bound(itr->first);
5873
5874 for (std::vector<std::pair<SpellScriptLoader*, SpellScriptsContainer::iterator> >::iterator sitr = SpellScriptLoaders.begin(); sitr != SpellScriptLoaders.end(); ++sitr)
5875 {
5876 SpellScript* spellScript = sitr->first->GetSpellScript();
5877 AuraScript* auraScript = sitr->first->GetAuraScript();
5878 bool valid = true;
5879 if (!spellScript && !auraScript)
5880 {
5881 LOG_ERROR("sql.sql", "Functions GetSpellScript() and GetAuraScript() of script `{}` do not return objects - script skipped", GetScriptName(sitr->second->second));
5882 valid = false;
5883 }
5884 if (spellScript)
5885 {
5886 spellScript->_Init(&sitr->first->GetName(), spellInfo->Id);
5887 spellScript->_Register();
5888 if (!spellScript->_Validate(spellInfo))
5889 valid = false;
5890 delete spellScript;
5891 }
5892 if (auraScript)
5893 {
5894 auraScript->_Init(&sitr->first->GetName(), spellInfo->Id);
5895 auraScript->_Register();
5896 if (!auraScript->_Validate(spellInfo))
5897 valid = false;
5898 delete auraScript;
5899 }
5900 if (!valid)
5901 {
5902 _spellScriptsStore.erase(sitr->second);
5903 }
5904 }
5905 ++count;
5906 }
5907
5908 LOG_INFO("server.loading", ">> Validated {} scripts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5909 LOG_INFO("server.loading", " ");
5910}
Definition SpellScript.h:517
bool _Validate(SpellInfo const *entry) override
Definition SpellScript.cpp:662
std::string const & GetScriptName(uint32 id) const
Definition ObjectMgr.cpp:9768
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: