int guild_send_memberinfoshort(struct map_session_data *sd,int online) { // cleaned up [LuzZza] struct guild *g; nullpo_ret(sd); if(sd->status.guild_id <= 0) return 0; if(!(g = guild_search(sd->status.guild_id))) return 0; intif_guild_memberinfoshort(g->guild_id, sd->status.account_id,sd->status.char_id,online,sd->status.base_level,sd->status.class_); if(!online){ int i=guild_getindex(g,sd->status.account_id,sd->status.char_id); if(i>=0) g->member[i].sd=NULL; else ShowError("guild_send_memberinfoshort: Failed to locate member %d:%d in guild %d!\n", sd->status.account_id, sd->status.char_id, g->guild_id); return 0; } if(sd->state.connect_new) { //Note that this works because it is invoked in parse_LoadEndAck before connect_new is cleared. clif_guild_belonginfo(sd,g); clif_guild_notice(sd,g); sd->guild_emblem_id = g->emblem_id; } return 0; }
int guild_send_memberinfoshort(struct map_session_data *sd,int online) { struct guild *g; int i; nullpo_retr(0, sd); if(sd->status.guild_id<=0) return 0; g=guild_search(sd->status.guild_id); if(g==NULL) return 0; intif_guild_memberinfoshort(g->guild_id, sd->status.account_id,sd->status.char_id,online,sd->status.base_level,sd->status.class_); if( !online ){ // ログアウトするならsdをクリアして終了 i=guild_getindex(g,sd->status.account_id,sd->status.char_id); if(i>=0) g->member[i].sd=NULL; return 0; } else if (sd->fd) { //Send XY dot updates. [Skotlex] for(i=0; i < MAX_GUILD; i++) { if (!g->member[i].sd || g->member[i].sd == sd || g->member[i].sd->bl.m != sd->bl.m) continue; clif_guild_xy_single(sd->fd, g->member[i].sd); } } if( sd->state.guild_sent!=0 ) // ギルド初期送信データは送信済み return 0; // 競合確認 guild_check_conflict(sd); // あるならギルド初期送信データ送信 guild_check_member(g); // 所属を確認する if(sd->status.guild_id==g->guild_id){ clif_guild_belonginfo(sd,g); clif_guild_notice(sd,g); sd->state.guild_sent=1; sd->guild_emblem_id=g->emblem_id; } return 0; }
// ギルド告知変更通知 int guild_notice_changed(int guild_id,const char *mes1,const char *mes2) { int i; struct map_session_data *sd; struct guild *g=guild_search(guild_id); if(g==NULL) return 0; memcpy(g->mes1,mes1,MAX_GUILDMES1); memcpy(g->mes2,mes2,MAX_GUILDMES2); for(i=0;i<g->max_member;i++){ if((sd=g->member[i].sd)!=NULL) clif_guild_notice(sd,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_send_memberinfoshort(struct map_session_data *sd,int online) { // cleaned up [LuzZza] struct guild *g; nullpo_retr(0, sd); if(!(g = guild_search(sd->status.guild_id))) return 0; //Moved to place before intif_guild_memberinfoshort because //If it's not a member, needn't send it's info to intif. [LuzZza] guild_check_member(g); if(sd->status.guild_id <= 0) return 0; intif_guild_memberinfoshort(g->guild_id, sd->status.account_id,sd->status.char_id,online,sd->status.base_level,sd->status.class_); if(!online){ int i=guild_getindex(g,sd->status.account_id,sd->status.char_id); if(i>=0) g->member[i].sd=NULL; return 0; } if(sd->state.guild_sent) return 0; clif_guild_belonginfo(sd,g); clif_guild_notice(sd,g); sd->state.guild_sent = 1; sd->guild_emblem_id = g->emblem_id; return 0; }
// 情報所得 int guild_recv_info(struct guild *sg) { struct guild *g,before; int i,bm,m; struct eventlist *ev,*ev2; struct map_session_data *sd; bool guild_new = false; nullpo_ret(sg); if((g = (struct guild*)idb_get(guild_db,sg->guild_id))==NULL) { guild_new = true; g=(struct guild *)aCalloc(1,sizeof(struct guild)); idb_put(guild_db,sg->guild_id,g); before=*sg; // 最初のロードなのでユーザーのチェックを行う guild_check_member(sg); if ((sd = map_nick2sd(sg->master)) != NULL) { //If the guild master is online the first time the guild_info is received, //that means he was the first to join, so apply guild skill blocking here. if( battle_config.guild_skill_relog_delay ) guild_block_skill(sd, 300000); //Also set the guild master flag. sd->state.gmaster_flag = g; clif_charnameupdate(sd); // [LuzZza] clif_guild_masterormember(sd); } }else before=*g; memcpy(g,sg,sizeof(struct guild)); if(g->max_member > MAX_GUILD) { ShowError("guild_recv_info: Received guild with %d members, but MAX_GUILD is only %d. Extra guild-members have been lost!\n", g->max_member, MAX_GUILD); g->max_member = MAX_GUILD; } for(i=bm=m=0;i<g->max_member;i++){ if(g->member[i].account_id>0){ sd = g->member[i].sd = guild_sd_check(g->guild_id, g->member[i].account_id, g->member[i].char_id); if (sd) clif_charnameupdate(sd); // [LuzZza] m++; }else g->member[i].sd=NULL; if(before.member[i].account_id>0) bm++; } for(i=0;i<g->max_member;i++){ // 情報の送信 sd = g->member[i].sd; if( sd==NULL ) continue; if( before.guild_lv!=g->guild_lv || bm!=m || before.max_member!=g->max_member ){ clif_guild_basicinfo(sd); // 基本情報送信 clif_guild_emblem(sd,g); // エンブレム送信 } if(bm!=m){ // メンバー情報送信 clif_guild_memberlist(g->member[i].sd); } if( before.skill_point!=g->skill_point) clif_guild_skillinfo(sd); // スキル情報送信 if( guild_new ){ // 未送信なら所属情報も送る clif_guild_belonginfo(sd,g); clif_guild_notice(sd,g); sd->guild_emblem_id=g->emblem_id; } } // イベントの発生 if( (ev = (struct eventlist*)idb_remove(guild_infoevent_db,sg->guild_id))!=NULL ) { while(ev){ npc_event_do(ev->name); ev2=ev->next; aFree(ev); ev=ev2; } } return 0; }
// 情報所得 int guild_recv_info(struct guild *sg) { struct guild *g,before; int i,bm,m; struct eventlist *ev,*ev2; nullpo_retr(0, sg); if((g=idb_get(guild_db,sg->guild_id))==NULL){ struct map_session_data *sd; g=(struct guild *)aCalloc(1,sizeof(struct guild)); idb_put(guild_db,sg->guild_id,g); before=*sg; // 最初のロードなのでユーザーのチェックを行う guild_check_member(sg); //If the guild master is online the first time the guild_info is received, that means he was the first to join, //and as such, his guild skills should be blocked to avoid login/logout abuse [Skotlex] if ((sd = map_nick2sd(sg->master)) != NULL) { guild_block_skill(sd, 300000); //Also set the guild master flag. sd->state.gmaster_flag = g; clif_charnameupdate(sd); // [LuzZza] } }else before=*g; memcpy(g,sg,sizeof(struct guild)); for(i=bm=m=0;i<g->max_member;i++){ // sdの設定と人数の確認 if(g->member[i].account_id>0){ struct map_session_data *sd = map_id2sd(g->member[i].account_id); if (sd && sd->status.char_id == g->member[i].char_id && sd->status.guild_id == g->guild_id && !sd->state.waitingdisconnect) { g->member[i].sd = sd; clif_charnameupdate(sd); // [LuzZza] } else g->member[i].sd = NULL; m++; }else g->member[i].sd=NULL; if(before.member[i].account_id>0) bm++; } for(i=0;i<g->max_member;i++){ // 情報の送信 struct map_session_data *sd = g->member[i].sd; if( sd==NULL ) continue; if( before.guild_lv!=g->guild_lv || bm!=m || before.max_member!=g->max_member ){ clif_guild_basicinfo(sd); // 基本情報送信 clif_guild_emblem(sd,g); // エンブレム送信 } if(bm!=m){ // メンバー情報送信 clif_guild_memberlist(g->member[i].sd); } if( before.skill_point!=g->skill_point) clif_guild_skillinfo(sd); // スキル情報送信 if( sd->state.guild_sent==0){ // 未送信なら所属情報も送る clif_guild_belonginfo(sd,g); clif_guild_notice(sd,g); sd->guild_emblem_id=g->emblem_id; sd->state.guild_sent=1; } } // イベントの発生 if( (ev=idb_remove(guild_infoevent_db,sg->guild_id))!=NULL ){ while(ev){ npc_event_do(ev->name); ev2=ev->next; aFree(ev); ev=ev2; } } return 0; }