Jelajahi Sumber

Fixed clif_party_message using an incorrect buffer length

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9845 54d463be-8e91-2dee-dedb-b68131a5f0ec
ultramage 18 tahun lalu
induk
melakukan
1ad9bb7c15
2 mengubah file dengan 31 tambahan dan 28 penghapusan
  1. 1 0
      Changelog-Trunk.txt
  2. 30 28
      src/map/clif.c

+ 1 - 0
Changelog-Trunk.txt

@@ -4,6 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2007/02/10
+	* Fixed clif_party_message using an incorrect buffer length [ultramage]
 	* Cosmetic changes to the buildin section of script.c (use defines for 
 	  function names/definitions). [FlavioJS]
 2007/02/09

+ 30 - 28
src/map/clif.c

@@ -5727,40 +5727,42 @@ int clif_party_join_info(struct party *p, struct map_session_data *sd)
 
 
 /*==========================================
- * パーティ情報送信
- *------------------------------------------
- */
-int clif_party_info(struct party_data *p,int fd)
+ * Sends party information
+ * R 00fb <len>.w <party name>.24B {<ID>.l <nick>.24B <map name>.16B <leader>.B <offline>.B}.46B*
+ *------------------------------------------*/
+int clif_party_info(struct party_data* p, int fd)
 {
-	unsigned char buf[1024];
-	int i,c;
-	struct map_session_data *sd=NULL;
+	unsigned char buf[2+2+NAME_LENGTH+(4+NAME_LENGTH+MAP_NAME_LENGTH+1+1)*MAX_PARTY];
+	struct map_session_data* sd = NULL;
+	int i, c;
 
 	nullpo_retr(0, p);
 
-	WBUFW(buf,0)=0xfb;
-	memcpy(WBUFP(buf,4),p->party.name,NAME_LENGTH);
-	for(i=c=0;i<MAX_PARTY;i++){
-		struct party_member *m=&p->party.member[i];
-		if(!m->account_id)
-			continue;
-		if(sd==NULL) sd=p->data[i].sd;
-		WBUFL(buf,28+c*46)=m->account_id;
-		memcpy(WBUFP(buf,28+c*46+ 4),m->name,NAME_LENGTH);
-		memcpy(WBUFP(buf,28+c*46+28),mapindex_id2name(m->map),MAP_NAME_LENGTH);
-		WBUFB(buf,28+c*46+44)=(m->leader)?0:1;
-		WBUFB(buf,28+c*46+45)=(m->online)?0:1;
+	WBUFW(buf,0) = 0xfb;
+	memcpy(WBUFP(buf,4), p->party.name, NAME_LENGTH);
+	for(i = 0, c = 0; i < MAX_PARTY; i++)
+	{
+		struct party_member* m = &p->party.member[i];
+		if(!m->account_id) continue;
+
+		if(sd == NULL) sd = p->data[i].sd; // need at least one member's 'sd' so clif_send() can identify the party
+
+		WBUFL(buf,28+c*46) = m->account_id;
+		memcpy(WBUFP(buf,28+c*46+4), m->name, NAME_LENGTH);
+		memcpy(WBUFP(buf,28+c*46+28), mapindex_id2name(m->map), MAP_NAME_LENGTH);
+		WBUFB(buf,28+c*46+44) = (m->leader) ? 0 : 1;
+		WBUFB(buf,28+c*46+45) = (m->online) ? 0 : 1;
 		c++;
 	}
-	WBUFW(buf,2)=28+c*46;
-	if(fd>=0){	// fdが設定されてるならそれに送る
-		WFIFOHEAD(fd, 28+c*46);
-		memcpy(WFIFOP(fd,0),buf,WBUFW(buf,2));
-		WFIFOSET(fd,WFIFOW(fd,2));
-		return 9;
-	}
-	if(sd!=NULL)
-		clif_send(buf,WBUFW(buf,2),&sd->bl,PARTY);
+	WBUFW(buf,2) = 28+c*46;
+
+	if(fd >= 0) // send only to self
+		if (session[fd] && session[fd]->session_data)
+			clif_send(buf, WBUFW(buf,2), &((struct map_session_data *)session[fd]->session_data)->bl, SELF);
+	else // send to whole party
+		if(sd)
+			clif_send(buf, WBUFW(buf,2), &sd->bl, PARTY);
+	
 	return 0;
 }
 /*==========================================