diff options
Diffstat (limited to 'src/map/atcommand.cpp')
-rw-r--r-- | src/map/atcommand.cpp | 174 |
1 files changed, 137 insertions, 37 deletions
diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index eaefd4f..346b0ac 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -1667,36 +1667,100 @@ ATCE atcommand_pvpoff(Session *s, dumb_ptr<map_session_data> sd, return ATCE::OKAY; } + + +static int extract_rate(Session *s, ZString message) +{ + int rate; + AString output; + + if (!extract(message, &rate)) + { + clif_displaymessage(s, "Please enter the new rate"_s); + return -1; + } + if (rate <= 0 || rate > battle_config.max_rate) + { + output = STRPRINTF("Rate adjustment must be between 1 and %d%%"_fmt, + battle_config.max_rate); + clif_displaymessage(s, output); + return -1; + } + return rate; +} + +// Command not removed during bexprate/jexprate split +// because serverdata calls it. static ATCE atcommand_exprate(Session *s, dumb_ptr<map_session_data>, ZString message) { - int rate; + int rate = extract_rate(s, message); + if (rate < 0) + return ATCE::USAGE; - if (!extract(message, &rate) || !rate) - { - clif_displaymessage(s, - "Please, enter a rate adjustement (usage: @exprate <percent>)."_s); + battle_config.base_exp_rate = rate; + battle_config.job_exp_rate = rate; + AString output = STRPRINTF("Base & job XP rates now at %d percent"_fmt, rate); + clif_displaymessage(s, output); + return ATCE::OKAY; +} + +static +ATCE atcommand_bexprate(Session *s, dumb_ptr<map_session_data>, + ZString message) +{ + int rate = extract_rate(s, message); + if (rate < 0) return ATCE::USAGE; - } + battle_config.base_exp_rate = rate; + AString output = STRPRINTF("Base XP rate now at %d percent"_fmt, rate); + clif_displaymessage(s, output); + return ATCE::OKAY; +} + +static +ATCE atcommand_jexprate(Session *s, dumb_ptr<map_session_data>, + ZString message) +{ + int rate = extract_rate(s, message); + if (rate < 0) + return ATCE::USAGE; + battle_config.job_exp_rate = rate; - AString output = STRPRINTF("All Xp at %d percent"_fmt, rate); + AString output = STRPRINTF("Job XP rate now at %d percent"_fmt, rate); clif_displaymessage(s, output); return ATCE::OKAY; } static -ATCE atcommand_rates(Session *s, dumb_ptr<map_session_data>, +ATCE atcommand_droprate(Session *s, dumb_ptr<map_session_data>, ZString message) { - AString output = STRPRINTF("Experience rates: Base %d%% / Job %d%%"_fmt, battle_config.base_exp_rate, battle_config.job_exp_rate); + int rate = extract_rate(s, message); + if (rate < 0) + return ATCE::USAGE; + + battle_config.drop_rate = rate; + AString output = STRPRINTF("Drops rate now at %d percent"_fmt, rate); clif_displaymessage(s, output); - output = STRPRINTF("Drop rate: 100%%"_fmt); + return ATCE::OKAY; +} + +static +ATCE atcommand_rates(Session *s, dumb_ptr<map_session_data>, + ZString message) +{ + AString output = STRPRINTF( + "Experience rates: Base %d%% / Job %d%%. Drop rate: %d%%"_fmt, + battle_config.base_exp_rate, battle_config.job_exp_rate, + battle_config.drop_rate); clif_displaymessage(s, output); return ATCE::OKAY; } + static ATCE atcommand_pvpon(Session *s, dumb_ptr<map_session_data> sd, ZString) @@ -1850,22 +1914,47 @@ ATCE atcommand_mobinfo(Session *s, dumb_ptr<map_session_data> sd, if (mob_id == Species()) return ATCE::EXIST; - clif_displaymessage(s, STRPRINTF("Monster ID: %i, English Name: %s, Japanese Name: %s"_fmt, mob_id, get_mob_db(mob_id).name, get_mob_db(mob_id).jname)); - clif_displaymessage(s, STRPRINTF("Level: %i, HP: %i, SP: %i, Base EXP: %i, JEXP: %i"_fmt, get_mob_db(mob_id).lv, get_mob_db(mob_id).max_hp, get_mob_db(mob_id).max_sp, get_mob_db(mob_id).base_exp, get_mob_db(mob_id).job_exp)); - clif_displaymessage(s, STRPRINTF("Range1: %i, ATK1: %i, ATK2: %i, DEF: %i, MDEF: %i, CRITICAL_DEF: %i"_fmt, get_mob_db(mob_id).range, get_mob_db(mob_id).atk1, get_mob_db(mob_id).atk2, get_mob_db(mob_id).def, get_mob_db(mob_id).mdef, get_mob_db(mob_id).critical_def)); - clif_displaymessage(s, STRPRINTF("Stats: STR: %i, AGI: %i, VIT: %i, INT: %i, DEX: %i, LUK: %i"_fmt, get_mob_db(mob_id).attrs[ATTR::STR], get_mob_db(mob_id).attrs[ATTR::AGI], get_mob_db(mob_id).attrs[ATTR::VIT], get_mob_db(mob_id).attrs[ATTR::INT], get_mob_db(mob_id).attrs[ATTR::DEX], get_mob_db(mob_id).attrs[ATTR::LUK])); - clif_displaymessage(s, STRPRINTF("Range2: %i, Range3: %i, Scale: %i, Race: %i, Element: %i, Element Level: %i, Mode: %i"_fmt, get_mob_db(mob_id).range2, get_mob_db(mob_id).range3, get_mob_db(mob_id).size, get_mob_db(mob_id).race, get_mob_db(mob_id).element.element, get_mob_db(mob_id).element.level, get_mob_db(mob_id).mode)); - clif_displaymessage(s, STRPRINTF("Speed: %i, Adelay: %i, Amotion: %i, Dmotion: %i"_fmt, get_mob_db(mob_id).speed.count(), get_mob_db(mob_id).adelay.count(), get_mob_db(mob_id).amotion.count(), get_mob_db(mob_id).dmotion.count())); - if (get_mob_db(mob_id).mutations_nr) - clif_displaymessage(s, STRPRINTF("May mutate %i attribute up to %i%%"_fmt, get_mob_db(mob_id).mutations_nr, get_mob_db(mob_id).mutation_power)); + const struct mob_db_& mob = get_mob_db(mob_id); + + clif_displaymessage(s, STRPRINTF( + "Monster ID: %i, English Name: %s, Japanese Name: %s"_fmt, + mob_id, mob.name, mob.jname)); + clif_displaymessage(s, STRPRINTF( + "Level: %i, HP: %i, SP: %i, Base EXP: %i, JEXP: %i"_fmt, + mob.lv, mob.max_hp, mob.max_sp, mob.base_exp, mob.job_exp)); + clif_displaymessage(s, STRPRINTF( + "Range1: %i, ATK1: %i, ATK2: %i, DEF: %i, MDEF: %i, CRITICAL_DEF: %i"_fmt, + mob.range, mob.atk1, mob.atk2, + mob.def, mob.mdef, mob.critical_def)); + clif_displaymessage(s, STRPRINTF( + "Stats: STR: %i, AGI: %i, VIT: %i, INT: %i, DEX: %i, LUK: %i"_fmt, + mob.attrs[ATTR::STR], mob.attrs[ATTR::AGI], + mob.attrs[ATTR::VIT], mob.attrs[ATTR::INT], + mob.attrs[ATTR::DEX], mob.attrs[ATTR::LUK])); + clif_displaymessage(s, STRPRINTF( + "Range2: %i, Range3: %i, Scale: %i, Race: %i, Element: %i, Element Level: %i, Mode: %i"_fmt, + mob.range2, mob.range3, mob.size, static_cast<int>(mob.race), + static_cast<int>(mob.element.element), mob.element.level, + static_cast<int>(mob.mode))); + clif_displaymessage(s, STRPRINTF( + "Speed: %li, Adelay: %li, Amotion: %li, Dmotion: %li"_fmt, + mob.speed.count(), mob.adelay.count(), + mob.amotion.count(), mob.dmotion.count())); + + if (mob.mutations_nr) + { + clif_displaymessage(s, STRPRINTF( + "May mutate %i attribute up to %i%%"_fmt, + mob.mutations_nr, mob.mutation_power)); + } for (int i = 0; i < MaxDrops; ++i) - if (get_mob_db(mob_id).dropitem[i].nameid) + if (mob.dropitem[i].nameid) { - Option<P<struct item_data>> i_data = Some(itemdb_search(get_mob_db(mob_id).dropitem[i].nameid)); + Option<P<struct item_data>> i_data = Some(itemdb_search(mob.dropitem[i].nameid)); RString item_name = i_data.pmd_pget(&item_data::name).copy_or(stringish<ItemName>(""_s)); - int drop_rate = get_mob_db(mob_id).dropitem[i].p.num; + int drop_rate = mob.dropitem[i].p.num; char str[6]; char strpos = 0; @@ -1922,33 +2011,35 @@ ATCE atcommand_mobinfo(Session *s, dumb_ptr<map_session_data> sd, str[strpos] = '\0'; int drop_rate2 = 10000/drop_rate; - clif_displaymessage(s, STRPRINTF("Drop ID %i: %i, Item Name: %s, Drop Chance: %s%% (1:%i)"_fmt,i, get_mob_db(mob_id).dropitem[i].nameid, item_name, str, drop_rate2)); + clif_displaymessage(s, STRPRINTF( + "Drop ID %i: %i, Item Name: %s, Drop Chance: %s%% (1:%i)"_fmt, + i, mob.dropitem[i].nameid, item_name, str, drop_rate2)); } else break; clif_displaymessage(s, STRPRINTF("Mob Mode Info:"_fmt)); - if (!bool(get_mob_db(mob_id).mode & MobMode::ZERO)) + if (!bool(mob.mode & MobMode::ZERO)) { - if (bool(get_mob_db(mob_id).mode & MobMode::CAN_MOVE)) + if (bool(mob.mode & MobMode::CAN_MOVE)) clif_displaymessage(s, STRPRINTF("Mobile"_fmt)); - if (bool(get_mob_db(mob_id).mode & MobMode::LOOTER)) + if (bool(mob.mode & MobMode::LOOTER)) clif_displaymessage(s, STRPRINTF("Picks up loot"_fmt)); - if (bool(get_mob_db(mob_id).mode & MobMode::AGGRESSIVE)) + if (bool(mob.mode & MobMode::AGGRESSIVE)) clif_displaymessage(s, STRPRINTF("Aggro"_fmt)); - if (bool(get_mob_db(mob_id).mode & MobMode::ASSIST)) + if (bool(mob.mode & MobMode::ASSIST)) clif_displaymessage(s, STRPRINTF("Assists"_fmt)); - if (bool(get_mob_db(mob_id).mode & MobMode::CAST_SENSOR)) + if (bool(mob.mode & MobMode::CAST_SENSOR)) clif_displaymessage(s, STRPRINTF("Cast Sensor"_fmt)); - if (bool(get_mob_db(mob_id).mode & MobMode::BOSS)) + if (bool(mob.mode & MobMode::BOSS)) clif_displaymessage(s, STRPRINTF("Boss"_fmt)); - if (bool(get_mob_db(mob_id).mode & MobMode::PLANT)) + if (bool(mob.mode & MobMode::PLANT)) clif_displaymessage(s, STRPRINTF("Plant"_fmt)); - if (bool(get_mob_db(mob_id).mode & MobMode::CAN_ATTACK)) + if (bool(mob.mode & MobMode::CAN_ATTACK)) clif_displaymessage(s, STRPRINTF("Can attack"_fmt)); - if (bool(get_mob_db(mob_id).mode & MobMode::DETECTOR)) + if (bool(mob.mode & MobMode::DETECTOR)) clif_displaymessage(s, STRPRINTF("Detector"_fmt)); - if (bool(get_mob_db(mob_id).mode & MobMode::CHANGE_TARGET)) + if (bool(mob.mode & MobMode::CHANGE_TARGET)) clif_displaymessage(s, STRPRINTF("Change Target"_fmt)); /* Not needed here i guess @@ -2552,7 +2643,7 @@ ATCE atcommand_character_stats_full(Session *s, dumb_ptr<map_session_data>, pl_sd->def2, pl_sd->def2_rate); clif_displaymessage(s, output); - output = STRPRINTF("ADD_SPEED: %d | SPEED_RATE: %d | SPEED_ADDRATE: %d | ASPD: %d | ASPD_RATE: %d | ASPD_ADDRATE: %d"_fmt, + output = STRPRINTF("ADD_SPEED: %ld | SPEED_RATE: %d | SPEED_ADDRATE: %d | ASPD: %ld | ASPD_RATE: %d | ASPD_ADDRATE: %d"_fmt, pl_sd->speed.count(), pl_sd->speed_rate, pl_sd->speed_add_rate, @@ -2576,7 +2667,7 @@ ATCE atcommand_character_stats_full(Session *s, dumb_ptr<map_session_data>, pl_sd->hit, pl_sd->hit_rate); clif_displaymessage(s, output); - output = STRPRINTF("DEADLY_STRIKE_RATE: %d | DEADLY_STRIKE_ADD_RATE: %d | BASE_WEAPON_DELAY_ADJUST: %d"_fmt, + output = STRPRINTF("DEADLY_STRIKE_RATE: %d | DEADLY_STRIKE_ADD_RATE: %d | BASE_WEAPON_DELAY_ADJUST: %ld"_fmt, pl_sd->deadly_strike, pl_sd->deadly_strike_add_rate, pl_sd->base_weapon_delay_adjust.count()); @@ -5599,10 +5690,19 @@ Map<XString, AtCommandInfo> atcommand_info = "Enable PvP on your map"_s}}, {"exprate"_s, {"<percent>"_s, 60, atcommand_exprate, - "Set base job/exp rate"_s}}, + "Set base and job exp rate"_s}}, + {"bexprate"_s, {"<percent>"_s, + 60, atcommand_bexprate, + "Set base exp rate"_s}}, + {"jexprate"_s, {"<percent>"_s, + 60, atcommand_jexprate, + "Set job exp rate"_s}}, + {"droprate"_s, {"<percent>"_s, + 60, atcommand_droprate, + "Set drop rate"_s}}, {"rates"_s, {""_s, 0, atcommand_rates, - "Show base job/exp rate"_s}}, + "Show base and job exp and drop rates"_s}}, {"pvpon"_s, {""_s, 60, atcommand_pvpon, "Disable PvP on your map"_s}}, |