diff --git a/zone/command.cpp b/zone/command.cpp index 380b01a1b..7e9d9c0e8 100755 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -386,7 +386,7 @@ int command_init(void) command_add("unmemspells", " - Unmemorize all spells for you or your target", AccountStatus::Guide, command_unmemspells) || command_add("unscribespell", "[spellid] - Unscribe specified spell from your target's spell book.", AccountStatus::GMCoder, command_unscribespell) || command_add("unscribespells", "- Clear out your or your player target's spell book.", AccountStatus::GMCoder, command_unscribespells) || - command_add("untraindisc", "[spellid] - Untrain specified discipline from your target.", AccountStatus::GMCoder, command_untraindisc) || + command_add("untraindisc", "[Spell ID] - Untrain your or your target's discipline by Spell ID", AccountStatus::GMCoder, command_untraindisc) || command_add("untraindiscs", "- Untrains all disciplines from your target.", AccountStatus::GMCoder, command_untraindiscs) || command_add("uptime", "[zone server id] - Get uptime of worldserver, or zone server if argument provided", AccountStatus::Steward, command_uptime) || command_add("version", "- Display current version of EQEmu server", AccountStatus::Player, command_version) || diff --git a/zone/gm_commands/untraindisc.cpp b/zone/gm_commands/untraindisc.cpp index c5d6ca1f2..694af047c 100755 --- a/zone/gm_commands/untraindisc.cpp +++ b/zone/gm_commands/untraindisc.cpp @@ -1,17 +1,68 @@ #include "../client.h" +#include "../../common/data_verification.h" void command_untraindisc(Client *c, const Seperator *sep) { - Client *t = c; - if (c->GetTarget() && c->GetTarget()->IsClient() && c->GetGM()) { - t = c->GetTarget()->CastToClient(); + int arguments = sep->argnum; + if (!arguments || !sep->IsNumber(1)) { + c->Message(Chat::White, "Usage: #untraindisc [Spell ID] - Untrain your or your target's discipline by Spell ID"); + return; } - for (int i = 0; i < MAX_PP_DISCIPLINES; i++) { - if (t->GetPP().disciplines.values[i] == atoi(sep->arg[1])) { - t->UntrainDisc(i, 1); - return; - } + auto target = c; + if (c->GetTarget() && c->GetTarget()->IsClient() && c->GetGM()) { + target = c->GetTarget()->CastToClient(); + } + + uint16 spell_id = EQ::Clamp(std::stoi(sep->arg[1]), 0, 65535); + + if (!IsValidSpell(spell_id)) { + c->Message( + Chat::White, + fmt::format( + "Spell ID {} could not be found.", + spell_id + ).c_str() + ); + return; + } + + auto spell_name = GetSpellName(spell_id); + + if (target->HasDisciplineLearned(spell_id)) { + target->UntrainDiscBySpellID(spell_id); + + c->Message( + Chat::White, + fmt::format( + "Untraining {} ({}) for {}.", + spell_name, + spell_id, + c == target ? + "yourself" : + fmt::format( + "{} ({})", + target->GetCleanName(), + target->GetID() + ) + ).c_str() + ); + } else { + c->Message( + Chat::White, + fmt::format( + "{} not have {} ({}) trained.", + c == target ? + "You do" : + fmt::format( + "{} ({}) does", + target->GetCleanName(), + target->GetID() + ), + spell_name, + spell_id + ).c_str() + ); } }