From abb41840f8830993e60224fac9d0d32f71fa2c17 Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Sun, 22 Jan 2023 12:56:26 -0500 Subject: [PATCH] [Commands] Cleanup #appearanceeffects Command. (#2777) # Notes - Cleanup messages and logic. --- zone/command.cpp | 2 +- zone/gm_commands/appearanceeffects.cpp | 117 ++++++++++++++++++------- zone/mob.cpp | 22 ++++- zone/mob.h | 2 +- 4 files changed, 106 insertions(+), 37 deletions(-) diff --git a/zone/command.cpp b/zone/command.cpp index 9b61bb427..2742f71bb 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -94,7 +94,7 @@ int command_init(void) command_add("aggrozone", "[aggro] - Aggro every mob in the zone with X aggro. Default is 0. Not recommend if you're not invulnerable.", AccountStatus::GMAdmin, command_aggrozone) || command_add("ai", "[factionid/spellslist/con/guard/roambox/stop/start] - Modify AI on NPC target", AccountStatus::GMAdmin, command_ai) || command_add("appearance", "[type] [value] - Send an appearance packet for you or your target", AccountStatus::GMLeadAdmin, command_appearance) || - command_add("appearanceeffects", "[view] [set] [remove] appearance effects.", AccountStatus::GMAdmin, command_appearanceeffects) || + command_add("appearanceeffects", "[Help|Remove|Set|View] - Modify appearance effects on yourself or your target.", AccountStatus::GMAdmin, command_appearanceeffects) || command_add("apply_shared_memory", "[shared_memory_name] - Tells every zone and world to apply a specific shared memory segment by name.", AccountStatus::GMImpossible, command_apply_shared_memory) || command_add("attack", "[Entity Name] - Make your NPC target attack an entity by name", AccountStatus::GMLeadAdmin, command_attack) || command_add("augmentitem", "Force augments an item. Must have the augment item window open.", AccountStatus::GMImpossible, command_augmentitem) || diff --git a/zone/gm_commands/appearanceeffects.cpp b/zone/gm_commands/appearanceeffects.cpp index 8a9a5eb44..18bcb40f4 100644 --- a/zone/gm_commands/appearanceeffects.cpp +++ b/zone/gm_commands/appearanceeffects.cpp @@ -2,43 +2,98 @@ void command_appearanceeffects(Client *c, const Seperator *sep) { - if (sep->arg[1][0] == '\0' || !strcasecmp(sep->arg[1], "help")) { - c->Message(Chat::White, "Syntax: #appearanceeffects [subcommand]."); - c->Message(Chat::White, "[view] Display all appearance effects saved to your target. #appearanceffects view"); - c->Message(Chat::White, "[set] Set an appearance effects saved to your target. #appearanceffects set [app_effectid] [slotid]"); - c->Message(Chat::White, "[remove] Remove all appearance effects saved to your target. #appearanceffects remove"); - } - - if (!strcasecmp(sep->arg[1], "view")) { - Mob* m_target = c->GetTarget(); - if (m_target) { - m_target->GetAppearenceEffects(); - } + const auto arguments = sep->argnum; + if (!arguments) { + c->Message(Chat::White, "Usage: #appearanceeffects help - Display appearance effects help menu"); + c->Message(Chat::White, "Usage: #appearanceeffects remove - Remove all appearance effects saved to your target"); + c->Message(Chat::White, "Usage: #appearanceeffects set [Effect ID] [Slot ID] - Set an appearance effect saved to your target"); + c->Message(Chat::White, "Usage: #appearanceeffects view - Display all appearance effects saved to your target"); return; } + const bool is_help = !strcasecmp(sep->arg[1], "help"); + const bool is_remove = !strcasecmp(sep->arg[1], "remove"); + const bool is_set = !strcasecmp(sep->arg[1], "set"); + const bool is_view = !strcasecmp(sep->arg[1], "view"); - if (!strcasecmp(sep->arg[1], "set")) { - int32 app_effectid = atof(sep->arg[2]); - int32 slot = atoi(sep->arg[3]); - - Mob* m_target = c->GetTarget(); - if (m_target) { - m_target->SendAppearanceEffect(app_effectid, 0, 0, 0, 0, nullptr, slot, 0, 0, 0, 0, 0, 0, 0, 0, 0); - c->Message(Chat::White, "Appearance Effect ID %i for slot %i has been set.", app_effectid, slot); - } + if (is_help) { + c->Message(Chat::White, "Usage: #appearanceeffects help - Display appearance effects help menu"); + c->Message(Chat::White, "Usage: #appearanceeffects remove - Remove all appearance effects saved to your target"); + c->Message(Chat::White, "Usage: #appearanceeffects set [Effect ID] [Slot ID] - Set an appearance effect saved to your target"); + c->Message(Chat::White, "Usage: #appearanceeffects view - Display all appearance effects saved to your target"); + return; } - if (!strcasecmp(sep->arg[1], "remove")) { - Mob* m_target = c->GetTarget(); - if (m_target) { - m_target->SendIllusionPacket(m_target->GetRace(), m_target->GetGender(), m_target->GetTexture(), m_target->GetHelmTexture(), - m_target->GetHairColor(), m_target->GetBeardColor(), m_target->GetEyeColor1(), m_target->GetEyeColor2(), - m_target->GetHairStyle(), m_target->GetLuclinFace(), m_target->GetBeard(), 0xFF, - m_target->GetDrakkinHeritage(), m_target->GetDrakkinTattoo(), m_target->GetDrakkinDetails(), m_target->GetSize(), false); - m_target->ClearAppearenceEffects(); - c->Message(Chat::White, "All Appearance Effects have been removed."); + Mob* t = c; + if (c->GetTarget()) { + t = c->GetTarget(); + } + + if (is_set) { + if (arguments != 3 || !sep->IsNumber(2) || !sep->IsNumber(3)) { + c->Message(Chat::White, "Usage: #appearanceeffects set [Effect ID] [Slot ID] - Set an appearance effect saved to your target"); + return; } - return; + + const auto effect_id = std::stoul(sep->arg[2]); + const auto slot_id = std::stoul(sep->arg[3]); + + t->SendAppearanceEffect( + effect_id, + 0, + 0, + 0, + 0, + nullptr, + slot_id, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ); + c->Message( + Chat::White, + fmt::format( + "Appearance Effect ID {} in slot ID {} has been set for {}.", + effect_id, + slot_id, + c->GetTargetDescription(t, TargetDescriptionType::LCSelf) + ).c_str() + ); + } else if (is_remove) { + t->SendIllusionPacket( + t->GetRace(), + t->GetGender(), + t->GetTexture(), + t->GetHelmTexture(), + t->GetHairColor(), + t->GetBeardColor(), + t->GetEyeColor1(), + t->GetEyeColor2(), + t->GetHairStyle(), + t->GetLuclinFace(), + t->GetBeard(), + 0xFF, + t->GetDrakkinHeritage(), + t->GetDrakkinTattoo(), + t->GetDrakkinDetails(), + t->GetSize(), + false + ); + t->ClearAppearenceEffects(); + c->Message( + Chat::White, + fmt::format( + "Appearance Effects have been removed for {}.", + c->GetTargetDescription(t, TargetDescriptionType::LCSelf) + ).c_str() + ); + } else if (is_view) { + t->ListAppearanceEffects(c); } } diff --git a/zone/mob.cpp b/zone/mob.cpp index 05a84fb99..dd1222a35 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -3063,16 +3063,30 @@ void Mob::SetAppearenceEffects(int32 slot, int32 value) } } -void Mob::GetAppearenceEffects() +void Mob::ListAppearanceEffects(Client* c) { - //used with GM command if (!appearance_effects_id[0]) { - Message(Chat::Red, "No Appearance Effects exist on this mob"); + c->Message( + Chat::White, + fmt::format( + "{} {} no appearance effects.", + c->GetTargetDescription(this, TargetDescriptionType::UCYou), + c == this ? "have" : "has" + ).c_str() + ); return; } for (int i = 0; i < MAX_APPEARANCE_EFFECTS; i++) { - Message(Chat::Red, "ID: %i :: App Effect ID %i :: Slot %i", i, appearance_effects_id[i], appearance_effects_slot[i]); + c->Message( + Chat::Red, + fmt::format( + "Effect {} | ID: {} Slot: {}", + i, + appearance_effects_id[i], + appearance_effects_slot[i] + ).c_str() + ); } } diff --git a/zone/mob.h b/zone/mob.h index 556edbf63..ac22ab096 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -472,7 +472,7 @@ public: inline void SetEndurUpkeep(bool val) { endur_upkeep = val; } bool HasBuffWithSpellGroup(int spell_group); void SetAppearenceEffects(int32 slot, int32 value); - void GetAppearenceEffects(); + void ListAppearanceEffects(Client* c); void ClearAppearenceEffects(); void SendSavedAppearenceEffects(Client *receiver); void SetBuffDuration(int spell_id, int duration = 0);