Пример #1
0
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;
}
Пример #2
0
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;
}