CQuestMissionLogPacket::CQuestMissionLogPacket(CCharEntity * PChar, uint8 logID, LOG_TYPE logType) { this->type = 0x56; this->size = 0x14; uint16 packetType = 0x00; // FFXI packs different TOAU information in the same packet as certain other content, so we'll have to work around it. // First, deal with all quest areas which aren't TOAU: if ((logType <= LOG_QUEST_COMPLETE) && (logID != QUESTS_TOAU)) { // We're updating any non-TOAU quest log generateQuestPacket(PChar, logID, logType); packetType = (logType == LOG_QUEST_CURRENT ? questPacketBytes.at(logID).first : questPacketBytes.at(logID).second); } // Then get our mission log updates out of the way else if (logType >= LOG_MISSION_CURRENT) { if ((logID <= MISSION_ZILART) && (logType == LOG_MISSION_COMPLETE)) { // Completed Nation and Zilart missions are updated in the same packet generateCompleteMissionPacket(PChar); packetType = MISSION_COMPLETE; } else if ((logID >= MISSION_TOAU) && (logID <= MISSION_CAMPAIGN) && (logID != MISSION_COP)) { // Deal with compound TOAU/WOTG quest/mission packets switch (logType) { case LOG_MISSION_CURRENT: // Current TOAU Quests, TOAU Mission, WOTG, Assault, and Campaign Mission all share a packet generateQuestPacket(PChar, QUESTS_TOAU, LOG_QUEST_CURRENT); // "Base" of the packet generateCurrentExpMissionPacket(PChar); // Writes 12 bytes in same packet packetType = TOAU_WOTG_MISSION_CURRENT; break; case LOG_MISSION_COMPLETE: switch (logID) { case MISSION_TOAU: case MISSION_WOTG: // Completed TOAU and WOTG missions share a packet generateCompleteExpMissionPacket(PChar); packetType = TOAU_WOTG_MISSION_COMPLETE; break; case MISSION_ASSAULT: // Completed Assault Missions share a packet with completed TOAU quests generateQuestPacket(PChar, QUESTS_TOAU, LOG_QUEST_COMPLETE); generateAssaultMissionPacket(PChar); packetType = ASSAULT_COMPLETE; break; case MISSION_CAMPAIGN: // Completed Campaign missions take up two packets. Second half will come in a follow-up packet. generateCampaignMissionPacket(PChar, 0); packetType = CAMPAIGN_MISSION_ONE; break; } break; case LOG_CAMPAIGN_TWO: // Second Campaign packet, summoned through logType generateCampaignMissionPacket(PChar, 256); packetType = CAMPAIGN_MISSION_TWO; break; } } else { // All other mission logs update current / completed with a standard "current mission" update generateCurrentMissionPacket(PChar); packetType = MISSION_CURRENT; } } else { // Now all that remains is TOAU quests. generateQuestPacket(PChar, QUESTS_TOAU, logType); // "Base" of the packet if (logType == LOG_QUEST_CURRENT) { // As before, current TOAU Quests share with TOAU Mission, WOTG, Assault, and Campaign Missions generateCurrentExpMissionPacket(PChar); // Writes 12 bytes in same packet packetType = questPacketBytes.at(logID).first; } else { // Completed TOAU Quests share a packet with completed Assault Missions generateAssaultMissionPacket(PChar); // Writes in same packet packetType = questPacketBytes.at(logID).second; } } // Write the byte that informs FFXI client what kind of Quest/Mission log update this packet is. WBUFW(data, (0x24)) = packetType; }
CQuestMissionLogPacket::CQuestMissionLogPacket(CCharEntity * PChar, uint8 logID, uint8 status) { this->type = 0x56; this->size = 0x14; // настоятельно советую в switch(logID) ничего не менять, // если вы НЕ УВЕРЕНЫ в том, что делаете // даже простая перестановка case местами может привести к логическим ошибкам uint16 logType = 0x0000; switch(logID) { case QUESTS_SANDORIA: generateQuestPacket(PChar, QUESTS_SANDORIA, status); if(status == 0x01) logType = SAN_CURRENT; if(status == 0x02) logType = SAN_COMPLETE; break; case QUESTS_BASTOK: generateQuestPacket(PChar, QUESTS_BASTOK, status); if(status == 0x01) logType = BAS_CURRENT; if(status == 0x02) logType = BAS_COMPLETE; break; case QUESTS_WINDURST: generateQuestPacket(PChar, QUESTS_WINDURST, status); if(status == 0x01) logType = WIN_CURRENT; if(status == 0x02) logType = WIN_COMPLETE; break; case QUESTS_JEUNO: generateQuestPacket(PChar, QUESTS_JEUNO, status); if(status == 0x01) logType = JEU_CURRENT; if(status == 0x02) logType = JEU_COMPLETE; break; case QUESTS_OTHER: generateQuestPacket(PChar, QUESTS_OTHER, status); if(status == 0x01) logType = OTH_CURRENT; if(status == 0x02) logType = OTH_COMPLETE; break; case QUESTS_OUTLANDS: generateQuestPacket(PChar, QUESTS_OUTLANDS, status); if(status == 0x01) logType = OUT_CURRENT; if(status == 0x02) logType = OUT_COMPLETE; break; case QUESTS_CRYSTALWAR: generateQuestPacket(PChar, QUESTS_CRYSTALWAR, status); if(status == 0x01) logType = WAR_CURRENT; if(status == 0x02) logType = WAR_COMPLETE; break; case QUESTS_ABYSSEA: generateQuestPacket(PChar, QUESTS_ABYSSEA, status); if(status == 0x01) logType = ABY_CURRENT; if(status == 0x02) logType = ABY_COMPLETE; break; case QUESTS_ADOULIN: generateQuestPacket(PChar, QUESTS_ADOULIN, status); if(status == 0x01) logType = ADO_CURRENT; if(status == 0x02) logType = ADO_COMPLETE; break; case QUESTS_COALITION: generateQuestPacket(PChar, QUESTS_COALITION, status); if(status == 0x01) logType = COA_CURRENT; if(status == 0x02) logType = COA_COMPLETE; break; case QUESTS_AHTURHGAN: case MISSION_ASSAULT: if(status == 0x02) { generateQuestPacket(PChar, QUESTS_AHTURHGAN, status); generateAssaultMissionPacket(PChar); logType = EXP_COMPLETE; break; } case MISSION_TOAU: case MISSION_WOTG: if(status == 0x02) { generateCompleteExpMissionPacket(PChar); logType = EXP_MISS_COMPLETE; break; } case MISSION_CAMPAIGN: if(status == 0x02) { generateFirstCampaignMissionPacket(PChar); logType = CAMPAIGN_MISSION_UN; break; } case MISSION_CAMPAIGN2: if(status == 0x01) { generateQuestPacket(PChar, QUESTS_AHTURHGAN, status); generateCurrentExpMissionPacket(PChar); logType = EXP_CURRENT; break; } if(status == 0x02) { generateSecondCampaignMissionPacket(PChar); logType = CAMPAIGN_MISSION_DEUX; break; } case MISSION_SANDORIA: if(status == 0x01) { generateCurrentMissionPacket(PChar); logType = MISS_CURRENT; break; } if(status == 0x02) { generateCompleteMissionPacket(PChar); logType = MISS_COMPLETE; break; } case MISSION_BASTOK: if(status == 0x01) { generateCurrentMissionPacket(PChar); logType = MISS_CURRENT; break; } if(status == 0x02) { generateCompleteMissionPacket(PChar); logType = MISS_COMPLETE; break; } case MISSION_WINDURST: if(status == 0x01) { generateCurrentMissionPacket(PChar); logType = MISS_CURRENT; break; } if(status == 0x02) { generateCompleteMissionPacket(PChar); logType = MISS_COMPLETE; break; } case MISSION_ZILART: if(status == 0x01) { generateCurrentMissionPacket(PChar); logType = MISS_CURRENT; break; } if(status == 0x02) { generateCompleteMissionPacket(PChar); logType = MISS_COMPLETE; break; } case MISSION_COP: case MISSION_CRISTALLINE_PROPHECY: case MISSION_MOOGLE_KUPO_DETAT: case MISSION_SHANTOTTO_ASCENSION: case MISSION_ADOULIN: case MISSION_RHAPSODIES: if(status == 0x01) { generateCurrentMissionPacket(PChar); logType = MISS_CURRENT; break; } } WBUFW(data,(0x24)) = logType; }