summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-06-23 14:14:55 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2006-06-23 14:14:55 +0000
commit3d45013b385eb15794af54322ea5e167c3abb595 (patch)
tree41ba474124ea1e7610d41e979a9e20915fa82bd6 /src
parentd3a1d512467e7a4ac1928558ea84e26898d5de3b (diff)
downloadhercules-3d45013b385eb15794af54322ea5e167c3abb595.tar.gz
hercules-3d45013b385eb15794af54322ea5e167c3abb595.tar.bz2
hercules-3d45013b385eb15794af54322ea5e167c3abb595.tar.xz
hercules-3d45013b385eb15794af54322ea5e167c3abb595.zip
- Added pc_bonus_autospell_del, gives support for removing autospell effects. When a negative rate is specified, it will decrease the chance of casting (eg: You have two different cards with autospell Heal +20% each, then do autospell -30. The second card will be cancelled, and the first one will become Heal +10%)
- npc_timers now will not restore the previous timer data when there's no players attached (when it's strictly an npc timer). This should reenable the old behaviour of getnpctimer returning the total ellapsed time since "startnpctimer" even after the last label has been reached. However, this behaviour won't apply to player-attached timers. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@7312 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src')
-rw-r--r--src/map/npc.c10
-rw-r--r--src/map/pc.c26
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)