#include "../client.h" #include "../groups.h" #include "../mob_movement_manager.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, "Error: Must have NPC targeted"); return; } if (strcasecmp(sep->arg[1], "help") == 0) { c->Message(Chat::White, "Help File for #npcedit. Syntax for commands are:"); c->Message(Chat::White, "#npcedit name - Sets an NPC's Name"); c->Message(Chat::White, "#npcedit lastname - Sets an NPC's Lastname"); c->Message(Chat::White, "#npcedit level - Sets an NPC's Level"); c->Message(Chat::White, "#npcedit race - Sets an NPC's Race"); c->Message(Chat::White, "#npcedit class - Sets an NPC's Class"); c->Message(Chat::White, "#npcedit bodytype - Sets an NPC's Bodytype"); c->Message(Chat::White, "#npcedit hp - Sets an NPC's Hitpoints"); c->Message(Chat::White, "#npcedit mana - Sets an NPC's Mana"); c->Message(Chat::White, "#npcedit gender - Sets an NPC's Gender"); c->Message(Chat::White, "#npcedit texture - Sets an NPC's Texture"); c->Message(Chat::White, "#npcedit helmtexture - Sets an NPC's Helmet Texture"); c->Message(Chat::White, "#npcedit herosforgemodel - Sets an NPC's Hero's Forge Model"); c->Message(Chat::White, "#npcedit size - Sets an NPC's Size"); c->Message(Chat::White, "#npcedit hpregen - Sets an NPC's Hitpoints Regeneration Rate Per Tick"); c->Message(Chat::White, "#npcedit manaregen - Sets an NPC's Mana Regeneration Rate Per Tick"); c->Message(Chat::White, "#npcedit loottable - Sets an NPC's Loottable ID"); c->Message(Chat::White, "#npcedit merchantid - Sets an NPC's Merchant ID"); c->Message(Chat::White, "#npcedit alt_currency_id - Sets an NPC's Alternate Currency ID"); c->Message(Chat::White, "#npcedit spell - Sets an NPC's Spells List ID"); c->Message(Chat::White, "#npcedit npc_spells_effects_id - Sets an NPC's Spell Effects ID"); c->Message(Chat::White, "#npcedit faction - Sets an NPC's Faction ID"); c->Message(Chat::White, "#npcedit adventure_template_id - Sets an NPC's Adventure Template ID"); c->Message(Chat::White, "#npcedit trap_template - Sets an NPC's Trap Template ID"); c->Message(Chat::White, "#npcedit damage [minimum] [maximum] - Sets an NPC's Damage"); c->Message(Chat::White, "#npcedit attackcount - Sets an NPC's Attack Count"); c->Message(Chat::White, "#npcedit special_attacks - Sets an NPC's Special Attacks"); c->Message(Chat::White, "#npcedit special_abilities - Sets an NPC's Special Abilities"); c->Message(Chat::White, "#npcedit aggroradius - Sets an NPC's Aggro Radius"); c->Message(Chat::White, "#npcedit assistradius - Sets an NPC's Assist Radius"); c->Message(Chat::White, "#npcedit featuresave - Saves an NPC's current facial features to the database"); c->Message(Chat::White, "#npcedit armortint_id - Sets an NPC's Armor Tint ID"); c->Message(Chat::White, "#npcedit color [red] [green] [blue] - Sets an NPC's Red, Green, and Blue armor tint"); c->Message(Chat::White, "#npcedit ammoidfile - Sets an NPC's Ammo ID File"); c->Message( Chat::White, "#npcedit weapon [primary_model] [secondary_model] - Sets an NPC's Primary and Secondary Weapon Model" ); c->Message(Chat::White, "#npcedit meleetype [primary_type] [secondary_type] - Sets an NPC's Melee Types"); c->Message(Chat::White, "#npcedit rangedtype - Sets an NPC's Ranged Type"); c->Message(Chat::White, "#npcedit runspeed - Sets an NPC's Run Speed"); c->Message(Chat::White, "#npcedit mr - Sets an NPC's Magic Resistance"); c->Message(Chat::White, "#npcedit pr - Sets an NPC's Poison Resistance"); c->Message(Chat::White, "#npcedit dr - Sets an NPC's Disease Resistance"); c->Message(Chat::White, "#npcedit fr - Sets an NPC's Fire Resistance"); c->Message(Chat::White, "#npcedit cr - Sets an NPC's Cold Resistance"); c->Message(Chat::White, "#npcedit corrup - Sets an NPC's Corruption Resistance"); c->Message(Chat::White, "#npcedit phr - Sets and NPC's Physical Resistance"); c->Message( Chat::White, "#npcedit seeinvis - Sets an NPC's See Invisible Flag [0 = Cannot See Invisible, 1 = Can See Invisible]" ); c->Message( Chat::White, "#npcedit seeinvisundead - 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, "#npcedit qglobal - Sets an NPC's Quest Global Flag [0 = Quest Globals Off, 1 = Quest Globals On]" ); c->Message(Chat::White, "#npcedit ac - Sets an NPC's Armor Class"); c->Message( Chat::White, "#npcedit npcaggro - Sets an NPC's NPC Aggro Flag [0 = Aggro NPCs Off, 1 = Aggro NPCs On]" ); c->Message(Chat::White, "#npcedit spawn_limit - Sets an NPC's Spawn Limit Counter"); c->Message(Chat::White, "#npcedit attackspeed - Sets an NPC's Attack Speed Modifier"); c->Message(Chat::White, "#npcedit attackdelay - Sets an NPC's Attack Delay"); c->Message(Chat::White, "#npcedit findable - Sets an NPC's Findable Flag [0 = Not Findable, 1 = Findable]"); c->Message(Chat::White, "#npcedit str - Sets an NPC's Strength"); c->Message(Chat::White, "#npcedit sta - Sets an NPC's Stamina"); c->Message(Chat::White, "#npcedit dex - Sets an NPC's Dexterity"); c->Message(Chat::White, "#npcedit agi - Sets an NPC's Agility"); c->Message(Chat::White, "#npcedit int - Sets an NPC's Intelligence"); c->Message(Chat::White, "#npcedit wis - Sets an NPC's Wisdom"); c->Message(Chat::White, "#npcedit cha - Sets an NPC's Charisma"); c->Message( Chat::White, "#npcedit seehide - Sets an NPC's See Hide Flag [0 = Cannot See Hide, 1 = Can See Hide]" ); c->Message( Chat::White, "#npcedit seeimprovedhide - Sets an NPC's See Improved Hide Flag [0 = Cannot See Improved Hide, 1 = Can See Improved Hide]" ); c->Message(Chat::White, "#npcedit trackable - Sets an NPC's Trackable Flag [0 = Not Trackable, 1 = Trackable]"); c->Message(Chat::White, "#npcedit atk - Sets an NPC's Attack"); c->Message(Chat::White, "#npcedit accuracy - Sets an NPC's Accuracy"); c->Message(Chat::White, "#npcedit avoidance - Sets an NPC's Avoidance"); c->Message(Chat::White, "#npcedit slow_mitigation - Sets an NPC's Slow Mitigation"); c->Message(Chat::White, "#npcedit version - Sets an NPC's Version"); c->Message(Chat::White, "#npcedit maxlevel - Sets an NPC's Maximum Level"); c->Message(Chat::White, "#npcedit scalerate - Sets an NPC's Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]"); c->Message( Chat::White, "#npcedit spellscale - Sets an NPC's Spell Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]" ); c->Message( Chat::White, "#npcedit healscale - Sets an NPC's Heal Scaling Rate [50 = 50%, 100 = 100%, 200 = 200%]" ); c->Message( Chat::White, "#npcedit no_target - Sets an NPC's No Target Hotkey Flag [0 = Not Targetable with Target Hotkey, 1 = Targetable with Target Hotkey]" ); c->Message( Chat::White, "#npcedit raidtarget - Sets an NPC's Raid Target Flag [0 = Not a Raid Target, 1 = Raid Target]" ); c->Message(Chat::White, "#npcedit armtexture - Sets an NPC's Arm Texture"); c->Message(Chat::White, "#npcedit bracertexture - Sets an NPC's Bracer Texture"); c->Message(Chat::White, "#npcedit handtexture - Sets an NPC's Hand Texture"); c->Message(Chat::White, "#npcedit legtexture - Sets an NPC's Leg Texture"); c->Message(Chat::White, "#npcedit feettexture - Sets an NPC's Feet Texture"); c->Message(Chat::White, "#npcedit walkspeed - Sets an NPC's Walk Speed"); c->Message(Chat::White, "#npcedit show_name - Sets an NPC's Show Name Flag [0 = Hidden, 1 = Shown]"); c->Message( Chat::White, "#npcedit untargetable - Sets an NPC's Untargetable Flag [0 = Targetable, 1 = Untargetable]" ); c->Message(Chat::White, "#npcedit charm_ac - Sets an NPC's Armor Class while Charmed"); c->Message(Chat::White, "#npcedit charm_min_dmg - Sets an NPC's Minimum Damage while Charmed"); c->Message(Chat::White, "#npcedit charm_max_dmg - Sets an NPC's Max Damage while Charmed"); c->Message(Chat::White, "#npcedit charm_attack_delay - Sets an NPC's Attack Delay while Charmed"); c->Message(Chat::White, "#npcedit charm_accuracy_rating - Sets an NPC's Accuracy Rating while Charmed"); c->Message(Chat::White, "#npcedit charm_avoidance_rating - Sets an NPC's Avoidance Rating while Charmed"); c->Message(Chat::White, "#npcedit charm_atk - Sets an NPC's Attack while Charmed"); c->Message( Chat::White, "#npcedit skip_global_loot - Sets an NPC's Skip Global Loot Flag [0 = Don't Skip, 1 = Skip" ); c->Message( Chat::White, "#npcedit rarespawn - Sets an NPC's Rare Spawn Flag [0 = Not a Rare Spawn, 1 = Rare Spawn]" ); c->Message( Chat::White, "#npcedit 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, "#npcedit flymode - Sets an NPC's flymode [0 = Ground, 1 = Flying, 2 = Levitating, 3 = Water, 4 = Floating, 5 = Levitating While Running]" ); c->Message( Chat::White, "#npcedit always_aggro - Sets an NPC's Always Aggro Flag [0 = Does not Always Aggro, 1 = Always Aggro]" ); c->Message( Chat::White, "#npcedit exp_mod - Sets an NPC's Experience Modifier [50 = 50%, 100 = 100%, 200 = 200%]" ); c->Message(Chat::White, "#npcedit setanimation - Sets an NPC's Animation on Spawn (Stored in spawn2 table)"); c->Message( Chat::White, "#npcedit respawntime - Sets an NPC's Respawn Timer in Seconds (Stored in spawn2 table)" ); } uint32 npc_id = c->GetTarget()->CastToNPC()->GetNPCTypeID(); if (strcasecmp(sep->arg[1], "name") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has the name '{}'.", npc_id, sep->arg[2]).c_str()); std::string query = fmt::format("UPDATE npc_types SET name = '{}' WHERE id = {}", sep->arg[2], npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "lastname") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has the lastname '{}'.", npc_id, sep->arg[2]).c_str()); std::string query = fmt::format("UPDATE npc_types SET lastname = '{}' WHERE id = {}", sep->arg[2], npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "level") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} is now level {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET level = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "race") == 0) { auto race_id = atoi(sep->arg[2]); c->Message( Chat::Yellow, fmt::format("NPC ID {} is now a {} ({}).", npc_id, GetRaceIDName(race_id), race_id).c_str()); std::string query = fmt::format("UPDATE npc_types SET race = {} WHERE id = {}", race_id, npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "class") == 0) { auto class_id = atoi(sep->arg[2]); c->Message( Chat::Yellow, fmt::format("NPC ID {} is now a {} ({}).", npc_id, GetClassIDName(class_id), class_id).c_str()); std::string query = fmt::format("UPDATE npc_types SET class = {} WHERE id = {}", class_id, npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "bodytype") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Bodytype {} .", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET bodytype = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "hp") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has {} Health.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET hp = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "mana") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has {} Mana.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET mana = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "gender") == 0) { auto gender_id = atoi(sep->arg[2]); c->Message( Chat::Yellow, fmt::format("NPC ID {} is now a {} ({}).", npc_id, gender_id, GetGenderName(gender_id)).c_str()); std::string query = fmt::format("UPDATE npc_types SET gender = {} WHERE id = {}", gender_id, npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "texture") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} is now using Texture {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET texture = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "helmtexture") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Helmet Texture {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET helmtexture = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "herosforgemodel") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Hero's Forge Model {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET herosforgemodel = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "size") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} is now Size {:.2f}.", npc_id, atof(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET size = {:.2f} WHERE id = {}", atof(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "hpregen") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now regenerates {} Health per Tick.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET hp_regen_rate = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "manaregen") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now regenerates {} Mana per Tick.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET mana_regen_rate = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "loottable") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using loottable ID {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET loottable_id = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "merchantid") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using merchant ID {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET merchant_id = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "alt_currency_id") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Alternate Currency ID {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET alt_currency_id = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "spell") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Spell List ID {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET npc_spells_id = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "npc_spells_effects_id") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using NPC Spells Effects ID {}.", npc_id, sep->arg[2]).c_str()); std::string query = fmt::format( "UPDATE npc_types SET npc_spells_effects_id = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "faction") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Faction ID {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET npc_faction_id = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "adventure_template_id") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Adventure Template ID {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET adventure_template_id = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "trap_template") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Trap Template ID {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET trap_template = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "damage") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} now hits from {} to {} damage.", npc_id, atoi(sep->arg[2]), atoi(sep->arg[3])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET mindmg = {}, maxdmg = {} WHERE id = {}", atoi(sep->arg[2]), atoi(sep->arg[3]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "attackcount") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has an Attack Count of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET attack_count = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "special_attacks") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} is now using the following Special Attacks '{}'.", npc_id, sep->arg[2] ).c_str()); std::string query = fmt::format( "UPDATE npc_types SET npcspecialattks = '{}' WHERE id = {}", sep->arg[2], npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "special_abilities") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} is now using the following Special Abilities '{}'.", npc_id, sep->arg[2] ).c_str()); std::string query = fmt::format( "UPDATE npc_types SET special_abilities = '{}' WHERE id = {}", sep->arg[2], npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "aggroradius") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has an Aggro Radius of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET aggroradius = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "assistradius") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has an Assist Radius of {}", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET assistradius = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "featuresave") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} saved with all current facial feature settings.", npc_id).c_str()); Mob *target = c->GetTarget(); std::string query = fmt::format( "UPDATE npc_types " "SET luclin_haircolor = {}, luclin_beardcolor = {}, " "luclin_hairstyle = {}, luclin_beard = {}, " "face = {}, drakkin_heritage = {}, " "drakkin_tattoo = {}, drakkin_details = {} " "WHERE id = {}", target->GetHairColor(), target->GetBeardColor(), target->GetHairStyle(), target->GetBeard(), target->GetLuclinFace(), target->GetDrakkinHeritage(), target->GetDrakkinTattoo(), target->GetDrakkinDetails(), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "armortint_id") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Armor Tint ID {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET armortint_id = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "color") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} now has {} Red, {} Green, and {} Blue tinting on their armor.", npc_id, atoi(sep->arg[2]), atoi(sep->arg[3]), atoi(sep->arg[4])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET armortint_red = {}, armortint_green = {}, armortint_blue = {} WHERE id = {}", atoi(sep->arg[2]), atoi(sep->arg[3]), atoi(sep->arg[4]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "ammoidfile") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Ammo ID File {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET ammo_idfile = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "weapon") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} will have Model {} set to their Primary and Model {} set to their Secondary on repop.", npc_id, atoi(sep->arg[2]), atoi(sep->arg[3])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET d_melee_texture1 = {}, d_melee_texture2 = {} WHERE id = {}", atoi(sep->arg[2]), atoi(sep->arg[3]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "meleetype") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} now has a Primary Melee Type of {} and a Secondary Melee Type of {}.", npc_id, atoi(sep->arg[2]), atoi(sep->arg[3])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET prim_melee_type = {}, sec_melee_type = {} WHERE id = {}", atoi(sep->arg[2]), atoi(sep->arg[3]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "rangedtype") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Ranged Type of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET ranged_type = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "runspeed") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now runs at {:.2f}.", npc_id, atof(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET runspeed = {:.2f} WHERE id = {}", atof(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "mr") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Magic Resistance of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET MR = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "pr") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Poison Resistance of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET PR = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "dr") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Disease Resistance of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET DR = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "fr") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Fire Resistance of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET FR = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "cr") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Cold Resistance of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET CR = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "corrup") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Corruption Resistance of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET corrup = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "phr") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Physical Resistance of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET PhR = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "seeinvis") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} can {} See Invisible.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format("UPDATE npc_types SET see_invis = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "seeinvisundead") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} can {} See Invisible vs. Undead.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format( "UPDATE npc_types SET see_invis_undead = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "qglobal") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} can {} use Quest Globals.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format("UPDATE npc_types SET qglobal = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "ac") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has {} Armor Class.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET ac = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "npcaggro") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} will {} aggro other NPCs that have a hostile faction.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format("UPDATE npc_types SET npc_aggro = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "spawn_limit") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Spawn Limit of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET spawn_limit = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "attackspeed") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has an Attack Speed of {:.2f}.", npc_id, atof(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET attack_speed = {:.2f} WHERE id = {}", atof(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "attackdelay") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has an Attack Delay of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET attack_delay = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "findable") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} is {} Findable.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format("UPDATE npc_types SET findable = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "str") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has {} Strength.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET STR = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "sta") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has {} Stamina.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET STA = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "agi") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has {} Agility.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET AGI = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "dex") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has {} Dexterity.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET DEX = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "int") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has {} Intelligence.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET _INT = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "wis") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Magic Resistance of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET WIS = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "cha") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has {} Charisma.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET CHA = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "seehide") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} can {} See Hide.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format("UPDATE npc_types SET see_hide = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "seeimprovedhide") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} can {} See Improved Hide.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format( "UPDATE npc_types SET see_improved_hide = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "trackable") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} is {} Trackable.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format("UPDATE npc_types SET trackable = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "atk") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has {} Attack.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET atk = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "accuracy") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has {} Accuracy.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET accuracy = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "avoidance") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now has {} Avoidance.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET avoidance = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "slow_mitigation") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has {} Slow Mitigation.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET slow_mitigation = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "version") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} is now using Version {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET version = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "maxlevel") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Maximum Level of {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET maxlevel = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "scalerate") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Scaling Rate of {}%%.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET scalerate = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "spellscale") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Spell Scaling Rate of {}%%.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET spellscale = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "healscale") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has a Heal Scaling Rate of {}%%.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET healscale = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "no_target") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} is {} Targetable with Target Hotkey.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format( "UPDATE npc_types SET no_target_hotkey = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "raidtarget") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} is {} designated as a Raid Target.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format( "UPDATE npc_types SET raid_target = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "armtexture") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Arm Texture {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET armtexture = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "bracertexture") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Bracer Texture {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET bracertexture = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "handtexture") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Hand Texture {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET handtexture = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "legtexture") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Leg Texture {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET legtexture = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "feettexture") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Feet Texture {}.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET feettexture = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "walkspeed") == 0) { c->Message(Chat::Yellow, fmt::format("NPC ID {} now walks at {:.2f}.", npc_id, atof(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET walkspeed = {:.2f} WHERE id = {}", atof(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "show_name") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} will {} show their name.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format("UPDATE npc_types SET show_name = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "untargetable") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} will {} be untargetable.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format( "UPDATE npc_types SET untargetable = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "charm_ac") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has {} Armor Class while Charmed.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET charm_ac = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "charm_min_dmg") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} now does {} Minimum Damage while Charmed.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET charm_min_dmg = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "charm_max_dmg") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} now does {} Maximum Damage while Charmed.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET charm_max_dmg = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "charm_attack_delay") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has {} Attack Delay while Charmed.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET charm_attack_delay = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "charm_accuracy_rating") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} now has {} Accuracy Rating while Charmed.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET charm_accuracy_rating = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "charm_avoidance_rating") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} now has {} Avoidance Rating while Charmed.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format( "UPDATE npc_types SET charm_avoidance_rating = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "charm_atk") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has {} Attack while Charmed.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET charm_atk = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "skip_global_loot") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} will {} skip Global Loot.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format( "UPDATE npc_types SET skip_global_loot = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "rarespawn") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} is {} designated as a Rare Spawn.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format( "UPDATE npc_types SET rare_spawn = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "stuck_behavior") == 0) { auto behavior_id = atoi(sep->arg[2]); std::string behavior_name = "Unknown"; if (behavior_id == MobStuckBehavior::RunToTarget) { behavior_name = "Run To Target"; } else if (behavior_id == MobStuckBehavior::WarpToTarget) { behavior_name = "Warp To Target"; } else if (behavior_id == MobStuckBehavior::TakeNoAction) { behavior_name = "Take No Action"; } else if (behavior_id == MobStuckBehavior::EvadeCombat) { behavior_name = "Evade Combat"; } c->Message( Chat::Yellow, fmt::format( "NPC ID {} is now using Stuck Behavior {} ({}).", npc_id, behavior_name, behavior_id ).c_str()); std::string query = fmt::format("UPDATE npc_types SET stuck_behavior = {} WHERE id = {}", behavior_id, npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "flymode") == 0) { auto flymode_id = atoi(sep->arg[2]); std::string flymode_name = "Unknown"; if (flymode_id == GravityBehavior::Ground) { flymode_name = "Ground"; } else if (flymode_id == GravityBehavior::Flying) { flymode_name = "Flying"; } else if (flymode_id == GravityBehavior::Levitating) { flymode_name = "Levitating"; } else if (flymode_id == GravityBehavior::Water) { flymode_name = "Water"; } else if (flymode_id == GravityBehavior::Floating) { flymode_name = "Floating"; } else if (flymode_id == GravityBehavior::LevitateWhileRunning) { flymode_name = "Levitating While Running"; } c->Message( Chat::Yellow, fmt::format("NPC ID {} is now using Fly Mode {} ({}).", npc_id, flymode_name, flymode_id).c_str()); std::string query = fmt::format("UPDATE npc_types SET flymode = {} WHERE id = {}", flymode_id, npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "always_aggro") == 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} will {} Always Aggro.", npc_id, (atoi(sep->arg[2]) == 1 ? "now" : "no longer")).c_str()); std::string query = fmt::format( "UPDATE npc_types SET always_aggro = {} WHERE id = {}", atoi(sep->arg[2]), npc_id ); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "exp_mod") == 0) { c->Message( Chat::Yellow, fmt::format("NPC ID {} now has an Experience Modifier of {}%%.", npc_id, atoi(sep->arg[2])).c_str()); std::string query = fmt::format("UPDATE npc_types SET exp_mod = {} WHERE id = {}", atoi(sep->arg[2]), npc_id); content_db.QueryDatabase(query); return; } if (strcasecmp(sep->arg[1], "setanimation") == 0) { int animation = 0; std::string animation_name = "Unknown"; if (sep->arg[2] && atoi(sep->arg[2]) <= 4) { if (strcasecmp(sep->arg[2], "stand") == 0 || atoi(sep->arg[2]) == 0) { // Stand animation = 0; animation_name = "Standing"; } else if (strcasecmp(sep->arg[2], "sit") == 0 || atoi(sep->arg[2]) == 1) { // Sit animation = 1; animation_name = "Sitting"; } else if (strcasecmp(sep->arg[2], "crouch") == 0 || atoi(sep->arg[2]) == 2) { // Crouch animation = 2; animation_name = "Crouching"; } else if (strcasecmp(sep->arg[2], "dead") == 0 || atoi(sep->arg[2]) == 3) { // Dead animation = 3; animation_name = "Dead"; } else if (strcasecmp(sep->arg[2], "loot") == 0 || atoi(sep->arg[2]) == 4) { // Looting Animation animation = 4; animation_name = "Looting"; } } else { c->Message( Chat::White, "You must specify an Animation (0 = Stand, 1 = Sit, 2 = Crouch, 3 = Dead, 4 = Loot)" ); c->Message(Chat::White, "Example: #npcedit setanimation sit"); c->Message(Chat::White, "Example: #npcedit setanimation 0"); return; } c->Message( Chat::Yellow, fmt::format( "NPC ID {} now has their Spawn Animation set to {} ({}) on Spawn Group ID {}.", npc_id, animation_name, animation, c->GetTarget()->CastToNPC()->GetSpawnGroupId() ).c_str() ); std::string query = fmt::format( "UPDATE spawn2 SET animation = {} WHERE spawngroupID = {}", animation, c->GetTarget()->CastToNPC()->GetSpawnGroupId() ); content_db.QueryDatabase(query); c->GetTarget()->SetAppearance(EmuAppearance(animation)); return; } if (strcasecmp(sep->arg[1], "respawntime") == 0) { if (sep->arg[2][0] && sep->IsNumber(sep->arg[2]) && atoi(sep->arg[2]) > 0) { c->Message( Chat::Yellow, fmt::format( "NPC ID {} now has a Respawn Timer of {} Seconds on Spawn Group ID {}.", npc_id, atoi(sep->arg[2]), c->GetTarget()->CastToNPC()->GetSpawnGroupId()).c_str()); std::string query = fmt::format( "UPDATE spawn2 SET respawntime = {} WHERE spawngroupID = {} AND version = {}", atoi(sep->arg[2]), c->GetTarget()->CastToNPC()->GetSpawnGroupId(), zone->GetInstanceVersion()); content_db.QueryDatabase(query); return; } } if ((sep->arg[1][0] == 0 || strcasecmp(sep->arg[1], "*") == 0) || ((c->GetTarget() == 0) || (c->GetTarget()->IsClient()))) { c->Message(Chat::White, "Type #npcedit help for more info"); } }