Alex King 7e23d798d5
[Commands] Cleanup #fixmob Command (#3828)
# Notes
- Cleanup messages and logic.
2024-01-06 22:29:40 -06:00

287 lines
7.6 KiB
C++
Executable File

#include "../client.h"
void command_fixmob(Client *c, const Seperator *sep)
{
const int arguments = sep->argnum;
if (arguments < 2) {
SendFixMobSubCommands(c);
return;
}
Mob* t = c;
if (c->GetTarget()) {
t = c->GetTarget();
}
const std::string& type = sep->arg[1];
const std::string& move_type = Strings::ToLower(sep->arg[2]);
std::string change_type;
std::string change_value;
const bool is_next = move_type[0] == 'n';
const bool is_previous = move_type[0] == 'p';
const uint32 adjustment = is_next ? 1 : -1;
uint16 race_id = t->GetRace();
uint8 gender_id = t->GetGender();
uint8 texture = UINT8_MAX;
uint8 helm_texture = UINT8_MAX;
uint8 hair_color = t->GetHairColor();
uint8 beard_color = t->GetBeardColor();
uint8 eye_color_1 = t->GetEyeColor1();
uint8 eye_color_2 = t->GetEyeColor2();
uint8 hair_style = t->GetHairStyle();
uint8 face = t->GetLuclinFace();
uint8 beard_style = t->GetBeard();
uint8 drakkin_heritage = t->GetDrakkinHeritage();
uint8 drakkin_tattoo = t->GetDrakkinTattoo();
uint8 drakkin_details = t->GetDrakkinDetails();
const bool is_beard = Strings::EqualFold(type, "beard");
const bool is_beard_color = Strings::EqualFold(type, "beard_color");
const bool is_drakkin_details = Strings::EqualFold(type, "drakkin_details");
const bool is_drakkin_heritage = Strings::EqualFold(type, "drakkin_heritage");
const bool is_drakkin_tattoo = Strings::EqualFold(type, "drakkin_tattoo");
const bool is_face = Strings::EqualFold(type, "face");
const bool is_gender = Strings::EqualFold(type, "gender");
const bool is_hair = Strings::EqualFold(type, "hair");
const bool is_hair_color = Strings::EqualFold(type, "hair_color");
const bool is_helm = Strings::EqualFold(type, "helm");
const bool is_race = Strings::EqualFold(type, "race");
const bool is_texture = Strings::EqualFold(type, "texture");
if (
!is_beard &&
!is_beard_color &&
!is_drakkin_details &&
!is_drakkin_heritage &&
!is_drakkin_tattoo &&
!is_face &&
!is_gender &&
!is_hair &&
!is_hair_color &&
!is_helm &&
!is_race &&
!is_texture
) {
SendFixMobSubCommands(c);
return;
}
if (is_race) {
if (race_id == Race::Human && is_previous) {
race_id = RuleI(NPC, MaxRaceID);
} else if (race_id >= RuleI(NPC, MaxRaceID) && is_next) {
race_id = Race::Human;
} else {
race_id += adjustment;
}
change_type = "Race";
change_value = std::to_string(race_id);
} else if (is_gender) {
if (gender_id == Gender::Male && is_previous) {
gender_id = Gender::Neuter;
} else if (gender_id >= Gender::Neuter && is_next) {
gender_id = Gender::Male;
} else {
gender_id += adjustment;
}
change_type = "Gender";
change_value = std::to_string(gender_id);
} else if (is_texture) {
texture = t->GetTexture();
if (texture == 0 && is_previous) {
texture = 25;
} else if (texture >= 25 && is_next) {
texture = 0;
} else {
texture += adjustment;
}
change_type = "Texture";
change_value = std::to_string(texture);
} else if (is_helm) {
helm_texture = t->GetHelmTexture();
if (helm_texture == 0 && is_previous) {
helm_texture = 25;
} else if (helm_texture >= 25 && is_next) {
helm_texture = 0;
} else {
helm_texture += adjustment;
}
change_type = "Helm Texture";
change_value = std::to_string(helm_texture);
} else if (is_face) {
if (face == 0 && is_previous) {
face = 87;
} else if (face >= 87 && is_next) {
face = 0;
} else {
face += adjustment;
}
change_type = "Face";
change_value = std::to_string(face);
} else if (is_hair) {
if (hair_style == 0 && is_previous) {
hair_style = 8;
} else if (hair_style >= 8 && is_next) {
hair_style = 0;
} else {
hair_style += adjustment;
}
change_type = "Hair Style";
change_value = std::to_string(hair_style);
} else if (is_hair_color) {
if (hair_color == 0 && is_previous) {
hair_color = 24;
} else if (hair_color >= 24 && is_next) {
hair_color = 0;
} else {
hair_color += adjustment;
}
change_type = "Hair Color";
change_value = std::to_string(hair_color);
} else if (is_beard) {
if (beard_style == 0 && is_previous) {
beard_style = 11;
} else if (beard_style >= 11 && is_next) {
beard_style = 0;
} else {
beard_style += adjustment;
}
change_type = "Beard Style";
change_value = std::to_string(beard_style);
} else if (is_beard_color) {
if (beard_color == 0 && is_previous) {
beard_color = 24;
} else if (beard_color >= 24 && is_next) {
beard_color = 0;
} else {
beard_color += adjustment;
}
change_type = "Beard Color";
change_value = std::to_string(beard_color);
} else if (is_drakkin_heritage) {
if (drakkin_heritage == 0 && is_previous) {
drakkin_heritage = 6;
} else if (drakkin_heritage >= 6 && is_next) {
drakkin_heritage = 0;
} else {
drakkin_heritage += adjustment;
}
change_type = "Drakkin Heritage";
change_value = std::to_string(drakkin_heritage);
} else if (is_drakkin_tattoo) {
if (drakkin_tattoo == 0 && is_previous) {
drakkin_tattoo = 8;
} else if (drakkin_tattoo >= 8 && is_next) {
drakkin_tattoo = 0;
} else {
drakkin_tattoo += adjustment;
}
change_type = "Drakkin Tattoo";
change_value = std::to_string(drakkin_tattoo);
} else if (is_drakkin_details) {
if (drakkin_details == 0 && is_previous) {
drakkin_details = 7;
} else if (drakkin_details >= 7 && is_next) {
drakkin_details = 0;
} else {
drakkin_details += adjustment;
}
change_type = "Drakkin Details";
change_value = std::to_string(drakkin_details);
}
switch (race_id) {
case Race::Barbarian: {
if (face > 10) {
face -= ((drakkin_tattoo - 1) * 10);
}
face += (drakkin_tattoo * 10);
break;
}
case Race::Erudite: {
if (face > 10) {
face -= ((hair_style - 1) * 10);
}
face += (hair_style * 10);
break;
}
case Race::HighElf:
case Race::DarkElf:
case Race::HalfElf: {
if (face > 10) {
face -= ((beard_style - 1) * 10);
}
face += (beard_style * 10);
break;
}
default: {
break;
}
}
t->SendIllusionPacket(
AppearanceStruct{
.beard = beard_style,
.beard_color = beard_color,
.drakkin_details = drakkin_details,
.drakkin_heritage = drakkin_heritage,
.drakkin_tattoo = drakkin_tattoo,
.eye_color_one = eye_color_1,
.eye_color_two = eye_color_2,
.face = face,
.gender_id = gender_id,
.hair = hair_style,
.hair_color = hair_color,
.helmet_texture = helm_texture,
.race_id = race_id,
.texture = texture,
}
);
c->Message(
Chat::White,
fmt::format(
"Appearance for {} | Type: {} Value: {}",
c->GetTargetDescription(t, TargetDescriptionType::UCSelf),
change_type,
change_value
).c_str()
);
}
void SendFixMobSubCommands(Client *c)
{
c->Message(Chat::White, "Usage: #fixmob beard [Next|Previous]");
c->Message(Chat::White, "Usage: #fixmob beard_color [Next|Previous]");
c->Message(Chat::White, "Usage: #fixmob drakkin_details [Next|Previous]");
c->Message(Chat::White, "Usage: #fixmob drakkin_heritage [Next|Previous]");
c->Message(Chat::White, "Usage: #fixmob drakkin_tattoo [Next|Previous]");
c->Message(Chat::White, "Usage: #fixmob face [Next|Previous]");
c->Message(Chat::White, "Usage: #fixmob gender [Next|Previous]");
c->Message(Chat::White, "Usage: #fixmob hair [Next|Previous]");
c->Message(Chat::White, "Usage: #fixmob hair_color [Next|Previous]");
c->Message(Chat::White, "Usage: #fixmob helm [Next|Previous]");
c->Message(Chat::White, "Usage: #fixmob race [Next|Previous]");
c->Message(Chat::White, "Usage: #fixmob texture [Next|Previous]");
}