diff --git a/zone/command.cpp b/zone/command.cpp index 178f4d8d1..8c26d228d 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -323,7 +323,7 @@ int command_init(void) command_add("setadventurepoints", "- Set your or your player target's available adventure points", AccountStatus::GMLeadAdmin, command_set_adventure_points) || command_add("setanim", "[Animation ID (IDs are 0 to 4)] - Set target's appearance to Animation ID", AccountStatus::GMMgmt, command_setanim) || command_add("setcrystals", "[value] - Set your or your player target's available radiant or ebon crystals", AccountStatus::GMAdmin, command_setcrystals) || - command_add("setfaction", "[faction number] - Sets targeted NPC's faction in the database", AccountStatus::GMAreas, command_setfaction) || + command_add("setfaction", "[Faction ID] - Sets targeted NPC's faction in the database", AccountStatus::GMAreas, command_setfaction) || command_add("setgraveyard", "[zone name] - Creates a graveyard for the specified zone based on your target's LOC.", AccountStatus::GMMgmt, command_setgraveyard) || command_add("setlanguage", "[language ID] [value] - Set your target's language skillnum to value", AccountStatus::Guide, command_setlanguage) || command_add("setlsinfo", "[email] [password] - Set login server email address and password (if supported by login server)", AccountStatus::Steward, command_setlsinfo) || diff --git a/zone/gm_commands/setfaction.cpp b/zone/gm_commands/setfaction.cpp index 36662d3df..17b3c288f 100755 --- a/zone/gm_commands/setfaction.cpp +++ b/zone/gm_commands/setfaction.cpp @@ -2,19 +2,50 @@ void command_setfaction(Client *c, const Seperator *sep) { - if ((sep->arg[1][0] == 0 || strcasecmp(sep->arg[1], "*") == 0) || - ((c->GetTarget() == 0) || (c->GetTarget()->IsClient()))) { - c->Message(Chat::White, "Usage: #setfaction [faction number]"); + int arguments = sep->argnum; + if (!arguments || !sep->IsNumber(1)) { + c->Message(Chat::White, "Usage: #setfaction [Faction ID]"); + return; + } + + if ( + !c->GetTarget() || + ( + c->GetTarget() && + c->GetTarget()->IsClient() + ) + ) { + c->Message(Chat::White, "You must target an NPC to use this command."); return; } - auto npcTypeID = c->GetTarget()->CastToNPC()->GetNPCTypeID(); - c->Message(Chat::Yellow, "Setting NPC %u to faction %i", npcTypeID, atoi(sep->argplus[1])); + NPC* target = c->GetTarget()->CastToNPC(); + auto npc_id = target->GetNPCTypeID(); + auto faction_id = std::stoi(sep->arg[1]); + auto faction_name = content_db.GetFactionName(faction_id); + if (!faction_name.empty()) { + c->Message( + Chat::White, + fmt::format( + "Faction Changed | Name: {} ({}) Faction: {} ({}).", + target->GetCleanName(), + npc_id, + content_db.GetFactionName(faction_id), + faction_id + ).c_str() + ); - std::string query = StringFormat( - "UPDATE npc_types SET npc_faction_id = %i WHERE id = %i", - atoi(sep->argplus[1]), npcTypeID - ); - content_db.QueryDatabase(query); + std::string query = fmt::format( + "UPDATE npc_types SET npc_faction_id = {} WHERE id = {}", + faction_id, + npc_id + ); + content_db.QueryDatabase(query); + } else { + c->Message( + Chat::White, + "Invalid Faction ID, please specify a valid Faction ID." + ); + } }