int party_send_xy_timer(int tid, unsigned int tick, int id, intptr data) { struct party_data* p; DBIterator* iter = party_db->iterator(party_db); // for each existing party, for( p = (struct party_data*)iter->first(iter,NULL); iter->exists(iter); p = (struct party_data*)iter->next(iter,NULL) ) { int i; // for each member of this party, for( i = 0; i < MAX_PARTY; i++ ) { //struct map_session_data* sd = p->data[i].sd; struct map_session_data* sd = map_charid2sd(p->party.member[i].char_id); //temporary crashfix if( !sd ) continue; if( p->data[i].x != sd->bl.x || p->data[i].y != sd->bl.y ) {// perform position update clif_party_xy(sd); p->data[i].x = sd->bl.x; p->data[i].y = sd->bl.y; } if (battle_config.party_hp_mode && p->data[i].hp != sd->battle_status.hp) {// perform hp update clif_party_hp(sd); p->data[i].hp = sd->battle_status.hp; } } } iter->destroy(iter); return 0; }
// 位置やHP通知用 static void party_send_xyhp_timer_sub(struct party *p) { int i; nullpo_retv(p); for (i = 0; i < MAX_PARTY; i++) { dumb_ptr<map_session_data> sd = dumb_ptr<map_session_data>(p->member[i].sd); if (sd != NULL) { // 座標通知 if (sd->party_x != sd->bl_x || sd->party_y != sd->bl_y) { clif_party_xy(p, sd); sd->party_x = sd->bl_x; sd->party_y = sd->bl_y; } // HP通知 if (sd->party_hp != sd->status.hp) { clif_party_hp(p, sd); sd->party_hp = sd->status.hp; } } } }
/// 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_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_send_xy_timer_sub(DBKey key,void *data,va_list ap) { struct party_data *p=(struct party_data *)data; struct map_session_data *sd; int i; nullpo_retr(0, p); for(i=0;i<MAX_PARTY;i++){ if(!p->data[i].sd) continue; sd = p->data[i].sd; if (p->data[i].x != sd->bl.x || p->data[i].y != sd->bl.y) { clif_party_xy(sd); p->data[i].x = sd->bl.x; p->data[i].y = sd->bl.y; } if (battle_config.party_hp_mode && p->data[i].hp != sd->battle_status.hp) { clif_party_hp(sd); p->data[i].hp = sd->battle_status.hp; } } return 0; }
int party_send_xy_timer(int tid, unsigned int tick, int id, intptr_t data) { struct party_data *p; DBIterator *iter = db_iterator(party_db); //For each existing party for( p = (struct party_data *)dbi_first(iter); dbi_exists(iter); p = (struct party_data *)dbi_next(iter) ) { int i; if( !p->party.count ) //No online party members so do not iterate continue; //For each member of this party for( i = 0; i < MAX_PARTY; i++ ) { struct map_session_data *sd = p->data[i].sd; if( !sd ) continue; if( p->data[i].x != sd->bl.x || p->data[i].y != sd->bl.y ) { //Perform position update clif_party_xy(sd); p->data[i].x = sd->bl.x; p->data[i].y = sd->bl.y; } if( battle_config.party_hp_mode && p->data[i].hp != sd->battle_status.hp ) { //Perform hp update clif_party_hp(sd); p->data[i].hp = sd->battle_status.hp; } } } dbi_destroy(iter); 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_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_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_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; }