Bug fixes
* Fixed wrong bonus for Max HP (bugreport:8679) * HP/SP respawn (restart_hp_rate and restart_sp_rate) should be work now (bugreport:8642) * Fixed MVP drop that failed to make random order (bugreport:8665) Signed-off-by: Cydh Ramdh <house.bad@gmail.com>
This commit is contained in:
parent
2dece5586d
commit
0766c73229
@ -7468,7 +7468,7 @@ ACMD_FUNC(iteminfo)
|
|||||||
item_data = item_array[i];
|
item_data = item_array[i];
|
||||||
sprintf(atcmd_output, msg_txt(sd,1277), // Item: '%s'/'%s'[%d] (%d) Type: %s | Extra Effect: %s
|
sprintf(atcmd_output, msg_txt(sd,1277), // Item: '%s'/'%s'[%d] (%d) Type: %s | Extra Effect: %s
|
||||||
item_data->name,item_data->jname,item_data->slot,item_data->nameid,
|
item_data->name,item_data->jname,item_data->slot,item_data->nameid,
|
||||||
(item_data->type != IT_AMMO) ? itemdb_typename(item_data->type) : itemdb_typename_ammo(item_data->look),
|
(item_data->type != IT_AMMO) ? itemdb_typename((enum item_types)item_data->type) : itemdb_typename_ammo((enum e_item_ammo)item_data->look),
|
||||||
(item_data->script==NULL)? msg_txt(sd,1278) : msg_txt(sd,1279) // None / With script
|
(item_data->script==NULL)? msg_txt(sd,1278) : msg_txt(sd,1279) // None / With script
|
||||||
);
|
);
|
||||||
clif_displaymessage(fd, atcmd_output);
|
clif_displaymessage(fd, atcmd_output);
|
||||||
|
@ -2510,30 +2510,36 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
|
|||||||
int mdrop_id[MAX_MVP_DROP];
|
int mdrop_id[MAX_MVP_DROP];
|
||||||
int mdrop_p[MAX_MVP_DROP];
|
int mdrop_p[MAX_MVP_DROP];
|
||||||
|
|
||||||
memset(&mdrop_id,0,MAX_MVP_DROP*sizeof(int));
|
memset(mdrop_id,0,MAX_MVP_DROP*sizeof(int));
|
||||||
|
memset(mdrop_p,0,MAX_MVP_DROP*sizeof(int));
|
||||||
|
|
||||||
|
//Make random order
|
||||||
for(i = 0; i < MAX_MVP_DROP; i++) {
|
for(i = 0; i < MAX_MVP_DROP; i++) {
|
||||||
while( 1 ) {
|
while( 1 ) {
|
||||||
int va = rnd()%MAX_MVP_DROP;
|
uint8 va = rnd()%MAX_MVP_DROP;
|
||||||
if( !mdrop_id[va] || !md->db->mvpitem[i].nameid ) {
|
if (mdrop_id[va] == 0) {
|
||||||
|
if (md->db->mvpitem[i].nameid > 0) {
|
||||||
mdrop_id[va] = md->db->mvpitem[i].nameid;
|
mdrop_id[va] = md->db->mvpitem[i].nameid;
|
||||||
mdrop_p[va] = md->db->mvpitem[i].p;
|
mdrop_p[va] = md->db->mvpitem[i].p;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
mdrop_id[va] = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = 0; i < MAX_MVP_DROP; i++) {
|
for(i = 0; i < MAX_MVP_DROP; i++) {
|
||||||
if(mdrop_id[i] <= 0)
|
if(mdrop_id[i] <= 0 || !itemdb_exists(mdrop_id[i]))
|
||||||
continue;
|
|
||||||
if(!itemdb_exists(mdrop_id[i]))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
temp = mdrop_p[i];
|
temp = mdrop_p[i];
|
||||||
|
if (temp != 10000) {
|
||||||
if(temp <= 0 && !battle_config.drop_rate0item)
|
if(temp <= 0 && !battle_config.drop_rate0item)
|
||||||
temp = 1;
|
temp = 1;
|
||||||
if(temp <= rnd()%10000+1) //if ==0, then it doesn't drop
|
if(rnd()%10000 >= temp) //if ==0, then it doesn't drop
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&item,0,sizeof(item));
|
memset(&item,0,sizeof(item));
|
||||||
item.nameid=mdrop_id[i];
|
item.nameid=mdrop_id[i];
|
||||||
|
@ -336,8 +336,16 @@ int skill_get_range2 (struct block_list *bl, uint16 skill_id, uint16 skill_lv) {
|
|||||||
return range;
|
return range;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Calculates heal value of skill's effect
|
||||||
|
* @param src
|
||||||
|
* @param target
|
||||||
|
* @param skill_id
|
||||||
|
* @param skill_lv
|
||||||
|
* @param heal
|
||||||
|
* @return modified heal value
|
||||||
|
*/
|
||||||
int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, bool heal) {
|
int skill_calc_heal(struct block_list *src, struct block_list *target, uint16 skill_id, uint16 skill_lv, bool heal) {
|
||||||
int skill, hp;
|
int skill, hp = 0;
|
||||||
struct map_session_data *sd = BL_CAST(BL_PC, src);
|
struct map_session_data *sd = BL_CAST(BL_PC, src);
|
||||||
struct map_session_data *tsd = BL_CAST(BL_PC, target);
|
struct map_session_data *tsd = BL_CAST(BL_PC, target);
|
||||||
struct status_change *sc, *tsc;
|
struct status_change *sc, *tsc;
|
||||||
@ -11697,11 +11705,6 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill
|
|||||||
val2 += pc_checkskill(sd,DC_DANCINGLESSON);
|
val2 += pc_checkskill(sd,DC_DANCINGLESSON);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BA_APPLEIDUN:
|
|
||||||
val1 = 5+2*skill_lv+status->vit/10; // MaxHP percent increase
|
|
||||||
if(sd)
|
|
||||||
val1 += pc_checkskill(sd,BA_MUSICALLESSON);
|
|
||||||
break;
|
|
||||||
case DC_SERVICEFORYOU:
|
case DC_SERVICEFORYOU:
|
||||||
//val1: MaxSP percent increase
|
//val1: MaxSP percent increase
|
||||||
val1 = 15+skill_lv+(status->int_/10); //Bonus rate by Dancer's INT
|
val1 = 15+skill_lv+(status->int_/10); //Bonus rate by Dancer's INT
|
||||||
|
@ -104,7 +104,7 @@ static unsigned short status_calc_ematk(struct block_list *,struct status_change
|
|||||||
#endif
|
#endif
|
||||||
static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type);
|
static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type);
|
||||||
static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type);
|
static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type);
|
||||||
static unsigned int status_calc_maxhpsp_pc(struct map_session_data *sd, uint8 flag);
|
static unsigned int status_calc_maxhpsp_pc(struct map_session_data* sd, unsigned int stat, bool isHP);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the status change associated with a skill.
|
* Returns the status change associated with a skill.
|
||||||
@ -2660,13 +2660,13 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get final MaxHP or MaxSP for player. References: http://irowiki.org/wiki/Max_HP and http://irowiki.org/wiki/Max_SP
|
* Get final MaxHP or MaxSP for player. References: http://irowiki.org/wiki/Max_HP and http://irowiki.org/wiki/Max_SP
|
||||||
* The calculation needs base_level, battle_status (vit or int), additive modifier, and multiplicative modifier
|
* The calculation needs base_level, base_status/battle_status (vit or int), additive modifier, and multiplicative modifier
|
||||||
* @param sd: Player
|
* @param sd Player
|
||||||
* @param flag: 0=Calculates MaxHP, 1=Calculates MaxSP
|
* @param stat Vit/Int of player as param modifier
|
||||||
* @return max_hp: value
|
* @param isHP true - calculates Max HP, false - calculated Max SP
|
||||||
|
* @return max The max value of HP or SP
|
||||||
**/
|
**/
|
||||||
static unsigned int status_calc_maxhpsp_pc(struct map_session_data* sd, uint8 flag)
|
static unsigned int status_calc_maxhpsp_pc(struct map_session_data* sd, unsigned int stat, bool isHP) {
|
||||||
{
|
|
||||||
double max = 0;
|
double max = 0;
|
||||||
uint16 idx, level, job_id;
|
uint16 idx, level, job_id;
|
||||||
|
|
||||||
@ -2676,13 +2676,13 @@ static unsigned int status_calc_maxhpsp_pc(struct map_session_data* sd, uint8 fl
|
|||||||
idx = pc_class2idx(job_id);
|
idx = pc_class2idx(job_id);
|
||||||
level = max(sd->status.base_level,1);
|
level = max(sd->status.base_level,1);
|
||||||
|
|
||||||
if (flag == 0) { //Calculates MaxHP
|
if (isHP) { //Calculates MaxHP
|
||||||
max = job_info[idx].base_hp[level-1] * (1 + (max(sd->battle_status.vit,1) * 0.01)) * ((sd->class_&JOBL_UPPER)?1.25:1);
|
max = job_info[idx].base_hp[level-1] * (1 + (max(stat,1) * 0.01)) * ((sd->class_&JOBL_UPPER)?1.25:1);
|
||||||
max += status_get_hpbonus(&sd->bl,STATUS_BONUS_FIX);
|
max += status_get_hpbonus(&sd->bl,STATUS_BONUS_FIX);
|
||||||
max = max * (1 + status_get_hpbonus(&sd->bl,STATUS_BONUS_RATE) * 0.01);
|
max = max * (1 + status_get_hpbonus(&sd->bl,STATUS_BONUS_RATE) * 0.01);
|
||||||
}
|
}
|
||||||
else if (flag == 1) { //Calculates MaxSP
|
else { //Calculates MaxSP
|
||||||
max = job_info[idx].base_sp[level-1] * (1 + (max(sd->battle_status.int_,1) * 0.01));
|
max = job_info[idx].base_sp[level-1] * (1 + (max(stat,1) * 0.01));
|
||||||
max += status_get_spbonus(&sd->bl,STATUS_BONUS_FIX);
|
max += status_get_spbonus(&sd->bl,STATUS_BONUS_FIX);
|
||||||
max = max * (1 + status_get_spbonus(&sd->bl,STATUS_BONUS_RATE) * 0.01);
|
max = max * (1 + status_get_spbonus(&sd->bl,STATUS_BONUS_RATE) * 0.01);
|
||||||
max = (max * ((sd->class_&JOBL_UPPER)?1.25:1)) + 0.5; //Don't have round()
|
max = (max * ((sd->class_&JOBL_UPPER)?1.25:1)) + 0.5; //Don't have round()
|
||||||
@ -3176,7 +3176,7 @@ int status_calc_pc_(struct map_session_data* sd, bool first)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// ----- HP MAX CALCULATION -----
|
// ----- HP MAX CALCULATION -----
|
||||||
sd->status.max_hp = status_calc_maxhpsp_pc(sd,0);
|
status->max_hp = sd->status.max_hp = status_calc_maxhpsp_pc(sd,status->vit,true);
|
||||||
|
|
||||||
if(battle_config.hp_rate != 100)
|
if(battle_config.hp_rate != 100)
|
||||||
status->max_hp = (int64)status->max_hp * battle_config.hp_rate/100;
|
status->max_hp = (int64)status->max_hp * battle_config.hp_rate/100;
|
||||||
@ -3187,7 +3187,7 @@ int status_calc_pc_(struct map_session_data* sd, bool first)
|
|||||||
status->max_hp = 1;
|
status->max_hp = 1;
|
||||||
|
|
||||||
// ----- SP MAX CALCULATION -----
|
// ----- SP MAX CALCULATION -----
|
||||||
sd->status.max_sp = status_calc_maxhpsp_pc(sd,1);
|
status->max_sp = sd->status.max_sp = status_calc_maxhpsp_pc(sd,status->int_,false);
|
||||||
|
|
||||||
if(battle_config.sp_rate != 100)
|
if(battle_config.sp_rate != 100)
|
||||||
status->max_sp = (int64)status->max_sp * battle_config.sp_rate/100;
|
status->max_sp = (int64)status->max_sp * battle_config.sp_rate/100;
|
||||||
@ -3925,8 +3925,6 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str
|
|||||||
} else
|
} else
|
||||||
regen->flag&=~sce->val4; // Remove regen as specified by val4
|
regen->flag&=~sce->val4; // Remove regen as specified by val4
|
||||||
}
|
}
|
||||||
if (sc->data[SC_APPLEIDUN])
|
|
||||||
regen->rate.hp += sc->data[SC_APPLEIDUN]->val3;
|
|
||||||
if (sc->data[SC_EPICLESIS]) {
|
if (sc->data[SC_EPICLESIS]) {
|
||||||
regen->rate.hp += sc->data[SC_EPICLESIS]->val3;
|
regen->rate.hp += sc->data[SC_EPICLESIS]->val3;
|
||||||
regen->rate.sp += sc->data[SC_EPICLESIS]->val4;
|
regen->rate.sp += sc->data[SC_EPICLESIS]->val4;
|
||||||
@ -4283,7 +4281,7 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
|
|||||||
|
|
||||||
if(flag&SCB_MAXHP) {
|
if(flag&SCB_MAXHP) {
|
||||||
if( bl->type&BL_PC ) {
|
if( bl->type&BL_PC ) {
|
||||||
status->max_hp = status_calc_maxhpsp_pc(sd,0);
|
status->max_hp = status_calc_maxhpsp_pc(sd,status->vit,true);
|
||||||
|
|
||||||
if( status->max_hp > (unsigned int)battle_config.max_hp )
|
if( status->max_hp > (unsigned int)battle_config.max_hp )
|
||||||
status->max_hp = (unsigned int)battle_config.max_hp;
|
status->max_hp = (unsigned int)battle_config.max_hp;
|
||||||
@ -4298,7 +4296,7 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
|
|||||||
|
|
||||||
if(flag&SCB_MAXSP) {
|
if(flag&SCB_MAXSP) {
|
||||||
if( bl->type&BL_PC ) {
|
if( bl->type&BL_PC ) {
|
||||||
status->max_sp = status_calc_maxhpsp_pc(sd,1);
|
status->max_sp = status_calc_maxhpsp_pc(sd,status->int_,false);
|
||||||
|
|
||||||
if( status->max_sp > (unsigned int)battle_config.max_sp )
|
if( status->max_sp > (unsigned int)battle_config.max_sp )
|
||||||
status->max_sp = (unsigned int)battle_config.max_sp;
|
status->max_sp = (unsigned int)battle_config.max_sp;
|
||||||
@ -9534,15 +9532,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
|||||||
val1 = 1002; // Default poring
|
val1 = 1002; // Default poring
|
||||||
break;
|
break;
|
||||||
case SC_APPLEIDUN:
|
case SC_APPLEIDUN:
|
||||||
{
|
val2 = (5 + 2 * val1) + (status_get_vit(src) / 10); //HP Rate: (5 + 2 * skill_lv) + (vit/10) + (BA_MUSICALLESSON level)
|
||||||
uint8 i;
|
if (sd)
|
||||||
val2 = 5 + (2 * (val1-1)); //HP Rate
|
val2 += pc_checkskill(sd,BA_MUSICALLESSON);
|
||||||
val3 = 30 + (5 * val1); //HP Recovery rate
|
break;
|
||||||
if (sd && (i = pc_checkskill(sd,BA_MUSICALLESSON)) > 0) {
|
|
||||||
val2 += i;
|
|
||||||
val3 += (5 * i);
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
case SC_EPICLESIS:
|
case SC_EPICLESIS:
|
||||||
val2 = 5 * val1; //HP rate bonus
|
val2 = 5 * val1; //HP rate bonus
|
||||||
switch (val1) { //! FIXME, looks so weird!
|
switch (val1) { //! FIXME, looks so weird!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user