// ギルドエンブレム変更通知 int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data) { int i; struct map_session_data *sd; struct guild *g=guild_search(guild_id); if(g==NULL) return 0; memcpy(g->emblem_data,data,len); g->emblem_len=len; g->emblem_id=emblem_id; for(i=0;i<g->max_member;i++){ if((sd=g->member[i].sd)!=NULL){ sd->guild_emblem_id=emblem_id; clif_guild_belonginfo(sd,g); clif_guild_emblem(sd,g); clif_guild_emblem_area(&sd->bl); } } {// update guardians (mobs) DBIterator* iter = db_iterator(castle_db); struct guild_castle* gc; for( gc = (struct guild_castle*)dbi_first(iter) ; dbi_exists(iter); gc = (struct guild_castle*)dbi_next(iter) ) { if( gc->guild_id != guild_id ) continue; // update permanent guardians for( i = 0; i < ARRAYLENGTH(gc->guardian); ++i ) { TBL_MOB* md = (gc->guardian[i].id ? map_id2md(gc->guardian[i].id) : NULL); if( md == NULL || md->guardian_data == NULL ) continue; md->guardian_data->emblem_id = emblem_id; clif_guild_emblem_area(&md->bl); } // update temporary guardians for( i = 0; i < gc->temp_guardians_max; ++i ) { TBL_MOB* md = (gc->temp_guardians[i] ? map_id2md(gc->temp_guardians[i]) : NULL); if( md == NULL || md->guardian_data == NULL ) continue; md->guardian_data->emblem_id = emblem_id; clif_guild_emblem_area(&md->bl); } } dbi_destroy(iter); } {// update npcs (flags or other npcs that used flagemblem to attach to this guild) // TODO this is not efficient [FlavioJS] struct s_mapiterator* iter = mapit_geteachnpc(); TBL_NPC* nd; for( nd = (TBL_NPC*)mapit_first(iter) ; mapit_exists(iter); nd = (TBL_NPC*)mapit_next(iter) ) { if( nd->subtype != SCRIPT || nd->u.scr.guild_id != guild_id ) continue; clif_guild_emblem_area(&nd->bl); } mapit_free(iter); } return 0; }
int bg_team_join(int bg_id, struct map_session_data *sd) { // Player joins team int i; struct battleground_data *bg = bg_team_search(bg_id); struct map_session_data *pl_sd; if( bg == NULL || sd == NULL || sd->bg_id ) return 0; ARR_FIND(0, MAX_BG_MEMBERS, i, bg->members[i].sd == NULL); if( i == MAX_BG_MEMBERS ) return 0; // No free slots pc_update_last_action(sd,0); // Start count from here... sd->bg_id = bg_id; sd->bg_kills = 0; sd->state.bg_afk = 0; bg->members[i].sd = sd; bg->members[i].x = sd->bl.x; bg->members[i].y = sd->bl.y; bg->count++; if( bg->creation_tick == 0 ) bg->creation_tick = last_tick; // Creation Tick = First member joined. if( bg->leader_char_id == 0 ) { // First Join = Team Leader bg->leader_char_id = sd->status.char_id; sd->bmaster_flag = bg; } if( battle_config.bg_ranked_mode && sd->status.bgstats.rank_games < battle_config.bg_ranked_max_games && DIFF_TICK(last_tick,bg->creation_tick) < 60 ) { char output[128]; bg->members[i].ranked = true; sd->status.bgstats.rank_games++; sprintf(output,"-- RANKED BATTLEGROUND MATCH %d OF %d --", sd->status.bgstats.rank_games, battle_config.bg_ranked_max_games); clif_displaymessage(sd->fd,output); } guild_send_dot_remove(sd); if( battle_config.bg_eAmod_mode ) { clif_bg_belonginfo(sd); clif_charnameupdate(sd); } for( i = 0; i < MAX_BG_MEMBERS; i++ ) { if( (pl_sd = bg->members[i].sd) == NULL ) continue; if( battle_config.bg_eAmod_mode ) { // Simulate Guild Information clif_guild_basicinfo(pl_sd); clif_bg_emblem(pl_sd, bg->g); clif_bg_memberlist(pl_sd); } if( pl_sd != sd ) clif_bg_hp_single(sd->fd,pl_sd); } if( battle_config.bg_eAmod_mode ) clif_guild_emblem_area(&sd->bl); clif_bg_hp(sd); clif_bg_xy(sd); return 1; }
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 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; }