diff options
author | skotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2006-06-23 14:14:55 +0000 |
---|---|---|
committer | skotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2006-06-23 14:14:55 +0000 |
commit | 3d45013b385eb15794af54322ea5e167c3abb595 (patch) | |
tree | 41ba474124ea1e7610d41e979a9e20915fa82bd6 /src | |
parent | d3a1d512467e7a4ac1928558ea84e26898d5de3b (diff) | |
download | hercules-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.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)
|