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:1704
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:9942
void AddCreatureToGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition ObjectMgr.cpp:2470
ObjectGuid::LowType GenerateCreatureSpawnId()
Definition ObjectMgr.cpp:7256
CreatureData & NewOrExistCreatureData(ObjectGuid::LowType spawnId)
Definition ObjectMgr.h:1216
CreatureTemplate const * GetCreatureTemplate(uint32 entry)
Definition ObjectMgr.cpp:10290
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)
9174{
9175 // find max id
9176 uint32 new_id = 0;
9177 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9178 if (itr->first > new_id)
9179 new_id = itr->first;
9180
9181 // use next
9182 ++new_id;
9183
9184 if (!Utf8toWStr(tele.name, tele.wnameLow))
9185 return false;
9186
9187 wstrToLower(tele.wnameLow);
9188
9189 _gameTeleStore[new_id] = tele;
9190
9192
9193 stmt->SetData(0, new_id);
9194 stmt->SetData(1, tele.position_x);
9195 stmt->SetData(2, tele.position_y);
9196 stmt->SetData(3, tele.position_z);
9197 stmt->SetData(4, tele.orientation);
9198 stmt->SetData(5, uint16(tele.mapId));
9199 stmt->SetData(6, tele.name);
9200
9201 WorldDatabase.Execute(stmt);
9202
9203 return true;
9204}
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:10266
ObjectGuid::LowType GenerateGameObjectSpawnId()
Definition ObjectMgr.cpp:7266
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)
8541{
8542 if (!IsProfanityName(name))
8543 {
8544 std::wstring wstr;
8545 if (!Utf8toWStr(name, wstr))
8546 {
8547 LOG_ERROR("server", "Could not add invalid name to profanity player names: {}", name);
8548 return;
8549 }
8550 wstrToLower(wstr);
8551
8552 _profanityNamesStore.insert(wstr);
8553
8555 stmt->SetData(0, name);
8556 CharacterDatabase.Execute(stmt);
8557 }
8558}
@ 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:8525

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

◆ AddReservedPlayerName()

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

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

Referenced by GetPlayerLevelInfo().

◆ ChangeFishingBaseSkillLevel()

void ObjectMgr::ChangeFishingBaseSkillLevel ( uint32  entry,
int32  skill 
)
8993{
8994 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
8995 if (!fArea)
8996 {
8997 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
8998 return;
8999 }
9000
9001 _fishingBaseForAreaStore[entry] = skill;
9002
9003 LOG_INFO("server.loading", ">> Fishing base skill level of area {} changed to {}", entry, skill);
9004 LOG_INFO("server.loading", " ");
9005}
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:1604
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
9008{
9009 // get main part of the name
9010 std::wstring mainpart = GetMainPartOfName(w_ownname, 0);
9011 // prepare flags
9012 bool x = true;
9013 bool y = true;
9014
9015 // check declined names
9016 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
9017 {
9018 std::wstring wname;
9019 if (!Utf8toWStr(names.name[i], wname))
9020 return false;
9021
9022 if (mainpart != GetMainPartOfName(wname, i + 1))
9023 x = false;
9024
9025 if (w_ownname != wname)
9026 y = false;
9027 }
9028 return (x || y);
9029}
#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
8713{
8714 std::wstring wname;
8715 if (!Utf8toWStr(name, wname))
8716 return PET_NAME_INVALID;
8717
8718 if (wname.size() > MAX_PET_NAME)
8719 return PET_NAME_TOO_LONG;
8720
8721 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PET_NAME);
8722 if (wname.size() < minName)
8723 return PET_NAME_TOO_SHORT;
8724
8725 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PET_NAMES);
8726 if (!isValidString(wname, strictMask, false))
8728
8729 // Check Reserved Name
8730 if (sObjectMgr->IsReservedName(name))
8731 return PET_NAME_RESERVED;
8732
8733 // Check Profanity Name
8734 if (sObjectMgr->IsProfanityName(name))
8735 return PET_NAME_PROFANE;
8736
8737 return PET_NAME_SUCCESS;
8738}
bool isValidString(std::wstring wstr, uint32 strictMask, bool numericOrSpace, bool create=false)
Definition ObjectMgr.cpp:8597
#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
@ CONFIG_STRICT_PET_NAMES
Definition WorldConfig.h:174
@ CONFIG_MIN_PET_NAME
Definition WorldConfig.h:177

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
8634{
8635 std::wstring wname;
8636
8637 // Check for invalid characters
8638 if (!Utf8toWStr(name, wname))
8640
8641 // Check for too long name
8642 if (wname.size() > MAX_PLAYER_NAME)
8643 return CHAR_NAME_TOO_LONG;
8644
8645 // Check for too short name
8646 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PLAYER_NAME);
8647 if (wname.size() < minName)
8648 return CHAR_NAME_TOO_SHORT;
8649
8650 // Check for mixed languages
8651 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PLAYER_NAMES);
8652 if (!isValidString(wname, strictMask, false, create))
8654
8655 // Check for three consecutive letters
8656 wstrToLower(wname);
8657 for (std::size_t i = 2; i < wname.size(); ++i)
8658 if (wname[i] == wname[i - 1] && wname[i] == wname[i - 2])
8660
8661 // Check Reserved Name
8662 if (sObjectMgr->IsReservedName(name))
8663 return CHAR_NAME_RESERVED;
8664
8665 // Check Profanity Name
8666 if (sObjectMgr->IsProfanityName(name))
8667 return CHAR_NAME_PROFANE;
8668
8669 return CHAR_NAME_SUCCESS;
8670}
#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
@ CONFIG_STRICT_PLAYER_NAMES
Definition WorldConfig.h:171
@ CONFIG_MIN_PLAYER_NAME
Definition WorldConfig.h:175

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)
8234{
8235 // remove mapid*cellid -> guid_set map
8236 CreatureData const* data = GetCreatureData(guid);
8237 if (data)
8238 RemoveCreatureFromGrid(guid, data);
8239
8240 _creatureDataStore.erase(guid);
8241}
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)
9207{
9208 // explicit name case
9209 std::wstring wname;
9210 if (!Utf8toWStr(name, wname))
9211 return false;
9212
9213 // converting string that we try to find to lower case
9214 wstrToLower(wname);
9215
9216 for (GameTeleContainer::iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9217 {
9218 if (itr->second.wnameLow == wname)
9219 {
9221
9222 stmt->SetData(0, itr->second.name);
9223
9224 WorldDatabase.Execute(stmt);
9225
9226 _gameTeleStore.erase(itr);
9227 return true;
9228 }
9229 }
9230
9231 return false;
9232}
@ 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)
8244{
8245 // remove mapid*cellid -> guid_set map
8246 GameObjectData const* data = GetGameObjectData(guid);
8247 if (data)
8248 RemoveGameobjectFromGrid(guid, data);
8249
8250 _gameObjectDataStore.erase(guid);
8251}
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 ( )
7226{
7227 if (_auctionId >= 0xFFFFFFFE)
7228 {
7229 LOG_ERROR("server.worldserver", "Auctions ids overflow!! Can't continue, shutting down server. ");
7231 }
7232 return _auctionId++;
7233}
static void StopNow(uint8 exitcode)
Definition World.h:190
@ ERROR_EXIT_CODE
Definition World.h:54

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

◆ GenerateCreatureSpawnId()

uint32 ObjectMgr::GenerateCreatureSpawnId ( )
7257{
7258 if (_creatureSpawnId >= uint32(0xFFFFFF))
7259 {
7260 LOG_ERROR("server.worldserver", "Creature spawn id overflow!! Can't continue, shutting down server. Search on forum for TCE00007 for more info.");
7262 }
7263 return _creatureSpawnId++;
7264}

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

Referenced by AddCreData().

◆ GenerateEquipmentSetGuid()

uint64 ObjectMgr::GenerateEquipmentSetGuid ( )
7236{
7237 if (_equipmentSetGuid >= uint64(0xFFFFFFFFFFFFFFFELL))
7238 {
7239 LOG_ERROR("server.worldserver", "EquipmentSet guid overflow!! Can't continue, shutting down server. ");
7241 }
7242 return _equipmentSetGuid++;
7243}
std::uint64_t uint64
Definition Define.h:106

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

◆ GenerateGameObjectSpawnId()

uint32 ObjectMgr::GenerateGameObjectSpawnId ( )
7267{
7268 if (_gameObjectSpawnId >= uint32(0xFFFFFF))
7269 {
7270 LOG_ERROR("server.worldserver", "GameObject spawn id overflow!! Can't continue, shutting down server. Search on forum for TCE00007 for more info. ");
7272 }
7273 return _gameObjectSpawnId++;
7274}

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

Referenced by AddGOData().

◆ GenerateMailID()

uint32 ObjectMgr::GenerateMailID ( )
7246{
7247 if (_mailId >= 0xFFFFFFFE)
7248 {
7249 LOG_ERROR("server.worldserver", "Mail ids overflow!! Can't continue, shutting down server. ");
7251 }
7252 std::lock_guard<std::mutex> guard(_mailIdMutex);
7253 return _mailId++;
7254}
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)
7733{
7734 std::vector<std::string>& list0 = _petHalfName0[entry];
7735 std::vector<std::string>& list1 = _petHalfName1[entry];
7736
7737 if (list0.empty() || list1.empty())
7738 {
7739 CreatureTemplate const* cinfo = GetCreatureTemplate(entry);
7740 char const* petname = GetPetName(cinfo->family, sWorld->GetDefaultDbcLocale());
7741 if (!petname)
7742 return cinfo->Name;
7743
7744 return std::string(petname);
7745 }
7746
7747 return *(list0.begin() + urand(0, list0.size() - 1)) + *(list1.begin() + urand(0, list1.size() - 1));
7748}
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 
)
7720{
7721 std::vector<std::string>& list0 = _petHalfLocaleName0[std::make_pair(entry, locale)];
7722 std::vector<std::string>& list1 = _petHalfLocaleName1[std::make_pair(entry, locale)];
7723
7724 if (list0.empty() || list1.empty())
7725 {
7726 return GeneratePetName(entry);
7727 }
7728
7729 return *(list0.begin() + urand(0, list0.size() - 1)) + *(list1.begin() + urand(0, list1.size() - 1));
7730}
HalfNameContainerLocale _petHalfLocaleName0
Definition ObjectMgr.h:1574
HalfNameContainerLocale _petHalfLocaleName1
Definition ObjectMgr.h:1575
std::string GeneratePetName(uint32 entry)
Definition ObjectMgr.cpp:7732

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

◆ GeneratePetNumber()

uint32 ObjectMgr::GeneratePetNumber ( )
7751{
7752 std::lock_guard<std::mutex> guard(_hiPetNumberMutex);
7753 return ++_hiPetNumber;
7754}
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
8939{
8940 AcoreString const* as = GetAcoreString(entry);
8941 if (as && !as->Content.empty())
8942 {
8943 if (as->Content.size() > std::size_t(locale) && !as->Content[locale].empty())
8944 return as->Content[locale];
8945
8946 return as->Content[DEFAULT_LOCALE];
8947 }
8948
8949 std::string msg = Acore::StringFormat("No entry for acore_string ({}) in DB.", entry);
8950 LOG_ERROR("sql.sql", msg);
8951 return msg;
8952}
#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)
9032{
9033 AreaTriggerScriptContainer::const_iterator i = _areaTriggerScriptStore.find(trigger_id);
9034 if (i != _areaTriggerScriptStore.end())
9035 return i->second;
9036 return 0;
9037}

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 
)
9046{
9047 if (!factionEntry)
9048 return 0;
9049
9050 uint32 raceMask = (1 << (race - 1));
9051 uint32 classMask = (1 << (playerClass - 1));
9052
9053 for (int i = 0; i < 4; i++)
9054 {
9055 if ((!factionEntry->BaseRepClassMask[i] ||
9056 factionEntry->BaseRepClassMask[i] & classMask) &&
9057 (!factionEntry->BaseRepRaceMask[i] ||
9058 factionEntry->BaseRepRaceMask[i] & raceMask))
9059 return factionEntry->BaseRepValue[i];
9060 }
9061
9062 return 0;
9063}

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

◆ GetBaseXP()

uint32 ObjectMgr::GetBaseXP ( uint8  level)
7661{
7662 return _baseXPTable[level] ? _baseXPTable[level] : 0;
7663}
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 
)
9943{
9944 CreatureBaseStatsContainer::const_iterator it = _creatureBaseStatsStore.find(MAKE_PAIR16(level, unitClass));
9945
9946 if (it != _creatureBaseStatsStore.end())
9947 return &(it->second);
9948
9949 struct DefaultCreatureBaseStats : public CreatureBaseStats
9950 {
9951 DefaultCreatureBaseStats()
9952 {
9953 BaseArmor = 1;
9954 for (uint8 j = 0; j < MAX_EXPANSIONS; ++j)
9955 {
9956 BaseHealth[j] = 1;
9957 BaseDamage[j] = 0.0f;
9958 }
9959 BaseMana = 0;
9960 AttackPower = 0;
9961 RangedAttackPower = 0;
9962 }
9963 };
9964 static const DefaultCreatureBaseStats defStats;
9965 return &defStats;
9966}
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)
10267{
10268 GameObjectTemplateContainer::const_iterator itr = _gameObjectTemplateStore.find(entry);
10269 if (itr != _gameObjectTemplateStore.end())
10270 return &(itr->second);
10271
10272 return nullptr;
10273}
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
10282{
10283 auto itr = _gameObjectTemplateAddonStore.find(entry);
10284 if (itr != _gameObjectTemplateAddonStore.end())
10285 return &itr->second;
10286
10287 return nullptr;
10288}
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
9151{
9152 // explicit name case
9153 std::wstring wname;
9154 if (!Utf8toWStr(name, wname))
9155 return nullptr;
9156
9157 // converting string that we try to find to lower case
9158 wstrToLower(wname);
9159
9160 // Alternative first GameTele what contains wnameLow as substring in case no GameTele location found
9161 const GameTele* alt = nullptr;
9162 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9163 {
9164 if (itr->second.wnameLow == wname)
9165 return &itr->second;
9166 else if (!exactSearch && !alt && itr->second.wnameLow.find(wname) != std::wstring::npos)
9167 alt = &itr->second;
9168 }
9169
9170 return alt;
9171}
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
7125{
7126 bool useParentDbValue = false;
7127 uint32 parentId = 0;
7128 MapEntry const* mapEntry = sMapStore.LookupEntry(Map);
7129 if (!mapEntry || mapEntry->entrance_map < 0)
7130 return nullptr;
7131
7132 if (mapEntry->IsDungeon())
7133 {
7134 InstanceTemplate const* iTemplate = sObjectMgr->GetInstanceTemplate(Map);
7135
7136 if (!iTemplate)
7137 return nullptr;
7138
7139 parentId = iTemplate->Parent;
7140 useParentDbValue = true;
7141 }
7142
7143 uint32 entrance_map = uint32(mapEntry->entrance_map);
7144 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
7145 if ((!useParentDbValue && itr->second.target_mapId == entrance_map) || (useParentDbValue && itr->second.target_mapId == parentId))
7146 {
7147 AreaTrigger const* atEntry = GetAreaTrigger(itr->first);
7148 if (atEntry && atEntry->map == Map)
7149 return &itr->second;
7150 }
7151 return nullptr;
7152}
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
6172{
6173 GossipTextContainer::const_iterator itr = _gossipTextStore.find(Text_ID);
6174 if (itr != _gossipTextStore.end())
6175 return &itr->second;
6176 return nullptr;
6177}
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)
6078{
6079 InstanceTemplateContainer::const_iterator itr = _instanceTemplateStore.find(uint16(mapID));
6080 if (itr != _instanceTemplateStore.end())
6081 return &(itr->second);
6082
6083 return nullptr;
6084}
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)
3469{
3470 return entry < _itemTemplateStoreFast.size() ? _itemTemplateStoreFast[entry] : nullptr;
3471}
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

7158{
7159 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
7160 {
7161 if (itr->second.target_mapId == Map) // Id is used to determine correct Scarlet Monastery instance
7162 {
7163 // xinef: no need to check, already done at loading
7164 //AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first);
7165 //if (atEntry)
7166 return &itr->second;
7167 }
7168 }
7169 return nullptr;
7170}

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

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
8890{
8891 ModuleString const* ms = GetModuleString(module, id);
8892 if (ms && !ms->Content.empty())
8893 {
8894 if (ms->Content.size() > size_t(locale) && !ms->Content[locale].empty())
8895 return &ms->Content[locale];
8896
8897 return &ms->Content[DEFAULT_LOCALE];
8898 }
8899
8900 LOG_ERROR("sql.sql", "Module string module {} id {} not found in DB.", module, id);
8901
8902 return (std::string*)"error";
8903}
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 
)
6742{
6743 bool found = false;
6744 float dist = 10000;
6745 uint32 id = 0;
6746
6747 for (uint32 i = 1; i < sTaxiNodesStore.GetNumRows(); ++i)
6748 {
6749 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(i);
6750
6751 if (!node || node->map_id != mapid || (!node->MountCreatureID[teamId == TEAM_ALLIANCE ? 1 : 0] && node->MountCreatureID[0] != 32981)) // dk flight
6752 continue;
6753
6754 uint8 field = (uint8)((i - 1) / 32);
6755 uint32 submask = 1 << ((i - 1) % 32);
6756
6757 // skip not taxi network nodes
6758 if (field >= TaxiMaskSize || (sTaxiNodesMask[field] & submask) == 0)
6759 {
6760 continue;
6761 }
6762
6763 float dist2 = (node->x - x) * (node->x - x) + (node->y - y) * (node->y - y) + (node->z - z) * (node->z - z);
6764 if (found)
6765 {
6766 if (dist2 < dist)
6767 {
6768 dist = dist2;
6769 id = i;
6770 }
6771 }
6772 else
6773 {
6774 found = true;
6775 dist = dist2;
6776 id = i;
6777 }
6778 }
6779
6780 return id;
6781}
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)
5994{
5995 PageTextContainer::const_iterator itr = _pageTextStore.find(pageEntry);
5996 if (itr != _pageTextStore.end())
5997 return &(itr->second);
5998
5999 return nullptr;
6000}
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
3835{
3836 if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
3837 level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
3838
3839 PetLevelInfoContainer::const_iterator itr = _petInfoStore.find(creature_id);
3840 if (itr == _petInfoStore.end())
3841 return nullptr;
3842
3843 return &itr->second[level - 1]; // data for level 1 stored in [0] array element, ...
3844}

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
4502{
4503 if (level < 1 || class_ >= MAX_CLASSES)
4504 return;
4505
4506 PlayerClassInfo const* pInfo = _playerClassInfo[class_];
4507
4508 if (level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4509 level = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
4510
4511 *info = pInfo->levelInfo[level - 1];
4512}
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
10313{
10314 if (race >= MAX_RACES)
10315 return nullptr;
10316 if (class_ >= MAX_CLASSES)
10317 return nullptr;
10318 PlayerInfo const* info = _playerInfo[race][class_];
10319 if (!info)
10320 return nullptr;
10321 return info;
10322}
Definition Player.h:341

References _playerInfo, MAX_CLASSES, and MAX_RACES.

◆ GetPlayerLevelInfo()

void ObjectMgr::GetPlayerLevelInfo ( uint32  race,
uint32  class_,
uint8  level,
PlayerLevelInfo info 
) const
4515{
4516 if (level < 1 || race >= MAX_RACES || class_ >= MAX_CLASSES)
4517 return;
4518
4519 PlayerInfo const* pInfo = _playerInfo[race][class_];
4520 if (!pInfo)
4521 return;
4522
4523 if (level <= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
4524 *info = pInfo->levelInfo[level - 1];
4525 else
4526 BuildPlayerLevelInfo(race, class_, level, info);
4527}
void BuildPlayerLevelInfo(uint8 race, uint8 class_, uint8 level, PlayerLevelInfo *plinfo) const
Definition ObjectMgr.cpp:4529

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
6472{
6473 uint8 typeIndex;
6474 if (type == TYPEID_UNIT)
6475 typeIndex = 0;
6476 else if (type == TYPEID_GAMEOBJECT)
6477 typeIndex = 1;
6478 else
6479 return nullptr;
6480
6481 std::pair<uint32, uint8> pairKey = std::make_pair(id, typeIndex);
6482 QuestGreetingContainer::const_iterator itr = _questGreetingStore.find(pairKey);
6483 if (itr == _questGreetingStore.end())
6484 return nullptr;
6485
6486 return &itr->second;
6487}
@ 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
10449{
10450 if (questMoneyDifficulty < MAX_QUEST_MONEY_REWARDS)
10451 {
10452 auto const& itr = _questMoneyRewards.find(level);
10453 if (itr != _questMoneyRewards.end())
10454 {
10455 return itr->second.at(questMoneyDifficulty);
10456 }
10457 }
10458
10459 return 0;
10460}
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)
9803{
9804 // use binary search to find the script name in the sorted vector
9805 // assume "" is the first element
9806 if (name.empty())
9807 return 0;
9808
9809 ScriptNameContainer::const_iterator itr = std::lower_bound(_scriptNamesStore.begin(), _scriptNamesStore.end(), name);
9810 if (itr == _scriptNamesStore.end() || (*itr != name))
9811 return 0;
9812
9813 return uint32(itr - _scriptNamesStore.begin());
9814}
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
9797{
9798 static std::string const empty = "";
9799 return (id < _scriptNamesStore.size()) ? _scriptNamesStore[id] : empty;
9800}

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)
9040{
9041 return SpellScriptsBounds(_spellScriptsStore.lower_bound(spell_id), _spellScriptsStore.upper_bound(spell_id));
9042}
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 
)
6808{
6809 CreatureModel mountModel;
6810 CreatureTemplate const* mount_info = nullptr;
6811
6812 // select mount creature id
6813 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(id);
6814 if (node)
6815 {
6816 uint32 mount_entry = node->MountCreatureID[teamId == TEAM_ALLIANCE ? 1 : 0];
6817
6818 // Fix for Alliance not being able to use Acherus taxi
6819 // only one mount type for both sides
6820 if (mount_entry == 0 && allowed_alt_team)
6821 {
6822 // Simply reverse the selection. At least one team in theory should have a valid mount ID to choose.
6823 mount_entry = node->MountCreatureID[teamId];
6824 }
6825
6826 mount_info = GetCreatureTemplate(mount_entry);
6827 if (mount_info)
6828 {
6829 CreatureModel const* model = mount_info->GetRandomValidModel();
6830 if (!model)
6831 {
6832 LOG_ERROR("sql.sql", "No displayid found for the taxi mount with the entry {}! Can't load it!", mount_entry);
6833 return 0;
6834 }
6835 mountModel = *model;
6836 }
6837 }
6838
6839 // minfo is not actually used but the mount_id was updated
6840 GetCreatureModelRandomGender(&mountModel, mount_info);
6841
6842 return mountModel.CreatureDisplayID;
6843}
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 
)
6784{
6785 TaxiPathSetBySource::iterator src_i = sTaxiPathSetBySource.find(source);
6786 if (src_i == sTaxiPathSetBySource.end())
6787 {
6788 path = 0;
6789 cost = 0;
6790 return;
6791 }
6792
6793 TaxiPathSetForSource& pathSet = src_i->second;
6794
6795 TaxiPathSetForSource::iterator dest_i = pathSet.find(destination);
6796 if (dest_i == pathSet.end())
6797 {
6798 path = 0;
6799 cost = 0;
6800 return;
6801 }
6802
6803 cost = dest_i->second->price;
6804 path = dest_i->second->ID;
6805}
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
10296{
10297 if (Creature* cre = veh->GetBase()->ToCreature())
10298 {
10299 // Give preference to GUID-based accessories
10300 VehicleAccessoryContainer::const_iterator itr = _vehicleAccessoryStore.find(cre->GetSpawnId());
10301 if (itr != _vehicleAccessoryStore.end())
10302 return &itr->second;
10303 }
10304
10305 // Otherwise return entry-based
10306 VehicleAccessoryContainer::const_iterator itr = _vehicleTemplateAccessoryStore.find(veh->GetCreatureEntry());
10307 if (itr != _vehicleTemplateAccessoryStore.end())
10308 return &itr->second;
10309 return nullptr;
10310}
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
7666{
7667 if (level < _playerXPperLevel.size())
7668 return _playerXPperLevel[level];
7669 return 0;
7670}
PlayerXPperLevel _playerXPperLevel
Definition ObjectMgr.h:1562

References _playerXPperLevel.

◆ InitializeSpellInfoPrecomputedData()

void ObjectMgr::InitializeSpellInfoPrecomputedData ( )
5941{
5942 uint32 limit = sSpellStore.GetNumRows();
5943 for(uint32 i = 0; i <= limit; ++i)
5944 if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i))
5945 {
5946 const_cast<SpellInfo*>(spellInfo)->SetStackableWithRanks(spellInfo->ComputeIsStackableWithRanks());
5947 const_cast<SpellInfo*>(spellInfo)->SetCritCapable(spellInfo->ComputeIsCritCapable());
5948 const_cast<SpellInfo*>(spellInfo)->SetSpellValid(SpellMgr::ComputeIsSpellValid(spellInfo, false));
5949 }
5950}
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)
10276{
10277 GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
10278 return goinfo && goinfo->type == GAMEOBJECT_TYPE_TRANSPORT;
10279}
@ GAMEOBJECT_TYPE_TRANSPORT
Definition SharedDefines.h:1571

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

◆ IsProfanityName()

bool ObjectMgr::IsProfanityName ( std::string_view  name) const
8526{
8527 // pussywizard
8528 if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
8529 return true;
8530
8531 std::wstring wstr;
8532 if (!Utf8toWStr (name, wstr))
8533 return false;
8534
8535 wstrToLower(wstr);
8536
8537 return _profanityNamesStore.find(wstr) != _profanityNamesStore.end();
8538}

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

Referenced by AddProfanityPlayerName().

◆ IsReservedName()

bool ObjectMgr::IsReservedName ( std::string_view  name) const
8423{
8424 // pussywizard
8425 if (name.size() >= 2 && (name[name.size() - 2] == 'G' || name[name.size() - 2] == 'g') && (name[name.size() - 1] == 'M' || name[name.size() - 1] == 'm'))
8426 return true;
8427
8428 std::wstring wstr;
8429 if (!Utf8toWStr (name, wstr))
8430 return false;
8431
8432 wstrToLower(wstr);
8433
8434 return _reservedNamesStore.find(wstr) != _reservedNamesStore.end();
8435}

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
8699{
8700 std::wstring wname;
8701 if (!Utf8toWStr(name, wname))
8702 return false;
8703
8704 if (wname.size() > MAX_CHANNEL_NAME)
8705 return false;
8706
8707 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_CHANNEL_NAMES);
8708
8709 return isValidString(wname, strictMask, true);
8710}
#define MAX_CHANNEL_NAME
Definition ObjectMgr.h:686
@ CONFIG_STRICT_CHANNEL_NAMES
Definition WorldConfig.h:173

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

◆ IsValidCharterName()

bool ObjectMgr::IsValidCharterName ( std::string_view  name)
static
8673{
8674 std::wstring wname;
8675 if (!Utf8toWStr(name, wname))
8676 return false;
8677
8678 if (wname.size() > MAX_CHARTER_NAME)
8679 return false;
8680
8681 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_CHARTER_NAME);
8682 if (wname.size() < minName)
8683 return false;
8684
8685 // Check Reserved Name
8686 if (sObjectMgr->IsReservedName(name))
8687 return false;
8688
8689 // Check Profanity Name
8690 if (sObjectMgr->IsProfanityName(name))
8691 return false;
8692
8693 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_CHARTER_NAMES);
8694
8695 return isValidString(wname, strictMask, true);
8696}
#define MAX_CHARTER_NAME
Definition ObjectMgr.h:685
@ CONFIG_MIN_CHARTER_NAME
Definition WorldConfig.h:176
@ CONFIG_STRICT_CHARTER_NAMES
Definition WorldConfig.h:172

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

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

◆ LoadAcoreStrings()

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

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

◆ LoadAreaTriggerTeleports()

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

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

◆ LoadCreatureClassLevelStats()

void ObjectMgr::LoadCreatureClassLevelStats ( )
9969{
9970 uint32 oldMSTime = getMSTime();
9971
9972 QueryResult result = WorldDatabase.Query("SELECT level, class, basehp0, basehp1, basehp2, basemana, basearmor, attackpower, rangedattackpower, damage_base, damage_exp1, damage_exp2 FROM creature_classlevelstats");
9973
9974 if (!result)
9975 {
9976 LOG_WARN("server.loading", ">> Loaded 0 creature base stats. DB table `creature_classlevelstats` is empty.");
9977 LOG_INFO("server.loading", " ");
9978 return;
9979 }
9980
9981 uint32 count = 0;
9982 do
9983 {
9984 Field* fields = result->Fetch();
9985
9986 uint8 Level = fields[0].Get<uint8>();
9987 uint8 Class = fields[1].Get<uint8>();
9988
9989 if (!Class || ((1 << (Class - 1)) & CLASSMASK_ALL_CREATURES) == 0)
9990 LOG_ERROR("sql.sql", "Creature base stats for level {} has invalid class {}", Level, Class);
9991
9992 CreatureBaseStats stats;
9993
9994 for (uint8 i = 0; i < MAX_EXPANSIONS; ++i)
9995 {
9996 stats.BaseHealth[i] = fields[2 + i].Get<uint32>();
9997
9998 if (stats.BaseHealth[i] == 0)
9999 {
10000 LOG_ERROR("sql.sql", "Creature base stats for class {}, level {} has invalid zero base HP[{}] - set to 1", Class, Level, i);
10001 stats.BaseHealth[i] = 1;
10002 }
10003
10004 // xinef: if no data is available, get them from lower expansions
10005 if (stats.BaseHealth[i] <= 1)
10006 {
10007 for (uint8 j = i; j > 0;)
10008 {
10009 --j;
10010 if (stats.BaseHealth[j] > 1)
10011 {
10012 stats.BaseHealth[i] = stats.BaseHealth[j];
10013 break;
10014 }
10015 }
10016 }
10017
10018 stats.BaseDamage[i] = fields[9 + i].Get<float>();
10019 if (stats.BaseDamage[i] < 0.0f)
10020 {
10021 LOG_ERROR("sql.sql", "Creature base stats for class {}, level {} has invalid negative base damage[{}] - set to 0.0", Class, Level, i);
10022 stats.BaseDamage[i] = 0.0f;
10023 }
10024 }
10025
10026 stats.BaseMana = fields[5].Get<uint32>();
10027 stats.BaseArmor = fields[6].Get<uint32>();
10028
10029 stats.AttackPower = fields[7].Get<uint32>();
10030 stats.RangedAttackPower = fields[8].Get<uint32>();
10031
10033
10034 ++count;
10035 } while (result->NextRow());
10036
10037 CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
10038 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
10039 {
10040 for (uint16 lvl = itr->second.minlevel; lvl <= itr->second.maxlevel; ++lvl)
10041 {
10042 if (_creatureBaseStatsStore.find(MAKE_PAIR16(lvl, itr->second.unit_class)) == _creatureBaseStatsStore.end())
10043 LOG_ERROR("sql.sql", "Missing base stats for creature class {} level {}", itr->second.unit_class, lvl);
10044 }
10045 }
10046
10047 LOG_INFO("server.loading", ">> Loaded {} Creature Base Stats in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10048 LOG_INFO("server.loading", " ");
10049}
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 ( )
8341{
8342 LoadQuestRelationsHelper(_creatureQuestInvolvedRelations, "creature_questender", false, false);
8343
8344 for (QuestRelations::iterator itr = _creatureQuestInvolvedRelations.begin(); itr != _creatureQuestInvolvedRelations.end(); ++itr)
8345 {
8346 CreatureTemplate const* cInfo = GetCreatureTemplate(itr->first);
8347 if (!cInfo)
8348 LOG_ERROR("sql.sql", "Table `creature_questender` have data for not existed creature entry ({}) and existed quest {}", itr->first, itr->second);
8349 else if (!(cInfo->npcflag & UNIT_NPC_FLAG_QUESTGIVER))
8350 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);
8351 }
8352}
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:316
void LoadQuestRelationsHelper(QuestRelations &map, std::string const &table, bool starter, bool go)
Definition ObjectMgr.cpp:8253

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadCreatureQuestItems()

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

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
@ RANDOM_MOTION_TYPE
Definition MotionMaster.h:40
@ CONFIG_CALCULATE_CREATURE_ZONE_AREA_DATA
Definition WorldConfig.h:111
@ WORLD_UPD_CREATURE_ZONE_AREA_DATA
Definition WorldDatabase.h:115
EquipmentInfo const * GetEquipmentInfo(uint32 entry, int8 &id)
Definition ObjectMgr.cpp:1457
uint32 ScriptId
Definition CreatureData.h:393
bool HasFlagsExtra(uint32 flag) const
Definition CreatureData.h:283
bool IsRaid() const
Definition DBCStructure.h:1355

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

◆ LoadCreatureSparring()

void ObjectMgr::LoadCreatureSparring ( )
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 ( )
5752{
5754
5755 std::set<uint32> evt_scripts;
5756 // Load all possible script entries from gameobjects
5757 GameObjectTemplateContainer const* gotc = sObjectMgr->GetGameObjectTemplates();
5758 for (GameObjectTemplateContainer::const_iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
5759 if (uint32 eventId = itr->second.GetEventScriptId())
5760 evt_scripts.insert(eventId);
5761
5762 // Load all possible script entries from spells
5763 for (uint32 i = 1; i < sSpellMgr->GetSpellInfoStoreSize(); ++i)
5764 if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(i))
5765 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
5766 if (spell->Effects[j].Effect == SPELL_EFFECT_SEND_EVENT)
5767 if (spell->Effects[j].MiscValue)
5768 evt_scripts.insert(spell->Effects[j].MiscValue);
5769
5770 for (std::size_t path_idx = 0; path_idx < sTaxiPathNodesByPath.size(); ++path_idx)
5771 {
5772 for (std::size_t node_idx = 0; node_idx < sTaxiPathNodesByPath[path_idx].size(); ++node_idx)
5773 {
5774 TaxiPathNodeEntry const* node = sTaxiPathNodesByPath[path_idx][node_idx];
5775
5776 if (node->arrivalEventID)
5777 evt_scripts.insert(node->arrivalEventID);
5778
5779 if (node->departureEventID)
5780 evt_scripts.insert(node->departureEventID);
5781 }
5782 }
5783
5784 // Then check if all scripts are in above list of possible script entries
5785 for (ScriptMapMap::const_iterator itr = sEventScripts.begin(); itr != sEventScripts.end(); ++itr)
5786 {
5787 std::set<uint32>::const_iterator itr2 = evt_scripts.find(itr->first);
5788 if (itr2 == evt_scripts.end())
5789 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 {}",
5790 itr->first, SPELL_EFFECT_SEND_EVENT);
5791 }
5792}
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:5409
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 ( )
7633{
7634 uint32 oldMSTime = getMSTime();
7635
7636 QueryResult result = WorldDatabase.Query("SELECT level, basexp FROM exploration_basexp");
7637
7638 if (!result)
7639 {
7640 LOG_WARN("server.loading", ">> Loaded 0 BaseXP definitions. DB table `exploration_basexp` is empty.");
7641 LOG_INFO("server.loading", " ");
7642 return;
7643 }
7644
7645 uint32 count = 0;
7646
7647 do
7648 {
7649 Field* fields = result->Fetch();
7650 uint8 level = fields[0].Get<uint8>();
7651 uint32 basexp = fields[1].Get<int32>();
7652 _baseXPTable[level] = basexp;
7653 ++count;
7654 } while (result->NextRow());
7655
7656 LOG_INFO("server.loading", ">> Loaded {} BaseXP Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7657 LOG_INFO("server.loading", " ");
7658}
std::int32_t int32
Definition Define.h:103

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

◆ LoadFactionChangeAchievements()

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

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 ( )
8741{
8742 uint32 oldMSTime = getMSTime();
8743
8744 if (sObjectMgr->GetGameObjectTemplates()->empty())
8745 {
8746 LOG_WARN("server.loading", ">> Loaded 0 GameObjects for quests");
8747 LOG_INFO("server.loading", " ");
8748 return;
8749 }
8750
8751 uint32 count = 0;
8752
8753 // collect GO entries for GO that must activated
8754 GameObjectTemplateContainer* gotc = const_cast<GameObjectTemplateContainer*>(sObjectMgr->GetGameObjectTemplates());
8755 for (GameObjectTemplateContainer::iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
8756 {
8757 itr->second.IsForQuests = false;
8758 switch (itr->second.type)
8759 {
8761 itr->second.IsForQuests = true;
8762 ++count;
8763 break;
8765 {
8766 // scan GO chest with loot including quest items
8767 uint32 loot_id = (itr->second.GetLootId());
8768
8769 // find quest loot for GO
8770 if (itr->second.chest.questId || LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
8771 {
8772 itr->second.IsForQuests = true;
8773 ++count;
8774 }
8775 break;
8776 }
8778 {
8779 if (itr->second._generic.questID > 0) //quests objects
8780 {
8781 itr->second.IsForQuests = true;
8782 ++count;
8783 }
8784 break;
8785 }
8787 {
8788 if (itr->second.spellFocus.questID > 0) //quests objects
8789 {
8790 itr->second.IsForQuests = true;
8791 ++count;
8792 }
8793 break;
8794 }
8796 {
8797 if (itr->second.goober.questId > 0) //quests objects
8798 {
8799 itr->second.IsForQuests = true;
8800 ++count;
8801 }
8802 break;
8803 }
8804 default:
8805 break;
8806 }
8807 }
8808
8809 LOG_INFO("server.loading", ">> Loaded {} GameObjects for quests in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8810 LOG_INFO("server.loading", " ");
8811}
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 ( )
7277{
7278 uint32 oldMSTime = getMSTime();
7279
7280 _gameObjectLocaleStore.clear(); // need for reload case
7281
7282 // 0 1 2 3
7283 QueryResult result = WorldDatabase.Query("SELECT entry, locale, name, castBarCaption FROM gameobject_template_locale");
7284 if (!result)
7285 return;
7286
7287 do
7288 {
7289 Field* fields = result->Fetch();
7290
7291 uint32 ID = fields[0].Get<uint32>();
7292
7293 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
7294 if (locale == LOCALE_enUS)
7295 continue;
7296
7298 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
7299 AddLocaleString(fields[3].Get<std::string>(), locale, data.CastBarCaption);
7300 } while (result->NextRow());
7301
7302 LOG_INFO("server.loading", ">> Loaded {} Gameobject Locale Strings in {} ms", (uint32)_gameObjectLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
7303}
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 ( )
8313{
8314 LoadQuestRelationsHelper(_goQuestInvolvedRelations, "gameobject_questender", false, true);
8315
8316 for (QuestRelations::iterator itr = _goQuestInvolvedRelations.begin(); itr != _goQuestInvolvedRelations.end(); ++itr)
8317 {
8318 GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
8319 if (!goInfo)
8320 LOG_ERROR("sql.sql", "Table `gameobject_questender` have data for not existed gameobject entry ({}) and existed quest {}", itr->first, itr->second);
8321 else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
8322 LOG_ERROR("sql.sql", "Table `gameobject_questender` have data gameobject entry ({}) for quest {}, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
8323 }
8324}

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameObjectQuestItems()

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

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

◆ LoadGameobjectQuestStarters()

void ObjectMgr::LoadGameobjectQuestStarters ( )
8299{
8300 LoadQuestRelationsHelper(_goQuestRelations, "gameobject_queststarter", true, true);
8301
8302 for (QuestRelations::iterator itr = _goQuestRelations.begin(); itr != _goQuestRelations.end(); ++itr)
8303 {
8304 GameObjectTemplate const* goInfo = GetGameObjectTemplate(itr->first);
8305 if (!goInfo)
8306 LOG_ERROR("sql.sql", "Table `gameobject_queststarter` have data for not existed gameobject entry ({}) and existed quest {}", itr->first, itr->second);
8307 else if (goInfo->type != GAMEOBJECT_TYPE_QUESTGIVER)
8308 LOG_ERROR("sql.sql", "Table `gameobject_queststarter` have data gameobject entry ({}) for quest {}, but GO is not GAMEOBJECT_TYPE_QUESTGIVER", itr->first, itr->second);
8309 }
8310}

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
@ GAMEOBJECT_TYPE_TRAP
Definition SharedDefines.h:1566
@ CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA
Definition WorldConfig.h:112
@ WORLD_UPD_GAMEOBJECT_ZONE_AREA_DATA
Definition WorldDatabase.h:116
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition MapMgr.h:90
uint32 ScriptId
Definition GameObjectData.h:707

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

◆ LoadGameObjectTemplate()

void ObjectMgr::LoadGameObjectTemplate ( )
7365{
7366 uint32 oldMSTime = getMSTime();
7367
7368 // 0 1 2 3 4 5 6 7
7369 QueryResult result = WorldDatabase.Query("SELECT entry, type, displayId, name, IconName, castBarCaption, unk1, size, "
7370 // 8 9 10 11 12 13 14 15 16 17 18 19 20
7371 "Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12, "
7372 // 21 22 23 24 25 26 27 28 29 30 31 32 33
7373 "Data13, Data14, Data15, Data16, Data17, Data18, Data19, Data20, Data21, Data22, Data23, AIName, ScriptName "
7374 "FROM gameobject_template");
7375
7376 if (!result)
7377 {
7378 LOG_WARN("server.loading", ">> Loaded 0 gameobject definitions. DB table `gameobject_template` is empty.");
7379 LOG_INFO("server.loading", " ");
7380 return;
7381 }
7382
7383 _gameObjectTemplateStore.rehash(result->GetRowCount());
7384 uint32 count = 0;
7385 do
7386 {
7387 Field* fields = result->Fetch();
7388
7389 uint32 entry = fields[0].Get<uint32>();
7390
7392
7393 got.entry = entry;
7394 got.type = uint32(fields[1].Get<uint8>());
7395 got.displayId = fields[2].Get<uint32>();
7396 got.name = fields[3].Get<std::string>();
7397 got.IconName = fields[4].Get<std::string>();
7398 got.castBarCaption = fields[5].Get<std::string>();
7399 got.unk1 = fields[6].Get<std::string>();
7400 got.size = fields[7].Get<float>();
7401
7402 for (uint8 i = 0; i < MAX_GAMEOBJECT_DATA; ++i)
7403 got.raw.data[i] = fields[8 + i].Get<int32>(); // data1 and data6 can be -1
7404
7405 got.AIName = fields[32].Get<std::string>();
7406 got.ScriptId = GetScriptId(fields[33].Get<std::string>());
7407 got.IsForQuests = false;
7408
7409 // Checks
7410 if (!got.AIName.empty() && !sGameObjectAIRegistry->HasItem(got.AIName))
7411 {
7412 LOG_ERROR("sql.sql", "GameObject (Entry: {}) has non-registered `AIName` '{}' set, removing", got.entry, got.AIName);
7413 }
7414
7415 switch (got.type)
7416 {
7417 case GAMEOBJECT_TYPE_DOOR: //0
7418 {
7419 if (got.door.lockId)
7420 CheckGOLockId(&got, got.door.lockId, 1);
7421 CheckGONoDamageImmuneId(&got, got.door.noDamageImmune, 3);
7422 break;
7423 }
7424 case GAMEOBJECT_TYPE_BUTTON: //1
7425 {
7426 if (got.button.lockId)
7427 CheckGOLockId(&got, got.button.lockId, 1);
7428 CheckGONoDamageImmuneId(&got, got.button.noDamageImmune, 4);
7429 break;
7430 }
7432 {
7433 if (got.questgiver.lockId)
7434 CheckGOLockId(&got, got.questgiver.lockId, 0);
7435 CheckGONoDamageImmuneId(&got, got.questgiver.noDamageImmune, 5);
7436 break;
7437 }
7438 case GAMEOBJECT_TYPE_CHEST: //3
7439 {
7440 if (got.chest.lockId)
7441 CheckGOLockId(&got, got.chest.lockId, 0);
7442
7443 CheckGOConsumable(&got, got.chest.consumable, 3);
7444
7445 if (got.chest.linkedTrapId) // linked trap
7446 CheckGOLinkedTrapId(&got, got.chest.linkedTrapId, 7);
7447 break;
7448 }
7449 case GAMEOBJECT_TYPE_TRAP: //6
7450 {
7451 if (got.trap.lockId)
7452 CheckGOLockId(&got, got.trap.lockId, 0);
7453 break;
7454 }
7455 case GAMEOBJECT_TYPE_CHAIR: //7
7456 CheckAndFixGOChairHeightId(&got, got.chair.height, 1);
7457 break;
7459 {
7460 if (got.spellFocus.focusId)
7461 {
7462 if (!sSpellFocusObjectStore.LookupEntry(got.spellFocus.focusId))
7463 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data0={} but SpellFocus (Id: {}) not exist.",
7464 entry, got.type, got.spellFocus.focusId, got.spellFocus.focusId);
7465 }
7466
7467 if (got.spellFocus.linkedTrapId) // linked trap
7468 CheckGOLinkedTrapId(&got, got.spellFocus.linkedTrapId, 2);
7469 break;
7470 }
7471 case GAMEOBJECT_TYPE_GOOBER: //10
7472 {
7473 if (got.goober.lockId)
7474 CheckGOLockId(&got, got.goober.lockId, 0);
7475
7476 CheckGOConsumable(&got, got.goober.consumable, 3);
7477
7478 if (got.goober.pageId) // pageId
7479 {
7480 if (!GetPageText(got.goober.pageId))
7481 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data7={} but PageText (Entry {}) not exist.",
7482 entry, got.type, got.goober.pageId, got.goober.pageId);
7483 }
7484 CheckGONoDamageImmuneId(&got, got.goober.noDamageImmune, 11);
7485 if (got.goober.linkedTrapId) // linked trap
7486 CheckGOLinkedTrapId(&got, got.goober.linkedTrapId, 12);
7487 break;
7488 }
7490 {
7491 if (got.areadamage.lockId)
7492 CheckGOLockId(&got, got.areadamage.lockId, 0);
7493 break;
7494 }
7495 case GAMEOBJECT_TYPE_CAMERA: //13
7496 {
7497 if (got.camera.lockId)
7498 CheckGOLockId(&got, got.camera.lockId, 0);
7499 break;
7500 }
7502 {
7503 if (got.moTransport.taxiPathId)
7504 {
7505 if (got.moTransport.taxiPathId >= sTaxiPathNodesByPath.size() || sTaxiPathNodesByPath[got.moTransport.taxiPathId].empty())
7506 LOG_ERROR("sql.sql", "GameObject (Entry: {} GoType: {}) have data0={} but TaxiPath (Id: {}) not exist.",
7507 entry, got.type, got.moTransport.taxiPathId, got.moTransport.taxiPathId);
7508 }
7509 if (uint32 transportMap = got.moTransport.mapID)
7510 _transportMaps.insert(transportMap);
7511 break;
7512 }
7514 break;
7516 {
7517 // always must have spell
7518 CheckGOSpellId(&got, got.spellcaster.spellId, 0);
7519 break;
7520 }
7521 case GAMEOBJECT_TYPE_FLAGSTAND: //24
7522 {
7523 if (got.flagstand.lockId)
7524 CheckGOLockId(&got, got.flagstand.lockId, 0);
7525 CheckGONoDamageImmuneId(&got, got.flagstand.noDamageImmune, 5);
7526 break;
7527 }
7529 {
7530 if (got.fishinghole.lockId)
7531 CheckGOLockId(&got, got.fishinghole.lockId, 4);
7532 break;
7533 }
7534 case GAMEOBJECT_TYPE_FLAGDROP: //26
7535 {
7536 if (got.flagdrop.lockId)
7537 CheckGOLockId(&got, got.flagdrop.lockId, 0);
7538 CheckGONoDamageImmuneId(&got, got.flagdrop.noDamageImmune, 3);
7539 break;
7540 }
7542 CheckAndFixGOChairHeightId(&got, got.barberChair.chairheight, 0);
7543 break;
7544 }
7545
7546 ++count;
7547 } while (result->NextRow());
7548
7549 LOG_INFO("server.loading", ">> Loaded {} Game Object Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7550 LOG_INFO("server.loading", " ");
7551}
DBCStorage< SpellFocusObjectEntry > sSpellFocusObjectStore(SpellFocusObjectfmt)
#define sGameObjectAIRegistry
Definition GameObjectAIFactory.h:49
void CheckGONoDamageImmuneId(GameObjectTemplate *goTemplate, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7345
void CheckGOSpellId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7324
void CheckAndFixGOChairHeightId(GameObjectTemplate const *goInfo, uint32 const &dataN, uint32 N)
Definition ObjectMgr.cpp:7333
void CheckGOConsumable(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7354
void CheckGOLinkedTrapId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7314
void CheckGOLockId(GameObjectTemplate const *goInfo, uint32 dataN, uint32 N)
Definition ObjectMgr.cpp:7305
@ 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:5993
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 ( )
7554{
7555 uint32 oldMSTime = getMSTime();
7556
7557 // 0 1 2 3 4 5 6 7 8
7558 QueryResult result = WorldDatabase.Query("SELECT entry, faction, flags, mingold, maxgold, artkit0, artkit1, artkit2, artkit3 FROM gameobject_template_addon");
7559
7560 if (!result)
7561 {
7562 LOG_WARN("server.loading", ">> Loaded 0 gameobject template addon definitions. DB table `gameobject_template_addon` is empty.");
7563 LOG_INFO("server.loading", " ");
7564 return;
7565 }
7566
7567 uint32 count = 0;
7568 do
7569 {
7570 Field* fields = result->Fetch();
7571
7572 uint32 entry = fields[0].Get<uint32>();
7573
7574 GameObjectTemplate const* got = sObjectMgr->GetGameObjectTemplate(entry);
7575 if (!got)
7576 {
7577 LOG_ERROR("sql.sql",
7578 "GameObject template (Entry: {}) does not exist but has a record in `gameobject_template_addon`",
7579 entry);
7580 continue;
7581 }
7582
7584 gameObjectAddon.faction = uint32(fields[1].Get<uint16>());
7585 gameObjectAddon.flags = fields[2].Get<uint32>();
7586 gameObjectAddon.mingold = fields[3].Get<uint32>();
7587 gameObjectAddon.maxgold = fields[4].Get<uint32>();
7588
7589 for (uint32 i = 0; i < gameObjectAddon.artKits.size(); i++)
7590 {
7591 uint32 artKitID = fields[5 + i].Get<uint32>();
7592 if (!artKitID)
7593 continue;
7594
7595 if (!sGameObjectArtKitStore.LookupEntry(artKitID))
7596 {
7597 LOG_ERROR("sql.sql", "GameObject (Entry: {}) has invalid `artkit{}` {} defined, set to zero instead.", entry, i, artKitID);
7598 continue;
7599 }
7600
7601 gameObjectAddon.artKits[i] = artKitID;
7602 }
7603
7604 // checks
7605 if (gameObjectAddon.faction && !sFactionTemplateStore.LookupEntry(gameObjectAddon.faction))
7606 LOG_ERROR("sql.sql",
7607 "GameObject (Entry: {}) has invalid faction ({}) defined in `gameobject_template_addon`.",
7608 entry, gameObjectAddon.faction);
7609
7610 if (gameObjectAddon.maxgold > 0)
7611 {
7612 switch (got->type)
7613 {
7616 break;
7617 default:
7618 LOG_ERROR("sql.sql",
7619 "GameObject (Entry {} GoType: {}) cannot be looted but has maxgold set in `gameobject_template_addon`.",
7620 entry, got->type);
7621 break;
7622 }
7623 }
7624
7625 ++count;
7626 } while (result->NextRow());
7627
7628 LOG_INFO("server.loading", ">> Loaded {} Game Object Template Addons in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7629 LOG_INFO("server.loading", " ");
7630}
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 ( )
9095{
9096 uint32 oldMSTime = getMSTime();
9097
9098 _gameTeleStore.clear(); // for reload case
9099
9100 // 0 1 2 3 4 5 6
9101 QueryResult result = WorldDatabase.Query("SELECT id, position_x, position_y, position_z, orientation, map, name FROM game_tele");
9102
9103 if (!result)
9104 {
9105 LOG_WARN("server.loading", ">> Loaded 0 GameTeleports. DB table `game_tele` is empty!");
9106 LOG_INFO("server.loading", " ");
9107 return;
9108 }
9109
9110 uint32 count = 0;
9111
9112 do
9113 {
9114 Field* fields = result->Fetch();
9115
9116 uint32 id = fields[0].Get<uint32>();
9117
9118 GameTele gt;
9119
9120 gt.position_x = fields[1].Get<float>();
9121 gt.position_y = fields[2].Get<float>();
9122 gt.position_z = fields[3].Get<float>();
9123 gt.orientation = fields[4].Get<float>();
9124 gt.mapId = fields[5].Get<uint16>();
9125 gt.name = fields[6].Get<std::string>();
9126
9127 if (!MapMgr::IsValidMapCoord(gt.mapId, gt.position_x, gt.position_y, gt.position_z, gt.orientation))
9128 {
9129 LOG_ERROR("sql.sql", "Wrong position for id {} (name: {}) in `game_tele` table, ignoring.", id, gt.name);
9130 continue;
9131 }
9132
9133 if (!Utf8toWStr(gt.name, gt.wnameLow))
9134 {
9135 LOG_ERROR("sql.sql", "Wrong UTF8 name for id {} in `game_tele` table, ignoring.", id);
9136 continue;
9137 }
9138
9139 wstrToLower(gt.wnameLow);
9140
9141 _gameTeleStore[id] = gt;
9142
9143 ++count;
9144 } while (result->NextRow());
9145
9146 LOG_INFO("server.loading", ">> Loaded {} GameTeleports in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9147 LOG_INFO("server.loading", " ");
9148}
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 ( )
9511{
9512 uint32 oldMSTime = getMSTime();
9513
9514 _gossipMenusStore.clear();
9515
9516 QueryResult result = WorldDatabase.Query("SELECT MenuID, TextID FROM gossip_menu");
9517
9518 if (!result)
9519 {
9520 LOG_WARN("server.loading", ">> Loaded 0 gossip_menu entries. DB table `gossip_menu` is empty!");
9521 LOG_INFO("server.loading", " ");
9522 return;
9523 }
9524
9525 do
9526 {
9527 Field* fields = result->Fetch();
9528
9529 GossipMenus gMenu;
9530
9531 gMenu.MenuID = fields[0].Get<uint32>();
9532 gMenu.TextID = fields[1].Get<uint32>();
9533
9534 if (!GetGossipText(gMenu.TextID))
9535 {
9536 LOG_ERROR("sql.sql", "Table gossip_menu entry {} are using non-existing TextID {}", gMenu.MenuID, gMenu.TextID);
9537 continue;
9538 }
9539
9540 _gossipMenusStore.insert(GossipMenusContainer::value_type(gMenu.MenuID, gMenu));
9541 } while (result->NextRow());
9542
9543 LOG_INFO("server.loading", ">> Loaded {} gossip_menu entries in {} ms", (uint32)_gossipMenusStore.size(), GetMSTimeDiffToNow(oldMSTime));
9544 LOG_INFO("server.loading", " ");
9545}
GossipText const * GetGossipText(uint32 Text_ID) const
Definition ObjectMgr.cpp:6171
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 ( )
9548{
9549 uint32 oldMSTime = getMSTime();
9550
9551 _gossipMenuItemsStore.clear();
9552
9553 QueryResult result = WorldDatabase.Query(
9554 // 0 1 2 3 4 5 6 7 8 9 10 11 12
9555 "SELECT MenuID, OptionID, OptionIcon, OptionText, OptionBroadcastTextID, OptionType, OptionNpcFlag, ActionMenuID, ActionPoiID, BoxCoded, BoxMoney, BoxText, BoxBroadcastTextID "
9556 "FROM gossip_menu_option ORDER BY MenuID, OptionID");
9557
9558 if (!result)
9559 {
9560 LOG_WARN("server.loading", ">> Loaded 0 gossip_menu_option IDs. DB table `gossip_menu_option` is empty!");
9561 LOG_INFO("server.loading", " ");
9562 return;
9563 }
9564
9565 do
9566 {
9567 Field* fields = result->Fetch();
9568
9569 GossipMenuItems gMenuItem;
9570
9571 gMenuItem.MenuID = fields[0].Get<uint32>();
9572 gMenuItem.OptionID = fields[1].Get<uint16>();
9573 gMenuItem.OptionIcon = fields[2].Get<uint32>();
9574 gMenuItem.OptionText = fields[3].Get<std::string>();
9575 gMenuItem.OptionBroadcastTextID = fields[4].Get<uint32>();
9576 gMenuItem.OptionType = fields[5].Get<uint8>();
9577 gMenuItem.OptionNpcFlag = fields[6].Get<uint32>();
9578 gMenuItem.ActionMenuID = fields[7].Get<uint32>();
9579 gMenuItem.ActionPoiID = fields[8].Get<uint32>();
9580 gMenuItem.BoxCoded = fields[9].Get<bool>();
9581 gMenuItem.BoxMoney = fields[10].Get<uint32>();
9582 gMenuItem.BoxText = fields[11].Get<std::string>();
9583 gMenuItem.BoxBroadcastTextID = fields[12].Get<uint32>();
9584
9585 if (gMenuItem.OptionIcon >= GOSSIP_ICON_MAX)
9586 {
9587 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);
9588 gMenuItem.OptionIcon = GOSSIP_ICON_CHAT;
9589 }
9590
9592 {
9593 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has non-existing or incompatible OptionBroadcastTextID {}, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.OptionBroadcastTextID);
9594 gMenuItem.OptionBroadcastTextID = 0;
9595 }
9596
9597 if (gMenuItem.OptionType >= GOSSIP_OPTION_MAX)
9598 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);
9599
9600 if (gMenuItem.ActionPoiID && !GetPointOfInterest(gMenuItem.ActionPoiID))
9601 {
9602 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} use non-existing ActionPoiID {}, ignoring", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.ActionPoiID);
9603 gMenuItem.ActionPoiID = 0;
9604 }
9605
9606 if (gMenuItem.BoxBroadcastTextID && !GetBroadcastText(gMenuItem.BoxBroadcastTextID))
9607 {
9608 LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu {}, id {} has non-existing or incompatible BoxBroadcastTextID {}, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.BoxBroadcastTextID);
9609 gMenuItem.BoxBroadcastTextID = 0;
9610 }
9611
9612 _gossipMenuItemsStore.insert(GossipMenuItemsContainer::value_type(gMenuItem.MenuID, gMenuItem));
9613 } while (result->NextRow());
9614
9615 LOG_INFO("server.loading", ">> Loaded {} gossip_menu_option entries in {} ms", uint32(_gossipMenuItemsStore.size()), GetMSTimeDiffToNow(oldMSTime));
9616 LOG_INFO("server.loading", " ");
9617}
@ 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 ( )
6180{
6181 uint32 oldMSTime = getMSTime();
6182
6183 QueryResult result = WorldDatabase.Query("SELECT ID, "
6184 "text0_0, text0_1, BroadcastTextID0, lang0, Probability0, em0_0, em0_1, em0_2, em0_3, em0_4, em0_5, "
6185 "text1_0, text1_1, BroadcastTextID1, lang1, Probability1, em1_0, em1_1, em1_2, em1_3, em1_4, em1_5, "
6186 "text2_0, text2_1, BroadcastTextID2, lang2, Probability2, em2_0, em2_1, em2_2, em2_3, em2_4, em2_5, "
6187 "text3_0, text3_1, BroadcastTextID3, lang3, Probability3, em3_0, em3_1, em3_2, em3_3, em3_4, em3_5, "
6188 "text4_0, text4_1, BroadcastTextID4, lang4, Probability4, em4_0, em4_1, em4_2, em4_3, em4_4, em4_5, "
6189 "text5_0, text5_1, BroadcastTextID5, lang5, Probability5, em5_0, em5_1, em5_2, em5_3, em5_4, em5_5, "
6190 "text6_0, text6_1, BroadcastTextID6, lang6, Probability6, em6_0, em6_1, em6_2, em6_3, em6_4, em6_5, "
6191 "text7_0, text7_1, BroadcastTextID7, lang7, Probability7, em7_0, em7_1, em7_2, em7_3, em7_4, em7_5 "
6192 "FROM npc_text");
6193
6194 if (!result)
6195 {
6196 LOG_WARN("server.loading", ">> Loaded 0 npc texts, table is empty!");
6197 LOG_INFO("server.loading", " ");
6198 return;
6199 }
6200
6201 _gossipTextStore.rehash(result->GetRowCount());
6202
6203 uint32 count = 0;
6204 uint8 cic;
6205
6206 do
6207 {
6208 cic = 0;
6209
6210 Field* fields = result->Fetch();
6211
6212 uint32 id = fields[cic++].Get<uint32>();
6213 if (!id)
6214 {
6215 LOG_ERROR("sql.sql", "Table `npc_text` has record wit reserved id 0, ignore.");
6216 continue;
6217 }
6218
6219 GossipText& gText = _gossipTextStore[id];
6220
6221 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6222 {
6223 gText.Options[i].Text_0 = fields[cic++].Get<std::string>();
6224 gText.Options[i].Text_1 = fields[cic++].Get<std::string>();
6225 gText.Options[i].BroadcastTextID = fields[cic++].Get<uint32>();
6226 gText.Options[i].Language = fields[cic++].Get<uint8>();
6227 gText.Options[i].Probability = fields[cic++].Get<float>();
6228
6229 for (uint8 j = 0; j < MAX_GOSSIP_TEXT_EMOTES; ++j)
6230 {
6231 gText.Options[i].Emotes[j]._Delay = fields[cic++].Get<uint16>();
6232 gText.Options[i].Emotes[j]._Emote = fields[cic++].Get<uint16>();
6233 }
6234 }
6235
6236 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; i++)
6237 {
6238 if (gText.Options[i].BroadcastTextID)
6239 {
6241 {
6242 LOG_ERROR("sql.sql", "GossipText (Id: {}) in table `npc_text` has non-existing or incompatible BroadcastTextID{} {}.", id, i, gText.Options[i].BroadcastTextID);
6243 gText.Options[i].BroadcastTextID = 0;
6244 }
6245 }
6246 }
6247
6248 count++;
6249 } while (result->NextRow());
6250
6251 LOG_INFO("server.loading", ">> Loaded {} Npc Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6252 LOG_INFO("server.loading", " ");
6253}
#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 ( )
6087{
6088 uint32 oldMSTime = getMSTime();
6089
6090 // 0 1 2 3
6091 QueryResult result = WorldDatabase.Query("SELECT entry, creditType, creditEntry, lastEncounterDungeon FROM instance_encounters");
6092 if (!result)
6093 {
6094 LOG_WARN("server.loading", ">> Loaded 0 instance encounters, table is empty!");
6095 LOG_INFO("server.loading", " ");
6096 return;
6097 }
6098
6099 uint32 count = 0;
6100 std::map<uint32, DungeonEncounterEntry const*> dungeonLastBosses;
6101 do
6102 {
6103 Field* fields = result->Fetch();
6104 uint32 entry = fields[0].Get<uint32>();
6105 uint8 creditType = fields[1].Get<uint8>();
6106 uint32 creditEntry = fields[2].Get<uint32>();
6107 uint32 lastEncounterDungeon = fields[3].Get<uint16>();
6108 DungeonEncounterEntry const* dungeonEncounter = sDungeonEncounterStore.LookupEntry(entry);
6109 if (!dungeonEncounter)
6110 {
6111 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid encounter id {}, skipped!", entry);
6112 continue;
6113 }
6114
6115 if (lastEncounterDungeon && !sLFGMgr->GetLFGDungeonEntry(lastEncounterDungeon))
6116 {
6117 LOG_ERROR("sql.sql", "Table `instance_encounters` has an encounter {} ({}) marked as final for invalid dungeon id {}, skipped!", entry, dungeonEncounter->encounterName[0], lastEncounterDungeon);
6118 continue;
6119 }
6120
6121 std::map<uint32, DungeonEncounterEntry const*>::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon);
6122 if (lastEncounterDungeon)
6123 {
6124 if (itr != dungeonLastBosses.end())
6125 {
6126 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]);
6127 continue;
6128 }
6129
6130 dungeonLastBosses[lastEncounterDungeon] = dungeonEncounter;
6131 }
6132
6133 switch (creditType)
6134 {
6136 {
6137 CreatureTemplate const* creatureInfo = GetCreatureTemplate(creditEntry);
6138 if (!creatureInfo)
6139 {
6140 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid creature (entry {}) linked to the encounter {} ({}), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
6141 continue;
6142 }
6143 const_cast<CreatureTemplate*>(creatureInfo)->flags_extra |= CREATURE_FLAG_EXTRA_DUNGEON_BOSS;
6144 break;
6145 }
6147 {
6148 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(creditEntry);
6149 if (!spellInfo)
6150 {
6151 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid spell (entry {}) linked to the encounter {} ({}), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
6152 continue;
6153 }
6154 const_cast<SpellInfo*>(spellInfo)->AttributesCu |= SPELL_ATTR0_CU_ENCOUNTER_REWARD;
6155 break;
6156 }
6157 default:
6158 LOG_ERROR("sql.sql", "Table `instance_encounters` has an invalid credit type ({}) for encounter {} ({}), skipped!", creditType, entry, dungeonEncounter->encounterName[0]);
6159 continue;
6160 }
6161
6162 DungeonEncounterList& encounters = _dungeonEncounterStore[MAKE_PAIR32(dungeonEncounter->mapId, dungeonEncounter->difficulty)];
6163 encounters.push_back(new DungeonEncounter(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon));
6164 ++count;
6165 } while (result->NextRow());
6166
6167 LOG_INFO("server.loading", ">> Loaded {} Instance Encounters in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6168 LOG_INFO("server.loading", " ");
6169}
@ 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 ( )
6036{
6037 uint32 oldMSTime = getMSTime();
6038
6039 // 0 1 2 4
6040 QueryResult result = WorldDatabase.Query("SELECT map, parent, script, allowMount FROM instance_template");
6041
6042 if (!result)
6043 {
6044 LOG_WARN("server.loading", ">> Loaded 0 instance templates. DB table `instance_template` is empty!");
6045 LOG_INFO("server.loading", " ");
6046 return;
6047 }
6048
6049 uint32 count = 0;
6050 do
6051 {
6052 Field* fields = result->Fetch();
6053
6054 uint16 mapID = fields[0].Get<uint16>();
6055
6056 if (!MapMgr::IsValidMAP(mapID, true))
6057 {
6058 LOG_ERROR("sql.sql", "ObjectMgr::LoadInstanceTemplate: bad mapid {} for template!", mapID);
6059 continue;
6060 }
6061
6062 InstanceTemplate instanceTemplate;
6063
6064 instanceTemplate.AllowMount = fields[3].Get<bool>();
6065 instanceTemplate.Parent = uint32(fields[1].Get<uint16>());
6066 instanceTemplate.ScriptId = sObjectMgr->GetScriptId(fields[2].Get<std::string>());
6067
6068 _instanceTemplateStore[mapID] = instanceTemplate;
6069
6070 ++count;
6071 } while (result->NextRow());
6072
6073 LOG_INFO("server.loading", ">> Loaded {} Instance Templates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6074 LOG_INFO("server.loading", " ");
6075}
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:837
std::vector< std::string > Description
Definition ItemTemplate.h:839
std::vector< std::string > Name
Definition ItemTemplate.h:838

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

◆ LoadItemSetNameLocales()

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

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

◆ LoadItemSetNames()

void ObjectMgr::LoadItemSetNames ( )
3502{
3503 uint32 oldMSTime = getMSTime();
3504
3505 _itemSetNameStore.clear(); // needed for reload case
3506
3507 std::set<uint32> itemSetItems;
3508
3509 // fill item set member ids
3510 for (uint32 entryId = 0; entryId < sItemSetStore.GetNumRows(); ++entryId)
3511 {
3512 ItemSetEntry const* setEntry = sItemSetStore.LookupEntry(entryId);
3513 if (!setEntry)
3514 continue;
3515
3516 for (uint32 i = 0; i < MAX_ITEM_SET_ITEMS; ++i)
3517 if (setEntry->itemId[i])
3518 itemSetItems.insert(setEntry->itemId[i]);
3519 }
3520
3521 // 0 1 2
3522 QueryResult result = WorldDatabase.Query("SELECT `entry`, `name`, `InventoryType` FROM `item_set_names`");
3523
3524 if (!result)
3525 {
3526 LOG_WARN("server.loading", ">> Loaded 0 item set names. DB table `item_set_names` is empty.");
3527 LOG_INFO("server.loading", " ");
3528 return;
3529 }
3530
3531 _itemSetNameStore.rehash(result->GetRowCount());
3532 uint32 count = 0;
3533
3534 do
3535 {
3536 Field* fields = result->Fetch();
3537
3538 uint32 entry = fields[0].Get<uint32>();
3539 if (itemSetItems.find(entry) == itemSetItems.end())
3540 {
3541 LOG_ERROR("sql.sql", "Item set name (Entry: {}) not found in ItemSet.dbc, data useless.", entry);
3542 continue;
3543 }
3544
3545 ItemSetNameEntry& data = _itemSetNameStore[entry];
3546 data.name = fields[1].Get<std::string>();
3547
3548 uint32 invType = fields[2].Get<uint8>();
3549 if (invType >= MAX_INVTYPE)
3550 {
3551 LOG_ERROR("sql.sql", "Item set name (Entry: {}) has wrong InventoryType value ({})", entry, invType);
3552 invType = INVTYPE_NON_EQUIP;
3553 }
3554
3555 data.InventoryType = invType;
3556 itemSetItems.erase(entry);
3557 ++count;
3558 } while (result->NextRow());
3559
3560 if (!itemSetItems.empty())
3561 {
3562 ItemTemplate const* pProto;
3563 for (std::set<uint32>::iterator itr = itemSetItems.begin(); itr != itemSetItems.end(); ++itr)
3564 {
3565 uint32 entry = *itr;
3566 // add data from item_template if available
3567 pProto = sObjectMgr->GetItemTemplate(entry);
3568 if (pProto)
3569 {
3570 LOG_ERROR("sql.sql", "Item set part (Entry: {}) does not have entry in `item_set_names`, adding data from `item_template`.", entry);
3571 ItemSetNameEntry& data = _itemSetNameStore[entry];
3572 data.name = pProto->Name1;
3573 data.InventoryType = pProto->InventoryType;
3574 ++count;
3575 }
3576 else
3577 LOG_ERROR("sql.sql", "Item set part (Entry: {}) does not have entry in `item_set_names`, set will not display properly.", entry);
3578 }
3579 }
3580
3581 LOG_INFO("server.loading", ">> Loaded {} Item Set Names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3582 LOG_INFO("server.loading", " ");
3583}
DBCStorage< ItemSetEntry > sItemSetStore(ItemSetEntryfmt)
#define MAX_ITEM_SET_ITEMS
Definition DBCStructure.h:1229
@ INVTYPE_NON_EQUIP
Definition ItemTemplate.h:256
#define MAX_INVTYPE
Definition ItemTemplate.h:287
Definition DBCStructure.h:1233
uint32 itemId[MAX_ITEM_SET_ITEMS]
Definition DBCStructure.h:1237
Definition ItemTemplate.h:843
uint32 InventoryType
Definition ItemTemplate.h:845
std::string name
Definition ItemTemplate.h:844
std::string Name1
Definition ItemTemplate.h:624
uint32 InventoryType
Definition ItemTemplate.h:632

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

References _itemTemplateStore, _itemTemplateStoreFast, ALLIANCE, BAG_FAMILY_MASK_CURRENCY_TOKENS, ItemEntry::ClassID, CLASSMASK_ALL_PLAYABLE, CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES, DISABLE_TYPE_SPELL, ItemEntry::DisplayInfoID, Field::Get(), GetItemEnchantMod(), GetItemTemplate(), getMSTime(), GetMSTimeDiffToNow(), GetPageText(), 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, qualityToBuyValueConfig, qualityToSellValueConfig, RACEMASK_ALL_PLAYABLE, 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 ( )
9235{
9236 uint32 oldMSTime = getMSTime();
9237
9238 _mailLevelRewardStore.clear(); // for reload case
9239
9240 // 0 1 2 3
9241 QueryResult result = WorldDatabase.Query("SELECT level, raceMask, mailTemplateId, senderEntry FROM mail_level_reward");
9242
9243 if (!result)
9244 {
9245 LOG_WARN("server.loading", ">> Loaded 0 level dependent mail rewards. DB table `mail_level_reward` is empty.");
9246 LOG_INFO("server.loading", " ");
9247 return;
9248 }
9249
9250 uint32 count = 0;
9251
9252 do
9253 {
9254 Field* fields = result->Fetch();
9255
9256 uint8 level = fields[0].Get<uint8>();
9257 uint32 raceMask = fields[1].Get<uint32>();
9258 uint32 mailTemplateId = fields[2].Get<uint32>();
9259 uint32 senderEntry = fields[3].Get<uint32>();
9260
9261 if (level > MAX_LEVEL)
9262 {
9263 LOG_ERROR("sql.sql", "Table `mail_level_reward` have data for level {} that more supported by client ({}), ignoring.", level, MAX_LEVEL);
9264 continue;
9265 }
9266
9267 if (!(raceMask & RACEMASK_ALL_PLAYABLE))
9268 {
9269 LOG_ERROR("sql.sql", "Table `mail_level_reward` have raceMask ({}) for level {} that not include any player races, ignoring.", raceMask, level);
9270 continue;
9271 }
9272
9273 if (!sMailTemplateStore.LookupEntry(mailTemplateId))
9274 {
9275 LOG_ERROR("sql.sql", "Table `mail_level_reward` have invalid mailTemplateId ({}) for level {} that invalid not include any player races, ignoring.", mailTemplateId, level);
9276 continue;
9277 }
9278
9279 if (!GetCreatureTemplate(senderEntry))
9280 {
9281 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);
9282 continue;
9283 }
9284
9285 _mailLevelRewardStore[level].push_back(MailLevelReward(raceMask, mailTemplateId, senderEntry));
9286
9287 ++count;
9288 } while (result->NextRow());
9289
9290 LOG_INFO("server.loading", ">> Loaded {} Level Dependent Mail Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9291 LOG_INFO("server.loading", " ");
9292}
#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 ( )
8814{
8815 uint32 oldMSTime = getMSTime();
8816
8817 _moduleStringStore.clear(); // for reload case
8818 QueryResult result = WorldDatabase.Query("SELECT module, id, string FROM module_string");
8819 if (!result)
8820 {
8821 LOG_WARN("server.loading", ">> Loaded 0 module strings. DB table `module_string` is empty.");
8822 LOG_INFO("server.loading", " ");
8823 return false;
8824 }
8825
8826 do
8827 {
8828 Field* fields = result->Fetch();
8829
8830 std::string module = fields[0].Get<std::string>();
8831 uint32 id = fields[1].Get<uint32>();
8832
8833 std::pair<std::string, uint32> pairKey = std::make_pair(module, id);
8834 ModuleString& data = _moduleStringStore[pairKey];
8835
8836 AddLocaleString(fields[2].Get<std::string>(), LOCALE_enUS, data.Content);
8837 } while (result->NextRow());
8838
8839 LOG_INFO("server.loading", ">> Loaded {} Module Strings in {} ms", _moduleStringStore.size(), GetMSTimeDiffToNow(oldMSTime));
8840 LOG_INFO("server.loading", " ");
8841
8842 return true;
8843}

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

◆ LoadModuleStringsLocale()

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

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

◆ LoadNPCSpellClickSpells()

void ObjectMgr::LoadNPCSpellClickSpells ( )
8167{
8168 uint32 oldMSTime = getMSTime();
8169
8170 _spellClickInfoStore.clear();
8171 // 0 1 2 3
8172 QueryResult result = WorldDatabase.Query("SELECT npc_entry, spell_id, cast_flags, user_type FROM npc_spellclick_spells");
8173
8174 if (!result)
8175 {
8176 LOG_WARN("server.loading", ">> Loaded 0 spellclick spells. DB table `npc_spellclick_spells` is empty.");
8177 LOG_INFO("server.loading", " ");
8178 return;
8179 }
8180
8181 uint32 count = 0;
8182
8183 do
8184 {
8185 Field* fields = result->Fetch();
8186
8187 uint32 npc_entry = fields[0].Get<uint32>();
8188 CreatureTemplate const* cInfo = GetCreatureTemplate(npc_entry);
8189 if (!cInfo)
8190 {
8191 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown creature_template {}. Skipping entry.", npc_entry);
8192 continue;
8193 }
8194
8195 uint32 spellid = fields[1].Get<uint32>();
8196 SpellInfo const* spellinfo = sSpellMgr->GetSpellInfo(spellid);
8197 if (!spellinfo)
8198 {
8199 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown spellid {}. Skipping entry.", spellid);
8200 continue;
8201 }
8202
8203 uint8 userType = fields[3].Get<uint16>();
8204 if (userType >= SPELL_CLICK_USER_MAX)
8205 LOG_ERROR("sql.sql", "Table npc_spellclick_spells references unknown user type {}. Skipping entry.", uint32(userType));
8206
8207 uint8 castFlags = fields[2].Get<uint8>();
8208 SpellClickInfo info;
8209 info.spellId = spellid;
8210 info.castFlags = castFlags;
8211 info.userType = SpellClickUserTypes(userType);
8212 _spellClickInfoStore.insert(SpellClickInfoContainer::value_type(npc_entry, info));
8213
8214 ++count;
8215 } while (result->NextRow());
8216
8217 // all spellclick data loaded, now we check if there are creatures with NPC_FLAG_SPELLCLICK but with no data
8218 // NOTE: It *CAN* be the other way around: no spellclick flag but with spellclick data, in case of creature-only vehicle accessories
8219 CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates();
8220 for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr)
8221 {
8222 if ((itr->second.npcflag & UNIT_NPC_FLAG_SPELLCLICK) && _spellClickInfoStore.find(itr->second.Entry) == _spellClickInfoStore.end())
8223 {
8224 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);
8225 const_cast<CreatureTemplate*>(&itr->second)->npcflag &= ~UNIT_NPC_FLAG_SPELLCLICK;
8226 }
8227 }
8228
8229 LOG_INFO("server.loading", ">> Loaded {} Spellclick Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8230 LOG_INFO("server.loading", " ");
8231}
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 ( )
6256{
6257 uint32 oldMSTime = getMSTime();
6258
6259 _npcTextLocaleStore.clear(); // need for reload case
6260
6261 QueryResult result = WorldDatabase.Query("SELECT ID, Locale, "
6262 // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
6263 "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 "
6264 "FROM npc_text_locale");
6265
6266 if (!result)
6267 return;
6268
6269 do
6270 {
6271 Field* fields = result->Fetch();
6272
6273 uint32 ID = fields[0].Get<uint32>();
6274
6275 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
6276 if (locale == LOCALE_enUS)
6277 continue;
6278
6280 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6281 {
6282 AddLocaleString(fields[2 + i * 2].Get<std::string>(), locale, data.Text_0[i]);
6283 AddLocaleString(fields[3 + i * 2].Get<std::string>(), locale, data.Text_1[i]);
6284 }
6285 } while (result->NextRow());
6286
6287 LOG_INFO("server.loading", ">> Loaded {} Npc Text Locale Strings in {} ms", (uint32)_npcTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6288}
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 ( )
6003{
6004 uint32 oldMSTime = getMSTime();
6005
6006 _pageTextLocaleStore.clear(); // need for reload case
6007
6008 // 0 1 2
6009 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Text FROM page_text_locale");
6010
6011 if (!result)
6012 {
6013 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text_locale` is empty!");
6014 LOG_INFO("server.loading", " ");
6015 return;
6016 }
6017
6018 do
6019 {
6020 Field* fields = result->Fetch();
6021
6022 uint32 ID = fields[0].Get<uint32>();
6023
6024 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
6025 if (locale == LOCALE_enUS)
6026 continue;
6027
6029 AddLocaleString(fields[2].Get<std::string>(), locale, data.Text);
6030 } while (result->NextRow());
6031
6032 LOG_INFO("server.loading", ">> Loaded {} Page Text Locale Strings in {} ms", (uint32)_pageTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6033}
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 ( )
5953{
5954 uint32 oldMSTime = getMSTime();
5955
5956 // 0 1 2
5957 QueryResult result = WorldDatabase.Query("SELECT ID, Text, NextPageID FROM page_text");
5958
5959 if (!result)
5960 {
5961 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text` is empty!");
5962 LOG_INFO("server.loading", " ");
5963 return;
5964 }
5965
5966 uint32 count = 0;
5967 do
5968 {
5969 Field* fields = result->Fetch();
5970
5971 PageText& pageText = _pageTextStore[fields[0].Get<uint32>()];
5972
5973 pageText.Text = fields[1].Get<std::string>();
5974 pageText.NextPage = fields[2].Get<uint32>();
5975
5976 ++count;
5977 } while (result->NextRow());
5978
5979 for (PageTextContainer::const_iterator itr = _pageTextStore.begin(); itr != _pageTextStore.end(); ++itr)
5980 {
5981 if (itr->second.NextPage)
5982 {
5983 PageTextContainer::const_iterator itr2 = _pageTextStore.find(itr->second.NextPage);
5984 if (itr2 == _pageTextStore.end())
5985 LOG_ERROR("sql.sql", "Page text (Id: {}) has not existing next page (Id: {})", itr->first, itr->second.NextPage);
5986 }
5987 }
5988
5989 LOG_INFO("server.loading", ">> Loaded {} Page Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5990 LOG_INFO("server.loading", " ");
5991}
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 ( )
3742{
3743 uint32 oldMSTime = getMSTime();
3744
3745 // 0 1 2 3 4 5 6 7 8 9 10 11
3746 QueryResult result = WorldDatabase.Query("SELECT creature_entry, level, hp, mana, str, agi, sta, inte, spi, armor, min_dmg, max_dmg FROM pet_levelstats");
3747
3748 if (!result)
3749 {
3750 LOG_WARN("server.loading", ">> Loaded 0 level pet stats definitions. DB table `pet_levelstats` is empty.");
3751 LOG_INFO("server.loading", " ");
3752 return;
3753 }
3754
3755 uint32 count = 0;
3756
3757 do
3758 {
3759 Field* fields = result->Fetch();
3760
3761 uint32 creature_id = fields[0].Get<uint32>();
3762 if (!sObjectMgr->GetCreatureTemplate(creature_id))
3763 {
3764 LOG_ERROR("sql.sql", "Wrong creature id {} in `pet_levelstats` table, ignoring.", creature_id);
3765 continue;
3766 }
3767
3768 uint32 current_level = fields[1].Get<uint8>();
3769 if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
3770 {
3771 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
3772 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `pet_levelstats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
3773 else
3774 {
3775 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `pet_levelstats` table, ignoring.", current_level);
3776 ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
3777 }
3778 continue;
3779 }
3780 else if (current_level < 1)
3781 {
3782 LOG_ERROR("sql.sql", "Wrong (<1) level {} in `pet_levelstats` table, ignoring.", current_level);
3783 continue;
3784 }
3785
3786 PetLevelInfo*& pInfoMapEntry = _petInfoStore[creature_id];
3787
3788 if (!pInfoMapEntry)
3789 pInfoMapEntry = new PetLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
3790
3791 // data for level 1 stored in [0] array element, ...
3792 PetLevelInfo* pLevelInfo = &pInfoMapEntry[current_level - 1];
3793
3794 pLevelInfo->health = fields[2].Get<uint32>();
3795 pLevelInfo->mana = fields[3].Get<uint32>();
3796 pLevelInfo->armor = fields[9].Get<uint32>();
3797 pLevelInfo->min_dmg = fields[10].Get<uint32>();
3798 pLevelInfo->max_dmg = fields[11].Get<uint32>();
3799 for (uint8 i = 0; i < MAX_STATS; i++)
3800 {
3801 pLevelInfo->stats[i] = fields[i + 4].Get<uint32>();
3802 }
3803
3804 ++count;
3805 } while (result->NextRow());
3806
3807 // Fill gaps and check integrity
3808 for (PetLevelInfoContainer::iterator itr = _petInfoStore.begin(); itr != _petInfoStore.end(); ++itr)
3809 {
3810 PetLevelInfo* pInfo = itr->second;
3811
3812 // fatal error if no level 1 data
3813 if (!pInfo || pInfo[0].health == 0)
3814 {
3815 LOG_ERROR("sql.sql", "Creature {} does not have pet stats data for Level 1!", itr->first);
3816 exit(1);
3817 }
3818
3819 // fill level gaps
3820 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
3821 {
3822 if (pInfo[level].health == 0)
3823 {
3824 LOG_ERROR("sql.sql", "Creature {} has no data for Level {} pet stats data, using data of Level {}.", itr->first, level + 1, level);
3825 pInfo[level] = pInfo[level - 1];
3826 }
3827 }
3828 }
3829
3830 LOG_INFO("server.loading", ">> Loaded {} Level Pet Stats Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3831 LOG_INFO("server.loading", " ");
3832}
#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 ( )
7673{
7674 uint32 oldMSTime = getMSTime();
7675 // 0 1 2
7676 QueryResult result = WorldDatabase.Query("SELECT word, entry, half FROM pet_name_generation");
7677
7678 if (!result)
7679 {
7680 LOG_WARN("server.loading", ">> Loaded 0 pet name parts. DB table `pet_name_generation` is empty!");
7681 LOG_INFO("server.loading", " ");
7682 return;
7683 }
7684
7685 uint32 count = 0;
7686
7687 do
7688 {
7689 Field* fields = result->Fetch();
7690 std::string word = fields[0].Get<std::string>();
7691 uint32 entry = fields[1].Get<uint32>();
7692 bool half = fields[2].Get<bool>();
7693 if (half)
7694 _petHalfName1[entry].push_back(word);
7695 else
7696 _petHalfName0[entry].push_back(word);
7697 ++count;
7698 } while (result->NextRow());
7699
7700 LOG_INFO("server.loading", ">> Loaded {} Pet Name Parts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7701 LOG_INFO("server.loading", " ");
7702}

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 ( )
7705{
7706 uint32 oldMSTime = getMSTime();
7707
7708 QueryResult result = CharacterDatabase.Query("SELECT MAX(id) FROM character_pet");
7709 if (result)
7710 {
7711 Field* fields = result->Fetch();
7712 _hiPetNumber = fields[0].Get<uint32>() + 1;
7713 }
7714
7715 LOG_INFO("server.loading", ">> Loaded The Max Pet Number: {} in {} ms", _hiPetNumber - 1, GetMSTimeDiffToNow(oldMSTime));
7716 LOG_INFO("server.loading", " ");
7717}

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

◆ LoadPlayerInfo()

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

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

◆ LoadProfanityNamesFromDBC()

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

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

◆ LoadQuestAreaTriggers()

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

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

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

◆ LoadReferenceVendor()

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

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

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

◆ LoadReservedPlayerNamesDBC()

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

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

◆ LoadScriptNames()

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

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

◆ LoadScripts()

void ObjectMgr::LoadScripts ( ScriptsType  type)
private
5410{
5411 uint32 oldMSTime = getMSTime();
5412
5413 ScriptMapMap* scripts = GetScriptsMapByType(type);
5414 if (!scripts)
5415 return;
5416
5417 std::string tableName = GetScriptsTableNameByType(type);
5418 if (tableName.empty())
5419 return;
5420
5421 if (sScriptMgr->IsScriptScheduled()) // function cannot be called when scripts are in use.
5422 return;
5423
5424 LOG_INFO("server.loading", "Loading {}...", tableName);
5425
5426 scripts->clear(); // need for reload support
5427
5428 bool isSpellScriptTable = (type == SCRIPTS_SPELL);
5429 // 0 1 2 3 4 5 6 7 8 9
5430 QueryResult result = WorldDatabase.Query("SELECT id, delay, command, datalong, datalong2, dataint, x, y, z, o{} FROM {}", isSpellScriptTable ? ", effIndex" : "", tableName);
5431
5432 if (!result)
5433 {
5434 LOG_WARN("server.loading", ">> Loaded 0 script definitions. DB table `{}` is empty!", tableName);
5435 LOG_INFO("server.loading", " ");
5436 return;
5437 }
5438
5439 uint32 count = 0;
5440
5441 do
5442 {
5443 Field* fields = result->Fetch();
5444 ScriptInfo tmp;
5445 tmp.type = type;
5446 tmp.id = fields[0].Get<uint32>();
5447 if (isSpellScriptTable)
5448 tmp.id |= fields[10].Get<uint8>() << 24;
5449 tmp.delay = fields[1].Get<uint32>();
5450 tmp.command = ScriptCommands(fields[2].Get<uint32>());
5451 tmp.Raw.nData[0] = fields[3].Get<uint32>();
5452 tmp.Raw.nData[1] = fields[4].Get<uint32>();
5453 tmp.Raw.nData[2] = fields[5].Get<int32>();
5454 tmp.Raw.fData[0] = fields[6].Get<float>();
5455 tmp.Raw.fData[1] = fields[7].Get<float>();
5456 tmp.Raw.fData[2] = fields[8].Get<float>();
5457 tmp.Raw.fData[3] = fields[9].Get<float>();
5458
5459 // generic command args check
5460 switch (tmp.command)
5461 {
5463 {
5465 {
5466 LOG_ERROR("sql.sql", "Table `{}` has invalid talk type (datalong = {}) in SCRIPT_COMMAND_TALK for script id {}",
5467 tableName, tmp.Talk.ChatType, tmp.id);
5468 continue;
5469 }
5471 {
5472 LOG_ERROR("sql.sql", "Table `{}` has invalid talk text id (dataint = {}) in SCRIPT_COMMAND_TALK for script id {}",
5473 tableName, tmp.Talk.TextID, tmp.id);
5474 continue;
5475 }
5476 break;
5477 }
5478
5480 {
5481 if (!sEmotesStore.LookupEntry(tmp.Emote.EmoteID))
5482 {
5483 LOG_ERROR("sql.sql", "Table `{}` has invalid emote id (datalong = {}) in SCRIPT_COMMAND_EMOTE for script id {}",
5484 tableName, tmp.Emote.EmoteID, tmp.id);
5485 continue;
5486 }
5487 break;
5488 }
5489
5491 {
5492 if (!sMapStore.LookupEntry(tmp.TeleportTo.MapID))
5493 {
5494 LOG_ERROR("sql.sql", "Table `{}` has invalid map (Id: {}) in SCRIPT_COMMAND_TELEPORT_TO for script id {}",
5495 tableName, tmp.TeleportTo.MapID, tmp.id);
5496 continue;
5497 }
5498
5500 {
5501 LOG_ERROR("sql.sql", "Table `{}` has invalid coordinates (X: {} Y: {} Z: {} O: {}) in SCRIPT_COMMAND_TELEPORT_TO for script id {}",
5502 tableName, tmp.TeleportTo.DestX, tmp.TeleportTo.DestY, tmp.TeleportTo.DestZ, tmp.TeleportTo.Orientation, tmp.id);
5503 continue;
5504 }
5505 break;
5506 }
5507
5509 {
5510 Quest const* quest = GetQuestTemplate(tmp.QuestExplored.QuestID);
5511 if (!quest)
5512 {
5513 LOG_ERROR("sql.sql", "Table `{}` has invalid quest (ID: {}) in SCRIPT_COMMAND_QUEST_EXPLORED in `datalong` for script id {}",
5514 tableName, tmp.QuestExplored.QuestID, tmp.id);
5515 continue;
5516 }
5517
5519 {
5520 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.",
5521 tableName, tmp.QuestExplored.QuestID, tmp.id);
5522
5523 // this will prevent quest completing without objective
5524 const_cast<Quest*>(quest)->SetSpecialFlag(QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT);
5525
5526 // continue; - quest objective requirement set and command can be allowed
5527 }
5528
5530 {
5531 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 {}",
5532 tableName, tmp.QuestExplored.Distance, tmp.id);
5533 continue;
5534 }
5535
5537 {
5538 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",
5540 continue;
5541 }
5542
5544 {
5545 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",
5546 tableName, tmp.QuestExplored.Distance, tmp.id, INTERACTION_DISTANCE);
5547 continue;
5548 }
5549
5550 break;
5551 }
5552
5554 {
5556 {
5557 LOG_ERROR("sql.sql", "Table `{}` has invalid creature (Entry: {}) in SCRIPT_COMMAND_KILL_CREDIT for script id {}",
5558 tableName, tmp.KillCredit.CreatureEntry, tmp.id);
5559 continue;
5560 }
5561 break;
5562 }
5563
5565 {
5567 if (!data)
5568 {
5569 LOG_ERROR("sql.sql", "Table `{}` has invalid gameobject (GUID: {}) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5570 tableName, tmp.RespawnGameobject.GOGuid, tmp.id);
5571 continue;
5572 }
5573
5574 GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
5575 if (!info)
5576 {
5577 LOG_ERROR("sql.sql", "Table `{}` has gameobject with invalid entry (GUID: {} Entry: {}) in SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5578 tableName, tmp.RespawnGameobject.GOGuid, data->id, tmp.id);
5579 continue;
5580 }
5581
5582 if (info->type == GAMEOBJECT_TYPE_FISHINGNODE ||
5584 info->type == GAMEOBJECT_TYPE_DOOR ||
5585 info->type == GAMEOBJECT_TYPE_BUTTON ||
5586 info->type == GAMEOBJECT_TYPE_TRAP)
5587 {
5588 LOG_ERROR("sql.sql", "Table `{}` have gameobject type ({}) unsupported by command SCRIPT_COMMAND_RESPAWN_GAMEOBJECT for script id {}",
5589 tableName, info->entry, tmp.id);
5590 continue;
5591 }
5592 break;
5593 }
5594
5596 {
5598 {
5599 LOG_ERROR("sql.sql", "Table `{}` has invalid coordinates (X: {} Y: {} Z: {} O: {}) in SCRIPT_COMMAND_TEMP_SUMMON_CREATURE for script id {}",
5601 continue;
5602 }
5603
5605 if (!GetCreatureTemplate(entry))
5606 {
5607 LOG_ERROR("sql.sql", "Table `{}` has invalid creature (Entry: {}) in SCRIPT_COMMAND_TEMP_SUMMON_CREATURE for script id {}",
5608 tableName, tmp.TempSummonCreature.CreatureEntry, tmp.id);
5609 continue;
5610 }
5611 break;
5612 }
5613
5616 {
5618 if (!data)
5619 {
5620 LOG_ERROR("sql.sql", "Table `{}` has invalid gameobject (GUID: {}) in {} for script id {}",
5621 tableName, tmp.ToggleDoor.GOGuid, GetScriptCommandName(tmp.command), tmp.id);
5622 continue;
5623 }
5624
5625 GameObjectTemplate const* info = GetGameObjectTemplate(data->id);
5626 if (!info)
5627 {
5628 LOG_ERROR("sql.sql", "Table `{}` has gameobject with invalid entry (GUID: {} Entry: {}) in {} for script id {}",
5629 tableName, tmp.ToggleDoor.GOGuid, data->id, GetScriptCommandName(tmp.command), tmp.id);
5630 continue;
5631 }
5632
5633 if (info->type != GAMEOBJECT_TYPE_DOOR)
5634 {
5635 LOG_ERROR("sql.sql", "Table `{}` has gameobject type ({}) non supported by command {} for script id {}",
5636 tableName, info->entry, GetScriptCommandName(tmp.command), tmp.id);
5637 continue;
5638 }
5639
5640 break;
5641 }
5642
5644 {
5645 if (!sSpellMgr->GetSpellInfo(tmp.RemoveAura.SpellID))
5646 {
5647 LOG_ERROR("sql.sql", "Table `{}` using non-existent spell (id: {}) in SCRIPT_COMMAND_REMOVE_AURA for script id {}",
5648 tableName, tmp.RemoveAura.SpellID, tmp.id);
5649 continue;
5650 }
5651 if (tmp.RemoveAura.Flags & ~0x1) // 1 bits (0, 1)
5652 {
5653 LOG_ERROR("sql.sql", "Table `{}` using unknown flags in datalong2 ({}) in SCRIPT_COMMAND_REMOVE_AURA for script id {}",
5654 tableName, tmp.RemoveAura.Flags, tmp.id);
5655 continue;
5656 }
5657 break;
5658 }
5659
5661 {
5662 if (!sSpellMgr->GetSpellInfo(tmp.CastSpell.SpellID))
5663 {
5664 LOG_ERROR("sql.sql", "Table `{}` using non-existent spell (id: {}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5665 tableName, tmp.CastSpell.SpellID, tmp.id);
5666 continue;
5667 }
5668 if (tmp.CastSpell.Flags > 4) // targeting type
5669 {
5670 LOG_ERROR("sql.sql", "Table `{}` using unknown target in datalong2 ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5671 tableName, tmp.CastSpell.Flags, tmp.id);
5672 continue;
5673 }
5674 if (tmp.CastSpell.Flags != 4 && tmp.CastSpell.CreatureEntry & ~0x1) // 1 bit (0, 1)
5675 {
5676 LOG_ERROR("sql.sql", "Table `{}` using unknown flags in dataint ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5677 tableName, tmp.CastSpell.CreatureEntry, tmp.id);
5678 continue;
5679 }
5680 else if (tmp.CastSpell.Flags == 4 && !GetCreatureTemplate(tmp.CastSpell.CreatureEntry))
5681 {
5682 LOG_ERROR("sql.sql", "Table `{}` using invalid creature entry in dataint ({}) in SCRIPT_COMMAND_CAST_SPELL for script id {}",
5683 tableName, tmp.CastSpell.CreatureEntry, tmp.id);
5684 continue;
5685 }
5686 break;
5687 }
5688
5690 {
5692 {
5693 LOG_ERROR("sql.sql", "Table `{}` has nonexistent item (entry: {}) in SCRIPT_COMMAND_CREATE_ITEM for script id {}",
5694 tableName, tmp.CreateItem.ItemEntry, tmp.id);
5695 continue;
5696 }
5697 if (!tmp.CreateItem.Amount)
5698 {
5699 LOG_ERROR("sql.sql", "Table `{}` SCRIPT_COMMAND_CREATE_ITEM but amount is {} for script id {}",
5700 tableName, tmp.CreateItem.Amount, tmp.id);
5701 continue;
5702 }
5703 break;
5704 }
5705 default:
5706 break;
5707 }
5708
5709 if (scripts->find(tmp.id) == scripts->end())
5710 {
5711 ScriptMap emptyMap;
5712 (*scripts)[tmp.id] = emptyMap;
5713 }
5714 (*scripts)[tmp.id].insert(std::pair<uint32, ScriptInfo>(tmp.delay, tmp));
5715
5716 ++count;
5717 } while (result->NextRow());
5718
5719 LOG_INFO("server.loading", ">> Loaded {} script definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5720 LOG_INFO("server.loading", " ");
5721}
@ 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 ( )
5823{
5824 uint32 oldMSTime = getMSTime();
5825
5826 _spellScriptsStore.clear(); // need for reload case
5827
5828 QueryResult result = WorldDatabase.Query("SELECT spell_id, ScriptName FROM spell_script_names");
5829
5830 if (!result)
5831 {
5832 LOG_WARN("server.loading", ">> Loaded 0 spell script names. DB table `spell_script_names` is empty!");
5833 LOG_INFO("server.loading", " ");
5834 return;
5835 }
5836
5837 uint32 count = 0;
5838
5839 do
5840 {
5841 Field* fields = result->Fetch();
5842
5843 int32 spellId = fields[0].Get<int32>();
5844 std::string scriptName = fields[1].Get<std::string>();
5845
5846 bool allRanks = false;
5847 if (spellId <= 0)
5848 {
5849 allRanks = true;
5850 spellId = -spellId;
5851 }
5852
5853 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
5854 if (!spellInfo)
5855 {
5856 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) does not exist in `Spell.dbc`.", scriptName, fields[0].Get<int32>());
5857 continue;
5858 }
5859
5860 if (allRanks)
5861 {
5862 if (sSpellMgr->GetFirstSpellInChain(spellId) != uint32(spellId))
5863 {
5864 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) is not first rank of spell.", scriptName, fields[0].Get<int32>());
5865 continue;
5866 }
5867 while (spellInfo)
5868 {
5869 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
5870 spellInfo = spellInfo->GetNextRankSpell();
5871 }
5872 }
5873 else
5874 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
5875 ++count;
5876 } while (result->NextRow());
5877
5878 LOG_INFO("server.loading", ">> Loaded {} spell script names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5879 LOG_INFO("server.loading", " ");
5880}
SpellInfo const * GetNextRankSpell() const
Definition SpellInfo.cpp:2525

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

◆ LoadSpellScripts()

void ObjectMgr::LoadSpellScripts ( )
5724{
5726
5727 // check ids
5728 for (ScriptMapMap::const_iterator itr = sSpellScripts.begin(); itr != sSpellScripts.end(); ++itr)
5729 {
5730 uint32 spellId = uint32(itr->first) & 0x00FFFFFF;
5731 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
5732
5733 if (!spellInfo)
5734 {
5735 LOG_ERROR("sql.sql", "Table `spell_scripts` has not existing spell (Id: {}) as script id", spellId);
5736 continue;
5737 }
5738
5739 SpellEffIndex i = SpellEffIndex((uint32(itr->first) >> 24) & 0x000000FF);
5740 if (uint32(i) >= MAX_SPELL_EFFECTS)
5741 {
5742 LOG_ERROR("sql.sql", "Table `spell_scripts` has too high effect index {} for spell (Id: {}) as script id", uint32(i), spellId);
5743 }
5744
5745 //check for correct spellEffect
5746 if (!spellInfo->Effects[i].Effect || (spellInfo->Effects[i].Effect != SPELL_EFFECT_SCRIPT_EFFECT && spellInfo->Effects[i].Effect != SPELL_EFFECT_DUMMY))
5747 LOG_ERROR("sql.sql", "Table `spell_scripts` - spell {} effect {} is not SPELL_EFFECT_SCRIPT_EFFECT or SPELL_EFFECT_DUMMY", spellId, uint32(i));
5748 }
5749}
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 ( )
6663{
6664 uint32 oldMSTime = getMSTime();
6665
6666 _tavernAreaTriggerStore.clear(); // need for reload case
6667
6668 QueryResult result = WorldDatabase.Query("SELECT id, faction FROM areatrigger_tavern");
6669
6670 if (!result)
6671 {
6672 LOG_WARN("server.loading", ">> Loaded 0 tavern triggers. DB table `areatrigger_tavern` is empty.");
6673 LOG_INFO("server.loading", " ");
6674 return;
6675 }
6676
6677 uint32 count = 0;
6678
6679 do
6680 {
6681 ++count;
6682
6683 Field* fields = result->Fetch();
6684
6685 uint32 Trigger_ID = fields[0].Get<uint32>();
6686
6687 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6688 if (!atEntry)
6689 {
6690 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6691 continue;
6692 }
6693
6694 uint32 faction = fields[1].Get<uint32>();
6695
6696 _tavernAreaTriggerStore.emplace(Trigger_ID, faction);
6697 } while (result->NextRow());
6698
6699 LOG_INFO("server.loading", ">> Loaded {} Tavern Triggers in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6700 LOG_INFO("server.loading", " ");
6701}

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 ( )
9380{
9381 uint32 oldMSTime = getMSTime();
9382
9383 // For reload case
9385
9386 QueryResult result = WorldDatabase.Query("SELECT b.ID, a.SpellID, a.MoneyCost, a.ReqSkillLine, a.ReqSkillRank, a.ReqLevel, a.ReqSpell FROM npc_trainer AS a "
9387 "INNER JOIN npc_trainer AS b ON a.ID = -(b.SpellID) "
9388 "UNION SELECT * FROM npc_trainer WHERE SpellID > 0");
9389
9390 if (!result)
9391 {
9392 LOG_WARN("server.loading", ">> Loaded 0 Trainers. DB table `npc_trainer` is empty!");
9393 LOG_INFO("server.loading", " ");
9394 return;
9395 }
9396
9397 uint32 count = 0;
9398
9399 do
9400 {
9401 Field* fields = result->Fetch();
9402
9403 uint32 entry = fields[0].Get<uint32>();
9404 uint32 spell = fields[1].Get<uint32>();
9405 uint32 spellCost = fields[2].Get<uint32>();
9406 uint32 reqSkill = fields[3].Get<uint16>();
9407 uint32 reqSkillValue = fields[4].Get<uint16>();
9408 uint32 reqLevel = fields[5].Get<uint8>();
9409 uint32 reqSpell = fields[6].Get<uint32>();
9410
9411 AddSpellToTrainer(entry, spell, spellCost, reqSkill, reqSkillValue, reqLevel, reqSpell);
9412
9413 ++count;
9414 } while (result->NextRow());
9415
9416 LOG_INFO("server.loading", ">> Loaded {} Trainers in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
9417 LOG_INFO("server.loading", " ");
9418}
void AddSpellToTrainer(uint32 entry, uint32 spell, uint32 spellCost, uint32 reqSkill, uint32 reqSkillValue, uint32 reqLevel, uint32 reqSpell)
Definition ObjectMgr.cpp:9294

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

◆ LoadVehicleAccessories()

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

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

◆ LoadVehicleSeatAddon()

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

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

◆ LoadVendors()

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

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

◆ LoadWaypointScripts()

void ObjectMgr::LoadWaypointScripts ( )
5796{
5798
5799 std::set<uint32> actionSet;
5800
5801 for (ScriptMapMap::const_iterator itr = sWaypointScripts.begin(); itr != sWaypointScripts.end(); ++itr)
5802 actionSet.insert(itr->first);
5803
5805 PreparedQueryResult result = WorldDatabase.Query(stmt);
5806
5807 if (result)
5808 {
5809 do
5810 {
5811 Field* fields = result->Fetch();
5812 uint32 action = fields[0].Get<uint32>();
5813
5814 actionSet.erase(action);
5815 } while (result->NextRow());
5816 }
5817
5818 for (std::set<uint32>::iterator itr = actionSet.begin(); itr != actionSet.end(); ++itr)
5819 LOG_ERROR("sql.sql", "There is no waypoint which links to the waypoint script {}", *itr);
5820}
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
3847{
3848 if (!_playerInfo[race_][class_])
3849 return;
3850
3851 if (count > 0)
3852 _playerInfo[race_][class_]->item.push_back(PlayerCreateInfoItem(itemId, count));
3853 else
3854 {
3855 if (count < -1)
3856 LOG_ERROR("sql.sql", "Invalid count {} specified on item {} be removed from original player create info (use -1)!", count, itemId);
3857
3858 for (uint32 gender = 0; gender < GENDER_NONE; ++gender)
3859 {
3860 if (CharStartOutfitEntry const* entry = GetCharStartOutfitEntry(race_, class_, gender))
3861 {
3862 bool found = false;
3863 for (uint8 x = 0; x < MAX_OUTFIT_ITEMS; ++x)
3864 {
3865 if (entry->ItemId[x] > 0 && uint32(entry->ItemId[x]) == itemId)
3866 {
3867 found = true;
3868 const_cast<CharStartOutfitEntry*>(entry)->ItemId[x] = 0;
3869 break;
3870 }
3871 }
3872
3873 if (!found)
3874 LOG_ERROR("sql.sql", "Item {} specified to be removed from original create info not found in dbc!", itemId);
3875 }
3876 }
3877 }
3878}
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 
)
9639{
9640 CacheVendorItemContainer::iterator iter = _cacheVendorItemStore.find(entry);
9641 if (iter == _cacheVendorItemStore.end())
9642 return false;
9643
9644 if (!iter->second.RemoveItem(item))
9645 return false;
9646
9647 if (persist)
9648 {
9650
9651 stmt->SetData(0, entry);
9652 stmt->SetData(1, item);
9653
9654 WorldDatabase.Execute(stmt);
9655 }
9656
9657 return true;
9658}
@ WORLD_DEL_NPC_VENDOR
Definition WorldDatabase.h:44

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

◆ ReturnOrDeleteOldMails()

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

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

◆ SetCreatureLinkedRespawn()

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

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

◆ SetDBCLocaleIndex()

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

References DBCLocaleIndex.

◆ SetHighestGuids()

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