Chris Miles dfd8f84cac
[Strings] Refactor Strings Usage (#2305)
* Initial commit checkpoint

* More functions converted

* Commify

* More functions

* Fin

* Sort declarations

* Split functions between files

* Bots

* Update strings.h

* Split

* Revert find replaces

* Repository template

* Money

* Misc function

* Update CMakeLists.txt

* Saylink

* Update strings.cpp

* Swap Strings::Saylink for Saylink::Create since saylink is coupled to zone database

* API casings
2022-07-14 02:10:52 -05:00

2583 lines
82 KiB
C++
Executable File

#include "../client.h"
#include "../groups.h"
#include "../raids.h"
#include "../raids.h"
void command_npcedit(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;
bool is_help = (arguments == 0 || !strcasecmp(sep->arg[1], "help"));
if (is_help) {
c->Message(Chat::White, "Usage: #npcedit name [Name] - Sets an NPC's Name");
c->Message(Chat::White, "Usage: #npcedit lastname [Last Name] - Sets an NPC's Last Name");
c->Message(Chat::White, "Usage: #npcedit level [Level] - Sets an NPC's Level");
c->Message(Chat::White, "Usage: #npcedit race [Race ID] - Sets an NPC's Race");
c->Message(Chat::White, "Usage: #npcedit class [Class ID] - Sets an NPC's Class");
c->Message(Chat::White, "Usage: #npcedit bodytype [Body Type ID] - Sets an NPC's Bodytype");
c->Message(Chat::White, "Usage: #npcedit hp [HP] - Sets an NPC's HP");
c->Message(Chat::White, "Usage: #npcedit mana [Mana] - Sets an NPC's Mana");
c->Message(Chat::White, "Usage: #npcedit gender [Gender ID] - Sets an NPC's Gender");
c->Message(Chat::White, "Usage: #npcedit texture [Texture] - Sets an NPC's Texture");
c->Message(Chat::White, "Usage: #npcedit helmtexture [Helmet Texture] - Sets an NPC's Helmet Texture");
c->Message(Chat::White, "Usage: #npcedit herosforgemodel [Model Number] - Sets an NPC's Hero's Forge Model");
c->Message(Chat::White, "Usage: #npcedit size [Size] - Sets an NPC's Size");
c->Message(Chat::White, "Usage: #npcedit hpregen [HP Regen] - Sets an NPC's HP Regen Rate Per Tick");
c->Message(Chat::White, "Usage: #npcedit hp_regen_per_second [HP Regen] - Sets an NPC's HP Regen Rate Per Second");
c->Message(Chat::White, "Usage: #npcedit manaregen [Mana Regen] - Sets an NPC's Mana Regen Rate Per Tick");
c->Message(Chat::White, "Usage: #npcedit loottable [Loottable ID] - Sets an NPC's Loottable ID");
c->Message(Chat::White, "Usage: #npcedit merchantid [Merchant ID] - Sets an NPC's Merchant ID");
c->Message(Chat::White, "Usage: #npcedit alt_currency_id [Alternate Currency ID] - Sets an NPC's Alternate Currency ID");
c->Message(Chat::White, "Usage: #npcedit spell [Spell List ID] - Sets an NPC's Spells List ID");
c->Message(Chat::White, "Usage: #npcedit npc_spells_effects_id [Spell Effects ID] - Sets an NPC's Spell Effects ID");
c->Message(Chat::White, "Usage: #npcedit faction [Faction ID] - Sets an NPC's Faction ID");
c->Message(Chat::White, "Usage: #npcedit adventure_template_id [Template ID] - Sets an NPC's Adventure Template ID");
c->Message(Chat::White, "Usage: #npcedit trap_template [Template ID] - Sets an NPC's Trap Template ID");
c->Message(Chat::White, "Usage: #npcedit damage [Minimum] [Maximum] - Sets an NPC's Damage");
c->Message(Chat::White, "Usage: #npcedit attackcount [Attack Count] - Sets an NPC's Attack Count");
c->Message(Chat::White, "Usage: #npcedit special_attacks [Special Attacks] - Sets an NPC's Special Attacks");
c->Message(Chat::White, "Usage: #npcedit special_abilities [Special Abilities] - Sets an NPC's Special Abilities");
c->Message(Chat::White, "Usage: #npcedit aggroradius [Radius] - Sets an NPC's Aggro Radius");
c->Message(Chat::White, "Usage: #npcedit assistradius [Radius] - Sets an NPC's Assist Radius");
c->Message(Chat::White, "Usage: #npcedit featuresave - Saves an NPC's current facial features to the database");
c->Message(Chat::White, "Usage: #npcedit armortint_id [Armor Tint ID] - Sets an NPC's Armor Tint ID");
c->Message(Chat::White, "Usage: #npcedit color [Red] [Green] [Blue] - Sets an NPC's Red, Green, and Blue armor tint");
c->Message(Chat::White, "Usage: #npcedit ammoidfile [ID File] - Sets an NPC's Ammo ID File");
c->Message(
Chat::White,
"Usage: #npcedit weapon [Primary Model] [Secondary Model] - Sets an NPC's Primary and Secondary Weapon Model"
);
c->Message(Chat::White, "Usage: #npcedit meleetype [Primary Type] [Secondary Type] - Sets an NPC's Melee Skill Types");
c->Message(Chat::White, "Usage: #npcedit rangedtype [Type] - Sets an NPC's Ranged Skill Type");
c->Message(Chat::White, "Usage: #npcedit runspeed [Run Speed] - Sets an NPC's Run Speed");
c->Message(Chat::White, "Usage: #npcedit mr [Resistance] - Sets an NPC's Magic Resistance");
c->Message(Chat::White, "Usage: #npcedit pr [Resistance] - Sets an NPC's Poison Resistance");
c->Message(Chat::White, "Usage: #npcedit dr [Resistance] - Sets an NPC's Disease Resistance");
c->Message(Chat::White, "Usage: #npcedit fr [Resistance] - Sets an NPC's Fire Resistance");
c->Message(Chat::White, "Usage: #npcedit cr [Resistance] - Sets an NPC's Cold Resistance");
c->Message(Chat::White, "Usage: #npcedit corrup [Resistance] - Sets an NPC's Corruption Resistance");
c->Message(Chat::White, "Usage: #npcedit phr [Resistance] - Sets and NPC's Physical Resistance");
c->Message(
Chat::White,
"Usage: #npcedit seeinvis [Flag] - Sets an NPC's See Invisible Flag [0 = Cannot See Invisible, 1 = Can See Invisible]"
);
c->Message(
Chat::White,
"Usage: #npcedit seeinvisundead [Flag] - Sets an NPC's See Invisible vs. Undead Flag [0 = Cannot See Invisible vs. Undead, 1 = Can See Invisible vs. Undead]"
);
c->Message(
Chat::White,
"Usage: #npcedit qglobal [Flag] - Sets an NPC's Quest Global Flag [0 = Quest Globals Off, 1 = Quest Globals On]"
);
c->Message(Chat::White, "Usage: #npcedit ac [Armor Class] - Sets an NPC's Armor Class");
c->Message(
Chat::White,
"Usage: #npcedit npcaggro [Flag] - Sets an NPC's NPC Aggro Flag [0 = Aggro NPCs Off, 1 = Aggro NPCs On]"
);
c->Message(Chat::White, "Usage: #npcedit spawn_limit [Limit] - Sets an NPC's Spawn Limit Counter");
c->Message(Chat::White, "Usage: #npcedit attackspeed [Attack Speed] - Sets an NPC's Attack Speed Modifier");
c->Message(Chat::White, "Usage: #npcedit attackdelay [Attack Delay] - Sets an NPC's Attack Delay");
c->Message(Chat::White, "Usage: #npcedit findable [Flag] - Sets an NPC's Findable Flag [0 = Not Findable, 1 = Findable]");
c->Message(Chat::White, "Usage: #npcedit str [Strength] - Sets an NPC's Strength");
c->Message(Chat::White, "Usage: #npcedit sta [Stamina] - Sets an NPC's Stamina");
c->Message(Chat::White, "Usage: #npcedit agi [Agility] - Sets an NPC's Agility");
c->Message(Chat::White, "Usage: #npcedit dex [Dexterity] - Sets an NPC's Dexterity");
c->Message(Chat::White, "Usage: #npcedit int [Intelligence] - Sets an NPC's Intelligence");
c->Message(Chat::White, "Usage: #npcedit wis [Wisdom] - Sets an NPC's Wisdom");
c->Message(Chat::White, "Usage: #npcedit cha [Charisma] - Sets an NPC's Charisma");
c->Message(
Chat::White,
"Usage: #npcedit seehide [Flag] - Sets an NPC's See Hide Flag [0 = Cannot See Hide, 1 = Can See Hide]"
);
c->Message(
Chat::White,
"Usage: #npcedit seeimprovedhide [Flag] - Sets an NPC's See Improved Hide Flag [0 = Cannot See Improved Hide, 1 = Can See Improved Hide]"
);
c->Message(Chat::White, "Usage: #npcedit trackable [Flag] - Sets an NPC's Trackable Flag [0 = Not Trackable, 1 = Trackable]");
c->Message(Chat::White, "Usage: #npcedit atk [Attack] - Sets an NPC's Attack");
c->Message(Chat::White, "Usage: #npcedit accuracy [Accuracy] - Sets an NPC's Accuracy");
c->Message(Chat::White, "Usage: #npcedit avoidance [Avoidance] - Sets an NPC's Avoidance");
c->Message(Chat::White, "Usage: #npcedit slow_mitigation [Slow Mitigation] - Sets an NPC's Slow Mitigation");
c->Message(Chat::White, "Usage: #npcedit version [Version] - Sets an NPC's Version");
c->Message(Chat::White, "Usage: #npcedit maxlevel [Max Level] - Sets an NPC's Maximum Level");
c->Message(Chat::White, "Usage: #npcedit scalerate [Scale Rate] - Sets an NPC's Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]");
c->Message(
Chat::White,
"Usage: #npcedit spellscale [Scale Rate] - Sets an NPC's Spell Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"
);
c->Message(
Chat::White,
"Usage: #npcedit healscale [Scale Rate] - Sets an NPC's Heal Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"
);
c->Message(
Chat::White,
"Usage: #npcedit no_target [Flag] - Sets an NPC's No Target Hotkey Flag [0 = Not Targetable with Target Hotkey, 1 = Targetable with Target Hotkey]"
);
c->Message(
Chat::White,
"Usage: #npcedit raidtarget [Flag] - Sets an NPC's Raid Target Flag [0 = Not a Raid Target, 1 = Raid Target]"
);
c->Message(Chat::White, "Usage: #npcedit armtexture [Texture] - Sets an NPC's Arm Texture");
c->Message(Chat::White, "Usage: #npcedit bracertexture [Texture] - Sets an NPC's Bracer Texture");
c->Message(Chat::White, "Usage: #npcedit handtexture [Texture] - Sets an NPC's Hand Texture");
c->Message(Chat::White, "Usage: #npcedit legtexture [Texture] - Sets an NPC's Leg Texture");
c->Message(Chat::White, "Usage: #npcedit feettexture [Texture] - Sets an NPC's Feet Texture");
c->Message(Chat::White, "Usage: #npcedit walkspeed [Walk Speed] - Sets an NPC's Walk Speed");
c->Message(Chat::White, "Usage: #npcedit show_name [Flag] - Sets an NPC's Show Name Flag [0 = Hidden, 1 = Shown]");
c->Message(
Chat::White,
"Usage: #npcedit untargetable [Flag] - Sets an NPC's Untargetable Flag [0 = Targetable, 1 = Untargetable]"
);
c->Message(Chat::White, "Usage: #npcedit charm_ac [Armor Class] - Sets an NPC's Armor Class while Charmed");
c->Message(Chat::White, "Usage: #npcedit charm_min_dmg [Damage] - Sets an NPC's Minimum Damage while Charmed");
c->Message(Chat::White, "Usage: #npcedit charm_max_dmg [Damage] - Sets an NPC's Maximum Damage while Charmed");
c->Message(Chat::White, "Usage: #npcedit charm_attack_delay [Attack Delay] - Sets an NPC's Attack Delay while Charmed");
c->Message(Chat::White, "Usage: #npcedit charm_accuracy_rating [Accuracy] - Sets an NPC's Accuracy Rating while Charmed");
c->Message(Chat::White, "Usage: #npcedit charm_avoidance_rating [Avoidance] - Sets an NPC's Avoidance Rating while Charmed");
c->Message(Chat::White, "Usage: #npcedit charm_atk [Attack] - Sets an NPC's Attack while Charmed");
c->Message(
Chat::White,
"Usage: #npcedit skip_global_loot [Flag] - Sets an NPC's Skip Global Loot Flag [0 = Don't Skip, 1 = Skip"
);
c->Message(
Chat::White,
"Usage: #npcedit rarespawn [Flag] - Sets an NPC's Rare Spawn Flag [0 = Not a Rare Spawn, 1 = Rare Spawn]"
);
c->Message(
Chat::White,
"Usage: #npcedit stuck_behavior [Stuck Behavior] - Sets an NPC's Stuck Behavior [0 = Run to Target, 1 = Warp to Target, 2 = Take No Action, 3 = Evade Combat]"
);
c->Message(
Chat::White,
"Usage: #npcedit flymode [Fly Mode] - Sets an NPC's Fly Mode [0 = Ground, 1 = Flying, 2 = Levitating, 3 = Water, 4 = Floating, 5 = Levitating While Running]"
);
c->Message(
Chat::White,
"Usage: #npcedit always_aggro [Flag] - Sets an NPC's Always Aggro Flag [0 = Does not Always Aggro, 1 = Always Aggro]"
);
c->Message(
Chat::White,
"Usage: #npcedit exp_mod [Modifier] - Sets an NPC's Experience Modifier [50 = 50%, 100 = 100%, 200 = 200%]"
);
c->Message(Chat::White, "Usage: #npcedit setanimation [Animation ID] - Sets an NPC's Animation on Spawn (Stored in spawn2 table)");
c->Message(
Chat::White,
"Usage: #npcedit respawntime [Respawn Time] - Sets an NPC's Respawn Timer in Seconds (Stored in spawn2 table)"
);
return;
}
std::string sub_command = sep->arg[1];
uint32 npc_id = c->GetTarget()->CastToNPC()->GetNPCTypeID();
auto npc_id_string = fmt::format(
"NPC ID {}",
Strings::Commify(std::to_string(npc_id))
);
if (!strcasecmp(sep->arg[1], "name")) {
std::string name = sep->argplus[2];
if (!name.empty()) {
c->Message(
Chat::Yellow,
fmt::format(
"{} is now named '{}'.",
npc_id_string,
sep->argplus[2]
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET name = '{}' WHERE id = {}",
sep->argplus[2],
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit name [Name] - Sets an NPC's Name");
}
return;
} else if (!strcasecmp(sep->arg[1], "lastname")) {
std::string last_name = sep->argplus[2];
c->Message(
Chat::Yellow,
fmt::format(
"{} now has the lastname '{}'.",
npc_id_string,
last_name
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET lastname = '{}' WHERE id = {}",
last_name,
npc_id
);
content_db.QueryDatabase(query);
return;
} else if (!strcasecmp(sep->arg[1], "level")) {
if (sep->IsNumber(2)) {
auto level = static_cast<uint8>(std::stoul(sep->arg[2]));
c->Message(
Chat::Yellow,
fmt::format(
"{} is now level {}.",
npc_id_string,
level
).c_str()
);
auto query = fmt::format("UPDATE npc_types SET level = {} WHERE id = {}", atoi(sep->arg[2]), npc_id);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit level [Level] - Sets an NPC's Level");
}
return;
} else if (!strcasecmp(sep->arg[1], "race")) {
if (sep->IsNumber(2)) {
auto race_id = static_cast<uint16>(std::stoul(sep->arg[2]));
c->Message(
Chat::Yellow,
fmt::format(
"{} is now a {} ({}).",
npc_id_string,
GetRaceIDName(race_id),
race_id
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET race = {} WHERE id = {}",
race_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit race [Race ID] - Sets an NPC's Race");
}
return;
} else if (!strcasecmp(sep->arg[1], "class")) {
if (sep->IsNumber(2)) {
auto class_id = static_cast<uint8>(std::stoul(sep->arg[2]));
c->Message(
Chat::Yellow,
fmt::format(
"{} is now a {} ({}).",
npc_id_string,
GetClassIDName(class_id),
class_id
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET class = {} WHERE id = {}",
class_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit class [Class ID] - Sets an NPC's Class");
}
return;
} else if (!strcasecmp(sep->arg[1], "bodytype")) {
if (sep->IsNumber(2)) {
auto body_type_id = static_cast<uint8>(std::stoul(sep->arg[2]));
auto body_type_name = EQ::constants::GetBodyTypeName(static_cast<bodyType>(body_type_id));
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Body Type {}.",
npc_id_string,
(
!body_type_name.empty() ?
fmt::format(
"{} ({})",
body_type_name,
body_type_id
) :
std::to_string(body_type_id)
)
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET bodytype = {} WHERE id = {}",
body_type_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit bodytype [Body Type ID] - Sets an NPC's Bodytype");
}
return;
} else if (!strcasecmp(sep->arg[1], "hp")) {
if (sep->IsNumber(2)) {
auto hp = std::stoll(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Health.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET hp = {} WHERE id = {}",
hp,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit hp [HP] - Sets an NPC's HP");
}
return;
} else if (!strcasecmp(sep->arg[1], "mana")) {
if (sep->IsNumber(2)) {
auto mana = std::stoll(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Mana.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET mana = {} WHERE id = {}",
mana,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit mana [Mana] - Sets an NPC's Mana");
}
return;
} else if (!strcasecmp(sep->arg[1], "gender")) {
if (sep->IsNumber(2)) {
auto gender_id = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now a {} ({}).",
npc_id_string,
gender_id,
GetGenderName(gender_id)
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET gender = {} WHERE id = {}",
gender_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit gender [Gender ID] - Sets an NPC's Gender");
}
return;
} else if (!strcasecmp(sep->arg[1], "texture")) {
if (sep->IsNumber(2)) {
auto texture = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Texture {}.",
npc_id_string,
texture
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET texture = {} WHERE id = {}",
texture,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit texture [Texture] - Sets an NPC's Texture");
}
return;
} else if (!strcasecmp(sep->arg[1], "helmtexture")) {
if (sep->IsNumber(2)) {
auto helmet_texture = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Helmet Texture {}.",
npc_id_string,
helmet_texture
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET helmtexture = {} WHERE id = {}",
atoi(sep->arg[2]),
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit helmtexture [Helmet Texture] - Sets an NPC's Helmet Texture");
}
return;
} else if (!strcasecmp(sep->arg[1], "herosforgemodel")) {
if (sep->IsNumber(2)) {
auto heros_forge_model = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Hero's Forge Model {}.",
npc_id_string,
heros_forge_model
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET herosforgemodel = {} WHERE id = {}",
heros_forge_model,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit herosforgemodel [Model Number] - Sets an NPC's Hero's Forge Model");
}
return;
} else if (!strcasecmp(sep->arg[1], "size")) {
if (sep->IsNumber(2)) {
auto size = std::stof(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now Size {:.2f}.",
npc_id_string,
size
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET size = {:.2f} WHERE id = {}",
size,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit size [Size] - Sets an NPC's Size");
}
return;
} else if (!strcasecmp(sep->arg[1], "hpregen")) {
if (sep->IsNumber(2)) {
auto hp_regen = std::stoll(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now regenerates {} Health per Tick.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET hp_regen_rate = {} WHERE id = {}",
hp_regen,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit hpregen [HP Regen] - Sets an NPC's HP Regen Rate Per Tick");
}
return;
} else if (!strcasecmp(sep->arg[1], "hp_regen_per_second")) {
if (sep->IsNumber(2)) {
auto hp_regen_per_second = std::stoll(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now regenerates {} HP per Second.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET hp_regen_per_second = {} WHERE id = {}",
hp_regen_per_second,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit hp_regen_per_second [HP Regen] - Sets an NPC's HP Regen Rate Per Second");
}
return;
} else if (!strcasecmp(sep->arg[1], "manaregen")) {
if (sep->IsNumber(2)) {
auto mana_regen = std::stoll(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now regenerates {} Mana per Tick.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET mana_regen_rate = {} WHERE id = {}",
mana_regen,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit manaregen [Mana Regen] - Sets an NPC's Mana Regen Rate Per Tick");
}
return;
} else if (!strcasecmp(sep->arg[1], "loottable")) {
if (sep->IsNumber(2)) {
auto loottable_id = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Loottable ID {}.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET loottable_id = {} WHERE id = {}",
loottable_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit loottable [Loottable ID] - Sets an NPC's Loottable ID");
}
return;
} else if (!strcasecmp(sep->arg[1], "merchantid")) {
if (sep->IsNumber(2)) {
auto merchant_id = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Merchant ID {}.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET merchant_id = {} WHERE id = {}",
merchant_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit merchantid [Merchant ID] - Sets an NPC's Merchant ID");
}
return;
} else if (!strcasecmp(sep->arg[1], "alt_currency_id")) {
if (sep->IsNumber(2)) {
auto alternate_currency_id = std::stoul(sep->arg[2]);
auto alternate_currency_item_id = zone->GetCurrencyItemID(alternate_currency_id);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Alternate Currency {}.",
npc_id_string,
(
alternate_currency_item_id ?
fmt::format(
"{} ({})",
database.CreateItemLink(alternate_currency_item_id),
alternate_currency_id
) :
std::to_string(alternate_currency_id)
)
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET alt_currency_id = {} WHERE id = {}",
alternate_currency_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit alt_currency_id [Alternate Currency ID] - Sets an NPC's Alternate Currency ID");
}
return;
} else if (!strcasecmp(sep->arg[1], "spell")) {
if (sep->IsNumber(2)) {
auto spell_list_id = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Spell List ID {}.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET npc_spells_id = {} WHERE id = {}",
spell_list_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit spell [Spell List ID] - Sets an NPC's Spells List ID");
}
return;
} else if (!strcasecmp(sep->arg[1], "npc_spells_effects_id")) {
if (sep->IsNumber(2)) {
auto spell_effects_id = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Spells Effects ID {}.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET npc_spells_effects_id = {} WHERE id = {}",
spell_effects_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit npc_spells_effects_id [Spell Effects ID] - Sets an NPC's Spell Effects ID");
}
return;
} else if (!strcasecmp(sep->arg[1], "faction")) {
if (sep->IsNumber(2)) {
auto faction_id = std::stoi(sep->arg[2]);
auto faction_name = content_db.GetFactionName(faction_id);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Faction {}.",
npc_id_string,
(
!faction_name.empty() ?
fmt::format(
"{} ({})",
faction_name,
faction_id
) :
Strings::Commify(sep->arg[2])
)
).c_str()
);
auto 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, "Usage: #npcedit faction [Faction ID] - Sets an NPC's Faction ID");
}
return;
} else if (!strcasecmp(sep->arg[1], "adventure_template_id")) {
if (sep->IsNumber(2)) {
auto adventure_template_id = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Adventure Template ID {}.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET adventure_template_id = {} WHERE id = {}",
adventure_template_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit adventure_template_id [Template ID] - Sets an NPC's Adventure Template ID");
}
return;
} else if (!strcasecmp(sep->arg[1], "trap_template")) {
if (sep->IsNumber(2)) {
auto trap_template = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Trap Template ID {}.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET trap_template = {} WHERE id = {}",
trap_template,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit trap_template [Template ID] - Sets an NPC's Trap Template ID");
}
return;
} else if (!strcasecmp(sep->arg[1], "damage")) {
if (sep->IsNumber(2) && sep->IsNumber(3)) {
auto minimum_damage = std::stoul(sep->arg[2]);
auto maximum_damage = std::stoul(sep->arg[3]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now hits from {} to {} damage.",
npc_id_string,
Strings::Commify(sep->arg[2]),
Strings::Commify(sep->arg[3])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET mindmg = {}, maxdmg = {} WHERE id = {}",
minimum_damage,
maximum_damage,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit damage [Minimum] [Maximum] - Sets an NPC's Damage");
}
return;
} else if (!strcasecmp(sep->arg[1], "attackcount")) {
if (sep->IsNumber(2)) {
auto attack_count = std::stoi(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has an Attack Count of {}.",
npc_id_string,
attack_count
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET attack_count = {} WHERE id = {}",
attack_count,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit attackcount [Attack Count] - Sets an NPC's Attack Count");
}
return;
} else if (!strcasecmp(sep->arg[1], "special_attacks")) {
std::string special_attacks = sep->argplus[2];
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using the following Special Attacks '{}'.",
npc_id_string,
special_attacks
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET npcspecialattks = '{}' WHERE id = {}",
special_attacks,
npc_id
);
content_db.QueryDatabase(query);
return;
} else if (!strcasecmp(sep->arg[1], "special_abilities")) {
std::string special_abilities = sep->argplus[2];
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using the following Special Abilities '{}'.",
npc_id_string,
special_abilities
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET special_abilities = '{}' WHERE id = {}",
special_abilities,
npc_id
);
content_db.QueryDatabase(query);
return;
} else if (!strcasecmp(sep->arg[1], "aggroradius")) {
if (sep->IsNumber(2)) {
auto aggro_radius = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has an Aggro Radius of {}.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET aggroradius = {} WHERE id = {}",
aggro_radius,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit aggroradius [Radius] - Sets an NPC's Aggro Radius");
}
return;
} else if (!strcasecmp(sep->arg[1], "assistradius")) {
if (sep->IsNumber(2)) {
auto assist_radius = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has an Assist Radius of {}",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET assistradius = {} WHERE id = {}",
assist_radius,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit assistradius [Radius] - Sets an NPC's Assist Radius");
}
return;
} else if (!strcasecmp(sep->arg[1], "featuresave")) {
c->Message(
Chat::Yellow,
fmt::format(
"{} saved with all current body and facial feature settings.",
npc_id
).c_str()
);
auto target = c->GetTarget();
auto query = fmt::format(
"UPDATE npc_types "
"SET luclin_haircolor = {}, luclin_beardcolor = {}, "
"luclin_eyecolor = {}, luclin_eyecolor2 = {}, "
"luclin_hairstyle = {}, luclin_beard = {}, "
"face = {}, drakkin_heritage = {}, "
"drakkin_tattoo = {}, drakkin_details = {}, "
"texture = {}, helmtexture = {}, "
"gender = {}, size = {:.2f} "
"WHERE id = {}",
target->GetHairColor(),
target->GetBeardColor(),
target->GetEyeColor1(),
target->GetEyeColor2(),
target->GetHairStyle(),
target->GetBeard(),
target->GetLuclinFace(),
target->GetDrakkinHeritage(),
target->GetDrakkinTattoo(),
target->GetDrakkinDetails(),
target->GetTexture(),
target->GetHelmTexture(),
target->GetGender(),
target->GetSize(),
npc_id
);
content_db.QueryDatabase(query);
return;
} else if (!strcasecmp(sep->arg[1], "armortint_id")) {
if (sep->IsNumber(2)) {
auto armor_tint_id = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Armor Tint ID {}.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET armortint_id = {} WHERE id = {}",
armor_tint_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit armortint_id [Armor Tint ID] - Sets an NPC's Armor Tint ID");
}
return;
} else if (!strcasecmp(sep->arg[1], "color")) {
if (sep->IsNumber(2)) {
auto red = static_cast<uint8>(std::stoul(sep->arg[2]));
uint8 green = sep->IsNumber(3) ? std::stoul(sep->arg[3]) : 0;
uint8 blue = sep->IsNumber(4) ? std::stoul(sep->arg[4]) : 0;
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Red, {} Green, and {} Blue tinting on their armor.",
npc_id_string,
red,
green,
blue
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET armortint_red = {}, armortint_green = {}, armortint_blue = {} WHERE id = {}",
red,
green,
blue,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit color [Red] [Green] [Blue] - Sets an NPC's Red, Green, and Blue armor tint");
}
return;
} else if (!strcasecmp(sep->arg[1], "ammoidfile")) {
if (sep->IsNumber(2)) {
auto ammo_id_file = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Ammo ID File {}.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET ammo_idfile = {} WHERE id = {}",
ammo_id_file,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit ammoidfile [ID File] - Sets an NPC's Ammo ID File");
}
return;
} else if (!strcasecmp(sep->arg[1], "weapon")) {
if (sep->IsNumber(2)) {
auto primary_model = std::stoul(sep->arg[2]);
uint32 secondary_model = sep->IsNumber(3) ? std::stoul(sep->arg[3]) : 0;
c->Message(
Chat::Yellow,
fmt::format(
"{} will have Model {} set to their Primary and Model {} set to their Secondary on repop.",
npc_id_string,
Strings::Commify(sep->arg[2]),
sep->IsNumber(3) ? Strings::Commify(sep->arg[3]) : 0
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET d_melee_texture1 = {}, d_melee_texture2 = {} WHERE id = {}",
primary_model,
secondary_model,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit weapon [Primary Model] [Secondary Model] - Sets an NPC's Primary and Secondary Weapon Model"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "meleetype")) {
if (sep->IsNumber(2)) {
auto primary_type = std::stoul(sep->arg[2]);
uint32 secondary_type = sep->IsNumber(3) ? std::stoul(sep->arg[3]) : 0;
auto primary_skill = EQ::skills::GetSkillName(static_cast<EQ::skills::SkillType>(primary_type));
auto secondary_skill = EQ::skills::GetSkillName(static_cast<EQ::skills::SkillType>(secondary_type));
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Primary Melee Type of {} and a Secondary Melee Type of {}.",
npc_id_string,
(
!primary_skill.empty() ?
fmt::format(
"{} ({})",
primary_skill,
primary_type
) :
std::to_string(primary_type)
),
(
!secondary_skill.empty() ?
fmt::format(
"{} ({})",
secondary_skill,
secondary_type
) :
std::to_string(secondary_type)
)
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET prim_melee_type = {}, sec_melee_type = {} WHERE id = {}",
primary_type,
secondary_type,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit meleetype [Primary Type] [Secondary Type] - Sets an NPC's Melee Skill Types");
}
return;
} else if (!strcasecmp(sep->arg[1], "rangedtype")) {
if (sep->IsNumber(2)) {
auto ranged_type = std::stoul(sep->arg[2]);
auto ranged_skill = EQ::skills::GetSkillName(static_cast<EQ::skills::SkillType>(ranged_type));
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Ranged Type of {}.",
npc_id_string,
(
!ranged_skill.empty() ?
fmt::format(
"{} ({})",
ranged_skill,
ranged_type
) :
std::to_string(ranged_type)
)
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET ranged_type = {} WHERE id = {}",
ranged_type,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit rangedtype [Type] - Sets an NPC's Ranged Skill Type");
}
return;
} else if (!strcasecmp(sep->arg[1], "runspeed")) {
if (sep->IsNumber(2)) {
auto run_speed = std::stof(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now runs at a Run Speed of {:.2f}.",
npc_id_string,
run_speed
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET runspeed = {:.2f} WHERE id = {}",
run_speed,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit runspeed [Run Speed] - Sets an NPC's Run Speed");
}
return;
} else if (!strcasecmp(sep->arg[1], "mr")) {
if (sep->IsNumber(2)) {
auto magic_resist = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Magic Resistance of {}.",
npc_id_string,
magic_resist
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET MR = {} WHERE id = {}",
magic_resist,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit mr [Resistance] - Sets an NPC's Magic Resistance");
}
return;
} else if (!strcasecmp(sep->arg[1], "pr")) {
if (sep->IsNumber(2)) {
auto poison_resist = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Poison Resistance of {}.",
npc_id_string,
poison_resist
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET PR = {} WHERE id = {}",
poison_resist,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit pr [Resistance] - Sets an NPC's Poison Resistance");
}
return;
} else if (!strcasecmp(sep->arg[1], "dr")) {
if (sep->IsNumber(2)) {
auto disease_resist = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Disease Resistance of {}.",
npc_id_string,
disease_resist
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET DR = {} WHERE id = {}",
disease_resist,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit dr [Resistance] - Sets an NPC's Disease Resistance");
}
return;
} else if (!strcasecmp(sep->arg[1], "fr")) {
if (sep->IsNumber(2)) {
auto fire_resist = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Fire Resistance of {}.",
npc_id_string,
fire_resist
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET FR = {} WHERE id = {}",
fire_resist,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit fr [Resistance] - Sets an NPC's Fire Resistance");
}
return;
} else if (!strcasecmp(sep->arg[1], "cr")) {
if (sep->IsNumber(2)) {
auto cold_resist = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Cold Resistance of {}.",
npc_id_string,
cold_resist
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET CR = {} WHERE id = {}",
cold_resist,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit cr [Resistance] - Sets an NPC's Cold Resistance");
}
return;
} else if (!strcasecmp(sep->arg[1], "corrup")) {
if (sep->IsNumber(2)) {
auto corruption_resist = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Corruption Resistance of {}.",
npc_id_string,
corruption_resist
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET corrup = {} WHERE id = {}",
corruption_resist,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit corrup [Resistance] - Sets an NPC's Corruption Resistance");
}
return;
} else if (!strcasecmp(sep->arg[1], "phr")) {
if (sep->IsNumber(2)) {
auto physical_resist = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Physical Resistance of {}.",
npc_id_string,
physical_resist
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET PhR = {} WHERE id = {}",
physical_resist,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit phr [Resistance] - Sets and NPC's Physical Resistance");
}
return;
} else if (!strcasecmp(sep->arg[1], "seeinvis")) {
if (sep->IsNumber(2)) {
auto see_invisible = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} can {} See Invisible.",
npc_id_string,
see_invisible ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET see_invis = {} WHERE id = {}",
see_invisible,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit seeinvis [Flag] - Sets an NPC's See Invisible Flag [0 = Cannot See Invisible, 1 = Can See Invisible]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "seeinvisundead")) {
if (sep->IsNumber(2)) {
auto see_invisible_undead = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} can {} See Invisible vs. Undead.",
npc_id_string,
see_invisible_undead ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET see_invis_undead = {} WHERE id = {}",
see_invisible_undead,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit seeinvisundead [Flag] - Sets an NPC's See Invisible vs. Undead Flag [0 = Cannot See Invisible vs. Undead, 1 = Can See Invisible vs. Undead]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "qglobal")) {
if (sep->IsNumber(2)) {
auto use_qglobals = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} can {} use Quest Globals.",
npc_id_string,
use_qglobals ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET qglobal = {} WHERE id = {}",
use_qglobals,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit qglobal [Flag] - Sets an NPC's Quest Global Flag [0 = Quest Globals Off, 1 = Quest Globals On]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "ac")) {
if (sep->IsNumber(2)) {
auto armor_class = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Armor Class.",
npc_id_string,
armor_class
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET ac = {} WHERE id = {}",
armor_class,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit ac [Armor Class] - Sets an NPC's Armor Class");
}
return;
} else if (!strcasecmp(sep->arg[1], "npcaggro")) {
if (sep->IsNumber(2)) {
auto aggro_npcs = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} will {} aggro other NPCs that have a hostile faction.",
npc_id_string,
aggro_npcs ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET npc_aggro = {} WHERE id = {}",
aggro_npcs,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit npcaggro [Flag] - Sets an NPC's NPC Aggro Flag [0 = Aggro NPCs Off, 1 = Aggro NPCs On]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "spawn_limit")) {
if (sep->IsNumber(2)) {
auto spawn_limit = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Spawn Limit of {}.",
npc_id_string,
spawn_limit
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET spawn_limit = {} WHERE id = {}",
spawn_limit,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit spawn_limit [Limit] - Sets an NPC's Spawn Limit Counter");
}
return;
} else if (!strcasecmp(sep->arg[1], "attackspeed")) {
if (sep->IsNumber(2)) {
auto attack_speed = std::stof(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has an Attack Speed of {:.2f}.",
npc_id_string,
attack_speed
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET attack_speed = {:.2f} WHERE id = {}",
attack_speed,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit attackspeed [Attack Speed] - Sets an NPC's Attack Speed Modifier");
}
return;
} else if (!strcasecmp(sep->arg[1], "attackdelay")) {
if (sep->IsNumber(2)) {
auto attack_delay = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has an Attack Delay of {}.",
npc_id_string,
attack_delay
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET attack_delay = {} WHERE id = {}",
attack_delay,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit attackdelay [Attack Delay] - Sets an NPC's Attack Delay");
}
return;
} else if (!strcasecmp(sep->arg[1], "findable")) {
if (sep->IsNumber(2)) {
auto is_findable = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is {} Findable.",
npc_id_string,
is_findable ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET findable = {} WHERE id = {}",
is_findable,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit findable [Flag] - Sets an NPC's Findable Flag [0 = Not Findable, 1 = Findable]");
}
return;
} else if (!strcasecmp(sep->arg[1], "str")) {
if (sep->IsNumber(2)) {
auto strength = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Strength.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET STR = {} WHERE id = {}",
strength,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit str [Strength] - Sets an NPC's Strength");
}
return;
} else if (!strcasecmp(sep->arg[1], "sta")) {
if (sep->IsNumber(2)) {
auto stamina = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Stamina.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET STA = {} WHERE id = {}",
stamina,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit sta [Stamina] - Sets an NPC's Stamina");
}
return;
} else if (!strcasecmp(sep->arg[1], "agi")) {
if (sep->IsNumber(2)) {
auto agility = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Agility.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET AGI = {} WHERE id = {}",
agility,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit agi [Agility] - Sets an NPC's Agility");
}
return;
} else if (!strcasecmp(sep->arg[1], "dex")) {
if (sep->IsNumber(2)) {
auto dexterity = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Dexterity.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET DEX = {} WHERE id = {}",
dexterity,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit dex [Dexterity] - Sets an NPC's Dexterity");
}
return;
} else if (!strcasecmp(sep->arg[1], "int")) {
if (sep->IsNumber(2)) {
auto intelligence = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Intelligence.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET _INT = {} WHERE id = {}",
intelligence,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit int [Intelligence] - Sets an NPC's Intelligence");
}
return;
} else if (!strcasecmp(sep->arg[1], "wis")) {
if (sep->IsNumber(2)) {
auto wisdom = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Wisdom.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET WIS = {} WHERE id = {}",
wisdom,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit wis [Wisdom] - Sets an NPC's Wisdom");
}
return;
} else if (!strcasecmp(sep->arg[1], "cha")) {
if (sep->IsNumber(2)) {
auto charisma = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Charisma.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET CHA = {} WHERE id = {}",
charisma,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit cha [Charisma] - Sets an NPC's Charisma");
}
return;
} else if (!strcasecmp(sep->arg[1], "seehide")) {
if (sep->IsNumber(2)) {
auto see_hide = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} can {} See Hide.",
npc_id_string,
see_hide ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET see_hide = {} WHERE id = {}",
see_hide,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit seehide [Flag] - Sets an NPC's See Hide Flag [0 = Cannot See Hide, 1 = Can See Hide]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "seeimprovedhide")) {
if (sep->IsNumber(2)) {
auto see_improved_hide = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} can {} See Improved Hide.",
npc_id_string,
see_improved_hide ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET see_improved_hide = {} WHERE id = {}",
see_improved_hide,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit seeimprovedhide [Flag] - Sets an NPC's See Improved Hide Flag [0 = Cannot See Improved Hide, 1 = Can See Improved Hide]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "trackable")) {
if (sep->IsNumber(2)) {
auto is_trackable = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is {} Trackable.",
npc_id_string,
is_trackable ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET trackable = {} WHERE id = {}",
is_trackable,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit trackable [Flag] - Sets an NPC's Trackable Flag [0 = Not Trackable, 1 = Trackable]");
}
return;
} else if (!strcasecmp(sep->arg[1], "atk")) {
if (sep->IsNumber(2)) {
auto attack = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Attack.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET atk = {} WHERE id = {}",
attack,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit atk [Attack] - Sets an NPC's Attack");
}
return;
} else if (!strcasecmp(sep->arg[1], "accuracy")) {
if (sep->IsNumber(2)) {
auto accuracy = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Accuracy.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET accuracy = {} WHERE id = {}",
accuracy,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit accuracy [Accuracy] - Sets an NPC's Accuracy");
}
return;
} else if (!strcasecmp(sep->arg[1], "avoidance")) {
if (sep->IsNumber(2)) {
auto avoidance = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Avoidance.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET avoidance = {} WHERE id = {}",
avoidance,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit avoidance [Avoidance] - Sets an NPC's Avoidance");
}
return;
} else if (!strcasecmp(sep->arg[1], "slow_mitigation")) {
if (sep->IsNumber(2)) {
auto slow_mitigation = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Slow Mitigation.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET slow_mitigation = {} WHERE id = {}",
slow_mitigation,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit slow_mitigation [Slow Mitigation] - Sets an NPC's Slow Mitigation");
}
return;
} else if (!strcasecmp(sep->arg[1], "version")) {
if (sep->IsNumber(2)) {
auto version = std::stoi(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Version {}.",
npc_id_string,
version
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET version = {} WHERE id = {}",
version,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit version [Version] - Sets an NPC's Version");
}
return;
} else if (!strcasecmp(sep->arg[1], "maxlevel")) {
if (sep->IsNumber(2)) {
auto max_level = static_cast<uint8>(std::stoul(sep->arg[2]));
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Maximum Level of {}.",
npc_id_string,
max_level
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET maxlevel = {} WHERE id = {}",
max_level,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit maxlevel [Max Level] - Sets an NPC's Maximum Level");
}
return;
} else if (!strcasecmp(sep->arg[1], "scalerate")) {
if (sep->IsNumber(2)) {
auto scale_rate = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Scaling Rate of {}%%.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET scalerate = {} WHERE id = {}",
scale_rate,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit scalerate [Scale Rate] - Sets an NPC's Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]");
}
return;
} else if (!strcasecmp(sep->arg[1], "spellscale")) {
if (sep->IsNumber(2)) {
auto spell_scale = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Spell Scaling Rate of {}%%.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET spellscale = {} WHERE id = {}",
spell_scale,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit spellscale [Scale Rate] - Sets an NPC's Spell Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "healscale")) {
if (sep->IsNumber(2)) {
auto heal_scale = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Heal Scaling Rate of {}%%.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET healscale = {} WHERE id = {}",
heal_scale,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit healscale [Scale Rate] - Sets an NPC's Heal Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "no_target")) {
if (sep->IsNumber(2)) {
auto is_no_target = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is {} Targetable with Target Hotkey.",
npc_id_string,
is_no_target ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET no_target_hotkey = {} WHERE id = {}",
is_no_target,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit no_target [Flag] - Sets an NPC's No Target Hotkey Flag [0 = Not Targetable with Target Hotkey, 1 = Targetable with Target Hotkey]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "raidtarget")) {
if (sep->IsNumber(2)) {
auto is_raid_target = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is {} designated as a Raid Target.",
npc_id_string,
is_raid_target ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET raid_target = {} WHERE id = {}",
is_raid_target,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit raidtarget [Flag] - Sets an NPC's Raid Target Flag [0 = Not a Raid Target, 1 = Raid Target]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "armtexture")) {
if (sep->IsNumber(2)) {
auto arm_texture = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Arm Texture {}.",
npc_id_string,
arm_texture
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET armtexture = {} WHERE id = {}",
arm_texture,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit armtexture [Texture] - Sets an NPC's Arm Texture");
}
return;
} else if (!strcasecmp(sep->arg[1], "bracertexture")) {
if (sep->IsNumber(2)) {
auto bracer_texture = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Bracer Texture {}.",
npc_id_string,
bracer_texture
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET bracertexture = {} WHERE id = {}",
bracer_texture,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit bracertexture [Texture] - Sets an NPC's Bracer Texture");
}
return;
} else if (!strcasecmp(sep->arg[1], "handtexture")) {
if (sep->IsNumber(2)) {
auto hand_texture = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Hand Texture {}.",
npc_id_string,
hand_texture
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET handtexture = {} WHERE id = {}",
hand_texture,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit handtexture [Texture] - Sets an NPC's Hand Texture");
}
return;
} else if (!strcasecmp(sep->arg[1], "legtexture")) {
if (sep->IsNumber(2)) {
auto leg_texture = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Leg Texture {}.",
npc_id_string,
leg_texture
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET legtexture = {} WHERE id = {}",
leg_texture,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit legtexture [Texture] - Sets an NPC's Leg Texture");
}
return;
} else if (!strcasecmp(sep->arg[1], "feettexture")) {
if (sep->IsNumber(2)) {
auto feet_texture = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Feet Texture {}.",
npc_id_string,
feet_texture
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET feettexture = {} WHERE id = {}",
feet_texture,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit feettexture [Texture] - Sets an NPC's Feet Texture");
}
return;
} else if (!strcasecmp(sep->arg[1], "walkspeed")) {
if (sep->IsNumber(2)) {
auto walk_speed = std::stof(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now walks at a Walk Speed of {:.2f}.",
npc_id_string,
walk_speed
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET walkspeed = {:.2f} WHERE id = {}",
walk_speed,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit walkspeed [Walk Speed] - Sets an NPC's Walk Speed");
}
return;
} else if (!strcasecmp(sep->arg[1], "show_name")) {
if (sep->IsNumber(2)) {
auto show_name = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} will {} show their name.",
npc_id_string,
show_name ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET show_name = {} WHERE id = {}",
show_name,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit show_name [Flag] - Sets an NPC's Show Name Flag [0 = Hidden, 1 = Shown]");
}
return;
} else if (!strcasecmp(sep->arg[1], "untargetable")) {
if (sep->IsNumber(2)) {
auto is_untargetable = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} will {} be untargetable.",
npc_id_string,
is_untargetable ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET untargetable = {} WHERE id = {}",
is_untargetable,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit untargetable [Flag] - Sets an NPC's Untargetable Flag [0 = Targetable, 1 = Untargetable]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "charm_ac")) {
if (sep->IsNumber(2)) {
auto charm_armor_class = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Armor Class while Charmed.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET charm_ac = {} WHERE id = {}",
charm_armor_class,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit charm_ac [Armor Class] - Sets an NPC's Armor Class while Charmed");
}
return;
} else if (!strcasecmp(sep->arg[1], "charm_min_dmg")) {
if (sep->IsNumber(2)) {
auto charm_minimum_damage = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now does {} Minimum Damage while Charmed.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET charm_min_dmg = {} WHERE id = {}",
charm_minimum_damage,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit charm_min_dmg [Damage] - Sets an NPC's Minimum Damage while Charmed");
}
return;
} else if (!strcasecmp(sep->arg[1], "charm_max_dmg")) {
if (sep->IsNumber(2)) {
auto charm_maximum_damage = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now does {} Maximum Damage while Charmed.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET charm_max_dmg = {} WHERE id = {}",
charm_maximum_damage,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit charm_max_dmg [Damage] - Sets an NPC's Maximum Damage while Charmed");
}
return;
} else if (!strcasecmp(sep->arg[1], "charm_attack_delay")) {
if (sep->IsNumber(2)) {
auto charm_attack_delay = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Attack Delay while Charmed.",
npc_id_string,
charm_attack_delay
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET charm_attack_delay = {} WHERE id = {}",
charm_attack_delay,
npc_id
);
content_db.QueryDatabase(query);
}
return;
} else if (!strcasecmp(sep->arg[1], "charm_accuracy_rating")) {
if (sep->IsNumber(2)) {
auto charm_accuracy_rating = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Accuracy Rating while Charmed.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET charm_accuracy_rating = {} WHERE id = {}",
charm_accuracy_rating,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit charm_accuracy_rating [Accuracy] - Sets an NPC's Accuracy Rating while Charmed");
}
return;
} else if (!strcasecmp(sep->arg[1], "charm_avoidance_rating")) {
if (sep->IsNumber(2)) {
auto charm_avoidance_rating = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Avoidance Rating while Charmed.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET charm_avoidance_rating = {} WHERE id = {}",
charm_avoidance_rating,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit charm_avoidance_rating [Avoidance] - Sets an NPC's Avoidance Rating while Charmed");
}
return;
} else if (!strcasecmp(sep->arg[1], "charm_atk")) {
if (sep->IsNumber(2)) {
auto charm_attack = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has {} Attack while Charmed.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET charm_atk = {} WHERE id = {}",
charm_attack,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Usage: #npcedit charm_atk [Attack] - Sets an NPC's Attack while Charmed");
}
return;
} else if (!strcasecmp(sep->arg[1], "skip_global_loot")) {
if (sep->IsNumber(2)) {
auto skip_global_loot = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} will {} skip Global Loot.",
npc_id_string,
skip_global_loot ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET skip_global_loot = {} WHERE id = {}",
skip_global_loot,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit skip_global_loot [Flag] - Sets an NPC's Skip Global Loot Flag [0 = Don't Skip, 1 = Skip"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "rarespawn")) {
if (sep->IsNumber(2)) {
auto is_rare_spawn = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} is {} designated as a Rare Spawn.",
npc_id_string,
is_rare_spawn ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET rare_spawn = {} WHERE id = {}",
is_rare_spawn,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit rarespawn [Flag] - Sets an NPC's Rare Spawn Flag [0 = Not a Rare Spawn, 1 = Rare Spawn]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "stuck_behavior")) {
if (sep->IsNumber(2)) {
auto behavior_id = (
static_cast<uint8>(std::stoul(sep->arg[2])) > EQ::constants::StuckBehavior::EvadeCombat ?
EQ::constants::StuckBehavior::EvadeCombat :
static_cast<uint8>(std::stoul(sep->arg[2]))
);
auto behavior_name = EQ::constants::GetStuckBehaviorName(behavior_id);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Stuck Behavior {}.",
npc_id_string,
(
!behavior_name.empty() ?
fmt::format(
"{} ({})",
behavior_name,
behavior_id
) :
std::to_string(behavior_id)
)
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET stuck_behavior = {} WHERE id = {}",
behavior_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit stuck_behavior [Stuck Behavior] - Sets an NPC's Stuck Behavior [0 = Run to Target, 1 = Warp to Target, 2 = Take No Action, 3 = Evade Combat]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "flymode")) {
if (sep->IsNumber(2)) {
auto flymode_id = (
static_cast<int8>(std::stoul(sep->arg[2])) > GravityBehavior::LevitateWhileRunning ?
GravityBehavior::LevitateWhileRunning :
static_cast<int8>(std::stoul(sep->arg[2]))
);
auto flymode_name = EQ::constants::GetFlyModeName(flymode_id);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Fly Mode {}.",
npc_id_string,
(
!flymode_name.empty() ?
fmt::format(
"{} ({})",
flymode_name,
flymode_id
) :
std::to_string(flymode_id)
)
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET flymode = {} WHERE id = {}",
flymode_id,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit flymode [Fly Mode] - Sets an NPC's Fly Mode [0 = Ground, 1 = Flying, 2 = Levitating, 3 = Water, 4 = Floating, 5 = Levitating While Running]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "always_aggro")) {
if (sep->IsNumber(2)) {
auto always_aggro = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} will {} Always Aggro.",
npc_id_string,
always_aggro ? "now" : "no longer"
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET always_aggro = {} WHERE id = {}",
always_aggro,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit always_aggro [Flag] - Sets an NPC's Always Aggro Flag [0 = Does not Always Aggro, 1 = Always Aggro]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "exp_mod")) {
if (sep->IsNumber(2)) {
auto experience_modifier = std::stoul(sep->arg[2]);
c->Message(
Chat::Yellow,
fmt::format(
"{} now has an Experience Modifier of {}%%.",
npc_id_string,
Strings::Commify(sep->arg[2])
).c_str()
);
auto query = fmt::format(
"UPDATE npc_types SET exp_mod = {} WHERE id = {}",
experience_modifier,
npc_id
);
content_db.QueryDatabase(query);
} else {
c->Message(
Chat::White,
"Usage: #npcedit exp_mod [Modifier] - Sets an NPC's Experience Modifier [50 = 50%, 100 = 100%, 200 = 200%]"
);
}
return;
} else if (!strcasecmp(sep->arg[1], "setanimation")) {
if (sep->IsNumber(2)) {
auto animation_id = (
std::stoul(sep->arg[2]) > EQ::constants::SpawnAnimations::Looting ?
EQ::constants::SpawnAnimations::Looting :
std::stoul(sep->arg[2])
);
auto animation_name = EQ::constants::GetSpawnAnimationName(animation_id);
c->Message(
Chat::Yellow,
fmt::format(
"{} is now using Spawn Animation {} on Spawn Group ID {}.",
npc_id_string,
(
!animation_name.empty() ?
fmt::format(
"{} ({})",
animation_name,
animation_id
) :
std::to_string(animation_id)
),
Strings::Commify(std::to_string(c->GetTarget()->CastToNPC()->GetSpawnGroupId()))
).c_str()
);
auto query = fmt::format(
"UPDATE spawn2 SET animation = {} WHERE spawngroupID = {}",
animation_id,
c->GetTarget()->CastToNPC()->GetSpawnGroupId()
);
content_db.QueryDatabase(query);
c->GetTarget()->SetAppearance(EmuAppearance(animation_id));
} else {
c->Message(Chat::White, "Usage: #npcedit setanimation [Animation ID] - Sets an NPC's Animation on Spawn (Stored in spawn2 table)");
}
return;
} else if (!strcasecmp(sep->arg[1], "respawntime")) {
if (sep->IsNumber(2)) {
auto respawn_time = std::stoul(sep->arg[2]);
if (respawn_time) {
c->Message(
Chat::Yellow,
fmt::format(
"{} now has a Respawn Timer of {} ({}) on Spawn Group ID {}.",
npc_id_string,
Strings::SecondsToTime(respawn_time),
respawn_time,
Strings::Commify(std::to_string(c->GetTarget()->CastToNPC()->GetSpawnGroupId()))
).c_str()
);
auto query = fmt::format(
"UPDATE spawn2 SET respawntime = {} WHERE spawngroupID = {} AND version = {}",
respawn_time,
c->GetTarget()->CastToNPC()->GetSpawnGroupId(),
zone->GetInstanceVersion()
);
content_db.QueryDatabase(query);
} else {
c->Message(Chat::White, "Respawn Timer must be greater than 0 seconds.");
return;
}
} else {
c->Message(
Chat::White,
"Usage: #npcedit respawntime [Respawn Time] - Sets an NPC's Respawn Timer in Seconds (Stored in spawn2 table)"
);
}
return;
} else {
c->Message(Chat::White, "Usage: #npcedit name [Name] - Sets an NPC's Name");
c->Message(Chat::White, "Usage: #npcedit lastname [Last Name] - Sets an NPC's Last Name");
c->Message(Chat::White, "Usage: #npcedit level [Level] - Sets an NPC's Level");
c->Message(Chat::White, "Usage: #npcedit race [Race ID] - Sets an NPC's Race");
c->Message(Chat::White, "Usage: #npcedit class [Class ID] - Sets an NPC's Class");
c->Message(Chat::White, "Usage: #npcedit bodytype [Body Type ID] - Sets an NPC's Bodytype");
c->Message(Chat::White, "Usage: #npcedit hp [HP] - Sets an NPC's HP");
c->Message(Chat::White, "Usage: #npcedit mana [Mana] - Sets an NPC's Mana");
c->Message(Chat::White, "Usage: #npcedit gender [Gender ID] - Sets an NPC's Gender");
c->Message(Chat::White, "Usage: #npcedit texture [Texture] - Sets an NPC's Texture");
c->Message(Chat::White, "Usage: #npcedit helmtexture [Helmet Texture] - Sets an NPC's Helmet Texture");
c->Message(Chat::White, "Usage: #npcedit herosforgemodel [Model Number] - Sets an NPC's Hero's Forge Model");
c->Message(Chat::White, "Usage: #npcedit size [Size] - Sets an NPC's Size");
c->Message(Chat::White, "Usage: #npcedit hpregen [HP Regen] - Sets an NPC's HP Regen Rate Per Tick");
c->Message(Chat::White, "Usage: #npcedit hp_regen_per_second [HP Regen] - Sets an NPC's HP Regen Rate Per Second");
c->Message(Chat::White, "Usage: #npcedit manaregen [Mana Regen] - Sets an NPC's Mana Regen Rate Per Tick");
c->Message(Chat::White, "Usage: #npcedit loottable [Loottable ID] - Sets an NPC's Loottable ID");
c->Message(Chat::White, "Usage: #npcedit merchantid [Merchant ID] - Sets an NPC's Merchant ID");
c->Message(Chat::White, "Usage: #npcedit alt_currency_id [Alternate Currency ID] - Sets an NPC's Alternate Currency ID");
c->Message(Chat::White, "Usage: #npcedit spell [Spell List ID] - Sets an NPC's Spells List ID");
c->Message(Chat::White, "Usage: #npcedit npc_spells_effects_id [Spell Effects ID] - Sets an NPC's Spell Effects ID");
c->Message(Chat::White, "Usage: #npcedit faction [Faction ID] - Sets an NPC's Faction ID");
c->Message(Chat::White, "Usage: #npcedit adventure_template_id [Template ID] - Sets an NPC's Adventure Template ID");
c->Message(Chat::White, "Usage: #npcedit trap_template [Template ID] - Sets an NPC's Trap Template ID");
c->Message(Chat::White, "Usage: #npcedit damage [Minimum] [Maximum] - Sets an NPC's Damage");
c->Message(Chat::White, "Usage: #npcedit attackcount [Attack Count] - Sets an NPC's Attack Count");
c->Message(Chat::White, "Usage: #npcedit special_attacks [Special Attacks] - Sets an NPC's Special Attacks");
c->Message(Chat::White, "Usage: #npcedit special_abilities [Special Abilities] - Sets an NPC's Special Abilities");
c->Message(Chat::White, "Usage: #npcedit aggroradius [Radius] - Sets an NPC's Aggro Radius");
c->Message(Chat::White, "Usage: #npcedit assistradius [Radius] - Sets an NPC's Assist Radius");
c->Message(Chat::White, "Usage: #npcedit featuresave - Saves an NPC's current facial features to the database");
c->Message(Chat::White, "Usage: #npcedit armortint_id [Armor Tint ID] - Sets an NPC's Armor Tint ID");
c->Message(Chat::White, "Usage: #npcedit color [Red] [Green] [Blue] - Sets an NPC's Red, Green, and Blue armor tint");
c->Message(Chat::White, "Usage: #npcedit ammoidfile [ID File] - Sets an NPC's Ammo ID File");
c->Message(
Chat::White,
"Usage: #npcedit weapon [Primary Model] [Secondary Model] - Sets an NPC's Primary and Secondary Weapon Model"
);
c->Message(Chat::White, "Usage: #npcedit meleetype [Primary Type] [Secondary Type] - Sets an NPC's Melee Skill Types");
c->Message(Chat::White, "Usage: #npcedit rangedtype [Type] - Sets an NPC's Ranged Skill Type");
c->Message(Chat::White, "Usage: #npcedit runspeed [Run Speed] - Sets an NPC's Run Speed");
c->Message(Chat::White, "Usage: #npcedit mr [Resistance] - Sets an NPC's Magic Resistance");
c->Message(Chat::White, "Usage: #npcedit pr [Resistance] - Sets an NPC's Poison Resistance");
c->Message(Chat::White, "Usage: #npcedit dr [Resistance] - Sets an NPC's Disease Resistance");
c->Message(Chat::White, "Usage: #npcedit fr [Resistance] - Sets an NPC's Fire Resistance");
c->Message(Chat::White, "Usage: #npcedit cr [Resistance] - Sets an NPC's Cold Resistance");
c->Message(Chat::White, "Usage: #npcedit corrup [Resistance] - Sets an NPC's Corruption Resistance");
c->Message(Chat::White, "Usage: #npcedit phr [Resistance] - Sets and NPC's Physical Resistance");
c->Message(
Chat::White,
"Usage: #npcedit seeinvis [Flag] - Sets an NPC's See Invisible Flag [0 = Cannot See Invisible, 1 = Can See Invisible]"
);
c->Message(
Chat::White,
"Usage: #npcedit seeinvisundead [Flag] - Sets an NPC's See Invisible vs. Undead Flag [0 = Cannot See Invisible vs. Undead, 1 = Can See Invisible vs. Undead]"
);
c->Message(
Chat::White,
"Usage: #npcedit qglobal [Flag] - Sets an NPC's Quest Global Flag [0 = Quest Globals Off, 1 = Quest Globals On]"
);
c->Message(Chat::White, "Usage: #npcedit ac [Armor Class] - Sets an NPC's Armor Class");
c->Message(
Chat::White,
"Usage: #npcedit npcaggro [Flag] - Sets an NPC's NPC Aggro Flag [0 = Aggro NPCs Off, 1 = Aggro NPCs On]"
);
c->Message(Chat::White, "Usage: #npcedit spawn_limit [Limit] - Sets an NPC's Spawn Limit Counter");
c->Message(Chat::White, "Usage: #npcedit attackspeed [Attack Speed] - Sets an NPC's Attack Speed Modifier");
c->Message(Chat::White, "Usage: #npcedit attackdelay [Attack Delay] - Sets an NPC's Attack Delay");
c->Message(Chat::White, "Usage: #npcedit findable [Flag] - Sets an NPC's Findable Flag [0 = Not Findable, 1 = Findable]");
c->Message(Chat::White, "Usage: #npcedit str [Strength] - Sets an NPC's Strength");
c->Message(Chat::White, "Usage: #npcedit sta [Stamina] - Sets an NPC's Stamina");
c->Message(Chat::White, "Usage: #npcedit agi [Agility] - Sets an NPC's Agility");
c->Message(Chat::White, "Usage: #npcedit dex [Dexterity] - Sets an NPC's Dexterity");
c->Message(Chat::White, "Usage: #npcedit int [Intelligence] - Sets an NPC's Intelligence");
c->Message(Chat::White, "Usage: #npcedit wis [Wisdom] - Sets an NPC's Wisdom");
c->Message(Chat::White, "Usage: #npcedit cha [Charisma] - Sets an NPC's Charisma");
c->Message(
Chat::White,
"Usage: #npcedit seehide [Flag] - Sets an NPC's See Hide Flag [0 = Cannot See Hide, 1 = Can See Hide]"
);
c->Message(
Chat::White,
"Usage: #npcedit seeimprovedhide [Flag] - Sets an NPC's See Improved Hide Flag [0 = Cannot See Improved Hide, 1 = Can See Improved Hide]"
);
c->Message(Chat::White, "Usage: #npcedit trackable [Flag] - Sets an NPC's Trackable Flag [0 = Not Trackable, 1 = Trackable]");
c->Message(Chat::White, "Usage: #npcedit atk [Attack] - Sets an NPC's Attack");
c->Message(Chat::White, "Usage: #npcedit accuracy [Accuracy] - Sets an NPC's Accuracy");
c->Message(Chat::White, "Usage: #npcedit avoidance [Avoidance] - Sets an NPC's Avoidance");
c->Message(Chat::White, "Usage: #npcedit slow_mitigation [Slow Mitigation] - Sets an NPC's Slow Mitigation");
c->Message(Chat::White, "Usage: #npcedit version [Version] - Sets an NPC's Version");
c->Message(Chat::White, "Usage: #npcedit maxlevel [Max Level] - Sets an NPC's Maximum Level");
c->Message(Chat::White, "Usage: #npcedit scalerate [Scale Rate] - Sets an NPC's Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]");
c->Message(
Chat::White,
"Usage: #npcedit spellscale [Scale Rate] - Sets an NPC's Spell Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"
);
c->Message(
Chat::White,
"Usage: #npcedit healscale [Scale Rate] - Sets an NPC's Heal Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"
);
c->Message(
Chat::White,
"Usage: #npcedit no_target [Flag] - Sets an NPC's No Target Hotkey Flag [0 = Not Targetable with Target Hotkey, 1 = Targetable with Target Hotkey]"
);
c->Message(
Chat::White,
"Usage: #npcedit raidtarget [Flag] - Sets an NPC's Raid Target Flag [0 = Not a Raid Target, 1 = Raid Target]"
);
c->Message(Chat::White, "Usage: #npcedit armtexture [Texture] - Sets an NPC's Arm Texture");
c->Message(Chat::White, "Usage: #npcedit bracertexture [Texture] - Sets an NPC's Bracer Texture");
c->Message(Chat::White, "Usage: #npcedit handtexture [Texture] - Sets an NPC's Hand Texture");
c->Message(Chat::White, "Usage: #npcedit legtexture [Texture] - Sets an NPC's Leg Texture");
c->Message(Chat::White, "Usage: #npcedit feettexture [Texture] - Sets an NPC's Feet Texture");
c->Message(Chat::White, "Usage: #npcedit walkspeed [Walk Speed] - Sets an NPC's Walk Speed");
c->Message(Chat::White, "Usage: #npcedit show_name [Flag] - Sets an NPC's Show Name Flag [0 = Hidden, 1 = Shown]");
c->Message(
Chat::White,
"Usage: #npcedit untargetable [Flag] - Sets an NPC's Untargetable Flag [0 = Targetable, 1 = Untargetable]"
);
c->Message(Chat::White, "Usage: #npcedit charm_ac [Armor Class] - Sets an NPC's Armor Class while Charmed");
c->Message(Chat::White, "Usage: #npcedit charm_min_dmg [Damage] - Sets an NPC's Minimum Damage while Charmed");
c->Message(Chat::White, "Usage: #npcedit charm_max_dmg [Damage] - Sets an NPC's Maximum Damage while Charmed");
c->Message(Chat::White, "Usage: #npcedit charm_attack_delay [Attack Delay] - Sets an NPC's Attack Delay while Charmed");
c->Message(Chat::White, "Usage: #npcedit charm_accuracy_rating [Accuracy] - Sets an NPC's Accuracy Rating while Charmed");
c->Message(Chat::White, "Usage: #npcedit charm_avoidance_rating [Avoidance] - Sets an NPC's Avoidance Rating while Charmed");
c->Message(Chat::White, "Usage: #npcedit charm_atk [Attack] - Sets an NPC's Attack while Charmed");
c->Message(
Chat::White,
"Usage: #npcedit skip_global_loot [Flag] - Sets an NPC's Skip Global Loot Flag [0 = Don't Skip, 1 = Skip"
);
c->Message(
Chat::White,
"Usage: #npcedit rarespawn [Flag] - Sets an NPC's Rare Spawn Flag [0 = Not a Rare Spawn, 1 = Rare Spawn]"
);
c->Message(
Chat::White,
"Usage: #npcedit stuck_behavior [Stuck Behavior] - Sets an NPC's Stuck Behavior [0 = Run to Target, 1 = Warp to Target, 2 = Take No Action, 3 = Evade Combat]"
);
c->Message(
Chat::White,
"Usage: #npcedit flymode [Fly Mode] - Sets an NPC's Fly Mode [0 = Ground, 1 = Flying, 2 = Levitating, 3 = Water, 4 = Floating, 5 = Levitating While Running]"
);
c->Message(
Chat::White,
"Usage: #npcedit always_aggro [Flag] - Sets an NPC's Always Aggro Flag [0 = Does not Always Aggro, 1 = Always Aggro]"
);
c->Message(
Chat::White,
"Usage: #npcedit exp_mod [Modifier] - Sets an NPC's Experience Modifier [50 = 50%, 100 = 100%, 200 = 200%]"
);
c->Message(Chat::White, "Usage: #npcedit setanimation [Animation ID] - Sets an NPC's Animation on Spawn (Stored in spawn2 table)");
c->Message(
Chat::White,
"Usage: #npcedit respawntime [Respawn Time] - Sets an NPC's Respawn Timer in Seconds (Stored in spawn2 table)"
);
return;
}
}