// ギルド勧誘への返答 int guild_reply_invite(struct map_session_data *sd,int guild_id,int flag) { struct map_session_data *tsd; nullpo_retr(0, sd); //nullpo_retr(0, tsd= map_id2sd( sd->guild_invite_account )); //I checked the code, and there's no "check" for the case where the guy //that invites another to a guild quits the map-server before being replied. //Hence that's a valid null pointer scenario. :) [Skotlex] if ((tsd= map_id2sd( sd->guild_invite_account )) == NULL) { //Do we send a "invitation failed" msg or something to the player? //Or should we accept the invitation and add it to the guild anyway? //afterall, guild_invite holds the guild id that the player was invited to. sd->guild_invite=0; sd->guild_invite_account=0; return 0; } if(sd->guild_invite!=guild_id) // 勧誘とギルドIDが違う return 0; if(flag==1){ // 承諾 struct guild_member m; struct guild *g; int i; // 定員確認 if( (g=guild_search(tsd->status.guild_id))==NULL ){ sd->guild_invite=0; sd->guild_invite_account=0; return 0; } for(i=0;i<g->max_member;i++) if(g->member[i].account_id==0) break; if(i==g->max_member){ sd->guild_invite=0; sd->guild_invite_account=0; clif_guild_inviteack(tsd,3); return 0; } //inter鯖へ追加要求 guild_makemember(&m,sd); intif_guild_addmember( sd->guild_invite, &m ); return 0; }else{ // 拒否 sd->guild_invite=0; sd->guild_invite_account=0; clif_guild_inviteack(tsd,1); } return 0; }
/// Guild invitation reply. /// flag: 0:rejected, 1:accepted int guild_reply_invite(struct map_session_data* sd, int guild_id, int flag) { struct map_session_data* tsd; nullpo_ret(sd); // subsequent requests may override the value if( sd->guild_invite != guild_id ) return 0; // mismatch // look up the person who sent the invite //NOTE: this can be NULL because the person might have logged off in the meantime tsd = map_id2sd(sd->guild_invite_account); if ( sd->status.guild_id > 0 ) // [Paradox924X] { // Already in another guild. if ( tsd ) clif_guild_inviteack(tsd,0); return 0; } else if( flag == 0 ) {// rejected sd->guild_invite = 0; sd->guild_invite_account = 0; if( tsd ) clif_guild_inviteack(tsd,1); } else {// accepted struct guild_member m; struct guild* g; int i; if( (g=guild_search(guild_id)) == NULL ) { sd->guild_invite = 0; sd->guild_invite_account = 0; return 0; } ARR_FIND( 0, g->max_member, i, g->member[i].account_id == 0 ); if( i == g->max_member ) { sd->guild_invite = 0; sd->guild_invite_account = 0; if( tsd ) clif_guild_inviteack(tsd,3); return 0; } guild_makemember(&m,sd); intif_guild_addmember(guild_id, &m); //TODO: send a minimap update to this player } return 0; }
// ギルドへの勧誘 int guild_invite(struct map_session_data *sd,struct map_session_data *tsd) { struct guild *g; int i; nullpo_ret(sd); g=guild_search(sd->status.guild_id); if(tsd==NULL || g==NULL) return 0; if( (i=guild_getposition(g,sd))<0 || !(g->position[i].mode&0x0001) ) return 0; //Invite permission. if(!battle_config.invite_request_check) { if (tsd->party_invite>0 || tsd->trade_partner || tsd->adopt_invite ) { // 相手が取引中かどうか clif_guild_inviteack(sd,0); return 0; } } if (!tsd->fd) { //You can't invite someone who has already disconnected. clif_guild_inviteack(sd,1); return 0; } if(tsd->status.guild_id>0 || tsd->guild_invite>0 || ((agit_flag || agit2_flag || agit3_flag) && map[tsd->bl.m].flag.gvg_castle)) { //Can't invite people inside castles. [Skotlex] clif_guild_inviteack(sd,0); return 0; } // 定員確認 ARR_FIND( 0, g->max_member, i, g->member[i].account_id == 0 ); if(i==g->max_member){ clif_guild_inviteack(sd,3); return 0; } tsd->guild_invite=sd->status.guild_id; tsd->guild_invite_account=sd->status.account_id; clif_guild_invite(tsd,g); return 0; }
// ギルドへの勧誘 int guild_invite(struct map_session_data *sd,struct map_session_data *tsd) { struct guild *g; int i; nullpo_retr(0, sd); g=guild_search(sd->status.guild_id); if(tsd==NULL || g==NULL) return 0; if( (i=guild_getposition(sd,g))<0 || !(g->position[i].mode&0x0001) ) return 0; //Invite permission. if(!battle_config.invite_request_check) { if (tsd->party_invite>0 || tsd->trade_partner) { // 相手が取引中かどうか clif_guild_inviteack(sd,0); return 0; } } if(tsd->status.guild_id>0 || tsd->guild_invite>0 || map[tsd->bl.m].flag.gvg_castle) { //Can't invite people inside castles. [Skotlex] clif_guild_inviteack(sd,0); return 0; } // 定員確認 for(i=0;i<g->max_member;i++) if(g->member[i].account_id==0) break; if(i==g->max_member){ clif_guild_inviteack(sd,3); return 0; } tsd->guild_invite=sd->status.guild_id; tsd->guild_invite_account=sd->status.account_id; clif_guild_invite(tsd,g); return 0; }
// ギルドメンバが追加された int guild_member_added(int guild_id,int account_id,int char_id,int flag) { struct map_session_data *sd= map_id2sd(account_id),*sd2; struct guild *g; if( (g=guild_search(guild_id))==NULL ) return 0; if(sd==NULL || sd->guild_invite==0){ // キャラ側に登録できなかったため脱退要求を出す if (flag == 0) { ShowError("guild: member added error %d is not online\n",account_id); intif_guild_leave(guild_id,account_id,char_id,0,"** Data Error **"); } return 0; } sd2 = map_id2sd(sd->guild_invite_account); sd->guild_invite = 0; sd->guild_invite_account = 0; if(flag==1){ // 失敗 if( sd2!=NULL ) clif_guild_inviteack(sd2,3); return 0; } // 成功 sd->status.guild_id = g->guild_id; sd->guild_emblem_id = g->emblem_id; //Packets which were sent in the previous 'guild_sent' implementation. clif_guild_belonginfo(sd,g); clif_guild_notice(sd,g); //TODO: send new emblem info to others if( sd2!=NULL ) clif_guild_inviteack(sd2,2); //Next line commented because it do nothing, look at guild_recv_info [LuzZza] //clif_charnameupdate(sd); //Update display name [Skotlex] return 0; }
// ギルドメンバが追加された int guild_member_added(int guild_id,int account_id,int char_id,int flag) { struct map_session_data *sd= map_id2sd(account_id),*sd2; struct guild *g; if( (g=guild_search(guild_id))==NULL ) return 0; if(sd==NULL || sd->guild_invite==0){ // キャラ側に登録できなかったため脱退要求を出す if (flag == 0) { if(battle_config.error_log) ShowError("guild: member added error %d is not online\n",account_id); intif_guild_leave(guild_id,account_id,char_id,0,"**登録失敗**"); } return 0; } sd2 = map_id2sd(sd->guild_invite_account); sd->guild_invite = 0; sd->guild_invite_account = 0; if(flag==1){ // 失敗 if( sd2!=NULL ) clif_guild_inviteack(sd2,3); return 0; } // 成功 sd->state.guild_sent=0; sd->status.guild_id=guild_id; if( sd2!=NULL ) clif_guild_inviteack(sd2,2); // いちおう競合確認 guild_check_conflict(sd); //Next line commented because it do nothing, look at guild_recv_info [LuzZza] //clif_charnameupdate(sd); //Update display name [Skotlex] return 0; }