AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
ObjectMgr Class Reference

#include "ObjectMgr.h"

Classes

struct  GameobjectInstanceSavedState
 

Public Types

typedef std::unordered_map< uint32, Item * > ItemMap
 
typedef std::unordered_map< uint32, Quest * > QuestMap
 
typedef std::unordered_map< uint32, AreaTriggerAreaTriggerContainer
 
typedef std::unordered_map< uint32, AreaTriggerTeleportAreaTriggerTeleportContainer
 
typedef std::unordered_map< uint32, uint32AreaTriggerScriptContainer
 
typedef std::unordered_map< uint32, std::unordered_map< uint8, DungeonProgressionRequirements * > > DungeonProgressionRequirementsContainer
 
typedef std::unordered_map< uint32, RepRewardRateRepRewardRateContainer
 
typedef std::unordered_map< uint32, ReputationOnKillEntryRepOnKillContainer
 
typedef std::unordered_map< uint32, RepSpilloverTemplateRepSpilloverTemplateContainer
 
typedef std::unordered_map< uint32, PointOfInterestPointOfInterestContainer
 
typedef std::vector< std::string > ScriptNameContainer
 
typedef std::map< uint32, uint32CharacterConversionMap
 
typedef std::unordered_map< ObjectGuid::LowType, std::vector< float > > CreatureSparringContainer
 
typedef std::multimap< int32, uint32ExclusiveQuestGroups
 
typedef std::pair< ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator > ExclusiveQuestGroupsBounds
 

Public Member Functions

GameObjectTemplate const * GetGameObjectTemplate (uint32 entry)
 
bool IsGameObjectStaticTransport (uint32 entry)
 
GameObjectTemplateContainer const * GetGameObjectTemplates () const
 
int LoadReferenceVendor (int32 vendor, int32 item_id, std::set< uint32 > *skip_vendors)
 
void LoadGameObjectTemplate ()
 
void LoadGameObjectTemplateAddons ()
 
void AddGameobjectInfo (GameObjectTemplate *goinfo)
 
CreatureTemplate const * GetCreatureTemplate (uint32 entry)
 
CreatureTemplateContainer const * GetCreatureTemplates () const
 
CreatureModelInfo const * GetCreatureModelInfo (uint32 modelId) const
 
CreatureModelInfo const * GetCreatureModelRandomGender (CreatureModel *model, CreatureTemplate const *creatureTemplate) const
 
EquipmentInfo const * GetEquipmentInfo (uint32 entry, int8 &id)
 
CreatureAddon const * GetCreatureAddon (ObjectGuid::LowType lowguid)
 
GameObjectAddon const * GetGameObjectAddon (ObjectGuid::LowType lowguid)
 
GameObjectTemplateAddon const * GetGameObjectTemplateAddon (uint32 entry) const
 
CreatureAddon const * GetCreatureTemplateAddon (uint32 entry)
 
CreatureMovementData const * GetCreatureMovementOverride (ObjectGuid::LowType spawnId) const
 
ItemTemplate const * GetItemTemplate (uint32 entry)
 
ItemTemplateContainer const * GetItemTemplateStore () const
 
std::vector< ItemTemplate * > const * GetItemTemplateStoreFast () const
 
uint32 GetModelForTotem (SummonSlot totemSlot, Races race) const
 
uint32 GetModelForShapeshift (ShapeshiftForm form, Player *player) const
 
ItemSetNameEntry const * GetItemSetNameEntry (uint32 itemId)
 
InstanceTemplate const * GetInstanceTemplate (uint32 mapId)
 
PetLevelInfo const * GetPetLevelInfo (uint32 creature_id, uint8 level) const
 
PlayerClassInfo const * GetPlayerClassInfo (uint32 class_) const
 
void GetPlayerClassLevelInfo (uint32 class_, uint8 level, PlayerClassLevelInfo *info) const
 
PlayerInfo const * GetPlayerInfo (uint32 race, uint32 class_) const
 
void GetPlayerLevelInfo (uint32 race, uint32 class_, uint8 level, PlayerLevelInfo *info) const
 
uint32 GetNearestTaxiNode (float x, float y, float z, uint32 mapid, uint32 teamId)
 
void GetTaxiPath (uint32 source, uint32 destination, uint32 &path, uint32 &cost)
 
uint32 GetTaxiMountDisplayId (uint32 id, TeamId teamId, bool allowed_alt_team=false)
 
GameObjectQuestItemList const * GetGameObjectQuestItemList (uint32 id) const
 
GameObjectQuestItemMap const * GetGameObjectQuestItemMap () const
 
CreatureQuestItemList const * GetCreatureQuestItemList (uint32 id) const
 
CreatureQuestItemMap const * GetCreatureQuestItemMap () const
 
Quest const * GetQuestTemplate (uint32 quest_id) const
 
QuestMap const & GetQuestTemplates () const
 
uint32 GetQuestForAreaTrigger (uint32 Trigger_ID) const
 
bool IsTavernAreaTrigger (uint32 triggerID, uint32 faction) const
 
GossipText const * GetGossipText (uint32 Text_ID) const
 
AreaTrigger const * GetAreaTrigger (uint32 trigger) const
 
AreaTriggerTeleport const * GetAreaTriggerTeleport (uint32 trigger) const
 
DungeonProgressionRequirements const * GetAccessRequirement (uint32 mapid, Difficulty difficulty) const
 
AreaTriggerTeleport const * GetGoBackTrigger (uint32 Map) const
 
AreaTriggerTeleport const * GetMapEntranceTrigger (uint32 Map) const
 
AreaTriggerScriptContainer const & GetAllAreaTriggerScriptData () const
 
uint32 GetAreaTriggerScriptId (uint32 trigger_id)
 
SpellScriptsBounds GetSpellScriptsBounds (uint32 spell_id)
 
RepRewardRate const * GetRepRewardRate (uint32 factionId) const
 
ReputationOnKillEntry const * GetReputationOnKilEntry (uint32 id) const
 
int32 GetBaseReputationOf (FactionEntry const *factionEntry, uint8 race, uint8 playerClass)
 
RepSpilloverTemplate const * GetRepSpilloverTemplate (uint32 factionId) const
 
PointOfInterest const * GetPointOfInterest (uint32 id) const
 
QuestPOIVector const * GetQuestPOIVector (uint32 questId)
 
VehicleAccessoryList const * GetVehicleAccessoryList (Vehicle *veh) const
 
DungeonEncounterList const * GetDungeonEncounterList (uint32 mapId, Difficulty difficulty)
 
void LoadQuests ()
 
void LoadQuestMoneyRewards ()
 
void LoadQuestStartersAndEnders ()
 
void LoadGameobjectQuestStarters ()
 
void LoadGameobjectQuestEnders ()
 
void LoadCreatureQuestStarters ()
 
void LoadCreatureQuestEnders ()
 
QuestRelationsGetGOQuestRelationMap ()
 
QuestRelationsGetGOQuestInvolvedRelationMap ()
 
QuestRelationBounds GetGOQuestRelationBounds (uint32 go_entry)
 
QuestRelationBounds GetGOQuestInvolvedRelationBounds (uint32 go_entry)
 
QuestRelationsGetCreatureQuestRelationMap ()
 
QuestRelationsGetCreatureQuestInvolvedRelationMap ()
 
QuestRelationBounds GetCreatureQuestRelationBounds (uint32 creature_entry)
 
QuestRelationBounds GetCreatureQuestInvolvedRelationBounds (uint32 creature_entry)
 
void LoadEventScripts ()
 
void LoadSpellScripts ()
 
void LoadWaypointScripts ()
 
void LoadSpellScriptNames ()
 
void ValidateSpellScripts ()
 
void InitializeSpellInfoPrecomputedData ()
 
bool LoadModuleStrings ()
 
bool LoadModuleStringsLocale ()
 
bool LoadAcoreStrings ()
 
void LoadBroadcastTexts ()
 
void LoadBroadcastTextLocales ()
 
void LoadCreatureClassLevelStats ()
 
void LoadCreatureLocales ()
 
void LoadCreatureTemplates ()
 
void LoadCreatureTemplate (Field *fields, bool triggerHook=false)
 Loads a creature template from a database result.
 
void LoadCreatureTemplateModels ()
 
void LoadCreatureTemplateAddons ()
 
void LoadCreatureTemplateResistances ()
 
void LoadCreatureTemplateSpells ()
 
void LoadCreatureCustomIDs ()
 Load config option Creatures.CustomIDs into Store.
 
void CheckCreatureTemplate (CreatureTemplate const *cInfo)
 
void CheckCreatureMovement (char const *table, uint64 id, CreatureMovementData &creatureMovement)
 
void LoadGameObjectQuestItems ()
 
void LoadCreatureQuestItems ()
 
void LoadTempSummons ()
 
void LoadCreatures ()
 
void LoadCreatureSparring ()
 
void LoadLinkedRespawn ()
 
bool SetCreatureLinkedRespawn (ObjectGuid::LowType guid, ObjectGuid::LowType linkedGuid)
 
void LoadCreatureAddons ()
 
void LoadGameObjectAddons ()
 
void LoadCreatureModelInfo ()
 
void LoadPlayerTotemModels ()
 
void LoadPlayerShapeshiftModels ()
 
void LoadEquipmentTemplates ()
 
void LoadCreatureMovementOverrides ()
 
void LoadGameObjectLocales ()
 
void LoadGameobjects ()
 
void LoadItemTemplates ()
 
void LoadItemLocales ()
 
void LoadItemSetNames ()
 
void LoadItemSetNameLocales ()
 
void LoadQuestLocales ()
 
void LoadNpcTextLocales ()
 
void LoadQuestOfferRewardLocale ()
 
void LoadQuestRequestItemsLocale ()
 
void LoadPageTextLocales ()
 
void LoadGossipMenuItemsLocales ()
 
void LoadPointOfInterestLocales ()
 
void LoadQuestGreetingsLocales ()
 
void LoadInstanceTemplate ()
 
void LoadInstanceEncounters ()
 
void LoadMailLevelRewards ()
 
void LoadVehicleTemplateAccessories ()
 
void LoadVehicleAccessories ()
 
void LoadVehicleSeatAddon ()
 
void LoadGossipText ()
 
void LoadAreaTriggers ()
 
void LoadAreaTriggerTeleports ()
 
void LoadAccessRequirements ()
 
void LoadQuestAreaTriggers ()
 
void LoadQuestGreetings ()
 
void LoadAreaTriggerScripts ()
 
void LoadTavernAreaTriggers ()
 
void LoadGameObjectForQuests ()
 
void LoadPageTexts ()
 
PageText const * GetPageText (uint32 pageEntry)
 
void LoadPlayerInfo ()
 
void LoadPetLevelInfo ()
 
void LoadExplorationBaseXP ()
 
void LoadPetNames ()
 
void LoadPetNamesLocales ()
 
void LoadPetNumber ()
 
void LoadFishingBaseSkillLevel ()
 
void ChangeFishingBaseSkillLevel (uint32 entry, int32 skill)
 
void LoadReputationRewardRate ()
 
void LoadReputationOnKill ()
 
void LoadReputationSpilloverTemplate ()
 
void LoadPointsOfInterest ()
 
void LoadQuestPOI ()
 
void LoadNPCSpellClickSpells ()
 
void LoadGameTele ()
 
void LoadGossipMenu ()
 
void LoadGossipMenuItems ()
 
void LoadVendors ()
 
void LoadTrainerSpell ()
 
void AddSpellToTrainer (uint32 entry, uint32 spell, uint32 spellCost, uint32 reqSkill, uint32 reqSkillValue, uint32 reqLevel, uint32 reqSpell)
 
std::string GeneratePetName (uint32 entry)
 
std::string GeneratePetNameLocale (uint32 entry, LocaleConstant locale)
 
uint32 GetBaseXP (uint8 level)
 
uint32 GetXPForLevel (uint8 level) const
 
int32 GetFishingBaseSkillLevel (uint32 entry) const
 
void ReturnOrDeleteOldMails (bool serverUp)
 
CreatureBaseStats const * GetCreatureBaseStats (uint8 level, uint8 unitClass)
 
void SetHighestGuids ()
 
template<HighGuid type>
ObjectGuidGeneratorBaseGetGenerator ()
 
uint32 GenerateAuctionID ()
 
uint64 GenerateEquipmentSetGuid ()
 
uint32 GenerateMailID ()
 
uint32 GeneratePetNumber ()
 
ObjectGuid::LowType GenerateCreatureSpawnId ()
 
ObjectGuid::LowType GenerateGameObjectSpawnId ()
 
MailLevelReward const * GetMailLevelReward (uint32 level, uint32 raceMask)
 
CellObjectGuids const & GetGridObjectGuids (uint16 mapid, uint8 spawnMode, uint32 gridId)
 
CellObjectGuidsMap const & GetMapObjectGuids (uint16 mapid, uint8 spawnMode)
 
std::vector< TempSummonData > const * GetSummonGroup (uint32 summonerId, SummonerType summonerType, uint8 group) const
 
BroadcastText const * GetBroadcastText (uint32 id) const
 
CreatureDataContainer const & GetAllCreatureData () const
 
CreatureData const * GetCreatureData (ObjectGuid::LowType spawnId) const
 
CreatureSparringContainer const & GetSparringData () const
 
CreatureDataNewOrExistCreatureData (ObjectGuid::LowType spawnId)
 
void DeleteCreatureData (ObjectGuid::LowType spawnId)
 
ObjectGuid GetLinkedRespawnGuid (ObjectGuid guid) const
 
GameObjectDataContainer const & GetAllGOData () const
 
GameObjectData const * GetGameObjectData (ObjectGuid::LowType spawnId) const
 
CreatureLocale const * GetCreatureLocale (uint32 entry) const
 
GameObjectLocale const * GetGameObjectLocale (uint32 entry) const
 
ItemLocale const * GetItemLocale (uint32 entry) const
 
ItemSetNameLocale const * GetItemSetNameLocale (uint32 entry) const
 
PageTextLocale const * GetPageTextLocale (uint32 entry) const
 
QuestLocale const * GetQuestLocale (uint32 entry) const
 
GossipMenuItemsLocale const * GetGossipMenuItemsLocale (uint32 entry) const
 
PointOfInterestLocale const * GetPointOfInterestLocale (uint32 poi_id) const
 
QuestOfferRewardLocale const * GetQuestOfferRewardLocale (uint32 entry) const
 
QuestRequestItemsLocale const * GetQuestRequestItemsLocale (uint32 entry) const
 
NpcTextLocale const * GetNpcTextLocale (uint32 entry) const
 
QuestGreeting const * GetQuestGreeting (TypeID type, uint32 id) const
 
GameObjectDataNewGOData (ObjectGuid::LowType guid)
 
void DeleteGOData (ObjectGuid::LowType guid)
 
ModuleString const * GetModuleString (std::string module, uint32 id) const
 
std::string const * GetModuleString (std::string module, uint32 id, LocaleConstant locale) const
 
AcoreString const * GetAcoreString (uint32 entry) const
 
std::string GetAcoreString (uint32 entry, LocaleConstant locale) const
 
std::string GetAcoreStringForDBCLocale (uint32 entry) const
 
LocaleConstant GetDBCLocaleIndex () const
 
void SetDBCLocaleIndex (LocaleConstant locale)
 
void AddCreatureToGrid (ObjectGuid::LowType guid, CreatureData const *data)
 
void RemoveCreatureFromGrid (ObjectGuid::LowType guid, CreatureData const *data)
 
void AddGameobjectToGrid (ObjectGuid::LowType guid, GameObjectData const *data)
 
void RemoveGameobjectFromGrid (ObjectGuid::LowType guid, GameObjectData const *data)
 
ObjectGuid::LowType AddGOData (uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay=0, float rotation0=0, float rotation1=0, float rotation2=0, float rotation3=0)
 
ObjectGuid::LowType AddCreData (uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay=0)
 
void LoadReservedPlayerNamesDB ()
 
void LoadReservedPlayerNamesDBC ()
 
bool IsReservedName (std::string_view name) const
 
void AddReservedPlayerName (std::string const &name)
 
void LoadProfanityNamesFromDB ()
 
void LoadProfanityNamesFromDBC ()
 
bool IsProfanityName (std::string_view name) const
 
void AddProfanityPlayerName (std::string const &name)
 
GameTele const * GetGameTele (uint32 id) const
 
GameTele const * GetGameTele (std::string_view name, bool exactSearch=false) const
 
GameTeleContainer const & GetGameTeleMap () const
 
bool AddGameTele (GameTele &data)
 
bool DeleteGameTele (std::string_view name)
 
TrainerSpellData const * GetNpcTrainerSpells (uint32 entry) const
 
VendorItemData const * GetNpcVendorItemList (uint32 entry) const
 
void AddVendorItem (uint32 entry, uint32 item, int32 maxcount, uint32 incrtime, uint32 extendedCost, bool persist=true)
 
bool RemoveVendorItem (uint32 entry, uint32 item, bool persist=true)
 
bool IsVendorItemValid (uint32 vendor_entry, uint32 item, int32 maxcount, uint32 ptime, uint32 ExtendedCost, Player *player=nullptr, std::set< uint32 > *skip_vendors=nullptr, uint32 ORnpcflag=0) const
 
void LoadScriptNames ()
 
ScriptNameContainerGetScriptNames ()
 
std::string const & GetScriptName (uint32 id) const
 
uint32 GetScriptId (std::string const &name)
 
SpellClickInfoMapBounds GetSpellClickInfoMapBounds (uint32 creature_id) const
 
GossipMenusMapBounds GetGossipMenusMapBounds (uint32 uiMenuId) const
 
GossipMenusMapBoundsNonConst GetGossipMenusMapBoundsNonConst (uint32 uiMenuId)
 
GossipMenuItemsMapBounds GetGossipMenuItemsMapBounds (uint32 uiMenuId) const
 
GossipMenuItemsMapBoundsNonConst GetGossipMenuItemsMapBoundsNonConst (uint32 uiMenuId)
 
void LoadFactionChangeAchievements ()
 
void LoadFactionChangeItems ()
 
void LoadFactionChangeQuests ()
 
void LoadFactionChangeReputations ()
 
void LoadFactionChangeSpells ()
 
void LoadFactionChangeTitles ()
 
bool IsTransportMap (uint32 mapId) const
 
VehicleSeatAddon const * GetVehicleSeatAddon (uint32 seatId) const
 
uint32 GetQuestMoneyReward (uint8 level, uint32 questMoneyDifficulty) const
 

Static Public Member Functions

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

Public Attributes

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

Private Types

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

Private Member Functions

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

Private Attributes

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

Friends

class PlayerDumpReader
 

Detailed Description

Member Typedef Documentation

◆ AreaTriggerContainer

typedef std::unordered_map<uint32, AreaTrigger> ObjectMgr::AreaTriggerContainer

◆ AreaTriggerScriptContainer

typedef std::unordered_map<uint32, uint32> ObjectMgr::AreaTriggerScriptContainer

◆ AreaTriggerTeleportContainer

◆ BaseXPContainer

typedef std::map<uint32, uint32> ObjectMgr::BaseXPContainer
private

◆ CharacterConversionMap

◆ CreatureSparringContainer

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

◆ DungeonProgressionRequirementsContainer

◆ ExclusiveQuestGroups

typedef std::multimap<int32, uint32> ObjectMgr::ExclusiveQuestGroups

◆ ExclusiveQuestGroupsBounds

typedef std::pair<ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator> ObjectMgr::ExclusiveQuestGroupsBounds

◆ FishingBaseSkillContainer

◆ GossipTextContainer

typedef std::unordered_map<uint32, GossipText> ObjectMgr::GossipTextContainer
private

◆ HalfNameContainer

typedef std::map<uint32, std::vector<std::string> > ObjectMgr::HalfNameContainer
private

◆ HalfNameContainerLocale

typedef std::map<std::pair<uint32, LocaleConstant>, std::vector<std::string> > ObjectMgr::HalfNameContainerLocale
private

◆ ItemMap

typedef std::unordered_map<uint32, Item*> ObjectMgr::ItemMap

◆ ItemSetNameContainer

typedef std::unordered_map<uint32, ItemSetNameEntry> ObjectMgr::ItemSetNameContainer
private

◆ PetLevelInfoContainer

◆ PlayerXPperLevel

typedef std::vector<uint32> ObjectMgr::PlayerXPperLevel
private

◆ PointOfInterestContainer

◆ ProfanityNamesContainer

typedef std::set<std::wstring> ObjectMgr::ProfanityNamesContainer
private

◆ QuestAreaTriggerContainer

typedef std::unordered_map<uint32, uint32> ObjectMgr::QuestAreaTriggerContainer
private

◆ QuestMap

typedef std::unordered_map<uint32, Quest*> ObjectMgr::QuestMap

◆ RepOnKillContainer

◆ RepRewardRateContainer

◆ RepSpilloverTemplateContainer

◆ ReservedNamesContainer

typedef std::set<std::wstring> ObjectMgr::ReservedNamesContainer
private

◆ ScriptNameContainer

typedef std::vector<std::string> ObjectMgr::ScriptNameContainer

◆ TavernAreaTriggerContainer

typedef std::unordered_map<uint32, uint32> ObjectMgr::TavernAreaTriggerContainer
private

Member Enumeration Documentation

◆ CreatureLinkedRespawnType

Enumerator
CREATURE_TO_CREATURE 
CREATURE_TO_GO 
GO_TO_GO 
GO_TO_CREATURE 
1626 {
1628 CREATURE_TO_GO, // Creature is dependant on GO
1629 GO_TO_GO,
1630 GO_TO_CREATURE, // GO is dependant on creature
1631 };
@ CREATURE_TO_GO
Definition ObjectMgr.h:1628
@ CREATURE_TO_CREATURE
Definition ObjectMgr.h:1627
@ GO_TO_GO
Definition ObjectMgr.h:1629
@ GO_TO_CREATURE
Definition ObjectMgr.h:1630

Constructor & Destructor Documentation

◆ ObjectMgr()

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

References _playerClassInfo, _playerInfo, MAX_CLASSES, and MAX_RACES.

◆ ~ObjectMgr()

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

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

Member Function Documentation

◆ AddCreatureToGrid()

void ObjectMgr::AddCreatureToGrid ( ObjectGuid::LowType  guid,
CreatureData const *  data 
)
2474{
2475 uint8 mask = data->spawnMask;
2476 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2477 {
2478 if (mask & 1)
2479 {
2480 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2481 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2482 cell_guids.creatures.insert(guid);
2483 }
2484 }
2485}
uint32 MAKE_PAIR32(uint16 l, uint16 h)
Definition ObjectDefines.h:88
MapObjectGuids _mapObjectGuidsStore
Definition ObjectMgr.h:1580
GridCoord ComputeGridCoord(float x, float y)
Definition GridDefines.h:185
Definition ObjectMgr.h:478
CellGuidSet creatures
Definition ObjectMgr.h:479
Definition GridDefines.h:88
uint32 GetId() const
Definition GridDefines.h:150

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

Referenced by AddCreData(), and LoadCreatures().

◆ AddCreData()

ObjectGuid::LowType ObjectMgr::AddCreData ( uint32  entry,
uint32  map,
float  x,
float  y,
float  z,
float  o,
uint32  spawntimedelay = 0 
)
2553{
2554 CreatureTemplate const* cInfo = GetCreatureTemplate(entry);
2555 if (!cInfo)
2556 return 0;
2557
2558 uint32 level = cInfo->minlevel == cInfo->maxlevel ? cInfo->minlevel : urand(cInfo->minlevel, cInfo->maxlevel); // Only used for extracting creature base stats
2559 CreatureBaseStats const* stats = GetCreatureBaseStats(level, cInfo->unit_class);
2560 Map* map = sMapMgr->CreateBaseMap(mapId);
2561 if (!map)
2562 return 0;
2563
2565 CreatureData& data = NewOrExistCreatureData(spawnId);
2566 data.spawnMask = spawnId;
2567 data.id1 = entry;
2568 data.id2 = 0;
2569 data.id3 = 0;
2570 data.mapid = mapId;
2571 data.displayid = 0;
2572 data.equipmentId = 0;
2573 data.posX = x;
2574 data.posY = y;
2575 data.posZ = z;
2576 data.orientation = o;
2577 data.spawntimesecs = spawntimedelay;
2578 data.wander_distance = 0;
2579 data.currentwaypoint = 0;
2580 data.curhealth = stats->GenerateHealth(cInfo);
2581 data.curmana = stats->GenerateMana(cInfo);
2582 data.movementType = cInfo->MovementType;
2583 data.spawnMask = 1;
2585 data.dbData = false;
2586 data.npcflag = cInfo->npcflag;
2587 data.unit_flags = cInfo->unit_flags;
2588 data.dynamicflags = cInfo->dynamicflags;
2589
2590 AddCreatureToGrid(spawnId, &data);
2591
2592 // Spawn if necessary (loaded grids only)
2593 if (!map->Instanceable() && map->IsGridLoaded(x, y))
2594 {
2595 Creature* creature = new Creature();
2596 if (!creature->LoadCreatureFromDB(spawnId, map, true, true))
2597 {
2598 LOG_ERROR("sql.sql", "AddCreature: Cannot add creature entry {} to map", entry);
2599 delete creature;
2600 return 0;
2601 }
2602 }
2603
2604 return spawnId;
2605}
std::uint32_t uint32
Definition Define.h:107
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
#define sMapMgr
Definition MapMgr.h:220
@ PHASEMASK_NORMAL
Definition Object.h:62
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
Definition Creature.h:43
bool LoadCreatureFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true, bool allowDuplicate=false)
Definition Creature.cpp:1703
Definition Map.h:160
bool IsGridLoaded(GridCoord const &gridCoord) const
Definition Map.cpp:198
bool Instanceable() const
Definition Map.h:291
uint32 LowType
Definition ObjectGuid.h:122
CreatureBaseStats const * GetCreatureBaseStats(uint8 level, uint8 unitClass)
Definition ObjectMgr.cpp:9947
void AddCreatureToGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition ObjectMgr.cpp:2473
ObjectGuid::LowType GenerateCreatureSpawnId()
Definition ObjectMgr.cpp:7261
CreatureData & NewOrExistCreatureData(ObjectGuid::LowType spawnId)
Definition ObjectMgr.h:1216
CreatureTemplate const * GetCreatureTemplate(uint32 entry)
Definition ObjectMgr.cpp:10295
Definition CreatureData.h:303
uint32 GenerateMana(CreatureTemplate const *info) const
Definition CreatureData.h:318
uint32 GenerateHealth(CreatureTemplate const *info) const
Definition CreatureData.h:313
Definition CreatureData.h:370
float wander_distance
Definition CreatureData.h:384
uint32 phaseMask
Definition CreatureData.h:376
uint32 spawntimesecs
Definition CreatureData.h:383
uint32 dynamicflags
Definition CreatureData.h:392
uint32 npcflag
Definition CreatureData.h:390
bool dbData
Definition CreatureData.h:394
uint32 displayid
Definition CreatureData.h:377
uint8 movementType
Definition CreatureData.h:388
uint8 spawnMask
Definition CreatureData.h:389
uint32 unit_flags
Definition CreatureData.h:391
uint32 id2
Definition CreatureData.h:373
uint32 curhealth
Definition CreatureData.h:386
float orientation
Definition CreatureData.h:382
uint32 curmana
Definition CreatureData.h:387
uint32 id3
Definition CreatureData.h:374
float posY
Definition CreatureData.h:380
float posX
Definition CreatureData.h:379
int8 equipmentId
Definition CreatureData.h:378
uint32 currentwaypoint
Definition CreatureData.h:385
uint16 mapid
Definition CreatureData.h:375
float posZ
Definition CreatureData.h:381
uint32 id1
Definition CreatureData.h:372
Definition CreatureData.h:186
uint32 unit_flags
Definition CreatureData.h:214
uint8 minlevel
Definition CreatureData.h:195
uint8 maxlevel
Definition CreatureData.h:196
uint32 MovementType
Definition CreatureData.h:234
uint32 npcflag
Definition CreatureData.h:199
uint32 unit_class
Definition CreatureData.h:213
uint32 dynamicflags
Definition CreatureData.h:216

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

◆ AddGameobjectInfo()

void ObjectMgr::AddGameobjectInfo ( GameObjectTemplate goinfo)

◆ AddGameobjectToGrid()

void ObjectMgr::AddGameobjectToGrid ( ObjectGuid::LowType  guid,
GameObjectData const *  data 
)
2780{
2781 uint8 mask = data->spawnMask;
2782 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2783 {
2784 if (mask & 1)
2785 {
2786 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2787 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2788 cell_guids.gameobjects.insert(guid);
2789 }
2790 }
2791}
CellGuidSet gameobjects
Definition ObjectMgr.h:480

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

Referenced by AddGOData(), and LoadGameobjects().

◆ AddGameTele()

bool ObjectMgr::AddGameTele ( GameTele data)
9179{
9180 // find max id
9181 uint32 new_id = 0;
9182 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9183 if (itr->first > new_id)
9184 new_id = itr->first;
9185
9186 // use next
9187 ++new_id;
9188
9189 if (!Utf8toWStr(tele.name, tele.wnameLow))
9190 return false;
9191
9192 wstrToLower(tele.wnameLow);
9193
9194 _gameTeleStore[new_id] = tele;
9195
9197
9198 stmt->SetData(0, new_id);
9199 stmt->SetData(1, tele.position_x);
9200 stmt->SetData(2, tele.position_y);
9201 stmt->SetData(3, tele.position_z);
9202 stmt->SetData(4, tele.orientation);
9203 stmt->SetData(5, uint16(tele.mapId));
9204 stmt->SetData(6, tele.name);
9205
9206 WorldDatabase.Execute(stmt);
9207
9208 return true;
9209}
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition DatabaseEnv.cpp:20
std::uint16_t uint16
Definition Define.h:108
bool Utf8toWStr(char const *utf8str, std::size_t csize, wchar_t *wstr, std::size_t &wsize)
Definition Util.cpp:281
void wstrToLower(std::wstring &str)
Definition Util.cpp:382
@ WORLD_INS_GAME_TELE
Definition WorldDatabase.h:41
GameTeleContainer _gameTeleStore
Definition ObjectMgr.h:1523
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157

References _gameTeleStore, GameTele::mapId, GameTele::name, GameTele::orientation, GameTele::position_x, GameTele::position_y, GameTele::position_z, PreparedStatementBase::SetData(), Utf8toWStr(), GameTele::wnameLow, WORLD_INS_GAME_TELE, WorldDatabase, and wstrToLower().

◆ AddGOData()

ObjectGuid::LowType ObjectMgr::AddGOData ( uint32  entry,
uint32  map,
float  x,
float  y,
float  z,
float  o,
uint32  spawntimedelay = 0,
float  rotation0 = 0,
float  rotation1 = 0,
float  rotation2 = 0,
float  rotation3 = 0 
)
2502{
2503 GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
2504 if (!goinfo)
2505 return 0;
2506
2507 Map* map = sMapMgr->CreateBaseMap(mapId);
2508 if (!map)
2509 return 0;
2510
2512
2513 GameObjectData& data = NewGOData(spawnId);
2514 data.id = entry;
2515 data.mapid = mapId;
2516 data.posX = x;
2517 data.posY = y;
2518 data.posZ = z;
2519 data.orientation = o;
2520 data.rotation.x = rotation0;
2521 data.rotation.y = rotation1;
2522 data.rotation.z = rotation2;
2523 data.rotation.w = rotation3;
2524 data.spawntimesecs = spawntimedelay;
2525 data.animprogress = 100;
2526 data.spawnMask = 1;
2527 data.go_state = GO_STATE_READY;
2529 data.artKit = goinfo->type == GAMEOBJECT_TYPE_CAPTURE_POINT ? 21 : 0;
2530 data.dbData = false;
2531
2532 AddGameobjectToGrid(spawnId, &data);
2533
2534 // Spawn if necessary (loaded grids only)
2535 // We use spawn coords to spawn
2536 if (!map->Instanceable() && map->IsGridLoaded(x, y))
2537 {
2539 if (!go->LoadGameObjectFromDB(spawnId, map))
2540 {
2541 LOG_ERROR("sql.sql", "AddGOData: cannot add gameobject entry {} to map", entry);
2542 delete go;
2543 return 0;
2544 }
2545 }
2546
2547 LOG_DEBUG("maps", "AddGOData: spawnId {} entry {} map {} x {} y {} z {} o {}", spawnId, entry, mapId, x, y, z, o);
2548
2549 return spawnId;
2550}
@ GO_STATE_READY
Definition GameObjectData.h:692
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
@ GAMEOBJECT_TYPE_CAPTURE_POINT
Definition SharedDefines.h:1600
Definition GameObject.h:120
virtual bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition GameObject.cpp:1104
void AddGameobjectToGrid(ObjectGuid::LowType guid, GameObjectData const *data)
Definition ObjectMgr.cpp:2779
GameObjectTemplate const * GetGameObjectTemplate(uint32 entry)
Definition ObjectMgr.cpp:10271
ObjectGuid::LowType GenerateGameObjectSpawnId()
Definition ObjectMgr.cpp:7271
GameObjectData & NewGOData(ObjectGuid::LowType guid)
Definition ObjectMgr.h:1301
bool IsGameObjectStaticTransport(uint32 entry)
Definition ObjectMgr.cpp:10280
Definition Transport.h:115
Definition GameObjectData.h:698
bool dbData
Definition GameObjectData.h:714
float orientation
Definition GameObjectData.h:706
float posZ
Definition GameObjectData.h:705
uint8 artKit
Definition GameObjectData.h:713
int32 spawntimesecs
Definition GameObjectData.h:708
uint8 spawnMask
Definition GameObjectData.h:712
G3D::Quat rotation
Definition GameObjectData.h:707
uint32 animprogress
Definition GameObjectData.h:710
uint16 mapid
Definition GameObjectData.h:701
float posX
Definition GameObjectData.h:703
uint32 phaseMask
Definition GameObjectData.h:702
float posY
Definition GameObjectData.h:704
uint32 id
Definition GameObjectData.h:700
GOState go_state
Definition GameObjectData.h:711
Definition GameObjectData.h:31
uint32 type
Definition GameObjectData.h:33

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

◆ AddLocaleString()

◆ AddProfanityPlayerName()

void ObjectMgr::AddProfanityPlayerName ( std::string const &  name)
8546{
8547 if (!IsProfanityName(name))
8548 {
8549 std::wstring wstr;
8550 if (!Utf8toWStr(name, wstr))
8551 {
8552 LOG_ERROR("server", "Could not add invalid name to profanity player names: {}", name);
8553 return;
8554 }
8555 wstrToLower(wstr);
8556
8557 _profanityNamesStore.insert(wstr);
8558
8560 stmt->SetData(0, name);
8561 CharacterDatabase.Execute(stmt);
8562 }
8563}
@ 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:8530

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

◆ AddReservedPlayerName()

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

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 
)
8998{
8999 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
9000 if (!fArea)
9001 {
9002 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
9003 return;
9004 }
9005
9006 _fishingBaseForAreaStore[entry] = skill;
9007
9008 LOG_INFO("server.loading", ">> Fishing base skill level of area {} changed to {}", entry, skill);
9009 LOG_INFO("server.loading", " ");
9010}
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
#define LOG_INFO(filterType__,...)
Definition Log.h:166
FishingBaseSkillContainer _fishingBaseForAreaStore
Definition ObjectMgr.h:1568
Definition DBCStructure.h:519

References _fishingBaseForAreaStore, LOG_ERROR, LOG_INFO, and sAreaTableStore.

◆ CheckCreatureMovement()

void ObjectMgr::CheckCreatureMovement ( char const *  table,
uint64  id,
CreatureMovementData creatureMovement 
)
1246{
1247 if (creatureMovement.Ground >= CreatureGroundMovementType::Max)
1248 {
1249 LOG_ERROR("sql.sql", "`{}`.`Ground` wrong value ({}) for Id {}, setting to Run.", table, uint32(creatureMovement.Ground), id);
1250 creatureMovement.Ground = CreatureGroundMovementType::Run;
1251 }
1252
1253 if (creatureMovement.Flight >= CreatureFlightMovementType::Max)
1254 {
1255 LOG_ERROR("sql.sql", "`{}`.`Flight` wrong value ({}) for Id {}, setting to None.", table, uint32(creatureMovement.Flight), id);
1256 creatureMovement.Flight = CreatureFlightMovementType::None;
1257 }
1258
1259 if (creatureMovement.Chase >= CreatureChaseMovementType::Max)
1260 {
1261 LOG_ERROR("sql.sql", "`{}`.`Chase` wrong value ({}) for Id {}, setting to Run.", table, uint32(creatureMovement.Chase), id);
1262 creatureMovement.Chase = CreatureChaseMovementType::Run;
1263 }
1264
1265 if (creatureMovement.Random >= CreatureRandomMovementType::Max)
1266 {
1267 LOG_ERROR("sql.sql", "`{}`.`Random` wrong value ({}) for Id {}, setting to Walk.", table, uint32(creatureMovement.Random), id);
1268 creatureMovement.Random = CreatureRandomMovementType::Walk;
1269 }
1270}
CreatureRandomMovementType Random
Definition CreatureData.h:127
CreatureFlightMovementType Flight
Definition CreatureData.h:123
CreatureChaseMovementType Chase
Definition CreatureData.h:126
CreatureGroundMovementType Ground
Definition CreatureData.h:122

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

Referenced by CheckCreatureTemplate(), and LoadCreatureMovementOverrides().

◆ CheckCreatureTemplate()

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

References _creatureCustomIDsStore, _difficultyEntries, Creature::_GetDamageMod(), _hasDifficultyEntries, CreatureTemplate::AIName, BASE_ATTACK_TIME, CreatureTemplate::BaseAttackTime, CheckCreatureMovement(), CLASSMASK_ALL_CREATURES, CREATURE_FAMILY_HORSE_CUSTOM, CREATURE_FLAG_EXTRA_DB_ALLOWED, CREATURE_FLAG_EXTRA_MODULE, CREATURE_TYPE_HUMANOID, CreatureTemplate::DifficultyEntry, CreatureTemplate::dmgschool, CreatureTemplate::Entry, CreatureTemplate::expansion, CreatureTemplate::faction, CreatureTemplate::family, CreatureTemplate::flags_extra, GetCreatureTemplate(), CreatureTemplate::GossipMenuId, CreatureTemplate::HoverHeight, IDLE_MOTION_TYPE, CreatureTemplate::KillCredit, LOG_ERROR, LOG_INFO, MAX_CREATURE_SPELLS, MAX_DB_MOTION_TYPE, MAX_DIFFICULTY, MAX_EXPANSIONS, MAX_KILL_CREDIT, MAX_SPELL_SCHOOL, MAX_TRAINER_TYPE, CreatureTemplate::Models, CreatureTemplate::Movement, CreatureTemplate::MovementType, CreatureTemplate::npcflag, CreatureTemplate::PetSpellDataId, CreatureTemplate::RangeAttackTime, CreatureTemplate::rank, sCreatureAIRegistry, sCreatureFamilyStore, sCreatureSpellDataStore, sCreatureTypeStore, CreatureTemplate::ScriptID, sFactionTemplateStore, CreatureTemplate::speed_run, CreatureTemplate::speed_walk, SPELL_SCHOOL_NORMAL, CreatureTemplate::spells, sSpellMgr, sVehicleStore, CreatureTemplate::trainer_class, CreatureTemplate::trainer_race, CreatureTemplate::trainer_spell, CreatureTemplate::trainer_type, CreatureTemplate::type, CreatureTemplate::unit_class, UNIT_CLASS_WARRIOR, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAG_TRAINER, and CreatureTemplate::VehicleId.

Referenced by LoadCreatureTemplates().

◆ CheckDeclinedNames()

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

References CONFIG_MIN_PET_NAME, CONFIG_STRICT_PET_NAMES, isValidString(), MAX_PET_NAME, PET_NAME_INVALID, PET_NAME_MIXED_LANGUAGES, PET_NAME_PROFANE, PET_NAME_RESERVED, PET_NAME_SUCCESS, PET_NAME_TOO_LONG, PET_NAME_TOO_SHORT, sObjectMgr, sWorld, and Utf8toWStr().

Referenced by WorldSession::HandlePetRename().

◆ CheckPlayerName()

uint8 ObjectMgr::CheckPlayerName ( std::string_view  name,
bool  create = false 
)
static
8639{
8640 std::wstring wname;
8641
8642 // Check for invalid characters
8643 if (!Utf8toWStr(name, wname))
8645
8646 // Check for too long name
8647 if (wname.size() > MAX_PLAYER_NAME)
8648 return CHAR_NAME_TOO_LONG;
8649
8650 // Check for too short name
8651 uint32 minName = sWorld->getIntConfig(CONFIG_MIN_PLAYER_NAME);
8652 if (wname.size() < minName)
8653 return CHAR_NAME_TOO_SHORT;
8654
8655 // Check for mixed languages
8656 uint32 strictMask = sWorld->getIntConfig(CONFIG_STRICT_PLAYER_NAMES);
8657 if (!isValidString(wname, strictMask, false, create))
8659
8660 // Check for three consecutive letters
8661 wstrToLower(wname);
8662 for (std::size_t i = 2; i < wname.size(); ++i)
8663 if (wname[i] == wname[i - 1] && wname[i] == wname[i - 2])
8665
8666 // Check Reserved Name
8667 if (sObjectMgr->IsReservedName(name))
8668 return CHAR_NAME_RESERVED;
8669
8670 // Check Profanity Name
8671 if (sObjectMgr->IsProfanityName(name))
8672 return CHAR_NAME_PROFANE;
8673
8674 return CHAR_NAME_SUCCESS;
8675}
#define MAX_PLAYER_NAME
Definition ObjectMgr.h:682
@ CHAR_NAME_TOO_SHORT
Definition SharedDefines.h:3688
@ CHAR_NAME_THREE_CONSECUTIVE
Definition SharedDefines.h:3696
@ CHAR_NAME_INVALID_CHARACTER
Definition SharedDefines.h:3690
@ CHAR_NAME_TOO_LONG
Definition SharedDefines.h:3689
@ CHAR_NAME_RESERVED
Definition SharedDefines.h:3693
@ CHAR_NAME_MIXED_LANGUAGES
Definition SharedDefines.h:3691
@ CHAR_NAME_PROFANE
Definition SharedDefines.h:3692
@ CHAR_NAME_SUCCESS
Definition SharedDefines.h:3685
@ CONFIG_STRICT_PLAYER_NAMES
Definition WorldConfig.h:173
@ CONFIG_MIN_PLAYER_NAME
Definition WorldConfig.h:177

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

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

◆ ChooseCreatureFlags()

void ObjectMgr::ChooseCreatureFlags ( CreatureTemplate const *  cinfo,
uint32 npcflag,
uint32 unit_flags,
uint32 dynamicflags,
CreatureData const *  data = nullptr 
)
static
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)
8239{
8240 // remove mapid*cellid -> guid_set map
8241 CreatureData const* data = GetCreatureData(guid);
8242 if (data)
8243 RemoveCreatureFromGrid(guid, data);
8244
8245 _creatureDataStore.erase(guid);
8246}
CreatureDataContainer _creatureDataStore
Definition ObjectMgr.h:1583
void RemoveCreatureFromGrid(ObjectGuid::LowType guid, CreatureData const *data)
Definition ObjectMgr.cpp:2487
CreatureData const * GetCreatureData(ObjectGuid::LowType spawnId) const
Definition ObjectMgr.h:1207

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

◆ DeleteGameTele()

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

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

◆ GenerateAuctionID()

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

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

◆ GenerateCreatureSpawnId()

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

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

Referenced by AddCreData().

◆ GenerateEquipmentSetGuid()

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

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

◆ GenerateGameObjectSpawnId()

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

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

Referenced by AddGOData().

◆ GenerateMailID()

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

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

◆ GeneratePetNumber()

uint32 ObjectMgr::GeneratePetNumber ( )
7756{
7757 std::lock_guard<std::mutex> guard(_hiPetNumberMutex);
7758 return ++_hiPetNumber;
7759}
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
8944{
8945 AcoreString const* as = GetAcoreString(entry);
8946 if (as && !as->Content.empty())
8947 {
8948 if (as->Content.size() > std::size_t(locale) && !as->Content[locale].empty())
8949 return as->Content[locale];
8950
8951 return as->Content[DEFAULT_LOCALE];
8952 }
8953
8954 std::string msg = Acore::StringFormat("No entry for acore_string ({}) in DB.", entry);
8955 LOG_ERROR("sql.sql", msg);
8956 return msg;
8957}
#define DEFAULT_LOCALE
Definition Common.h:131
AcoreString const * GetAcoreString(uint32 entry) const
Definition ObjectMgr.h:1315
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default AC string format function.
Definition StringFormat.h:34
Definition ObjectMgr.h:501
std::vector< std::string > Content
Definition ObjectMgr.h:502

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

◆ GetAcoreStringForDBCLocale()

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

References DBCLocaleIndex, and GetAcoreString().

◆ GetAllAreaTriggerScriptData()

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

References _areaTriggerScriptStore.

◆ GetAllCreatureData()

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

References _creatureDataStore.

◆ GetAllGOData()

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

References _gameObjectDataStore.

◆ GetAreaTrigger()

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

References _areaTriggerStore.

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

◆ GetAreaTriggerScriptId()

uint32 ObjectMgr::GetAreaTriggerScriptId ( uint32  trigger_id)
9037{
9038 AreaTriggerScriptContainer::const_iterator i = _areaTriggerScriptStore.find(trigger_id);
9039 if (i != _areaTriggerScriptStore.end())
9040 return i->second;
9041 return 0;
9042}

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

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

◆ GetBaseXP()

uint32 ObjectMgr::GetBaseXP ( uint8  level)
7666{
7667 return _baseXPTable[level] ? _baseXPTable[level] : 0;
7668}
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 
)
9948{
9949 CreatureBaseStatsContainer::const_iterator it = _creatureBaseStatsStore.find(MAKE_PAIR16(level, unitClass));
9950
9951 if (it != _creatureBaseStatsStore.end())
9952 return &(it->second);
9953
9954 struct DefaultCreatureBaseStats : public CreatureBaseStats
9955 {
9956 DefaultCreatureBaseStats()
9957 {
9958 BaseArmor = 1;
9959 for (uint8 j = 0; j < MAX_EXPANSIONS; ++j)
9960 {
9961 BaseHealth[j] = 1;
9962 BaseDamage[j] = 0.0f;
9963 }
9964 BaseMana = 0;
9965 AttackPower = 0;
9966 RangedAttackPower = 0;
9967 }
9968 };
9969 static const DefaultCreatureBaseStats defStats;
9970 return &defStats;
9971}
uint16 MAKE_PAIR16(uint8 l, uint8 h)
Definition ObjectDefines.h:83
CreatureBaseStatsContainer _creatureBaseStatsStore
Definition ObjectMgr.h:1549

References _creatureBaseStatsStore, MAKE_PAIR16(), and MAX_EXPANSIONS.

Referenced by AddCreData().

◆ GetCreatureData()

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

References _creatureDataStore.

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

◆ GetCreatureLocale()

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

References _creatureLocaleStore.

◆ GetCreatureModelInfo()

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

References _creatureModelStore.

Referenced by GetCreatureModelRandomGender(), and LoadCreatureTemplateModels().

◆ GetCreatureModelRandomGender()

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

References CreatureModel::CreatureDisplayID, GetCreatureModelInfo(), LOG_ERROR, CreatureModelInfo::modelid_other_gender, CreatureTemplate::Models, and urand().

Referenced by GetTaxiMountDisplayId().

◆ GetCreatureMovementOverride()

CreatureMovementData const * ObjectMgr::GetCreatureMovementOverride ( ObjectGuid::LowType  spawnId) const
1453{
1455}
std::unordered_map< ObjectGuid::LowType, CreatureMovementData > _creatureMovementOverrides
Definition ObjectMgr.h:1590
auto MapGetValuePtr(M &map, typename M::key_type const &key) -> decltype(AddressOrSelf(map.find(key) ->second))
Definition Containers.h:216

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

◆ GetCreatureQuestInvolvedRelationBounds()

QuestRelationBounds ObjectMgr::GetCreatureQuestInvolvedRelationBounds ( uint32  creature_entry)
inline
1008 {
1009 return _creatureQuestInvolvedRelations.equal_range(creature_entry);
1010 }
QuestRelations _creatureQuestInvolvedRelations
Definition ObjectMgr.h:1513

References _creatureQuestInvolvedRelations.

◆ GetCreatureQuestInvolvedRelationMap()

QuestRelations * ObjectMgr::GetCreatureQuestInvolvedRelationMap ( )
inline

◆ GetCreatureQuestItemList()

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

References _creatureQuestItemStore.

◆ GetCreatureQuestItemMap()

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

References _creatureQuestItemStore.

◆ GetCreatureQuestRelationBounds()

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

References _creatureQuestRelations.

◆ GetCreatureQuestRelationMap()

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

References _creatureQuestRelations.

◆ GetCreatureTemplate()

◆ GetCreatureTemplateAddon()

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

References _creatureTemplateAddonStore.

◆ GetCreatureTemplates()

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

References _creatureTemplateStore.

Referenced by LoadCreatureClassLevelStats(), and LoadNPCSpellClickSpells().

◆ GetDBCLocaleIndex()

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

References DBCLocaleIndex.

◆ GetDungeonEncounterList()

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

References _dungeonEncounterStore, and MAKE_PAIR32().

◆ GetEquipmentInfo()

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

References _equipmentInfoStore, and urand().

Referenced by LoadCreatures().

◆ GetFishingBaseSkillLevel()

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

References _fishingBaseForAreaStore.

◆ GetGameObjectAddon()

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

References _gameObjectAddonStore.

◆ GetGameObjectData()

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

References _gameObjectDataStore.

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

◆ GetGameObjectLocale()

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

References _gameObjectLocaleStore.

◆ GetGameObjectQuestItemList()

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

References _gameObjectQuestItemStore.

◆ GetGameObjectQuestItemMap()

GameObjectQuestItemMap const * ObjectMgr::GetGameObjectQuestItemMap ( ) const
inline

◆ GetGameObjectTemplate()

GameObjectTemplate const * ObjectMgr::GetGameObjectTemplate ( uint32  entry)
10272{
10273 GameObjectTemplateContainer::const_iterator itr = _gameObjectTemplateStore.find(entry);
10274 if (itr != _gameObjectTemplateStore.end())
10275 return &(itr->second);
10276
10277 return nullptr;
10278}
GameObjectTemplateContainer _gameObjectTemplateStore
Definition ObjectMgr.h:1599

References _gameObjectTemplateStore.

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

◆ GetGameObjectTemplateAddon()

GameObjectTemplateAddon const * ObjectMgr::GetGameObjectTemplateAddon ( uint32  entry) const
10287{
10288 auto itr = _gameObjectTemplateAddonStore.find(entry);
10289 if (itr != _gameObjectTemplateAddonStore.end())
10290 return &itr->second;
10291
10292 return nullptr;
10293}
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
9156{
9157 // explicit name case
9158 std::wstring wname;
9159 if (!Utf8toWStr(name, wname))
9160 return nullptr;
9161
9162 // converting string that we try to find to lower case
9163 wstrToLower(wname);
9164
9165 // Alternative first GameTele what contains wnameLow as substring in case no GameTele location found
9166 const GameTele* alt = nullptr;
9167 for (GameTeleContainer::const_iterator itr = _gameTeleStore.begin(); itr != _gameTeleStore.end(); ++itr)
9168 {
9169 if (itr->second.wnameLow == wname)
9170 return &itr->second;
9171 else if (!exactSearch && !alt && itr->second.wnameLow.find(wname) != std::wstring::npos)
9172 alt = &itr->second;
9173 }
9174
9175 return alt;
9176}
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
7130{
7131 bool useParentDbValue = false;
7132 uint32 parentId = 0;
7133 MapEntry const* mapEntry = sMapStore.LookupEntry(Map);
7134 if (!mapEntry || mapEntry->entrance_map < 0)
7135 return nullptr;
7136
7137 if (mapEntry->IsDungeon())
7138 {
7139 InstanceTemplate const* iTemplate = sObjectMgr->GetInstanceTemplate(Map);
7140
7141 if (!iTemplate)
7142 return nullptr;
7143
7144 parentId = iTemplate->Parent;
7145 useParentDbValue = true;
7146 }
7147
7148 uint32 entrance_map = uint32(mapEntry->entrance_map);
7149 for (AreaTriggerTeleportContainer::const_iterator itr = _areaTriggerTeleportStore.begin(); itr != _areaTriggerTeleportStore.end(); ++itr)
7150 if ((!useParentDbValue && itr->second.target_mapId == entrance_map) || (useParentDbValue && itr->second.target_mapId == parentId))
7151 {
7152 AreaTrigger const* atEntry = GetAreaTrigger(itr->first);
7153 if (atEntry && atEntry->map == Map)
7154 return &itr->second;
7155 }
7156 return nullptr;
7157}
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
AreaTrigger const * GetAreaTrigger(uint32 trigger) const
Definition ObjectMgr.h:862
Definition ObjectMgr.h:420
uint32 map
Definition ObjectMgr.h:422
Definition Map.h:119
uint32 Parent
Definition Map.h:120
Definition DBCStructure.h:1326
int32 entrance_map
Definition DBCStructure.h:1341
bool IsDungeon() const
Definition DBCStructure.h:1352

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

◆ GetGOQuestInvolvedRelationBounds()

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

References _goQuestInvolvedRelations.

◆ GetGOQuestInvolvedRelationMap()

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

References _goQuestInvolvedRelations.

◆ GetGOQuestRelationBounds()

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

References _goQuestRelations.

◆ GetGOQuestRelationMap()

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

References _goQuestRelations.

◆ GetGossipMenuItemsLocale()

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

References _gossipMenuItemsLocaleStore.

◆ GetGossipMenuItemsMapBounds()

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

References _gossipMenuItemsStore.

◆ GetGossipMenuItemsMapBoundsNonConst()

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

References _gossipMenuItemsStore.

◆ GetGossipMenusMapBounds()

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

References _gossipMenusStore.

◆ GetGossipMenusMapBoundsNonConst()

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

References _gossipMenusStore.

◆ GetGossipText()

GossipText const * ObjectMgr::GetGossipText ( uint32  Text_ID) const
6177{
6178 GossipTextContainer::const_iterator itr = _gossipTextStore.find(Text_ID);
6179 if (itr != _gossipTextStore.end())
6180 return &itr->second;
6181 return nullptr;
6182}
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)
6083{
6084 InstanceTemplateContainer::const_iterator itr = _instanceTemplateStore.find(uint16(mapID));
6085 if (itr != _instanceTemplateStore.end())
6086 return &(itr->second);
6087
6088 return nullptr;
6089}
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)
3474{
3475 return entry < _itemTemplateStoreFast.size() ? _itemTemplateStoreFast[entry] : nullptr;
3476}
std::vector< ItemTemplate * > _itemTemplateStoreFast
Definition ObjectMgr.h:1606

References _itemTemplateStoreFast.

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

◆ GetItemTemplateStore()

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

References _itemTemplateStore.

◆ GetItemTemplateStoreFast()

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

References _itemTemplateStoreFast.

◆ GetLinkedRespawnGuid()

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

References _linkedRespawnStore, and ObjectGuid::Empty.

◆ GetLocaleString() [1/2]

static void ObjectMgr::GetLocaleString ( const std::vector< std::string > &  data,
int  loc_idx,
std::string &  value 
)
inlinestatic
1427 {
1428 if (data.size() > std::size_t(loc_idx) && !data[loc_idx].empty())
1429 value = data[loc_idx];
1430 }

◆ GetLocaleString() [2/2]

◆ GetMailLevelReward()

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

References _mailLevelRewardStore.

◆ GetMapEntranceTrigger()

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

Searches for the areatrigger which teleports players to the given map

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

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:771
@ PLAYER_BYTES
Definition UpdateFields.h:181
PlayerShapeshiftModelMap _playerShapeshiftModel
Definition ObjectMgr.h:1637
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition Object.cpp:312
TeamId GetTeamId(bool original=false) const
Definition Player.h:2115
uint8 getGender() const
Definition Unit.h:800
uint8 getRace(bool original=false) const
Definition Unit.cpp:20866

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

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

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

◆ GetPlayerInfo()

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

References _playerInfo, MAX_CLASSES, and MAX_RACES.

◆ GetPlayerLevelInfo()

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

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
6477{
6478 uint8 typeIndex;
6479 if (type == TYPEID_UNIT)
6480 typeIndex = 0;
6481 else if (type == TYPEID_GAMEOBJECT)
6482 typeIndex = 1;
6483 else
6484 return nullptr;
6485
6486 std::pair<uint32, uint8> pairKey = std::make_pair(id, typeIndex);
6487 QuestGreetingContainer::const_iterator itr = _questGreetingStore.find(pairKey);
6488 if (itr == _questGreetingStore.end())
6489 return nullptr;
6490
6491 return &itr->second;
6492}
@ 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
10454{
10455 if (questMoneyDifficulty < MAX_QUEST_MONEY_REWARDS)
10456 {
10457 auto const& itr = _questMoneyRewards.find(level);
10458 if (itr != _questMoneyRewards.end())
10459 {
10460 return itr->second.at(questMoneyDifficulty);
10461 }
10462 }
10463
10464 return 0;
10465}
static constexpr uint32 MAX_QUEST_MONEY_REWARDS
Definition ObjectMgr.h:718
QuestMoneyRewardStore _questMoneyRewards
Definition ObjectMgr.h:1639

References _questMoneyRewards, and MAX_QUEST_MONEY_REWARDS.

◆ GetQuestOfferRewardLocale()

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

References _questOfferRewardLocaleStore.

◆ GetQuestPOIVector()

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

References _questPOIStore.

◆ GetQuestRequestItemsLocale()

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

References _questRequestItemsLocaleStore.

◆ GetQuestTemplate()

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

References _questTemplatesFast.

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

◆ GetQuestTemplates()

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

References _questTemplates.

◆ GetRepRewardRate()

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

References _repRewardRateStore.

◆ GetRepSpilloverTemplate()

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

References _repSpilloverTemplateStore.

◆ GetReputationOnKilEntry()

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

References _repOnKillStore.

◆ GetScriptId()

uint32 ObjectMgr::GetScriptId ( std::string const &  name)
9808{
9809 // use binary search to find the script name in the sorted vector
9810 // assume "" is the first element
9811 if (name.empty())
9812 return 0;
9813
9814 ScriptNameContainer::const_iterator itr = std::lower_bound(_scriptNamesStore.begin(), _scriptNamesStore.end(), name);
9815 if (itr == _scriptNamesStore.end() || (*itr != name))
9816 return 0;
9817
9818 return uint32(itr - _scriptNamesStore.begin());
9819}
ScriptNameContainer _scriptNamesStore
Definition ObjectMgr.h:1525

References _scriptNamesStore.

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

◆ GetScriptName()

std::string const & ObjectMgr::GetScriptName ( uint32  id) const
9802{
9803 static std::string const empty = "";
9804 return (id < _scriptNamesStore.size()) ? _scriptNamesStore[id] : empty;
9805}

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

References _playerXPperLevel.

◆ InitializeSpellInfoPrecomputedData()

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

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

Referenced by AddGOData().

◆ IsProfanityName()

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

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

Referenced by AddProfanityPlayerName().

◆ IsReservedName()

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

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

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

◆ IsValidCharterName()

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

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

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

◆ IsVendorItemValid()

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

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 ( )
8911{
8912 uint32 oldMSTime = getMSTime();
8913
8914 _acoreStringStore.clear(); // for reload case
8915 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");
8916 if (!result)
8917 {
8918 LOG_WARN("server.loading", ">> Loaded 0 acore strings. DB table `acore_strings` is empty.");
8919 LOG_INFO("server.loading", " ");
8920 return false;
8921 }
8922
8923 do
8924 {
8925 Field* fields = result->Fetch();
8926
8927 uint32 entry = fields[0].Get<uint32>();
8928
8929 AcoreString& data = _acoreStringStore[entry];
8930
8931 data.Content.resize(DEFAULT_LOCALE + 1);
8932
8933 for (uint8 i = 0; i < TOTAL_LOCALES; ++i)
8934 AddLocaleString(fields[i + 1].Get<std::string>(), LocaleConstant(i), data.Content);
8935 } while (result->NextRow());
8936
8937 LOG_INFO("server.loading", ">> Loaded {} Acore Strings in {} ms", (uint32)_acoreStringStore.size(), GetMSTimeDiffToNow(oldMSTime));
8938 LOG_INFO("server.loading", " ");
8939
8940 return true;
8941}
LocaleConstant
Definition Common.h:117
@ TOTAL_LOCALES
Definition Common.h:128
static void AddLocaleString(std::string &&s, LocaleConstant locale, std::vector< std::string > &data)
Definition ObjectMgr.cpp:382

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

◆ LoadAreaTriggers()

void ObjectMgr::LoadAreaTriggers ( )
6851{
6852 uint32 oldMSTime = getMSTime();
6853
6854 _areaTriggerStore.clear();
6855
6856 QueryResult result = WorldDatabase.Query("SELECT entry, map, x, y, z, radius, length, width, height, orientation FROM areatrigger");
6857
6858 if (!result)
6859 {
6860 LOG_WARN("server.loading", ">> Loaded 0 area trigger definitions. DB table `areatrigger` is empty.");
6861 LOG_INFO("server.loading", " ");
6862 return;
6863 }
6864
6865 uint32 count = 0;
6866
6867 do
6868 {
6869 Field* fields = result->Fetch();
6870
6871 ++count;
6872
6873 AreaTrigger at;
6874
6875 at.entry = fields[0].Get<uint32>();
6876 at.map = fields[1].Get<uint32>();
6877 at.x = fields[2].Get<float>();
6878 at.y = fields[3].Get<float>();
6879 at.z = fields[4].Get<float>();
6880 at.radius = fields[5].Get<float>();
6881 at.length = fields[6].Get<float>();
6882 at.width = fields[7].Get<float>();
6883 at.height = fields[8].Get<float>();
6884 at.orientation = fields[9].Get<float>();
6885
6886 MapEntry const* mapEntry = sMapStore.LookupEntry(at.map);
6887 if (!mapEntry)
6888 {
6889 LOG_ERROR("sql.sql", "Area trigger (ID:{}) map (ID: {}) does not exist in `Map.dbc`.", at.entry, at.map);
6890 continue;
6891 }
6892
6893 _areaTriggerStore[at.entry] = at;
6894 } while (result->NextRow());
6895
6896 LOG_INFO("server.loading", ">> Loaded {} Area Trigger Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6897 LOG_INFO("server.loading", " ");
6898}
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 ( )
6709{
6710 uint32 oldMSTime = getMSTime();
6711
6712 _areaTriggerScriptStore.clear(); // need for reload case
6713 QueryResult result = WorldDatabase.Query("SELECT entry, ScriptName FROM areatrigger_scripts");
6714
6715 if (!result)
6716 {
6717 LOG_WARN("server.loading", ">> Loaded 0 Areatrigger Scripts. DB Table `areatrigger_scripts` Is Empty.");
6718 LOG_INFO("server.loading", " ");
6719 return;
6720 }
6721
6722 uint32 count = 0;
6723
6724 do
6725 {
6726 ++count;
6727
6728 Field* fields = result->Fetch();
6729
6730 uint32 Trigger_ID = fields[0].Get<uint32>();
6731 std::string scriptName = fields[1].Get<std::string>();
6732
6733 AreaTrigger const* atEntry = GetAreaTrigger(Trigger_ID);
6734 if (!atEntry)
6735 {
6736 LOG_ERROR("sql.sql", "Area trigger (ID:{}) does not exist in `AreaTrigger.dbc`.", Trigger_ID);
6737 continue;
6738 }
6739 _areaTriggerScriptStore[Trigger_ID] = GetScriptId(scriptName);
6740 } while (result->NextRow());
6741
6742 LOG_INFO("server.loading", ">> Loaded {} Areatrigger Scripts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
6743 LOG_INFO("server.loading", " ");
6744}
uint32 GetScriptId(std::string const &name)
Definition ObjectMgr.cpp:9807

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

◆ LoadAreaTriggerTeleports()

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

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

◆ LoadCreatureAddons()

void ObjectMgr::LoadCreatureAddons ( )
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:62
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:24
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:619
uint32 Id
Definition SpellInfo.h:320
int32 GetDuration() const
Definition SpellInfo.cpp:2350
Definition AsioHacksFwd.h:47
std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
Definition Tokenize.cpp:20
STL namespace.
Definition CreatureData.h:440
std::vector< uint32 > auras
Definition CreatureData.h:446
uint32 mount
Definition CreatureData.h:442
uint32 emote
Definition CreatureData.h:445
uint32 path_id
Definition CreatureData.h:441
VisibilityDistanceType visibilityDistanceType
Definition CreatureData.h:447
uint32 bytes1
Definition CreatureData.h:443
uint32 bytes2
Definition CreatureData.h:444

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

◆ LoadCreatureClassLevelStats()

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

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

◆ LoadCreatureCustomIDs()

void ObjectMgr::LoadCreatureCustomIDs ( )

Load config option Creatures.CustomIDs into Store.

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

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

◆ LoadCreatureLocales()

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

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

◆ LoadCreatureModelInfo()

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

References _creatureModelStore, CreatureModelInfo::bounding_radius, DEFAULT_COMBAT_REACH, GENDER_MALE, GENDER_NONE, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sCreatureDisplayInfoStore, sCreatureModelDataStore, and WorldDatabase.

◆ LoadCreatureMovementOverrides()

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

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadCreatureQuestItems()

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

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadCreatures()

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

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

◆ LoadCreatureSparring()

void ObjectMgr::LoadCreatureSparring ( )
2438{
2439 uint32 oldMSTime = getMSTime();
2440
2441 QueryResult result = WorldDatabase.Query("SELECT GUID, SparringPCT FROM creature_sparring");
2442
2443 if (!result)
2444 {
2445 LOG_WARN("server.loading", ">> Loaded 0 sparring data. DB table `creature_sparring` is empty.");
2446 LOG_INFO("server.loading", " ");
2447 return;
2448 }
2449
2450 uint32 count = 0;
2451 do
2452 {
2453 Field* fields = result->Fetch();
2454
2455 ObjectGuid::LowType spawnId = fields[0].Get<uint32>();
2456 float sparringHealthPct = fields[1].Get<float>();
2457
2458 if (!GetCreatureData(spawnId))
2459 {
2460 LOG_ERROR("sql.sql", "Entry {} has a record in `creature_sparring` but doesn't exist in `creatures` table");
2461 continue;
2462 }
2463
2464 _creatureSparringStore[spawnId].push_back(sparringHealthPct);
2465
2466 ++count;
2467 } while (result->NextRow());
2468
2469 LOG_INFO("server.loading", ">> Loaded {} sparring data in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2470 LOG_INFO("server.loading", " ");
2471}

References _creatureSparringStore, Field::Get(), GetCreatureData(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, and WorldDatabase.

◆ LoadCreatureTemplate()

void ObjectMgr::LoadCreatureTemplate ( Field fields,
bool  triggerHook = false 
)

Loads a creature template from a database result.

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

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

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplateAddons()

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

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

◆ LoadCreatureTemplateModels()

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

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

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplateResistances()

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

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

Referenced by LoadCreatureTemplates().

◆ LoadCreatureTemplates()

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

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

◆ LoadCreatureTemplateSpells()

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

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

Referenced by LoadCreatureTemplates().

◆ LoadEquipmentTemplates()

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

References _equipmentInfoStore, Field::Get(), GetCreatureTemplate(), getMSTime(), GetMSTimeDiffToNow(), ItemEntry::InventoryType, INVTYPE_2HWEAPON, INVTYPE_HOLDABLE, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_SHIELD, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, EquipmentInfo::ItemEntry, LOG_ERROR, LOG_INFO, LOG_WARN, MAX_EQUIPMENT_ITEMS, sItemStore, and WorldDatabase.

◆ LoadEventScripts()

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

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

◆ LoadExplorationBaseXP()

void ObjectMgr::LoadExplorationBaseXP ( )
7638{
7639 uint32 oldMSTime = getMSTime();
7640
7641 QueryResult result = WorldDatabase.Query("SELECT level, basexp FROM exploration_basexp");
7642
7643 if (!result)
7644 {
7645 LOG_WARN("server.loading", ">> Loaded 0 BaseXP definitions. DB table `exploration_basexp` is empty.");
7646 LOG_INFO("server.loading", " ");
7647 return;
7648 }
7649
7650 uint32 count = 0;
7651
7652 do
7653 {
7654 Field* fields = result->Fetch();
7655 uint8 level = fields[0].Get<uint8>();
7656 uint32 basexp = fields[1].Get<int32>();
7657 _baseXPTable[level] = basexp;
7658 ++count;
7659 } while (result->NextRow());
7660
7661 LOG_INFO("server.loading", ">> Loaded {} BaseXP Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
7662 LOG_INFO("server.loading", " ");
7663}
std::int32_t int32
Definition Define.h:103

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

◆ LoadFactionChangeAchievements()

void ObjectMgr::LoadFactionChangeAchievements ( )
10057{
10058 uint32 oldMSTime = getMSTime();
10059
10060 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_achievement");
10061
10062 if (!result)
10063 {
10064 LOG_WARN("server.loading", ">> Loaded 0 faction change achievement pairs. DB table `player_factionchange_achievement` is empty.");
10065 LOG_INFO("server.loading", " ");
10066 return;
10067 }
10068
10069 uint32 count = 0;
10070
10071 do
10072 {
10073 Field* fields = result->Fetch();
10074
10075 uint32 alliance = fields[0].Get<uint32>();
10076 uint32 horde = fields[1].Get<uint32>();
10077
10078 if (!sAchievementStore.LookupEntry(alliance))
10079 LOG_ERROR("sql.sql", "Achievement {} (alliance_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", alliance);
10080 else if (!sAchievementStore.LookupEntry(horde))
10081 LOG_ERROR("sql.sql", "Achievement {} (horde_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", horde);
10082 else
10083 FactionChangeAchievements[alliance] = horde;
10084
10085 ++count;
10086 } while (result->NextRow());
10087
10088 LOG_INFO("server.loading", ">> Loaded {} faction change achievement pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10089 LOG_INFO("server.loading", " ");
10090}
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 ( )
10093{
10094 uint32 oldMSTime = getMSTime();
10095
10096 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_items");
10097
10098 if (!result)
10099 {
10100 LOG_WARN("server.loading", ">> Loaded 0 faction change item pairs. DB table `player_factionchange_items` is empty.");
10101 LOG_INFO("server.loading", " ");
10102 return;
10103 }
10104
10105 uint32 count = 0;
10106
10107 do
10108 {
10109 Field* fields = result->Fetch();
10110
10111 uint32 alliance = fields[0].Get<uint32>();
10112 uint32 horde = fields[1].Get<uint32>();
10113
10114 if (!GetItemTemplate(alliance))
10115 LOG_ERROR("sql.sql", "Item {} (alliance_id) referenced in `player_factionchange_items` does not exist, pair skipped!", alliance);
10116 else if (!GetItemTemplate(horde))
10117 LOG_ERROR("sql.sql", "Item {} (horde_id) referenced in `player_factionchange_items` does not exist, pair skipped!", horde);
10118 else
10119 FactionChangeItems[alliance] = horde;
10120
10121 ++count;
10122 } while (result->NextRow());
10123
10124 LOG_INFO("server.loading", ">> Loaded {} faction change item pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10125 LOG_INFO("server.loading", " ");
10126}
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 ( )
10129{
10130 uint32 oldMSTime = getMSTime();
10131
10132 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_quests");
10133
10134 if (!result)
10135 {
10136 LOG_WARN("server.loading", ">> Loaded 0 faction change quest pairs. DB table `player_factionchange_quests` is empty.");
10137 LOG_INFO("server.loading", " ");
10138 return;
10139 }
10140
10141 uint32 count = 0;
10142
10143 do
10144 {
10145 Field* fields = result->Fetch();
10146
10147 uint32 alliance = fields[0].Get<uint32>();
10148 uint32 horde = fields[1].Get<uint32>();
10149
10150 if (!GetQuestTemplate(alliance))
10151 LOG_ERROR("sql.sql", "Quest {} (alliance_id) referenced in `player_factionchange_quests` does not exist, pair skipped!", alliance);
10152 else if (!GetQuestTemplate(horde))
10153 LOG_ERROR("sql.sql", "Quest {} (horde_id) referenced in `player_factionchange_quests` does not exist, pair skipped!", horde);
10154 else
10155 FactionChangeQuests[alliance] = horde;
10156
10157 ++count;
10158 } while (result->NextRow());
10159
10160 LOG_INFO("server.loading", ">> Loaded {} faction change quest pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10161 LOG_INFO("server.loading", " ");
10162}
CharacterConversionMap FactionChangeQuests
Definition ObjectMgr.h:1434

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

◆ LoadFactionChangeReputations()

void ObjectMgr::LoadFactionChangeReputations ( )
10165{
10166 uint32 oldMSTime = getMSTime();
10167
10168 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_reputations");
10169
10170 if (!result)
10171 {
10172 LOG_WARN("server.loading", ">> Loaded 0 faction change reputation pairs. DB table `player_factionchange_reputations` is empty.");
10173 LOG_INFO("server.loading", " ");
10174 return;
10175 }
10176
10177 uint32 count = 0;
10178
10179 do
10180 {
10181 Field* fields = result->Fetch();
10182
10183 uint32 alliance = fields[0].Get<uint32>();
10184 uint32 horde = fields[1].Get<uint32>();
10185
10186 if (!sFactionStore.LookupEntry(alliance))
10187 LOG_ERROR("sql.sql", "Reputation {} (alliance_id) referenced in `player_factionchange_reputations` does not exist, pair skipped!", alliance);
10188 else if (!sFactionStore.LookupEntry(horde))
10189 LOG_ERROR("sql.sql", "Reputation {} (horde_id) referenced in `player_factionchange_reputations` does not exist, pair skipped!", horde);
10190 else
10191 FactionChangeReputation[alliance] = horde;
10192
10193 ++count;
10194 } while (result->NextRow());
10195
10196 LOG_INFO("server.loading", ">> Loaded {} faction change reputation pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10197 LOG_INFO("server.loading", " ");
10198}
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 ( )
10201{
10202 uint32 oldMSTime = getMSTime();
10203
10204 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_spells");
10205
10206 if (!result)
10207 {
10208 LOG_WARN("server.loading", ">> Loaded 0 faction change spell pairs. DB table `player_factionchange_spells` is empty.");
10209 LOG_INFO("server.loading", " ");
10210 return;
10211 }
10212
10213 uint32 count = 0;
10214
10215 do
10216 {
10217 Field* fields = result->Fetch();
10218
10219 uint32 alliance = fields[0].Get<uint32>();
10220 uint32 horde = fields[1].Get<uint32>();
10221
10222 if (!sSpellMgr->GetSpellInfo(alliance))
10223 LOG_ERROR("sql.sql", "Spell {} (alliance_id) referenced in `player_factionchange_spells` does not exist, pair skipped!", alliance);
10224 else if (!sSpellMgr->GetSpellInfo(horde))
10225 LOG_ERROR("sql.sql", "Spell {} (horde_id) referenced in `player_factionchange_spells` does not exist, pair skipped!", horde);
10226 else
10227 FactionChangeSpells[alliance] = horde;
10228
10229 ++count;
10230 } while (result->NextRow());
10231
10232 LOG_INFO("server.loading", ">> Loaded {} faction change spell pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10233 LOG_INFO("server.loading", " ");
10234}
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 ( )
10237{
10238 uint32 oldMSTime = getMSTime();
10239
10240 QueryResult result = WorldDatabase.Query("SELECT alliance_id, horde_id FROM player_factionchange_titles");
10241
10242 if (!result)
10243 {
10244 LOG_WARN("server.loading", ">> Loaded 0 faction change title pairs. DB table `player_factionchange_title` is empty.");
10245 return;
10246 }
10247
10248 uint32 count = 0;
10249
10250 do
10251 {
10252 Field* fields = result->Fetch();
10253
10254 uint32 alliance = fields[0].Get<uint32>();
10255 uint32 horde = fields[1].Get<uint32>();
10256
10257 if (!sCharTitlesStore.LookupEntry(alliance))
10258 LOG_ERROR("sql.sql", "Title {} (alliance_id) referenced in `player_factionchange_title` does not exist, pair skipped!", alliance);
10259 else if (!sCharTitlesStore.LookupEntry(horde))
10260 LOG_ERROR("sql.sql", "Title {} (horde_id) referenced in `player_factionchange_title` does not exist, pair skipped!", horde);
10261 else
10262 FactionChangeTitles[alliance] = horde;
10263
10264 ++count;
10265 } while (result->NextRow());
10266
10267 LOG_INFO("server.loading", ">> Loaded {} faction change title pairs in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10268 LOG_INFO("server.loading", " ");
10269}
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 ( )
8960{
8961 uint32 oldMSTime = getMSTime();
8962
8963 _fishingBaseForAreaStore.clear(); // for reload case
8964
8965 QueryResult result = WorldDatabase.Query("SELECT entry, skill FROM skill_fishing_base_level");
8966
8967 if (!result)
8968 {
8969 LOG_WARN("server.loading", ">> Loaded 0 areas for fishing base skill level. DB table `skill_fishing_base_level` is empty.");
8970 LOG_INFO("server.loading", " ");
8971 return;
8972 }
8973
8974 uint32 count = 0;
8975
8976 do
8977 {
8978 Field* fields = result->Fetch();
8979 uint32 entry = fields[0].Get<uint32>();
8980 int32 skill = fields[1].Get<int16>();
8981
8982 AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry);
8983 if (!fArea)
8984 {
8985 LOG_ERROR("sql.sql", "AreaId {} defined in `skill_fishing_base_level` does not exist", entry);
8986 continue;
8987 }
8988
8989 _fishingBaseForAreaStore[entry] = skill;
8990 ++count;
8991 } while (result->NextRow());
8992
8993 LOG_INFO("server.loading", ">> Loaded {} areas for fishing base skill level in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8994 LOG_INFO("server.loading", " ");
8995}

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:1265
@ TOTAL_INVISIBILITY_TYPES
Definition SharedDefines.h:1279
@ INVISIBILITY_GENERAL
Definition SharedDefines.h:1266
Definition GameObjectData.h:683
uint32 InvisibilityValue
Definition GameObjectData.h:685
InvisibilityType invisibilityType
Definition GameObjectData.h:684

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

◆ LoadGameObjectForQuests()

void ObjectMgr::LoadGameObjectForQuests ( )
8746{
8747 uint32 oldMSTime = getMSTime();
8748
8749 if (GetGameObjectTemplates()->empty())
8750 {
8751 LOG_WARN("server.loading", ">> Loaded 0 GameObjects for quests");
8752 LOG_INFO("server.loading", " ");
8753 return;
8754 }
8755
8756 uint32 count = 0;
8757
8758 // collect GO entries for GO that must activated
8760 for (GameObjectTemplateContainer::iterator itr = gotc->begin(); itr != gotc->end(); ++itr)
8761 {
8762 itr->second.IsForQuests = false;
8763 switch (itr->second.type)
8764 {
8766 itr->second.IsForQuests = true;
8767 ++count;
8768 break;
8770 {
8771 // scan GO chest with loot including quest items
8772 uint32 loot_id = (itr->second.GetLootId());
8773
8774 // find quest loot for GO
8775 if (itr->second.chest.questId || LootTemplates_Gameobject.HaveQuestLootFor(loot_id))
8776 {
8777 itr->second.IsForQuests = true;
8778 ++count;
8779 }
8780 break;
8781 }
8783 {
8784 if (itr->second._generic.questID > 0) //quests objects
8785 {
8786 itr->second.IsForQuests = true;
8787 ++count;
8788 }
8789 break;
8790 }
8792 {
8793 if (itr->second.spellFocus.questID > 0) //quests objects
8794 {
8795 itr->second.IsForQuests = true;
8796 ++count;
8797 }
8798 break;
8799 }
8801 {
8802 if (itr->second.goober.questId > 0) //quests objects
8803 {
8804 itr->second.IsForQuests = true;
8805 ++count;
8806 }
8807 break;
8808 }
8809 default:
8810 break;
8811 }
8812 }
8813
8814 LOG_INFO("server.loading", ">> Loaded {} GameObjects for quests in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8815 LOG_INFO("server.loading", " ");
8816}
LootStore LootTemplates_Gameobject("gameobject_loot_template", "gameobject entry", true)
@ GAMEOBJECT_TYPE_SPELL_FOCUS
Definition SharedDefines.h:1579
@ GAMEOBJECT_TYPE_GENERIC
Definition SharedDefines.h:1576
@ GAMEOBJECT_TYPE_CHEST
Definition SharedDefines.h:1574
@ GAMEOBJECT_TYPE_QUESTGIVER
Definition SharedDefines.h:1573
@ GAMEOBJECT_TYPE_GOOBER
Definition SharedDefines.h:1581
bool HaveQuestLootFor(uint32 loot_id) const
Definition LootMgr.cpp:218

References GAMEOBJECT_TYPE_CHEST, GAMEOBJECT_TYPE_GENERIC, GAMEOBJECT_TYPE_GOOBER, GAMEOBJECT_TYPE_QUESTGIVER, GAMEOBJECT_TYPE_SPELL_FOCUS, GetGameObjectTemplates(), getMSTime(), GetMSTimeDiffToNow(), LootStore::HaveQuestLootFor(), LOG_INFO, LOG_WARN, and LootTemplates_Gameobject.

◆ LoadGameObjectLocales()

void ObjectMgr::LoadGameObjectLocales ( )
7282{
7283 uint32 oldMSTime = getMSTime();
7284
7285 _gameObjectLocaleStore.clear(); // need for reload case
7286
7287 // 0 1 2 3
7288 QueryResult result = WorldDatabase.Query("SELECT entry, locale, name, castBarCaption FROM gameobject_template_locale");
7289 if (!result)
7290 return;
7291
7292 do
7293 {
7294 Field* fields = result->Fetch();
7295
7296 uint32 ID = fields[0].Get<uint32>();
7297
7298 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
7299 if (locale == LOCALE_enUS)
7300 continue;
7301
7303 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
7304 AddLocaleString(fields[3].Get<std::string>(), locale, data.CastBarCaption);
7305 } while (result->NextRow());
7306
7307 LOG_INFO("server.loading", ">> Loaded {} Gameobject Locale Strings in {} ms", (uint32)_gameObjectLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
7308}
Definition GameObjectData.h:676
std::vector< std::string > Name
Definition GameObjectData.h:677
std::vector< std::string > CastBarCaption
Definition GameObjectData.h:678

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

◆ LoadGameobjectQuestEnders()

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

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameObjectQuestItems()

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

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

◆ LoadGameobjectQuestStarters()

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

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

Referenced by LoadQuestStartersAndEnders().

◆ LoadGameobjects()

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

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

◆ LoadGameObjectTemplate()

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

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

◆ LoadGameTele()

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

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

◆ LoadItemLocales()

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

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

◆ LoadItemSetNameLocales()

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

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

◆ LoadItemSetNames()

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

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

◆ LoadItemTemplates()

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

References _itemTemplateStore, _itemTemplateStoreFast, ALLIANCE, BAG_FAMILY_MASK_CURRENCY_TOKENS, ItemEntry::ClassID, CLASSMASK_ALL_PLAYABLE, CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES, DISABLE_TYPE_SPELL, ItemEntry::DisplayInfoID, Field::Get(), GetItemEnchantMod(), GetItemTemplate(), getMSTime(), GetMSTimeDiffToNow(), GetPageText(), GetScriptId(), HORDE, ItemEntry::InventoryType, INVTYPE_NON_EQUIP, ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ITEM_FLAGS_CU_DURATION_REAL_TIME, ITEM_MOD_SPELL_DAMAGE_DONE, ITEM_MOD_SPELL_HEALING_DONE, ITEM_QUALITY_NORMAL, ITEM_SPELLTRIGGER_LEARN_SPELL_ID, ITEM_SPELLTRIGGER_ON_USE, ItemTemplate::ItemId, CharStartOutfitEntry::ItemId, LOG_DEBUG, LOG_ERROR, LOG_INFO, LOG_WARN, ItemEntry::Material, MAX_BAG_SIZE, MAX_BIND_TYPE, MAX_ITEM_MOD, MAX_ITEM_PROTO_DAMAGES, MAX_ITEM_PROTO_SOCKETS, MAX_ITEM_PROTO_SPELLS, MAX_ITEM_PROTO_STATS, MAX_ITEM_QUALITY, MAX_ITEM_SPELLTRIGGER, MAX_OUTFIT_ITEMS, MAX_PET_DIET, MAX_REPUTATION_RANK, MAX_SKILL_TYPE, MAX_SPELL_SCHOOL, MIN_REPUTATION_RANK, qualityToBuyValueConfig, qualityToSellValueConfig, RACEMASK_ALL_PLAYABLE, sAreaTableStore, sCharStartOutfitStore, sCurrencyTypesStore, sDisableMgr, sFactionStore, sGemPropertiesStore, ItemEntry::SheatheType, sHolidaysStore, sItemBagFamilyStore, sItemLimitCategoryStore, sItemRandomPropertiesStore, sItemRandomSuffixStore, sItemSetStore, sItemStore, sLockStore, sMapStore, SOCKET_COLOR_ALL, ItemEntry::SoundOverrideSubclassID, sSpellMgr, sSpellsByCategoryStore, sTotemCategoryStore, ItemEntry::SubclassID, sWorld, and WorldDatabase.

◆ LoadLinkedRespawn()

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

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

◆ LoadModuleStringsLocale()

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

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

◆ LoadNPCSpellClickSpells()

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

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

◆ LoadNpcTextLocales()

void ObjectMgr::LoadNpcTextLocales ( )
6261{
6262 uint32 oldMSTime = getMSTime();
6263
6264 _npcTextLocaleStore.clear(); // need for reload case
6265
6266 QueryResult result = WorldDatabase.Query("SELECT ID, Locale, "
6267 // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
6268 "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 "
6269 "FROM npc_text_locale");
6270
6271 if (!result)
6272 return;
6273
6274 do
6275 {
6276 Field* fields = result->Fetch();
6277
6278 uint32 ID = fields[0].Get<uint32>();
6279
6280 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
6281 if (locale == LOCALE_enUS)
6282 continue;
6283
6285 for (uint8 i = 0; i < MAX_GOSSIP_TEXT_OPTIONS; ++i)
6286 {
6287 AddLocaleString(fields[2 + i * 2].Get<std::string>(), locale, data.Text_0[i]);
6288 AddLocaleString(fields[3 + i * 2].Get<std::string>(), locale, data.Text_1[i]);
6289 }
6290 } while (result->NextRow());
6291
6292 LOG_INFO("server.loading", ">> Loaded {} Npc Text Locale Strings in {} ms", (uint32)_npcTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6293}
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 ( )
6008{
6009 uint32 oldMSTime = getMSTime();
6010
6011 _pageTextLocaleStore.clear(); // need for reload case
6012
6013 // 0 1 2
6014 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Text FROM page_text_locale");
6015
6016 if (!result)
6017 {
6018 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text_locale` is empty!");
6019 LOG_INFO("server.loading", " ");
6020 return;
6021 }
6022
6023 do
6024 {
6025 Field* fields = result->Fetch();
6026
6027 uint32 ID = fields[0].Get<uint32>();
6028
6029 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
6030 if (locale == LOCALE_enUS)
6031 continue;
6032
6034 AddLocaleString(fields[2].Get<std::string>(), locale, data.Text);
6035 } while (result->NextRow());
6036
6037 LOG_INFO("server.loading", ">> Loaded {} Page Text Locale Strings in {} ms", (uint32)_pageTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6038}
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 ( )
5958{
5959 uint32 oldMSTime = getMSTime();
5960
5961 // 0 1 2
5962 QueryResult result = WorldDatabase.Query("SELECT ID, Text, NextPageID FROM page_text");
5963
5964 if (!result)
5965 {
5966 LOG_WARN("server.loading", ">> Loaded 0 page texts. DB table `page_text` is empty!");
5967 LOG_INFO("server.loading", " ");
5968 return;
5969 }
5970
5971 uint32 count = 0;
5972 do
5973 {
5974 Field* fields = result->Fetch();
5975
5976 PageText& pageText = _pageTextStore[fields[0].Get<uint32>()];
5977
5978 pageText.Text = fields[1].Get<std::string>();
5979 pageText.NextPage = fields[2].Get<uint32>();
5980
5981 ++count;
5982 } while (result->NextRow());
5983
5984 for (PageTextContainer::const_iterator itr = _pageTextStore.begin(); itr != _pageTextStore.end(); ++itr)
5985 {
5986 if (itr->second.NextPage)
5987 {
5988 PageTextContainer::const_iterator itr2 = _pageTextStore.find(itr->second.NextPage);
5989 if (itr2 == _pageTextStore.end())
5990 LOG_ERROR("sql.sql", "Page text (Id: {}) has not existing next page (Id: {})", itr->first, itr->second.NextPage);
5991 }
5992 }
5993
5994 LOG_INFO("server.loading", ">> Loaded {} Page Texts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5995 LOG_INFO("server.loading", " ");
5996}
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 ( )
3747{
3748 uint32 oldMSTime = getMSTime();
3749
3750 // 0 1 2 3 4 5 6 7 8 9 10 11
3751 QueryResult result = WorldDatabase.Query("SELECT creature_entry, level, hp, mana, str, agi, sta, inte, spi, armor, min_dmg, max_dmg FROM pet_levelstats");
3752
3753 if (!result)
3754 {
3755 LOG_WARN("server.loading", ">> Loaded 0 level pet stats definitions. DB table `pet_levelstats` is empty.");
3756 LOG_INFO("server.loading", " ");
3757 return;
3758 }
3759
3760 uint32 count = 0;
3761
3762 do
3763 {
3764 Field* fields = result->Fetch();
3765
3766 uint32 creature_id = fields[0].Get<uint32>();
3767 if (!GetCreatureTemplate(creature_id))
3768 {
3769 LOG_ERROR("sql.sql", "Wrong creature id {} in `pet_levelstats` table, ignoring.", creature_id);
3770 continue;
3771 }
3772
3773 uint32 current_level = fields[1].Get<uint8>();
3774 if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
3775 {
3776 if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
3777 LOG_ERROR("sql.sql", "Wrong (> {}) level {} in `pet_levelstats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
3778 else
3779 {
3780 LOG_DEBUG("sql.sql", "Unused (> MaxPlayerLevel in worldserver.conf) level {} in `pet_levelstats` table, ignoring.", current_level);
3781 ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
3782 }
3783 continue;
3784 }
3785 else if (current_level < 1)
3786 {
3787 LOG_ERROR("sql.sql", "Wrong (<1) level {} in `pet_levelstats` table, ignoring.", current_level);
3788 continue;
3789 }
3790
3791 PetLevelInfo*& pInfoMapEntry = _petInfoStore[creature_id];
3792
3793 if (!pInfoMapEntry)
3794 pInfoMapEntry = new PetLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
3795
3796 // data for level 1 stored in [0] array element, ...
3797 PetLevelInfo* pLevelInfo = &pInfoMapEntry[current_level - 1];
3798
3799 pLevelInfo->health = fields[2].Get<uint32>();
3800 pLevelInfo->mana = fields[3].Get<uint32>();
3801 pLevelInfo->armor = fields[9].Get<uint32>();
3802 pLevelInfo->min_dmg = fields[10].Get<uint32>();
3803 pLevelInfo->max_dmg = fields[11].Get<uint32>();
3804 for (uint8 i = 0; i < MAX_STATS; i++)
3805 {
3806 pLevelInfo->stats[i] = fields[i + 4].Get<uint32>();
3807 }
3808
3809 ++count;
3810 } while (result->NextRow());
3811
3812 // Fill gaps and check integrity
3813 for (PetLevelInfoContainer::iterator itr = _petInfoStore.begin(); itr != _petInfoStore.end(); ++itr)
3814 {
3815 PetLevelInfo* pInfo = itr->second;
3816
3817 // fatal error if no level 1 data
3818 if (!pInfo || pInfo[0].health == 0)
3819 {
3820 LOG_ERROR("sql.sql", "Creature {} does not have pet stats data for Level 1!", itr->first);
3821 exit(1);
3822 }
3823
3824 // fill level gaps
3825 for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
3826 {
3827 if (pInfo[level].health == 0)
3828 {
3829 LOG_ERROR("sql.sql", "Creature {} has no data for Level {} pet stats data, using data of Level {}.", itr->first, level + 1, level);
3830 pInfo[level] = pInfo[level - 1];
3831 }
3832 }
3833 }
3834
3835 LOG_INFO("server.loading", ">> Loaded {} Level Pet Stats Definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
3836 LOG_INFO("server.loading", " ");
3837}
#define STRONG_MAX_LEVEL
Definition DBCEnums.h:43
#define MAX_STATS
Definition SharedDefines.h:276
Definition ObjectMgr.h:528
uint32 max_dmg
Definition ObjectMgr.h:539
uint32 mana
Definition ObjectMgr.h:536
uint32 min_dmg
Definition ObjectMgr.h:538
uint32 health
Definition ObjectMgr.h:535
std::array< uint32, MAX_STATS > stats
Definition ObjectMgr.h:534
uint32 armor
Definition ObjectMgr.h:537

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

◆ LoadPetNames()

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

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

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

◆ LoadPlayerInfo()

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

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:3572
SummonSlot
Definition SharedDefines.h:3560
Races
Definition SharedDefines.h:69

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

◆ LoadPointOfInterestLocales()

void ObjectMgr::LoadPointOfInterestLocales ( )
494{
495 uint32 oldMSTime = getMSTime();
496
497 _pointOfInterestLocaleStore.clear(); // need for reload case
498
499 // 0 1 2
500 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Name FROM points_of_interest_locale");
501
502 if (!result)
503 return;
504
505 do
506 {
507 Field* fields = result->Fetch();
508
509 uint32 ID = fields[0].Get<uint32>();
510
511 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
512 if (locale == LOCALE_enUS)
513 continue;
514
516 AddLocaleString(fields[2].Get<std::string>(), locale, data.Name);
517 } while (result->NextRow());
518
519 LOG_INFO("server.loading", ">> Loaded {} Points Of Interest Locale Strings in {} ms", (uint32)_pointOfInterestLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
520}
Definition CreatureData.h:355
std::vector< std::string > Name
Definition CreatureData.h:356

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

◆ LoadPointsOfInterest()

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

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

◆ LoadProfanityNamesFromDB()

void ObjectMgr::LoadProfanityNamesFromDB ( )
8463{
8464 uint32 oldMSTime = getMSTime();
8465
8466 _profanityNamesStore.clear(); // need for reload case
8467
8468 QueryResult result = CharacterDatabase.Query("SELECT name FROM profanity_name");
8469
8470 if (!result)
8471 {
8472 LOG_WARN("server.loading", ">> Loaded 0 profanity names. DB table `profanity_name` is empty!");
8473 return;
8474 }
8475
8476 uint32 count = 0;
8477
8478 Field* fields;
8479 do
8480 {
8481 fields = result->Fetch();
8482 std::string name = fields[0].Get<std::string>();
8483
8484 std::wstring wstr;
8485 if (!Utf8toWStr (name, wstr))
8486 {
8487 LOG_ERROR("sql.sql", "Table `profanity_name` have invalid name: {}", name);
8488 continue;
8489 }
8490
8491 wstrToLower(wstr);
8492
8493 _profanityNamesStore.insert(wstr);
8494 ++count;
8495 } while (result->NextRow());
8496
8497 LOG_INFO("server.loading", ">> Loaded {} profanity names from DB in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8498}

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

◆ LoadProfanityNamesFromDBC()

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

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

◆ LoadQuestAreaTriggers()

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

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

◆ LoadQuestGreetingsLocales()

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

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

◆ LoadQuestLocales()

void ObjectMgr::LoadQuestLocales ( )
5379{
5380 uint32 oldMSTime = getMSTime();
5381
5382 _questLocaleStore.clear(); // need for reload case
5383
5384 // 0 1 2 3 4 5 6 7 8 9 10
5385 QueryResult result = WorldDatabase.Query("SELECT ID, locale, Title, Details, Objectives, EndText, CompletedText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4 FROM quest_template_locale");
5386
5387 if (!result)
5388 return;
5389
5390 do
5391 {
5392 Field* fields = result->Fetch();
5393
5394 uint32 ID = fields[0].Get<uint32>();
5395
5396 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
5397 if (locale == LOCALE_enUS)
5398 continue;
5399
5400 QuestLocale& data = _questLocaleStore[ID];
5401 AddLocaleString(fields[2].Get<std::string>(), locale, data.Title);
5402 AddLocaleString(fields[3].Get<std::string>(), locale, data.Details);
5403 AddLocaleString(fields[4].Get<std::string>(), locale, data.Objectives);
5404 AddLocaleString(fields[5].Get<std::string>(), locale, data.AreaDescription);
5405 AddLocaleString(fields[6].Get<std::string>(), locale, data.CompletedText);
5406
5407 for (uint8 i = 0; i < 4; ++i)
5408 AddLocaleString(fields[i + 7].Get<std::string>(), locale, data.ObjectiveText[i]);
5409 } while (result->NextRow());
5410
5411 LOG_INFO("server.loading", ">> Loaded {} Quest Locale Strings in {} ms", (uint32)_questLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
5412}
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 ( )
10420{
10421 uint32 oldMSTime = getMSTime();
10422
10423 _questMoneyRewards.clear();
10424
10425 // 0 1 2 3 4 5 6 7 8 9 10
10426 QueryResult result = WorldDatabase.Query("SELECT `Level`, Money0, Money1, Money2, Money3, Money4, Money5, Money6, Money7, Money8, Money9 FROM `quest_money_reward` ORDER BY `Level`");
10427 if (!result)
10428 {
10429 LOG_WARN("server.loading", ">> Loaded 0 quest money rewards. DB table `quest_money_reward` is empty.");
10430 return;
10431 }
10432
10433 uint32 count = 0;
10434 do
10435 {
10436 Field* fields = result->Fetch();
10437 uint32 Level = fields[0].Get<uint32>();
10438
10439 QuestMoneyRewardArray& questMoneyReward = _questMoneyRewards[Level];
10440 questMoneyReward.fill(0);
10441
10442 for (uint8 i = 0; i < MAX_QUEST_MONEY_REWARDS; ++i)
10443 {
10444 questMoneyReward[i] = fields[1 + i].Get<uint32>();
10445 ++count;
10446 }
10447 } while (result->NextRow());
10448
10449 LOG_INFO("server.loading", ">> Loaded {} Quest Money Rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
10450 LOG_INFO("server.loading", " ");
10451}
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 ( )
6610{
6611 uint32 oldMSTime = getMSTime();
6612
6613 _questOfferRewardLocaleStore.clear(); // need for reload case
6614
6615 // 0 1 2
6616 QueryResult result = WorldDatabase.Query("SELECT Id, locale, RewardText FROM quest_offer_reward_locale");
6617 if (!result)
6618 return;
6619
6620 do
6621 {
6622 Field* fields = result->Fetch();
6623
6624 uint32 id = fields[0].Get<uint32>();
6625 std::string localeName = fields[1].Get<std::string>();
6626
6627 LocaleConstant locale = GetLocaleByName(localeName);
6628 if (locale == LOCALE_enUS)
6629 continue;
6630
6632 AddLocaleString(fields[2].Get<std::string>(), locale, data.RewardText);
6633 } while (result->NextRow());
6634
6635 LOG_INFO("server.loading", ">> Loaded {} Quest Offer Reward Locale Strings in {} ms", _questOfferRewardLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime));
6636}
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 ( )
8089{
8090 if (!sWorld->getBoolConfig(CONFIG_QUEST_POI_ENABLED))
8091 {
8092 LOG_INFO("server.loading", ">> Loaded 0 quest POI definitions. Disabled by config.");
8093 LOG_INFO("server.loading", " ");
8094 return;
8095 }
8096
8097 uint32 oldMSTime = getMSTime();
8098
8099 _questPOIStore.clear(); // need for reload case
8100
8101 uint32 count = 0;
8102
8103 // 0 1 2 3 4 5 6 7
8104 QueryResult result = WorldDatabase.Query("SELECT QuestID, id, ObjectiveIndex, MapID, WorldMapAreaId, Floor, Priority, Flags FROM quest_poi order by QuestID");
8105
8106 if (!result)
8107 {
8108 LOG_WARN("server.loading", ">> Loaded 0 quest POI definitions. DB table `quest_poi` is empty.");
8109 LOG_INFO("server.loading", " ");
8110 return;
8111 }
8112
8113 // 0 1 2 3
8114 QueryResult points = WorldDatabase.Query("SELECT QuestID, Idx1, X, Y FROM quest_poi_points ORDER BY QuestID DESC, Idx2");
8115
8116 std::vector<std::vector<std::vector<QuestPOIPoint> > > POIs;
8117
8118 if (points)
8119 {
8120 // The first result should have the highest questId
8121 Field* fields = points->Fetch();
8122 uint32 questIdMax = fields[0].Get<uint32>();
8123 POIs.resize(questIdMax + 1);
8124
8125 do
8126 {
8127 fields = points->Fetch();
8128
8129 uint32 questId = fields[0].Get<uint32>();
8130 uint32 id = fields[1].Get<uint32>();
8131 int32 x = fields[2].Get<int32>();
8132 int32 y = fields[3].Get<int32>();
8133
8134 if (POIs[questId].size() <= id + 1)
8135 POIs[questId].resize(id + 10);
8136
8137 QuestPOIPoint point(x, y);
8138 POIs[questId][id].push_back(point);
8139 } while (points->NextRow());
8140 }
8141
8142 do
8143 {
8144 Field* fields = result->Fetch();
8145
8146 uint32 questId = fields[0].Get<uint32>();
8147 uint32 id = fields[1].Get<uint32>();
8148 int32 objIndex = fields[2].Get<int32>();
8149 uint32 mapId = fields[3].Get<uint32>();
8150 uint32 WorldMapAreaId = fields[4].Get<uint32>();
8151 uint32 FloorId = fields[5].Get<uint32>();
8152 uint32 unk3 = fields[6].Get<uint32>();
8153 uint32 unk4 = fields[7].Get<uint32>();
8154
8155 QuestPOI POI(id, objIndex, mapId, WorldMapAreaId, FloorId, unk3, unk4);
8156 if (questId < POIs.size() && id < POIs[questId].size())
8157 {
8158 POI.points = POIs[questId][id];
8159 _questPOIStore[questId].push_back(POI);
8160 }
8161 else
8162 LOG_ERROR("sql.sql", "Table quest_poi references unknown quest points for quest {} POI id {}", questId, id);
8163
8164 ++count;
8165 } while (result->NextRow());
8166
8167 LOG_INFO("server.loading", ">> Loaded {} Quest POI definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8168 LOG_INFO("server.loading", " ");
8169}
@ CONFIG_QUEST_POI_ENABLED
Definition WorldConfig.h:134
Definition ObjectMgr.h:638
Definition ObjectMgr.h:647

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

◆ LoadQuestRelationsHelper()

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

References _questTemplates, _questTemplatesFast, Quest::AllowableRaces, CLASSMASK_ALL_PLAYABLE, SpellMgr::ComputeIsSpellValid(), DISABLE_TYPE_QUEST, SpellInfo::Effects, Quest::ExclusiveGroup, Quest::Flags, Field::Get(), Quest::GetCharTitleId(), GetCreatureTemplate(), GetGameObjectTemplate(), GetItemTemplate(), getMSTime(), GetMSTimeDiffToNow(), Quest::GetNextQuestId(), Quest::GetPrevQuestId(), Quest::GetQuestId(), Quest::GetQuestMethod(), GetQuestTemplate(), GetTalentSpellCost(), Quest::HasSpecialFlag(), SpellInfo::Id, Quest::ItemDrop, Quest::ItemDropQuantity, LOG_ERROR, LOG_INFO, LOG_WARN, MAX_SPELL_EFFECTS, mExclusiveQuestGroups, Quest::NextQuestId, Quest::PrevQuestId, Quest::prevQuests, QUEST_FLAGS_DAILY, QUEST_FLAGS_TRACKING, QUEST_FLAGS_WEEKLY, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_REPUTATIONS_COUNT, QUEST_REWARD_CHOICES_COUNT, QUEST_REWARDS_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DB_ALLOWED, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_MONTHLY, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_SPECIAL_FLAGS_REPEATABLE, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_SPECIAL_FLAGS_TIMED, RACEMASK_ALL_PLAYABLE, ReputationMgr::Reputation_Cap, Quest::RequiredClasses, Quest::RequiredFactionId1, Quest::RequiredFactionId2, Quest::RequiredFactionValue1, Quest::RequiredFactionValue2, Quest::RequiredItemCount, Quest::RequiredItemId, Quest::RequiredMaxRepFaction, Quest::RequiredMaxRepValue, Quest::RequiredMinRepFaction, Quest::RequiredMinRepValue, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, Quest::RequiredPlayerKills, Quest::RequiredSkillId, Quest::RequiredSkillPoints, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, Quest::RewardDisplaySpell, Quest::RewardFactionId, Quest::RewardFactionValueId, Quest::RewardFactionValueIdOverride, Quest::RewardItemId, Quest::RewardItemIdCount, Quest::RewardMailDelay, Quest::RewardMailSenderEntry, Quest::RewardMailTemplateId, Quest::RewardNextQuest, Quest::RewardSpell, Quest::RewardTitleId, sAreaTableStore, sCharTitlesStore, sDisableMgr, Quest::SetSpecialFlag(), sFactionStore, SkillByQuestSort(), sMailTemplateStore, Quest::SourceSpellid, Quest::SpecialFlags, SPELL_EFFECT_QUEST_COMPLETE, sQuestSortStore, sSkillLineStore, sSpellMgr, Quest::StartItem, Quest::StartItemCount, sWorld, Quest::TimeAllowed, WorldDatabase, and Quest::ZoneOrSort.

◆ LoadQuestStartersAndEnders()

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

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

◆ LoadReferenceVendor()

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

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

References _repSpilloverTemplateStore, RepSpilloverTemplate::faction, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, MAX_REPUTATION_RANK, MAX_SPILLOVER_FACTIONS, FactionEntry::reputationListID, sFactionStore, and WorldDatabase.

◆ LoadReservedPlayerNamesDB()

void ObjectMgr::LoadReservedPlayerNamesDB ( )
8360{
8361 uint32 oldMSTime = getMSTime();
8362
8363 _reservedNamesStore.clear(); // need for reload case
8364
8365 QueryResult result = CharacterDatabase.Query("SELECT name FROM reserved_name");
8366
8367 if (!result)
8368 {
8369 LOG_WARN("server.loading", ">> Loaded 0 reserved names. DB table `reserved_name` is empty!");
8370 return;
8371 }
8372
8373 uint32 count = 0;
8374
8375 Field* fields;
8376 do
8377 {
8378 fields = result->Fetch();
8379 std::string name = fields[0].Get<std::string>();
8380
8381 std::wstring wstr;
8382 if (!Utf8toWStr (name, wstr))
8383 {
8384 LOG_ERROR("sql.sql", "Table `reserved_name` have invalid name: {}", name);
8385 continue;
8386 }
8387
8388 wstrToLower(wstr);
8389
8390 _reservedNamesStore.insert(wstr);
8391 ++count;
8392 } while (result->NextRow());
8393
8394 LOG_INFO("server.loading", ">> Loaded {} reserved names from DB in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
8395}

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

◆ LoadReservedPlayerNamesDBC()

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

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

◆ LoadScriptNames()

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

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

◆ LoadScripts()

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

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

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

◆ LoadSpellScriptNames()

void ObjectMgr::LoadSpellScriptNames ( )
5828{
5829 uint32 oldMSTime = getMSTime();
5830
5831 _spellScriptsStore.clear(); // need for reload case
5832
5833 QueryResult result = WorldDatabase.Query("SELECT spell_id, ScriptName FROM spell_script_names");
5834
5835 if (!result)
5836 {
5837 LOG_WARN("server.loading", ">> Loaded 0 spell script names. DB table `spell_script_names` is empty!");
5838 LOG_INFO("server.loading", " ");
5839 return;
5840 }
5841
5842 uint32 count = 0;
5843
5844 do
5845 {
5846 Field* fields = result->Fetch();
5847
5848 int32 spellId = fields[0].Get<int32>();
5849 std::string scriptName = fields[1].Get<std::string>();
5850
5851 bool allRanks = false;
5852 if (spellId <= 0)
5853 {
5854 allRanks = true;
5855 spellId = -spellId;
5856 }
5857
5858 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
5859 if (!spellInfo)
5860 {
5861 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) does not exist in `Spell.dbc`.", scriptName, fields[0].Get<int32>());
5862 continue;
5863 }
5864
5865 if (allRanks)
5866 {
5867 if (sSpellMgr->GetFirstSpellInChain(spellId) != uint32(spellId))
5868 {
5869 LOG_ERROR("sql.sql", "Scriptname: `{}` spell (spell_id:{}) is not first rank of spell.", scriptName, fields[0].Get<int32>());
5870 continue;
5871 }
5872 while (spellInfo)
5873 {
5874 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
5875 spellInfo = spellInfo->GetNextRankSpell();
5876 }
5877 }
5878 else
5879 _spellScriptsStore.insert(SpellScriptsContainer::value_type(spellInfo->Id, GetScriptId(scriptName)));
5880 ++count;
5881 } while (result->NextRow());
5882
5883 LOG_INFO("server.loading", ">> Loaded {} spell script names in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5884 LOG_INFO("server.loading", " ");
5885}
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 ( )
5729{
5731
5732 // check ids
5733 for (ScriptMapMap::const_iterator itr = sSpellScripts.begin(); itr != sSpellScripts.end(); ++itr)
5734 {
5735 uint32 spellId = uint32(itr->first) & 0x00FFFFFF;
5736 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
5737
5738 if (!spellInfo)
5739 {
5740 LOG_ERROR("sql.sql", "Table `spell_scripts` has not existing spell (Id: {}) as script id", spellId);
5741 continue;
5742 }
5743
5744 SpellEffIndex i = SpellEffIndex((uint32(itr->first) >> 24) & 0x000000FF);
5745 if (uint32(i) >= MAX_SPELL_EFFECTS)
5746 {
5747 LOG_ERROR("sql.sql", "Table `spell_scripts` has too high effect index {} for spell (Id: {}) as script id", uint32(i), spellId);
5748 }
5749
5750 //check for correct spellEffect
5751 if (!spellInfo->Effects[i].Effect || (spellInfo->Effects[i].Effect != SPELL_EFFECT_SCRIPT_EFFECT && spellInfo->Effects[i].Effect != SPELL_EFFECT_DUMMY))
5752 LOG_ERROR("sql.sql", "Table `spell_scripts` - spell {} effect {} is not SPELL_EFFECT_SCRIPT_EFFECT or SPELL_EFFECT_DUMMY", spellId, uint32(i));
5753 }
5754}
ScriptMapMap sSpellScripts
Definition ObjectMgr.cpp:59
SpellEffIndex
Definition SharedDefines.h:30
@ SPELL_EFFECT_DUMMY
Definition SharedDefines.h:792
@ SPELL_EFFECT_SCRIPT_EFFECT
Definition SharedDefines.h:866

References SpellInfo::Effects, LoadScripts(), LOG_ERROR, MAX_SPELL_EFFECTS, SCRIPTS_SPELL, SPELL_EFFECT_DUMMY, SPELL_EFFECT_SCRIPT_EFFECT, sSpellMgr, and sSpellScripts.

◆ LoadTavernAreaTriggers()

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

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:47
@ TEMPSUMMON_MANUAL_DESPAWN
Definition Object.h:55
SummonerType
Definition TemporarySummon.h:24
@ SUMMONER_TYPE_MAP
Definition TemporarySummon.h:27
@ SUMMONER_TYPE_CREATURE
Definition TemporarySummon.h:25
@ SUMMONER_TYPE_GAMEOBJECT
Definition TemporarySummon.h:26
void Relocate(float x, float y)
Definition Position.h:77
Stores data for temp summons.
Definition TemporarySummon.h:32
TempSummonType type
Summon type, see TempSummonType for available types.
Definition TemporarySummon.h:35
uint32 time
Despawn time, usable only with certain temp summon types.
Definition TemporarySummon.h:36
uint32 entry
Entry of summoned creature.
Definition TemporarySummon.h:33
Position pos
Position, where should be creature spawned.
Definition TemporarySummon.h:34

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

◆ LoadTrainerSpell()

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

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

◆ LoadVehicleAccessories()

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

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

◆ LoadVehicleSeatAddon()

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

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

◆ LoadVendors()

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

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

◆ LoadWaypointScripts()

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

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

Referenced by LoadPlayerInfo().

◆ RemoveCreatureFromGrid()

void ObjectMgr::RemoveCreatureFromGrid ( ObjectGuid::LowType  guid,
CreatureData const *  data 
)
2488{
2489 uint8 mask = data->spawnMask;
2490 for (uint8 i = 0; mask != 0; i++, mask >>= 1)
2491 {
2492 if (mask & 1)
2493 {
2494 GridCoord gridCoord = Acore::ComputeGridCoord(data->posX, data->posY);
2495 CellObjectGuids& cell_guids = _mapObjectGuidsStore[MAKE_PAIR32(data->mapid, i)][gridCoord.GetId()];
2496 cell_guids.creatures.erase(guid);
2497 }
2498 }
2499}

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

Referenced by DeleteCreatureData().

◆ RemoveGameobjectFromGrid()

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

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

Referenced by DeleteGOData().

◆ RemoveVendorItem()

bool ObjectMgr::RemoveVendorItem ( uint32  entry,
uint32  item,
bool  persist = true 
)
9644{
9645 CacheVendorItemContainer::iterator iter = _cacheVendorItemStore.find(entry);
9646 if (iter == _cacheVendorItemStore.end())
9647 return false;
9648
9649 if (!iter->second.RemoveItem(item))
9650 return false;
9651
9652 if (persist)
9653 {
9655
9656 stmt->SetData(0, entry);
9657 stmt->SetData(1, item);
9658
9659 WorldDatabase.Execute(stmt);
9660 }
9661
9662 return true;
9663}
@ WORLD_DEL_NPC_VENDOR
Definition WorldDatabase.h:44

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

◆ ReturnOrDeleteOldMails()

void ObjectMgr::ReturnOrDeleteOldMails ( bool  serverUp)
6296{
6297 uint32 oldMSTime = getMSTime();
6298
6299 time_t curTime = GameTime::GetGameTime().count();
6300
6302 stmt->SetData(0, uint32(curTime));
6303 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6304 if (!result)
6305 return;
6306
6307 std::map<uint32 /*messageId*/, MailItemInfoVec> itemsCache;
6308 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_EXPIRED_MAIL_ITEMS);
6309 stmt->SetData(0, uint32(curTime));
6310 if (PreparedQueryResult items = CharacterDatabase.Query(stmt))
6311 {
6312 MailItemInfo item;
6313 do
6314 {
6315 Field* fields = items->Fetch();
6316 item.item_guid = fields[0].Get<uint32>();
6317 item.item_template = fields[1].Get<uint32>();
6318 uint32 mailId = fields[2].Get<uint32>();
6319 itemsCache[mailId].push_back(item);
6320 } while (items->NextRow());
6321 }
6322
6323 uint32 deletedCount = 0;
6324 uint32 returnedCount = 0;
6325 do
6326 {
6327 Field* fields = result->Fetch();
6328 Mail* m = new Mail;
6329 m->messageID = fields[0].Get<uint32>();
6330 m->messageType = fields[1].Get<uint8>();
6331 m->sender = fields[2].Get<uint32>();
6332 m->receiver = fields[3].Get<uint32>();
6333 bool has_items = fields[4].Get<bool>();
6334 m->expire_time = time_t(fields[5].Get<uint32>());
6335 m->deliver_time = time_t(0);
6336 m->stationery = fields[6].Get<uint8>();
6337 m->checked = fields[7].Get<uint8>();
6338 m->mailTemplateId = fields[8].Get<int16>();
6339
6340 Player* player = nullptr;
6341 if (serverUp)
6343
6344 if (player) // don't modify mails of a logged in player
6345 {
6346 delete m;
6347 continue;
6348 }
6349
6350 // Delete or return mail
6351 if (has_items)
6352 {
6353 // read items from cache
6354 m->items.swap(itemsCache[m->messageID]);
6355
6356 // If it is mail from non-player, or if it's already return mail, it shouldn't be returned, but deleted
6357 if (!m->IsSentByPlayer() || m->IsSentByGM() || (m->IsCODPayment() || m->IsReturnedMail()))
6358 {
6359 for (auto const& mailedItem : m->items)
6360 {
6361 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
6362 stmt->SetData(0, mailedItem.item_guid);
6363 CharacterDatabase.Execute(stmt);
6364 }
6365
6366 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
6367 stmt->SetData(0, m->messageID);
6368 CharacterDatabase.Execute(stmt);
6369 }
6370 else
6371 {
6372 // Mail will be returned
6373 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_RETURNED);
6374 stmt->SetData(0, m->receiver);
6375 stmt->SetData(1, m->sender);
6376 stmt->SetData(2, uint32(curTime + 30 * DAY));
6377 stmt->SetData(3, uint32(curTime));
6379 stmt->SetData(5, m->messageID);
6380 CharacterDatabase.Execute(stmt);
6381 for (auto const& mailedItem : m->items)
6382 {
6383 // Update receiver in mail items for its proper delivery, and in instance_item for avoid lost item at sender delete
6384 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL_ITEM_RECEIVER);
6385 stmt->SetData(0, m->sender);
6386 stmt->SetData(1, mailedItem.item_guid);
6387 CharacterDatabase.Execute(stmt);
6388
6389 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_OWNER);
6390 stmt->SetData(0, m->sender);
6391 stmt->SetData(1, mailedItem.item_guid);
6392 CharacterDatabase.Execute(stmt);
6393 }
6394
6395 // xinef: update global data
6396 sCharacterCache->IncreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->sender));
6397 sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver));
6398
6399 delete m;
6400 ++returnedCount;
6401 continue;
6402 }
6403 }
6404
6405 sCharacterCache->DecreaseCharacterMailCount(ObjectGuid(HighGuid::Player, m->receiver));
6406
6407 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
6408 stmt->SetData(0, m->messageID);
6409 CharacterDatabase.Execute(stmt);
6410 delete m;
6411 ++deletedCount;
6412 } while (result->NextRow());
6413
6414 LOG_INFO("server.loading", ">> Processed {} expired mails: {} deleted and {} returned in {} ms", deletedCount + returnedCount, deletedCount, returnedCount, GetMSTimeDiffToNow(oldMSTime));
6415 LOG_INFO("server.loading", " ");
6416}
#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:1072
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 ( )
7178{
7179 QueryResult result = CharacterDatabase.Query("SELECT MAX(guid) FROM characters");
7180 if (result)
7181 GetGuidSequenceGenerator<HighGuid::Player>().Set((*result)[0].Get<uint32>() + 1);
7182
7183 result = CharacterDatabase.Query("SELECT MAX(guid) FROM item_instance");
7184 if (result)
7185 GetGuidSequenceGenerator<HighGuid::Item>().Set((*result)[0].Get<uint32>() + 1);
7186
7187 // Cleanup other tables from not existed guids ( >= _hiItemGuid)
7188 CharacterDatabase.Execute("DELETE FROM character_inventory WHERE item >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7189 CharacterDatabase.Execute("DELETE FROM mail_items WHERE item_guid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7190 CharacterDatabase.Execute("DELETE FROM auctionhouse WHERE itemguid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7191 CharacterDatabase.Execute("DELETE FROM guild_bank_item WHERE item_guid >= '{}'", GetGuidSequenceGenerator<HighGuid::Item>().GetNextAfterMaxUsed()); // One-time query
7192
7193 result = WorldDatabase.Query("SELECT MAX(guid) FROM transports");
7194 if (result)
7195 GetGuidSequenceGenerator<HighGuid::Mo_Transport>().Set((*result)[0].Get<uint32>() + 1);
7196
7197 result = CharacterDatabase.Query("SELECT MAX(id) FROM auctionhouse");
7198 if (result)
7199 _auctionId = (*result)[0].Get<uint32>() + 1;
7200
7201 result = CharacterDatabase.Query("SELECT MAX(id) FROM mail");
7202 if (result)
7203 _mailId = (*result)[0].Get<uint32>() + 1;
7204
7205 result = CharacterDatabase.Query("SELECT MAX(arenateamid) FROM arena_team");
7206 if (result)
7207 sArenaTeamMgr->SetNextArenaTeamId((*result)[0].Get<uint32>() + 1);
7208
7209 result = CharacterDatabase.Query("SELECT MAX(fight_id) FROM log_arena_fights");
7210 if (result)
7211 sArenaTeamMgr->SetLastArenaLogId((*result)[0].Get<uint32>());
7212
7213 result = CharacterDatabase.Query("SELECT MAX(setguid) FROM character_equipmentsets");
7214 if (result)
7215 _equipmentSetGuid = (*result)[0].Get<uint64>() + 1;
7216
7217 result = CharacterDatabase.Query("SELECT MAX(guildId) FROM guild");
7218 if (result)
7219 sGuildMgr->SetNextGuildId((*result)[0].Get<uint32>() + 1);
7220
7221 result = WorldDatabase.Query("SELECT MAX(guid) FROM creature");
7222 if (result)
7223 _creatureSpawnId = (*result)[0].Get<uint32>() + 1;
7224
7225 result = WorldDatabase.Query("SELECT MAX(guid) FROM gameobject");
7226 if (result)
7227 _gameObjectSpawnId = (*result)[0].Get<uint32>() + 1;
7228}
#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 ( )
5888{
5889 uint32 oldMSTime = getMSTime();
5890
5891 if (_spellScriptsStore.empty())
5892 {
5893 LOG_INFO("server.loading", ">> Validated 0 scripts.");
5894 LOG_INFO("server.loading", " ");
5895 return;
5896 }
5897
5898 uint32 count = 0;
5899
5900 for (SpellScriptsContainer::iterator itr = _spellScriptsStore.begin(); itr != _spellScriptsStore.end();)
5901 {
5902 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
5903 std::vector<std::pair<SpellScriptLoader*, SpellScriptsContainer::iterator> > SpellScriptLoaders;
5904 sScriptMgr->CreateSpellScriptLoaders(itr->first, SpellScriptLoaders);
5905 itr = _spellScriptsStore.upper_bound(itr->first);
5906
5907 for (std::vector<std::pair<SpellScriptLoader*, SpellScriptsContainer::iterator> >::iterator sitr = SpellScriptLoaders.begin(); sitr != SpellScriptLoaders.end(); ++sitr)
5908 {
5909 SpellScript* spellScript = sitr->first->GetSpellScript();
5910 AuraScript* auraScript = sitr->first->GetAuraScript();
5911 bool valid = true;
5912 if (!spellScript && !auraScript)
5913 {
5914 LOG_ERROR("sql.sql", "Functions GetSpellScript() and GetAuraScript() of script `{}` do not return objects - script skipped", GetScriptName(sitr->second->second));
5915 valid = false;
5916 }
5917 if (spellScript)
5918 {
5919 spellScript->_Init(&sitr->first->GetName(), spellInfo->Id);
5920 spellScript->_Register();
5921 if (!spellScript->_Validate(spellInfo))
5922 valid = false;
5923 delete spellScript;
5924 }
5925 if (auraScript)
5926 {
5927 auraScript->_Init(&sitr->first->GetName(), spellInfo->Id);
5928 auraScript->_Register();
5929 if (!auraScript->_Validate(spellInfo))
5930 valid = false;
5931 delete auraScript;
5932 }
5933 if (!valid)
5934 {
5935 _spellScriptsStore.erase(sitr->second);
5936 }
5937 }
5938 ++count;
5939 }
5940
5941 LOG_INFO("server.loading", ">> Validated {} scripts in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
5942 LOG_INFO("server.loading", " ");
5943}
Definition SpellScript.h:517
bool _Validate(SpellInfo const *entry) override
Definition SpellScript.cpp:662
std::string const & GetScriptName(uint32 id) const
Definition ObjectMgr.cpp:9801
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: