//Notification from Char server that a guild's master has changed. [Skotlex] int guild_gm_changed(int guild_id, int pos) { struct guild *g; struct guild_member gm; g=guild_search(guild_id); if (!g || pos < 0 || pos > g->max_member) return 0; memcpy(&gm, &g->member[pos], sizeof (struct guild_member)); memcpy(&g->member[pos], &g->member[0], sizeof(struct guild_member)); memcpy(&g->member[0], &gm, sizeof(struct guild_member)); g->member[pos].position = g->member[0].position; g->member[0].position = 0; //Position 0: guild Master. strcpy(g->master, g->member[0].name); if (g->member[pos].sd && g->member[pos].sd->fd) { clif_displaymessage(g->member[pos].sd->fd, "You no longer are the Guild Master."); g->member[pos].sd->state.gmaster_flag = 0; } if (g->member[0].sd && g->member[0].sd->fd) { clif_displaymessage(g->member[0].sd->fd, "You have become the Guild Master!"); g->member[0].sd->state.gmaster_flag = g; //Block his skills for 5 minutes to prevent abuse. guild_block_skill(g->member[0].sd, 300000); } return 1; }
//Notification from Char server that a guild's master has changed. [Skotlex] int guild_gm_changed(int guild_id, int account_id, int char_id) { struct guild *g; struct guild_member gm; int pos, i; g=guild_search(guild_id); if (!g) return 0; for(pos=0; pos<g->max_member && !( g->member[pos].account_id==account_id && g->member[pos].char_id==char_id); pos++); if (pos == 0 || pos == g->max_member) return 0; memcpy(&gm, &g->member[pos], sizeof (struct guild_member)); memcpy(&g->member[pos], &g->member[0], sizeof(struct guild_member)); memcpy(&g->member[0], &gm, sizeof(struct guild_member)); g->member[pos].position = g->member[0].position; g->member[0].position = 0; //Position 0: guild Master. strcpy(g->master, g->member[0].name); if (g->member[pos].sd && g->member[pos].sd->fd) { clif_displaymessage(g->member[pos].sd->fd, "You no longer are the Guild Master."); g->member[pos].sd->state.gmaster_flag = 0; } if (g->member[0].sd && g->member[0].sd->fd) { clif_displaymessage(g->member[0].sd->fd, "You have become the Guild Master!"); g->member[0].sd->state.gmaster_flag = g; //Block his skills for 5 minutes to prevent abuse. guild_block_skill(g->member[0].sd, 300000); } // announce the change to all guild members for( i = 0; i < g->max_member; i++ ) { if( g->member[i].sd && g->member[i].sd->fd ) { clif_guild_basicinfo(g->member[i].sd); clif_guild_memberlist(g->member[i].sd); } } return 1; }
//Invoked when a player joins. //- If guild is not in memory, it is requested //- Otherwise sd pointer is set up. //- Player must be authed and must belong to a guild before invoking this method void guild_member_joined(struct map_session_data *sd) { struct guild* g; int i; g=guild_search(sd->status.guild_id); if (!g) { guild_request_info(sd->status.guild_id); return; } if (strcmp(sd->status.name,g->master) == 0) { // set the Guild Master flag sd->state.gmaster_flag = g; // prevent Guild Skills from being used directly after relog if( battle_config.guild_skill_relog_delay ) guild_block_skill(sd, 300000); } i = guild_getindex(g, sd->status.account_id, sd->status.char_id); if (i == -1) sd->status.guild_id = 0; else g->member[i].sd = sd; }
// 情報所得 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; }