summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
Diffstat (limited to 'src/map')
-rw-r--r--src/map/clif.c2
-rw-r--r--src/map/guild.c231
-rw-r--r--src/map/guild.h2
3 files changed, 110 insertions, 125 deletions
diff --git a/src/map/clif.c b/src/map/clif.c
index e0d4c1ca0..6a7017d5f 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -6049,7 +6049,7 @@ int clif_guild_belonginfo(struct map_session_data *sd,struct guild *g)
nullpo_retr(0, g);
fd=sd->fd;
- ps=guild_getposition(sd,g);
+ ps=guild_getposition(g,sd);
WFIFOHEAD(fd,packet_len(0x16c));
memset(WFIFOP(fd,0),0,packet_len(0x16c));
diff --git a/src/map/guild.c b/src/map/guild.c
index a6ebd5157..78db261b5 100644
--- a/src/map/guild.c
+++ b/src/map/guild.c
@@ -201,123 +201,96 @@ static int guild_read_castledb(void)
return 0;
}
-// 初期化
-void do_init_guild(void)
-{
- guild_db=idb_alloc(DB_OPT_RELEASE_DATA);
- castle_db=idb_alloc(DB_OPT_RELEASE_DATA);
- guild_expcache_db=idb_alloc(DB_OPT_BASE);
- guild_infoevent_db=idb_alloc(DB_OPT_BASE);
- expcache_ers = ers_new(sizeof(struct guild_expcache));
- guild_castleinfoevent_db=idb_alloc(DB_OPT_BASE);
-
- guild_read_castledb();
-
- guild_read_guildskill_tree_db(); //guild skill tree [Komurka]
-
- add_timer_func_list(guild_payexp_timer,"guild_payexp_timer");
- add_timer_func_list(guild_save_sub, "guild_save_sub");
- add_timer_func_list(guild_send_xy_timer, "guild_send_xy_timer");
- add_timer_interval(gettick()+GUILD_PAYEXP_INVERVAL,guild_payexp_timer,0,0,GUILD_PAYEXP_INVERVAL);
- add_timer_interval(gettick()+GUILD_SEND_XY_INVERVAL,guild_send_xy_timer,0,0,GUILD_SEND_XY_INVERVAL);
-}
-
-
-// 検索
-struct guild *guild_search(int guild_id)
+/// lookup: guild id -> guild*
+struct guild* guild_search(int guild_id)
{
return idb_get(guild_db,guild_id);
}
-int guild_searchname_sub(DBKey key,void *data,va_list ap)
-{
- struct guild *g=(struct guild *)data,**dst;
- char *str;
- str=va_arg(ap,char *);
- dst=va_arg(ap,struct guild **);
- if(strcmpi(g->name,str)==0)
- *dst=g;
- return 0;
-}
-// ギルド名検索
-struct guild* guild_searchname(char *str)
+
+/// lookup: guild name -> guild*
+struct guild* guild_searchname(char* str)
{
- struct guild *g=NULL;
- guild_db->foreach(guild_db,guild_searchname_sub,str,&g);
+ struct guild* g;
+
+ DBIterator* iter = guild_db->iterator(guild_db);
+ for( g = iter->first(iter,NULL); iter->exists(iter); g = iter->next(iter,NULL) )
+ {
+ if( strcmpi(g->name, str) == 0 )
+ break;
+ }
+ iter->destroy(iter);
+
return g;
}
-struct guild_castle *guild_castle_search(int gcid)
+
+/// lookup: castle id -> castle*
+struct guild_castle* guild_castle_search(int gcid)
{
return idb_get(castle_db,gcid);
}
-// mapnameに対応したアジトのgcを返す
-struct guild_castle* guild_mapname2gc(const char* mapname)
+/// lookup: map index -> castle*
+struct guild_castle* guild_mapindex2gc(short mapindex)
{
int i;
- for(i = 0; i < MAX_GUILDCASTLE; i++)
- {
- struct guild_castle* gc;
- gc = guild_castle_search(i);
+ struct guild_castle *gc=NULL;
+
+ for(i=0;i<MAX_GUILDCASTLE;i++){
+ gc=guild_castle_search(i);
if(!gc) continue;
- if(strcmp(gc->map_name,mapname)==0) return gc;
+ if(strcmp(gc->map_name,mapindex_id2name(mapindex))==0) return gc;
}
return NULL;
}
-struct guild_castle *guild_mapindex2gc(short mapindex)
+/// lookup: map name -> castle*
+struct guild_castle* guild_mapname2gc(const char* mapname)
{
int i;
- struct guild_castle *gc=NULL;
-
- for(i=0;i<MAX_GUILDCASTLE;i++){
- gc=guild_castle_search(i);
+ for(i = 0; i < MAX_GUILDCASTLE; i++)
+ {
+ struct guild_castle* gc;
+ gc = guild_castle_search(i);
if(!gc) continue;
- if(strcmp(gc->map_name,mapindex_id2name(mapindex))==0) return gc;
+ if(strcmp(gc->map_name,mapname)==0) return gc;
}
return NULL;
}
-
-
-// ログイン中のギルドメンバーの1人のsdを返す
-struct map_session_data *guild_getavailablesd(struct guild *g)
+struct map_session_data* guild_getavailablesd(struct guild* g)
{
int i;
nullpo_retr(NULL, g);
- for(i=0;i<g->max_member;i++)
- if(g->member[i].sd!=NULL)
- return g->member[i].sd;
- return NULL;
+ ARR_FIND( 0, g->max_member, i, g->member[i].sd != NULL );
+ return( i < g->max_member ) ? g->member[i].sd : NULL;
}
-// ギルドメンバーのインデックスを返す
+/// lookup: player AID/CID -> member index
int guild_getindex(struct guild *g,int account_id,int char_id)
{
int i;
- if(g==NULL)
+
+ if( g == NULL )
return -1;
- for(i=0;i<g->max_member;i++)
- if( g->member[i].account_id==account_id &&
- g->member[i].char_id==char_id )
- return i;
- return -1;
+
+ ARR_FIND( 0, g->max_member, i, g->member[i].account_id == account_id && g->member[i].char_id == char_id );
+ return( i < g->max_member ) ? i : -1;
}
-// ギルドメンバーの役職を返す
-int guild_getposition(struct map_session_data *sd,struct guild *g)
+
+/// lookup: player sd -> member position
+int guild_getposition(struct guild* g, struct map_session_data* sd)
{
int i;
nullpo_retr(-1, sd);
- if(g==NULL && (g=guild_search(sd->status.guild_id))==NULL)
+ if( g == NULL && (g=guild_search(sd->status.guild_id)) == NULL )
return -1;
- for(i=0;i<g->max_member;i++)
- if( g->member[i].account_id==sd->status.account_id &&
- g->member[i].char_id==sd->status.char_id )
- return g->member[i].position;
- return -1;
+
+ ARR_FIND( 0, g->max_member, i, g->member[i].account_id == sd->status.account_id && g->member[i].char_id == sd->status.char_id );
+ return( i < g->max_member ) ? g->member[i].position : -1;
}
// メンバー情報の作成
@@ -457,10 +430,9 @@ int guild_created(int account_id,int guild_id)
// 情報要求
int guild_request_info(int guild_id)
{
-// if(battle_config.etc_log)
-// printf("guild_request_info\n");
return intif_guild_request_info(guild_id);
}
+
// イベント付き情報要求
int guild_npc_request_info(int guild_id,const char *event)
{
@@ -631,7 +603,7 @@ int guild_invite(struct map_session_data *sd,struct map_session_data *tsd)
if(tsd==NULL || g==NULL)
return 0;
- if( (i=guild_getposition(sd,g))<0 || !(g->position[i].mode&0x0001) )
+ if( (i=guild_getposition(g,sd))<0 || !(g->position[i].mode&0x0001) )
return 0; //Invite permission.
if(!battle_config.invite_request_check) {
@@ -799,7 +771,7 @@ int guild_expulsion(struct map_session_data* sd, int guild_id, int account_id, i
if(sd->status.guild_id!=guild_id)
return 0;
- if( (ps=guild_getposition(sd,g))<0 || !(g->position[ps].mode&0x0010) )
+ if( (ps=guild_getposition(g,sd))<0 || !(g->position[ps].mode&0x0010) )
return 0; //Expulsion permission
//Can't leave inside guild castles.
@@ -808,15 +780,11 @@ int guild_expulsion(struct map_session_data* sd, int guild_id, int account_id, i
(agit_flag && map[tsd->bl.m].flag.gvg_castle))
return 0;
- for(i=0;i<g->max_member;i++){ // 所属しているか
- if(g->member[i].account_id==account_id &&
- g->member[i].char_id==char_id ){
- if(!strcmp(g->member[i].name,g->master))
- return 0; //Can't expel the GM!
- intif_guild_leave(g->guild_id,account_id,char_id,1,mes);
- return 0;
- }
- }
+ // find the member and perform expulsion
+ i = guild_getindex(g, account_id, char_id);
+ if( i != -1 && strcmp(g->member[i].name,g->master) != 0 ) //Can't expel the GL!
+ intif_guild_leave(g->guild_id,account_id,char_id,1,mes);
+
return 0;
}
@@ -830,11 +798,8 @@ int guild_member_leaved(int guild_id, int account_id, int char_id, int flag, con
if(g == NULL)
return 0; // no such guild (error!)
- for(i = 0; i < g->max_member; i++)
- if( g->member[i].account_id == account_id && g->member[i].char_id == char_id )
- break;
-
- if (i == g->max_member)
+ i = guild_getindex(g, account_id, char_id);
+ if( i == -1 )
return 0; // not a member (inconsistency!)
online_member_sd = guild_getavailablesd(g);
@@ -1002,8 +967,7 @@ int guild_recv_message(int guild_id,int account_id,const char *mes,int len)
// ギルドメンバの役職変更
int guild_change_memberposition(int guild_id,int account_id,int char_id,int idx)
{
- return intif_guild_change_memberinfo(
- guild_id,account_id,char_id,GMI_POSITION,&idx,sizeof(idx));
+ return intif_guild_change_memberinfo(guild_id,account_id,char_id,GMI_POSITION,&idx,sizeof(idx));
}
// ギルドメンバの役職変更通知
int guild_memberposition_changed(struct guild *g,int idx,int pos)
@@ -1029,8 +993,7 @@ int guild_change_position(int guild_id,int idx,
//Mode 0x10 <- Expel.
p.mode=mode&0x11;
p.exp_mode=exp_mode;
- memcpy(p.name,name,NAME_LENGTH);
- p.name[NAME_LENGTH-1] = '\0'; //Security check... [Skotlex]
+ safestrncpy(p.name,name,NAME_LENGTH);
return intif_guild_position(guild_id,idx,&p);
}
// ギルド役職変更通知
@@ -1139,7 +1102,7 @@ unsigned int guild_payexp(struct map_session_data *sd,unsigned int exp)
if (sd->status.guild_id == 0 ||
(g = guild_search(sd->status.guild_id)) == NULL ||
- (per = guild_getposition(sd,g)) < 0 ||
+ (per = guild_getposition(g,sd)) < 0 ||
(per = g->position[per].exp_mode) < 1)
return 0;
@@ -1248,12 +1211,10 @@ int guild_check_alliance(int guild_id1, int guild_id2, int flag)
if (g == NULL)
return 0;
- for (i=0; i<MAX_GUILDALLIANCE; i++)
- if ((g->alliance[i].guild_id == guild_id2) && (g->alliance[i].opposition == flag))
- return 1;
-
- return 0;
+ ARR_FIND( 0, MAX_GUILDALLIANCE, i, g->alliance[i].guild_id == guild_id2 && g->alliance[i].opposition == flag );
+ return( i < MAX_GUILDALLIANCE ) ? 1 : 0;
}
+
// ギルド同盟要求
int guild_reqalliance(struct map_session_data *sd,struct map_session_data *tsd)
{
@@ -1367,6 +1328,7 @@ int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag)
}
return 0;
}
+
// ギルド関係解消
int guild_delalliance(struct map_session_data *sd,int guild_id,int flag)
{
@@ -1377,10 +1339,10 @@ int guild_delalliance(struct map_session_data *sd,int guild_id,int flag)
return 0;
} // end addition [Valaris]
- intif_guild_alliance( sd->status.guild_id,guild_id,
- sd->status.account_id,0,flag|8 );
+ intif_guild_alliance( sd->status.guild_id,guild_id,sd->status.account_id,0,flag|8 );
return 0;
}
+
// ギルド敵対
int guild_opposition(struct map_session_data *sd,struct map_session_data *tsd)
{
@@ -1419,9 +1381,9 @@ int guild_opposition(struct map_session_data *sd,struct map_session_data *tsd)
sd->status.account_id,tsd->status.account_id,1 );
return 0;
}
+
// ギルド同盟/敵対通知
-int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id2,
- int flag,const char *name1,const char *name2)
+int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id2,int flag,const char *name1,const char *name2)
{
struct guild *g[2];
int guild_id[2];
@@ -1455,23 +1417,27 @@ int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id
if(!(flag&0x08)){ // 関係追加
for(i=0;i<2-(flag&1);i++)
+ {
if(g[i]!=NULL)
- for(j=0;j<MAX_GUILDALLIANCE;j++)
- if(g[i]->alliance[j].guild_id==0){
- g[i]->alliance[j].guild_id=guild_id[1-i];
- memcpy(g[i]->alliance[j].name,guild_name[1-i],NAME_LENGTH);
- g[i]->alliance[j].opposition=flag&1;
- break;
- }
+ {
+ ARR_FIND( 0, MAX_GUILDALLIANCE, j, g[i]->alliance[j].guild_id == 0 );
+ if( j < MAX_GUILDALLIANCE )
+ {
+ g[i]->alliance[j].guild_id=guild_id[1-i];
+ memcpy(g[i]->alliance[j].name,guild_name[1-i],NAME_LENGTH);
+ g[i]->alliance[j].opposition=flag&1;
+ }
+ }
+ }
}else{ // 関係解消
- for(i=0;i<2-(flag&1);i++){
+ for(i=0;i<2-(flag&1);i++)
+ {
if(g[i]!=NULL)
- for(j=0;j<MAX_GUILDALLIANCE;j++)
- if( g[i]->alliance[j].guild_id==guild_id[1-i] &&
- g[i]->alliance[j].opposition==(flag&1)){
- g[i]->alliance[j].guild_id=0;
- break;
- }
+ {
+ ARR_FIND( 0, MAX_GUILDALLIANCE, j, g[i]->alliance[j].guild_id == guild_id[1-i] && g[i]->alliance[j].opposition == (flag&1) );
+ if( j < MAX_GUILDALLIANCE )
+ g[i]->alliance[j].guild_id = 0;
+ }
if( sd[i]!=NULL ) // 解消通知
clif_guild_delalliance(sd[i],guild_id[1-i],(flag&1));
}
@@ -1855,10 +1821,9 @@ int guild_agit_end(void)
return 0;
}
-static int Ghp[MAX_GUILDCASTLE][MAX_GUARDIANS]; // so save only if HP are changed // experimental code [Yor]
-static int Gid[MAX_GUILDCASTLE];
int guild_save_sub(int tid,unsigned int tick,int id,int data)
{
+ static int Gid[MAX_GUILDCASTLE]; // previous owning guild
struct guild_castle *gc;
int i;
@@ -1913,6 +1878,26 @@ static int guild_expcache_db_final(DBKey key,void *data,va_list ap)
return 0;
}
+void do_init_guild(void)
+{
+ guild_db=idb_alloc(DB_OPT_RELEASE_DATA);
+ castle_db=idb_alloc(DB_OPT_RELEASE_DATA);
+ guild_expcache_db=idb_alloc(DB_OPT_BASE);
+ guild_infoevent_db=idb_alloc(DB_OPT_BASE);
+ expcache_ers = ers_new(sizeof(struct guild_expcache));
+ guild_castleinfoevent_db=idb_alloc(DB_OPT_BASE);
+
+ guild_read_castledb();
+
+ guild_read_guildskill_tree_db(); //guild skill tree [Komurka]
+
+ add_timer_func_list(guild_payexp_timer,"guild_payexp_timer");
+ add_timer_func_list(guild_save_sub, "guild_save_sub");
+ add_timer_func_list(guild_send_xy_timer, "guild_send_xy_timer");
+ add_timer_interval(gettick()+GUILD_PAYEXP_INVERVAL,guild_payexp_timer,0,0,GUILD_PAYEXP_INVERVAL);
+ add_timer_interval(gettick()+GUILD_SEND_XY_INVERVAL,guild_send_xy_timer,0,0,GUILD_SEND_XY_INVERVAL);
+}
+
void do_final_guild(void)
{
guild_db->destroy(guild_db,NULL);
diff --git a/src/map/guild.h b/src/map/guild.h
index bfa359fb1..48dcdb550 100644
--- a/src/map/guild.h
+++ b/src/map/guild.h
@@ -30,7 +30,7 @@ struct guild_castle* guild_mapindex2gc(short mapindex);
struct map_session_data *guild_getavailablesd(struct guild *g);
int guild_getindex(struct guild *g,int account_id,int char_id);
-int guild_getposition(struct map_session_data *sd,struct guild *g);
+int guild_getposition(struct guild *g, struct map_session_data *sd);
unsigned int guild_payexp(struct map_session_data *sd,unsigned int exp);
int guild_getexp(struct map_session_data *sd,int exp); // [Celest]