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

Fixed questlog display for clients from 2014-10-22 on
This commit is contained in:
Lemongrass3110 2015-10-11 14:06:36 +02:00
commit 79ef03e656
2 changed files with 55 additions and 21 deletions

View File

@ -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

View File

@ -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;
}