diff options
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/npc.c | 10 | ||||
-rw-r--r-- | src/map/pc.c | 26 |
2 files changed, 32 insertions, 4 deletions
diff --git a/src/map/npc.c b/src/map/npc.c index 1a6302abd..3d1557c1a 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -634,10 +634,12 @@ int npc_timerevent(int tid,unsigned int tick,int id,int data) ers_free(timer_event_ers, ted);
}
run_script(nd->u.scr.script,te->pos,nd->u.scr.rid,nd->bl.id);
- //Restore previous data.
- nd->u.scr.rid = old_rid;
- nd->u.scr.timer = old_timer;
- nd->u.scr.timertick = old_tick;
+ //Restore previous data, only if this timer is a player-attached one.
+ if (sd) {
+ nd->u.scr.rid = old_rid;
+ nd->u.scr.timer = old_timer;
+ nd->u.scr.timertick = old_tick;
+ }
return 0;
}
/*==========================================
diff --git a/src/map/pc.c b/src/map/pc.c index 9090a7a65..86c94e73a 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -1115,8 +1115,34 @@ int pc_disguise(struct map_session_data *sd, int class_) { return 1;
}
+static int pc_bonus_autospell_del(struct s_autospell *spell, int max, short id, short lv, short rate, short card_id) {
+ int i, j;
+ for(i=max-1; i>=0 && !spell[i].id; i--);
+ if (i<0) return 0; //Nothing to substract from.
+
+ j = i;
+ for(; i>=0 && rate > 0; i--)
+ {
+ if (spell[i].id != id || spell[i].lv != lv) continue;
+ if (rate >= spell[i].rate) {
+ rate-= spell[i].rate;
+ spell[i].rate = 0;
+ memmove(&spell[i], &spell[j], sizeof(struct s_autospell));
+ memset(&spell[j], 0, sizeof(struct s_autospell));
+ j--;
+ } else {
+ spell[i].rate -= rate;
+ rate = 0;
+ }
+ }
+ return rate;
+}
+
static int pc_bonus_autospell(struct s_autospell *spell, int max, short id, short lv, short rate, short card_id) {
int i;
+ if (rate < 0) return //Remove the autobonus.
+ pc_bonus_autospell_del(spell, max, id, lv, -rate, card_id);
+
for (i = 0; i < max && spell[i].id; i++) {
if (spell[i].card_id == card_id &&
spell[i].id == id && spell[i].lv == lv)
|