/// 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_create(struct map_session_data *sd,char *name,int item,int item2) { struct party_member leader; char tname[NAME_LENGTH]; safestrncpy(tname, name, NAME_LENGTH); if( strlen(trim(tname)) == 0 ) {// empty name return 0; } if( sd->status.party_id > 0 || sd->party_joining || sd->party_creating ) {// already associated with a party clif_party_created(sd,2); return 0; } sd->party_creating = true; party_fill_member(&leader, sd); leader.leader = 1; intif_create_party(&leader,name,item,item2); return 0; }
int party_reply_invite(struct map_session_data *sd,int party_id,int flag) { struct map_session_data* tsd; struct party_member member; if( sd->party_invite != party_id ) { // forged sd->party_invite = 0; sd->party_invite_account = 0; return 0; } tsd = map_id2sd(sd->party_invite_account); if( flag == 1 && !sd->party_creating && !sd->party_joining ) { // accepted and allowed sd->party_joining = true; party_fill_member(&member, sd, 0); intif_party_addmember(sd->party_invite, &member); return 1; } else { // rejected or failure sd->party_invite = 0; sd->party_invite_account = 0; if( tsd != NULL ) clif_party_invite_reply(tsd,sd->status.name,PARTY_REPLY_REJECTED); } return 0; }
int party_create(struct map_session_data *sd,char *name,int item,int item2) { struct party_member leader; nullpo_retr(0, sd); if(sd->status.party_id) { clif_party_created(sd,2); return 0; } party_fill_member(&leader, sd); leader.leader = 1; intif_create_party(&leader,name,item,item2); return 0; }
int party_reply_invite(struct map_session_data *sd,int account_id,int flag) { struct map_session_data *tsd= map_id2sd(account_id); struct party_member member; nullpo_retr(0, sd); if(flag==1){ party_fill_member(&member, sd); intif_party_addmember(sd->party_invite, &member); return 0; } sd->party_invite=0; sd->party_invite_account=0; if(tsd==NULL) return 0; clif_party_inviteack(tsd,sd->status.name,1); return 1; }
void party_reply_invite(struct map_session_data *sd,int account_id,int flag) { struct map_session_data *tsd= map_id2sd(account_id); struct party_member member; if( flag == 1 && !sd->party_creating && !sd->party_joining ) {// accepted and allowed sd->party_joining = true; party_fill_member(&member, sd); intif_party_addmember(sd->party_invite, &member); } else {// rejected or failure sd->party_invite = 0; sd->party_invite_account = 0; if( tsd != NULL ) clif_party_inviteack(tsd,sd->status.name,1); } }
/// Request the creation of a party. /// Returns true if the request was sent. bool party_create(struct map_session_data* sd, const char* name, int item, int item2) { struct party_member leader; char tname[NAME_LENGTH]; safestrncpy(tname, name, NAME_LENGTH); trim(tname); if( !tname[0] ) {// empty name return false; } if( sd->status.party_id > 0 || sd->party_joining || sd->party_creating ) {// already associated with a party clif_party_created(sd,2); return false; } party_fill_member(&leader, sd, 1); sd->party_creating = intif_create_party(&leader,name,item,item2); return sd->party_creating; }
int party_reply_invite(struct map_session_data *sd,int party_id,int flag) { struct map_session_data* tsd; struct party_member member; if( sd->party_invite != party_id ) { // forged sd->party_invite = 0; sd->party_invite_account = 0; return 0; } // The character is already in a party, possibly left a party invite open and created his own party if( sd->status.party_id != 0 ){ // On Aegis no rejection packet is sent to the inviting player sd->party_invite = 0; sd->party_invite_account = 0; return 0; } tsd = map_id2sd(sd->party_invite_account); if( flag == 1 && !sd->party_creating && !sd->party_joining ) { // accepted and allowed sd->party_joining = true; party_fill_member(&member, sd, 0); intif_party_addmember(sd->party_invite, &member); return 1; } else { // rejected or failure sd->party_invite = 0; sd->party_invite_account = 0; if( tsd != NULL ) clif_party_invite_reply(tsd,sd->status.name,PARTY_REPLY_REJECTED); } return 0; }