/// 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; }
int party_removemember2(struct map_session_data *sd,int char_id,int party_id) { if( sd ) { if( !sd->status.party_id ) return -3; party_trade_bound_cancel(sd); intif_party_leave(sd->status.party_id,sd->status.account_id,sd->status.char_id); return 1; } else { int i; struct party_data *p = party_search(party_id); if( !p ) return -2; ARR_FIND(0,MAX_PARTY,i,p->party.member[i].char_id == char_id); if( i >= MAX_PARTY ) return -1; intif_party_leave(party_id,p->party.member[i].account_id,char_id); return 1; } 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; 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; }
// パーティが追加された int party_member_added(PartyId party_id, AccountId account_id, int flag) { dumb_ptr<map_session_data> sd = map_id2sd(account_to_block(account_id)), sd2; PartyPair p = party_search(party_id); if (sd == nullptr) { if (flag == 0) { if (battle_config.error_log) PRINTF("party: member added error %d is not online\n"_fmt, account_id); intif_party_leave(party_id, account_id); // キャラ側に登録できなかったため脱退要求を出す } return 0; } sd2 = map_id2sd(account_to_block(sd->party_invite_account)); sd->party_invite = PartyId(); sd->party_invite_account = AccountId(); if (!p) { PRINTF("party_member_added: party %d not found.\n"_fmt, party_id); intif_party_leave(party_id, account_id); return 0; } if (flag == 1) { // 失敗 if (sd2 != nullptr) clif_party_inviteack(sd2, sd->status_key.name, 0); return 0; } // 成功 sd->party_sended = 0; sd->status.party_id = party_id; if (sd2 != nullptr) clif_party_inviteack(sd2, sd->status_key.name, 2); // いちおう競合確認 party_check_conflict(sd); party_send_xy_clear(p); return 0; }
// パーティが追加された int party_member_added(int party_id, int account_id, int flag) { dumb_ptr<map_session_data> sd = map_id2sd(account_id), sd2; struct party *p = party_search(party_id); if (sd == NULL) { if (flag == 0) { if (battle_config.error_log) PRINTF("party: member added error %d is not online\n", account_id); intif_party_leave(party_id, account_id); // キャラ側に登録できなかったため脱退要求を出す } return 0; } sd2 = map_id2sd(sd->party_invite_account); sd->party_invite = 0; sd->party_invite_account = 0; if (p == NULL) { PRINTF("party_member_added: party %d not found.\n", party_id); intif_party_leave(party_id, account_id); return 0; } if (flag == 1) { // 失敗 if (sd2 != NULL) clif_party_inviteack(sd2, sd->status.name, 0); return 0; } // 成功 sd->party_sended = 0; sd->status.party_id = party_id; if (sd2 != NULL) clif_party_inviteack(sd2, sd->status.name, 2); // いちおう競合確認 party_check_conflict(sd); party_send_xy_clear(p); return 0; }
// パーティ除名要求 int party_removemember(dumb_ptr<map_session_data> sd, AccountId account_id) { PartyPair p; int i; nullpo_retz(sd); if (!(p = party_search(sd->status.party_id))) return 0; for (i = 0; i < MAX_PARTY; i++) { // リーダーかどうかチェック if (p->member[i].account_id == sd->status_key.account_id) { if (p->member[i].leader == 0) return 0; } } for (i = 0; i < MAX_PARTY; i++) { // 所属しているか調べる if (p->member[i].account_id == account_id) { intif_party_leave(p.party_id, account_id); return 0; } } return 0; }
// パーティ除名要求 int party_removemember(dumb_ptr<map_session_data> sd, int account_id) { struct party *p; int i; nullpo_ret(sd); if ((p = party_search(sd->status.party_id)) == NULL) return 0; for (i = 0; i < MAX_PARTY; i++) { // リーダーかどうかチェック if (p->member[i].account_id == sd->status.account_id) if (p->member[i].leader == 0) return 0; } for (i = 0; i < MAX_PARTY; i++) { // 所属しているか調べる if (p->member[i].account_id == account_id) { intif_party_leave(p->party_id, account_id); return 0; } } return 0; }
void party_created(uint32 account_id,uint32 char_id,int fail,int party_id,char *name) { struct map_session_data *sd; sd = map_id2sd(account_id); if (!sd || sd->status.char_id != char_id || !sd->party_creating ) { // Character logged off before creation ack? if (!fail) // break up party since player could not be added to it. intif_party_leave(party_id,account_id,char_id); return; } sd->party_creating = false; if( !fail ) { sd->status.party_id = party_id; clif_party_created(sd,0); // Success message // We don't do any further work here because the char-server sends a party info packet right after creating the party if(party_create_byscript) { // returns party id in $@party_create_id if party is created by script mapreg_setreg(add_str("$@party_create_id"),party_id); party_create_byscript = 0; } } else clif_party_created(sd,1); // "party name already exists" }
/// Party member 'sd' requesting kick of member with <account_id, name>. int party_removemember(struct map_session_data* sd, uint32 account_id, char* name) { struct party_data *p; int i; p = party_search(sd->status.party_id); if( p == NULL ) return 0; // check the requesting char's party membership ARR_FIND( 0, MAX_PARTY, i, p->party.member[i].account_id == sd->status.account_id && p->party.member[i].char_id == sd->status.char_id ); if( i == MAX_PARTY ) return 0; // request from someone not in party? o.O if( !p->party.member[i].leader ) return 0; // only party leader may remove members ARR_FIND( 0, MAX_PARTY, i, p->party.member[i].account_id == account_id && strncmp(p->party.member[i].name,name,NAME_LENGTH) == 0 ); if( i == MAX_PARTY ) return 0; // no such char in party party_trade_bound_cancel(sd); intif_party_leave(p->party.party_id,account_id,p->party.member[i].char_id); return 1; }
// パーティが追加された 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; if(sd == NULL || sd->status.char_id != char_id){ if (flag == 0) { if(battle_config.error_log) ShowError("party: member added error %d is not online\n",account_id); intif_party_leave(party_id,account_id,char_id); // キャラ側i登録eきhかaたたぁ脱憎要求も出す } return 0; } sd->party_invite=0; sd->party_invite_account=0; sd2=map_id2sd(sd->party_invite_account); if (sd2) clif_party_inviteack(sd2,sd->status.name,flag?2:0); if(flag) return 0; sd->state.party_sent=0; sd->status.party_id=party_id; party_check_conflict(sd); clif_charnameupdate(sd); //Update char name's display [Skotlex] clif_party_hp(sd); clif_party_xy(sd); return 0; }
// パーティ除名要求 int party_removemember(struct map_session_data *sd,int account_id,char *name) { struct party *p; int i; nullpo_retr(0, sd); if( (p = party_search(sd->status.party_id)) == NULL ) return 0; for(i=0;i<MAX_PARTY;i++){ // リーダーかどうかチェック if(p->member[i].account_id==sd->status.account_id && p->member[i].char_id==sd->status.char_id) { if(p->member[i].leader) break; return 0; } } if (i >= MAX_PARTY) //Request from someone not in party? o.O return 0; for(i=0;i<MAX_PARTY;i++){ // 所属しているか調べる if(p->member[i].account_id==account_id && strncmp(p->member[i].name,name,NAME_LENGTH)==0) { intif_party_leave(p->party_id,account_id,p->member[i].char_id); return 1; } } return 0; }
int party_removemember2(struct map_session_data *sd,uint32 char_id,int party_id) { if( sd ) { if( !sd->status.party_id ) return -3; party_trade_bound_cancel(sd); intif_party_leave(sd->status.party_id,sd->status.account_id,sd->status.char_id,sd->status.name,PARTY_MEMBER_WITHDRAW_EXPEL); return 1; } else { int i; struct party_data *p; if( !(p = party_search(party_id)) ) return -2; ARR_FIND(0,MAX_PARTY,i,p->party.member[i].char_id == char_id ); if( i >= MAX_PARTY ) return -1; intif_party_leave(party_id,p->party.member[i].account_id,char_id,p->party.member[i].name,PARTY_MEMBER_WITHDRAW_EXPEL); return 1; } }
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); if(sd == NULL || sd->status.char_id != char_id){ if (flag == 0) { if(battle_config.error_log) ShowError("party: member added error %d is not online\n",account_id); intif_party_leave(party_id,account_id,char_id); } return 0; } sd->party_invite=0; sd->party_invite_account=0; if (!p) { if(battle_config.error_log) ShowError("party_member_added: party %d not found.\n",party_id); intif_party_leave(party_id,account_id,char_id); return 0; } if(!flag) { sd->state.party_sent=0; sd->status.party_id=party_id; party_check_conflict(sd); clif_party_member_info(p,sd); clif_party_hp(sd); clif_party_xy(sd); clif_charnameupdate(sd); //Update char name's display [Skotlex] } sd2=map_id2sd(sd->party_invite_account); if (sd2) clif_party_inviteack(sd2,sd->status.name,flag?2:1); return 0; }
static TBL_PC* party_sd_check(int party_id, int account_id, int char_id) { TBL_PC* sd = map_id2sd(account_id); if (!(sd && sd->status.char_id == char_id)) return NULL; if (sd->status.party_id != party_id) { //If player belongs to a different party, kick him out. intif_party_leave(party_id,account_id,char_id); return NULL; } return sd; }
/// Party member 'sd' requesting exit from party. int party_leave(struct map_session_data *sd) { struct party_data *p; int i; p = party_search(sd->status.party_id); if( p == NULL ) return 0; ARR_FIND( 0, MAX_PARTY, i, p->party.member[i].account_id == sd->status.account_id && p->party.member[i].char_id == sd->status.char_id ); if( i == MAX_PARTY ) return 0; intif_party_leave(p->party.party_id,sd->status.account_id,sd->status.char_id); return 1; }
static TBL_PC* party_sd_check(int party_id, uint32 account_id, uint32 char_id) { TBL_PC* sd = map_id2sd(account_id); if (!(sd && sd->status.char_id == char_id)) return NULL; if( sd->status.party_id == 0 ) sd->status.party_id = party_id;// auto-join if not in a party if (sd->status.party_id != party_id) { //If player belongs to a different party, kick him out. intif_party_leave(party_id,account_id,char_id,sd->status.name,PARTY_MEMBER_WITHDRAW_LEAVE); return NULL; } return sd; }
/// Party member 'sd' requesting exit from party. int party_leave(struct map_session_data *sd) { struct party_data *p; int i; p = party_search(sd->status.party_id); if( p == NULL ) return 0; ARR_FIND( 0, MAX_PARTY, i, p->party.member[i].account_id == sd->status.account_id && p->party.member[i].char_id == sd->status.char_id ); if( i == MAX_PARTY ) return 0; party_trade_bound_cancel(sd); intif_party_leave(p->party.party_id,sd->status.account_id,sd->status.char_id,sd->status.name,PARTY_MEMBER_WITHDRAW_LEAVE); return 1; }
// パーティ脱退要求 int party_leave(struct map_session_data *sd) { struct party *p; int i; nullpo_retr(0, sd); if( (p = party_search(sd->status.party_id)) == NULL ) return 0; for(i=0;i<MAX_PARTY;i++){ // 所属しているか if(p->member[i].account_id==sd->status.account_id){ intif_party_leave(p->party_id,sd->status.account_id); return 0; } } return 0; }
// パーティ脱退要求 int party_leave(dumb_ptr<map_session_data> sd) { PartyPair p; int i; nullpo_retz(sd); if (!(p = party_search(sd->status.party_id))) return 0; for (i = 0; i < MAX_PARTY; i++) { // 所属しているか if (p->member[i].account_id == sd->status_key.account_id) { intif_party_leave(p.party_id, sd->status_key.account_id); return 0; } } return 0; }
/// Party member 'sd' requesting exit from party. int party_leave(struct map_session_data *sd) { struct party_data *p; int i; p = party_search(sd->status.party_id); if( p == NULL ) return 0; ARR_FIND( 0, MAX_PARTY, i, p->party.member[i].account_id == sd->status.account_id && p->party.member[i].char_id == sd->status.char_id ); if( i == MAX_PARTY ) return 0; if( check_party_leader(sd, p) ){ // when party leader leaves party, cancel booking. party_booking_delete(sd,true); clif_PartyBookingDeleteAck(sd,0); } intif_party_leave(p->party.party_id,sd->status.account_id,sd->status.char_id); return 1; }
/// Party creation notification. void party_created(int account_id, int char_id, int fail, int party_id, const char* name) { struct map_session_data *sd; sd=map_id2sd(account_id); if (!sd || sd->status.char_id != char_id || !sd->party_creating ) { //Character logged off before creation ack? if (!fail) //break up party since player could not be added to it. intif_party_leave(party_id,account_id,char_id); return; } sd->party_creating = false; if( !fail ) { sd->status.party_id = party_id; clif_party_created(sd,0); //Success message //We don't do any further work here because the char-server sends a party info packet right after creating the party. } else { clif_party_created(sd,1); // "party name already exists" } }