Преглед на файлове

Merge pull request #669 from rathena/hotfix/questlog-2014

Fixed questlog display for clients from 2014-10-22 on
Lemongrass3110 преди 9 години
родител
ревизия
79ef03e656
променени са 2 файла, в които са добавени 55 реда и са изтрити 21 реда
  1. 50 21
      src/map/clif.c
  2. 5 0
      src/map/quest.c

+ 50 - 21
src/map/clif.c

@@ -15605,40 +15605,69 @@ 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)
 {
 	int fd = sd->fd;
 	int i;
+	int offset = 8;
+
 #if PACKETVER >= 20141022
-	int info_len = 15;
-	int len = sd->avail_quests*info_len+8;
-	WFIFOHEAD(fd,len);
+	WFIFOHEAD(fd,sd->avail_quests*15+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;
 
 	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);
+#else
+	WFIFOHEAD(fd,sd->avail_quests*5+8);
+	WFIFOW(fd, 0) = 0x2b1;
+	WFIFOL(fd, 4) = sd->avail_quests;
 
+	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);
+#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

+ 5 - 0
src/map/quest.c

@@ -42,17 +42,22 @@ struct quest_db *quest_search(int quest_id)
  */
 int quest_pc_login(TBL_PC *sd)
 {
+#if PACKETVER < 20141022
 	int i;
+#endif
 
 	if( sd->avail_quests == 0 )
 		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;
 }