|
@@ -2356,10 +2356,14 @@ void pc_delautobonus(struct map_session_data* sd, std::vector<s_autobonus> &bonu
|
|
if (!sd)
|
|
if (!sd)
|
|
return;
|
|
return;
|
|
|
|
|
|
- for (uint8 i = 0; i < bonus.size(); i++) {
|
|
|
|
- if (bonus[i].active != INVALID_TIMER) {
|
|
|
|
- if (restore && (sd->state.autobonus&bonus[i].pos) == bonus[i].pos) {
|
|
|
|
- if (bonus[i].bonus_script) {
|
|
|
|
|
|
+ std::vector<s_autobonus>::iterator it = bonus.begin();
|
|
|
|
+
|
|
|
|
+ while( it != bonus.end() ){
|
|
|
|
+ s_autobonus b = *it;
|
|
|
|
+
|
|
|
|
+ if (b.active != INVALID_TIMER) {
|
|
|
|
+ if (restore && (sd->state.autobonus&b.pos) == b.pos) {
|
|
|
|
+ if (b.bonus_script) {
|
|
unsigned int equip_pos_idx = 0;
|
|
unsigned int equip_pos_idx = 0;
|
|
|
|
|
|
// Create a list of all equipped positions to see if all items needed for the autobonus are still present [Playtester]
|
|
// Create a list of all equipped positions to see if all items needed for the autobonus are still present [Playtester]
|
|
@@ -2368,22 +2372,26 @@ void pc_delautobonus(struct map_session_data* sd, std::vector<s_autobonus> &bonu
|
|
equip_pos_idx |= sd->inventory.u.items_inventory[sd->equip_index[j]].equip;
|
|
equip_pos_idx |= sd->inventory.u.items_inventory[sd->equip_index[j]].equip;
|
|
}
|
|
}
|
|
|
|
|
|
- if ((equip_pos_idx&bonus[i].pos) == bonus[i].pos)
|
|
|
|
- script_run_autobonus(bonus[i].bonus_script, sd, bonus[i].pos);
|
|
|
|
|
|
+ if ((equip_pos_idx&b.pos) == b.pos)
|
|
|
|
+ script_run_autobonus(b.bonus_script, sd, b.pos);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ it++;
|
|
|
|
+
|
|
continue;
|
|
continue;
|
|
} else { // Logout / Unequipped an item with an activated bonus
|
|
} else { // Logout / Unequipped an item with an activated bonus
|
|
- delete_timer(bonus[i].active, pc_endautobonus);
|
|
|
|
- bonus[i].active = INVALID_TIMER;
|
|
|
|
|
|
+ delete_timer(b.active, pc_endautobonus);
|
|
|
|
+ b.active = INVALID_TIMER;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (bonus[i].bonus_script)
|
|
|
|
- aFree(bonus[i].bonus_script);
|
|
|
|
- if (bonus[i].other_script)
|
|
|
|
- aFree(bonus[i].other_script);
|
|
|
|
|
|
+ if (b.bonus_script)
|
|
|
|
+ aFree(b.bonus_script);
|
|
|
|
+ if (b.other_script)
|
|
|
|
+ aFree(b.other_script);
|
|
|
|
+
|
|
|
|
+ it = bonus.erase(it);
|
|
}
|
|
}
|
|
- bonus.clear();
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -2391,7 +2399,7 @@ void pc_delautobonus(struct map_session_data* sd, std::vector<s_autobonus> &bonu
|
|
* @param sd: Player data
|
|
* @param sd: Player data
|
|
* @param autobonus: Autobonus to run
|
|
* @param autobonus: Autobonus to run
|
|
*/
|
|
*/
|
|
-void pc_exeautobonus(struct map_session_data *sd, struct s_autobonus *autobonus)
|
|
|
|
|
|
+void pc_exeautobonus(struct map_session_data *sd, std::vector<s_autobonus> *bonus, struct s_autobonus *autobonus)
|
|
{
|
|
{
|
|
if (!sd || !autobonus)
|
|
if (!sd || !autobonus)
|
|
return;
|
|
return;
|
|
@@ -2412,7 +2420,7 @@ void pc_exeautobonus(struct map_session_data *sd, struct s_autobonus *autobonus)
|
|
script_run_autobonus(autobonus->other_script,sd,autobonus->pos);
|
|
script_run_autobonus(autobonus->other_script,sd,autobonus->pos);
|
|
}
|
|
}
|
|
|
|
|
|
- autobonus->active = add_timer(gettick()+autobonus->duration, pc_endautobonus, sd->bl.id, (intptr_t)autobonus);
|
|
|
|
|
|
+ autobonus->active = add_timer(gettick()+autobonus->duration, pc_endautobonus, sd->bl.id, (intptr_t)bonus);
|
|
sd->state.autobonus |= autobonus->pos;
|
|
sd->state.autobonus |= autobonus->pos;
|
|
status_calc_pc(sd,SCO_FORCE);
|
|
status_calc_pc(sd,SCO_FORCE);
|
|
}
|
|
}
|
|
@@ -2422,13 +2430,19 @@ void pc_exeautobonus(struct map_session_data *sd, struct s_autobonus *autobonus)
|
|
*/
|
|
*/
|
|
TIMER_FUNC(pc_endautobonus){
|
|
TIMER_FUNC(pc_endautobonus){
|
|
struct map_session_data *sd = map_id2sd(id);
|
|
struct map_session_data *sd = map_id2sd(id);
|
|
- struct s_autobonus *autobonus = (struct s_autobonus *)data;
|
|
|
|
|
|
+ std::vector<s_autobonus> *bonus = (std::vector<s_autobonus> *)data;
|
|
|
|
|
|
nullpo_ret(sd);
|
|
nullpo_ret(sd);
|
|
- nullpo_ret(autobonus);
|
|
|
|
|
|
+ nullpo_ret(bonus);
|
|
|
|
|
|
- autobonus->active = INVALID_TIMER;
|
|
|
|
- sd->state.autobonus &= ~autobonus->pos;
|
|
|
|
|
|
+ for( struct s_autobonus& autobonus : *bonus ){
|
|
|
|
+ if( autobonus.active == tid ){
|
|
|
|
+ autobonus.active = INVALID_TIMER;
|
|
|
|
+ sd->state.autobonus &= ~autobonus.pos;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
status_calc_pc(sd,SCO_FORCE);
|
|
status_calc_pc(sd,SCO_FORCE);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|