int bg_team_leave(struct map_session_data *sd, int flag) { // Single Player leaves team int i; struct battleground_data *bg; struct map_session_data *pl_sd; struct guild *g; if( sd == NULL || !sd->bg_id ) return 0; bg = bg_team_search(sd->bg_id); if( bg && bg->logout_event[0] && flag ) npc_event(sd, bg->logout_event, 0); // Packets if( battle_config.bg_eAmod_mode ) clif_bg_leave_single(sd, sd->status.name, "Leaving Battle..."); bg_send_dot_remove(sd); sd->bg_id = 0; sd->bg_kills = 0; sd->state.bg_afk = 0; sd->bmaster_flag = NULL; bg_member_removeskulls(sd); // Remove Guild Skill Buffs status_change_end(&sd->bl,SC_GUILDAURA,INVALID_TIMER); status_change_end(&sd->bl,SC_BATTLEORDERS,INVALID_TIMER); status_change_end(&sd->bl,SC_REGENERATION,INVALID_TIMER); if( battle_config.bg_eAmod_mode ) { // Refresh Guild Information if( sd->status.guild_id && (g = guild_search(sd->status.guild_id)) != NULL ) { clif_guild_belonginfo(sd, g); clif_guild_basicinfo(sd); clif_guild_allianceinfo(sd); clif_guild_memberlist(sd); clif_guild_skillinfo(sd); clif_guild_emblem(sd, g); } clif_charnameupdate(sd); clif_guild_emblem_area(&sd->bl); } if( !bg ) return 0; ARR_FIND(0, MAX_BG_MEMBERS, i, bg->members[i].sd == sd); if( i < MAX_BG_MEMBERS ) // Removes member from BG memset(&bg->members[i], 0, sizeof(bg->members[0])); if( bg->leader_char_id == sd->status.char_id ) bg->leader_char_id = 0; bg->count--; for( i = 0; i < MAX_BG_MEMBERS; i++ ) { // Update other BG members if( (pl_sd = bg->members[i].sd) == NULL ) continue; if( !bg->leader_char_id ) { // Set new Leader first on the list bg->leader_char_id = pl_sd->status.char_id; pl_sd->bmaster_flag = bg; } if( battle_config.bg_eAmod_mode ) { switch( flag ) { case 3: clif_bg_expulsion_single(pl_sd, sd->status.name, "Kicked by AFK Status..."); break; case 2: clif_bg_expulsion_single(pl_sd, sd->status.name, "Kicked by AFK Report..."); break; case 1: clif_bg_expulsion_single(pl_sd, sd->status.name, "User has quit the game..."); break; case 0: clif_bg_leave_single(pl_sd, sd->status.name, "Leaving Battle..."); break; } clif_guild_basicinfo(pl_sd); clif_bg_emblem(pl_sd, bg->g); clif_bg_memberlist(pl_sd); } } if( !battle_config.bg_eAmod_mode ) { char output[128]; switch( flag ) { case 3: sprintf(output, "Server : %s kicked by AFK Status...", sd->status.name); break; case 2: sprintf(output, "Server : %s kicked by AFK Report...", sd->status.name); break; case 1: sprintf(output, "Server : %s has quit the game...", sd->status.name); break; case 0: sprintf(output, "Server : %s is leaving the battlefield...", sd->status.name); break; } clif_bg_message(bg, 0, "Server", output, strlen(output) + 1); } return bg->count; }
// ギルド同盟/敵対通知 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; }
int bg_team_clean(int bg_id, bool remove) { // Deletes BG Team from db int i; struct map_session_data *sd; struct battleground_data *bg = bg_team_search(bg_id); struct guild *g; if( bg == NULL ) return 0; for( i = 0; i < MAX_BG_MEMBERS; i++ ) { if( (sd = bg->members[i].sd) == NULL ) continue; bg_send_dot_remove(sd); sd->bg_id = 0; sd->state.bg_afk = 0; sd->bmaster_flag = NULL; bg_member_removeskulls(sd); // Remove Guild Skill Buffs status_change_end(&sd->bl,SC_GUILDAURA,INVALID_TIMER); status_change_end(&sd->bl,SC_BATTLEORDERS,INVALID_TIMER); status_change_end(&sd->bl,SC_REGENERATION,INVALID_TIMER); if( !battle_config.bg_eAmod_mode ) continue; // No need to touch Guild stuff if( sd->status.guild_id && (g = guild_search(sd->status.guild_id)) != NULL ) { clif_guild_belonginfo(sd,g); clif_guild_basicinfo(sd); clif_guild_allianceinfo(sd); clif_guild_memberlist(sd); clif_guild_skillinfo(sd); } else clif_bg_leave_single(sd, sd->status.name, "Leaving Battleground..."); clif_charnameupdate(sd); clif_guild_emblem_area(&sd->bl); } for( i = 0; i < MAX_GUILDSKILL; i++ ) { if( bg->skill_block_timer[i] == INVALID_TIMER ) continue; delete_timer(bg->skill_block_timer[i], bg_block_skill_end); } if( remove ) idb_remove(bg_team_db, bg_id); else { bg->count = 0; bg->leader_char_id = 0; bg->team_score = 0; bg->creation_tick = 0; memset(&bg->members, 0, sizeof(bg->members)); } return 1; }