diff --git a/zone/gm_commands/castspell.cpp b/zone/gm_commands/castspell.cpp index 9d29bc79c..afbbd682a 100755 --- a/zone/gm_commands/castspell.cpp +++ b/zone/gm_commands/castspell.cpp @@ -7,58 +7,52 @@ void command_castspell(Client *c, const Seperator *sep) return; } - Mob *target = c; - if (c->GetTarget()) { - target = c->GetTarget(); - } - - if (!sep->IsNumber(1)) { + const auto arguments = sep->argnum; + if (!arguments || !sep->IsNumber(1)) { c->Message( Chat::White, "Usage: #castspell [Spell ID] [Instant (0 = False, 1 = True, Default is 1 if Unused)]" ); + return; } - else { - uint16 spell_id = Strings::ToUnsignedInt(sep->arg[1]); - if (IsCastRestrictedSpell(spell_id) && c->Admin() < commandCastSpecials) { - c->Message(Chat::Red, "Unable to cast spell."); - } - else if (spell_id >= SPDAT_RECORDS) { - c->Message(Chat::White, "Invalid Spell ID."); - } - else { - bool instant_cast = (c->Admin() >= commandInstacast ? true : false); - if (instant_cast && sep->IsNumber(2)) { - instant_cast = Strings::ToInt(sep->arg[2]) ? true : false; - c->Message(Chat::White, fmt::format("{}", Strings::ToInt(sep->arg[2])).c_str()); - } - - if (c->Admin() >= commandInstacast && instant_cast) { - c->SpellFinished( - spell_id, - target, - EQ::spells::CastingSlot::Item, - 0, - -1, - spells[spell_id].resist_difficulty - ); - } - else { - c->CastSpell(spell_id, target->GetID(), EQ::spells::CastingSlot::Item, spells[spell_id].cast_time); - } - - c->Message( - Chat::White, - fmt::format( - "Cast {} ({}) on {}{}.", - GetSpellName(spell_id), - spell_id, - c->GetTargetDescription(target), - instant_cast ? " instantly" : "" - ).c_str() - ); - } + Mob* t = c; + if (c->GetTarget()) { + t = c->GetTarget(); } + + const uint16 spell_id = Strings::ToUnsignedInt(sep->arg[1]); + + if (IsCastRestrictedSpell(spell_id) && c->Admin() < commandCastSpecials) { + c->Message(Chat::White, "Unable to cast spell."); + return; + } else if (spell_id >= SPDAT_RECORDS) { + c->Message(Chat::White, "Invalid Spell ID."); + return; + } + + const bool can_instant_cast = c->Admin() >= commandInstacast; + bool instant_cast = false; + if (can_instant_cast && sep->IsNumber(2)) { + instant_cast = Strings::ToBool(sep->arg[2]); + } + + const uint16 target_id = t->GetID(); + + if (instant_cast) { + c->SpellFinished(spell_id, t); + } else { + c->CastSpell(spell_id, t->GetID(), EQ::spells::CastingSlot::Item, spells[spell_id].cast_time); + } + + c->Message( + Chat::White, + fmt::format( + "Cast {} ({}) on {}{}.", + GetSpellName(spell_id), + spell_id, + c->GetTargetDescription(t, TargetDescriptionType::LCSelf, target_id), + instant_cast ? " instantly" : "" + ).c_str() + ); } - diff --git a/zone/mob.cpp b/zone/mob.cpp index 918a2e882..7884d4255 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -5068,7 +5068,7 @@ const char *Mob::GetCleanName() return clean_name; } -std::string Mob::GetTargetDescription(Mob* target, uint8 description_type) +std::string Mob::GetTargetDescription(Mob* target, uint8 description_type, uint16 entity_id_override) { std::string self_return = "yourself"; @@ -5119,7 +5119,7 @@ std::string Mob::GetTargetDescription(Mob* target, uint8 description_type) fmt::format( "{} ({})", target->GetCleanName(), - target->GetID() + entity_id_override ? entity_id_override : target->GetID() ) ) ); diff --git a/zone/mob.h b/zone/mob.h index 57658eb4e..c18a8eec5 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -586,7 +586,7 @@ public: virtual void SetName(const char *new_name = nullptr) { new_name ? strn0cpy(name, new_name, 64) : strn0cpy(name, GetName(), 64); return; }; inline Mob* GetTarget() const { return target; } - std::string GetTargetDescription(Mob* target, uint8 description_type = TargetDescriptionType::LCSelf); + std::string GetTargetDescription(Mob* target, uint8 description_type = TargetDescriptionType::LCSelf, uint16 entity_id_override = 0); virtual void SetTarget(Mob* mob); inline bool HasTargetReflection() const { return (target && target != this && target->target == this); } virtual inline float GetHPRatio() const { return max_hp == 0 ? 0 : ((float) current_hp / max_hp * 100); }