93 {
"add", npcAddCommandTable },
94 {
"set", npcSetCommandTable },
115 {
"npc", npcCommandTable },
137 if (
Creature* creature = trans->CreateNPCPassenger(guid, &data))
139 creature->SaveToDB(trans->GetGOInfo()->moTransport.SpawnMap, { map->GetDifficultyID() });
150 creature->
SaveToDB(map->
GetId(), { map->GetDifficultyID() });
186 uint32 maxcount = mc.value_or(0);
187 uint32 incrtime = it.value_or(0);
188 uint32 extendedcost = ec.value_or(0);
209 sObjectMgr->AddVendorItem(vendor_entry, vItem);
242 if (
sWorld->getAllowMovement())
244 sWorld->SetAllowMovement(
false);
249 sWorld->SetAllowMovement(
true);
286 if (!creature || creature->
IsPet())
305 spawnId = *spawnIdArg;
309 if (!creature || creature->
IsPet() || creature->
IsTotem())
485 memcpy(&npcflags, target->
m_unitData->NpcFlags.begin(),
sizeof(npcflags));
486 uint64 mechanicImmuneMask = 0;
488 mechanicImmuneMask = immunities->Mechanic.to_ullong();
495 if (curRespawnDelay < 0)
513 for (
UnitFlags flag : EnumUtils::Iterate<UnitFlags>())
518 for (
UnitFlags2 flag : EnumUtils::Iterate<UnitFlags2>())
523 for (
UnitFlags3 flag : EnumUtils::Iterate<UnitFlags3>())
555 for (
NPCFlags flag : EnumUtils::Iterate<NPCFlags>())
559 for (
NPCFlags2 flag : EnumUtils::Iterate<NPCFlags2>())
564 for (
Mechanics m : EnumUtils::Iterate<Mechanics>())
565 if (m && (mechanicImmuneMask & (
UI64LIT(1) << m)))
573 float distance = dist.value_or(10.0f);
586 stmt->
setFloat(7, distance * distance);
593 Field* fields = result->Fetch();
602 if (!creatureTemplate)
609 while (result->NextRow());
625 if (!spawnid && !creature)
647 const_cast<CreatureData*
>(data)->spawnPoint.Relocate(*player);
688 if (!creature || creature->
IsPet())
731 bool doNotDelete = nodel.has_value();
739 if (!creature || creature->
IsPet())
771 switch (type.index())
793 if (doNotDelete ==
false)
805 if (doNotDelete ==
false)
824 int32 phaseGroupId = atoi(args);
827 if (!creature || creature->
IsPet())
855 if (!creature || creature->
IsPet())
994 FollowMovementGenerator const* followMovement = dynamic_cast<FollowMovementGenerator const*>(a);
995 return followMovement && followMovement->GetTarget() == player;
1083 if (!creatureTarget || creatureTarget->
IsPet())
1149 if (!creatureTarget || creatureTarget->
IsPet())
1173 char const* name =
nullptr;
1177 name =
"Unknown item";
1184 for (NotNormalLootItemMap::value_type
const& pair : map)
1191 for (
auto it = pair.second->cbegin(); it != pair.second->cend(); ++it)
1193 LootItem const& item = items[it->LootListId];
1194 if (!(it->is_looted) && !item.
is_looted)
1202 if (!creatureTarget || creatureTarget->
IsPet())
1209 Loot const* loot = creatureTarget->
m_loot.get();
1270 sFormationMgr->AddFormationMember(lowguid, followAngle, followDist, leaderGUID, groupAI);
1373 bool ignoreRespawn =
false;
1378 for (
auto const& variant : opts)
1380 switch (variant.index())
1383 groupId = variant.get<
uint32>();
1389 ignoreRespawn =
true;
1396 std::vector <WorldObject*> creatureList;
1414 bool deleteRespawnTimes =
false;
1418 for (
auto const& variant : opts)
1420 if (variant.holds_alternative<
uint32>())
1421 groupId = variant.get<
uint32>();
1423 deleteRespawnTimes =
true;
DB2Storage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", &CreatureDisplayInfoLoadInfo::Instance)
DB2Storage< FactionTemplateEntry > sFactionTemplateStore("FactionTemplate.db2", &FactionTemplateLoadInfo::Instance)
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
#define STRING_VIEW_FMT_ARG(str)
@ LANG_OBJECTINFO_STRINGIDS
@ LANG_COMMAND_NPC_SHOWLOOT_ENTRY
@ LANG_SPAWNGROUP_SPAWNCOUNT
@ LANG_CREATURE_NON_TAMEABLE
@ LANG_CREATURE_NOT_FOLLOW_YOU
@ LANG_CREATURE_FOLLOW_YOU_NOW
@ LANG_YOU_ALREADY_HAVE_PET
@ LANG_CREATURE_NOT_AI_ENABLED
@ LANG_CREATURE_MOVE_ENABLED
@ LANG_NPCINFO_DYNAMIC_FLAGS
@ LANG_COMMAND_NOT_DEAD_OR_NO_LOOT
@ LANG_NPCINFO_UNIT_FIELD_FLAGS
@ LANG_VALUE_SAVED_REJOIN
@ LANG_COMMAND_CREATUREMOVED
@ LANG_NPCINFO_REACTSTATE
@ LANG_COMMAND_DELCREATMESSAGE
@ LANG_CREATURE_NOT_FOLLOW_YOU_NOW
@ LANG_COMMAND_CREATUREATSAMEMAP
@ LANG_COMMAND_NEAR_NPC_MESSAGE
Old ones now free:
@ LANG_COMMAND_NEEDITEMSEND
@ LANG_NPCINFO_UNIT_FIELD_FLAGS_2
@ LANG_COMMAND_NPC_SHOWLOOT_ENTRY_2
@ LANG_COMMAND_VENDORSELECTION
@ LANG_COMMAND_NPC_SHOWLOOT_SUBLABEL
@ LANG_CREATURE_MOVE_DISABLED
@ LANG_ITEM_ADDED_TO_LIST
@ LANG_NPCINFO_MOVEMENT_DATA
@ LANG_ITEM_DELETED_FROM_LIST
@ LANG_MOVE_TYPE_SET_NODEL
@ LANG_COMMAND_INVALID_PARAM
@ LANG_SPAWNINFO_GROUP_ID
@ LANG_COMMAND_WANDER_DISTANCE
@ LANG_COMMAND_CREATGUIDNOTFOUND
@ LANG_NPCINFO_UNIT_FIELD_FLAGS_3
@ LANG_NPCINFO_FLAGS_EXTRA
@ LANG_CREATURE_LIST_CHAT
@ LANG_SPAWNINFO_COMPATIBILITY_MODE
@ LANG_COMMAND_RAWPAWNTIMES
@ LANG_COMMAND_NPC_SHOWLOOT_LABEL
@ LANG_SPAWNGROUP_BADGROUP
@ LANG_COMMAND_NPC_SHOWLOOT_LABEL_2
@ LANG_COMMAND_NPC_SHOWLOOT_HEADER
@ LANG_NPCINFO_DUNGEON_ID
@ LANG_NPCINFO_MECHANIC_IMMUNE
@ LANG_COMMAND_NPC_SHOWLOOT_MONEY
std::unordered_map< ObjectGuid, std::unique_ptr< NotNormalLootItemList > > NotNormalLootItemMap
@ TEMPSUMMON_CORPSE_DESPAWN
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
std::optional< T > Optional
Optional helper class to wrap optional values within.
Role Based Access Control related classes definition.
uint32 constexpr ItemQualityColors[MAX_ITEM_QUALITY]
@ EMOTE_ONESHOT_EXCLAMATION
NPCFlags
Non Player Character flags.
char const * DescribeReactState(ReactStates state)
bool StringEqualI(std::string_view a, std::string_view b)
std::string secsToTimeString(uint64 timeInSecs, TimeFormat timeFormat, bool hoursOnly)
@ WORLD_UPD_CREATURE_POSITION
@ WORLD_UPD_CREATURE_NPCFLAG
@ WORLD_SEL_CREATURE_NEAREST
@ WORLD_INS_CREATURE_FORMATION
@ WORLD_UPD_CREATURE_MOVEMENT_TYPE
@ WORLD_UPD_CREATURE_SPAWN_TIME_SECS
@ WORLD_UPD_CREATURE_WANDER_DISTANCE
@ WORLD_UPD_CREATURE_FACTION
WorldSession * GetSession()
virtual LocaleConstant GetSessionDbcLocale() const
Creature * GetCreatureFromPlayerMapByDbGuid(ObjectGuid::LowType lowguid)
void PSendSysMessage(const char *fmt, Args &&... args)
bool HasLowerSecurity(Player *target, ObjectGuid guid, bool strong=false)
Creature * getSelectedCreature()
void SetSentErrorMessage(bool val)
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
ObjectGuid::LowType GetLeaderSpawnId() const
int8 GetOriginalEquipmentId() const
void Respawn(bool force=false)
void setDeathState(DeathState s) override
static Creature * CreateCreatureFromDB(ObjectGuid::LowType spawnId, Map *map, bool addToMap=true, bool allowDuplicate=false)
bool GetRespawnCompatibilityMode() const
std::unique_ptr< Loot > m_loot
CreatureDifficulty const * GetCreatureDifficulty() const
static Creature * CreateCreature(uint32 entry, Map *map, Position const &pos, uint32 vehId=0)
void SetReactState(ReactStates st)
void SetRespawnDelay(uint32 delay)
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
bool UpdateEntry(uint32 entry, CreatureData const *data=nullptr, bool updateLevel=true)
CreatureData const * GetCreatureData() const
ObjectGuid::LowType GetSpawnId() const
CreatureTemplate const * GetCreatureTemplate() const
uint32 GetRespawnDelay() const
static bool DeleteFromDB(ObjectGuid::LowType spawnId)
std::array< std::string_view, 3 > const & GetStringIds() const
CreatureGroup * GetFormation()
void SetDisplayId(uint32 displayId, bool setNative=false) override
ReactStates GetReactState() const
void SetWanderDistance(float dist)
std::string GetScriptName() const
uint8 GetCurrentEquipmentId() const
CreatureMovementData const & GetMovementTemplate() const
time_t GetRespawnTimeEx() const
std::string const & GetAIName() const
void SetDefaultMovementType(MovementGeneratorType mgt)
void LoadPath(uint32 pathid)
static char const * ToTitle(Enum value)
Class used to access individual fields of database query result.
bool SpawnGroupSpawn(uint32 groupId, bool ignoreRespawn=false, bool force=false, std::vector< WorldObject * > *spawnedObjects=nullptr)
time_t GetCreatureRespawnTime(ObjectGuid::LowType spawnId) const
bool IsSpawnGroupActive(uint32 groupId) const
bool SpawnGroupDespawn(uint32 groupId, bool deleteRespawnTimes=false, size_t *count=nullptr)
void MoveFollow(Unit *target, float dist, ChaseAngle angle, Optional< Milliseconds > duration={}, MovementSlot slot=MOTION_SLOT_ACTIVE)
MovementGenerator * GetMovementGenerator(std::function< bool(MovementGenerator const *)> const &filter, MovementSlot slot=MOTION_SLOT_ACTIVE) const
void Remove(MovementGenerator *movement, MovementSlot slot=MOTION_SLOT_ACTIVE)
virtual MovementGeneratorType GetMovementGeneratorType() const =0
static ObjectGuid const Empty
std::string ToString() const
static Creature * ToCreature(Object *o)
uint32 GetDynamicFlags() const
static ObjectGuid GetGUID(Object const *o)
void SavePetToDB(PetSaveMode mode)
static void PrintToChat(ChatHandler *chat, WorldObject const *target)
static void AddPhase(WorldObject *object, uint32 phaseId, bool updateVisibility)
static void AddPhaseGroup(WorldObject *object, uint32 phaseGroupId, bool updateVisibility)
static void InheritPhaseShift(WorldObject *target, WorldObject const *source)
static void ResetPhaseShift(WorldObject *object)
bool CanTameExoticPets() const
void PetSpellInitialize()
void setFloat(const uint8 index, const float value)
void setUInt8(const uint8 index, const uint8 value)
void setUInt32(const uint8 index, const uint32 value)
void setUInt16(const uint8 index, const uint16 value)
void setUInt64(const uint8 index, const uint64 value)
static CreatureImmunities const * GetCreatureImmunities(int32 creatureImmunitiesId)
virtual void SetData(uint32, uint32)
void ClearUnitState(uint32 f)
void SetMinion(Minion *minion, bool apply)
void SetHealth(uint64 val)
bool HasUnitFlag3(UnitFlags3 flags) const
void ReplaceAllNpcFlags2(NPCFlags2 flags)
virtual void Say(std::string_view text, Language language, WorldObject const *target=nullptr)
UF::UpdateField< UF::UnitData, 0, TYPEID_UNIT > m_unitData
void SetFaction(uint32 faction) override
virtual void Yell(std::string_view text, Language language, WorldObject const *target=nullptr)
Pet * CreateTamedPetFrom(Creature *creatureTarget, uint32 spell_id=0)
MotionMaster * GetMotionMaster()
bool HasUnitFlag(UnitFlags flags) const
void CleanupsBeforeDelete(bool finalCleanup=true) override
bool HasUnitFlag2(UnitFlags2 flags) const
float GetCombatReach() const override
TempSummon * ToTempSummon()
bool HasNpcFlag2(NPCFlags2 flags) const
void SetEmoteState(Emote emote)
uint32 GetDisplayId() const
uint32 GetNativeDisplayId() const
uint64 GetMaxHealth() const
uint32 GetFaction() const override
virtual void TextEmote(std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
uint32 GetCreateHealth() const
bool HasNpcFlag(NPCFlags flags) const
void SetMaxHealth(uint64 val)
virtual float GetFollowAngle() const
void SetLevel(uint8 lvl, bool sendUpdate=true)
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
void ReplaceAllNpcFlags(NPCFlags flags)
virtual void Whisper(std::string_view text, Language language, Player *target, bool isBossWhisper=false)
ObjectGuid GetPetGUID() const
constexpr uint32 GetMapId() const
void GetClosePoint(float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0) const
float GetTransOffsetX() const
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
TransportBase * GetTransport() const
uint32 GetInstanceId() const
float GetTransOffsetY() const
std::string const & GetName() const
float GetTransOffsetZ() const
float GetTransOffsetO() const
Player * GetPlayer() const
static bool HandleNpcAddFormationCommand(ChatHandler *handler, ObjectGuid::LowType leaderGUID)
static bool HandleNpcSetWanderDistanceCommand(ChatHandler *handler, float option)
static bool HandleNpcAddCommand(ChatHandler *handler, CreatureEntry id)
static bool HandleNpcTameCommand(ChatHandler *handler)
static bool HandleNpcTextEmoteCommand(ChatHandler *handler, Tail text)
static void _IterateNotNormalLootMap(ChatHandler *handler, NotNormalLootItemMap const &map, std::vector< LootItem > const &items)
static bool HandleNpcDeleteCommand(ChatHandler *handler, Optional< CreatureSpawnId > spawnIdArg)
static bool HandleNpcSetModelCommand(ChatHandler *handler, uint32 displayId)
static bool HandleNpcYellCommand(ChatHandler *handler, Tail text)
static bool HandleNpcSetFlagCommand(ChatHandler *handler, NPCFlags npcFlags, NPCFlags2 npcFlags2)
static bool HandleNpcFollowCommand(ChatHandler *handler)
static bool HandleNpcSetSpawnTimeCommand(ChatHandler *handler, uint32 spawnTime)
static bool HandleNpcAddVendorItemCommand(ChatHandler *handler, ItemTemplate const *item, Optional< uint32 > mc, Optional< uint32 > it, Optional< uint32 > ec, Optional< std::string_view > bonusListIDs)
static bool HandleNpcPlayEmoteCommand(ChatHandler *handler, uint32 emote)
static bool HandleNpcSetMoveTypeCommand(ChatHandler *handler, Optional< CreatureSpawnId > lowGuid, Variant< EXACT_SEQUENCE("stay"), EXACT_SEQUENCE("random"), EXACT_SEQUENCE("way")> type, Optional< EXACT_SEQUENCE("nodel")> nodel)
static bool HandleNpcUnFollowCommand(ChatHandler *handler)
static bool HandleNpcSetLevelCommand(ChatHandler *handler, uint8 lvl)
static bool HandleNpcSetAllowMovementCommand(ChatHandler *handler)
static bool HandleNpcShowLootCommand(ChatHandler *handler, Optional< EXACT_SEQUENCE("all")> all)
static bool HandleNpcSetPhaseCommand(ChatHandler *handler, uint32 phaseID)
static bool HandleNpcSayCommand(ChatHandler *handler, Tail text)
static bool HandleNpcInfoCommand(ChatHandler *handler)
static bool HandleNpcAddWeaponCommand(ChatHandler *handler, uint32 SlotID, ItemTemplate const *tmpItem)
static bool HandleNpcNearCommand(ChatHandler *handler, Optional< float > dist)
static bool HandleNpcDeleteVendorItemCommand(ChatHandler *handler, ItemTemplate const *item)
static bool HandleNpcEvadeCommand(ChatHandler *handler, Optional< EvadeReason > why, Optional< EXACT_SEQUENCE("force")> force)
static bool HandleNpcSetDataCommand(ChatHandler *handler, uint32 data_1, uint32 data_2)
static void _ShowLootEntry(ChatHandler *handler, uint32 itemId, uint8 itemCount, bool alternateString=false)
static bool HandleNpcSetPhaseGroup(ChatHandler *handler, char const *args)
static bool HandleNpcSetLinkCommand(ChatHandler *handler, ObjectGuid::LowType linkguid)
static bool HandleNpcWhisperCommand(ChatHandler *handler, Variant< Hyperlink< player >, std::string_view > recv, Tail text)
ChatCommandTable GetCommands() const override
static bool HandleNpcMoveCommand(ChatHandler *handler, Optional< CreatureSpawnId > spawnid)
static bool HandleNpcSetFactionIdCommand(ChatHandler *handler, uint32 factionId)
static bool HandleNpcSetEntryCommand(ChatHandler *handler, CreatureEntry newEntryNum)
static bool HandleNpcAddMoveCommand(ChatHandler *handler, CreatureSpawnId lowGuid)
static bool HandleNpcAddTempSpawnCommand(ChatHandler *handler, Optional< std::string_view > lootStr, CreatureEntry id)
bool HandleNpcSpawnGroup(ChatHandler *handler, std::vector< Variant< uint32, EXACT_SEQUENCE("force"), EXACT_SEQUENCE("ignorerespawn")> > const &opts)
void AddSC_npc_commandscript()
bool HandleNpcDespawnGroup(ChatHandler *handler, std::vector< Variant< uint32, EXACT_SEQUENCE("removerespawntime")> > const &opts)
@ CONFIG_MAX_PLAYER_LEVEL
TC_GAME_API Player * FindPlayerByName(std::string_view name)
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
std::vector< ChatCommandBuilder > ChatCommandTable
std::string ToString(Type &&val, Params &&... params)
TC_COMMON_API std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
std::string GetTypeName()
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
@ RBAC_PERM_COMMAND_NPC_SET_LEVEL
@ RBAC_PERM_COMMAND_NPC_PLAYEMOTE
@ RBAC_PERM_COMMAND_NPC_FOLLOW
@ RBAC_PERM_COMMAND_NPC_EVADE
@ RBAC_PERM_COMMAND_NPC_INFO
@ RBAC_PERM_COMMAND_NPC_TEXTEMOTE
@ RBAC_PERM_COMMAND_NPC_ADD_FORMATION
@ RBAC_PERM_COMMAND_NPC_ADD
@ RBAC_PERM_COMMAND_NPC_NEAR
@ RBAC_PERM_COMMAND_NPC_SET_SPAWNDIST
@ RBAC_PERM_COMMAND_NPC_SET_PHASE
@ RBAC_PERM_COMMAND_NPC_DELETE
@ RBAC_PERM_COMMAND_NPC_SET_ENTRY
@ RBAC_PERM_COMMAND_NPC_DESPAWNGROUP
@ RBAC_PERM_COMMAND_NPC_TAME
@ RBAC_PERM_COMMAND_NPC_MOVE
@ RBAC_PERM_COMMAND_NPC_ADD_ITEM
@ RBAC_PERM_COMMAND_NPC_SET_SPAWNTIME
@ RBAC_PERM_COMMAND_NPC_SET_FACTIONID
@ RBAC_PERM_COMMAND_NPC_SET_MOVETYPE
@ RBAC_PERM_COMMAND_NPC_SPAWNGROUP
@ RBAC_PERM_COMMAND_NPC_SET_DATA
@ RBAC_PERM_COMMAND_NPC_SHOWLOOT
@ RBAC_PERM_COMMAND_NPC_SET_ALLOWMOVE
@ RBAC_PERM_COMMAND_NPC_SET_MODEL
@ RBAC_PERM_COMMAND_NPC_ADD_MOVE
@ RBAC_PERM_COMMAND_NPC_SET_LINK
@ RBAC_PERM_COMMAND_NPC_WHISPER
@ RBAC_PERM_COMMAND_NPC_SET_FLAG
@ RBAC_PERM_COMMAND_NPC_YELL
@ RBAC_PERM_COMMAND_NPC_SAY
@ RBAC_PERM_COMMAND_NPC_ADD_TEMP
@ RBAC_PERM_COMMAND_NPC_DELETE_ITEM
std::string ToString() const
int32 CreatureImmunitiesId
bool IsTameable(bool canTameExotic, CreatureDifficulty const *creatureDifficulty) const
uint32 GetQuality() const
char const * GetName(LocaleConstant locale) const
char const * GetDefaultLocaleName() const
ConditionsReference conditions
std::vector< LootItem > items
NotNormalLootItemMap const & GetPlayerFFAItems() const
constexpr float GetPositionX() const
constexpr float GetPositionY() const
float GetAbsoluteAngle(float x, float y) const
constexpr void GetPosition(float &x, float &y) const
constexpr void Relocate(float x, float y)
constexpr float GetOrientation() const
constexpr float GetPositionZ() const
std::vector< int32 > BonusListIDs