summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorepoque11 <epoque11@54d463be-8e91-2dee-dedb-b68131a5f0ec>2011-12-13 02:55:36 +0000
committerepoque11 <epoque11@54d463be-8e91-2dee-dedb-b68131a5f0ec>2011-12-13 02:55:36 +0000
commit9b24ab2cffb38d283ea1c68c961507db0d86f7de (patch)
tree48d0e6aa53c7798f51d557717d348d2f1cca04ee
parent0fe7b873ae06352aba2840eacf687d270d64fc2d (diff)
downloadhercules-9b24ab2cffb38d283ea1c68c961507db0d86f7de.tar.gz
hercules-9b24ab2cffb38d283ea1c68c961507db0d86f7de.tar.bz2
hercules-9b24ab2cffb38d283ea1c68c961507db0d86f7de.tar.xz
hercules-9b24ab2cffb38d283ea1c68c961507db0d86f7de.zip
- Optimised the guild aura routine which was wasting cycles by processing every unit on a map (rather than guild members)
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@15084 54d463be-8e91-2dee-dedb-b68131a5f0ec
-rw-r--r--src/map/skill.c21
-rw-r--r--src/map/skill.h2
-rw-r--r--src/map/unit.c11
3 files changed, 16 insertions, 18 deletions
diff --git a/src/map/skill.c b/src/map/skill.c
index a7e75b6f4..1847ffb86 100644
--- a/src/map/skill.c
+++ b/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]);
diff --git a/src/map/skill.h b/src/map/skill.h
index 97bd54252..4670fbbf5 100644
--- a/src/map/skill.h
+++ b/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);
// 詠唱キャンセル
int skill_castcancel(struct block_list *bl,int type);
diff --git a/src/map/unit.c b/src/map/unit.c
index 9cb198c3c..fb283a69b 100644
--- a/src/map/unit.c
+++ b/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) ) {