// ギルド同盟要求 int guild_reqalliance(struct map_session_data *sd,struct map_session_data *tsd) { struct guild *g[2]; int i; if(agit_flag || agit2_flag || agit3_flag) { // Disable alliance creation during woe [Valaris] clif_displaymessage(sd->fd,"Alliances cannot be made during Guild Wars!"); return 0; } // end addition [Valaris] nullpo_ret(sd); if(tsd==NULL || tsd->status.guild_id<=0) return 0; g[0]=guild_search(sd->status.guild_id); g[1]=guild_search(tsd->status.guild_id); if(g[0]==NULL || g[1]==NULL) return 0; // Prevent creation alliance with same guilds [LuzZza] if(sd->status.guild_id == tsd->status.guild_id) return 0; if( guild_get_alliance_count(g[0],0) >= battle_config.max_guild_alliance ) { clif_guild_allianceack(sd,4); return 0; } if( guild_get_alliance_count(g[1],0) >= battle_config.max_guild_alliance ) { clif_guild_allianceack(sd,3); return 0; } if( tsd->guild_alliance>0 ){ clif_guild_allianceack(sd,1); return 0; } for(i=0;i<MAX_GUILDALLIANCE;i++){ // すでに同盟状態か確認 if( g[0]->alliance[i].guild_id==tsd->status.guild_id && g[0]->alliance[i].opposition==0){ clif_guild_allianceack(sd,0); return 0; } } tsd->guild_alliance=sd->status.guild_id; tsd->guild_alliance_account=sd->status.account_id; clif_guild_reqalliance(tsd,sd->status.account_id,g[0]->name); return 0; }
// ギルド勧誘への返答 int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag) { struct map_session_data *tsd; nullpo_retr(0, sd); nullpo_retr(0, tsd= map_id2sd( account_id )); if(sd->guild_alliance!=tsd->status.guild_id) // 勧誘とギルドIDが違う return 0; if(flag==1){ // 承諾 int i; struct guild *g,*tg; // 同盟数再確認 g=guild_search(sd->status.guild_id); tg=guild_search(tsd->status.guild_id); if(g==NULL || guild_get_alliance_count(g,0)>=3){ clif_guild_allianceack(sd,4); clif_guild_allianceack(tsd,3); return 0; } if(tg==NULL || guild_get_alliance_count(tg,0)>=3){ clif_guild_allianceack(sd,3); clif_guild_allianceack(tsd,4); return 0; } for(i=0;i<MAX_GUILDALLIANCE;i++){ if(g->alliance[i].guild_id==tsd->status.guild_id && g->alliance[i].opposition==1) intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id, sd->status.account_id,tsd->status.account_id,9 ); } for(i=0;i<MAX_GUILDALLIANCE;i++){ if(tg->alliance[i].guild_id==sd->status.guild_id && tg->alliance[i].opposition==1) intif_guild_alliance( tsd->status.guild_id,sd->status.guild_id, tsd->status.account_id,sd->status.account_id,9 ); } // inter鯖へ同盟要請 intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id, sd->status.account_id,tsd->status.account_id,0 ); return 0; }else{ // 拒否 sd->guild_alliance=0; sd->guild_alliance_account=0; if(tsd!=NULL) clif_guild_allianceack(tsd,3); } 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) { struct guild *g[2]; int guild_id[2]; const char *guild_name[2]; struct map_session_data *sd[2]; int j,i; guild_id[0] = guild_id1; guild_id[1] = guild_id2; guild_name[0] = name1; guild_name[1] = name2; sd[0] = map_id2sd(account_id1); sd[1] = map_id2sd(account_id2); g[0]=guild_search(guild_id1); g[1]=guild_search(guild_id2); if(sd[0]!=NULL && (flag&0x0f)==0){ sd[0]->guild_alliance=0; sd[0]->guild_alliance_account=0; } if(flag&0x70){ // 失敗 for(i=0;i<2-(flag&1);i++) if( sd[i]!=NULL ) clif_guild_allianceack(sd[i],((flag>>4)==i+1)?3:4); return 0; } if(!(flag&0x08)){ // 関係追加 for(i=0;i<2-(flag&1);i++) { if(g[i]!=NULL) { 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++) { if(g[i]!=NULL) { 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)); } } if((flag&0x0f)==0){ // 同盟通知 if( sd[1]!=NULL ) clif_guild_allianceack(sd[1],2); }else if((flag&0x0f)==1){ // 敵対通知 if( sd[0]!=NULL ) clif_guild_oppositionack(sd[0],0); } for(i=0;i<2-(flag&1);i++){ // 同盟/敵対リストの再送信 struct map_session_data *sd; if(g[i]!=NULL) for(j=0;j<g[i]->max_member;j++) if((sd=g[i]->member[j].sd)!=NULL) clif_guild_allianceinfo(sd); } return 0; }