mirror of
https://github.com/EQEmu/Server.git
synced 2026-09-05 23:56:35 +00:00
[Commands] Consolidate #set-like commands into a singular #set command (#3486)
* First push * Final push. * Consolidate zone commands in to one. * Update command.cpp * Remove debug messages. * Test * Add support for sub command status levels. * Update command.cpp * Update client.cpp * Update database_update_manifest.cpp * Update version.h * Update item.cpp * Update version.h * Update database_update_manifest.cpp * Fix command arguments. * Help message. * Update command.cpp * Do DB injection/deletion * Indent * Update server_locked.cpp * Update set.cpp * Lock aliases * Update command_subsettings_repository.h * Update set.cpp * Fix --------- Co-authored-by: Akkadius <akkadius1@gmail.com>
This commit is contained in:
@@ -1,44 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_bind(Client *c, const Seperator *sep)
|
||||
{
|
||||
Client *target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
bool bind_allowed = (
|
||||
!zone->GetInstanceID() ||
|
||||
(
|
||||
zone->GetInstanceID() != 0 &&
|
||||
zone->IsInstancePersistent()
|
||||
)
|
||||
);
|
||||
|
||||
if (!bind_allowed) {
|
||||
c->Message(Chat::White, "You cannot bind here.");
|
||||
return;
|
||||
}
|
||||
|
||||
target->SetBindPoint();
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set Bind Point for {} | Zone: {}",
|
||||
c->GetTargetDescription(target),
|
||||
zone->GetZoneDescription()
|
||||
).c_str()
|
||||
);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set Bind Point for {} | XYZ: {:.2f}, {:.2f}, {:.2f}",
|
||||
c->GetTargetDescription(target),
|
||||
target->GetX(),
|
||||
target->GetY(),
|
||||
target->GetZ()
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_date(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (
|
||||
!arguments ||
|
||||
!sep->IsNumber(1) ||
|
||||
!sep->IsNumber(2) ||
|
||||
!sep->IsNumber(3)
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #date [Year] [Month] [Day] [Hour] [Minute]");
|
||||
return;
|
||||
}
|
||||
|
||||
TimeOfDay_Struct eq_time;
|
||||
zone->zone_time.GetCurrentEQTimeOfDay(time(0), &eq_time);
|
||||
|
||||
auto year = static_cast<uint16>(Strings::ToUnsignedInt(sep->arg[1]));
|
||||
auto month = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[2]));
|
||||
auto day = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[3]));
|
||||
|
||||
auto hour = !sep->IsNumber(4) ? eq_time.hour : static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[4]) + 1);
|
||||
auto minute = !sep->IsNumber(5) ? eq_time.minute : static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[5]));
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format("Setting world time to {}/{}/{} {:02}:{:02} {}.",
|
||||
year,
|
||||
month,
|
||||
day,
|
||||
(
|
||||
(hour % 12) == 0 ?
|
||||
12 :
|
||||
(hour % 12)
|
||||
),
|
||||
minute,
|
||||
(
|
||||
hour >= 13 ?
|
||||
"PM" :
|
||||
"AM"
|
||||
)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
zone->SetDate(year, month, day, hour, minute);
|
||||
|
||||
LogInfo(
|
||||
"{} :: Setting world time to {}/{}/{} {:02}:{:02} {}.",
|
||||
c->GetCleanName(),
|
||||
year,
|
||||
month,
|
||||
day,
|
||||
(
|
||||
(hour % 12) == 0 ?
|
||||
12 :
|
||||
(hour % 12)
|
||||
),
|
||||
minute,
|
||||
(
|
||||
hour >= 13 ?
|
||||
"PM" :
|
||||
"AM"
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_endurance(Client *c, const Seperator *sep)
|
||||
{
|
||||
Mob* target = c;
|
||||
if (c->GetTarget()) {
|
||||
target = c->GetTarget();
|
||||
}
|
||||
|
||||
int endurance = 0;
|
||||
if (target->IsClient()) {
|
||||
endurance = target->CastToClient()->GetMaxEndurance();
|
||||
target->CastToClient()->SetEndurance(endurance);
|
||||
} else {
|
||||
endurance = target->GetMaxEndurance();
|
||||
target->SetEndurance(endurance);
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} to full Endurance ({}).",
|
||||
c->GetTargetDescription(target),
|
||||
endurance
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
Executable → Regular
@@ -78,8 +78,19 @@ void command_find(Client *c, const Seperator *sep)
|
||||
// build the rewrite string
|
||||
std::string rewrite = fmt::format("#find {} {}", cmd.cmd, Strings::Join(args, " "));
|
||||
|
||||
// rewrite to #find <sub-command <args>
|
||||
// rewrite to #find <sub-command <args>>
|
||||
c->SendGMCommand(rewrite);
|
||||
|
||||
c->Message(
|
||||
Chat::Gray,
|
||||
fmt::format(
|
||||
"{} is now located under {}, using {}.",
|
||||
sep->arg[0],
|
||||
Saylink::Silent("#find"),
|
||||
Saylink::Silent(rewrite)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
void FindCurrency(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto can_summon_items = c->Admin() >= GetCommandStatus(c, "summonitem");
|
||||
const auto can_summon_items = c->Admin() >= GetCommandStatus("summonitem");
|
||||
|
||||
if (sep->IsNumber(2)) {
|
||||
const auto item_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
|
||||
@@ -71,7 +71,11 @@ void FindItem(Client *c, const Seperator *sep)
|
||||
auto found_count = 0;
|
||||
|
||||
for (const auto& e : l) {
|
||||
const auto* item = database.GetItem(e);
|
||||
const auto item = database.GetItem(e);
|
||||
if (!item) {
|
||||
continue;
|
||||
}
|
||||
|
||||
std::string summon_links = Saylink::Silent(
|
||||
fmt::format(
|
||||
"#si {}",
|
||||
@@ -97,9 +101,10 @@ void FindItem(Client *c, const Seperator *sep)
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} | {}",
|
||||
"{} | {} ({})",
|
||||
summon_links,
|
||||
database.CreateItemLink(e)
|
||||
database.CreateItemLink(e),
|
||||
Strings::Commify(item->ID)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ void FindNPCType(Client *c, const Seperator *sep)
|
||||
return;
|
||||
}
|
||||
|
||||
const auto can_spawn_npcs = c->Admin() >= GetCommandStatus(c, "#npctypespawn");
|
||||
const auto can_spawn_npcs = c->Admin() >= GetCommandStatus("#npctypespawn");
|
||||
|
||||
auto found_count = 0;
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
void FindRecipe(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto can_view_recipes = c->Admin() >= GetCommandStatus(c, "viewrecipe");
|
||||
const auto can_view_recipes = c->Admin() >= GetCommandStatus("viewrecipe");
|
||||
|
||||
if (sep->IsNumber(2)) {
|
||||
const auto recipe_id = static_cast<uint16>(Strings::ToUnsignedInt(sep->arg[2]));
|
||||
|
||||
@@ -7,7 +7,7 @@ void FindSpell(Client *c, const Seperator *sep)
|
||||
return;
|
||||
}
|
||||
|
||||
const auto can_cast_spells = c->Admin() >= GetCommandStatus(c, "castspell");
|
||||
const auto can_cast_spells = c->Admin() >= GetCommandStatus("castspell");
|
||||
|
||||
if (sep->IsNumber(2)) {
|
||||
const auto spell_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
|
||||
@@ -7,7 +7,7 @@ void FindTask(Client *c, const Seperator *sep)
|
||||
return;
|
||||
}
|
||||
|
||||
const auto can_assign_tasks = c->Admin() >= GetCommandStatus(c, "task");
|
||||
const auto can_assign_tasks = c->Admin() >= GetCommandStatus("task");
|
||||
|
||||
if (sep->IsNumber(2)) {
|
||||
const auto task_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
|
||||
@@ -19,7 +19,7 @@ void FindZone(Client *c, const Seperator *sep)
|
||||
);
|
||||
|
||||
search_string = Expansion::ExpansionName[Strings::ToInt(sep->arg[3])];
|
||||
search_type = "Expansion";
|
||||
search_type = "expansion";
|
||||
} else if (is_id_search) {
|
||||
query += fmt::format(
|
||||
"zoneidnumber = {}",
|
||||
@@ -27,7 +27,7 @@ void FindZone(Client *c, const Seperator *sep)
|
||||
);
|
||||
|
||||
search_string = sep->arg[2];
|
||||
search_type = "Expansion";
|
||||
search_type = "ID";
|
||||
} else if (is_short_name_search) {
|
||||
query += fmt::format(
|
||||
"LOWER(`long_name`) LIKE '%%{}%%' OR LOWER(`short_name`) LIKE '%%{}%%'",
|
||||
@@ -36,7 +36,7 @@ void FindZone(Client *c, const Seperator *sep)
|
||||
);
|
||||
|
||||
search_string = sep->argplus[2];
|
||||
search_type = "Expansion";
|
||||
search_type = "name";
|
||||
}
|
||||
|
||||
query += " ORDER BY `zoneidnumber` ASC LIMIT 50";
|
||||
|
||||
@@ -1,87 +0,0 @@
|
||||
#include "../client.h"
|
||||
#include "../worldserver.h"
|
||||
|
||||
extern WorldServer worldserver;
|
||||
|
||||
void command_flag(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments) {
|
||||
auto target = c->GetTarget() && c->GetTarget()->IsClient() ? c->GetTarget()->CastToClient() : c;
|
||||
if (target != c) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Status level has been refreshed for {}.",
|
||||
target->GetCleanName()
|
||||
).c_str()
|
||||
);
|
||||
|
||||
target->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Your status level has been refreshed by {}.",
|
||||
c->GetCleanName()
|
||||
).c_str()
|
||||
);
|
||||
} else {
|
||||
c->Message(Chat::White, "Your status level has been refreshed.");
|
||||
}
|
||||
target->UpdateAdmin();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (
|
||||
!sep->IsNumber(1) ||
|
||||
strlen(sep->arg[2]) == 0
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #flag [Status] [Account Name]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto status = Strings::ToInt(sep->arg[1]);
|
||||
if (status < -2 || status > 255) {
|
||||
c->Message(Chat::White, "The lowest a status level can go is -2 and the highest a status level can go is 255.");
|
||||
return;
|
||||
}
|
||||
|
||||
std::string account_name = sep->argplus[2];
|
||||
auto account_id = database.GetAccountIDByChar(account_name.c_str());
|
||||
|
||||
if (c->Admin() < commandChangeFlags) { //this check makes banning players by less than this level impossible, but i'll leave it in anyways
|
||||
c->Message(Chat::White, "You may only refresh your own flag, doing so now.");
|
||||
c->UpdateAdmin();
|
||||
} else {
|
||||
if (status > c->Admin()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"You cannot set someone's status level to {} because your status level is only {}.",
|
||||
status,
|
||||
c->Admin()
|
||||
).c_str()
|
||||
);
|
||||
} else if (status < 0 && c->Admin() < commandBanPlayers) {
|
||||
c->Message(Chat::White, "Your status level is not high enough to ban or suspend.");
|
||||
} else if (!database.SetAccountStatus(account_name, status)) {
|
||||
c->Message(Chat::White, "Failed to set status level.");
|
||||
}
|
||||
else {
|
||||
c->Message(Chat::White, "Set GM Flag on account.");
|
||||
|
||||
std::string user;
|
||||
std::string loginserver;
|
||||
ParseAccountString(account_name, user, loginserver);
|
||||
|
||||
account_id = database.GetAccountIDByName(account_name, loginserver);
|
||||
|
||||
ServerPacket pack(ServerOP_FlagUpdate, sizeof(ServerFlagUpdate_Struct));
|
||||
ServerFlagUpdate_Struct *sfus = (ServerFlagUpdate_Struct *) pack.pBuffer;
|
||||
sfus->account_id = account_id;
|
||||
sfus->admin = status;
|
||||
worldserver.SendPacket(&pack);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
#include "../client.h"
|
||||
#include "../../common/data_verification.h"
|
||||
|
||||
void command_flymode(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Mob *target = c;
|
||||
if (c->GetTarget()) {
|
||||
target = c->GetTarget();
|
||||
}
|
||||
|
||||
auto flymode_id = Strings::ToUnsignedInt(sep->arg[1]);
|
||||
if (!EQ::ValueWithin(flymode_id, EQ::constants::GravityBehavior::Ground, EQ::constants::GravityBehavior::LevitateWhileRunning)) {
|
||||
c->Message(Chat::White, "Usage:: #flymode [Flymode ID]");
|
||||
c->Message(Chat::White, "0 = Ground, 1 = Flying, 2 = Levitating, 3 = Water, 4 = Floating, 5 = Levitating While Running");
|
||||
return;
|
||||
}
|
||||
|
||||
target->SetFlyMode(static_cast<GravityBehavior>(flymode_id));
|
||||
target->SendAppearancePacket(AT_Levitate, flymode_id);
|
||||
uint32 account = c->AccountID();
|
||||
database.SetGMFlymode(account, flymode_id);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Fly Mode for {} is now {} ({}).",
|
||||
c->GetTargetDescription(target),
|
||||
EQ::constants::GetFlyModeName(flymode_id),
|
||||
flymode_id
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_freeze(Client *c, const Seperator *sep)
|
||||
{
|
||||
if (!c->GetTarget()) {
|
||||
c->Message(Chat::White, "You must have a target to use this command.");
|
||||
return;
|
||||
}
|
||||
|
||||
auto target = c->GetTarget();
|
||||
if (c == target) {
|
||||
c->Message(Chat::White, "You cannot freeze yourself.");
|
||||
return;
|
||||
}
|
||||
|
||||
target->SendAppearancePacket(AT_Anim, ANIM_FREEZE);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"You have frozen {}.",
|
||||
c->GetTargetDescription(target)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_gassign(Client *c, const Seperator *sep)
|
||||
{
|
||||
if (!c->GetTarget() || !c->GetTarget()->IsNPC()) {
|
||||
c->Message(Chat::White, "You must target an NPC to use this command.");
|
||||
return;
|
||||
}
|
||||
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #gassign [Grid ID]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto grid_id = Strings::ToUnsignedInt(sep->arg[1]);
|
||||
|
||||
auto target = c->GetTarget()->CastToNPC();
|
||||
if (target->GetSpawnPointID() > 0) {
|
||||
database.AssignGrid(c, grid_id, target->GetID());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_gender(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #gender [Gender ID]");
|
||||
c->Message(Chat::White, "Genders: 0 = Male, 1 = Female, 2 = Neuter");
|
||||
return;
|
||||
}
|
||||
|
||||
Mob *target = c;
|
||||
if (c->GetTarget() && c->Admin() >= commandGenderOthers) {
|
||||
target = c->GetTarget();
|
||||
}
|
||||
|
||||
auto gender_id = Strings::ToInt(sep->arg[1]);
|
||||
if (gender_id < 0 || gender_id > 2) {
|
||||
c->Message(Chat::White, "Usage: #gender [Gender ID]");
|
||||
c->Message(Chat::White, "Genders: 0 = Male, 1 = Female, 2 = Neuter");
|
||||
return;
|
||||
}
|
||||
|
||||
target->SendIllusionPacket(
|
||||
target->GetRace(),
|
||||
gender_id
|
||||
);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Gender changed for {} to {} ({}).",
|
||||
c->GetTargetDescription(target),
|
||||
GetGenderName(gender_id),
|
||||
gender_id
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_gm(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments) {
|
||||
c->Message(Chat::White, "Usage: #gm [On|Off]");
|
||||
return;
|
||||
}
|
||||
|
||||
bool gm_flag = atobool(sep->arg[1]);
|
||||
Client *target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
target->SetGM(gm_flag);
|
||||
if (c != target) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} is {} flagged as a GM.",
|
||||
c->GetTargetDescription(target),
|
||||
gm_flag ? "now" : "no longer"
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_gmspeed(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments) {
|
||||
c->Message(Chat::White, "Usage: #gmspeed [On|Off]");
|
||||
return;
|
||||
}
|
||||
|
||||
bool gm_speed_flag = atobool(sep->arg[1]);
|
||||
Client *target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
database.SetGMSpeed(
|
||||
target->AccountID(),
|
||||
gm_speed_flag ? 1 : 0
|
||||
);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Turning GM Speed {} for {}.",
|
||||
gm_speed_flag ? "on" : "off",
|
||||
c->GetTargetDescription(target)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Note: {} must zone for it to take effect.",
|
||||
c->GetTargetDescription(target, TargetDescriptionType::UCYou)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
#include "../client.h"
|
||||
#include "../../common/repositories/account_repository.h"
|
||||
|
||||
void command_godmode(Client *c, const Seperator *sep)
|
||||
{
|
||||
bool state = atobool(sep->arg[1]);
|
||||
uint32 account_id = c->AccountID();
|
||||
|
||||
if (sep->arg[1][0] != 0) {
|
||||
auto a = AccountRepository::FindOne(database, c->AccountID());
|
||||
if (a.id > 0) {
|
||||
a.flymode = state ? 1 : 0;
|
||||
a.gmspeed = state ? 1 : 0;
|
||||
a.invulnerable = state ? 1 : 0;
|
||||
a.hideme = state ? 1 : 0;
|
||||
}
|
||||
|
||||
c->SetInvul(state);
|
||||
c->SendAppearancePacket(AT_Levitate, state);
|
||||
c->SetHideMe(state);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Turning GodMode %s for %s (zone for gmspeed to take effect)",
|
||||
state ? "On" : "Off",
|
||||
c->GetName()
|
||||
);
|
||||
|
||||
AccountRepository::UpdateOne(database, a);
|
||||
}
|
||||
else {
|
||||
c->Message(Chat::White, "Usage: #godmode [on/off]");
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_heal(Client *c, const Seperator *sep)
|
||||
{
|
||||
Mob* target = c;
|
||||
if (c->GetTarget()) {
|
||||
target = c->GetTarget();
|
||||
}
|
||||
|
||||
target->Heal();
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} to full Health ({}).",
|
||||
c->GetTargetDescription(target),
|
||||
target->GetMaxHP()
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_heromodel(Client *c, const Seperator *sep)
|
||||
{
|
||||
auto arguments = sep->argnum;
|
||||
if (!arguments) {
|
||||
c->Message(Chat::White, "Usage: #heromodel [Hero Model]");
|
||||
c->Message(Chat::White, "Usage: #heromodel [Hero Model] [Slot]");
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Example: {}",
|
||||
Saylink::Silent("#heromodel 63")
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
auto hero_forge_model = Strings::IsNumber(sep->arg[1]) ? Strings::ToUnsignedInt(sep->arg[1]) : 0;
|
||||
|
||||
if (arguments > 1) {
|
||||
auto slot = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[2]));
|
||||
c->GetTarget()->SendTextureWC(slot, 0, hero_forge_model, 0, 0, 0);
|
||||
} else {
|
||||
if (hero_forge_model) {
|
||||
// Conversion to simplify the command arguments
|
||||
// Hero's Forge model is actually model * 1000 + texture * 100 + wearslot
|
||||
// Hero's Forge Model slot 7 is actually for Robes, but it still needs to use wearslot 1 in the packet
|
||||
hero_forge_model *= 100;
|
||||
|
||||
for (uint8 slot = 0; slot < 7; slot++) {
|
||||
c->GetTarget()->SendTextureWC(slot, 0, (hero_forge_model + slot), 0, 0, 0);
|
||||
}
|
||||
} else {
|
||||
c->Message(Chat::White, "Hero's Forge Model must be greater than 0.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_incstat(Client *c, const Seperator *sep)
|
||||
{
|
||||
if (sep->arg[1][0] && sep->arg[2][0] && c->GetTarget() != 0 && c->GetTarget()->IsClient()) {
|
||||
c->GetTarget()->CastToClient()->IncStats(Strings::ToInt(sep->arg[1]), Strings::ToInt(sep->arg[2]));
|
||||
}
|
||||
else {
|
||||
c->Message(Chat::White, "This command is used to permanently increase or decrease a players stats.");
|
||||
c->Message(Chat::White, "Usage: #setstat {type} {value by which to increase or decrease}");
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Note: The value is in increments of 2, so a value of 3 will actually increase the stat by 6"
|
||||
);
|
||||
c->Message(Chat::White, "Types: Str: 0, Sta: 1, Agi: 2, Dex: 3, Int: 4, Wis: 5, Cha: 6");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_invul(Client *c, const Seperator *sep) {
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments) {
|
||||
c->Message(Chat::White, "Usage: #invul [On|Off]");
|
||||
return;
|
||||
}
|
||||
|
||||
bool invul_flag = atobool(sep->arg[1]);
|
||||
Client *target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
target->SetInvul(invul_flag);
|
||||
uint32 account = target->AccountID();
|
||||
database.SetGMInvul(account, invul_flag);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} {} now {}.",
|
||||
c->GetTargetDescription(target, TargetDescriptionType::UCYou),
|
||||
c == target ? "are" : "is",
|
||||
invul_flag ? "invulnerable" : "vulnerable"
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_lastname(Client *c, const Seperator *sep)
|
||||
{
|
||||
Client *target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
LogInfo("#lastname request from [{}] for [{}]", c->GetCleanName(), target->GetCleanName());
|
||||
|
||||
bool is_remove = !strcasecmp(sep->argplus[1], "-1");
|
||||
std::string last_name = is_remove ? "" : sep->argplus[1];
|
||||
|
||||
if (last_name.size() > 64) {
|
||||
c->Message(Chat::White, "Last name must be 64 characters or less.");
|
||||
return;
|
||||
}
|
||||
|
||||
target->ChangeLastName(last_name);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Last name has been {}{} for {}{}",
|
||||
is_remove ? "removed" : "changed",
|
||||
!is_remove ? " and saved" : "",
|
||||
c->GetTargetDescription(target),
|
||||
(
|
||||
is_remove ?
|
||||
"." :
|
||||
fmt::format(
|
||||
" to '{}'.",
|
||||
last_name
|
||||
)
|
||||
)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_level(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #level [Level]");
|
||||
return;
|
||||
}
|
||||
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
auto level = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[1]));
|
||||
auto max_level = static_cast<uint8>(RuleI(Character, MaxLevel));
|
||||
|
||||
if (c != t && c->Admin() < RuleI(GM, MinStatusToLevelTarget)) {
|
||||
c->Message(Chat::White, "Your status is not high enough to change another person's level.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
level > max_level &&
|
||||
c->Admin() < commandLevelAboveCap
|
||||
) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Level {} is above the Maximum Level of {} and your status is not high enough to go beyond the cap.",
|
||||
level,
|
||||
max_level
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
t->SetLevel(level, true);
|
||||
if (t->IsClient()) {
|
||||
t->CastToClient()->SendLevelAppearance();
|
||||
|
||||
if (RuleB(Bots, Enabled) && RuleB(Bots, BotLevelsWithOwner)) {
|
||||
Bot::LevelBotWithClient(t->CastToClient(), level, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_mana(Client *c, const Seperator *sep)
|
||||
{
|
||||
auto target = c->GetTarget() ? c->GetTarget() : c;
|
||||
int mana = 0;
|
||||
if (target->IsClient()) {
|
||||
mana = target->CastToClient()->CalcMaxMana();
|
||||
target->CastToClient()->SetMana(mana);
|
||||
}
|
||||
else {
|
||||
mana = target->CalcMaxMana();
|
||||
target->SetMana(mana);
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} to full Mana ({}).",
|
||||
c->GetTargetDescription(target),
|
||||
mana
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_name(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments) {
|
||||
c->Message(Chat::White, "Usage: #name [New Name] - Rename your player target");
|
||||
return;
|
||||
}
|
||||
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
auto target = c->GetTarget()->CastToClient();
|
||||
|
||||
std::string new_name = sep->arg[1];
|
||||
std::string old_name = target->GetCleanName();
|
||||
|
||||
if (target->ChangeFirstName(new_name.c_str(), c->GetCleanName())) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Successfully renamed {} to {}",
|
||||
old_name,
|
||||
new_name
|
||||
).c_str()
|
||||
);
|
||||
|
||||
c->Message(Chat::White, "Sending player to char select.");
|
||||
|
||||
target->Kick("Name was changed");
|
||||
} else {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Unable to rename {}. Check that the new name '{}' isn't already taken.",
|
||||
old_name,
|
||||
new_name
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_permaclass(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #permaclass [Class ID]");
|
||||
return;
|
||||
}
|
||||
|
||||
Client *target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
auto class_id = Strings::ToInt(sep->arg[1]);
|
||||
|
||||
LogInfo("Class changed by {} for {} to {} ({})",
|
||||
c->GetCleanName(),
|
||||
c->GetTargetDescription(target),
|
||||
GetClassIDName(class_id),
|
||||
class_id
|
||||
);
|
||||
|
||||
target->SetBaseClass(class_id);
|
||||
target->Save();
|
||||
target->Kick("Class was changed.");
|
||||
|
||||
if (c != target) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Class changed for {} to {} ({}).",
|
||||
c->GetTargetDescription(target),
|
||||
GetClassIDName(class_id),
|
||||
class_id
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_permagender(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #permagender [Gender ID]");
|
||||
c->Message(Chat::White, "Genders: 0 = Male, 1 = Female, 2 = Neuter");
|
||||
return;
|
||||
}
|
||||
|
||||
Client *target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
auto gender_id = Strings::ToInt(sep->arg[1]);
|
||||
if (gender_id < 0 || gender_id > 2) {
|
||||
c->Message(Chat::White, "Usage: #permagender [Gender ID]");
|
||||
c->Message(Chat::White, "Genders: 0 = Male, 1 = Female, 2 = Neuter");
|
||||
return;
|
||||
}
|
||||
|
||||
LogInfo("Gender changed by {} for {} to {} ({})",
|
||||
c->GetCleanName(),
|
||||
c->GetTargetDescription(target),
|
||||
GetGenderName(gender_id),
|
||||
gender_id
|
||||
);
|
||||
|
||||
target->SetBaseGender(gender_id);
|
||||
target->Save();
|
||||
target->SendIllusionPacket(target->GetRace(), gender_id);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Gender changed for {} to {} ({}).",
|
||||
c->GetTargetDescription(target),
|
||||
GetGenderName(gender_id),
|
||||
gender_id
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_permarace(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #permarace [Race ID]");
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"NOTE: Not all models are global. If a model is not global, it will appear as a human on character select and in zones without the model."
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
Client *target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
auto race_id = Strings::ToInt(sep->arg[1]);
|
||||
auto gender_id = Mob::GetDefaultGender(race_id, target->GetBaseGender());
|
||||
|
||||
LogInfo("Race changed by {} for {} to {} ({})",
|
||||
c->GetCleanName(),
|
||||
c->GetTargetDescription(target),
|
||||
GetRaceIDName(race_id),
|
||||
race_id
|
||||
);
|
||||
|
||||
target->SetBaseRace(race_id);
|
||||
target->SetBaseGender(gender_id);
|
||||
target->Save();
|
||||
target->SendIllusionPacket(race_id, gender_id);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Race changed for {} to {} ({}).",
|
||||
c->GetTargetDescription(target),
|
||||
GetRaceIDName(race_id),
|
||||
race_id
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_pvp(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments) {
|
||||
c->Message(Chat::White, "Usage: #pvp [On|Off]");
|
||||
return;
|
||||
}
|
||||
|
||||
bool pvp_state = atobool(sep->arg[1]);
|
||||
Client* target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
target->SetPVP(pvp_state);
|
||||
if (c != target) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} now follow{} the ways of {}.",
|
||||
c->GetTargetDescription(target, TargetDescriptionType::UCYou),
|
||||
c != target ? "s" : "",
|
||||
pvp_state ? "Discord" : "Order"
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_qglobal(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments) {
|
||||
c->Message(Chat::White, "Usage: #qglobal on - Enables target NPC's ability to view quest globals");
|
||||
c->Message(Chat::White, "Usage: #qglobal off - Disables target NPC's ability to view quest globals");
|
||||
c->Message(Chat::White, "Usage: #qglobal view - View target NPC's ability to view quest globals");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!c->GetTarget() || !c->GetTarget()->IsNPC()) {
|
||||
c->Message(Chat::White, "You must target an NPC to use this command.");
|
||||
return;
|
||||
}
|
||||
|
||||
auto target = c->GetTarget()->CastToNPC();
|
||||
|
||||
bool is_off = !strcasecmp(sep->arg[1], "off");
|
||||
bool is_on = !strcasecmp(sep->arg[1], "on");
|
||||
bool is_view = !strcasecmp(sep->arg[1], "view");
|
||||
if (
|
||||
!is_off &&
|
||||
!is_on &&
|
||||
!is_view
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #qglobal on - Enables target NPC's ability to view quest globals");
|
||||
c->Message(Chat::White, "Usage: #qglobal off - Disables target NPC's ability to view quest globals");
|
||||
c->Message(Chat::White, "Usage: #qglobal view - View target NPC's ability to view quest globals");
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_off) {
|
||||
auto query = fmt::format(
|
||||
"UPDATE npc_types SET qglobal = 0 WHERE id = {}",
|
||||
target->GetNPCTypeID()
|
||||
);
|
||||
auto results = content_db.QueryDatabase(query);
|
||||
|
||||
if (!results.Success()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Failed to disable quest global flag for {}.",
|
||||
c->GetTargetDescription(target)
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
auto repop_link = Saylink::Silent("#repop", "repop");
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} will no longer be able to view quest globals, {} them to apply this change.",
|
||||
c->GetTargetDescription(target),
|
||||
repop_link
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
} else if (is_on) {
|
||||
auto query = fmt::format(
|
||||
"UPDATE npc_types SET qglobal = 1 WHERE id = {}",
|
||||
target->GetNPCTypeID()
|
||||
);
|
||||
auto results = content_db.QueryDatabase(query);
|
||||
|
||||
if (!results.Success()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Failed to enable quest global flag for {}.",
|
||||
c->GetTargetDescription(target)
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
auto repop_link = Saylink::Silent("#repop", "repop");
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} will now be able to view quest globals, {} them to apply this change.",
|
||||
c->GetTargetDescription(target),
|
||||
repop_link
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
} else if (!strcasecmp(sep->arg[1], "view")) {
|
||||
const NPCType *npc_type = content_db.LoadNPCTypesData(target->GetNPCTypeID());
|
||||
if (!npc_type) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"NPC ID {} was not found.",
|
||||
target->GetNPCTypeID()
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} {} view quest globals.",
|
||||
c->GetTargetDescription(target),
|
||||
npc_type->qglobal ? "can" : "cannot"
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_race(Client *c, const Seperator *sep)
|
||||
{
|
||||
Mob *target = c->CastToMob();
|
||||
|
||||
if (sep->IsNumber(1)) {
|
||||
auto race = Strings::ToInt(sep->arg[1]);
|
||||
if ((race >= 0 && race <= RuleI(NPC, MaxRaceID)) || (race >= 2253 && race <= 2259)) {
|
||||
if ((c->GetTarget()) && c->Admin() >= commandRaceOthers) {
|
||||
target = c->GetTarget();
|
||||
}
|
||||
target->SendIllusionPacket(race);
|
||||
}
|
||||
else {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Usage: #race [0-{}, 2253-2259] (0 for back to normal)",
|
||||
RuleI(NPC, MaxRaceID)).c_str());
|
||||
}
|
||||
}
|
||||
else {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format("Usage: #race [0-{}, 2253-2259] (0 for back to normal)", RuleI(NPC, MaxRaceID)).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
#include "../client.h"
|
||||
#include "../worldserver.h"
|
||||
|
||||
extern WorldServer worldserver;
|
||||
|
||||
void command_serverlock(Client *c, const Seperator *sep)
|
||||
{
|
||||
if (!sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #serverlock [0|1] - Lock or Unlock the World Server (0 = Unlocked, 1 = Locked)");
|
||||
return;
|
||||
}
|
||||
|
||||
auto is_locked = Strings::ToInt(sep->arg[1]) ? true : false;
|
||||
|
||||
auto pack = new ServerPacket(ServerOP_Lock, sizeof(ServerLock_Struct));
|
||||
auto l = (ServerLock_Struct *) pack->pBuffer;
|
||||
strn0cpy(l->character_name, c->GetCleanName(), sizeof(l->character_name));
|
||||
l->is_locked = is_locked;
|
||||
worldserver.SendPacket(pack);
|
||||
safe_delete(pack);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,174 @@
|
||||
#include "../client.h"
|
||||
#include "set/aa_exp.cpp"
|
||||
#include "set/aa_points.cpp"
|
||||
#include "set/adventure_points.cpp"
|
||||
#include "set/alternate_currency.cpp"
|
||||
#include "set/animation.cpp"
|
||||
#include "set/anon.cpp"
|
||||
#include "set/bind_point.cpp"
|
||||
#include "set/checksum.cpp"
|
||||
#include "set/class_permanent.cpp"
|
||||
#include "set/crystals.cpp"
|
||||
#include "set/date.cpp"
|
||||
#include "set/endurance.cpp"
|
||||
#include "set/endurance_full.cpp"
|
||||
#include "set/exp.cpp"
|
||||
#include "set/flymode.cpp"
|
||||
#include "set/frozen.cpp"
|
||||
#include "set/gender.cpp"
|
||||
#include "set/gender_permanent.cpp"
|
||||
#include "set/gm.cpp"
|
||||
#include "set/gm_speed.cpp"
|
||||
#include "set/gm_status.cpp"
|
||||
#include "set/god_mode.cpp"
|
||||
#include "set/haste.cpp"
|
||||
#include "set/hero_model.cpp"
|
||||
#include "set/hide_me.cpp"
|
||||
#include "set/hp.cpp"
|
||||
#include "set/hp_full.cpp"
|
||||
#include "set/invulnerable.cpp"
|
||||
#include "set/language.cpp"
|
||||
#include "set/last_name.cpp"
|
||||
#include "set/level.cpp"
|
||||
#include "set/loginserver_info.cpp"
|
||||
#include "set/mana.cpp"
|
||||
#include "set/mana_full.cpp"
|
||||
#include "set/name.cpp"
|
||||
#include "set/ooc_mute.cpp"
|
||||
#include "set/password.cpp"
|
||||
#include "set/pvp.cpp"
|
||||
#include "set/pvp_points.cpp"
|
||||
#include "set/race.cpp"
|
||||
#include "set/race_permanent.cpp"
|
||||
#include "set/server_locked.cpp"
|
||||
#include "set/skill.cpp"
|
||||
#include "set/skill_all.cpp"
|
||||
#include "set/skill_all_max.cpp"
|
||||
#include "set/start_zone.cpp"
|
||||
#include "set/temporary_name.cpp"
|
||||
#include "set/texture.cpp"
|
||||
#include "set/time.cpp"
|
||||
#include "set/time_zone.cpp"
|
||||
#include "set/title.cpp"
|
||||
#include "set/title_suffix.cpp"
|
||||
#include "set/weather.cpp"
|
||||
#include "set/zone.cpp"
|
||||
|
||||
void command_set(Client *c, const Seperator *sep)
|
||||
{
|
||||
struct Cmd {
|
||||
std::string cmd{}; // command
|
||||
std::string u{}; // usage
|
||||
void (*fn)(Client *c, const Seperator *sep) = nullptr; // function
|
||||
std::vector<std::string> a{}; // aliases
|
||||
};
|
||||
|
||||
std::vector<Cmd> commands = {
|
||||
Cmd{.cmd = "aa_exp", .u = "aa_exp [aa|group|raid] [Amount]", .fn = SetAAEXP, .a = {"#setaaxp"}},
|
||||
Cmd{.cmd = "aa_points", .u = "aa_points [aa|group|raid] [Amount]", .fn = SetAAPoints, .a = {"#setaapts"}},
|
||||
Cmd{.cmd = "adventure_points", .u = "adventure_points [Theme ID] [Amount]", .fn = SetAdventurePoints, .a = {"#set_adventure_points"}},
|
||||
Cmd{.cmd = "alternate_currency", .u = "alternate_currency [Currency ID] [Amount]", .fn = SetAlternateCurrency, .a = {"#setaltcurrency"}},
|
||||
Cmd{.cmd = "animation", .u = "animation [Animation ID]", .fn = SetAnimation, .a = {"#setanim"}},
|
||||
Cmd{.cmd = "anon", .u = "anon [Character ID] [Anonymous Flag] or #set anon [Anonymous Flag]", .fn = SetAnon, .a = {"#setanon"}},
|
||||
Cmd{.cmd = "bind_point", .u = "bind_point", .fn = SetBindPoint, .a = {"#setbind"}},
|
||||
Cmd{.cmd = "checksum", .u = "checksum", .fn = SetChecksum, .a = {"#updatechecksum"}},
|
||||
Cmd{.cmd = "class_permanent", .u = "class_permanent [Class ID]", .fn = SetClassPermanent, .a = {"#permaclass"}},
|
||||
Cmd{.cmd = "crystals", .u = "crystals [ebon|radiant] [Amount]", .fn = SetCrystals, .a = {"#setcrystals"}},
|
||||
Cmd{.cmd = "date", .u = "date [Year] [Month] [Day] [Hour] [Minute] (Hour and Minute are optional)", .fn = SetDate, .a = {"#date"}},
|
||||
Cmd{.cmd = "endurance", .u = "endurance [Amount]", .fn = SetEndurance, .a = {"#setendurance"}},
|
||||
Cmd{.cmd = "endurance_full", .u = "endurance_full", .fn = SetEnduranceFull, .a = {"#endurance"}},
|
||||
Cmd{.cmd = "exp", .u = "exp [aa|exp] [Amount]", .fn = SetEXP, .a = {"#setxp"}},
|
||||
Cmd{.cmd = "flymode", .u = "flymode [Flymode ID]", .fn = SetFlymode, .a = {"#flymode"}},
|
||||
Cmd{.cmd = "frozen", .u = "frozen [on|off]", .fn = SetFrozen, .a = {"#freeze", "#unfreeze"}},
|
||||
Cmd{.cmd = "gender", .u = "gender [Gender ID]", .fn = SetGender, .a = {"#gender"}},
|
||||
Cmd{.cmd = "gender_permanent", .u = "gender_permanent [Gender ID]", .fn = SetGenderPermanent, .a = {"#permagender"}},
|
||||
Cmd{.cmd = "gm", .u = "gm [on|off]", .fn = SetGM, .a = {"#flymode"}},
|
||||
Cmd{.cmd = "gm_speed", .u = "gm_speed [on|off]", .fn = SetGMSpeed, .a = {"#gmspeed"}},
|
||||
Cmd{.cmd = "gm_status", .u = "gm_status [GM Status] [Account]", .fn = SetGMStatus, .a = {"#flag"}},
|
||||
Cmd{.cmd = "god_mode", .u = "god_mode [on|off]", .fn = SetGodMode, .a = {"#godmode"}},
|
||||
Cmd{.cmd = "haste", .u = "haste [Percentage]", .fn = SetHaste, .a = {"#haste"}},
|
||||
Cmd{.cmd = "hide_me", .u = "hide_me [on|off]", .fn = SetHideMe, .a = {"#hideme"}},
|
||||
Cmd{.cmd = "hero_model", .u = "hero_model [Hero Model] [Slot] (Slot is optional)", .fn = SetHeroModel, .a = {"#heromodel"}},
|
||||
Cmd{.cmd = "hp", .u = "hp [Amount]", .fn = SetHP, .a = {"#sethp"}},
|
||||
Cmd{.cmd = "hp_full", .u = "hp_full", .fn = SetHPFull, .a = {"#heal"}},
|
||||
Cmd{.cmd = "invulnerable", .u = "invulnerable", .fn = SetInvulnerable, .a = {"#invul"}},
|
||||
Cmd{.cmd = "language", .u = "language [Language ID] [Language Level]", .fn = SetLanguage, .a = {"#setlanguage"}},
|
||||
Cmd{.cmd = "last_name", .u = "last_name [Last Name]", .fn = SetLastName, .a = {"#lastname"}},
|
||||
Cmd{.cmd = "level", .u = "level [Level]", .fn = SetLevel, .a = {"#level"}},
|
||||
Cmd{.cmd = "loginserver_info", .u = "loginserver_info [Email] [Password]", .fn = SetLoginserverInfo, .a = {"#setlsinfo"}},
|
||||
Cmd{.cmd = "mana", .u = "mana [Amount]", .fn = SetMana, .a = {"#setmana"}},
|
||||
Cmd{.cmd = "mana_full", .u = "mana_full", .fn = SetManaFull, .a = {"#mana"}},
|
||||
Cmd{.cmd = "name", .u = "name", .fn = SetName, .a = {"#name"}},
|
||||
Cmd{.cmd = "ooc_mute", .u = "ooc_mute", .fn = SetOOCMute, .a = {"#oocmute"}},
|
||||
Cmd{.cmd = "password", .u = "password [Account Name] [Password] (account table password)", .fn = SetPassword, .a = {"#setpass"}},
|
||||
Cmd{.cmd = "pvp", .u = "pvp [on|off]", .fn = SetPVP, .a = {"#pvp"}},
|
||||
Cmd{.cmd = "pvp_points", .u = "pvp_points [Amount]", .fn = SetPVPPoints, .a = {"#setpvppoints"}},
|
||||
Cmd{.cmd = "race", .u = "race [Race ID]", .fn = SetRace, .a = {"#race"}},
|
||||
Cmd{.cmd = "race_permanent", .u = "race_permanent [Race ID]", .fn = SetRacePermanent, .a = {"#permarace"}},
|
||||
Cmd{.cmd = "server_locked", .u = "server_locked [on|off]", .fn = SetServerLocked, .a = {"#lock", "#serverlock", "#serverunlock", "#unlock"}},
|
||||
Cmd{.cmd = "skill", .u = "skill [Skill ID] [Skill Level]", .fn = SetSkill, .a = {"#setskill"}},
|
||||
Cmd{.cmd = "skill_all", .u = "skill_all [Skill Level]", .fn = SetSkillAll, .a = {"#setskillall"}},
|
||||
Cmd{.cmd = "skill_all_max", .u = "skill_all_max", .fn = SetSkillAllMax, .a = {"#maxskills"}},
|
||||
Cmd{.cmd = "start_zone", .u = "endurance [Amount]", .fn = SetStartZone, .a = {"#setstartzone"}},
|
||||
Cmd{.cmd = "temporary_name", .u = "temporary_name [Name]", .fn = SetTemporaryName, .a = {"#tempname"}},
|
||||
Cmd{.cmd = "texture", .u = "texture [Texture ID]", .fn = SetTexture, .a = {"#texture"}},
|
||||
Cmd{.cmd = "time", .u = "time [Hour] [Minute]", .fn = SetTime, .a = {"#time"}},
|
||||
Cmd{.cmd = "time_zone", .u = "time_zone [Hour] [Minute]", .fn = SetTimeZone, .a = {"#timezone"}},
|
||||
Cmd{.cmd = "title", .u = "title [Title]", .fn = SetTitle, .a = {"#title"}},
|
||||
Cmd{.cmd = "title_suffix", .u = "title_suffix [Title Suffix]", .fn = SetTitleSuffix, .a = {"#titlesuffix"}},
|
||||
Cmd{.cmd = "temporary_name", .u = "temporary_name [Name]", .fn = SetTemporaryName, .a = {"#tempname"}},
|
||||
Cmd{.cmd = "weather", .u = "weather [0|1|2|3]", .fn = SetWeather, .a = {"#weather"}},
|
||||
Cmd{.cmd = "zone", .u = "zone [option]", .fn = SetZoneData, .a = {"#zclip", "#zcolor", "#zheader", "#zonelock", "#zsafecoords", "#zsky", "#zunderworld"}},
|
||||
};
|
||||
|
||||
// Check for arguments
|
||||
const auto arguments = sep->argnum;
|
||||
|
||||
// look for alias or command
|
||||
for (const auto &cmd: commands) {
|
||||
// Check for alias first
|
||||
for (const auto &alias: cmd.a) {
|
||||
if (!alias.empty() && Strings::EqualFold(alias, sep->arg[0])) {
|
||||
// build string from sep args
|
||||
std::vector<std::string> args = {};
|
||||
|
||||
// skip the first arg
|
||||
for (auto i = 1; i <= arguments; i++) {
|
||||
args.emplace_back(sep->arg[i]);
|
||||
}
|
||||
|
||||
// build the rewrite string
|
||||
const std::string& rewrite = fmt::format("#set {} {}", cmd.cmd, Strings::Join(args, " "));
|
||||
|
||||
// rewrite to #set <sub-command <args>>
|
||||
c->SetEntityVariable("old_command", Strings::Replace(alias, "#", ""));
|
||||
c->SendGMCommand(rewrite);
|
||||
c->DeleteEntityVariable("old_command");
|
||||
|
||||
c->Message(
|
||||
Chat::Gray,
|
||||
fmt::format(
|
||||
"{} is now located under {}, using {}.",
|
||||
sep->arg[0],
|
||||
Saylink::Silent("#set"),
|
||||
Saylink::Silent(rewrite)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Check for command
|
||||
if (cmd.cmd == Strings::ToLower(sep->arg[1])) {
|
||||
cmd.fn(c, sep);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Command not found
|
||||
c->Message(Chat::White, "Command not found. Usage: #set [command]");
|
||||
for (const auto &cmd: commands) {
|
||||
c->Message(Chat::White, fmt::format("Usage: #set {}", cmd.u).c_str());
|
||||
}
|
||||
}
|
||||
Executable
+69
@@ -0,0 +1,69 @@
|
||||
#include "../../client.h"
|
||||
#include "../../groups.h"
|
||||
#include "../../raids.h"
|
||||
#include "../../raids.h"
|
||||
|
||||
void SetAAEXP(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 3 || !sep->IsNumber(3)) {
|
||||
c->Message(Chat::White, "Usage: #set aa_exp [aa|group|raid] [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const std::string& aa_type = Strings::ToLower(sep->arg[2]);
|
||||
const uint32 aa_experience = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
|
||||
std::string group_raid_string;
|
||||
|
||||
const bool is_aa = Strings::EqualFold(aa_type, "aa");
|
||||
const bool is_group = Strings::EqualFold(aa_type, "group");
|
||||
const bool is_raid = Strings::EqualFold(aa_type, "raid");
|
||||
|
||||
if (
|
||||
!is_aa &&
|
||||
!is_group &&
|
||||
!is_raid
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #set aa_exp [aa|group|raid] [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_aa) {
|
||||
t->SetEXP(
|
||||
t->GetEXP(),
|
||||
aa_experience,
|
||||
false
|
||||
);
|
||||
} else if (is_group) {
|
||||
group_raid_string = "Group ";
|
||||
|
||||
t->SetLeadershipEXP(
|
||||
aa_experience,
|
||||
t->GetRaidEXP()
|
||||
);
|
||||
} else if (is_raid) {
|
||||
group_raid_string = "Raid ";
|
||||
|
||||
t->SetLeadershipEXP(
|
||||
t->GetGroupEXP(),
|
||||
aa_experience
|
||||
);
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} now {} {} {}AA Experience.",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCYou),
|
||||
c == t ? "have" : "has",
|
||||
Strings::Commify(aa_experience),
|
||||
group_raid_string
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+66
@@ -0,0 +1,66 @@
|
||||
#include "../../client.h"
|
||||
#include "../../groups.h"
|
||||
#include "../../raids.h"
|
||||
#include "../../raids.h"
|
||||
|
||||
void SetAAPoints(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 3 || !sep->IsNumber(3)) {
|
||||
c->Message(Chat::White, "Usage: #set aa_points [aa|group|raid] [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const std::string& aa_type = Strings::ToLower(sep->arg[2]);
|
||||
const uint32 aa_points = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
|
||||
std::string group_raid_string;
|
||||
|
||||
const bool is_aa = Strings::EqualFold(aa_type, "aa");
|
||||
const bool is_group = Strings::EqualFold(aa_type, "group");
|
||||
const bool is_raid = Strings::EqualFold(aa_type, "raid");
|
||||
|
||||
if (
|
||||
!is_aa &&
|
||||
!is_group &&
|
||||
!is_raid
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #set aa_points [aa|group|raid] [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_aa) {
|
||||
t->GetPP().aapoints = aa_points;
|
||||
t->GetPP().expAA = 0;
|
||||
t->SendAlternateAdvancementStats();
|
||||
} else if (is_group || is_raid) {
|
||||
if (is_group) {
|
||||
group_raid_string = "Group ";
|
||||
t->GetPP().group_leadership_points = aa_points;
|
||||
t->GetPP().group_leadership_exp = 0;
|
||||
} else if (is_raid) {
|
||||
group_raid_string = "Raid ";
|
||||
t->GetPP().raid_leadership_points = aa_points;
|
||||
t->GetPP().raid_leadership_exp = 0;
|
||||
}
|
||||
|
||||
t->SendLeadershipEXPUpdate();
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} now {} {} {}AA Point{}.",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCYou),
|
||||
c == t ? "have" : "has",
|
||||
Strings::Commify(aa_points),
|
||||
group_raid_string,
|
||||
aa_points != 1 ? "s" : ""
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+66
@@ -0,0 +1,66 @@
|
||||
#include "../../client.h"
|
||||
#include "../../../common/data_verification.h"
|
||||
|
||||
void SetAdventurePoints(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 3 || !sep->IsNumber(2) || !sep->IsNumber(3)) {
|
||||
c->Message(Chat::White, "Usage: #set adventure_points [Theme] [Points]");
|
||||
|
||||
c->Message(Chat::White, "Valid themes are as follows:");
|
||||
|
||||
for (const auto& e : EQ::constants::GetLDoNThemeMap()) {
|
||||
if (e.first != LDoNThemes::Unused) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Theme {} | {}",
|
||||
e.first,
|
||||
e.second
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const uint32 theme_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
const uint32 points = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
|
||||
if (!EQ::ValueWithin(theme_id, LDoNThemes::GUK, LDoNThemes::TAK)) {
|
||||
c->Message(Chat::White, "Valid themes are as follows:");
|
||||
|
||||
for (const auto& e : EQ::constants::GetLDoNThemeMap()) {
|
||||
if (e.first != LDoNThemes::Unused) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Theme {} | {}",
|
||||
e.first,
|
||||
e.second
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} Points to {} for {}.",
|
||||
EQ::constants::GetLDoNThemeName(theme_id),
|
||||
Strings::Commify(points),
|
||||
c->GetTargetDescription(t)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
t->SetLDoNPoints(theme_id, points);
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetAlternateCurrency(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 3 || !sep->IsNumber(2) || !sep->IsNumber(3)) {
|
||||
c->Message(Chat::White, "Usage: #set alternate_currency [Currency ID] [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const uint32 currency_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
const uint32 currency_item_id = zone->GetCurrencyItemID(currency_id);
|
||||
const uint32 currency_amount = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
|
||||
if (!currency_item_id) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Currency ID {} could not be found.",
|
||||
currency_id
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
t->SetAlternateCurrencyValue(currency_id, currency_amount);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} now {} {} {}.",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCYou),
|
||||
c == t ? "have" : "has",
|
||||
Strings::Commify(currency_amount),
|
||||
database.CreateItemLink(currency_item_id)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+63
@@ -0,0 +1,63 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetAnimation(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set animation [Animation ID]");
|
||||
|
||||
for (const auto& a : EQ::constants::GetSpawnAnimationMap()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Animation {} | {}",
|
||||
a.first,
|
||||
a.second
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
const auto animation_id = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[2]));
|
||||
if (
|
||||
!EQ::ValueWithin(
|
||||
animation_id,
|
||||
static_cast<uint8>(eaStanding),
|
||||
static_cast<uint8>(eaLooting)
|
||||
)
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #set animation [Animation ID]");
|
||||
|
||||
for (const auto& a : EQ::constants::GetSpawnAnimationMap()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Animation {} | {}",
|
||||
a.first,
|
||||
a.second
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
t->SetAppearance(static_cast<EmuAppearance>(animation_id), false);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set animation to {} ({}) for {}.",
|
||||
EQ::constants::GetSpawnAnimationName(animation_id),
|
||||
animation_id,
|
||||
c->GetTargetDescription(t)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -1,18 +1,19 @@
|
||||
#include "../client.h"
|
||||
#include "../../common/repositories/character_data_repository.h"
|
||||
#include "../../client.h"
|
||||
#include "../../../common/repositories/character_data_repository.h"
|
||||
|
||||
void command_setanon(Client *c, const Seperator *sep)
|
||||
void SetAnon(Client *c, const Seperator *sep)
|
||||
{
|
||||
auto arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1) || arguments > 2) {
|
||||
c->Message(Chat::White, "Usage: #setanon [Anonymous Flag]");
|
||||
c->Message(Chat::White, "Usage: #setanon [Character ID] [Anonymous Flag]");
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set anon [Anonymous Flag]");
|
||||
c->Message(Chat::White, "Usage: #set anon [Character ID] [Anonymous Flag]");
|
||||
c->Message(Chat::White, "Note: 0 = Not Anonymous, 1 = Anonymous, 2 = Roleplaying");
|
||||
return;
|
||||
}
|
||||
|
||||
if (arguments == 1) {
|
||||
const uint8 anon_flag = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[1]));
|
||||
if (arguments == 2) {
|
||||
const uint8 anon_flag = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[2]));
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient() && c->GetGM()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
@@ -26,8 +27,8 @@ void command_setanon(Client *c, const Seperator *sep)
|
||||
} else if (anon_flag == Anonymity::Roleplaying) {
|
||||
anon_setting = "now Roleplaying";
|
||||
} else {
|
||||
c->Message(Chat::White, "Usage: #setanon [Anonymous Flag]");
|
||||
c->Message(Chat::White, "Usage: #setanon [Character ID] [Anonymous Flag]");
|
||||
c->Message(Chat::White, "Usage: #set anon [Anonymous Flag]");
|
||||
c->Message(Chat::White, "Usage: #set anon [Character ID] [Anonymous Flag]");
|
||||
c->Message(Chat::White, "Note: 0 = Not Anonymous, 1 = Anonymous, 2 = Roleplaying");
|
||||
return;
|
||||
}
|
||||
@@ -43,9 +44,9 @@ void command_setanon(Client *c, const Seperator *sep)
|
||||
anon_setting
|
||||
).c_str()
|
||||
);
|
||||
} else if (arguments == 2) {
|
||||
const auto character_id = Strings::ToInt(sep->arg[1]);
|
||||
const uint8 anon_flag = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[2]));
|
||||
} else if (arguments == 3) {
|
||||
const int character_id = Strings::ToInt(sep->arg[2]);
|
||||
const uint8 anon_flag = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[3]));
|
||||
|
||||
auto e = CharacterDataRepository::FindOne(content_db, character_id);
|
||||
if (!e.id) {
|
||||
@@ -56,6 +57,7 @@ void command_setanon(Client *c, const Seperator *sep)
|
||||
character_id
|
||||
).c_str()
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -72,6 +74,7 @@ void command_setanon(Client *c, const Seperator *sep)
|
||||
character_id
|
||||
).c_str()
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -83,8 +86,8 @@ void command_setanon(Client *c, const Seperator *sep)
|
||||
} else if (anon_flag == Anonymity::Roleplaying) {
|
||||
anon_setting = "now Roleplaying";
|
||||
} else {
|
||||
c->Message(Chat::White, "Usage: #setanon [Anonymous Flag]");
|
||||
c->Message(Chat::White, "Usage: #setanon [Character ID] [Anonymous Flag]");
|
||||
c->Message(Chat::White, "Usage: #set anon [Anonymous Flag]");
|
||||
c->Message(Chat::White, "Usage: #set anon [Character ID] [Anonymous Flag]");
|
||||
c->Message(Chat::White, "Note: 0 = Not Anonymous, 1 = Anonymous, 2 = Roleplaying");
|
||||
return;
|
||||
}
|
||||
Executable
+45
@@ -0,0 +1,45 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetBindPoint(Client *c, const Seperator *sep)
|
||||
{
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const bool bind_allowed = (
|
||||
!zone->GetInstanceID() ||
|
||||
(
|
||||
zone->GetInstanceID() &&
|
||||
zone->IsInstancePersistent()
|
||||
)
|
||||
);
|
||||
|
||||
if (!bind_allowed) {
|
||||
c->Message(Chat::White, "You cannot bind here.");
|
||||
return;
|
||||
}
|
||||
|
||||
t->SetBindPoint();
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set Bind Point for {} | Zone: {}",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCSelf),
|
||||
zone->GetZoneDescription()
|
||||
).c_str()
|
||||
);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set Bind Point for {} | XYZH: {:.2f}, {:.2f}, {:.2f}, {:.2f}",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCSelf),
|
||||
t->GetX(),
|
||||
t->GetY(),
|
||||
t->GetZ(),
|
||||
t->GetHeading()
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "../client.h"
|
||||
#include "../worldserver.h"
|
||||
#include "../../common/repositories/account_repository.h"
|
||||
#include "../../client.h"
|
||||
#include "../../worldserver.h"
|
||||
#include "../../../common/repositories/account_repository.h"
|
||||
|
||||
extern WorldServer worldserver;
|
||||
|
||||
void command_updatechecksum(Client *c, const Seperator *sep)
|
||||
void SetChecksum(Client *c, const Seperator *sep)
|
||||
{
|
||||
auto account = AccountRepository::FindOne(database, c->AccountID());
|
||||
if (!account.id) {
|
||||
Executable
+40
@@ -0,0 +1,40 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetClassPermanent(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set class_permanent [Class ID]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const uint32 class_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
|
||||
LogInfo("Class changed by {} for {} to {} ({}).",
|
||||
c->GetCleanName(),
|
||||
c->GetTargetDescription(t),
|
||||
GetClassIDName(class_id),
|
||||
class_id
|
||||
);
|
||||
|
||||
t->SetBaseClass(class_id);
|
||||
t->Save();
|
||||
t->Kick("Class was changed.");
|
||||
|
||||
if (c != t) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Class changed for {} to {} ({}).",
|
||||
c->GetTargetDescription(t),
|
||||
GetClassIDName(class_id),
|
||||
class_id
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
Executable
+48
@@ -0,0 +1,48 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetCrystals(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(3)) {
|
||||
c->Message(Chat::White, "Usage: #setcrystals [ebon|radiant] [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const std::string& crystal_type = Strings::ToLower(sep->arg[2]);
|
||||
const uint32 crystal_amount = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
|
||||
const bool is_ebon = Strings::EqualFold(crystal_type, "ebon");
|
||||
const bool is_radiant = Strings::EqualFold(crystal_type, "radiant");
|
||||
if (!is_ebon && !is_radiant) {
|
||||
c->Message(Chat::White, "Usage: #setcrystals [ebon|radiant] [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
const uint32 crystal_item_id = (
|
||||
is_ebon ?
|
||||
RuleI(Zone, EbonCrystalItemID) :
|
||||
RuleI(Zone, RadiantCrystalItemID)
|
||||
);
|
||||
|
||||
if (is_radiant) {
|
||||
t->SetRadiantCrystals(crystal_amount);
|
||||
} else {
|
||||
t->SetEbonCrystals(crystal_amount);
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} now {} {} {}.",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCYou),
|
||||
c == t ? "have" : "has",
|
||||
Strings::Commify(crystal_amount),
|
||||
database.CreateItemLink(crystal_item_id)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetDate(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (
|
||||
arguments < 2 ||
|
||||
!sep->IsNumber(2) ||
|
||||
!sep->IsNumber(3) ||
|
||||
!sep->IsNumber(4)
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #date [Year] [Month] [Day] [Hour] [Minute]");
|
||||
c->Message(Chat::White, "Hour and Minute are optional");
|
||||
return;
|
||||
}
|
||||
|
||||
TimeOfDay_Struct eq_time;
|
||||
zone->zone_time.GetCurrentEQTimeOfDay(time(0), &eq_time);
|
||||
|
||||
const uint16 year = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
const uint8 month = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
const uint8 day = Strings::ToUnsignedInt(sep->arg[4]);
|
||||
const uint8 hour = !sep->IsNumber(5) ? eq_time.hour : Strings::ToUnsignedInt(sep->arg[5]) + 1;
|
||||
const uint8 minute = !sep->IsNumber(6) ? eq_time.minute : Strings::ToUnsignedInt(sep->arg[6]);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format("Setting world time to {}/{}/{} {}.",
|
||||
year,
|
||||
month,
|
||||
day,
|
||||
Strings::ZoneTime(hour, minute)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
zone->SetDate(year, month, day, hour, minute);
|
||||
|
||||
LogInfo(
|
||||
"{} :: Setting world time to {}/{}/{} {}.",
|
||||
c->GetCleanName(),
|
||||
year,
|
||||
month,
|
||||
day,
|
||||
Strings::ZoneTime(hour, minute)
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetEndurance(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set endurance [Endurance]");
|
||||
return;
|
||||
}
|
||||
|
||||
int endurance = Strings::ToInt(sep->arg[2]);
|
||||
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
if (t->IsClient()) {
|
||||
if (endurance >= t->CastToClient()->GetMaxEndurance()) {
|
||||
endurance = t->CastToClient()->GetMaxEndurance();
|
||||
}
|
||||
|
||||
t->CastToClient()->SetEndurance(endurance);
|
||||
} else {
|
||||
if (endurance >= t->GetMaxEndurance()) {
|
||||
endurance = t->GetMaxEndurance();
|
||||
}
|
||||
|
||||
t->SetEndurance(endurance);
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} to {} Endurance.",
|
||||
c->GetTargetDescription(t),
|
||||
Strings::Commify(endurance)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+29
@@ -0,0 +1,29 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetEnduranceFull(Client *c, const Seperator *sep)
|
||||
{
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
int endurance;
|
||||
|
||||
if (t->IsClient()) {
|
||||
endurance = t->CastToClient()->GetMaxEndurance();
|
||||
t->CastToClient()->SetEndurance(endurance);
|
||||
} else {
|
||||
endurance = t->GetMaxEndurance();
|
||||
t->SetEndurance(endurance);
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} to full Endurance ({}).",
|
||||
c->GetTargetDescription(t),
|
||||
Strings::Commify(endurance)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
Executable
+49
@@ -0,0 +1,49 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetEXP(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 3 || !sep->IsNumber(3)) {
|
||||
c->Message(Chat::White, "Usage: #set exp [aa|exp] [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const std::string& type = Strings::ToLower(sep->arg[2]);
|
||||
|
||||
const bool is_aa = Strings::EqualFold(type, "aa");
|
||||
const bool is_exp = Strings::EqualFold(type, "exp");
|
||||
if (!is_aa && !is_exp) {
|
||||
c->Message(Chat::White, "Usage: #set exp [aa|exp] [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
const uint32 amount = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
|
||||
if (is_aa) {
|
||||
t->SetEXP(
|
||||
t->GetEXP(),
|
||||
amount
|
||||
);
|
||||
} else if (is_exp) {
|
||||
t->SetEXP(
|
||||
amount,
|
||||
t->GetAAXP()
|
||||
);
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} now {} {} {}experience.",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCYou),
|
||||
c == t ? "have" : "has",
|
||||
Strings::Commify(amount),
|
||||
is_aa ? "AA " : ""
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+69
@@ -0,0 +1,69 @@
|
||||
#include "../../client.h"
|
||||
#include "../../../common/data_verification.h"
|
||||
|
||||
void SetFlymode(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set flymode [Flymode ID]");
|
||||
|
||||
for (const auto& e : EQ::constants::GetFlyModeMap()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Flymode {} | {}",
|
||||
e.first,
|
||||
e.second
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
const int8 flymode_id = Strings::ToInt(sep->arg[2]);
|
||||
if (
|
||||
!EQ::ValueWithin(
|
||||
flymode_id,
|
||||
EQ::constants::GravityBehavior::Ground,
|
||||
EQ::constants::GravityBehavior::LevitateWhileRunning
|
||||
)
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #set flymode [Flymode ID]");
|
||||
|
||||
for (const auto& e : EQ::constants::GetFlyModeMap()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Flymode {} | {}",
|
||||
e.first,
|
||||
e.second
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
t->SetFlyMode(static_cast<GravityBehavior>(flymode_id));
|
||||
t->SendAppearancePacket(AT_Levitate, flymode_id);
|
||||
|
||||
const uint32 account = c->AccountID();
|
||||
|
||||
database.SetGMFlymode(account, flymode_id);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Fly Mode for {} is now {} ({}).",
|
||||
c->GetTargetDescription(t),
|
||||
EQ::constants::GetFlyModeName(flymode_id),
|
||||
flymode_id
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetFrozen(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set frozen [on|off]");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!c->GetTarget()) {
|
||||
c->Message(Chat::White, "You must have a target to use this command.");
|
||||
return;
|
||||
}
|
||||
|
||||
const bool is_frozen = Strings::ToBool(sep->arg[2]);
|
||||
|
||||
auto t = c->GetTarget();
|
||||
if (c == t) {
|
||||
c->Message(Chat::White, "You cannot use this command on yourself.");
|
||||
return;
|
||||
}
|
||||
|
||||
t->SendAppearancePacket(AT_Anim, is_frozen ? ANIM_FREEZE : ANIM_STAND);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"You have {}frozen {}.",
|
||||
!is_frozen ? "un" : "",
|
||||
c->GetTargetDescription(t)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+38
@@ -0,0 +1,38 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetGender(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set gender [Gender ID]");
|
||||
c->Message(Chat::White, "Genders: 0 = Male, 1 = Female, 2 = Neuter");
|
||||
return;
|
||||
}
|
||||
|
||||
Mob *t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
const uint8 gender_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
if (!EQ::ValueWithin(gender_id, MALE, NEUTER)) {
|
||||
c->Message(Chat::White, "Usage: #set gender [Gender ID]");
|
||||
c->Message(Chat::White, "Genders: 0 = Male, 1 = Female, 2 = Neuter");
|
||||
return;
|
||||
}
|
||||
|
||||
t->SendIllusionPacket(
|
||||
t->GetRace(),
|
||||
gender_id
|
||||
);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Gender changed for {} to {} ({}).",
|
||||
c->GetTargetDescription(t),
|
||||
GetGenderName(gender_id),
|
||||
gender_id
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+44
@@ -0,0 +1,44 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetGenderPermanent(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set gender_permanent [Gender ID]");
|
||||
c->Message(Chat::White, "Genders: 0 = Male, 1 = Female, 2 = Neuter");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const uint8 gender_id = Strings::ToInt(sep->arg[2]);
|
||||
if (!EQ::ValueWithin(gender_id, MALE, NEUTER)) {
|
||||
c->Message(Chat::White, "Usage: #set gender_permanent [Gender ID]");
|
||||
c->Message(Chat::White, "Genders: 0 = Male, 1 = Female, 2 = Neuter");
|
||||
return;
|
||||
}
|
||||
|
||||
LogInfo("Gender changed by {} for {} to {} ({})",
|
||||
c->GetCleanName(),
|
||||
c->GetTargetDescription(t),
|
||||
GetGenderName(gender_id),
|
||||
gender_id
|
||||
);
|
||||
|
||||
t->SetBaseGender(gender_id);
|
||||
t->Save();
|
||||
t->SendIllusionPacket(t->GetRace(), gender_id);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Gender changed for {} to {} ({}).",
|
||||
c->GetTargetDescription(t),
|
||||
GetGenderName(gender_id),
|
||||
gender_id
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+30
@@ -0,0 +1,30 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetGM(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set gm [on|off]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const bool gm_flag = Strings::ToBool(sep->arg[2]);
|
||||
|
||||
t->SetGM(gm_flag);
|
||||
|
||||
if (c != t) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} is {} flagged as a GM.",
|
||||
c->GetTargetDescription(t),
|
||||
gm_flag ? "now" : "no longer"
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
Executable
+39
@@ -0,0 +1,39 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetGMSpeed(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set gmspeed [on|off]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const bool gm_speed = Strings::ToBool(sep->arg[2]);
|
||||
|
||||
database.SetGMSpeed(
|
||||
t->AccountID(),
|
||||
gm_speed ? 1 : 0
|
||||
);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Turning GM Speed {} for {}.",
|
||||
gm_speed ? "on" : "off",
|
||||
c->GetTargetDescription(t)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Note: {} must zone for it to take effect.",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCYou)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
#include "../../client.h"
|
||||
#include "../../worldserver.h"
|
||||
|
||||
extern WorldServer worldserver;
|
||||
|
||||
void SetGMStatus(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Status level has been refreshed for {}.",
|
||||
c->GetTargetDescription(t)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
if (t != c) {
|
||||
t->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Your status level has been refreshed by {}.",
|
||||
c->GetCleanName()
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
t->UpdateAdmin();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (
|
||||
!sep->IsNumber(2) ||
|
||||
!strlen(sep->arg[3])
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #set gm_status [Status] [Account Name]");
|
||||
return;
|
||||
}
|
||||
|
||||
const int gm_status = Strings::ToInt(sep->arg[2]);
|
||||
if (!EQ::ValueWithin(gm_status, -2, UINT8_MAX)) {
|
||||
c->Message(Chat::White, "The lowest a status level can go is -2 and the highest a status level can go is 255.");
|
||||
return;
|
||||
}
|
||||
|
||||
const std::string& account_name = sep->argplus[3];
|
||||
|
||||
if (gm_status > c->Admin()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"You cannot set someone's status level to {} because your status level is only {}.",
|
||||
gm_status,
|
||||
c->Admin()
|
||||
).c_str()
|
||||
);
|
||||
} else if (!database.SetAccountStatus(account_name, gm_status)) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Failed to set status level to {} for account {}.",
|
||||
gm_status,
|
||||
account_name
|
||||
).c_str()
|
||||
);
|
||||
} else {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set GM status to {} on account {}.",
|
||||
gm_status,
|
||||
account_name
|
||||
).c_str()
|
||||
);
|
||||
|
||||
std::string user;
|
||||
std::string loginserver;
|
||||
ParseAccountString(account_name, user, loginserver);
|
||||
|
||||
const uint32 account_id = database.GetAccountIDByName(account_name, loginserver);
|
||||
|
||||
ServerPacket pack(ServerOP_FlagUpdate, sizeof(ServerFlagUpdate_Struct));
|
||||
|
||||
auto s = (ServerFlagUpdate_Struct *) pack.pBuffer;
|
||||
s->account_id = account_id;
|
||||
s->admin = gm_status;
|
||||
|
||||
worldserver.SendPacket(&pack);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
#include "../../client.h"
|
||||
#include "../../../common/repositories/account_repository.h"
|
||||
|
||||
void SetGodMode(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set god_mode [on|off]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const bool god_mode = Strings::ToBool(sep->arg[2]);
|
||||
const uint32 account_id = c->AccountID();
|
||||
|
||||
auto a = AccountRepository::FindOne(database, c->AccountID());
|
||||
if (a.id) {
|
||||
a.flymode = god_mode ? 1 : 0;
|
||||
a.gmspeed = god_mode ? 1 : 0;
|
||||
a.invulnerable = god_mode ? 1 : 0;
|
||||
a.hideme = god_mode ? 1 : 0;
|
||||
}
|
||||
|
||||
c->SetInvul(god_mode);
|
||||
c->SendAppearancePacket(AT_Levitate, god_mode);
|
||||
c->SetHideMe(god_mode);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Turning God Mode {} for {}, zone for GM Speed to take effect.",
|
||||
god_mode ? "on" : "off",
|
||||
c->GetTargetDescription(t)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
AccountRepository::UpdateOne(database, a);
|
||||
}
|
||||
Executable → Regular
+5
-6
@@ -1,10 +1,10 @@
|
||||
#include "../client.h"
|
||||
#include "../../client.h"
|
||||
|
||||
void command_haste(Client *c, const Seperator *sep)
|
||||
void SetHaste(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #haste [Percentage] - Set GM Bonus Haste (100 is 100% more Attack Speed)");
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set haste [Percentage] - Set GM Bonus Haste (100 is 100% more Attack Speed)");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ void command_haste(Client *c, const Seperator *sep)
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const auto extra_haste = Strings::ToInt(sep->arg[1]);
|
||||
const int extra_haste = Strings::ToInt(sep->arg[2]);
|
||||
|
||||
t->SetExtraHaste(extra_haste);
|
||||
t->CalcBonuses();
|
||||
@@ -28,4 +28,3 @@ void command_haste(Client *c, const Seperator *sep)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
Executable
+44
@@ -0,0 +1,44 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetHeroModel(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set hero_model [Hero Model]");
|
||||
c->Message(Chat::White, "Usage: #set hero_model [Hero Model] [Slot]");
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Example: {}",
|
||||
Saylink::Silent("#heromodel 63")
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
uint32 hero_forge_model = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
|
||||
if (arguments > 2) {
|
||||
const uint8 slot = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
c->GetTarget()->SendTextureWC(slot, 0, hero_forge_model, 0, 0, 0);
|
||||
} else {
|
||||
if (!hero_forge_model) {
|
||||
c->Message(Chat::White, "Hero's Forge Model must be greater than 0.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Conversion to simplify the command arguments
|
||||
// Hero's Forge model is actually model * 1000 + texture * 100 + wearslot
|
||||
// Hero's Forge Model slot 7 is actually for Robes, but it still needs to use wearslot 1 in the packet
|
||||
hero_forge_model *= 100;
|
||||
|
||||
for (uint8 slot = 0; slot < 7; slot++) {
|
||||
c->GetTarget()->SendTextureWC(slot, 0, (hero_forge_model + slot), 0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,10 @@
|
||||
#include "../client.h"
|
||||
#include "../../client.h"
|
||||
|
||||
void command_hideme(Client *c, const Seperator *sep)
|
||||
void SetHideMe(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (!arguments) {
|
||||
c->Message(Chat::White, "Usage: #hideme [On|Off]");
|
||||
c->Message(Chat::White, "Usage: #hideme [0|1]");
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set hide_me [on|off]");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -14,17 +13,17 @@ void command_hideme(Client *c, const Seperator *sep)
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const auto is_hidden = Strings::ToBool(sep->arg[1]);
|
||||
const bool is_hidden = Strings::ToBool(sep->arg[2]);
|
||||
|
||||
t->SetHideMe(is_hidden);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} {} now {} to players below a status level of {}.",
|
||||
"{} {} now {}visible to players below a status level of {}.",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCYou),
|
||||
c == t ? "are" : "is",
|
||||
is_hidden ? "invisible" : "visible",
|
||||
is_hidden ? "in" : "",
|
||||
t->Admin()
|
||||
).c_str()
|
||||
);
|
||||
@@ -0,0 +1,33 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetHP(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set hp [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
int64 health = Strings::ToBigInt(sep->arg[2]);
|
||||
|
||||
if (health >= t->GetMaxHP()) {
|
||||
health = t->GetMaxHP();
|
||||
}
|
||||
|
||||
t->SetHP(health);
|
||||
t->SendHPUpdate();
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} to {} Health.",
|
||||
c->GetTargetDescription(t),
|
||||
Strings::Commify(health)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+20
@@ -0,0 +1,20 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetHPFull(Client *c, const Seperator *sep)
|
||||
{
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
t->Heal();
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} to full Health ({}).",
|
||||
c->GetTargetDescription(t),
|
||||
Strings::Commify(t->GetMaxHP())
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+32
@@ -0,0 +1,32 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetInvulnerable(Client *c, const Seperator *sep) {
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set invulnerable [on|off]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const bool invulnerable = Strings::ToBool(sep->arg[2]);
|
||||
|
||||
t->SetInvul(invulnerable);
|
||||
|
||||
const uint32 account_id = t->AccountID();
|
||||
|
||||
database.SetGMInvul(account_id, invulnerable);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} {} now {}vulnerable.",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCYou),
|
||||
c == t ? "are" : "is",
|
||||
invulnerable ? "in" : ""
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+54
@@ -0,0 +1,54 @@
|
||||
#include "../../client.h"
|
||||
#include "../../../common/languages.h"
|
||||
#include "../../../common/data_verification.h"
|
||||
|
||||
void SetLanguage(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 3 || !sep->IsNumber(2) || !sep->IsNumber(3)) {
|
||||
c->Message(Chat::White, "Usage: #set language [Language ID] [Language Value]");
|
||||
c->Message(Chat::White, "Language ID = 0 to 27");
|
||||
c->Message(Chat::White, "Language Value = 0 to 100");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const int language_id = Strings::ToInt(sep->arg[2]);
|
||||
const int language_value = Strings::ToInt(sep->arg[3]);
|
||||
if (
|
||||
!EQ::ValueWithin(language_id, LANG_COMMON_TONGUE, LANG_UNKNOWN) ||
|
||||
!EQ::ValueWithin(language_value, 0, MAX_LANGUAGE_SKILL)
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #set language [Language ID] [Language Value]");
|
||||
c->Message(Chat::White, "Language ID = 0 to 27");
|
||||
c->Message(Chat::White, "Language Value = 0 to 100");
|
||||
return;
|
||||
}
|
||||
|
||||
LogInfo(
|
||||
"Set language request from [{}], Target: [{}] Language ID: [{}] Language Value: [{}]",
|
||||
c->GetCleanName(),
|
||||
c->GetTargetDescription(t),
|
||||
language_id,
|
||||
language_value
|
||||
);
|
||||
|
||||
t->SetLanguageSkill(language_id, language_value);
|
||||
|
||||
if (c != t) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} ({}) to {} for {}.",
|
||||
EQ::constants::GetLanguageName(language_id),
|
||||
language_id,
|
||||
language_value,
|
||||
c->GetTargetDescription(t)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetLastName(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set lastname [Last Name]");
|
||||
c->Message(Chat::White, "Note: Use \"-1\" to remove last name.");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
LogInfo("#lastname request from [{}] for [{}]", c->GetCleanName(), t->GetCleanName());
|
||||
|
||||
const bool is_remove = Strings::EqualFold(sep->argplus[2], "-1");
|
||||
const std::string& last_name = !is_remove ? sep->argplus[2] : "";
|
||||
|
||||
if (last_name.size() > 64) {
|
||||
c->Message(Chat::White, "Last name must be 64 characters or less.");
|
||||
return;
|
||||
}
|
||||
|
||||
t->ChangeLastName(last_name);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Last name has been {}{} for {}{}",
|
||||
is_remove ? "removed" : "changed",
|
||||
!is_remove ? " and saved" : "",
|
||||
c->GetTargetDescription(t),
|
||||
(
|
||||
is_remove ?
|
||||
"." :
|
||||
fmt::format(
|
||||
" to '{}'.",
|
||||
last_name
|
||||
)
|
||||
)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
#include "../../bot.h"
|
||||
#include "../../client.h"
|
||||
|
||||
void SetLevel(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set level [Level]");
|
||||
return;
|
||||
}
|
||||
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
const uint8 max_level = RuleI(Character, MaxLevel);
|
||||
const uint8 level = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
|
||||
if (c != t && c->Admin() < RuleI(GM, MinStatusToLevelTarget)) {
|
||||
c->Message(Chat::White, "Your status is not high enough to change another person's level.");
|
||||
return;
|
||||
}
|
||||
|
||||
t->SetLevel(level, true);
|
||||
|
||||
if (t->IsClient()) {
|
||||
t->CastToClient()->SendLevelAppearance();
|
||||
|
||||
if (RuleB(Bots, Enabled) && RuleB(Bots, BotLevelsWithOwner)) {
|
||||
Bot::LevelBotWithClient(t->CastToClient(), level, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +1,30 @@
|
||||
#include "../client.h"
|
||||
#include "../worldserver.h"
|
||||
#include "../../client.h"
|
||||
#include "../../worldserver.h"
|
||||
|
||||
extern WorldServer worldserver;
|
||||
|
||||
void command_setlsinfo(Client *c, const Seperator *sep)
|
||||
void SetLoginserverInfo(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #setlsinfo [Email] [Password]");
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 3) {
|
||||
c->Message(Chat::White, "Usage: #set lsinfo [Email] [Password]");
|
||||
return;
|
||||
}
|
||||
|
||||
const std::string& email = sep->arg[2];
|
||||
const std::string& password = sep->arg[3];
|
||||
|
||||
auto pack = new ServerPacket(ServerOP_LSAccountUpdate, sizeof(ServerLSAccountUpdate_Struct));
|
||||
|
||||
auto s = (ServerLSAccountUpdate_Struct *) pack->pBuffer;
|
||||
|
||||
s->useraccountid = c->LSAccountID();
|
||||
strn0cpy(s->useraccount, c->AccountName(), 30);
|
||||
strn0cpy(s->user_email, sep->arg[1], 100);
|
||||
strn0cpy(s->userpassword, sep->arg[2], 50);
|
||||
strn0cpy(s->user_email, email.c_str(), 100);
|
||||
strn0cpy(s->userpassword, password.c_str(), 50);
|
||||
|
||||
worldserver.SendPacket(pack);
|
||||
safe_delete(pack);
|
||||
|
||||
c->Message(Chat::White, "Your email and local loginserver password have been set.");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetMana(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set mana [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
int64 mana = Strings::ToBigInt(sep->arg[2]);
|
||||
|
||||
if (t->IsClient()) {
|
||||
if (mana >= t->CastToClient()->CalcMaxMana()) {
|
||||
mana = t->CastToClient()->CalcMaxMana();
|
||||
}
|
||||
|
||||
t->CastToClient()->SetMana(mana);
|
||||
} else {
|
||||
if (mana >= t->CalcMaxMana()) {
|
||||
mana = t->CalcMaxMana();
|
||||
}
|
||||
|
||||
t->SetMana(mana);
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} to {} Mana.",
|
||||
c->GetTargetDescription(t),
|
||||
Strings::Commify(mana)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
Executable
+28
@@ -0,0 +1,28 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetManaFull(Client *c, const Seperator *sep)
|
||||
{
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
int64 mana;
|
||||
|
||||
if (t->IsClient()) {
|
||||
mana = t->CastToClient()->CalcMaxMana();
|
||||
t->CastToClient()->SetMana(mana);
|
||||
} else {
|
||||
mana = t->CalcMaxMana();
|
||||
t->SetMana(mana);
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} to full Mana ({}).",
|
||||
c->GetTargetDescription(t),
|
||||
Strings::Commify(mana)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -1,15 +1,24 @@
|
||||
#include "../client.h"
|
||||
#include "../worldserver.h"
|
||||
#include "../../client.h"
|
||||
#include "../../worldserver.h"
|
||||
|
||||
extern WorldServer worldserver;
|
||||
|
||||
void command_motd(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set motd [Message]");
|
||||
return;
|
||||
}
|
||||
|
||||
const std::string& message = sep->argplus[2];
|
||||
|
||||
auto pack = new ServerPacket(ServerOP_Motd, sizeof(ServerMotd_Struct));
|
||||
|
||||
auto m = (ServerMotd_Struct *) pack->pBuffer;
|
||||
strn0cpy(m->myname, c->GetName(), sizeof(m->myname));
|
||||
strn0cpy(m->motd, sep->argplus[1], sizeof(m->motd));
|
||||
strn0cpy(m->motd, message.c_str(), sizeof(m->motd));
|
||||
|
||||
worldserver.SendPacket(pack);
|
||||
safe_delete(pack);
|
||||
}
|
||||
|
||||
Executable
+43
@@ -0,0 +1,43 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetName(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set name [Name]");
|
||||
return;
|
||||
}
|
||||
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
auto t = c->GetTarget()->CastToClient();
|
||||
|
||||
std::string new_name = sep->arg[2];
|
||||
std::string old_name = t->GetCleanName();
|
||||
|
||||
if (t->ChangeFirstName(new_name.c_str(), c->GetCleanName())) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Successfully renamed {} to {}",
|
||||
old_name,
|
||||
new_name
|
||||
).c_str()
|
||||
);
|
||||
|
||||
c->Message(Chat::White, "Sending player to char select.");
|
||||
|
||||
t->Kick("Name was changed");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Unable to rename {}. Check that the new name '{}' isn't already taken.",
|
||||
old_name,
|
||||
new_name
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,23 @@
|
||||
#include "../client.h"
|
||||
#include "../worldserver.h"
|
||||
#include "../../client.h"
|
||||
#include "../../worldserver.h"
|
||||
|
||||
extern WorldServer worldserver;
|
||||
|
||||
void command_oocmute(Client *c, const Seperator *sep)
|
||||
void SetOOCMute(Client *c, const Seperator *sep)
|
||||
{
|
||||
if (!sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #oocmute [0|1] - Enable or Disable Server OOC");
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set ooc_mute [on|off]");
|
||||
return;
|
||||
}
|
||||
|
||||
bool is_muted = Strings::ToInt(sep->arg[1]) ? true : false;
|
||||
const bool is_muted = Strings::ToBool(sep->arg[2]);
|
||||
|
||||
ServerPacket pack(ServerOP_OOCMute, sizeof(ServerOOCMute_Struct));
|
||||
|
||||
auto o = (ServerOOCMute_Struct*) pack.pBuffer;
|
||||
o->is_muted = is_muted;
|
||||
|
||||
worldserver.SendPacket(&pack);
|
||||
|
||||
c->Message(
|
||||
@@ -25,4 +28,3 @@ void command_oocmute(Client *c, const Seperator *sep)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
Executable
+52
@@ -0,0 +1,52 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetPassword(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 3) {
|
||||
c->Message(Chat::White, "Usage: #set password [Account Name] [Password] [Loginserver]");
|
||||
return;
|
||||
}
|
||||
|
||||
std::string account_name = sep->arg[2];
|
||||
std::string password = sep->arg[3];
|
||||
std::string loginserver = arguments >= 4 ? sep->arg[4] : "eqemu";
|
||||
|
||||
int16 status = 0;
|
||||
|
||||
const uint32 account_id = database.GetAccountIDByName(account_name, loginserver, &status);
|
||||
if (!account_id) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Account {} was not found.",
|
||||
account_name
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (status > c->Admin()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"You cannot change the password for Account {} as its status is higher than yours.",
|
||||
account_name
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Password {} changed for Account {}.",
|
||||
(
|
||||
database.SetLocalPassword(account_id, password.c_str()) ?
|
||||
"successfully" :
|
||||
"failed"
|
||||
),
|
||||
account_name
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+30
@@ -0,0 +1,30 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetPVP(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set pvp [on|off]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const bool pvp_state = Strings::ToBool(sep->arg[2]);
|
||||
|
||||
t->SetPVP(pvp_state);
|
||||
|
||||
if (c != t) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} now follows the ways of {}.",
|
||||
c->GetTargetDescription(t),
|
||||
pvp_state ? "Discord" : "Order"
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
Executable
+33
@@ -0,0 +1,33 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetPVPPoints(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set pvp_points [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const uint32 pvp_points = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
|
||||
t->SetPVPPoints(pvp_points);
|
||||
t->Save();
|
||||
t->SendPVPStats();
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} now {} {} PVP Point{}.",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCYou),
|
||||
c == t ? "have" : "has",
|
||||
Strings::Commify(pvp_points),
|
||||
pvp_points != 1 ? "s" : ""
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
Executable
+52
@@ -0,0 +1,52 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetRace(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Usage: #set race [0-{}, 2253-2259] (0 for back to normal)",
|
||||
RuleI(NPC, MaxRaceID)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
const uint16 race_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
|
||||
if (
|
||||
!EQ::ValueWithin(race_id, RACE_DOUG_0, RuleI(NPC, MaxRaceID)) &&
|
||||
!EQ::ValueWithin(race_id, 2253, 2259)
|
||||
) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Usage: #race [0-{}, 2253-2259] (0 for back to normal)",
|
||||
RuleI(NPC, MaxRaceID)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
t->SendIllusionPacket(race_id);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} {} now temporarily a(n) {} ({}).",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCYou),
|
||||
c == t ? "are" : "is",
|
||||
GetRaceIDName(race_id),
|
||||
race_id
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+45
@@ -0,0 +1,45 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetRacePermanent(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set race_permanent [Race ID]");
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"NOTE: Not all models are global. If a model is not global, it will appear as a Human on character select and in zones without the model."
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const uint16 race_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
const uint8 gender_id = Mob::GetDefaultGender(race_id, t->GetBaseGender());
|
||||
|
||||
LogInfo("Race changed by {} for {} to {} ({})",
|
||||
c->GetCleanName(),
|
||||
c->GetTargetDescription(t),
|
||||
GetRaceIDName(race_id),
|
||||
race_id
|
||||
);
|
||||
|
||||
t->SetBaseRace(race_id);
|
||||
t->SetBaseGender(gender_id);
|
||||
t->Save();
|
||||
t->SendIllusionPacket(race_id, gender_id);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Race changed for {} to {} ({}).",
|
||||
c->GetTargetDescription(t),
|
||||
GetRaceIDName(race_id),
|
||||
race_id
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#include "../../client.h"
|
||||
#include "../../worldserver.h"
|
||||
|
||||
extern WorldServer worldserver;
|
||||
|
||||
void SetServerLocked(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set server_locked [on|off]");
|
||||
return;
|
||||
}
|
||||
|
||||
bool is_locked = Strings::ToBool(sep->arg[2]);
|
||||
|
||||
if (c->EntityVariableExists("old_command")) {
|
||||
const std::string& old_command = c->GetEntityVariable("old_command");
|
||||
if (old_command == "lock" || old_command == "serverlock") {
|
||||
is_locked = true;
|
||||
} else if (old_command == "unlock" || old_command == "serverunlock") {
|
||||
is_locked = false;
|
||||
}
|
||||
}
|
||||
|
||||
auto pack = new ServerPacket(ServerOP_Lock, sizeof(ServerLock_Struct));
|
||||
|
||||
auto l = (ServerLock_Struct *) pack->pBuffer;
|
||||
strn0cpy(l->character_name, c->GetCleanName(), sizeof(l->character_name));
|
||||
l->is_locked = is_locked;
|
||||
|
||||
worldserver.SendPacket(pack);
|
||||
safe_delete(pack);
|
||||
}
|
||||
@@ -1,11 +1,10 @@
|
||||
#include "../client.h"
|
||||
#include "../../client.h"
|
||||
|
||||
void command_setskill(Client *c, const Seperator *sep)
|
||||
void SetSkill(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
|
||||
if (arguments < 2 || !sep->IsNumber(1) || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #setskill [Skill ID] [Skill Value]");
|
||||
if (arguments < 3 || !sep->IsNumber(2) || !sep->IsNumber(3)) {
|
||||
c->Message(Chat::White, "Usage: #set skill [Skill ID] [Skill Value]");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -14,11 +13,11 @@ void command_setskill(Client *c, const Seperator *sep)
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const auto skill_id = Strings::ToInt(sep->arg[1]);
|
||||
const auto skill_value = Strings::ToInt(sep->arg[2]);
|
||||
const uint16 skill_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
const uint16 skill_value = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
|
||||
if (!EQ::ValueWithin(skill_id, EQ::skills::Skill1HBlunt, EQ::skills::HIGHEST_SKILL)) {
|
||||
c->Message(Chat::White, "Usage: #setskill [Skill ID] [Skill Value]");
|
||||
c->Message(Chat::White, "Usage: #set skill [Skill ID] [Skill Value]");
|
||||
c->Message(Chat::White, fmt::format("Skill ID: 0 to {}", EQ::skills::HIGHEST_SKILL).c_str());
|
||||
return;
|
||||
}
|
||||
@@ -43,4 +42,3 @@ void command_setskill(Client *c, const Seperator *sep)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Executable
+39
@@ -0,0 +1,39 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetSkillAll(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set skill_all [Skill Level]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const uint16 skill_level = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
|
||||
for (const auto& s : EQ::skills::GetSkillTypeMap()) {
|
||||
if (t->CanHaveSkill(s.first) && t->MaxSkill(s.first)) {
|
||||
if (c != t) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Setting {} ({}) to {} for {}.",
|
||||
s.second,
|
||||
s.first,
|
||||
skill_level > t->MaxSkill(s.first) ? t->MaxSkill(s.first) : skill_level,
|
||||
c->GetTargetDescription(t)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
t->SetSkill(
|
||||
s.first,
|
||||
skill_level > t->MaxSkill(s.first) ? t->MaxSkill(s.first) : skill_level
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "../client.h"
|
||||
#include "../../client.h"
|
||||
|
||||
void command_max_all_skills(Client *c, const Seperator *sep)
|
||||
void SetSkillAllMax(Client *c, const Seperator *sep)
|
||||
{
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
@@ -17,4 +17,3 @@ void command_max_all_skills(Client *c, const Seperator *sep)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
Executable
+51
@@ -0,0 +1,51 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetStartZone(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set start_zone [Zone ID|Zone Short Name]");
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Optional Usage: Use '#set start_zone reset' or '#set start_zone 0' to clear a starting zone. Player can select a starting zone using /setstartcity"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
const uint32 zone_id = (
|
||||
sep->IsNumber(2) ?
|
||||
Strings::ToUnsignedInt(sep->arg[2]) :
|
||||
ZoneID(sep->arg[2])
|
||||
);
|
||||
|
||||
t->SetStartZone(zone_id);
|
||||
|
||||
const bool is_reset = (
|
||||
Strings::EqualFold(sep->arg[2], "reset") ||
|
||||
zone_id == 0
|
||||
);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Start Zone {} for {} |{}",
|
||||
is_reset ? "Reset" : "Changed",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCSelf),
|
||||
(
|
||||
zone_id ?
|
||||
fmt::format(
|
||||
" {} ({}) ID: {}",
|
||||
ZoneLongName(zone_id),
|
||||
ZoneName(zone_id),
|
||||
zone_id
|
||||
) :
|
||||
""
|
||||
)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+38
@@ -0,0 +1,38 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetTemporaryName(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set temporary_name [New Name]");
|
||||
c->Message(Chat::White, "Note: This command requires a target, even if the target is yourself.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!c->GetTarget()) {
|
||||
c->Message(Chat::White, "Usage: #set temporary_name [New Name]");
|
||||
c->Message(Chat::White, "Note: This command requires a target, even if the target is yourself.");
|
||||
return;
|
||||
}
|
||||
|
||||
Mob* t = c->GetTarget();
|
||||
|
||||
const std::string& temporary_name = strlen(sep->arg[2]) ? sep->arg[2] : "";
|
||||
|
||||
t->TempName(temporary_name.c_str());
|
||||
|
||||
if (temporary_name.length()) {
|
||||
const std::string& current_name = t->GetName();
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Renamed {} to {} temporarily.",
|
||||
current_name,
|
||||
temporary_name
|
||||
).c_str()
|
||||
);
|
||||
} else {
|
||||
c->Message(Chat::White, "Restored your target's original name.");
|
||||
}
|
||||
}
|
||||
Executable
+56
@@ -0,0 +1,56 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetTexture(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set texture [Texture] [Helmet Texture]");
|
||||
return;
|
||||
}
|
||||
|
||||
const uint16 texture = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
const uint8 helmet_texture = (
|
||||
sep->IsNumber(3) ?
|
||||
Strings::ToUnsignedInt(sep->arg[3]) :
|
||||
0
|
||||
);
|
||||
|
||||
Mob* t = c;
|
||||
if (c->GetTarget()) {
|
||||
t = c->GetTarget();
|
||||
}
|
||||
|
||||
if (IsPlayerRace(t->GetModel())) { // Player Races Wear Armor, so Wearchange is sent instead
|
||||
for (
|
||||
int texture_slot = EQ::textures::textureBegin;
|
||||
texture_slot <= EQ::textures::LastTintableTexture;
|
||||
texture_slot++
|
||||
) {
|
||||
t->SendTextureWC(texture_slot, texture);
|
||||
}
|
||||
} else { // Non-Player Races only need Illusion Packets to be sent for texture
|
||||
t->SendIllusionPacket(
|
||||
t->GetModel(),
|
||||
t->GetGender(),
|
||||
texture,
|
||||
helmet_texture
|
||||
);
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Texture Changed for {} | Texture: {}{}",
|
||||
c->GetTargetDescription(t, TargetDescriptionType::UCSelf),
|
||||
texture,
|
||||
(
|
||||
IsPlayerRace(t->GetModel()) ?
|
||||
"" :
|
||||
fmt::format(
|
||||
" Helmet Texture: {}",
|
||||
helmet_texture
|
||||
)
|
||||
)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
Executable
+67
@@ -0,0 +1,67 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetTime(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set time [Hour] [Minute]");
|
||||
|
||||
TimeOfDay_Struct world_time;
|
||||
zone->zone_time.GetCurrentEQTimeOfDay(time(0), &world_time);
|
||||
|
||||
auto time_string = fmt::format(
|
||||
"{} (Timezone: {})",
|
||||
Strings::ZoneTime(world_time.hour, world_time.minute),
|
||||
Strings::ZoneTime(zone->zone_time.getEQTimeZoneHr(), zone->zone_time.getEQTimeZoneHr())
|
||||
);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"It is currently {}.",
|
||||
time_string
|
||||
).c_str()
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
uint8 minutes = 0;
|
||||
uint8 hours = Strings::ToUnsignedInt(sep->arg[2]) + 1;
|
||||
|
||||
if (hours > 24) {
|
||||
hours = 24;
|
||||
}
|
||||
|
||||
uint8 real_hours = (
|
||||
(hours - 1) > 0 ?
|
||||
(hours - 1) :
|
||||
0
|
||||
);
|
||||
|
||||
if (sep->IsNumber(3)) {
|
||||
minutes = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
|
||||
if (minutes > 59) {
|
||||
minutes = 59;
|
||||
}
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Setting world time to {} (Timezone: {}).",
|
||||
Strings::ZoneTime(hours, minutes),
|
||||
Strings::ZoneTime(zone->zone_time.getEQTimeZoneHr(), zone->zone_time.getEQTimeZoneHr())
|
||||
).c_str()
|
||||
);
|
||||
|
||||
zone->SetTime(real_hours, minutes);
|
||||
|
||||
LogInfo(
|
||||
"{} :: Setting world time to {} (Timezone: {})",
|
||||
c->GetCleanName(),
|
||||
Strings::ZoneTime(hours, minutes),
|
||||
Strings::ZoneTime(zone->zone_time.getEQTimeZoneHr(), zone->zone_time.getEQTimeZoneHr())
|
||||
);
|
||||
}
|
||||
Executable
+58
@@ -0,0 +1,58 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetTimeZone(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #set time_zone [Hour] [Minute]");
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Current time zone is {}.",
|
||||
Strings::ZoneTime(zone->zone_time.getEQTimeZoneHr(), zone->zone_time.getEQTimeZoneMin())
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
uint8 minutes = 0;
|
||||
uint8 hours = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
|
||||
if (hours > 24) {
|
||||
hours = 24;
|
||||
}
|
||||
|
||||
uint8 real_hours = (
|
||||
(hours - 1) > 0 ?
|
||||
(hours - 1) :
|
||||
0
|
||||
);
|
||||
|
||||
if (sep->IsNumber(3)) {
|
||||
minutes = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
|
||||
if (minutes > 59) {
|
||||
minutes = 59;
|
||||
}
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Setting timezone to {}.",
|
||||
Strings::ZoneTime(hours, minutes)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
const int new_timezone = ((hours * 60) + minutes);
|
||||
zone->zone_time.setEQTimeZone(new_timezone);
|
||||
content_db.SetZoneTZ(zone->GetZoneID(), zone->GetInstanceVersion(), new_timezone);
|
||||
|
||||
auto outapp = new EQApplicationPacket(OP_TimeOfDay, sizeof(TimeOfDay_Struct));
|
||||
|
||||
auto t = (TimeOfDay_Struct *) outapp->pBuffer;
|
||||
zone->zone_time.GetCurrentEQTimeOfDay(time(0), t);
|
||||
|
||||
entity_list.QueueClients(c, outapp);
|
||||
safe_delete(outapp);
|
||||
}
|
||||
Executable
+55
@@ -0,0 +1,55 @@
|
||||
#include "../../client.h"
|
||||
#include "../../titles.h"
|
||||
|
||||
void SetTitle(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2) {
|
||||
c->Message(Chat::White, "Usage: #set title [Title]");
|
||||
c->Message(Chat::White, "Note: Use \"-1\" to remove title.");
|
||||
return;
|
||||
}
|
||||
|
||||
const bool is_remove = Strings::EqualFold(sep->argplus[2], "-1");
|
||||
std::string title = !is_remove ? sep->argplus[2] : "";
|
||||
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
if (title.size() > 31) {
|
||||
c->Message(Chat::White, "Title must be 31 characters or less.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!title.empty()) {
|
||||
Strings::FindReplace(title, "_", " ");
|
||||
}
|
||||
|
||||
if (is_remove) {
|
||||
t->SetAATitle(title);
|
||||
} else {
|
||||
title_manager.CreateNewPlayerTitle(t, title);
|
||||
}
|
||||
|
||||
t->Save();
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Title has been {}{} for {}{}",
|
||||
is_remove ? "removed" : "changed",
|
||||
!is_remove ? " and saved" : "",
|
||||
c->GetTargetDescription(t),
|
||||
(
|
||||
is_remove ?
|
||||
"." :
|
||||
fmt::format(
|
||||
" to '{}'.",
|
||||
title
|
||||
)
|
||||
)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -1,23 +1,21 @@
|
||||
#include "../client.h"
|
||||
#include "../titles.h"
|
||||
#include "../../client.h"
|
||||
#include "../../titles.h"
|
||||
|
||||
void command_titlesuffix(Client *c, const Seperator *sep)
|
||||
void SetTitleSuffix(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
const auto arguments = sep->argnum;
|
||||
if (!arguments) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #titlesuffix [Title Suffix] (use \"-1\" to remove title suffix)"
|
||||
);
|
||||
c->Message(Chat::White, "Usage: #set title_suffix [Title Suffix]");
|
||||
c->Message(Chat::White, "Note: Use \"-1\" to remove title.");
|
||||
return;
|
||||
}
|
||||
|
||||
bool is_remove = !strcasecmp(sep->argplus[1], "-1");
|
||||
const bool is_remove = !strcasecmp(sep->argplus[1], "-1");
|
||||
std::string suffix = is_remove ? "" : sep->argplus[1];
|
||||
|
||||
auto target = c;
|
||||
auto t = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
t = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
if (suffix.size() > 31) {
|
||||
@@ -30,12 +28,12 @@ void command_titlesuffix(Client *c, const Seperator *sep)
|
||||
}
|
||||
|
||||
if (is_remove) {
|
||||
target->SetTitleSuffix(suffix);
|
||||
t->SetTitleSuffix(suffix);
|
||||
} else {
|
||||
title_manager.CreateNewPlayerSuffix(target, suffix);
|
||||
title_manager.CreateNewPlayerSuffix(t, suffix);
|
||||
}
|
||||
|
||||
target->Save();
|
||||
t->Save();
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
@@ -43,7 +41,7 @@ void command_titlesuffix(Client *c, const Seperator *sep)
|
||||
"Title suffix has been {}{} for {}{}",
|
||||
is_remove ? "removed" : "changed",
|
||||
!is_remove ? " and saved" : "",
|
||||
c->GetTargetDescription(target),
|
||||
c->GetTargetDescription(t),
|
||||
(
|
||||
is_remove ?
|
||||
"." :
|
||||
@@ -1,27 +1,27 @@
|
||||
#include "../client.h"
|
||||
#include "../../client.h"
|
||||
|
||||
void command_weather(Client *c, const Seperator *sep)
|
||||
void SetWeather(Client *c, const Seperator *sep)
|
||||
{
|
||||
if (!sep->IsNumber(1)) {
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 2 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #weather [0|1|2] - [Off|Rain|Snow]");
|
||||
c->Message(Chat::White, "Usage: #weather 3 [Type] [Intensity] - Manually set weather type and intensity");
|
||||
return;
|
||||
}
|
||||
|
||||
int arguments = sep->argnum;
|
||||
if (arguments == 1) {
|
||||
auto new_weather = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[1]));
|
||||
uint8 new_intensity = 0;
|
||||
if (arguments == 2) {
|
||||
uint8 new_weather = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
uint8 new_intensity = 0;
|
||||
std::string weather_message = "The sky clears.";
|
||||
|
||||
if (new_weather == EQ::constants::WeatherTypes::Snowing) {
|
||||
weather_message = "Snowflakes begin to fall from the sky.";
|
||||
new_weather = EQ::constants::WeatherTypes::Snowing;
|
||||
new_intensity = 0x02;
|
||||
new_weather = EQ::constants::WeatherTypes::Snowing;
|
||||
new_intensity = 2;
|
||||
} else if (new_weather == EQ::constants::WeatherTypes::Raining) {
|
||||
weather_message = "Raindrops begin to fall from the sky.";
|
||||
new_weather = EQ::constants::WeatherTypes::Raining;
|
||||
new_intensity = 0x01; // This is how it's done in Fear, and you can see a decent distance with it at this value
|
||||
new_weather = EQ::constants::WeatherTypes::Raining;
|
||||
new_intensity = 1; // This is how it's done in Fear, and you can see a decent distance with it at this value
|
||||
}
|
||||
|
||||
zone->zone_weather = new_weather;
|
||||
@@ -35,21 +35,20 @@ void command_weather(Client *c, const Seperator *sep)
|
||||
outapp->pBuffer[4] = new_intensity;
|
||||
}
|
||||
|
||||
|
||||
c->Message(Chat::White, weather_message.c_str());
|
||||
entity_list.QueueClients(c, outapp);
|
||||
|
||||
safe_delete(outapp);
|
||||
} else if (arguments == 3) {
|
||||
auto command_type = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[1]));
|
||||
uint8 new_weather = EQ::constants::WeatherTypes::None;
|
||||
uint8 new_intensity = 0;
|
||||
} else if (arguments == 4) {
|
||||
const uint8 command_type = Strings::ToUnsignedInt(sep->arg[2]);
|
||||
uint8 new_weather = EQ::constants::WeatherTypes::None;
|
||||
uint8 new_intensity = 0;
|
||||
std::string weather_message;
|
||||
|
||||
if (zone->zone_weather == EQ::constants::WeatherTypes::None) {
|
||||
if (command_type > EQ::constants::WeatherTypes::Snowing) {
|
||||
new_weather = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[2]));
|
||||
new_intensity = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[3]));
|
||||
new_weather = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
new_intensity = Strings::ToUnsignedInt(sep->arg[4]);
|
||||
|
||||
weather_message = fmt::format(
|
||||
"Sending {} ({}) with an intensity of {}.",
|
||||
@@ -59,12 +58,12 @@ void command_weather(Client *c, const Seperator *sep)
|
||||
);
|
||||
} else if (command_type == EQ::constants::WeatherTypes::Snowing) {
|
||||
weather_message = "Snowflakes begin to fall from the sky.";
|
||||
new_weather = EQ::constants::WeatherTypes::Snowing;
|
||||
new_intensity = 0x02;
|
||||
new_weather = EQ::constants::WeatherTypes::Snowing;
|
||||
new_intensity = 2;
|
||||
} else if (command_type == EQ::constants::WeatherTypes::Raining) {
|
||||
weather_message = "Raindrops begin to fall from the sky.";
|
||||
new_weather = EQ::constants::WeatherTypes::Raining;
|
||||
new_intensity = 0x01; // This is how it's done in Fear, and you can see a decent distance with it at this value
|
||||
new_weather = EQ::constants::WeatherTypes::Raining;
|
||||
new_intensity = 1; // This is how it's done in Fear, and you can see a decent distance with it at this value
|
||||
}
|
||||
|
||||
zone->zone_weather = new_weather;
|
||||
@@ -86,7 +85,7 @@ void command_weather(Client *c, const Seperator *sep)
|
||||
|
||||
if (zone->zone_weather == EQ::constants::WeatherTypes::Snowing) {
|
||||
weather_message = "The sky clears as the snow stops falling.";
|
||||
outapp->pBuffer[0] = 0x01; // Snow has it's own shutoff packet
|
||||
outapp->pBuffer[0] = 1; // Snow has it's own shutoff packet
|
||||
} else if (zone->zone_weather == EQ::constants::WeatherTypes::Raining) {
|
||||
weather_message = "The sky clears as the rain ceases to fall.";
|
||||
}
|
||||
@@ -100,4 +99,3 @@ void command_weather(Client *c, const Seperator *sep)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Executable
+455
@@ -0,0 +1,455 @@
|
||||
#include "../../client.h"
|
||||
|
||||
void SetZoneData(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (arguments < 3) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone clipping [Minimum Clip] [Maximum Clip] [Fog Minimum Clip] [Fog Maximum Clip] [Permanent (0 = False, 1 = True)] (Permanent is optional)"
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone color [Red] [Green] [Blue] [Permanent (0 = False, 1 = True)] (Permanent is optional)"
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone header [Zone ID|Zone Short Name] [Version]"
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone locked [on|off] [Zone ID|Zone Short Name]"
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone safe_coordinates [X] [Y] [Z] [Heading] [Permanent (0 = False, 1 = True)] (Permanent is optional)"
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone sky [Sky Type] [Permanent (0 = False, 1 = True)] (Permanent is optional)"
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone underworld [Z] [Permanent (0 = False, 1 = True)] (Permanent is optional)"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const bool is_clipping = Strings::EqualFold(sep->arg[2], "clipping");
|
||||
const bool is_color = Strings::EqualFold(sep->arg[2], "color");
|
||||
const bool is_header = Strings::EqualFold(sep->arg[2], "header");
|
||||
const bool is_locked = Strings::EqualFold(sep->arg[2], "locked");
|
||||
const bool is_safe_coordinates = Strings::EqualFold(sep->arg[2], "safe_coordinates");
|
||||
const bool is_sky = Strings::EqualFold(sep->arg[2], "sky");
|
||||
const bool is_underworld = Strings::EqualFold(sep->arg[2], "underworld");
|
||||
|
||||
if (
|
||||
!is_clipping &&
|
||||
!is_color &&
|
||||
!is_header &&
|
||||
!is_locked &&
|
||||
!is_safe_coordinates &&
|
||||
!is_sky &&
|
||||
!is_underworld
|
||||
) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone clipping [Minimum Clip] [Maximum Clip] [Fog Minimum Clip] [Fog Maximum Clip] [Permanent (0 = False, 1 = True)] (Permanent is optional)"
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone color [Red] [Green] [Blue] [Permanent (0 = False, 1 = True)] (Permanent is optional)"
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone header [Zone ID|Zone Short Name] [Version]"
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone locked [on|off] [Zone ID|Zone Short Name]"
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone safe_coordinates [X] [Y] [Z] [Heading] [Permanent (0 = False, 1 = True)] (Permanent is optional)"
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone sky [Sky Type] [Permanent (0 = False, 1 = True)] (Permanent is optional)"
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Usage: #set zone underworld [Z] [Permanent (0 = False, 1 = True)] (Permanent is optional)"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_clipping) {
|
||||
const float minimum_clip = sep->arg[3] ? Strings::ToFloat(sep->arg[3]) : 0.0f;
|
||||
const float maximum_clip = sep->arg[4] ? Strings::ToFloat(sep->arg[4]) : 0.0f;
|
||||
const float minimum_fog_clip = sep->arg[5] ? Strings::ToFloat(sep->arg[5]) : 0.0f;
|
||||
const float maximum_fog_clip = sep->arg[6] ? Strings::ToFloat(sep->arg[6]) : 0.0f;
|
||||
const bool permanent = sep->arg[7] ? Strings::ToBool(sep->arg[7]) : false;
|
||||
|
||||
if (minimum_clip < 0.0f || maximum_clip < 0.0f) {
|
||||
c->Message(Chat::White, "Minimum Clip and Maximum Clip must be greater than or equal 0.0.");
|
||||
return;
|
||||
} else if (minimum_clip > maximum_clip) {
|
||||
c->Message(Chat::White, "Minimum Clip must be less than or equal to Maximum Clip!");
|
||||
return;
|
||||
} else {
|
||||
zone->newzone_data.minclip = minimum_clip;
|
||||
zone->newzone_data.maxclip = maximum_clip;
|
||||
|
||||
if (minimum_fog_clip) {
|
||||
for (float &fog_index: zone->newzone_data.fog_minclip) {
|
||||
fog_index = minimum_fog_clip;
|
||||
}
|
||||
}
|
||||
|
||||
if (maximum_fog_clip) {
|
||||
for (float &fog_index: zone->newzone_data.fog_maxclip) {
|
||||
fog_index = maximum_fog_clip;
|
||||
}
|
||||
}
|
||||
|
||||
if (permanent) {
|
||||
std::string query = fmt::format(
|
||||
"UPDATE zone SET minclip = {:.2f}, maxclip = {:.2f} WHERE zoneidnumber = {} AND version = {}",
|
||||
minimum_clip,
|
||||
maximum_clip,
|
||||
zone->GetZoneID(),
|
||||
zone->GetInstanceVersion()
|
||||
);
|
||||
|
||||
database.QueryDatabase(query);
|
||||
|
||||
if (minimum_fog_clip) {
|
||||
query = fmt::format(
|
||||
"UPDATE zone SET fog_minclip = {:.2f} WHERE zoneidnumber = {} AND version = {}",
|
||||
minimum_fog_clip,
|
||||
zone->GetZoneID(),
|
||||
zone->GetInstanceVersion()
|
||||
);
|
||||
database.QueryDatabase(query);
|
||||
}
|
||||
|
||||
if (maximum_fog_clip) {
|
||||
query = fmt::format(
|
||||
"UPDATE zone SET fog_maxclip = {:.2f} WHERE zoneidnumber = {} AND version = {}",
|
||||
maximum_fog_clip,
|
||||
zone->GetZoneID(),
|
||||
zone->GetInstanceVersion()
|
||||
);
|
||||
database.QueryDatabase(query);
|
||||
}
|
||||
}
|
||||
|
||||
auto outapp = new EQApplicationPacket(OP_NewZone, sizeof(NewZone_Struct));
|
||||
memcpy(outapp->pBuffer, &zone->newzone_data, outapp->size);
|
||||
entity_list.QueueClients(c, outapp);
|
||||
safe_delete(outapp);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Clipping Changed | Zone: {} Permanent: {}",
|
||||
zone->GetZoneDescription(),
|
||||
permanent ? "Yes" : "No"
|
||||
).c_str()
|
||||
);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Clipping Changed | Minimum Clip: {:.2f} Maximum Clip: {:.2f}",
|
||||
minimum_clip,
|
||||
maximum_clip
|
||||
).c_str()
|
||||
);
|
||||
|
||||
if (minimum_fog_clip || maximum_fog_clip) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Clipping Changed | Fog Minimum Clip: {:.2f} Fog Maximum Clip: {:.2f}",
|
||||
minimum_fog_clip,
|
||||
maximum_fog_clip
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
} else if (is_color) {
|
||||
if (
|
||||
arguments < 3 ||
|
||||
!sep->IsNumber(3) ||
|
||||
!sep->IsNumber(4) ||
|
||||
!sep->IsNumber(5)
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #set zone color [Red] [Green] [Blue] [Permanent (0 = False, 1 = True)]");
|
||||
return;
|
||||
}
|
||||
|
||||
const uint8 red = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
const uint8 green = Strings::ToUnsignedInt(sep->arg[4]);
|
||||
const uint8 blue = Strings::ToUnsignedInt(sep->arg[5]);
|
||||
const bool permanent = sep->arg[6] ? Strings::ToBool(sep->arg[6]) : false;
|
||||
|
||||
if (
|
||||
!EQ::ValueWithin(red, 0, UINT8_MAX) ||
|
||||
!EQ::ValueWithin(green, 0, UINT8_MAX) ||
|
||||
!EQ::ValueWithin(blue, 0, UINT8_MAX)
|
||||
) {
|
||||
c->Message(Chat::White, "Colors cannot be less than 0 or greater than 255.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (permanent) {
|
||||
const std::string& query = fmt::format(
|
||||
"UPDATE zone SET fog_red = {}, fog_green = {}, fog_blue = {} "
|
||||
"WHERE zoneidnumber = {} AND version = {}",
|
||||
red,
|
||||
green,
|
||||
blue,
|
||||
zone->GetZoneID(),
|
||||
zone->GetInstanceVersion()
|
||||
);
|
||||
database.QueryDatabase(query);
|
||||
}
|
||||
|
||||
for (uint8 fog_index = 0; fog_index < 4; fog_index++) {
|
||||
zone->newzone_data.fog_red[fog_index] = red;
|
||||
zone->newzone_data.fog_green[fog_index] = green;
|
||||
zone->newzone_data.fog_blue[fog_index] = blue;
|
||||
}
|
||||
|
||||
auto outapp = new EQApplicationPacket(OP_NewZone, sizeof(NewZone_Struct));
|
||||
memcpy(outapp->pBuffer, &zone->newzone_data, outapp->size);
|
||||
entity_list.QueueClients(c, outapp);
|
||||
safe_delete(outapp);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Fog Color Changed | Zone: {} Red: {} Green: {} Blue: {} Permanent: {}",
|
||||
zone->GetZoneDescription(),
|
||||
red,
|
||||
green,
|
||||
blue,
|
||||
permanent ? "Yes" : "No"
|
||||
).c_str()
|
||||
);
|
||||
} else if (is_header) {
|
||||
if (arguments < 3) {
|
||||
c->Message(Chat::White, "Usage: #set zone header [Zone ID|Zone Short Name] [Version]");
|
||||
return;
|
||||
}
|
||||
|
||||
const auto zone_id = (
|
||||
sep->IsNumber(3) ?
|
||||
Strings::ToUnsignedInt(sep->arg[3]) :
|
||||
ZoneID(sep->arg[3])
|
||||
);
|
||||
if (!zone_id) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Zone ID {} could not be found.",
|
||||
zone_id
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const std::string& zone_short_name = ZoneName(zone_id);
|
||||
const std::string& zone_long_name = ZoneLongName(zone_id);
|
||||
const auto version = (
|
||||
sep->IsNumber(4) ?
|
||||
Strings::ToUnsignedInt(sep->arg[4]) :
|
||||
0
|
||||
);
|
||||
|
||||
auto outapp = new EQApplicationPacket(OP_NewZone, sizeof(NewZone_Struct));
|
||||
memcpy(outapp->pBuffer, &zone->newzone_data, outapp->size);
|
||||
entity_list.QueueClients(c, outapp);
|
||||
safe_delete(outapp);
|
||||
|
||||
zone_store.LoadZones(content_db);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Zone Header Load {} | Zone: {} ({}){}",
|
||||
(
|
||||
zone->LoadZoneCFG(zone_short_name.c_str(), version) ?
|
||||
"Succeeded" :
|
||||
"Failed"
|
||||
),
|
||||
zone_long_name,
|
||||
zone_short_name,
|
||||
(
|
||||
version ?
|
||||
fmt::format(
|
||||
" Version: {}",
|
||||
version
|
||||
) :
|
||||
""
|
||||
)
|
||||
).c_str()
|
||||
);
|
||||
} else if (is_locked) {
|
||||
if (arguments < 4) {
|
||||
c->Message(Chat::White, "Usage: #set zone locked [on|off] [Zone ID|Zone Short Name]");
|
||||
return;
|
||||
}
|
||||
|
||||
const bool is_locked = Strings::ToBool(sep->arg[3]);
|
||||
|
||||
const uint32 zone_id = (
|
||||
sep->IsNumber(4) ?
|
||||
Strings::ToUnsignedInt(sep->arg[4]) :
|
||||
ZoneID(sep->arg[4])
|
||||
);
|
||||
const std::string& zone_short_name = Strings::ToLower(ZoneName(zone_id, true));
|
||||
|
||||
const bool is_unknown_zone = Strings::EqualFold(zone_short_name, "unknown");
|
||||
if (!zone_id || is_unknown_zone) {
|
||||
c->Message(Chat::White, "Usage: #set zone locked [on|off] [Zone ID|Zone Short Name]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto pack = new ServerPacket(ServerOP_LockZone, sizeof(ServerLockZone_Struct));
|
||||
|
||||
auto l = (ServerLockZone_Struct *) pack->pBuffer;
|
||||
strn0cpy(l->adminname, c->GetName(), sizeof(l->adminname));
|
||||
l->op = is_locked ? ServerLockType::Lock : ServerLockType::Unlock;
|
||||
l->zoneID = zone_id;
|
||||
|
||||
worldserver.SendPacket(pack);
|
||||
safe_delete(pack);
|
||||
} else if (is_safe_coordinates) {
|
||||
if (
|
||||
arguments < 3 ||
|
||||
!sep->IsNumber(3) ||
|
||||
!sep->IsNumber(4) ||
|
||||
!sep->IsNumber(5)
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #set zone safe_coordinates [X] [Y] [Z] [Heading] [Permanent (0 = False, 1 = True)]");
|
||||
c->Message(Chat::White, "Not sending Heading defaults to current Heading and the change is temporary.");
|
||||
return;
|
||||
}
|
||||
|
||||
const float x = Strings::ToFloat(sep->arg[3]);
|
||||
const float y = Strings::ToFloat(sep->arg[4]);
|
||||
const float z = Strings::ToFloat(sep->arg[5]);
|
||||
const float heading = sep->arg[6] ? Strings::ToFloat(sep->arg[6]) : c->GetHeading();
|
||||
const bool permanent = sep->arg[7] ? Strings::ToBool(sep->arg[7]) : false;
|
||||
|
||||
if (permanent) {
|
||||
const std::string& query = fmt::format(
|
||||
"UPDATE zone SET safe_x = {:.2f}, safe_y = {:.2f}, safe_z = {:.2f}, safe_heading = {:.2f} WHERE zoneidnumber = {} AND version = {}",
|
||||
x,
|
||||
y,
|
||||
z,
|
||||
heading,
|
||||
zone->GetZoneID(),
|
||||
zone->GetInstanceVersion()
|
||||
);
|
||||
database.QueryDatabase(query);
|
||||
}
|
||||
|
||||
zone->newzone_data.safe_x = x;
|
||||
zone->newzone_data.safe_y = y;
|
||||
zone->newzone_data.safe_z = z;
|
||||
|
||||
auto outapp = new EQApplicationPacket(OP_NewZone, sizeof(NewZone_Struct));
|
||||
memcpy(outapp->pBuffer, &zone->newzone_data, outapp->size);
|
||||
entity_list.QueueClients(c, outapp);
|
||||
safe_delete(outapp);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Safe Coordinates Changed | Zone: {} XYZ: {:.2f}, {:.2f}, {:.2f} Heading: {:.2f} Permanent: {} ",
|
||||
zone->GetZoneDescription(),
|
||||
x,
|
||||
y,
|
||||
z,
|
||||
heading,
|
||||
permanent ? "Yes" : "No"
|
||||
).c_str()
|
||||
);
|
||||
} else if (is_sky) {
|
||||
if (arguments < 3 || !sep->IsNumber(3)) {
|
||||
c->Message(Chat::White, "Usage: #set zone sky [Sky Type] [Permanent (0 = False, 1 = True)]");
|
||||
return;
|
||||
}
|
||||
|
||||
const uint8 sky_type = Strings::ToUnsignedInt(sep->arg[3]);
|
||||
const bool permanent = sep->arg[4] ? Strings::ToBool(sep->arg[4]) : false;
|
||||
|
||||
if (!EQ::ValueWithin(sky_type, 0, UINT8_MAX)) {
|
||||
c->Message(Chat::White, "Sky Type cannot be less than 0 or greater than 255!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (permanent) {
|
||||
const std::string& query = fmt::format(
|
||||
"UPDATE zone SET sky = {} WHERE zoneidnumber = {} AND version = {}",
|
||||
sky_type,
|
||||
zone->GetZoneID(),
|
||||
zone->GetInstanceVersion()
|
||||
);
|
||||
database.QueryDatabase(query);
|
||||
}
|
||||
|
||||
zone->newzone_data.sky = sky_type;
|
||||
auto outapp = new EQApplicationPacket(OP_NewZone, sizeof(NewZone_Struct));
|
||||
memcpy(outapp->pBuffer, &zone->newzone_data, outapp->size);
|
||||
entity_list.QueueClients(c, outapp);
|
||||
safe_delete(outapp);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Sky Changed | Zone: {} Sky Type: {} Permanent: {}",
|
||||
zone->GetZoneDescription(),
|
||||
sky_type,
|
||||
permanent ? "Yes" : "No"
|
||||
).c_str()
|
||||
);
|
||||
} else if (is_underworld) {
|
||||
if (arguments < 3 || !sep->IsNumber(3)) {
|
||||
c->Message(Chat::White, "Usage: #set zone underworld [Z] [Permanent (0 = False, 1 = True)]");
|
||||
return;
|
||||
}
|
||||
|
||||
const float z = Strings::ToFloat(sep->arg[3]);
|
||||
const bool permanent = sep->arg[4] ? Strings::ToBool(sep->arg[4]) : false;
|
||||
|
||||
if (permanent) {
|
||||
auto query = fmt::format(
|
||||
"UPDATE zone SET underworld = {:.2f} WHERE zoneidnumber = {} AND version = {}",
|
||||
z,
|
||||
zone->GetZoneID(),
|
||||
zone->GetInstanceVersion()
|
||||
);
|
||||
database.QueryDatabase(query);
|
||||
}
|
||||
|
||||
zone->newzone_data.underworld = z;
|
||||
auto outapp = new EQApplicationPacket(OP_NewZone, sizeof(NewZone_Struct));
|
||||
memcpy(outapp->pBuffer, &zone->newzone_data, outapp->size);
|
||||
entity_list.QueueClients(c, outapp);
|
||||
safe_delete(outapp);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Underworld Z Changed | Zone: {} Z: {:.2f} Permanent: {}",
|
||||
zone->GetZoneDescription(),
|
||||
z,
|
||||
permanent ? "Yes" : "No"
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
#include "../client.h"
|
||||
#include "../../common/data_verification.h"
|
||||
|
||||
void command_set_adventure_points(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
|
||||
if (
|
||||
!arguments ||
|
||||
!sep->IsNumber(1) ||
|
||||
!sep->IsNumber(2)
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #setadventurepoints [Theme] [Points]");
|
||||
c->Message(Chat::White, "Valid themes are as follows.");
|
||||
auto theme_map = EQ::constants::GetLDoNThemeMap();
|
||||
for (const auto& theme : theme_map) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Theme {} | {}",
|
||||
theme.first,
|
||||
theme.second
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
c->Message(Chat::White, "Note: Theme 0 splits the points evenly across all Themes.");
|
||||
return;
|
||||
}
|
||||
|
||||
auto target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
auto theme_id = Strings::ToUnsignedInt(sep->arg[1]);
|
||||
if (!EQ::ValueWithin(theme_id, LDoNThemes::Unused, LDoNThemes::TAK)) {
|
||||
c->Message(Chat::White, "Valid themes are as follows.");
|
||||
auto& theme_map = EQ::constants::GetLDoNThemeMap();
|
||||
for (const auto& theme : theme_map) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Theme {} | {}",
|
||||
theme.first,
|
||||
theme.second
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
c->Message(Chat::White, "Note: Theme 0 splits the points evenly across all Themes.");
|
||||
return;
|
||||
}
|
||||
|
||||
auto points = Strings::ToInt(sep->arg[2]);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} for {}.",
|
||||
(
|
||||
theme_id == LDoNThemes::Unused ?
|
||||
fmt::format(
|
||||
"Splitting {} Points Evenly",
|
||||
points
|
||||
) :
|
||||
fmt::format(
|
||||
"Adding {} {} Points",
|
||||
points,
|
||||
EQ::constants::GetLDoNThemeName(theme_id)
|
||||
)
|
||||
),
|
||||
c->GetTargetDescription(target)
|
||||
).c_str()
|
||||
);
|
||||
|
||||
target->UpdateLDoNPoints(theme_id, points);
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
#include "../client.h"
|
||||
#include "../groups.h"
|
||||
#include "../raids.h"
|
||||
#include "../raids.h"
|
||||
|
||||
void command_setaapts(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (arguments <= 1 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #setaapts [AA|Group|Raid] [AA Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
Client *target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
std::string aa_type = Strings::ToLower(sep->arg[1]);
|
||||
std::string group_raid_string;
|
||||
uint32 aa_points = static_cast<uint32>(std::min(Strings::ToUnsignedBigInt(sep->arg[2]), (uint64) 2000000000));
|
||||
bool is_aa = aa_type.find("aa") != std::string::npos;
|
||||
bool is_group = aa_type.find("group") != std::string::npos;
|
||||
bool is_raid = aa_type.find("raid") != std::string::npos;
|
||||
if (!is_aa && !is_group && !is_raid) {
|
||||
c->Message(Chat::White, "Usage: #setaapts [AA|Group|Raid] [AA Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_aa) {
|
||||
target->GetPP().aapoints = aa_points;
|
||||
target->GetPP().expAA = 0;
|
||||
target->SendAlternateAdvancementStats();
|
||||
}
|
||||
else if (is_group || is_raid) {
|
||||
if (is_group) {
|
||||
group_raid_string = "Group ";
|
||||
target->GetPP().group_leadership_points = aa_points;
|
||||
target->GetPP().group_leadership_exp = 0;
|
||||
}
|
||||
else if (is_raid) {
|
||||
group_raid_string = "Raid ";
|
||||
target->GetPP().raid_leadership_points = aa_points;
|
||||
target->GetPP().raid_leadership_exp = 0;
|
||||
}
|
||||
target->SendLeadershipEXPUpdate();
|
||||
}
|
||||
|
||||
std::string aa_message = fmt::format(
|
||||
"{} now {} {} {}AA Point{}.",
|
||||
c->GetTargetDescription(target, TargetDescriptionType::UCYou),
|
||||
c == target ? "have" : "has",
|
||||
aa_points,
|
||||
group_raid_string,
|
||||
aa_points != 1 ? "s" : ""
|
||||
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
aa_message.c_str()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
#include "../client.h"
|
||||
#include "../groups.h"
|
||||
#include "../raids.h"
|
||||
#include "../raids.h"
|
||||
|
||||
void command_setaaxp(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (arguments <= 1 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #setaaxp [AA|Group|Raid] [AA Experience]");
|
||||
return;
|
||||
}
|
||||
|
||||
Client *target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
std::string aa_type = Strings::ToLower(sep->arg[1]);
|
||||
std::string group_raid_string;
|
||||
uint32 aa_experience = static_cast<uint32>(std::min(
|
||||
Strings::ToUnsignedBigInt(sep->arg[2]),
|
||||
(uint64) 2000000000
|
||||
));
|
||||
bool is_aa = aa_type.find("aa") != std::string::npos;
|
||||
bool is_group = aa_type.find("group") != std::string::npos;
|
||||
bool is_raid = aa_type.find("raid") != std::string::npos;
|
||||
if (!is_aa && !is_group && !is_raid) {
|
||||
c->Message(Chat::White, "Usage: #setaaxp [AA|Group|Raid] [AA Experience]");
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_aa) {
|
||||
target->SetEXP(
|
||||
target->GetEXP(),
|
||||
aa_experience,
|
||||
false
|
||||
);
|
||||
}
|
||||
else if (is_group) {
|
||||
group_raid_string = "Group ";
|
||||
target->SetLeadershipEXP(
|
||||
aa_experience,
|
||||
target->GetRaidEXP()
|
||||
);
|
||||
}
|
||||
else if (is_raid) {
|
||||
group_raid_string = "Raid ";
|
||||
target->SetLeadershipEXP(
|
||||
target->GetGroupEXP(),
|
||||
aa_experience
|
||||
);
|
||||
}
|
||||
|
||||
std::string aa_exp_message = fmt::format(
|
||||
"{} now {} {} {}AA Experience.",
|
||||
c->GetTargetDescription(target, TargetDescriptionType::UCYou),
|
||||
c == target ? "have" : "has",
|
||||
aa_experience,
|
||||
group_raid_string
|
||||
);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
aa_exp_message.c_str()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_setaltcurrency(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (
|
||||
arguments < 2 ||
|
||||
!sep->IsNumber(1) ||
|
||||
!sep->IsNumber(2)
|
||||
) {
|
||||
c->Message(Chat::White, "Command Syntax: #setaltcurrency [Currency ID] [Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
auto currency_id = Strings::ToUnsignedInt(sep->arg[1]);
|
||||
auto amount = static_cast<int>(std::min(Strings::ToBigInt(sep->arg[2]), (int64) 2000000000));
|
||||
uint32 currency_item_id = zone->GetCurrencyItemID(currency_id);
|
||||
if (!currency_item_id) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Currency ID {} could not be found.",
|
||||
currency_id
|
||||
).c_str()
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
target->SetAlternateCurrencyValue(currency_id, amount);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} now {} {} {}.",
|
||||
c->GetTargetDescription(target, TargetDescriptionType::UCYou),
|
||||
c == target ? "have" : "has",
|
||||
(
|
||||
amount ?
|
||||
std::to_string(amount) :
|
||||
"no"
|
||||
),
|
||||
database.CreateItemLink(currency_item_id)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_setanim(Client *c, const Seperator *sep)
|
||||
{
|
||||
const auto arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #setanim [Animation ID]");
|
||||
|
||||
uint32 animation_number = 1;
|
||||
for (const auto& a : EQ::constants::GetSpawnAnimationMap()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Animation {} | ID: {} Name: {}",
|
||||
animation_number,
|
||||
a.first,
|
||||
a.second
|
||||
).c_str()
|
||||
);
|
||||
|
||||
animation_number++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Mob* target = c;
|
||||
if (c->GetTarget()) {
|
||||
target = c->GetTarget();
|
||||
}
|
||||
|
||||
const auto animation_id = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[1]));
|
||||
if (
|
||||
!EQ::ValueWithin(
|
||||
animation_id,
|
||||
static_cast<uint8>(eaStanding),
|
||||
static_cast<uint8>(eaLooting)
|
||||
)
|
||||
) {
|
||||
c->Message(Chat::White, "Usage: #setanim [Animation ID]");
|
||||
|
||||
uint32 animation_number = 1;
|
||||
for (const auto& a : EQ::constants::GetSpawnAnimationMap()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Animation {} | ID: {} Name: {}",
|
||||
animation_number,
|
||||
a.first,
|
||||
a.second
|
||||
).c_str()
|
||||
);
|
||||
|
||||
animation_number++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
target->SetAppearance(static_cast<EmuAppearance>(animation_id), false);
|
||||
|
||||
const auto animation_name = EQ::constants::GetSpawnAnimationName(animation_id);
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set animation to {} ({}) for {}.",
|
||||
animation_name,
|
||||
animation_id,
|
||||
c->GetTargetDescription(target)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_setcrystals(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (arguments <= 1 || !sep->IsNumber(2)) {
|
||||
c->Message(Chat::White, "Usage: #setcrystals [Ebon|Radiant] [Crystal Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
Client *target = c;
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
target = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
std::string crystal_type = Strings::ToLower(sep->arg[1]);
|
||||
uint32 crystal_amount = static_cast<uint32>(std::min(
|
||||
Strings::ToUnsignedBigInt(sep->arg[2]),
|
||||
(uint64) 2000000000
|
||||
));
|
||||
bool is_ebon = crystal_type.find("ebon") != std::string::npos;
|
||||
bool is_radiant = crystal_type.find("radiant") != std::string::npos;
|
||||
if (!is_ebon && !is_radiant) {
|
||||
c->Message(Chat::White, "Usage: #setcrystals [Ebon|Radiant] [Crystal Amount]");
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 crystal_item_id = (
|
||||
is_ebon ?
|
||||
RuleI(Zone, EbonCrystalItemID) :
|
||||
RuleI(Zone, RadiantCrystalItemID)
|
||||
);
|
||||
|
||||
auto crystal_link = database.CreateItemLink(crystal_item_id);
|
||||
if (is_radiant) {
|
||||
target->SetRadiantCrystals(crystal_amount);
|
||||
} else {
|
||||
target->SetEbonCrystals(crystal_amount);
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"{} now {} {} {}.",
|
||||
c->GetTargetDescription(target, TargetDescriptionType::UCYou),
|
||||
c == target ? "have" : "has",
|
||||
crystal_amount,
|
||||
crystal_link
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_setendurance(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #setendurance [Endurance]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto endurance = static_cast<int>(std::min(Strings::ToBigInt(sep->arg[1]), (int64) 2000000000));
|
||||
bool set_to_max = false;
|
||||
Mob* target = c;
|
||||
if (c->GetTarget()) {
|
||||
target = c->GetTarget();
|
||||
}
|
||||
|
||||
if (target->IsClient()) {
|
||||
if (endurance >= target->CastToClient()->GetMaxEndurance()) {
|
||||
endurance = target->CastToClient()->GetMaxEndurance();
|
||||
set_to_max = true;
|
||||
}
|
||||
|
||||
target->CastToClient()->SetEndurance(endurance);
|
||||
} else {
|
||||
if (endurance >= target->GetMaxEndurance()) {
|
||||
endurance = target->GetMaxEndurance();
|
||||
set_to_max = true;
|
||||
}
|
||||
|
||||
target->SetEndurance(endurance);
|
||||
}
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} to {} Endurance{}.",
|
||||
c->GetTargetDescription(target),
|
||||
(
|
||||
set_to_max ?
|
||||
"full" :
|
||||
std::to_string(endurance)
|
||||
),
|
||||
(
|
||||
set_to_max ?
|
||||
fmt::format(
|
||||
" ({})",
|
||||
endurance
|
||||
) :
|
||||
""
|
||||
)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_setfaction(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #setfaction [Faction ID]");
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
!c->GetTarget() ||
|
||||
(
|
||||
c->GetTarget() &&
|
||||
c->GetTarget()->IsClient()
|
||||
)
|
||||
) {
|
||||
c->Message(Chat::White, "You must target an NPC to use this command.");
|
||||
return;
|
||||
}
|
||||
|
||||
NPC* target = c->GetTarget()->CastToNPC();
|
||||
auto npc_id = target->GetNPCTypeID();
|
||||
auto faction_id = Strings::ToInt(sep->arg[1]);
|
||||
auto faction_name = content_db.GetFactionName(faction_id);
|
||||
if (!faction_name.empty()) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Faction Changed | Name: {} ({}) Faction: {} ({}).",
|
||||
target->GetCleanName(),
|
||||
npc_id,
|
||||
content_db.GetFactionName(faction_id),
|
||||
faction_id
|
||||
).c_str()
|
||||
);
|
||||
|
||||
std::string query = fmt::format(
|
||||
"UPDATE npc_types SET npc_faction_id = {} WHERE id = {}",
|
||||
faction_id,
|
||||
npc_id
|
||||
);
|
||||
content_db.QueryDatabase(query);
|
||||
} else {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
"Invalid Faction ID, please specify a valid Faction ID."
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
#include "../client.h"
|
||||
|
||||
void command_sethp(Client *c, const Seperator *sep)
|
||||
{
|
||||
int arguments = sep->argnum;
|
||||
if (!arguments || !sep->IsNumber(1)) {
|
||||
c->Message(Chat::White, "Usage: #sethp [Health]");
|
||||
return;
|
||||
}
|
||||
|
||||
auto health = static_cast<int>(std::min(Strings::ToBigInt(sep->arg[1]), (int64) 2000000000));
|
||||
bool set_to_max = false;
|
||||
Mob* target = c;
|
||||
if (c->GetTarget()) {
|
||||
target = c->GetTarget();
|
||||
}
|
||||
|
||||
if (health >= target->GetMaxHP()) {
|
||||
health = target->GetMaxHP();
|
||||
set_to_max = true;
|
||||
}
|
||||
|
||||
target->SetHP(health);
|
||||
target->SendHPUpdate();
|
||||
|
||||
c->Message(
|
||||
Chat::White,
|
||||
fmt::format(
|
||||
"Set {} to {} Health{}.",
|
||||
c->GetTargetDescription(target),
|
||||
(
|
||||
set_to_max ?
|
||||
"full" :
|
||||
std::to_string(health)
|
||||
),
|
||||
(
|
||||
set_to_max ?
|
||||
fmt::format(
|
||||
" ({})",
|
||||
health
|
||||
) :
|
||||
""
|
||||
)
|
||||
).c_str()
|
||||
);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user