Cleaned up parts of the VIP System

* Removed battle configs vip_exp_penalty_base_normal and vip_exp_penalty_job_normal as these are duplicates of other battle configs.
* Battle config vip_exp_penalty_base and vip_exp_penalty_job are now at a rate of 100 instead of 1 to match other configs.
* Added VIP Zeny Penalty config.
* Cleaned up various rate calculations.
* Removed various macro defines that aren't needed.
* Moved the player state for atcommand showrate to the VIP struct.
This commit is contained in:
aleos89 2016-07-28 19:28:36 -04:00
parent 63ff4a9390
commit d1a957efea
8 changed files with 46 additions and 77 deletions

View File

@ -180,17 +180,16 @@ vip_base_exp_increase: 50
// Default: 50
vip_job_exp_increase: 50
// Experience penalty rate multiplier for non-VIP accounts.
// Multiplies the 'death_penalty_base' and 'death_penalty_job' settings in 'conf/battle/exp.conf'.
// Default: 3 (3*100 = 3% penalty)
vip_exp_penalty_base_normal: 3
vip_exp_penalty_job_normal: 3
// Experience penalty rate multiplier for VIP accounts.
// Multiplies the 'death_penalty_base' and 'death_penalty_job' settings in 'conf/battle/exp.conf'.
// Default: 1 (1*100 = 1% penalty)
vip_exp_penalty_base: 1
vip_exp_penalty_job: 1
// Default: 100 (100 = 1% penalty)
vip_exp_penalty_base: 100
vip_exp_penalty_job: 100
// Zeny penalty for VIP accounts.
// Zeny loss only happens if the player dies from another player.
// Default: 0 (100 = 1% penalty)
vip_zeny_penalty: 0
// Battle Manual experience increase. Setting to 0 will disable.
// - Regular/Thick Battle Manual: 50+(50/X) = 75%

View File

@ -7081,18 +7081,15 @@ ACMD_FUNC(mobinfo)
base_exp = mob->base_exp;
job_exp = mob->job_exp;
if (pc_isvip(sd)) { // Display EXP rate increase for VIP
base_exp = (base_exp * battle_config.vip_base_exp_increase) / 100;
job_exp = (job_exp * battle_config.vip_job_exp_increase) / 100;
}
#ifdef RENEWAL_EXP
if( battle_config.atcommand_mobinfo_type ) {
base_exp = base_exp * pc_level_penalty_mod(mob->lv - sd->status.base_level, mob->status.class_, mob->status.mode, 1) / 100;
job_exp = job_exp * pc_level_penalty_mod(mob->lv - sd->status.base_level, mob->status.class_, mob->status.mode, 1) / 100;
}
#endif
#ifdef VIP_ENABLE
// Display EXP rate increase for VIP.
if (pc_isvip(sd) && (battle_config.vip_base_exp_increase || battle_config.vip_job_exp_increase)) {
base_exp += battle_config.vip_base_exp_increase;
job_exp += battle_config.vip_job_exp_increase;
}
#endif
// stats
if (mob->mexp)
@ -7129,11 +7126,8 @@ ACMD_FUNC(mobinfo)
droprate = 1;
}
#endif
#ifdef VIP_ENABLE
// Display item rate increase for VIP.
if (pc_isvip(sd) && battle_config.vip_drop_increase)
if (pc_isvip(sd)) // Display drop rate increase for VIP
droprate += (droprate * battle_config.vip_drop_increase) / 100;
#endif
if (item_data->slot)
sprintf(atcmd_output2, " - %s[%d] %02.02f%%", item_data->jname, item_data->slot, (float)droprate / 100);
else
@ -7668,11 +7662,8 @@ ACMD_FUNC(whodrops)
if( battle_config.atcommand_mobinfo_type )
dropchance = dropchance * pc_level_penalty_mod(mob_db(item_data->mob[j].id)->lv - sd->status.base_level, mob_db(item_data->mob[j].id)->status.class_, mob_db(item_data->mob[j].id)->status.mode, 2) / 100;
#endif
#ifdef VIP_ENABLE
// Display item rate increase for VIP.
if (pc_isvip(sd) && battle_config.vip_drop_increase)
if (pc_isvip(sd)) // Display item rate increase for VIP
dropchance += (dropchance * battle_config.vip_drop_increase) / 100;
#endif
sprintf(atcmd_output, "- %s (%d): %02.02f%%", mob_db(item_data->mob[j].id)->jname, item_data->mob[j].id, dropchance/100.);
clif_displaymessage(fd, atcmd_output);
}
@ -7787,16 +7778,9 @@ ACMD_FUNC(rates)
nullpo_ret(sd);
memset(buf, '\0', sizeof(buf));
#ifdef VIP_ENABLE
// Display EXP and item rate increase for VIP.
if (pc_isvip(sd) && (battle_config.vip_base_exp_increase || battle_config.vip_job_exp_increase || battle_config.vip_drop_increase)) {
base_exp_rate += battle_config.vip_base_exp_increase;
job_exp_rate += battle_config.vip_job_exp_increase;
}
#endif
snprintf(buf, CHAT_SIZE_MAX, msg_txt(sd,1298), // Experience rates: Base %.2fx / Job %.2fx
(battle_config.base_exp_rate+base_exp_rate)/100., (battle_config.job_exp_rate+job_exp_rate)/100.);
(battle_config.base_exp_rate + (pc_isvip(sd) ? (battle_config.vip_base_exp_increase * battle_config.base_exp_rate) / 100 : 0)) / 100.,
(battle_config.job_exp_rate + (pc_isvip(sd) ? (battle_config.vip_job_exp_increase * battle_config.job_exp_rate) / 100 : 0)) / 100.);
clif_displaymessage(fd, buf);
snprintf(buf, CHAT_SIZE_MAX, msg_txt(sd,1299), // Normal Drop Rates: Common %.2fx / Healing %.2fx / Usable %.2fx / Equipment %.2fx / Card %.2fx
(battle_config.item_rate_common + (pc_isvip(sd) ? (battle_config.vip_drop_increase * battle_config.item_rate_common) / 100 : 0)) / 100.,
@ -9538,13 +9522,12 @@ ACMD_FUNC(vip) {
/** Enable/disable rate info */
ACMD_FUNC(showrate) {
nullpo_retr(-1,sd);
if (!sd->disableshowrate) {
if (!sd->vip.disableshowrate) {
sprintf(atcmd_output,msg_txt(sd,718)); //Personal rate information is not displayed now.
sd->disableshowrate = 1;
}
else {
sd->vip.disableshowrate = 1;
} else {
sprintf(atcmd_output,msg_txt(sd,719)); //Personal rate information will be shown.
sd->disableshowrate = 0;
sd->vip.disableshowrate = 0;
}
clif_displaymessage(fd,atcmd_output);
return 0;

View File

@ -8253,10 +8253,9 @@ static const struct _battle_data {
#endif
{ "vip_base_exp_increase", &battle_config.vip_base_exp_increase, 0, 0, INT_MAX, },
{ "vip_job_exp_increase", &battle_config.vip_job_exp_increase, 0, 0, INT_MAX, },
{ "vip_exp_penalty_base_normal", &battle_config.vip_exp_penalty_base_normal, 0, 0, INT_MAX, },
{ "vip_exp_penalty_job_normal", &battle_config.vip_exp_penalty_job_normal, 0, 0, INT_MAX, },
{ "vip_exp_penalty_base", &battle_config.vip_exp_penalty_base, 0, 0, INT_MAX, },
{ "vip_exp_penalty_job", &battle_config.vip_exp_penalty_job, 0, 0, INT_MAX, },
{ "vip_zeny_penalty", &battle_config.vip_zeny_penalty, 0, 0, INT_MAX, },
{ "vip_bm_increase", &battle_config.vip_bm_increase, 0, 0, INT_MAX, },
{ "vip_drop_increase", &battle_config.vip_drop_increase, 0, 0, INT_MAX, },
{ "vip_gemstone", &battle_config.vip_gemstone, 0, 0, 1, },

View File

@ -533,12 +533,11 @@ extern struct Battle_Config
int vip_storage_increase;
int vip_base_exp_increase;
int vip_job_exp_increase;
int vip_zeny_penalty;
int vip_bm_increase;
int vip_drop_increase;
int vip_gemstone;
int vip_exp_penalty_base_normal;
int vip_exp_penalty_base;
int vip_exp_penalty_job_normal;
int vip_exp_penalty_job;
int vip_disp_rate;
int mon_trans_disable_in_gvg;

View File

@ -10289,7 +10289,7 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
clif_equipcheckbox(sd);
#endif
#ifdef VIP_ENABLE
if (!sd->disableshowrate) {
if (!sd->vip.disableshowrate) {
clif_display_pinfo(sd,ZC_PERSONAL_INFOMATION);
//clif_vip_display_info(sd,ZC_PERSONAL_INFOMATION_CHN);
}
@ -17829,14 +17829,13 @@ void clif_display_pinfo(struct map_session_data *sd, int cmdtype) {
int details_bexp[PINFO_MAX];
int details_drop[PINFO_MAX];
int details_penalty[PINFO_MAX];
int penalty_const;
/**
* Set for EXP
*/
//0:PCRoom
details_bexp[0] = map[sd->bl.m].adjust.bexp;
if (details_bexp[0] == 100 || details_bexp[0] == 0)
if (details_bexp[0] == 100 || !details_bexp[0])
details_bexp[0] = 0;
else {
if (details_bexp[0] < 100) {
@ -17902,13 +17901,12 @@ void clif_display_pinfo(struct map_session_data *sd, int cmdtype) {
/**
* Set for Penalty rate
*/
//! FIXME: Current penalty system, makes this announcement hardly to gives info + or - rate
penalty_const = battle_config.death_penalty_base * battle_config.vip_exp_penalty_base_normal;
//! FIXME: Current penalty system makes this announcement unable to give info on + or - rate
//0:PCRoom
details_penalty[0] = 0;
//1:Premium
if (pc_isvip(sd)) {
details_penalty[1] = battle_config.vip_exp_penalty_base * 10000 / penalty_const;
details_penalty[1] = battle_config.vip_exp_penalty_base;
if (details_penalty[1] == 100)
details_penalty[1] = 0;
else {
@ -17923,7 +17921,7 @@ void clif_display_pinfo(struct map_session_data *sd, int cmdtype) {
else
details_penalty[1] = 0;
//2:Server
details_penalty[2] = battle_config.vip_exp_penalty_base_normal * 10000 / penalty_const;
details_penalty[2] = battle_config.death_penalty_base;
if (details_penalty[2] == 100)
details_penalty[2] = 0;
else {

View File

@ -2578,13 +2578,10 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
// Now rig the drop rate to never be over 90% unless it is originally >90%.
drop_rate = i32max(drop_rate, cap_value(drop_rate_bonus, 0, 9000));
#ifdef VIP_ENABLE
// Increase item drop rate for VIP.
if (battle_config.vip_drop_increase && pc_isvip(sd)) {
if (pc_isvip(sd)) { // Increase item drop rate for VIP.
drop_rate += (int)(0.5 + (drop_rate * battle_config.vip_drop_increase) / 100);
drop_rate = min(drop_rate,10000); //cap it to 100%
}
#endif
}
#ifdef RENEWAL_DROP

View File

@ -1145,7 +1145,7 @@ bool pc_authok(struct map_session_data *sd, uint32 login_id2, time_t expiration_
sd->state.showzeny = 1;
#ifdef VIP_ENABLE
if (!battle_config.vip_disp_rate)
sd->disableshowrate = 1;
sd->vip.disableshowrate = 1;
#endif
if (!(battle_config.display_skill_fail&2))
@ -1438,7 +1438,7 @@ void pc_reg_received(struct map_session_data *sd)
#ifdef VIP_ENABLE
sd->vip.time = 0;
sd->vip.enabled = 0;
chrif_req_login_operation(sd->status.account_id, sd->status.name, CHRIF_OP_LOGIN_VIP, 0, 1, 0); // request VIP informations
chrif_req_login_operation(sd->status.account_id, sd->status.name, CHRIF_OP_LOGIN_VIP, 0, 1, 0); // request VIP information
#endif
intif_Mail_requestinbox(sd->status.char_id, 0); // MAIL SYSTEM - Request Mail Inbox
intif_request_questlog(sd);
@ -6437,20 +6437,17 @@ static void pc_calcexp(struct map_session_data *sd, unsigned int *base_exp, unsi
(int)(status_get_lv(src) - sd->status.base_level) >= 20)
bonus += 15; // pk_mode additional exp if monster >20 levels [Valaris]
#ifdef VIP_ENABLE
//EXP bonus for VIP player
if (src && src->type == BL_MOB && pc_isvip(sd)) {
if (src && src->type == BL_MOB && pc_isvip(sd)) { // EXP bonus for VIP player
vip_bonus_base = battle_config.vip_base_exp_increase;
vip_bonus_job = battle_config.vip_job_exp_increase;
}
#endif
}
// Give EXPBOOST for quests even if src is NULL.
if (&sd->sc && sd->sc.data[SC_EXPBOOST]) {
bonus += sd->sc.data[SC_EXPBOOST]->val1;
if( battle_config.vip_bm_increase && pc_isvip(sd) ) // Increase Battle Manual EXP rate for VIP.
bonus += ( sd->sc.data[SC_EXPBOOST]->val1 / battle_config.vip_bm_increase );
if (battle_config.vip_bm_increase && pc_isvip(sd)) // Increase Battle Manual EXP rate for VIP
bonus += (sd->sc.data[SC_EXPBOOST]->val1 / battle_config.vip_bm_increase);
}
if (*base_exp) {
@ -7644,20 +7641,19 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
&& !map[sd->bl.m].flag.noexppenalty && !map_flag_gvg(sd->bl.m)
&& !sd->sc.data[SC_BABY] && !sd->sc.data[SC_LIFEINSURANCE])
{
uint32 base_penalty = battle_config.death_penalty_base;
uint32 job_penalty = battle_config.death_penalty_job;
uint32 zeny_penalty = battle_config.zeny_penalty;
uint32 base_penalty = 0;
uint32 job_penalty = 0;
uint32 zeny_penalty = 0;
#ifdef VIP_ENABLE
if(pc_isvip(sd)){
base_penalty *= battle_config.vip_exp_penalty_base;
job_penalty *= battle_config.vip_exp_penalty_job;
if (pc_isvip(sd)) { // EXP penalty for VIP
base_penalty = battle_config.vip_exp_penalty_base;
job_penalty = battle_config.vip_exp_penalty_job;
zeny_penalty = battle_config.vip_zeny_penalty;
} else {
base_penalty = battle_config.death_penalty_base;
job_penalty = battle_config.death_penalty_job;
zeny_penalty = battle_config.zeny_penalty;
}
else {
base_penalty *= battle_config.vip_exp_penalty_base_normal;
job_penalty *= battle_config.vip_exp_penalty_job_normal;
}
#endif
if ((battle_config.death_penalty_maxlv&1 || !pc_is_maxbaselv(sd)) && base_penalty > 0) {
switch (battle_config.death_penalty_type) {
@ -10290,10 +10286,8 @@ static int pc_autosave(int tid, unsigned int tick, int id, intptr_t data)
//Save char.
last_save_id = sd->bl.id;
save_flag = 2;
#ifdef VIP_ENABLE
if(sd->vip.enabled) //check if we're still vip
if (pc_isvip(sd)) // Check if we're still VIP
chrif_req_login_operation(1, sd->status.name, 6, 0, 1, 0);
#endif
chrif_save(sd,0);
break;
}

View File

@ -160,6 +160,7 @@ struct skill_cooldown_entry {
struct vip_info {
unsigned int enabled : 1;
time_t time;
bool disableshowrate; //State to disable clif_display_pinfo(). [Cydh]
};
#endif
@ -646,7 +647,6 @@ struct map_session_data {
int storage_size; /// Holds player storage size (VIP system).
#ifdef VIP_ENABLE
struct vip_info vip;
bool disableshowrate; //State to disable clif_display_pinfo(). [Cydh]
#endif
/// Bonus Script [Cydh]