mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 21:01:29 +00:00
185 lines
4.5 KiB
C++
Executable File
185 lines
4.5 KiB
C++
Executable File
#include "../client.h"
|
|
#include "../npc_scale_manager.h"
|
|
|
|
void command_scale(Client *c, const Seperator *sep)
|
|
{
|
|
auto arguments = sep->argnum;
|
|
if (!arguments) {
|
|
c->Message(Chat::White, "Usage: #scale [Scale Type] - Must target an NPC");
|
|
c->Message(Chat::White, "Usage: #scale [Search Criteria] [Scale Type] - Zone-wide Changes");
|
|
c->Message(Chat::White, "Usage: #scale all [Scale Type] - Scale every NPC in the zone");
|
|
c->Message(Chat::White, "Note: Scale Type can be \"dynamic\" or \"static\".");
|
|
return;
|
|
}
|
|
|
|
if (c->GetTarget() && c->GetTarget()->IsNPC() && arguments < 2) {
|
|
auto n = c->GetTarget()->CastToNPC();
|
|
|
|
bool apply_status = false;
|
|
|
|
bool is_dynamic = !strcasecmp(sep->arg[1], "dynamic");
|
|
bool is_static = !strcasecmp(sep->arg[1], "static");
|
|
|
|
if (is_dynamic || is_static) {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Applying global base scaling to {} {}ally, all stats set to zeroes.",
|
|
c->GetTargetDescription(n),
|
|
sep->arg[1]
|
|
).c_str()
|
|
);
|
|
|
|
if (is_dynamic) {
|
|
apply_status = npc_scale_manager->ApplyGlobalBaseScalingToNPCDynamically(n);
|
|
} else {
|
|
apply_status = npc_scale_manager->ApplyGlobalBaseScalingToNPCStatically(n);
|
|
}
|
|
} else {
|
|
c->Message(Chat::White, "Usage: #scale [Scale Type] - Must target an NPC");
|
|
c->Message(Chat::White, "Usage: #scale [Search Criteria] [Scale Type] - Zone-wide Changes");
|
|
c->Message(Chat::White, "Usage: #scale all [Scale Type] - Scale every NPC in the zone");
|
|
c->Message(Chat::White, "Note: Scale Type can be \"dynamic\" or \"static\".");
|
|
return;
|
|
}
|
|
|
|
if (apply_status) {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Applied global base scaling to {} {}ally successfully.",
|
|
c->GetTargetDescription(n),
|
|
sep->arg[1]
|
|
).c_str()
|
|
);
|
|
} else {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Failed to load scaling data from the database for {}, see 'NPCScaling' log for more info.",
|
|
c->GetTargetDescription(n)
|
|
).c_str()
|
|
);
|
|
}
|
|
} else if (c->GetTarget() && arguments < 2) {
|
|
c->Message(Chat::White, "You must target an NPC to use targeted scaling!");
|
|
}
|
|
|
|
if (arguments > 1) {
|
|
std::string scale_type;
|
|
|
|
bool is_all = !strcasecmp(sep->arg[1], "all");
|
|
bool is_dynamic = !strcasecmp(sep->arg[2], "dynamic");
|
|
bool is_static = !strcasecmp(sep->arg[2], "static");
|
|
|
|
bool is_apply = arguments == 3 && !strcasecmp(sep->arg[3], "apply");
|
|
|
|
if (is_dynamic) {
|
|
scale_type = "dynamic";
|
|
} else if (is_static) {
|
|
scale_type = "static";
|
|
} else {
|
|
c->Message(Chat::White, "Usage: #scale [Scale Type] - Must target an NPC");
|
|
c->Message(Chat::White, "Usage: #scale [Search Criteria] [Scale Type] - Zone-wide Changes");
|
|
c->Message(Chat::White, "Usage: #scale all [Scale Type] - Scale every NPC in the zone");
|
|
c->Message(Chat::White, "Note: Scale Type can be \"dynamic\" or \"static\".");
|
|
return;
|
|
}
|
|
|
|
const std::string search_string = sep->arg[1];
|
|
|
|
const auto& l = entity_list.GetNPCList();
|
|
|
|
auto found_count = 0;
|
|
auto found_number = 1;
|
|
|
|
for (const auto &e : l) {
|
|
auto n = e.second;
|
|
|
|
std::string entity_name = n->GetName();
|
|
|
|
if (
|
|
!search_string.empty() &&
|
|
!Strings::Contains(entity_name, search_string) &&
|
|
!is_all
|
|
) {
|
|
continue;
|
|
}
|
|
|
|
std::string status = "(Searching)";
|
|
|
|
if (is_apply) {
|
|
status = "(Applying)";
|
|
|
|
if (is_dynamic) {
|
|
npc_scale_manager->ApplyGlobalBaseScalingToNPCDynamically(n);
|
|
} else if (is_static) {
|
|
npc_scale_manager->ApplyGlobalBaseScalingToNPCStatically(n);
|
|
}
|
|
}
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Entity {} | Name: {} | NPC ID: {} | Position: {:.2f}, {:.2f}, {:.2f}, {:.2f} {}",
|
|
found_number,
|
|
c->GetTargetDescription(n),
|
|
n->GetNPCTypeID(),
|
|
n->GetX(),
|
|
n->GetY(),
|
|
n->GetZ(),
|
|
n->GetHeading(),
|
|
status
|
|
).c_str()
|
|
);
|
|
|
|
found_count++;
|
|
found_number++;
|
|
}
|
|
|
|
if (is_apply) {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"{} scaling applied against {} NPC{}.",
|
|
Strings::UcFirst(sep->arg[2]),
|
|
found_count,
|
|
found_count != 1 ? "s" : ""
|
|
).c_str()
|
|
);
|
|
} else {
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Found {} NPC{}{}.",
|
|
found_count,
|
|
found_count != 1 ? "s" : "",
|
|
(
|
|
is_all ?
|
|
"" :
|
|
fmt::format(
|
|
" matching '{}'",
|
|
search_string
|
|
)
|
|
)
|
|
).c_str()
|
|
);
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
fmt::format(
|
|
"Would you like to {} these changes?",
|
|
Saylink::Silent(
|
|
fmt::format(
|
|
"#scale {} {} apply",
|
|
sep->arg[1],
|
|
sep->arg[2]
|
|
),
|
|
"apply"
|
|
)
|
|
).c_str()
|
|
);
|
|
}
|
|
}
|
|
}
|