Scripts/Commands: Check if creature entry is valid before attempting to spawn (fixes unneccessary error in logs)
This commit is contained in:
1 parent
2fc6385dba
commit
fe8252b2e2
1 file changed
+89
-91
@@ -33,15 +33,18 @@ EndScriptData */
|
||||
#include "Player.h"
|
||||
#include "Pet.h"
|
||||
|
||||
struct NpcFlagText
|
||||
template<typename E, typename T = char const*>
|
||||
struct EnumName
|
||||
{
|
||||
uint32 flag;
|
||||
int32 text;
|
||||
E Value;
|
||||
T Name;
|
||||
};
|
||||
|
||||
#define CREATE_NAMED_ENUM(VALUE) { VALUE, STRINGIZE(VALUE) }
|
||||
|
||||
#define NPCFLAG_COUNT 24
|
||||
|
||||
NpcFlagText const npcFlagTexts[NPCFLAG_COUNT] =
|
||||
EnumName<NPCFlags, int32> const npcFlagTexts[NPCFLAG_COUNT] =
|
||||
{
|
||||
{ UNIT_NPC_FLAG_AUCTIONEER, LANG_NPCINFO_AUCTIONEER },
|
||||
{ UNIT_NPC_FLAG_BANKER, LANG_NPCINFO_BANKER },
|
||||
@@ -69,89 +72,76 @@ NpcFlagText const npcFlagTexts[NPCFLAG_COUNT] =
|
||||
{ UNIT_NPC_FLAG_VENDOR_REAGENT, LANG_NPCINFO_VENDOR_REAGENT }
|
||||
};
|
||||
|
||||
struct MechanicImmune
|
||||
EnumName<Mechanics> const mechanicImmunes[MAX_MECHANIC] =
|
||||
{
|
||||
uint32 flag;
|
||||
char const* text;
|
||||
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)
|
||||
};
|
||||
|
||||
MechanicImmune const mechanicImmunes[MAX_MECHANIC] =
|
||||
EnumName<UnitFlags> const unitFlags[MAX_UNIT_FLAGS] =
|
||||
{
|
||||
{ MECHANIC_NONE , "MECHANIC_NONE" },
|
||||
{ MECHANIC_CHARM , "MECHANIC_CHARM" },
|
||||
{ MECHANIC_DISORIENTED , "MECHANIC_DISORIENTED" },
|
||||
{ MECHANIC_DISARM , "MECHANIC_DISARM" },
|
||||
{ MECHANIC_DISTRACT , "MECHANIC_DISTRACT" },
|
||||
{ MECHANIC_FEAR , "MECHANIC_FEAR" },
|
||||
{ MECHANIC_GRIP , "MECHANIC_GRIP" },
|
||||
{ MECHANIC_ROOT , "MECHANIC_ROOT" },
|
||||
{ MECHANIC_SLOW_ATTACK , "MECHANIC_SLOW_ATTACK" },
|
||||
{ MECHANIC_SILENCE , "MECHANIC_SILENCE" },
|
||||
{ MECHANIC_SLEEP , "MECHANIC_SLEEP" },
|
||||
{ MECHANIC_SNARE , "MECHANIC_SNARE" },
|
||||
{ MECHANIC_STUN , "MECHANIC_STUN" },
|
||||
{ MECHANIC_FREEZE , "MECHANIC_FREEZE" },
|
||||
{ MECHANIC_KNOCKOUT , "MECHANIC_KNOCKOUT" },
|
||||
{ MECHANIC_BLEED , "MECHANIC_BLEED" },
|
||||
{ MECHANIC_BANDAGE , "MECHANIC_BANDAGE" },
|
||||
{ MECHANIC_POLYMORPH , "MECHANIC_POLYMORPH" },
|
||||
{ MECHANIC_BANISH , "MECHANIC_BANISH" },
|
||||
{ MECHANIC_SHIELD , "MECHANIC_SHIELD" },
|
||||
{ MECHANIC_SHACKLE , "MECHANIC_SHACKLE" },
|
||||
{ MECHANIC_MOUNT , "MECHANIC_MOUNT" },
|
||||
{ MECHANIC_INFECTED , "MECHANIC_INFECTED" },
|
||||
{ MECHANIC_TURN , "MECHANIC_TURN" },
|
||||
{ MECHANIC_HORROR , "MECHANIC_HORROR" },
|
||||
{ MECHANIC_INVULNERABILITY , "MECHANIC_INVULNERABILITY" },
|
||||
{ MECHANIC_INTERRUPT , "MECHANIC_INTERRUPT" },
|
||||
{ MECHANIC_DAZE , "MECHANIC_DAZE" },
|
||||
{ MECHANIC_DISCOVERY , "MECHANIC_DISCOVERY" },
|
||||
{ MECHANIC_IMMUNE_SHIELD , "MECHANIC_IMMUNE_SHIELD" },
|
||||
{ MECHANIC_SAPPED , "MECHANIC_SAPPED" },
|
||||
{ MECHANIC_ENRAGED , "MECHANIC_ENRAGED" }
|
||||
};
|
||||
|
||||
|
||||
struct UnitFlag
|
||||
{
|
||||
uint32 flag;
|
||||
char const* text;
|
||||
};
|
||||
|
||||
UnitFlag const unitFlags[MAX_UNIT_FLAGS] =
|
||||
{
|
||||
{ UNIT_FLAG_SERVER_CONTROLLED , "UNIT_FLAG_SERVER_CONTROLLED" },
|
||||
{ UNIT_FLAG_NON_ATTACKABLE , "UNIT_FLAG_NON_ATTACKABLE" },
|
||||
{ UNIT_FLAG_DISABLE_MOVE , "UNIT_FLAG_DISABLE_MOVE" },
|
||||
{ UNIT_FLAG_PVP_ATTACKABLE , "UNIT_FLAG_PVP_ATTACKABLE" },
|
||||
{ UNIT_FLAG_RENAME , "UNIT_FLAG_RENAME" },
|
||||
{ UNIT_FLAG_PREPARATION , "UNIT_FLAG_PREPARATION" },
|
||||
{ UNIT_FLAG_UNK_6 , "UNIT_FLAG_UNK_6" },
|
||||
{ UNIT_FLAG_NOT_ATTACKABLE_1 , "UNIT_FLAG_NOT_ATTACKABLE_1" },
|
||||
{ UNIT_FLAG_IMMUNE_TO_PC , "UNIT_FLAG_IMMUNE_TO_PC" },
|
||||
{ UNIT_FLAG_IMMUNE_TO_NPC , "UNIT_FLAG_IMMUNE_TO_NPC" },
|
||||
{ UNIT_FLAG_LOOTING , "UNIT_FLAG_LOOTING" },
|
||||
{ UNIT_FLAG_PET_IN_COMBAT , "UNIT_FLAG_PET_IN_COMBAT" },
|
||||
{ UNIT_FLAG_PVP , "UNIT_FLAG_PVP" },
|
||||
{ UNIT_FLAG_SILENCED , "UNIT_FLAG_SILENCED" },
|
||||
{ UNIT_FLAG_UNK_14 , "UNIT_FLAG_UNK_14" },
|
||||
{ UNIT_FLAG_UNK_15 , "UNIT_FLAG_UNK_15" },
|
||||
{ UNIT_FLAG_UNK_16 , "UNIT_FLAG_UNK_16" },
|
||||
{ UNIT_FLAG_PACIFIED , "UNIT_FLAG_PACIFIED" },
|
||||
{ UNIT_FLAG_STUNNED , "UNIT_FLAG_STUNNED" },
|
||||
{ UNIT_FLAG_IN_COMBAT , "UNIT_FLAG_IN_COMBAT" },
|
||||
{ UNIT_FLAG_TAXI_FLIGHT , "UNIT_FLAG_TAXI_FLIGHT" },
|
||||
{ UNIT_FLAG_DISARMED , "UNIT_FLAG_DISARMED" },
|
||||
{ UNIT_FLAG_CONFUSED , "UNIT_FLAG_CONFUSED" },
|
||||
{ UNIT_FLAG_FLEEING , "UNIT_FLAG_FLEEING" },
|
||||
{ UNIT_FLAG_PLAYER_CONTROLLED , "UNIT_FLAG_PLAYER_CONTROLLED" },
|
||||
{ UNIT_FLAG_NOT_SELECTABLE , "UNIT_FLAG_NOT_SELECTABLE" },
|
||||
{ UNIT_FLAG_SKINNABLE , "UNIT_FLAG_SKINNABLE" },
|
||||
{ UNIT_FLAG_MOUNT , "UNIT_FLAG_MOUNT" },
|
||||
{ UNIT_FLAG_UNK_28 , "UNIT_FLAG_UNK_28" },
|
||||
{ UNIT_FLAG_UNK_29 , "UNIT_FLAG_UNK_29" },
|
||||
{ UNIT_FLAG_SHEATHE , "UNIT_FLAG_SHEATHE" },
|
||||
{ UNIT_FLAG_UNK_31 , "UNIT_FLAG_UNK_31" }
|
||||
CREATE_NAMED_ENUM(UNIT_FLAG_SERVER_CONTROLLED),
|
||||
CREATE_NAMED_ENUM(UNIT_FLAG_NON_ATTACKABLE),
|
||||
CREATE_NAMED_ENUM(UNIT_FLAG_DISABLE_MOVE),
|
||||
CREATE_NAMED_ENUM(UNIT_FLAG_PVP_ATTACKABLE),
|
||||
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_UNK_14),
|
||||
CREATE_NAMED_ENUM(UNIT_FLAG_UNK_15),
|
||||
CREATE_NAMED_ENUM(UNIT_FLAG_UNK_16),
|
||||
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_PLAYER_CONTROLLED),
|
||||
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)
|
||||
};
|
||||
|
||||
class npc_commandscript : public CommandScript
|
||||
@@ -242,10 +232,15 @@ public:
|
||||
|
||||
char* team = strtok(NULL, " ");
|
||||
int32 teamval = 0;
|
||||
if (team) { teamval = atoi(team); }
|
||||
if (teamval < 0) { teamval = 0; }
|
||||
if (team)
|
||||
teamval = atoi(team);
|
||||
|
||||
if (teamval < 0)
|
||||
teamval = 0;
|
||||
|
||||
uint32 id = atoi(charID);
|
||||
if (!sObjectMgr->GetCreatureTemplate(id))
|
||||
return false;
|
||||
|
||||
Player* chr = handler->GetSession()->GetPlayer();
|
||||
float x = chr->GetPositionX();
|
||||
@@ -737,8 +732,8 @@ public:
|
||||
|
||||
handler->PSendSysMessage(LANG_NPCINFO_UNIT_FIELD_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS));
|
||||
for (uint8 i = 0; i < MAX_UNIT_FLAGS; ++i)
|
||||
if (target->GetUInt32Value(UNIT_FIELD_FLAGS) & unitFlags[i].flag)
|
||||
handler->PSendSysMessage(unitFlags[i].text, unitFlags[i].flag);
|
||||
if (target->GetUInt32Value(UNIT_FIELD_FLAGS) & unitFlags[i].Value)
|
||||
handler->PSendSysMessage("%s (0x%X)", unitFlags[i].Name, unitFlags[i].Value);
|
||||
|
||||
handler->PSendSysMessage(LANG_NPCINFO_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS_2), target->GetUInt32Value(UNIT_DYNAMIC_FLAGS), target->getFaction());
|
||||
handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(), curRespawnDelayStr.c_str());
|
||||
@@ -750,13 +745,13 @@ public:
|
||||
handler->PSendSysMessage(LANG_NPCINFO_AIINFO, target->GetAIName().c_str(), target->GetScriptName().c_str());
|
||||
|
||||
for (uint8 i = 0; i < NPCFLAG_COUNT; i++)
|
||||
if (npcflags & npcFlagTexts[i].flag)
|
||||
handler->PSendSysMessage(npcFlagTexts[i].text, npcFlagTexts[i].flag);
|
||||
if (npcflags & npcFlagTexts[i].Value)
|
||||
handler->PSendSysMessage(npcFlagTexts[i].Name);
|
||||
|
||||
handler->PSendSysMessage(LANG_NPCINFO_MECHANIC_IMMUNE, mechanicImmuneMask);
|
||||
for (uint8 i = 0; i < MAX_MECHANIC; ++i)
|
||||
if ((mechanicImmuneMask << 1) & mechanicImmunes[i].flag)
|
||||
handler->PSendSysMessage(mechanicImmunes[i].text, mechanicImmunes[i].flag);
|
||||
if ((mechanicImmuneMask << 1) & mechanicImmunes[i].Value)
|
||||
handler->PSendSysMessage("%s (0x%X)", mechanicImmunes[i].Name, mechanicImmunes[i].Value);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1361,6 +1356,9 @@ public:
|
||||
if (!id)
|
||||
return false;
|
||||
|
||||
if (!sObjectMgr->GetCreatureTemplate(id))
|
||||
return false;
|
||||
|
||||
chr->SummonCreature(id, *chr, TEMPSUMMON_CORPSE_DESPAWN, 120);
|
||||
|
||||
return true;
|
||||
|
||||
Reference in new issue
Block a user