Sfoglia il codice sorgente

- Added missing creation/destruction of the expcache_ers in guild.c
- Unified status_remove_buffs/status_remove_debuffs into a single function.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@5946 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 19 anni fa
parent
commit
0837bb4f38
5 ha cambiato i file con 73 aggiunte e 57 eliminazioni
  1. 4 0
      Changelog-Trunk.txt
  2. 2 0
      src/map/guild.c
  3. 2 2
      src/map/skill.c
  4. 64 53
      src/map/status.c
  5. 1 2
      src/map/status.h

+ 4 - 0
Changelog-Trunk.txt

@@ -4,6 +4,10 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2006/04/07
+	* Added missing creation/destruction of the expcache_ers in guild.c
+	  [Skotlex]
+	* Unified status_remove_buffs/status_remove_debuffs into a single function.
+	  [Skotlex]
 	* Fixed pc_setpos ignoring the clrtype sent to it. [Skotlex]
 	* unit_free will now use clear type 3 for players (warping out effect)
 	  [Skotlex]

+ 2 - 0
src/map/guild.c

@@ -206,6 +206,7 @@ void do_init_guild(void)
 	castle_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_RELEASE_DATA,sizeof(int));
 	guild_expcache_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
 	guild_infoevent_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
+	expcache_ers = ers_new((uint32)sizeof(struct guild_expcache)); 
 	guild_castleinfoevent_db=db_alloc(__FILE__,__LINE__,DB_INT,DB_OPT_BASE,sizeof(int));
 
 	guild_read_castledb();
@@ -2002,4 +2003,5 @@ void do_final_guild(void)
 	guild_expcache_db->destroy(guild_expcache_db,guild_expcache_db_final);
 	guild_infoevent_db->destroy(guild_infoevent_db,guild_infoevent_db_final);
 	guild_castleinfoevent_db->destroy(guild_castleinfoevent_db,guild_infoevent_db_final);
+	ers_destroy(expcache_ers);
 }

+ 2 - 2
src/map/skill.c

@@ -5277,7 +5277,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 					sc_start(bl,SC_INCMATKRATE,100,-50,skill_get_time2(skillid,skilllv));
 					break;
 				case 2:	// all buffs removed
-					status_change_clear_buffs(bl);
+					status_change_clear_buffs(bl,1);
 					break;
 				case 3:	// 1000 damage, random armor destroyed
 					{
@@ -6970,7 +6970,7 @@ int skill_unit_onplace_timer(struct skill_unit *src,struct block_list *bl,unsign
 					}
 					break;
 				case 1: // End all negative status
-					status_change_clear_debuffs (bl);
+					status_change_clear_buffs(bl,2);
 					break;
 				case 2: // Level 10 Blessing
 					sc_start(bl,SC_BLESSING,100,10,skill_get_time2(sg->skill_id, sg->skill_lv));

+ 64 - 53
src/map/status.c

@@ -4281,8 +4281,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 					break;
 				val2 = tick;
 				tick = 1000;
-				status_change_clear_buffs(bl);
-				status_change_clear_debuffs(bl); //Gospel clears both types.
+				status_change_clear_buffs(bl,3); //Remove buffs/debuffs
 			} else
 				calc_flag = 1;
 			break;
@@ -4318,7 +4317,7 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 			break;
 
 		case SC_HERMODE:
-			status_change_clear_buffs(bl);
+			status_change_clear_buffs(bl,1);
 			break;
 
 		case SC_REGENERATION:
@@ -5772,65 +5771,77 @@ int status_change_timer_sub(struct block_list *bl, va_list ap )
 	return 0;
 }
 
-int status_change_clear_buffs (struct block_list *bl)
+/*==========================================
+ * Clears buffs/debuffs of a character.
+ * type&1 -> buffs, type&2 -> debuffs
+ *------------------------------------------
+ */
+int status_change_clear_buffs (struct block_list *bl, int type)
 {
 	int i;
 	struct status_change *sc= status_get_sc(bl);
-	if (!sc || !sc->count)
-		return 0;		
-	for (i = 20; i < SC_MAX; i++) {
-		if(i==SC_HALLUCINATION || i==SC_WEIGHT50 || i==SC_WEIGHT90
-			|| i == SC_QUAGMIRE || i == SC_SIGNUMCRUCIS || i == SC_DECREASEAGI 
-			|| i == SC_SLOWDOWN || i == SC_ANKLE|| i == SC_BLADESTOP
-			|| i == SC_MINDBREAKER || i == SC_WINKCHARM 
-			|| i == SC_STOP || i == SC_NOCHAT || i == SC_ORCISH
-			|| i == SC_STRIPWEAPON || i == SC_STRIPSHIELD || i == SC_STRIPARMOR || i == SC_STRIPHELM
-			|| i == SC_COMBO || i == SC_DANCING || i == SC_GUILDAURA
-			)
-			continue;
-		if(i==SC_BERSERK) sc->data[i].val4 = 1;
-		if(sc->data[i].timer != -1)
-			status_change_end(bl,i,-1);
-	}
-	return 0;
-}
-int status_change_clear_debuffs (struct block_list *bl)
-{
-	int i;
-	struct status_change *sc = status_get_sc(bl);
+
 	if (!sc || !sc->count)
 		return 0;
+
+	if (type&2) //Debuffs
 	for (i = SC_COMMON_MIN; i <= SC_COMMON_MAX; i++) {
 		if(sc->data[i].timer != -1)
 			status_change_end(bl,i,-1);
 	}
-	//Other ailments not in the common range.
-	if(sc->data[SC_HALLUCINATION].timer != -1)
-		status_change_end(bl,SC_HALLUCINATION,-1);
-	if(sc->data[SC_QUAGMIRE].timer != -1)
-		status_change_end(bl,SC_QUAGMIRE,-1);
-	if(sc->data[SC_SIGNUMCRUCIS].timer != -1)
-		status_change_end(bl,SC_SIGNUMCRUCIS,-1);
-	if(sc->data[SC_DECREASEAGI].timer != -1)
-		status_change_end(bl,SC_DECREASEAGI,-1);
-	if(sc->data[SC_SLOWDOWN].timer != -1)
-		status_change_end(bl,SC_SLOWDOWN,-1);
-	if(sc->data[SC_MINDBREAKER].timer != -1)
-		status_change_end(bl,SC_MINDBREAKER,-1);
-	if(sc->data[SC_WINKCHARM].timer != -1)
-		status_change_end(bl,SC_WINKCHARM,-1);
-	if(sc->data[SC_STOP].timer != -1)
-		status_change_end(bl,SC_STOP,-1);
-	if(sc->data[SC_ORCISH].timer != -1)
-		status_change_end(bl,SC_ORCISH,-1);
-	if(sc->data[SC_STRIPWEAPON].timer != -1)
-		status_change_end(bl,SC_STRIPWEAPON,-1);
-	if(sc->data[SC_STRIPSHIELD].timer != -1)
-		status_change_end(bl,SC_STRIPSHIELD,-1);
-	if(sc->data[SC_STRIPARMOR].timer != -1)
-		status_change_end(bl,SC_STRIPARMOR,-1);
-	if(sc->data[SC_STRIPHELM].timer != -1)
-		status_change_end(bl,SC_STRIPHELM,-1);
+
+	for (i = SC_COMMON_MAX+1; i < SC_MAX; i++) {
+
+		if(sc->data[i].timer == -1)
+			continue;
+		
+		switch (i) {
+			//Stuff that cannot be removed
+			case SC_WEIGHT50:
+			case SC_WEIGHT90:
+			case SC_COMBO:
+			case SC_DANCING:
+			case SC_GUILDAURA:
+			case SC_SAFETYWALL:
+			case SC_NOCHAT:
+			case SC_ANKLE:
+			case SC_BLADESTOP:
+			case SC_CP_WEAPON:
+			case SC_CP_SHIELD:
+			case SC_CP_ARMOR:
+			case SC_CP_HELM:
+				continue;
+				
+			//Debuffs that can be removed.
+			case SC_HALLUCINATION:
+			case SC_QUAGMIRE:
+			case SC_SIGNUMCRUCIS:
+			case SC_DECREASEAGI:
+			case SC_SLOWDOWN:
+			case SC_MINDBREAKER:
+			case SC_WINKCHARM:
+			case SC_STOP:
+			case SC_ORCISH:
+			case SC_STRIPWEAPON:
+			case SC_STRIPSHIELD:
+			case SC_STRIPARMOR:
+			case SC_STRIPHELM:
+				if (!(type&2))
+					continue;
+				break;
+			//The rest are buffs that can be removed.
+			case SC_BERSERK:
+				if (!(type&1))
+					continue;
+			  	sc->data[i].val4 = 1;
+				break;
+			default:
+				if (!(type&1))
+					continue;
+				break;
+		}
+		status_change_end(bl,i,-1);
+	}
 	return 0;
 }
 

+ 1 - 2
src/map/status.h

@@ -510,8 +510,7 @@ int status_change_end( struct block_list* bl , int type,int tid );
 int status_change_timer(int tid, unsigned int tick, int id, int data);
 int status_change_timer_sub(struct block_list *bl, va_list ap );
 int status_change_clear(struct block_list *bl,int type);
-int status_change_clear_buffs(struct block_list *bl);
-int status_change_clear_debuffs(struct block_list *bl);
+int status_change_clear_buffs(struct block_list *bl, int type);
 
 int status_calc_pet(struct map_session_data* sd, int first); // [Skotlex]
 int status_calc_pc(struct map_session_data* sd,int first);