From 03dc02d4d69b4580deb1f04c3f97870b30d923f9 Mon Sep 17 00:00:00 2001 From: Cydh Ramdh Date: Sun, 19 Oct 2014 20:59:44 +0700 Subject: [PATCH] * Fixed bonus_script doesn't remove Status Icon when timer is over (bugreport:9341) * Some little code stylization Signed-off-by: Cydh Ramdh --- src/common/db.h | 2 +- src/map/pc.c | 10 +++++++--- src/map/pc.h | 6 ++++-- src/map/status.c | 52 ++++++++++++++++++++++++------------------------ 4 files changed, 38 insertions(+), 32 deletions(-) diff --git a/src/common/db.h b/src/common/db.h index b36035f833..041bf5b737 100644 --- a/src/common/db.h +++ b/src/common/db.h @@ -1440,7 +1440,7 @@ void linkdb_foreach( struct linkdb_node** head, LinkDBFunc func, ... ); /// @param __heap Binary heap /// @param __topcmp Comparator /// @param __swp Swapper -#define BHEAP_POP2(__heap,__topcmp,__swp) \ +#define BHEAP_POP2(__heap,__topcmp,__swp) \ do{ \ VECTOR_INDEX(__heap,0) = VECTOR_POP(__heap); /* put last at index */ \ if( !VECTOR_LENGTH(__heap) ) /* removed last, nothing to do */ \ diff --git a/src/map/pc.c b/src/map/pc.c index eeb0ec1548..6bc702fa33 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -11018,11 +11018,13 @@ int pc_bonus_script_timer(int tid, unsigned int tick, int id, intptr_t data) { return 0; } - if (i > MAX_PC_BONUS_SCRIPT|| !(&sd->bonus_script[i]) || !sd->bonus_script[i].script) { + if (i >= MAX_PC_BONUS_SCRIPT || !(&sd->bonus_script[i]) || !sd->bonus_script[i].script) { ShowDebug("pc_bonus_script_timer: Invalid index %d\n",i); return 0; } + if (sd->bonus_script[i].icon != SI_BLANK) + clif_status_load(&sd->bl, sd->bonus_script[i].icon, 0); pc_bonus_script_remove(&sd->bonus_script[i]); status_calc_pc(sd,SCO_NONE); return 0; @@ -11067,7 +11069,8 @@ void pc_bonus_script_clear(struct map_session_data *sd, uint16 flag) { (flag&BSF_REM_DEBUFF && sd->bonus_script[i].type == 2)) //Remove bonus script based on debuff type ))) { - clif_status_change(&sd->bl,sd->bonus_script[i].icon,0,0,0,0,0); + if (sd->bonus_script[i].icon != SI_BLANK) + clif_status_load(&sd->bl, sd->bonus_script[i].icon, 0); pc_bonus_script_remove(&sd->bonus_script[i]); count++; } @@ -11092,7 +11095,8 @@ void pc_bonus_script_clear_all(struct map_session_data *sd, bool permanent) { continue; if (!permanent && sd->bonus_script[i].flag&BSF_PERMANENT) continue; - clif_status_change(&sd->bl,sd->bonus_script[i].icon,0,0,0,0,0); + if (sd->bonus_script[i].icon != SI_BLANK) + clif_status_load(&sd->bl, sd->bonus_script[i].icon, 0); pc_bonus_script_remove(&sd->bonus_script[i]); count++; } diff --git a/src/map/pc.h b/src/map/pc.h index 86fd65fca6..1b689d5596 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -346,6 +346,7 @@ struct map_session_data { short sp_gain_race_attack[RC_MAX]; short hp_gain_race_attack[RC_MAX]; // zeroed arrays end here. + // zeroed structures start here struct s_autospell autospell[MAX_PC_BONUS], autospell2[MAX_PC_BONUS], autospell3[MAX_PC_BONUS]; struct s_addeffect addeff[MAX_PC_BONUS], addeff2[MAX_PC_BONUS]; @@ -354,7 +355,7 @@ struct map_session_data { struct s_skill_bonus { //skillatk raises bonus dmg% of skills, skillheal increases heal%, skillblown increases bonus blewcount for some skills. unsigned short id; short val; - } skillatk[MAX_PC_BONUS], skillusesprate[MAX_PC_BONUS], skillusesp[MAX_PC_BONUS], skillheal[5], skillheal2[5], skillblown[MAX_PC_BONUS], skillcast[MAX_PC_BONUS], skillcooldown[MAX_PC_BONUS], skillfixcast[MAX_PC_BONUS], skillvarcast[MAX_PC_BONUS], skillfixcastrate[MAX_PC_BONUS]; + } skillatk[MAX_PC_BONUS], skillusesprate[MAX_PC_BONUS], skillusesp[MAX_PC_BONUS], skillheal[MAX_PC_BONUS], skillheal2[MAX_PC_BONUS], skillblown[MAX_PC_BONUS], skillcast[MAX_PC_BONUS], skillcooldown[MAX_PC_BONUS], skillfixcast[MAX_PC_BONUS], skillvarcast[MAX_PC_BONUS], skillfixcastrate[MAX_PC_BONUS]; struct s_regen { short value; int rate; @@ -377,9 +378,11 @@ struct map_session_data { int rate, tick; } def_set_race[RC_MAX], mdef_set_race[RC_MAX]; // zeroed structures end here + // manually zeroed structures start here. struct s_autobonus autobonus[MAX_PC_BONUS], autobonus2[MAX_PC_BONUS], autobonus3[MAX_PC_BONUS]; //Auto script on attack, when attacked, on skill usage // manually zeroed structures end here. + // zeroed vars start here. struct s_bonus { int hp, sp; @@ -421,7 +424,6 @@ struct map_session_data { int ematk; // matk bonus from equipment int eatk; // atk bonus from equipment } bonus; - // zeroed vars end here. int castrate,delayrate,hprate,sprate,dsprate; diff --git a/src/map/status.c b/src/map/status.c index 114f34aa42..ae8e6704f6 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -2825,11 +2825,11 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) status = &sd->base_status; // These are not zeroed. [zzo] - sd->hprate=100; - sd->sprate=100; - sd->castrate=100; - sd->delayrate=100; - sd->dsprate=100; + sd->hprate = 100; + sd->sprate = 100; + sd->castrate = 100; + sd->delayrate = 100; + sd->dsprate = 100; sd->hprecov_rate = 100; sd->sprecov_rate = 100; sd->matk_rate = 100; @@ -2864,9 +2864,9 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) + sizeof(sd->critaddrace) + sizeof(sd->expaddrace) + sizeof(sd->expaddclass) - + sizeof(sd->ignore_def_by_race) + sizeof(sd->ignore_mdef_by_race) + sizeof(sd->ignore_mdef_by_class) + + sizeof(sd->ignore_def_by_race) + sizeof(sd->sp_gain_race) + sizeof(sd->sp_gain_race_attack) + sizeof(sd->hp_gain_race_attack) @@ -2909,7 +2909,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) status->class_ = CLASS_NORMAL; // Zero up structures... - memset(&sd->autospell,0,sizeof(sd->autospell) + memset(&sd->autospell, 0, sizeof(sd->autospell) + sizeof(sd->autospell2) + sizeof(sd->autospell3) + sizeof(sd->addeff) @@ -2920,27 +2920,27 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) + sizeof(sd->skillusesp) + sizeof(sd->skillheal) + sizeof(sd->skillheal2) + + sizeof(sd->skillblown) + + sizeof(sd->skillcast) + + sizeof(sd->skillcooldown) + + sizeof(sd->skillfixcast) + + sizeof(sd->skillvarcast) + + sizeof(sd->skillfixcastrate) + sizeof(sd->hp_loss) + sizeof(sd->sp_loss) + sizeof(sd->hp_regen) + sizeof(sd->sp_regen) - + sizeof(sd->skillblown) - + sizeof(sd->skillcast) + sizeof(sd->add_def) + sizeof(sd->add_mdef) + sizeof(sd->add_mdmg) + sizeof(sd->add_drop) + sizeof(sd->itemhealrate) + sizeof(sd->subele2) - + sizeof(sd->skillcooldown) - + sizeof(sd->skillfixcast) - + sizeof(sd->skillvarcast) - + sizeof(sd->skillfixcastrate) + sizeof(sd->def_set_race) + sizeof(sd->mdef_set_race) ); - memset (&sd->bonus, 0,sizeof(sd->bonus)); + memset (&sd->bonus, 0, sizeof(sd->bonus)); // Autobonus pc_delautobonus(sd,sd->autobonus,ARRAYLENGTH(sd->autobonus),true); @@ -2952,15 +2952,15 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) npc_script_event(sd, NPCE_STATCALC); // Parse equipment - for(i=0;iequip_index[i]; // We pass INDEX to current_equip_item_index - for EQUIP_SCRIPT (new cards solution) [Lupus] - if(index < 0) + if (index < 0) continue; - if(i == EQI_AMMO) + if (i == EQI_AMMO) continue; if (pc_is_same_equip_index((enum equip_index)i, sd->equip_index, index)) continue; - if(!sd->inventory_data[index]) + if (!sd->inventory_data[index]) continue; status->def += sd->inventory_data[index]->def; @@ -2977,7 +2977,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) if (sd->status.inventory[index].refine > MAX_REFINE) sd->status.inventory[index].refine = MAX_REFINE; - if(sd->inventory_data[index]->type == IT_WEAPON) { + if (sd->inventory_data[index]->type == IT_WEAPON) { int r = sd->status.inventory[index].refine, wlv = sd->inventory_data[index]->wlv; struct weapon_data *wd; struct weapon_atk *wa; @@ -3089,24 +3089,24 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) status->def += (refinedef+50)/100; // Parse Cards - for(i=0;iequip_index[i]; // We pass INDEX to current_equip_item_index - for EQUIP_SCRIPT (new cards solution) [Lupus] - if(index < 0) + if (index < 0) continue; - if(i == EQI_AMMO) + if (i == EQI_AMMO) continue; if (pc_is_same_equip_index((enum equip_index)i, sd->equip_index, index)) continue; - if(sd->inventory_data[index]) { + if (sd->inventory_data[index]) { int j; struct item_data *data; // Card script execution. - if(itemdb_isspecial(sd->status.inventory[index].card[0])) + if (itemdb_isspecial(sd->status.inventory[index].card[0])) continue; - for(j=0;jstatus.inventory[index].card[j]; + for (j = 0; j < MAX_SLOTS; j++) { // Uses MAX_SLOTS to support Soul Bound system [Inkfish] + int c = sd->status.inventory[index].card[j]; current_equip_card_id= c; if(!c) continue;