mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 21:01:29 +00:00
525 lines
17 KiB
C++
Executable File
525 lines
17 KiB
C++
Executable File
#include "../client.h"
|
|
|
|
void command_tune(Client *c, const Seperator *sep)
|
|
{
|
|
//Work in progress - Kayen
|
|
|
|
if (sep->arg[1][0] == '\0' || !strcasecmp(sep->arg[1], "help")) {
|
|
c->Message(Chat::White, "Syntax: #tune [subcommand].");
|
|
c->Message(Chat::White, "-- Tune System Commands --");
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Usage: Returns recommended combat statistical values based on a desired outcome through simulated combat."
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"-- This commmand can answer the following difficult questions whening tunings NPCs and Players."
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Question: What is the average damage mitigation my AC provides against a specific targets attacks?"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Question: What is amount of AC would I need to add to acheive a specific average damage mitigation agianst specific targets attacks?"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Question: What is amount of AC would I need to add to my target to acheive a specific average damage mitigation from my attacks?"
|
|
);
|
|
c->Message(Chat::White, "-- Question: What is my targets average AC damage mitigation based on my ATK stat?");
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Question: What is amount of ATK would I need to add to myself to acheive a specific average damage mitigation on my target?"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Question: What is amount of ATK would I need to add to my target to acheive a specific average AC damage mitigation on myself?"
|
|
);
|
|
c->Message(Chat::White, "-- Question: What is my hit chance against a target?");
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Question: What is the amount of avoidance I need to add to my target to achieve a specific hit chance?"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Question: What is the amount of accuracy I need to add to my target to achieve a specific chance of hitting me?"
|
|
);
|
|
c->Message(Chat::White, "-- Question: ... and many more...");
|
|
c->Message(Chat::White, " ");
|
|
c->Message(Chat::White, "...#tune stats [A/D]");
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindATK [A/D] [pct mitigation] [interval] [loop_max] [AC override] [Info Level]"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindAC [A/D] [pct mitigation] [interval] [loop_max] [ATK override] [Info Level] "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindAccuracy [A/D] [hit chance] [interval] [loop_max] [Avoidance override] [Info Level]"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindAvoidance [A/D] [hit chance] [interval] [loop_max] [Accuracy override] [Info Level] "
|
|
);
|
|
c->Message(Chat::White, " ");
|
|
c->Message(Chat::White, "-- DETAILS AND EXAMPLES ON USAGE");
|
|
c->Message(Chat::White, " ");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Returns combat statistics, including AC mitigation pct, hit chance, and avoid melee chance for attacker and defender."
|
|
);
|
|
c->Message(Chat::White, "...#tune stats [A/D]");
|
|
c->Message(Chat::White, "...");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Returns recommended ATK adjustment (+/-) on ATTACKER that will result in a specific average AC mitigation pct on DEFENDER. "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindATK [A/D] [pct mitigation] [interval][loop_max][AC override][Info Level]"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...Example: Find the amount of ATK stat I need to add to the targeted NPC so that it hits me for 50 pct damage on average."
|
|
);
|
|
c->Message(Chat::White, "...Example: #tune FindATK D 50");
|
|
c->Message(Chat::White, "...");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Returns recommended AC adjustment(+/-) on DEFENDER for a specific average AC mitigation pct from ATTACKER. "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindAC [A/D] [pct mitigation] [interval][loop_max][ATK override][Info Level] "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...Example: Find the amount of AC stat I need to add to the targeted NPC so that I hit it for 70 pct damage on average."
|
|
);
|
|
c->Message(Chat::White, "...Example: #tune FindAC D 70");
|
|
c->Message(Chat::White, "...");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Returns recommended Accuracy adjustment (+/-) on ATTACKER that will result in a specific hit chance pct on DEFENDER. "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindAccuracy [A/D] [hit chance] [interval][loop_max][Avoidance override][Info Level]"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...Example: Find the amount of Accuracy stat I need to add to the targeted NPC so that it has a 60 pct hit chance against me."
|
|
);
|
|
c->Message(Chat::White, "...Example: #tune FindAccuracy D 60");
|
|
c->Message(Chat::White, "...");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Returns recommended Avoidance adjustment (+/-) on DEFENDER for in a specific hit chance pct from ATTACKER. "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindAvoidance [A/D] [hit chance] [interval][loop_max][Accuracy override][Info Level] "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...Example: Find the amount of Avoidance stat I need to add to the targeted NPC so that I have a 30 pct hit chance against it."
|
|
);
|
|
c->Message(Chat::White, "...Example: #tune FindAvoidance D 30");
|
|
c->Message(Chat::White, "... ");
|
|
c->Message(Chat::White, "...Usage: [A/D] You must input either A or D.");
|
|
c->Message(Chat::White, "...Category [A] : YOU are the ATTACKER. YOUR TARGET is the DEFENDER.");
|
|
c->Message(Chat::White, "...Category [D] : YOU are the DEFENDER. YOUR TARGET is the ATTACKER.");
|
|
c->Message(Chat::White, "...If TARGET is in combat, DEFENDER is the TARGETs TARGET.");
|
|
|
|
c->Message(Chat::White, " ");
|
|
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Warning: The calculations done in this process are intense and can potentially cause zone crashes depending on parameters set, use with caution!"
|
|
);
|
|
c->Message(Chat::White, "-- Below are OPTIONAL parameters.");
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Note: [interval] Determines how much the stat being checked increases/decreases till it finds the best result. Lower is more accurate. Default=10"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Note: [loop_max] Determines how many iterations are done to increases/decreases the stat till it finds the best result. Higher is more accurate. Default=1000"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Note: [Stat Override] Will override that stat on mob being checked with the specified value. Default=0"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"-- Example: If as the attacker you want to find the ATK value you would need to have agianst a target with 1000 AC to achieve an average AC mitigation of 50 pct."
|
|
);
|
|
c->Message(Chat::White, "-- Example: #tune FindATK A 50 0 0 1000");
|
|
c->Message(Chat::White, "-- Note: [Info Level] How much parsing detail is displayed[0 - 1]. Default: [0] ");
|
|
c->Message(Chat::White, " ");
|
|
|
|
return;
|
|
}
|
|
/*
|
|
Category A: YOU are the attacker and your target is the defender
|
|
Category D: YOU are the defender and your target is the attacker
|
|
*/
|
|
|
|
Mob *attacker = c;
|
|
Mob *defender = c->GetTarget();
|
|
|
|
if (!defender) {
|
|
c->Message(Chat::White, "[#Tune] - Error no target selected. [#Tune help]");
|
|
return;
|
|
}
|
|
|
|
//Use if checkings on engaged targets.
|
|
Mob *ttarget = attacker->GetTarget();
|
|
if (ttarget) {
|
|
defender = ttarget;
|
|
}
|
|
|
|
if (!strcasecmp(sep->arg[1], "stats")) {
|
|
|
|
if (!strcasecmp(sep->arg[2], "A")) {
|
|
c->TuneGetStats(defender, attacker);
|
|
}
|
|
else if (!strcasecmp(sep->arg[2], "D")) {
|
|
c->TuneGetStats(attacker, defender);
|
|
}
|
|
else {
|
|
c->TuneGetStats(defender, attacker);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (!strcasecmp(sep->arg[1], "FindATK")) {
|
|
float pct_mitigation = atof(sep->arg[3]);
|
|
int interval = atoi(sep->arg[4]);
|
|
int max_loop = atoi(sep->arg[5]);
|
|
int ac_override = atoi(sep->arg[6]);
|
|
int info_level = atoi(sep->arg[7]);
|
|
|
|
if (!pct_mitigation) {
|
|
c->Message(Chat::White, "[#Tune] - Error must enter the desired percent mitigation on defender.");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Returns recommended ATK adjustment (+/-) on ATTACKER that will result in a specific average AC mitigation pct on DEFENDER. "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindATK [A/D] [pct mitigation] [interval][loop_max][AC override][Info Level]"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...Example: Find the amount of ATK stat I need to add to the targeted NPC so that it hits me for 50 pct damage on average."
|
|
);
|
|
c->Message(Chat::White, "...Example: #tune FindATK D 50");
|
|
return;
|
|
}
|
|
|
|
if (!interval) {
|
|
interval = 10;
|
|
}
|
|
if (!max_loop) {
|
|
max_loop = 1000;
|
|
}
|
|
if (!ac_override) {
|
|
ac_override = 0;
|
|
}
|
|
if (!info_level) {
|
|
info_level = 0;
|
|
}
|
|
|
|
if (!strcasecmp(sep->arg[2], "A")) {
|
|
c->TuneGetATKByPctMitigation(
|
|
defender,
|
|
attacker,
|
|
pct_mitigation,
|
|
interval,
|
|
max_loop,
|
|
ac_override,
|
|
info_level
|
|
);
|
|
}
|
|
else if (!strcasecmp(sep->arg[2], "D")) {
|
|
c->TuneGetATKByPctMitigation(
|
|
attacker,
|
|
defender,
|
|
pct_mitigation,
|
|
interval,
|
|
max_loop,
|
|
ac_override,
|
|
info_level
|
|
);
|
|
}
|
|
else {
|
|
c->Message(Chat::White, "#Tune - Error no category selcted. [#Tune help]");
|
|
c->Message(
|
|
Chat::White,
|
|
"Usage #tune FindATK [A/B] [pct mitigation] [interval][loop_max][AC Overwride][Info Level] "
|
|
);
|
|
c->Message(Chat::White, "...Usage: [A/D] You must input either A or D.");
|
|
c->Message(Chat::White, "...Category [A] : YOU are the ATTACKER. YOUR TARGET is the DEFENDER.");
|
|
c->Message(Chat::White, "...Category [D] : YOU are the DEFENDER. YOUR TARGET is the ATTACKER.");
|
|
c->Message(Chat::White, "...If TARGET is in combat, DEFENDER is the TARGETs TARGET.");
|
|
c->Message(Chat::White, "... ");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Example: Find the amount of ATK stat I need to add to the targeted NPC so that it hits me for 50 pct damage on average."
|
|
);
|
|
c->Message(Chat::White, "...Example: #tune FindATK D 50");
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (!strcasecmp(sep->arg[1], "FindAC")) {
|
|
float pct_mitigation = atof(sep->arg[3]);
|
|
int interval = atoi(sep->arg[4]);
|
|
int max_loop = atoi(sep->arg[5]);
|
|
int atk_override = atoi(sep->arg[6]);
|
|
int info_level = atoi(sep->arg[7]);
|
|
|
|
if (!pct_mitigation) {
|
|
c->Message(Chat::White, "#Tune - Error must enter the desired percent mitigation on defender.");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Returns recommended AC adjustment(+/-) on DEFENDER for a specific average AC mitigation pct from ATTACKER. "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindAC [A/D] [pct mitigation] [interval][loop_max][ATK override][Info Level] "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...Example: Find the amount of AC stat I need to add to the targeted NPC so that I hit it for 70 pct damage on average."
|
|
);
|
|
c->Message(Chat::White, "...Example: #tune FindAC D 70");
|
|
return;
|
|
}
|
|
|
|
if (!interval) {
|
|
interval = 10;
|
|
}
|
|
if (!max_loop) {
|
|
max_loop = 1000;
|
|
}
|
|
if (!atk_override) {
|
|
atk_override = 0;
|
|
}
|
|
if (!info_level) {
|
|
info_level = 0;
|
|
}
|
|
|
|
if (!strcasecmp(sep->arg[2], "A")) {
|
|
c->TuneGetACByPctMitigation(
|
|
defender,
|
|
attacker,
|
|
pct_mitigation,
|
|
interval,
|
|
max_loop,
|
|
atk_override,
|
|
info_level
|
|
);
|
|
}
|
|
else if (!strcasecmp(sep->arg[2], "D")) {
|
|
c->TuneGetACByPctMitigation(
|
|
attacker,
|
|
defender,
|
|
pct_mitigation,
|
|
interval,
|
|
max_loop,
|
|
atk_override,
|
|
info_level
|
|
);
|
|
}
|
|
else {
|
|
c->Message(Chat::White, "#Tune - Error no category selcted. [#Tune help]");
|
|
c->Message(
|
|
Chat::White,
|
|
"Usage #tune FindATK [A/B] [pct mitigation] [interval][loop_max][AC Overwride][Info Level] "
|
|
);
|
|
c->Message(Chat::White, "...Usage: [A/D] You must input either A or D.");
|
|
c->Message(Chat::White, "...Category [A] : YOU are the ATTACKER. YOUR TARGET is the DEFENDER.");
|
|
c->Message(Chat::White, "...Category [D] : YOU are the DEFENDER. YOUR TARGET is the ATTACKER.");
|
|
c->Message(Chat::White, "...If TARGET is in combat, DEFENDER is the TARGETs TARGET.");
|
|
c->Message(Chat::White, "... ");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Example: Find the amount of AC stat I need to add to the targeted NPC so that I hit it for 70 pct damage on average."
|
|
);
|
|
c->Message(Chat::White, "...Example: #tune FindAC D 70");
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if (!strcasecmp(sep->arg[1], "FindAccuracy")) {
|
|
float hit_chance = atof(sep->arg[3]);
|
|
int interval = atoi(sep->arg[4]);
|
|
int max_loop = atoi(sep->arg[5]);
|
|
int avoid_override = atoi(sep->arg[6]);
|
|
int info_level = atoi(sep->arg[7]);
|
|
|
|
if (!hit_chance) {
|
|
c->Message(Chat::White, "#Tune - Error must enter the desired hit chance on defender.");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Returns recommended Accuracy adjustment (+/-) on ATTACKER that will result in a specific hit chance pct on DEFENDER. "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindAccuracy [A/D] [hit chance] [interval][loop_max][Avoidance override][Info Level]"
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...Example: Find the amount of Accuracy stat I need to add to the targeted NPC so that it has a 60 pct hit chance against me."
|
|
);
|
|
c->Message(Chat::White, "...Example: #tune FindAccuracy D 60");
|
|
return;
|
|
}
|
|
|
|
if (!interval) {
|
|
interval = 10;
|
|
}
|
|
if (!max_loop) {
|
|
max_loop = 1000;
|
|
}
|
|
if (!avoid_override) {
|
|
avoid_override = 0;
|
|
}
|
|
if (!info_level) {
|
|
info_level = 0;
|
|
}
|
|
|
|
if (!strcasecmp(sep->arg[2], "A")) {
|
|
c->TuneGetAccuracyByHitChance(
|
|
defender,
|
|
attacker,
|
|
hit_chance,
|
|
interval,
|
|
max_loop,
|
|
avoid_override,
|
|
info_level
|
|
);
|
|
}
|
|
else if (!strcasecmp(sep->arg[2], "D")) {
|
|
c->TuneGetAccuracyByHitChance(
|
|
attacker,
|
|
defender,
|
|
hit_chance,
|
|
interval,
|
|
max_loop,
|
|
avoid_override,
|
|
info_level
|
|
);
|
|
}
|
|
else {
|
|
c->Message(Chat::White, "#Tune - Error no category selcted. [#Tune help]");
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindAccuracy [A/D] [hit chance] [interval][loop_max][Avoidance override][Info Level]"
|
|
);
|
|
c->Message(Chat::White, "...Usage: [A/D] You must input either A or D.");
|
|
c->Message(Chat::White, "...Category [A] : YOU are the ATTACKER. YOUR TARGET is the DEFENDER.");
|
|
c->Message(Chat::White, "...Category [D] : YOU are the DEFENDER. YOUR TARGET is the ATTACKER.");
|
|
c->Message(Chat::White, "...If TARGET is in combat, DEFENDER is the TARGETs TARGET.");
|
|
c->Message(Chat::White, "... ");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Example: Find the amount of Accuracy stat I need to add to the targeted NPC so that it has a 60 pct hit chance against me."
|
|
);
|
|
c->Message(Chat::White, "...Example: #tune FindAccuracy D 60");
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if (!strcasecmp(sep->arg[1], "FindAvoidance")) {
|
|
float hit_chance = atof(sep->arg[3]);
|
|
int interval = atoi(sep->arg[4]);
|
|
int max_loop = atoi(sep->arg[5]);
|
|
int acc_override = atoi(sep->arg[6]);
|
|
int info_level = atoi(sep->arg[7]);
|
|
|
|
if (!hit_chance) {
|
|
c->Message(Chat::White, "#Tune - Error must enter the desired hit chance on defender.");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Returns recommended Avoidance adjustment (+/-) on DEFENDER for in a specific hit chance pct from ATTACKER. "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindAvoidance [A/D] [hit chance] [interval][loop_max][Accuracy override][Info Level] "
|
|
);
|
|
c->Message(
|
|
Chat::White,
|
|
"...Example: Find the amount of Avoidance stat I need to add to the targeted NPC so that I have a 30 pct hit chance against it."
|
|
);
|
|
c->Message(Chat::White, "...Example: #tune FindAvoidance D 30");
|
|
return;
|
|
}
|
|
if (!interval) {
|
|
interval = 10;
|
|
}
|
|
if (!max_loop) {
|
|
max_loop = 1000;
|
|
}
|
|
if (!acc_override) {
|
|
acc_override = 0;
|
|
}
|
|
if (!info_level) {
|
|
info_level = 0;
|
|
}
|
|
|
|
if (!strcasecmp(sep->arg[2], "A")) {
|
|
c->TuneGetAvoidanceByHitChance(
|
|
defender,
|
|
attacker,
|
|
hit_chance,
|
|
interval,
|
|
max_loop,
|
|
acc_override,
|
|
info_level
|
|
);
|
|
}
|
|
else if (!strcasecmp(sep->arg[2], "D")) {
|
|
c->TuneGetAvoidanceByHitChance(
|
|
attacker,
|
|
defender,
|
|
hit_chance,
|
|
interval,
|
|
max_loop,
|
|
acc_override,
|
|
info_level
|
|
);
|
|
}
|
|
else {
|
|
c->Message(Chat::White, "#Tune - Error no category selcted. [#Tune help]");
|
|
c->Message(
|
|
Chat::White,
|
|
"...#tune FindAvoidance [A/D] [hit chance] [interval][loop_max][Accuracy override][Info Level] "
|
|
);
|
|
c->Message(Chat::White, "...Usage: [A/D] You must input either A or D.");
|
|
c->Message(Chat::White, "...Category [A] : YOU are the ATTACKER. YOUR TARGET is the DEFENDER.");
|
|
c->Message(Chat::White, "...Category [D] : YOU are the DEFENDER. YOUR TARGET is the ATTACKER.");
|
|
c->Message(Chat::White, "...If TARGET is in combat, DEFENDER is the TARGETs TARGET.");
|
|
c->Message(Chat::White, "... ");
|
|
c->Message(
|
|
Chat::White,
|
|
"...Example: Find the amount of Avoidance stat I need to add to the targeted NPC so that I have a 30 pct hit chance against it."
|
|
);
|
|
c->Message(Chat::White, "...Example: #tune FindAvoidance D 30");
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
c->Message(Chat::White, "#Tune - Error no command [#Tune help]");
|
|
return;
|
|
}
|
|
|