Переглянути джерело

Fixed questlog display for clients from 2014-10-22 on

Lemongrass3110 9 роки тому
батько
коміт
45e50a3d24
2 змінених файлів з 66 додано та 22 видалено
  1. 63 22
      src/map/clif.c
  2. 3 0
      src/map/quest.c

+ 63 - 22
src/map/clif.c

@@ -15608,40 +15608,81 @@ void clif_parse_PartyTick(int fd, struct map_session_data* sd)
 
 /// Sends list of all quest states (ZC_ALL_QUEST_LIST).
 /// 02b1 <packet len>.W <num>.L { <quest id>.L <active>.B }*num
+/// 097a <packet len>.W <num>.L { <quest id>.L <active>.B <remaining time>.L <time>.L <count>.W { <mob_id>.L <killed>.W <total>.W <mob name>.24B }*count }*num
 void clif_quest_send_list(struct map_session_data *sd)
 {
+#if PACKETVER >= 20141022
+	#define INFOLEN 15
 	int fd = sd->fd;
 	int i;
-#if PACKETVER >= 20141022
-	int info_len = 15;
-	int len = sd->avail_quests*info_len+8;
-	WFIFOHEAD(fd,len);
+	int offset;
+
+	WFIFOHEAD(fd,sd->avail_quests*INFOLEN+8);
 	WFIFOW(fd, 0) = 0x97a;
-#else
-	int info_len = 5;
-	int len = sd->avail_quests*info_len+8;
-	WFIFOHEAD(fd,len);
-	WFIFOW(fd, 0) = 0x2b1;
-#endif
-	WFIFOW(fd, 2) = len;
 	WFIFOL(fd, 4) = sd->avail_quests;
 
+	offset = 8;
+
 	for (i = 0; i < sd->avail_quests; i++) {
-#if PACKETVER >= 20141022
 		struct quest_db *qi = quest_search(sd->quest_log[i].quest_id);
-#endif
-		WFIFOL(fd, i*info_len+8) = sd->quest_log[i].quest_id;
-		WFIFOB(fd, i*info_len+12) = sd->quest_log[i].state;
-#if PACKETVER >= 20141022
-		WFIFOL(fd, i*info_len+13) = sd->quest_log[i].time - qi->time;
-		WFIFOL(fd, i*info_len+17) = sd->quest_log[i].time;
-		WFIFOW(fd, i*info_len+21) = qi->objectives_count;
-#endif
+
+		WFIFOL(fd, offset) = sd->quest_log[i].quest_id;
+		offset += 4;
+		WFIFOB(fd, offset) = sd->quest_log[i].state;
+		offset++;
+		WFIFOL(fd, offset) = sd->quest_log[i].time - qi->time;
+		offset += 4;
+		WFIFOL(fd, offset) = sd->quest_log[i].time;
+		offset += 4;
+		WFIFOW(fd, offset) = qi->objectives_count;
+		offset += 2;
+		
+		if( qi->objectives_count > 0 ){
+			int j;
+			struct mob_db *mob;
+
+			for( j = 0; j < qi->objectives_count; j++ ){
+				mob = mob_db(qi->objectives[j].mob);
+
+				WFIFOL(fd, offset) = qi->objectives[j].mob;
+				offset += 4;
+				WFIFOW(fd, offset) = sd->quest_log[i].count[j];
+				offset += 2;
+				WFIFOW(fd, offset) = qi->objectives[j].count;
+				offset += 2;
+				memcpy(WFIFOP(fd, offset), mob->jname, NAME_LENGTH);
+				offset += NAME_LENGTH;
+			}
+		}
 	}
 
-	WFIFOSET(fd, len);
-}
+	WFIFOW(fd, 2) = offset;	
+	WFIFOSET(fd, offset);
+	#undef INFOLEN
+#else
+	#define INFOLEN 5
+	int i;
+	int offset;
+	int fd = sd->fd;
+
+	WFIFOHEAD(fd,sd->avail_quests*INFOLEN+8);
+	WFIFOW(fd, 0) = 0x2b1;
+	WFIFOL(fd, 4) = sd->avail_quests;
 
+	offset = 8;
+
+	for (i = 0; i < sd->avail_quests; i++) {
+		WFIFOL(fd, offset) = sd->quest_log[i].quest_id;
+		offset += 4;
+		WFIFOB(fd, offset) = sd->quest_log[i].state;
+		offset += 1;
+	}
+	
+	WFIFOW(fd, 2) = offset;
+	WFIFOSET(fd, offset);
+	#undef INFOLEN
+#endif
+}
 
 /// Sends list of all quest missions (ZC_ALL_QUEST_MISSION).
 /// 02b2 <packet len>.W <num>.L { <quest id>.L <start time>.L <expire time>.L <mobs>.W { <mob id>.L <mob count>.W <mob name>.24B }*3 }*num

+ 3 - 0
src/map/quest.c

@@ -48,11 +48,14 @@ int quest_pc_login(TBL_PC *sd)
 		return 1;
 
 	clif_quest_send_list(sd);
+
+#if PACKETVER < 20141022
 	clif_quest_send_mission(sd);
 
 	//@TODO[Haru]: Is this necessary? Does quest_send_mission not take care of this?
 	for( i = 0; i < sd->avail_quests; i++ )
 		clif_quest_update_objective(sd, &sd->quest_log[i]);
+#endif
 
 	return 0;
 }