// パーティメンバの移動通知 int party_recv_movemap(int party_id,int account_id,char *map,int online,int lv) { struct party *p; int i; if( (p=party_search(party_id))==NULL) return 0; for(i=0;i<MAX_PARTY;i++){ struct party_member *m=&p->member[i]; if( m == NULL ){ ShowError("party_recv_movemap nullpo?\n"); return 0; } if(m->account_id==account_id){ memcpy(m->map,map,MAP_NAME_LENGTH-1); m->online=online; m->lv=lv; break; } } if(i==MAX_PARTY){ if(battle_config.error_log) ShowError("party: not found member %d on %d[%s]",account_id,party_id,p->name); return 0; } for(i=0;i<MAX_PARTY;i++){ // sd再設定 struct map_session_data *sd= map_id2sd(p->member[i].account_id); p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id && !sd->state.waitingdisconnect)?sd:NULL; } party_send_xy_clear(p); // 座標再通知要請 clif_party_info(p,-1); return 0; }
int party_recv_movemap(int party_id,int account_id,int char_id, unsigned short map,int online,int lv) { struct party_data *p; int i; if( (p=party_search(party_id))==NULL) return 0; for(i=0;i<MAX_PARTY;i++){ struct map_session_data *sd; struct party_member *m=&p->party.member[i]; if(m->account_id==account_id && m->char_id==char_id){ m->map = map; m->online=online; m->lv=lv; //Check if they still exist on this map server sd = map_id2sd(m->account_id); p->data[i].sd = (sd!=NULL && sd->status.party_id==p->party.party_id && sd->status.char_id == m->char_id && !sd->state.waitingdisconnect)?sd:NULL; break; } } if(i==MAX_PARTY){ if(battle_config.error_log) ShowError("party: not found member %d/%d on %d[%s]",account_id,char_id,party_id,p->party.name); return 0; } clif_party_info(p,NULL); return 0; }
// パーティメンバの移動 int party_send_movemap(dumb_ptr<map_session_data> sd) { struct party *p; nullpo_ret(sd); if (sd->status.party_id == 0) return 0; intif_party_changemap(sd, 1); if (sd->party_sended != 0) // もうパーティデータは送信済み return 0; // 競合確認 party_check_conflict(sd); // あるならパーティ情報送信 if ((p = party_search(sd->status.party_id)) != NULL) { party_check_member(p); // 所属を確認する if (sd->status.party_id == p->party_id) { clif_party_info(p, sd->fd); clif_party_option(p, sd, 0x100); sd->party_sended = 1; } } return 0; }
static void intif_parse_PartyLeaderChanged(Session *, const Packet_Fixed<0x3828>& fixed) { int i; PartyPair p = TRY_UNWRAP(party_search(fixed.party_id), return); for (i = 0; i < MAX_PARTY; i++) { PartyMember *m = &p->member[i]; if (m->account_id == fixed.account_id) { dumb_ptr<map_session_data> sd = map_id2sd(wrap<BlockId>(unwrap<AccountId>(fixed.account_id))); m->leader = (fixed.leader > 0 ? 1 : 0); if (sd != nullptr) { AString msg = STRPRINTF("You are %s a leader of %s."_fmt, fixed.leader > 0 ? "now"_s : "no longer"_s, p->name); clif_displaymessage(sd->sess, msg); } break; } } clif_party_info(p, nullptr); }
/// Invoked (from char-server) when a party member leaves the party. int party_member_withdraw(int party_id, int account_id, int char_id) { struct map_session_data* sd = map_id2sd(account_id); struct party_data* p = party_search(party_id); int i; if( p ) { ARR_FIND( 0, MAX_PARTY, i, p->party.member[i].account_id == account_id && p->party.member[i].char_id == char_id ); if( i < MAX_PARTY ) { clif_party_withdraw(p,sd,account_id,p->party.member[i].name,0x00); memset(&p->party.member[i], 0, sizeof(p->party.member[0])); memset(&p->data[i], 0, sizeof(p->data[0])); p->party.count--; party_check_state(p); clif_party_info(p, NULL); } } if( sd && sd->status.party_id == party_id && sd->status.char_id == char_id ) { sd->status.party_id = 0; if( sd->state.spb ) { sd->state.spb = 0; clif_displaymessage(sd->fd, msg_txt(1451)); } clif_charnameupdate(sd); //Update name display [Skotlex] //TODO: hp bars should be cleared too if( p->instance_id ) instance_check_kick(sd); } return 0; }
/// Invoked (from char-server) when a new member is added to the party. /// flag: 0-success, 1-failure int party_member_added(int party_id,int account_id,int char_id, int flag) { struct map_session_data *sd = map_id2sd(account_id),*sd2; struct party_data *p = party_search(party_id); int i; if(sd == NULL || sd->status.char_id != char_id || !sd->party_joining ) { if (!flag) //Char logged off before being accepted into party. intif_party_leave(party_id,account_id,char_id); return 0; } sd2 = map_id2sd(sd->party_invite_account); sd->party_joining = false; sd->party_invite = 0; sd->party_invite_account = 0; if (!p) { ShowError("party_member_added: party %d not found.\n",party_id); intif_party_leave(party_id,account_id,char_id); return 0; } if( flag ) {// failed if( sd2 != NULL ) clif_party_inviteack(sd2,sd->status.name,3); return 0; } sd->status.party_id = party_id; ARR_FIND( 0, MAX_PARTY, i, p->party.member[i].account_id == 0 ); if (i < MAX_PARTY) { //TODO: This is a hack to allow the following clif calls to send the data to the new player. //The correct player data is set when party_recv_info arrives soon afterwards. party_fill_member(&p->party.member[i], sd); p->data[i].sd = sd; } clif_party_member_info(p,sd); clif_party_option(p,sd,0x100); clif_party_info(p,sd); if( sd2 != NULL ) clif_party_inviteack(sd2,sd->status.name,2); for( i = 0; i < ARRAYLENGTH(p->data); ++i ) {// hp of the other party members sd2 = p->data[i].sd; if( sd2 && sd2->status.account_id != account_id && sd2->status.char_id != char_id ) clif_hpmeter_single(sd->fd, sd2->bl.id, sd2->battle_status.hp, sd2->battle_status.max_hp); } clif_party_hp(sd); clif_party_xy(sd); clif_charnameupdate(sd); //Update char name's display [Skotlex] return 0; }
/// Invoked (from char-server) when a party member /// - changes maps /// - logs in or out /// - gains a level (disabled) int party_recv_movemap(int party_id,int account_id,int char_id, unsigned short map,int online,int lv) { struct party_member* m; struct party_data* p; int i; p = party_search(party_id); if( p == NULL ) return 0; ARR_FIND( 0, MAX_PARTY, i, p->party.member[i].account_id == account_id && p->party.member[i].char_id == char_id ); if( i == MAX_PARTY ) { ShowError("party_recv_movemap: char %d/%d not found in party %s (id:%d)",account_id,char_id,p->party.name,party_id); return 0; } m = &p->party.member[i]; m->map = map; m->online = online; m->lv = lv; //Check if they still exist on this map server p->data[i].sd = party_sd_check(party_id, account_id, char_id); clif_party_info(p,NULL); return 0; }
void party_send_movemap(struct map_session_data *sd) { int i; struct party_data *p; if( sd->status.party_id==0 ) return; intif_party_changemap(sd,1); p=party_search(sd->status.party_id); if (!p) return; if(sd->state.connect_new) { //Note that this works because this function is invoked before connect_new is cleared. clif_party_option(p,sd,0x100); clif_party_info(p,sd); clif_party_member_info(p,sd); } if (sd->fd) { // synchronize minimap positions with the rest of the party for(i=0; i < MAX_PARTY; i++) { if (p->data[i].sd && p->data[i].sd != sd && p->data[i].sd->bl.m == sd->bl.m) { clif_party_xy_single(sd->fd, p->data[i].sd); clif_party_xy_single(p->data[i].sd->fd, sd); } } } return; }
int party_changeleader(struct map_session_data *sd, struct map_session_data *tsd, struct party_data *p) { int mi, tmi; if ( !p ) { if (!sd || !sd->status.party_id) return -1; if (!tsd || tsd->status.party_id != sd->status.party_id) { clif_displaymessage(sd->fd, msg_txt(sd,283)); return -3; } if ( map[sd->bl.m].flag.partylock ) { clif_displaymessage(sd->fd, msg_txt(sd,287)); return 0; } if ((p = party_search(sd->status.party_id)) == NULL ) return -1; ARR_FIND( 0, MAX_PARTY, mi, p->data[mi].sd == sd ); if (mi == MAX_PARTY) return 0; // Shouldn't happen if (!p->party.member[mi].leader) { // Need to be a party leader. clif_displaymessage(sd->fd, msg_txt(sd,282)); return 0; } ARR_FIND( 0, MAX_PARTY, tmi, p->data[tmi].sd == tsd); if (tmi == MAX_PARTY) return 0; // Shouldn't happen } else { ARR_FIND(0,MAX_PARTY,mi,p->party.member[mi].leader); if (mi == MAX_PARTY) return 0; // Shouldn't happen ARR_FIND(0,MAX_PARTY,tmi,p->data[tmi].sd == tsd); if (tmi == MAX_PARTY) return 0; // Shouldn't happen } // Change leadership. p->party.member[mi].leader = 0; p->party.member[tmi].leader = 1; // Update members clif_party_leaderchanged(p->data[mi].sd, p->data[mi].sd->status.account_id, p->data[tmi].sd->status.account_id); // Update info. intif_party_leaderchange(p->party.party_id,p->party.member[tmi].account_id,p->party.member[tmi].char_id); clif_party_info(p,NULL); return 1; }
/// Invoked (from char-server) when a new member is added to the party. /// flag: 0-success, 1-failure int party_member_added (int party_id, int account_id, int char_id, int flag) { struct map_session_data *sd = map_id2sd (account_id), *sd2; struct party_data *p = party_search (party_id); int i; if (sd == NULL || sd->status.char_id != char_id || !sd->party_joining) { if (!flag) //Char logged off before being accepted into party. intif_party_leave (party_id, account_id, char_id); return 0; } sd2 = map_id2sd (sd->party_invite_account); sd->party_joining = false; sd->party_invite = 0; sd->party_invite_account = 0; if (!p) { ShowError ("party_member_added: party %d not found.\n", party_id); intif_party_leave (party_id, account_id, char_id); return 0; } if (flag) { // failed if (sd2 != NULL) clif_party_inviteack (sd2, sd->status.name, 3); return 0; } sd->status.party_id = party_id; clif_party_member_info (p, sd); clif_party_option (p, sd, 0x100); clif_party_info (p, sd); if (sd2 != NULL) clif_party_inviteack (sd2, sd->status.name, 2); for (i = 0; i < ARRAYLENGTH (p->data); ++i) { // hp of the other party members sd2 = p->data[i].sd; if (sd2 && sd2->status.account_id != account_id && sd2->status.char_id != char_id) clif_hpmeter_single (sd->fd, sd2->bl.id, sd2->battle_status.hp, sd2->battle_status.max_hp); } clif_party_hp (sd); clif_party_xy (sd); clif_charnameupdate (sd); //Update char name's display [Skotlex] if (p->instance_id) clif_instance_join (sd->fd, p->instance_id); return 0; }
bool party_changeleader(struct map_session_data *sd, struct map_session_data *tsd) { struct party_data *p; int mi, tmi; if (!sd || !sd->status.party_id) return false; if (!tsd || tsd->status.party_id != sd->status.party_id) { clif_displaymessage(sd->fd, msg_txt(283)); return false; } if( map[sd->bl.m].flag.partylock ) { clif_displaymessage(sd->fd, "You cannot change party leaders on this map."); return false; } if ((p = party_search(sd->status.party_id)) == NULL) return false; ARR_FIND( 0, MAX_PARTY, mi, p->data[mi].sd == sd ); if (mi == MAX_PARTY) return false; //Shouldn't happen if (!p->party.member[mi].leader) { //Need to be a party leader. clif_displaymessage(sd->fd, msg_txt(282)); return false; } ARR_FIND( 0, MAX_PARTY, tmi, p->data[tmi].sd == tsd); if (tmi == MAX_PARTY) return false; //Shouldn't happen //Change leadership. p->party.member[mi].leader = 0; if (p->data[mi].sd->fd) clif_displaymessage(p->data[mi].sd->fd, msg_txt(284)); p->party.member[tmi].leader = 1; if (p->data[tmi].sd->fd) clif_displaymessage(p->data[tmi].sd->fd, msg_txt(285)); //Update info. intif_party_leaderchange(p->party.party_id,p->party.member[tmi].account_id,p->party.member[tmi].char_id); clif_party_info(p,NULL); party_booking_delete(sd, true); // Party Booking [Spiria] clif_PartyBookingDeleteAck(sd, 0); // Close small window return true; }
// 情報所得 int party_recv_info(struct party *sp) { struct party *p; int i; nullpo_retr(0, sp); if((p=(struct party *) numdb_search(party_db,sp->party_id))==NULL){ p=(struct party *)aCalloc(1,sizeof(struct party)); numdb_insert(party_db,sp->party_id,p); // 最初のロードなのでユーザーのチェックを行う party_check_member(sp); } memcpy(p,sp,sizeof(struct party)); for(i=0;i<MAX_PARTY;i++){ // sdの設定 struct map_session_data *sd = map_id2sd(p->member[i].account_id); if(sd!=NULL && sd->status.party_id==p->party_id && !sd->state.waitingdisconnect) p->member[i].sd=sd; else p->member[i].sd=NULL; } clif_party_info(p,-1); // Refresh hp/xy state [LuzZza] for(i=0;i<MAX_PARTY;i++) { struct map_session_data *sd = p->member[i].sd; if(sd!=NULL) { clif_party_hp(sd); clif_party_xy(sd); } } for(i=0;i<MAX_PARTY;i++){ // 設定情報の送信 struct map_session_data *sd = p->member[i].sd; if(sd!=NULL && sd->state.party_sent==0){ clif_party_option(p,sd,0x100); sd->state.party_sent=1; } } return 0; }
// パーティメンバの移動 int party_send_movemap(struct map_session_data *sd) { int i; struct party *p; nullpo_retr(0, sd); if( sd->status.party_id==0 ) return 0; intif_party_changemap(sd,1); p=party_search(sd->status.party_id); if (p && sd->fd) { //Send dots of other party members to this char. [Skotlex] for(i=0; i < MAX_PARTY; i++) { if (!p->member[i].sd || p->member[i].sd == sd || p->member[i].sd->bl.m != sd->bl.m) continue; clif_party_xy_single(sd->fd, p->member[i].sd); } } if( sd->state.party_sent ) // もうパーティデータは送信済み return 0; // 競合確認 party_check_conflict(sd); // あるならパーティ情報送信 if(p){ party_check_member(p); // 所属を確認する if(sd->status.party_id==p->party_id){ clif_party_main_info(p,sd->fd); clif_party_option(p,sd,0x100); clif_party_info(p,sd->fd); sd->state.party_sent=1; } } return 0; }
// パーティメンバの移動通知 void party_recv_movemap(PartyId party_id, AccountId account_id, MapName mapname, int online, int lv) { PartyPair p; int i; if (!(p = party_search(party_id))) return; for (i = 0; i < MAX_PARTY; i++) { PartyMember *m = &p->member[i]; if (m == nullptr) { PRINTF("party_recv_movemap nullpo?\n"_fmt); return; } if (m->account_id == account_id) { m->map = mapname; m->online = online; m->lv = lv; break; } } if (i == MAX_PARTY) { if (battle_config.error_log) PRINTF("party: not found member %d on %d[%s]"_fmt, account_id, party_id, p->name); return; } for (i = 0; i < MAX_PARTY; i++) { // sd再設定 dumb_ptr<map_session_data> sd = map_id2sd(account_to_block(p->member[i].account_id)); p->member[i].sd = (sd != nullptr && sd->status.party_id == p.party_id) ? sd.operator->() : nullptr; } party_send_xy_clear(p); // 座標再通知要請 clif_party_info(p, nullptr); }
// パーティメンバの移動通知 void party_recv_movemap(int party_id, int account_id, MapName mapname, int online, int lv) { struct party *p; int i; if ((p = party_search(party_id)) == NULL) return; for (i = 0; i < MAX_PARTY; i++) { struct party_member *m = &p->member[i]; if (m == NULL) { PRINTF("party_recv_movemap nullpo?\n"); return; } if (m->account_id == account_id) { m->map = mapname; m->online = online; m->lv = lv; break; } } if (i == MAX_PARTY) { if (battle_config.error_log) PRINTF("party: not found member %d on %d[%s]", account_id, party_id, p->name); return; } for (i = 0; i < MAX_PARTY; i++) { // sd再設定 dumb_ptr<map_session_data> sd = map_id2sd(p->member[i].account_id); p->member[i].sd = (sd != NULL && sd->status.party_id == p->party_id) ? sd.operator->() : NULL; } party_send_xy_clear(p); // 座標再通知要請 clif_party_info(p, -1); }
// 情報所得 int party_recv_info(struct party *sp) { struct map_session_data *sd; struct party *p; int i; nullpo_retr(0, sp); p= idb_ensure(party_db, sp->party_id, create_party); if (!p->party_id) //party just received. party_check_member(sp); memcpy(p,sp,sizeof(struct party)); for(i=0;i<MAX_PARTY;i++){ // sdの設定 if (!p->member[i].account_id) { p->member[i].sd=NULL; continue; } sd = map_id2sd(p->member[i].account_id); p->member[i].sd = (sd!=NULL && sd->status.party_id==p->party_id && sd->status.char_id == p->member[i].char_id && !sd->state.waitingdisconnect)?sd:NULL; } for(i=0;i<MAX_PARTY;i++){ // 設定情報の送信 sd = p->member[i].sd; if(!sd) continue; // Refresh hp/xy state [LuzZza] clif_party_hp(sd); clif_party_xy(sd); if(sd->state.party_sent==0){ clif_party_main_info(p,-1); clif_party_option(p,sd,0x100); clif_party_info(p,-1); sd->state.party_sent=1; } } return 0; }
// 情報所得 int party_recv_info(const struct party *sp) { int i; nullpo_ret(sp); struct party *p = party_db.search(sp->party_id); if (p == NULL) { p = party_db.init(sp->party_id); // 最初のロードなのでユーザーのチェックを行う *p = *sp; party_check_member(p); } else *p = *sp; for (i = 0; i < MAX_PARTY; i++) { // sdの設定 dumb_ptr<map_session_data> sd = map_id2sd(p->member[i].account_id); p->member[i].sd = (sd != NULL && sd->status.party_id == p->party_id) ? sd.operator->() : NULL; } clif_party_info(p, -1); for (i = 0; i < MAX_PARTY; i++) { // 設定情報の送信 // dumb_ptr<map_session_data> sd = map_id2sd(p->member[i].account_id); dumb_ptr<map_session_data> sd = dumb_ptr<map_session_data>(p->member[i].sd); if (sd != NULL && sd->party_sended == 0) { clif_party_option(p, sd, 0x100); sd->party_sended = 1; } } return 0; }
// 情報所得 int party_recv_info(const PartyPair sp) { int i; nullpo_retz(sp); PartyPair p = party_search(sp.party_id); if (!p) { p.party_most = party_db.init(sp.party_id); // 最初のロードなのでユーザーのチェックを行う *p.party_most = *sp.party_most; party_check_member(p); } else *p.party_most = *sp.party_most; for (i = 0; i < MAX_PARTY; i++) { // sdの設定 dumb_ptr<map_session_data> sd = map_id2sd(account_to_block(p->member[i].account_id)); p->member[i].sd = (sd != nullptr && sd->status.party_id == p.party_id) ? sd.operator->() : nullptr; } clif_party_info(p, nullptr); for (i = 0; i < MAX_PARTY; i++) { // 設定情報の送信 // dumb_ptr<map_session_data> sd = map_id2sd(p->member[i].account_id); dumb_ptr<map_session_data> sd = dumb_ptr<map_session_data>(p->member[i].sd); if (sd != nullptr && sd->party_sended == 0) { clif_party_option(p, sd, 0x100); sd->party_sended = 1; } } return 0; }
// パーティメンバの移動通知 int party_recv_movemap(int party_id,int account_id,int char_id, unsigned short map,int online,int lv) { struct party *p; int i; if( (p=party_search(party_id))==NULL) return 0; for(i=0;i<MAX_PARTY;i++){ struct map_session_data *sd; struct party_member *m=&p->member[i]; /* This can never happen... if( m == NULL ){ ShowError("party_recv_movemap nullpo?\n"); return 0; } */ if(m->account_id==account_id && m->char_id==char_id){ m->map = map; m->online=online; m->lv=lv; //Check if they still exist on this map server sd = map_id2sd(m->account_id); p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id && sd->status.char_id == m->char_id && !sd->state.waitingdisconnect)?sd:NULL; //if so, clear their coordinates as they just changed maps. if (p->member[i].sd) { sd->party_x=-1; sd->party_y=-1; } break; } } if(i==MAX_PARTY){ if(battle_config.error_log) ShowError("party: not found member %d on %d[%s]",account_id,party_id,p->name); return 0; } clif_party_info(p,-1); return 0; }
int party_recv_info(struct party *sp) { struct party_data *p; int i; bool party_new = false; nullpo_retr(0, sp); p = (struct party_data*)idb_ensure(party_db, sp->party_id, create_party); if (!p->party.party_id) //party just received. { party_new = true; party_check_member(sp); } memcpy(&p->party,sp,sizeof(struct party)); memset(&p->state, 0, sizeof(p->state)); memset(&p->data, 0, sizeof(p->data)); for(i=0;i<MAX_PARTY;i++){ if (!p->party.member[i].account_id) continue; p->data[i].sd = party_sd_check(p->party.party_id, p->party.member[i].account_id, p->party.member[i].char_id); } party_check_state(p); if (party_new) { //Send party data to all players. struct map_session_data *sd; for(i=0;i<MAX_PARTY;i++){ sd = p->data[i].sd; if(!sd) continue; clif_charnameupdate(sd); //Update other people's display. [Skotlex] clif_party_member_info(p,sd); clif_party_option(p,sd,0x100); clif_party_info(p,NULL); } } return 0; }
int party_recv_info(struct party *sp) { struct map_session_data *sd; struct party_data *p; int i; nullpo_retr(0, sp); p= idb_ensure(party_db, sp->party_id, create_party); if (!p->party.party_id) //party just received. party_check_member(sp); memcpy(&p->party,sp,sizeof(struct party)); memset(&p->state, 0, sizeof(p->state)); memset(&p->data, 0, sizeof(p->data)); for(i=0;i<MAX_PARTY;i++){ if (!p->party.member[i].account_id) continue; sd = map_id2sd(p->party.member[i].account_id); if (sd && sd->status.party_id==p->party.party_id && sd->status.char_id == p->party.member[i].char_id && !sd->state.waitingdisconnect) p->data[i].sd = sd; } party_check_state(p); for(i=0;i<MAX_PARTY;i++){ sd = p->data[i].sd; if(!sd || sd->state.party_sent) continue; clif_party_member_info(p,sd); clif_party_option(p,sd,0x100); clif_party_info(p,NULL); sd->state.party_sent=1; } return 0; }
void party_send_movemap(struct map_session_data *sd) { int i; struct party_data *p; if( sd->status.party_id==0 ) return; intif_party_changemap(sd,1); p=party_search(sd->status.party_id); if (!p) return; if(!sd->state.party_sent) { party_check_member(&p->party); if(sd->status.party_id==p->party.party_id){ clif_party_option(p,sd,0x100); clif_party_info(p,sd); clif_party_member_info(p,sd); sd->state.party_sent=1; } } if (sd->fd) { // synchronize minimap positions with the rest of the party for(i=0; i < MAX_PARTY; i++) { if (p->data[i].sd && p->data[i].sd != sd && p->data[i].sd->bl.m == sd->bl.m) { clif_party_xy_single(sd->fd, p->data[i].sd); clif_party_xy_single(p->data[i].sd->fd, sd); } } } return; }
int party_recv_info(struct party* sp, uint32 char_id) { struct party_data* p; struct party_member* member; struct map_session_data* sd; int removed[MAX_PARTY];// member_id in old data int removed_count = 0; int added[MAX_PARTY];// member_id in new data int added_count = 0; int member_id; nullpo_ret(sp); p = (struct party_data*)idb_get(party_db, sp->party_id); if( p != NULL ) { // diff members int i; for( member_id = 0; member_id < MAX_PARTY; ++member_id ) { member = &p->party.member[member_id]; if( member->char_id == 0 ) continue; // empty ARR_FIND(0, MAX_PARTY, i, sp->member[i].account_id == member->account_id && sp->member[i].char_id == member->char_id); if( i == MAX_PARTY ) removed[removed_count++] = member_id; } for( member_id = 0; member_id < MAX_PARTY; ++member_id ) { member = &sp->member[member_id]; if( member->char_id == 0 ) continue; // empty ARR_FIND(0, MAX_PARTY, i, p->party.member[i].account_id == member->account_id && p->party.member[i].char_id == member->char_id); if( i == MAX_PARTY ) added[added_count++] = member_id; } } else { for( member_id = 0; member_id < MAX_PARTY; ++member_id ) if( sp->member[member_id].char_id != 0 ) added[added_count++] = member_id; CREATE(p, struct party_data, 1); idb_put(party_db, sp->party_id, p); } while( removed_count > 0 ) { // no longer in party member_id = removed[--removed_count]; sd = p->data[member_id].sd; if( sd == NULL ) continue; // not online party_member_withdraw(sp->party_id, sd->status.account_id, sd->status.char_id); } memcpy(&p->party, sp, sizeof(struct party)); memset(&p->state, 0, sizeof(p->state)); memset(&p->data, 0, sizeof(p->data)); for( member_id = 0; member_id < MAX_PARTY; member_id++ ) { member = &p->party.member[member_id]; if ( member->char_id == 0 ) continue;// empty p->data[member_id].sd = party_sd_check(sp->party_id, member->account_id, member->char_id); } party_check_state(p); while( added_count > 0 ) { // new in party member_id = added[--added_count]; sd = p->data[member_id].sd; if( sd == NULL ) continue;// not online clif_charnameupdate(sd); //Update other people's display. [Skotlex] clif_party_member_info(p,sd); // Only send this on party creation, otherwise it will be sent by party_send_movemap [Lemongrass] if( sd->party_creating ){ clif_party_option(p,sd,0x100); } clif_party_info(p,NULL); if( p->instance_id != 0 ) instance_reqinfo(sd,p->instance_id); } if( char_id != 0 ) { // requester sd = map_charid2sd(char_id); if( sd && sd->status.party_id == sp->party_id && party_getmemberid(p,sd) == -1 ) sd->status.party_id = 0;// was not in the party } return 0; }
int party_changeleader(struct map_session_data *sd, struct map_session_data *tsd, struct party_data *p) { int mi, tmi; if ( !p ) { if (!sd || !sd->status.party_id) return -1; if (!tsd || tsd->status.party_id != sd->status.party_id) { clif_displaymessage(sd->fd, msg_txt(sd,283)); return -3; } if ( map_getmapflag(sd->bl.m, MF_PARTYLOCK) ) { clif_displaymessage(sd->fd, msg_txt(sd,287)); return 0; } if ((p = party_search(sd->status.party_id)) == NULL ) return -1; ARR_FIND( 0, MAX_PARTY, mi, p->data[mi].sd == sd ); if (mi == MAX_PARTY) return 0; // Shouldn't happen if (!p->party.member[mi].leader) { // Need to be a party leader. clif_displaymessage(sd->fd, msg_txt(sd,282)); return 0; } ARR_FIND( 0, MAX_PARTY, tmi, p->data[tmi].sd == tsd); if (tmi == MAX_PARTY) return 0; // Shouldn't happen if (battle_config.change_party_leader_samemap && p->party.member[mi].map != p->party.member[tmi].map) { clif_msg(sd, PARTY_MASTER_CHANGE_SAME_MAP); return 0; } } else { ARR_FIND(0,MAX_PARTY,mi,p->party.member[mi].leader); if (mi == MAX_PARTY) return 0; // Shouldn't happen ARR_FIND(0,MAX_PARTY,tmi,p->data[tmi].sd == tsd); if (tmi == MAX_PARTY) return 0; // Shouldn't happen } // Change leadership. p->party.member[mi].leader = 0; p->party.member[tmi].leader = 1; // Update members clif_party_leaderchanged(p->data[mi].sd, p->data[mi].sd->status.account_id, p->data[tmi].sd->status.account_id); // Update info. intif_party_leaderchange(p->party.party_id,p->party.member[tmi].account_id,p->party.member[tmi].char_id); clif_party_info(p,NULL); return 1; }