瀏覽代碼

- Updated skill cooldown system to prevent multiple recordings of skill delays

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@15505 54d463be-8e91-2dee-dedb-b68131a5f0ec
epoque11 13 年之前
父節點
當前提交
55b11bd3e1
共有 2 個文件被更改,包括 49 次插入17 次删除
  1. 46 16
      src/map/skill.c
  2. 3 1
      src/map/skill.h

+ 46 - 16
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

+ 3 - 1
src/map/skill.h

@@ -345,10 +345,12 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );
 int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skilllv,unsigned int tick,int flag);
 
-int skill_blockpc_start (struct map_session_data*,int,int);
+int skill_blockpc_start_(struct map_session_data*, int, int, bool);
 int skill_blockhomun_start (struct homun_data*,int,int);
 int skill_blockmerc_start (struct mercenary_data*,int,int);
 
+#define skill_blockpc_start(sd, skillid, tick) skill_blockpc_start_( sd, skillid, tick, false )
+
 // ƒXƒLƒ‹�U?ˆêЇ?—�
 int skill_attack( int attack_type, struct block_list* src, struct block_list *dsrc,struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag );