From a2f6a9bfc21d4f259ed989542a9114b5a2eb97d5 Mon Sep 17 00:00:00 2001 From: epoque11 Date: Sun, 22 Jan 2012 22:48:05 +0000 Subject: - Updated skill cooldown system to prevent multiple recordings of skill delays git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@15505 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/skill.c | 62 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 16 deletions(-) (limited to 'src/map/skill.c') diff --git a/src/map/skill.c b/src/map/skill.c index ff9641451..68769e599 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -13969,10 +13969,19 @@ int skill_blockpc_end(int tid, unsigned int tick, int id, intptr_t data) return 1; } -int skill_blockpc_start(struct map_session_data *sd, int skillid, int tick) +/** + * flags a singular skill as being blocked from persistent usage. + * @param sd the player the skill delay affects + * @param skillid the skill which should be delayed + * @param tick the length of time the delay should last + * @param load whether this assignment is being loaded upon player login + * @return 0 if successful, -1 otherwise + */ +int skill_blockpc_start_(struct map_session_data *sd, int skillid, int tick, bool load) { - struct skill_cd * cd = NULL; int oskillid = skillid; + struct skill_cd* cd = NULL; + nullpo_retr (-1, sd); skillid = skill_get_index(skillid); @@ -13987,14 +13996,20 @@ int skill_blockpc_start(struct map_session_data *sd, int skillid, int tick) if( battle_config.display_status_timers ) clif_skill_cooldown(sd, skillid, tick); - if( !( cd = idb_get(skillcd_db,sd->status.char_id) ) ) { - CREATE(cd,struct skill_cd,1); - idb_put(skillcd_db, sd->status.char_id, cd); + if( !load ) + {// not being loaded initially so ensure the skill delay is recorded + if( !(cd = idb_get(skillcd_db,sd->status.char_id)) ) + {// create a new skill cooldown object for map storage + CREATE( cd, struct skill_cd, 1 ); + idb_put( skillcd_db, sd->status.char_id, cd ); + } + + // record the skill duration in the database map + cd->duration[cd->cursor] = tick; + cd->skidx[cd->cursor] = skillid; + cd->nameid[cd->cursor] = oskillid; + cd->cursor++; } - cd->duration[cd->cursor] = tick; - cd->skidx[cd->cursor] = skillid; - cd->nameid[cd->cursor] = oskillid; - cd->cursor++; sd->blockskill[skillid] = 0x1|(0xFE&add_timer(gettick()+tick,skill_blockpc_end,sd->bl.id,skillid)); return 0; @@ -14432,17 +14447,32 @@ int skill_stasis_check(struct block_list *bl, int src_id, int skillid) return 0; // Can Cast anything else like Weapon Skills } -void skill_cooldown_load(struct map_session_data * sd) { - struct skill_cd * cd = NULL; + +/** + * reload stored skill cooldowns when a player logs in. + * @param sd the affected player structure + */ +void skill_cooldown_load(struct map_session_data * sd) +{ int i; - if( !( cd = idb_get(skillcd_db,sd->status.char_id) ) ) - return;//nothing for us here + struct skill_cd* cd = NULL; + + // always check to make sure the session properly exists + nullpo_retv(sd); + + if( !(cd = idb_get(skillcd_db, sd->status.char_id)) ) + {// no skill cooldown is associated with this character + return; + } - for( i = 0; i < cd->cursor; i++ ) { - skill_blockpc_start(sd, cd->nameid[i], cd->duration[i]); + // process each individual cooldown associated with the character + for( i = 0; i < cd->cursor; i++ ) + { + // block the skill from usage but ensure it is not recorded (load = true) + skill_blockpc_start_( sd, cd->nameid[i], cd->duration[i], true ); } - return; } + /*========================================== * DB reading. * skill_db.txt -- cgit v1.2.3-70-g09d2