Corrected a problem where a party invite acknowledgement would not be sent (bugreport:1091).
There is still the unresolved issue where newly added party members will not display their party correctly. git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@12328 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
83deaf5e43
commit
a08c56007a
@ -519,36 +519,39 @@ int mapif_parse_PartyInfo(int fd, int party_id) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ƒp?ƒeƒB’ljÁ—v‹<76>
|
||||
int mapif_parse_PartyAddMember(int fd, int party_id, struct party_member *member) {
|
||||
// ƒp<C692>[ƒeƒB’ljÁ—v‹<76>
|
||||
int mapif_parse_PartyAddMember(int fd, int party_id, struct party_member *member)
|
||||
{
|
||||
struct party_data *p;
|
||||
int i;
|
||||
|
||||
p = idb_get(party_db, party_id);
|
||||
if (p == NULL || p->size == MAX_PARTY) {
|
||||
if( p == NULL || p->size == MAX_PARTY ) {
|
||||
mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for(i = 0; i < MAX_PARTY; i++) {
|
||||
if (p->party.member[i].account_id == 0) {
|
||||
memcpy(&p->party.member[i], member, sizeof(struct party_member));
|
||||
p->party.member[i].leader = 0;
|
||||
if (p->party.member[i].online) p->party.count++;
|
||||
p->size++;
|
||||
if (p->size == 3) //Check family state.
|
||||
int_party_calc_state(p);
|
||||
else //Check even share range.
|
||||
if (member->lv < p->min_lv || member->lv > p->max_lv || p->family) {
|
||||
if (p->family) p->family = 0; //Family state broken.
|
||||
int_party_check_lv(p);
|
||||
}
|
||||
mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 0);
|
||||
mapif_party_info(-1, &p->party);
|
||||
return 0;
|
||||
}
|
||||
ARR_FIND( 0, MAX_PARTY, i, p->party.member[i].account_id == 0 );
|
||||
if( i == MAX_PARTY )
|
||||
{// Party full
|
||||
mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 1);
|
||||
return 0;
|
||||
}
|
||||
mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 1);
|
||||
|
||||
memcpy(&p->party.member[i], member, sizeof(struct party_member));
|
||||
p->party.member[i].leader = 0;
|
||||
if (p->party.member[i].online) p->party.count++;
|
||||
p->size++;
|
||||
if (p->size == 3) //Check family state.
|
||||
int_party_calc_state(p);
|
||||
else //Check even share range.
|
||||
if (member->lv < p->min_lv || member->lv > p->max_lv || p->family) {
|
||||
if (p->family) p->family = 0; //Family state broken.
|
||||
int_party_check_lv(p);
|
||||
}
|
||||
|
||||
mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 0);
|
||||
mapif_party_info(-1, &p->party);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -535,42 +535,43 @@ int mapif_parse_PartyInfo(int fd,int party_id)
|
||||
return 0;
|
||||
}
|
||||
// パーティ追加要求
|
||||
int mapif_parse_PartyAddMember(int fd, int party_id, struct party_member *member) {
|
||||
int mapif_parse_PartyAddMember(int fd, int party_id, struct party_member *member)
|
||||
{
|
||||
struct party_data *p;
|
||||
int i;
|
||||
|
||||
p = inter_party_fromsql(party_id);
|
||||
|
||||
if(!p || p->size == MAX_PARTY){
|
||||
mapif_party_memberadded(fd,party_id,member->account_id,member->char_id,1);
|
||||
if( p == NULL || p->size == MAX_PARTY ) {
|
||||
mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for(i=0;i<MAX_PARTY;i++){
|
||||
if(p->party.member[i].account_id)
|
||||
continue;
|
||||
|
||||
memcpy(&p->party.member[i], member, sizeof(struct party_member));
|
||||
p->party.member[i].leader=0;
|
||||
if (p->party.member[i].online) p->party.count++;
|
||||
p->size++;
|
||||
if (p->size == 3) //Check family state.
|
||||
int_party_calc_state(p);
|
||||
else //Check even share range.
|
||||
if (member->lv < p->min_lv || member->lv > p->max_lv || p->family) {
|
||||
if (p->family) p->family = 0; //Family state broken.
|
||||
int_party_check_lv(p);
|
||||
}
|
||||
|
||||
mapif_party_memberadded(fd,party_id,member->account_id,member->char_id,0);
|
||||
mapif_party_info(-1,&p->party);
|
||||
inter_party_tosql(&p->party, PS_ADDMEMBER, i);
|
||||
ARR_FIND( 0, MAX_PARTY, i, p->party.member[i].account_id == 0 );
|
||||
if( i == MAX_PARTY )
|
||||
{// Party full
|
||||
mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 1);
|
||||
return 0;
|
||||
}
|
||||
//Party full
|
||||
mapif_party_memberadded(fd,party_id,member->account_id,member->char_id,1);
|
||||
|
||||
memcpy(&p->party.member[i], member, sizeof(struct party_member));
|
||||
p->party.member[i].leader = 0;
|
||||
if (p->party.member[i].online) p->party.count++;
|
||||
p->size++;
|
||||
if (p->size == 3) //Check family state.
|
||||
int_party_calc_state(p);
|
||||
else //Check even share range.
|
||||
if (member->lv < p->min_lv || member->lv > p->max_lv || p->family) {
|
||||
if (p->family) p->family = 0; //Family state broken.
|
||||
int_party_check_lv(p);
|
||||
}
|
||||
|
||||
mapif_party_memberadded(fd, party_id, member->account_id, member->char_id, 0);
|
||||
mapif_party_info(-1, &p->party);
|
||||
inter_party_tosql(&p->party, PS_ADDMEMBER, i);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// パーティー設定変更要求
|
||||
int mapif_parse_PartyChangeOption(int fd,int party_id,int account_id,int exp,int item)
|
||||
{
|
||||
|
@ -5411,19 +5411,17 @@ int clif_party_invite(struct map_session_data *sd,struct map_session_data *tsd)
|
||||
* 3 -> party is full
|
||||
* 4 -> char of the same account already joined the party
|
||||
*------------------------------------------*/
|
||||
int clif_party_inviteack(struct map_session_data* sd, const char* nick, int flag)
|
||||
void clif_party_inviteack(struct map_session_data* sd, const char* nick, int flag)
|
||||
{
|
||||
int fd;
|
||||
|
||||
nullpo_retr(0, sd);
|
||||
|
||||
nullpo_retv(sd);
|
||||
fd=sd->fd;
|
||||
|
||||
WFIFOHEAD(fd,packet_len(0xfd));
|
||||
WFIFOW(fd,0)=0xfd;
|
||||
memcpy(WFIFOP(fd,2),nick,NAME_LENGTH);
|
||||
WFIFOB(fd,26)=flag;
|
||||
WFIFOW(fd,0) = 0xfd;
|
||||
safestrncpy((char*)WFIFOP(fd,2),nick,NAME_LENGTH);
|
||||
WFIFOB(fd,26) = flag;
|
||||
WFIFOSET(fd,packet_len(0xfd));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
@ -9818,27 +9816,35 @@ void clif_parse_PartyInvite2(int fd, struct map_session_data *sd)
|
||||
|
||||
party_invite(sd, t_sd);
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* パーティ勧誘返答
|
||||
* Party invitation reply
|
||||
* S 00ff <account ID>.L <flag>.L
|
||||
* S 02c7 <account ID>.L <flag>.B
|
||||
* flag: 0-reject, 1-accept
|
||||
*------------------------------------------*/
|
||||
void clif_parse_ReplyPartyInvite(int fd,struct map_session_data *sd)
|
||||
{
|
||||
if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 5){
|
||||
party_reply_invite(sd,RFIFOL(fd,2),RFIFOL(fd,6));
|
||||
} else {
|
||||
if( battle_config.basic_skill_check && pc_checkskill(sd,NV_BASIC) < 5 )
|
||||
{
|
||||
party_reply_invite(sd,RFIFOL(fd,2),-1);
|
||||
clif_skill_fail(sd,1,0,4);
|
||||
return;
|
||||
}
|
||||
|
||||
party_reply_invite(sd,RFIFOL(fd,2),RFIFOL(fd,6));
|
||||
}
|
||||
|
||||
void clif_parse_ReplyPartyInvite2(int fd,struct map_session_data *sd)
|
||||
{
|
||||
if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_BASIC) >= 5){
|
||||
party_reply_invite(sd,RFIFOL(fd,2),RFIFOB(fd,6));
|
||||
} else {
|
||||
if( battle_config.basic_skill_check && pc_checkskill(sd,NV_BASIC) < 5 )
|
||||
{
|
||||
party_reply_invite(sd,RFIFOL(fd,2),-1);
|
||||
clif_skill_fail(sd,1,0,4);
|
||||
return;
|
||||
}
|
||||
|
||||
party_reply_invite(sd,RFIFOL(fd,2),RFIFOB(fd,6));
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
|
@ -281,7 +281,7 @@ int clif_party_created(struct map_session_data *sd,int result);
|
||||
int clif_party_member_info(struct party_data *p, struct map_session_data *sd);
|
||||
int clif_party_info(struct party_data *p, struct map_session_data *sd);
|
||||
int clif_party_invite(struct map_session_data *sd,struct map_session_data *tsd);
|
||||
int clif_party_inviteack(struct map_session_data* sd, const char* nick, int flag);
|
||||
void clif_party_inviteack(struct map_session_data* sd, const char* nick, int flag);
|
||||
int clif_party_option(struct party_data *p,struct map_session_data *sd,int flag);
|
||||
int clif_party_leaved(struct party_data* p, struct map_session_data* sd, int account_id, const char* name, int flag);
|
||||
int clif_party_message(struct party_data* p, int account_id, const char* mes, int len);
|
||||
|
@ -122,7 +122,7 @@ int party_create(struct map_session_data *sd,char *name,int item,int item2)
|
||||
}
|
||||
|
||||
|
||||
int party_created(int account_id,int char_id,int fail,int party_id,char *name)
|
||||
void party_created(int account_id,int char_id,int fail,int party_id,char *name)
|
||||
{
|
||||
struct map_session_data *sd;
|
||||
sd=map_id2sd(account_id);
|
||||
@ -131,17 +131,16 @@ int party_created(int account_id,int char_id,int fail,int party_id,char *name)
|
||||
{ //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 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if(fail){
|
||||
clif_party_created(sd,1);
|
||||
return 0; // "party name already exists"
|
||||
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"
|
||||
}
|
||||
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.
|
||||
return 1;
|
||||
}
|
||||
|
||||
int party_request_info(int party_id)
|
||||
@ -328,22 +327,23 @@ int party_invite(struct map_session_data *sd,struct map_session_data *tsd)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int party_reply_invite(struct map_session_data *sd,int account_id,int flag)
|
||||
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){
|
||||
if( flag == 1 )
|
||||
{// accepted
|
||||
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;
|
||||
else
|
||||
{// rejected or failure
|
||||
sd->party_invite = 0;
|
||||
sd->party_invite_account = 0;
|
||||
if( tsd != NULL )
|
||||
clif_party_inviteack(tsd,sd->status.name,1);
|
||||
}
|
||||
}
|
||||
|
||||
//Invoked when a player joins:
|
||||
@ -367,10 +367,12 @@ void party_member_joined(struct map_session_data *sd)
|
||||
}
|
||||
|
||||
/// 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 invite_aid;
|
||||
int i;
|
||||
|
||||
if(sd == NULL || sd->status.char_id != char_id){
|
||||
@ -378,8 +380,10 @@ int party_member_added(int party_id,int account_id,int char_id, int flag)
|
||||
intif_party_leave(party_id,account_id,char_id);
|
||||
return 0;
|
||||
}
|
||||
sd->party_invite=0;
|
||||
sd->party_invite_account=0;
|
||||
|
||||
invite_aid = sd->party_invite_account;
|
||||
sd->party_invite = 0;
|
||||
sd->party_invite_account = 0;
|
||||
|
||||
if (!p) {
|
||||
ShowError("party_member_added: party %d not found.\n",party_id);
|
||||
@ -387,8 +391,8 @@ int party_member_added(int party_id,int account_id,int char_id, int flag)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!flag) {
|
||||
sd->status.party_id=party_id;
|
||||
if( flag == 0 ) {
|
||||
sd->status.party_id = party_id;
|
||||
party_check_conflict(sd);
|
||||
clif_party_option(p,sd,0x100);
|
||||
clif_party_info(p,sd);
|
||||
@ -404,8 +408,8 @@ int party_member_added(int party_id,int account_id,int char_id, int flag)
|
||||
clif_charnameupdate(sd); //Update char name's display [Skotlex]
|
||||
}
|
||||
|
||||
sd2=map_id2sd(sd->party_invite_account);
|
||||
if (sd2)
|
||||
sd2 = map_id2sd(invite_aid);
|
||||
if( sd2 != NULL )
|
||||
clif_party_inviteack(sd2,sd->status.name,flag?2:1);
|
||||
return 0;
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ struct party_data* party_search(int party_id);
|
||||
struct party_data* party_searchname(const char* str);
|
||||
|
||||
int party_create(struct map_session_data *sd,char *name, int item, int item2);
|
||||
int party_created(int account_id,int char_id,int fail,int party_id,char *name);
|
||||
void party_created(int account_id,int char_id,int fail,int party_id,char *name);
|
||||
int party_request_info(int party_id);
|
||||
int party_invite(struct map_session_data *sd,struct map_session_data *tsd);
|
||||
void party_member_joined(struct map_session_data *sd);
|
||||
@ -29,7 +29,7 @@ int party_member_added(int party_id,int account_id,int char_id,int flag);
|
||||
int party_leave(struct map_session_data *sd);
|
||||
int party_removemember(struct map_session_data *sd,int account_id,char *name);
|
||||
int party_member_leaved(int party_id,int account_id,int char_id);
|
||||
int party_reply_invite(struct map_session_data *sd,int account_id,int flag);
|
||||
void party_reply_invite(struct map_session_data *sd,int account_id,int flag);
|
||||
int party_recv_noinfo(int party_id);
|
||||
int party_recv_info(struct party *sp);
|
||||
int party_recv_movemap(int party_id,int account_id,int char_id, unsigned short map,int online,int lv);
|
||||
|
Loading…
x
Reference in New Issue
Block a user