소스 검색

- Optimised the guild aura routine which was wasting cycles by processing every unit on a map (rather than guild members)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@15084 54d463be-8e91-2dee-dedb-b68131a5f0ec
epoque11 13 년 전
부모
커밋
bb0dad8ec9
3개의 변경된 파일16개의 추가작업 그리고 18개의 파일을 삭제
  1. 6 15
      src/map/skill.c
  2. 1 1
      src/map/skill.h
  3. 9 2
      src/map/unit.c

+ 6 - 15
src/map/skill.c

@@ -2382,27 +2382,18 @@ static int skill_check_unit_range2 (struct block_list *bl, int x, int y, int ski
 		type, skillid);
 }
 
-int skill_guildaura_sub (struct block_list *bl, va_list ap)
+int skill_guildaura_sub (struct map_session_data* sd, int id, int gid, int strvit, int agidex)
 {
-	struct map_session_data *sd;
-	int gid, id, strvit, agidex;
-
-	sd = (struct map_session_data *)bl;
+	nullpo_ret(sd);
 
-	id = va_arg(ap,int);
-	gid = va_arg(ap,int);
-	if (sd->status.guild_id != gid)
+	if( sd->status.guild_id != gid )
 		return 0;
-
-	if(id == sd->bl.id && battle_config.guild_aura&16)
+	if( id == sd->bl.id && battle_config.guild_aura&16 )
 		return 0;
 
-	strvit = va_arg(ap,int);
-	agidex = va_arg(ap,int);
-
-	if (sd->sc.data[SC_GUILDAURA]) {
+	if( sd->sc.data[SC_GUILDAURA] ) {
 		struct status_change_entry *sce = sd->sc.data[SC_GUILDAURA];
-		if (sce->val3 != strvit || sce->val4 != agidex) {
+		if( sce->val3 != strvit || sce->val4 != agidex ) {
 			sce->val3 = strvit;
 			sce->val4 = agidex;
 			status_calc_bl(&sd->bl, StatusChangeFlagTable[SC_GUILDAURA]);

+ 1 - 1
src/map/skill.h

@@ -309,7 +309,7 @@ int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int
 struct skill_unit_group *skill_check_dancing( struct block_list *src );
 
 // Guild skills [celest]
-int skill_guildaura_sub (struct block_list *bl,va_list ap);
+int skill_guildaura_sub (struct map_session_data* sd, int id, int gid, int strvit, int agidex);
 
 // ‰r�¥ƒLƒƒƒ“ƒZƒ‹
 int skill_castcancel(struct block_list *bl,int type);

+ 9 - 2
src/map/unit.c

@@ -187,8 +187,15 @@ static int unit_walktoxy_timer(int tid, unsigned int tick, int id, intptr_t data
 			if ((skill = guild_checkskill(g, GD_SOULCOLD)) > 0) agidex |= (skill&0xFFFF)<<16;
 			if ((skill = guild_checkskill(g, GD_HAWKEYES)) > 0) agidex |= skill&0xFFFF;
 			if (strvit || agidex)
-				map_foreachinrange(skill_guildaura_sub, bl,2, BL_PC,
-					bl->id, sd->status.guild_id, strvit, agidex);
+			{// replaced redundant foreachinrange call with smaller and much more efficient iteration
+				for( i = 0; g->max_member > i; i++ )
+				{
+					if( g->member[i].online && g->member[i].sd && check_distance_bl(&sd->bl, &g->member[i].sd->bl, 2) )
+					{// perform the aura on the member as appropriate
+						skill_guildaura_sub( g->member[i].sd, g->member[i].sd->bl.id, sd->status.guild_id, strvit, agidex );
+					}
+				}
+			}
 		}
 	} else if (md) {
 		if( map_getcell(bl->m,x,y,CELL_CHKNPC) ) {