aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp209
1 files changed, 23 insertions, 186 deletions
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index a4558463224..a2e77968346 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -41,180 +41,13 @@ EndScriptData */
#include "PhasingHandler.h"
#include "Player.h"
#include "RBAC.h"
+#include "SmartEnum.h"
#include "Transport.h"
#include "World.h"
#include "WorldSession.h"
#include <boost/core/demangle.hpp>
#include <typeinfo>
-template<typename E, typename T = char const*>
-struct EnumName
-{
- E Value;
- T Name;
-};
-
-#define CREATE_NAMED_ENUM(VALUE) { VALUE, STRINGIZE(VALUE) }
-
-EnumName<NPCFlags, int32> const npcFlagTexts[] =
-{
- { UNIT_NPC_FLAG_AUCTIONEER, LANG_NPCINFO_AUCTIONEER },
- { UNIT_NPC_FLAG_BANKER, LANG_NPCINFO_BANKER },
- { UNIT_NPC_FLAG_BATTLEMASTER, LANG_NPCINFO_BATTLEMASTER },
- { UNIT_NPC_FLAG_FLIGHTMASTER, LANG_NPCINFO_FLIGHTMASTER },
- { UNIT_NPC_FLAG_GOSSIP, LANG_NPCINFO_GOSSIP },
- { UNIT_NPC_FLAG_GUILD_BANKER, LANG_NPCINFO_GUILD_BANKER },
- { UNIT_NPC_FLAG_INNKEEPER, LANG_NPCINFO_INNKEEPER },
- { UNIT_NPC_FLAG_PETITIONER, LANG_NPCINFO_PETITIONER },
- { UNIT_NPC_FLAG_PLAYER_VEHICLE, LANG_NPCINFO_PLAYER_VEHICLE },
- { UNIT_NPC_FLAG_QUESTGIVER, LANG_NPCINFO_QUESTGIVER },
- { UNIT_NPC_FLAG_REPAIR, LANG_NPCINFO_REPAIR },
- { UNIT_NPC_FLAG_SPELLCLICK, LANG_NPCINFO_SPELLCLICK },
- { UNIT_NPC_FLAG_SPIRITGUIDE, LANG_NPCINFO_SPIRITGUIDE },
- { UNIT_NPC_FLAG_SPIRITHEALER, LANG_NPCINFO_SPIRITHEALER },
- { UNIT_NPC_FLAG_STABLEMASTER, LANG_NPCINFO_STABLEMASTER },
- { UNIT_NPC_FLAG_TABARDDESIGNER, LANG_NPCINFO_TABARDDESIGNER },
- { UNIT_NPC_FLAG_TRAINER, LANG_NPCINFO_TRAINER },
- { UNIT_NPC_FLAG_TRAINER_CLASS, LANG_NPCINFO_TRAINER_CLASS },
- { UNIT_NPC_FLAG_TRAINER_PROFESSION, LANG_NPCINFO_TRAINER_PROFESSION },
- { UNIT_NPC_FLAG_VENDOR, LANG_NPCINFO_VENDOR },
- { UNIT_NPC_FLAG_VENDOR_AMMO, LANG_NPCINFO_VENDOR_AMMO },
- { UNIT_NPC_FLAG_VENDOR_FOOD, LANG_NPCINFO_VENDOR_FOOD },
- { UNIT_NPC_FLAG_VENDOR_POISON, LANG_NPCINFO_VENDOR_POISON },
- { UNIT_NPC_FLAG_VENDOR_REAGENT, LANG_NPCINFO_VENDOR_REAGENT }
-};
-
-uint32 const NPCFLAG_COUNT = std::extent<decltype(npcFlagTexts)>::value;
-
-EnumName<Mechanics> const mechanicImmunes[MAX_MECHANIC] =
-{
- CREATE_NAMED_ENUM(MECHANIC_NONE),
- CREATE_NAMED_ENUM(MECHANIC_CHARM),
- CREATE_NAMED_ENUM(MECHANIC_DISORIENTED),
- CREATE_NAMED_ENUM(MECHANIC_DISARM),
- CREATE_NAMED_ENUM(MECHANIC_DISTRACT),
- CREATE_NAMED_ENUM(MECHANIC_FEAR),
- CREATE_NAMED_ENUM(MECHANIC_GRIP),
- CREATE_NAMED_ENUM(MECHANIC_ROOT),
- CREATE_NAMED_ENUM(MECHANIC_SLOW_ATTACK),
- CREATE_NAMED_ENUM(MECHANIC_SILENCE),
- CREATE_NAMED_ENUM(MECHANIC_SLEEP),
- CREATE_NAMED_ENUM(MECHANIC_SNARE),
- CREATE_NAMED_ENUM(MECHANIC_STUN),
- CREATE_NAMED_ENUM(MECHANIC_FREEZE),
- CREATE_NAMED_ENUM(MECHANIC_KNOCKOUT),
- CREATE_NAMED_ENUM(MECHANIC_BLEED),
- CREATE_NAMED_ENUM(MECHANIC_BANDAGE),
- CREATE_NAMED_ENUM(MECHANIC_POLYMORPH),
- CREATE_NAMED_ENUM(MECHANIC_BANISH),
- CREATE_NAMED_ENUM(MECHANIC_SHIELD),
- CREATE_NAMED_ENUM(MECHANIC_SHACKLE),
- CREATE_NAMED_ENUM(MECHANIC_MOUNT),
- CREATE_NAMED_ENUM(MECHANIC_INFECTED),
- CREATE_NAMED_ENUM(MECHANIC_TURN),
- CREATE_NAMED_ENUM(MECHANIC_HORROR),
- CREATE_NAMED_ENUM(MECHANIC_INVULNERABILITY),
- CREATE_NAMED_ENUM(MECHANIC_INTERRUPT),
- CREATE_NAMED_ENUM(MECHANIC_DAZE),
- CREATE_NAMED_ENUM(MECHANIC_DISCOVERY),
- CREATE_NAMED_ENUM(MECHANIC_IMMUNE_SHIELD),
- CREATE_NAMED_ENUM(MECHANIC_SAPPED),
- CREATE_NAMED_ENUM(MECHANIC_ENRAGED),
- CREATE_NAMED_ENUM(MECHANIC_WOUNDED)
-};
-
-EnumName<UnitFlags> const unitFlags[MAX_UNIT_FLAGS] =
-{
- CREATE_NAMED_ENUM(UNIT_FLAG_SERVER_CONTROLLED),
- CREATE_NAMED_ENUM(UNIT_FLAG_NON_ATTACKABLE),
- CREATE_NAMED_ENUM(UNIT_FLAG_REMOVE_CLIENT_CONTROL),
- CREATE_NAMED_ENUM(UNIT_FLAG_PLAYER_CONTROLLED),
- CREATE_NAMED_ENUM(UNIT_FLAG_RENAME),
- CREATE_NAMED_ENUM(UNIT_FLAG_PREPARATION),
- CREATE_NAMED_ENUM(UNIT_FLAG_UNK_6),
- CREATE_NAMED_ENUM(UNIT_FLAG_NOT_ATTACKABLE_1),
- CREATE_NAMED_ENUM(UNIT_FLAG_IMMUNE_TO_PC),
- CREATE_NAMED_ENUM(UNIT_FLAG_IMMUNE_TO_NPC),
- CREATE_NAMED_ENUM(UNIT_FLAG_LOOTING),
- CREATE_NAMED_ENUM(UNIT_FLAG_PET_IN_COMBAT),
- CREATE_NAMED_ENUM(UNIT_FLAG_PVP),
- CREATE_NAMED_ENUM(UNIT_FLAG_SILENCED),
- CREATE_NAMED_ENUM(UNIT_FLAG_CANNOT_SWIM),
- CREATE_NAMED_ENUM(UNIT_FLAG_UNK_15),
- CREATE_NAMED_ENUM(UNIT_FLAG_NON_ATTACKABLE_2),
- CREATE_NAMED_ENUM(UNIT_FLAG_PACIFIED),
- CREATE_NAMED_ENUM(UNIT_FLAG_STUNNED),
- CREATE_NAMED_ENUM(UNIT_FLAG_IN_COMBAT),
- CREATE_NAMED_ENUM(UNIT_FLAG_TAXI_FLIGHT),
- CREATE_NAMED_ENUM(UNIT_FLAG_DISARMED),
- CREATE_NAMED_ENUM(UNIT_FLAG_CONFUSED),
- CREATE_NAMED_ENUM(UNIT_FLAG_FLEEING),
- CREATE_NAMED_ENUM(UNIT_FLAG_POSSESSED),
- CREATE_NAMED_ENUM(UNIT_FLAG_NOT_SELECTABLE),
- CREATE_NAMED_ENUM(UNIT_FLAG_SKINNABLE),
- CREATE_NAMED_ENUM(UNIT_FLAG_MOUNT),
- CREATE_NAMED_ENUM(UNIT_FLAG_UNK_28),
- CREATE_NAMED_ENUM(UNIT_FLAG_UNK_29),
- CREATE_NAMED_ENUM(UNIT_FLAG_SHEATHE),
- CREATE_NAMED_ENUM(UNIT_FLAG_UNK_31)
-};
-
-EnumName<UnitFlags2> const unitFlags2[MAX_UNIT_FLAGS_2] =
-{
- CREATE_NAMED_ENUM(UNIT_FLAG2_FEIGN_DEATH),
- CREATE_NAMED_ENUM(UNIT_FLAG2_UNK1),
- CREATE_NAMED_ENUM(UNIT_FLAG2_IGNORE_REPUTATION),
- CREATE_NAMED_ENUM(UNIT_FLAG2_COMPREHEND_LANG),
- CREATE_NAMED_ENUM(UNIT_FLAG2_MIRROR_IMAGE),
- CREATE_NAMED_ENUM(UNIT_FLAG2_INSTANTLY_APPEAR_MODEL),
- CREATE_NAMED_ENUM(UNIT_FLAG2_FORCE_MOVEMENT),
- CREATE_NAMED_ENUM(UNIT_FLAG2_DISARM_OFFHAND),
- CREATE_NAMED_ENUM(UNIT_FLAG2_DISABLE_PRED_STATS),
- CREATE_NAMED_ENUM(UNIT_FLAG2_DISARM_RANGED),
- CREATE_NAMED_ENUM(UNIT_FLAG2_REGENERATE_POWER),
- CREATE_NAMED_ENUM(UNIT_FLAG2_RESTRICT_PARTY_INTERACTION),
- CREATE_NAMED_ENUM(UNIT_FLAG2_PREVENT_SPELL_CLICK),
- CREATE_NAMED_ENUM(UNIT_FLAG2_ALLOW_ENEMY_INTERACT),
- CREATE_NAMED_ENUM(UNIT_FLAG2_DISABLE_TURN),
- CREATE_NAMED_ENUM(UNIT_FLAG2_UNK2),
- CREATE_NAMED_ENUM(UNIT_FLAG2_PLAY_DEATH_ANIM),
- CREATE_NAMED_ENUM(UNIT_FLAG2_ALLOW_CHEAT_SPELLS),
- CREATE_NAMED_ENUM(UNIT_FLAG2_NO_ACTIONS)
-};
-
-EnumName<UnitFlags3> const unitFlags3[MAX_UNIT_FLAGS_3] =
-{
- CREATE_NAMED_ENUM(UNIT_FLAG3_UNK1)
-};
-
-EnumName<CreatureFlagsExtra> const flagsExtra[] =
-{
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_INSTANCE_BIND),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_CIVILIAN),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_PARRY),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_BLOCK),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_CRUSH),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_XP_AT_KILL),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_TRIGGER),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_TAUNT),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_MOVE_FLAGS_UPDATE),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_SELL_VENDOR),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_WORLDEVENT),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_GUARD),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_CRIT),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_SKILLGAIN),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_TAUNT_DIMINISH),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_ALL_DIMINISH),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_DUNGEON_BOSS),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK),
- CREATE_NAMED_ENUM(CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK)
-};
-
-uint32 const FLAGS_EXTRA_COUNT = std::extent<decltype(flagsExtra)>::value;
-
bool HandleNpcSpawnGroup(ChatHandler* handler, char const* args)
{
if (!*args)
@@ -849,19 +682,19 @@ public:
handler->PSendSysMessage(LANG_NPCINFO_MOVEMENT_DATA, target->GetMovementTemplate().ToString().c_str());
handler->PSendSysMessage(LANG_NPCINFO_UNIT_FIELD_FLAGS, *target->m_unitData->Flags);
- for (uint8 i = 0; i < MAX_UNIT_FLAGS; ++i)
- if (target->HasUnitFlag(unitFlags[i].Value))
- handler->PSendSysMessage("%s (0x%X)", unitFlags[i].Name, unitFlags[i].Value);
+ for (UnitFlags flag : EnumUtils::Iterate<UnitFlags>())
+ if (target->HasUnitFlag(flag))
+ handler->PSendSysMessage("%s (0x%X)", EnumUtils::ToTitle(flag), flag);
handler->PSendSysMessage(LANG_NPCINFO_UNIT_FIELD_FLAGS_2, *target->m_unitData->Flags2);
- for (uint8 i = 0; i < MAX_UNIT_FLAGS_2; ++i)
- if (target->HasUnitFlag2(unitFlags2[i].Value))
- handler->PSendSysMessage("%s (0x%X)", unitFlags2[i].Name, unitFlags2[i].Value);
+ for (UnitFlags2 flag : EnumUtils::Iterate<UnitFlags2>())
+ if (target->HasUnitFlag2(flag))
+ handler->PSendSysMessage("%s (0x%X)", EnumUtils::ToTitle(flag), flag);
handler->PSendSysMessage(LANG_NPCINFO_UNIT_FIELD_FLAGS_3, *target->m_unitData->Flags3);
- for (uint8 i = 0; i < MAX_UNIT_FLAGS_3; ++i)
- if (target->HasUnitFlag3(unitFlags3[i].Value))
- handler->PSendSysMessage("%s (0x%X)", unitFlags3[i].Name, unitFlags3[i].Value);
+ for (UnitFlags3 flag : EnumUtils::Iterate<UnitFlags3>())
+ if (target->HasUnitFlag3(flag))
+ handler->PSendSysMessage("%s (0x%X)", EnumUtils::ToTitle(flag), flag);
handler->PSendSysMessage(LANG_NPCINFO_DYNAMIC_FLAGS, target->GetDynamicFlags());
handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(), curRespawnDelayStr.c_str());
@@ -881,19 +714,23 @@ public:
if (CreatureAI const* ai = target->AI())
handler->PSendSysMessage(LANG_OBJECTINFO_AITYPE, boost::core::demangle(typeid(*ai).name()).c_str());
handler->PSendSysMessage(LANG_NPCINFO_FLAGS_EXTRA, cInfo->flags_extra);
- for (uint8 i = 0; i < FLAGS_EXTRA_COUNT; ++i)
- if (cInfo->flags_extra & flagsExtra[i].Value)
- handler->PSendSysMessage("%s (0x%X)", flagsExtra[i].Name, flagsExtra[i].Value);
+ for (CreatureFlagsExtra flag : EnumUtils::Iterate<CreatureFlagsExtra>())
+ if (cInfo->flags_extra & flag)
+ handler->PSendSysMessage("%s (0x%X)", EnumUtils::ToTitle(flag), flag);
handler->PSendSysMessage(LANG_NPCINFO_NPC_FLAGS, target->m_unitData->NpcFlags[0]);
- for (uint8 i = 0; i < NPCFLAG_COUNT; i++)
- if (npcflags & npcFlagTexts[i].Value)
- handler->PSendSysMessage(npcFlagTexts[i].Name, npcFlagTexts[i].Value);
+ for (NPCFlags flag : EnumUtils::Iterate<NPCFlags>())
+ if (target->HasNpcFlag(flag))
+ handler->PSendSysMessage("* %s (0x%X)", EnumUtils::ToTitle(flag), flag);
+
+ for (NPCFlags2 flag : EnumUtils::Iterate<NPCFlags2>())
+ if (target->HasNpcFlag2(flag))
+ handler->PSendSysMessage("* %s (0x%X)", EnumUtils::ToTitle(flag), flag);
handler->PSendSysMessage(LANG_NPCINFO_MECHANIC_IMMUNE, mechanicImmuneMask);
- for (uint8 i = 1; i < MAX_MECHANIC; ++i)
- if (mechanicImmuneMask & (1 << (mechanicImmunes[i].Value - 1)))
- handler->PSendSysMessage("%s (0x%X)", mechanicImmunes[i].Name, mechanicImmunes[i].Value);
+ for (Mechanics m : EnumUtils::Iterate<Mechanics>())
+ if (m && (mechanicImmuneMask & (1 << (m - 1))))
+ handler->PSendSysMessage("%s (0x%X)", EnumUtils::ToTitle(m), m);
return true;
}