twincannon c87aadbf0c
[Commands] #npcspawn Changes (#4311)
* Changes to npcspawn create command so it takes more stats from the target npc

* Add see invis stats to npccreate command

* WIP npcspawn command changes

* Add npcspawn clone and help args, fix some broken things with npcspawn

* Cleanup comments and add apostraphes to zone shortname query

* Make it so npcspawn remove only removes spawn2 row and optionally removes spawngroup and spawnentry, make create and add spawn the npc at client loc

* Make npcspawn create use the same syntax for spawngroup naming as npcspawn add

* Revert npcspawn create and add to use npc location rather than client, other misc tweaks
2024-05-16 15:17:37 -04:00

117 lines
3.5 KiB
C++
Executable File

#include "../client.h"
void command_npcspawn(Client *c, const Seperator *sep)
{
if (!c->GetTarget() || !c->GetTarget()->IsNPC()) {
c->Message(Chat::White, "You must target an NPC to use this command.");
return;
}
int arguments = sep->argnum;
if (!arguments) {
c->Message(Chat::White, "Command Syntax: #npcspawn [Add|Create|Delete|Remove|Update|Clone|Help]");
return;
}
if (!strcasecmp(sep->arg[1], "help")) {
c->Message(Chat::White, "Command Syntax: #npcspawn [Add|Create|Delete|Remove|Update|Clone|Help] [optional 3rd parameter]");
c->Message(Chat::White, "Usage: #npcspawn add [respawntime] - Using the same targeted NPC ID, creates new spawn2 and spawngroup entries");
c->Message(Chat::White, "Usage: #npcspawn clone [respawntime] - Copies targeted NPC and spawngroup, creating only a spawn2 entry at the current client location");
c->Message(Chat::White, "Usage: #npcspawn create [respawntime] - Creates new NPC type copying the data from the targeted NPC, with new spawn2 and spawngroup entries");
c->Message(Chat::White, "Usage: #npcspawn delete - Deletes the spawn2, spawngroup, spawnentry and npc_types rows for targeted NPC");
c->Message(Chat::White, "Usage: #npcspawn remove [remove_spawngroups] - Deletes the spawn2 row for targeted NPC, also delete spawngroup and spawnentry rows if remove_spawngroups is > 0");
c->Message(Chat::White, "Usage: #npcspawn update - Updates NPC appearance in database");
return;
}
auto target = c->GetTarget()->CastToNPC();
uint32 extra = 0;
bool is_add = !strcasecmp(sep->arg[1], "add");
bool is_clone = !strcasecmp(sep->arg[1], "clone");
bool is_create = !strcasecmp(sep->arg[1], "create");
bool is_delete = !strcasecmp(sep->arg[1], "delete");
bool is_remove = !strcasecmp(sep->arg[1], "remove");
bool is_update = !strcasecmp(sep->arg[1], "update");
if (
!is_add &&
!is_clone &&
!is_create &&
!is_delete &&
!is_remove &&
!is_update
) {
c->Message(Chat::White, "Command Syntax: #npcspawn [Add|Create|Delete|Remove|Update|Clone|Help]");
return;
}
if (is_add || is_create || is_clone) {
extra = sep->IsNumber(2) ? Strings::ToInt(sep->arg[2]) : 1200; // Extra param is only used for respawn time in Add/Create/Clone, default to 1200 if not set
content_db.NPCSpawnDB(
is_add ? NPCSpawnTypes::AddNewSpawngroup : (is_create ? NPCSpawnTypes::CreateNewSpawn : NPCSpawnTypes::AddSpawnFromSpawngroup),
zone->GetShortName(),
zone->GetInstanceVersion(),
c,
target,
extra
);
c->Message(
Chat::White,
fmt::format(
"Spawn {} | Name: {}",
is_add ?
"Added" :
(
is_create ?
"Created" :
"Cloned"
),
c->GetTargetDescription(target)
).c_str()
);
}
else if (is_delete || is_remove || is_update) {
uint8 spawn_update_type = (
is_delete ?
NPCSpawnTypes::DeleteSpawn :
(
is_remove ?
NPCSpawnTypes::RemoveSpawn :
NPCSpawnTypes::UpdateAppearance
)
);
std::string spawn_message = (
is_delete ?
"Deleted" :
(
is_remove ?
"Removed" :
"Updated"
)
);
extra = sep->IsNumber(2) ? Strings::ToInt(sep->arg[2]) : 0; // Extra param is used in Remove as a flag to optionally remove spawngroup/spawnentry if 1 (always remove spawn2 entry)
content_db.NPCSpawnDB(
spawn_update_type,
zone->GetShortName(),
zone->GetInstanceVersion(),
c,
target,
extra
);
c->Message(
Chat::White,
fmt::format(
"Spawn {} | Name: {}",
spawn_message,
c->GetTargetDescription(target)
).c_str()
);
}
}