[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
This commit is contained in:
twincannon
2024-05-16 15:17:37 -04:00
committed by GitHub
parent 1be86edf20
commit c87aadbf0c
5 changed files with 115 additions and 42 deletions
+29 -18
View File
@@ -9,44 +9,46 @@ void command_npcspawn(Client *c, const Seperator *sep)
int arguments = sep->argnum;
if (!arguments) {
c->Message(Chat::White, "Command Syntax: #npcspawn [Add|Create|Delete|Remove|Update]");
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]");
c->Message(Chat::White, "Command Syntax: #npcspawn [Add|Create|Delete|Remove|Update|Clone|Help]");
return;
}
if (is_add || is_create) {
extra = (
sep->IsNumber(2) ?
(
is_add ?
Strings::ToInt(sep->arg[2]) :
1
) : (
is_add ?
1200 :
0
)
); // Default to 1200 for Add, 0 for Create if not set
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 : NPCSpawnTypes::CreateNewSpawn,
is_add ? NPCSpawnTypes::AddNewSpawngroup : (is_create ? NPCSpawnTypes::CreateNewSpawn : NPCSpawnTypes::AddSpawnFromSpawngroup),
zone->GetShortName(),
zone->GetInstanceVersion(),
c,
@@ -58,7 +60,13 @@ void command_npcspawn(Client *c, const Seperator *sep)
Chat::White,
fmt::format(
"Spawn {} | Name: {}",
is_add ? "Added" : "Created",
is_add ?
"Added" :
(
is_create ?
"Created" :
"Cloned"
),
c->GetTargetDescription(target)
).c_str()
);
@@ -84,12 +92,15 @@ void command_npcspawn(Client *c, const Seperator *sep)
)
);
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
target,
extra
);
c->Message(