diff options
Diffstat (limited to 'src/server/scripts/Commands')
| -rw-r--r-- | src/server/scripts/Commands/cs_npc.cpp | 209 |
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; } |
