feat: initial protovyre/evolving cosmetics
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Build / build (pull_request) Successful in 1m8s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Build / build (pull_request) Successful in 1m8s
				
			Basic handling of sending the challenge rewards to the inbox upon completion. Still missing handling for the Protovyre armor pieces which require killing sentients.
This commit is contained in:
		
							parent
							
								
									8f77c722cb
								
							
						
					
					
						commit
						bf4bfc4c69
					
				@ -10,6 +10,7 @@ import { logger } from "@/src/utils/logger";
 | 
			
		||||
export const updateChallengeProgressController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const challenges = getJSONfromString<IUpdateChallengeProgressRequest>(String(req.body));
 | 
			
		||||
    const account = await getAccountForRequest(req);
 | 
			
		||||
    logger.debug(`challenge report:`, challenges);
 | 
			
		||||
 | 
			
		||||
    const inventory = await getInventory(
 | 
			
		||||
        account._id.toString(),
 | 
			
		||||
@ -17,7 +18,7 @@ export const updateChallengeProgressController: RequestHandler = async (req, res
 | 
			
		||||
    );
 | 
			
		||||
    let affiliationMods: IAffiliationMods[] = [];
 | 
			
		||||
    if (challenges.ChallengeProgress) {
 | 
			
		||||
        affiliationMods = addChallenges(
 | 
			
		||||
        affiliationMods = await addChallenges(
 | 
			
		||||
            account,
 | 
			
		||||
            inventory,
 | 
			
		||||
            challenges.ChallengeProgress,
 | 
			
		||||
 | 
			
		||||
@ -1903,25 +1903,87 @@ export const addLoreFragmentScans = (inventory: TInventoryDatabaseDocument, arr:
 | 
			
		||||
    });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const addChallenges = (
 | 
			
		||||
const challengeRewardsInboxMessages: Record<string, IMessageCreationTemplate> = {
 | 
			
		||||
    SentEvoEphemeraRankOne: {
 | 
			
		||||
        sub: "/Lotus/Language/Inbox/EvolvingEphemeraUnlockAName",
 | 
			
		||||
        sndr: "/Lotus/Language/Bosses/Ordis",
 | 
			
		||||
        msg: "/Lotus/Language/Inbox/EvolvingEphemeraUnlockADesc",
 | 
			
		||||
        icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
 | 
			
		||||
        att: ["/Lotus/Upgrades/Skins/Effects/NarmerEvolvingEphemeraB"]
 | 
			
		||||
    },
 | 
			
		||||
    SentEvoEphemeraRankTwo: {
 | 
			
		||||
        sub: "/Lotus/Language/Inbox/EvolvingEphemeraUnlockBName",
 | 
			
		||||
        sndr: "/Lotus/Language/Bosses/Ordis",
 | 
			
		||||
        msg: "/Lotus/Language/Inbox/EvolvingEphemeraUnlockBDesc",
 | 
			
		||||
        icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
 | 
			
		||||
        att: ["/Lotus/Upgrades/Skins/Effects/NarmerEvolvingEphemeraC"]
 | 
			
		||||
    },
 | 
			
		||||
    SentEvoSyandanaRankOne: {
 | 
			
		||||
        sub: "/Lotus/Language/Inbox/EvolvingSyandanaUnlockAName",
 | 
			
		||||
        sndr: "/Lotus/Language/Bosses/Ordis",
 | 
			
		||||
        msg: "/Lotus/Language/Inbox/EvolvingSyandanaUnlockADesc",
 | 
			
		||||
        icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
 | 
			
		||||
        att: ["/Lotus/Upgrades/Skins/Scarves/NarmerEvolvingSyandanaBCape"]
 | 
			
		||||
    },
 | 
			
		||||
    SentEvoSyandanaRankTwo: {
 | 
			
		||||
        sub: "/Lotus/Language/Inbox/EvolvingSyandanaUnlockBName",
 | 
			
		||||
        sndr: "/Lotus/Language/Bosses/Ordis",
 | 
			
		||||
        msg: "/Lotus/Language/Inbox/EvolvingSyandanaUnlockBDesc",
 | 
			
		||||
        icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
 | 
			
		||||
        att: ["/Lotus/Upgrades/Skins/Scarves/NarmerEvolvingSyandanaCCape"]
 | 
			
		||||
    },
 | 
			
		||||
    SentEvoSekharaRankOne: {
 | 
			
		||||
        sub: "/Lotus/Language/Inbox/EvolvingSekharaUnlockAName",
 | 
			
		||||
        sndr: "/Lotus/Language/Bosses/Ordis",
 | 
			
		||||
        msg: "/Lotus/Language/Inbox/EvolvingSekharaUnlockADesc",
 | 
			
		||||
        icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
 | 
			
		||||
        att: ["/Lotus/Upgrades/Skins/Clan/ZarimanEvolvingSekharaBadgeItemB"]
 | 
			
		||||
    },
 | 
			
		||||
    SentEvoSekharaRankTwo: {
 | 
			
		||||
        sub: "/Lotus/Language/Inbox/EvolvingSekharaUnlockBName",
 | 
			
		||||
        sndr: "/Lotus/Language/Bosses/Ordis",
 | 
			
		||||
        msg: "/Lotus/Language/Inbox/EvolvingSekharaUnlockBDesc",
 | 
			
		||||
        icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
 | 
			
		||||
        att: ["/Lotus/Upgrades/Skins/Clan/ZarimanEvolvingSekharaBadgeItemC"]
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const addChallenges = async (
 | 
			
		||||
    account: TAccountDocument,
 | 
			
		||||
    inventory: TInventoryDatabaseDocument,
 | 
			
		||||
    ChallengeProgress: IChallengeProgress[],
 | 
			
		||||
    SeasonChallengeCompletions: ISeasonChallenge[] | undefined
 | 
			
		||||
): IAffiliationMods[] => {
 | 
			
		||||
    ChallengeProgress.forEach(({ Name, Progress }) => {
 | 
			
		||||
        const itemIndex = inventory.ChallengeProgress.findIndex(i => i.Name === Name);
 | 
			
		||||
 | 
			
		||||
        if (itemIndex !== -1) {
 | 
			
		||||
            inventory.ChallengeProgress[itemIndex].Progress = Progress;
 | 
			
		||||
): Promise<IAffiliationMods[]> => {
 | 
			
		||||
    for (const { Name, Progress, Completed } of ChallengeProgress) {
 | 
			
		||||
        let dbChallenge = inventory.ChallengeProgress.find(x => x.Name == Name);
 | 
			
		||||
        if (dbChallenge) {
 | 
			
		||||
            dbChallenge.Progress = Progress;
 | 
			
		||||
        } else {
 | 
			
		||||
            inventory.ChallengeProgress.push({ Name, Progress });
 | 
			
		||||
            dbChallenge = { Name, Progress };
 | 
			
		||||
            inventory.ChallengeProgress.push(dbChallenge);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (Name.startsWith("Calendar")) {
 | 
			
		||||
            addString(getCalendarProgress(inventory).SeasonProgress.ActivatedChallenges, Name);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
        if ((Completed?.length ?? 0) > (dbChallenge.Completed?.length ?? 0)) {
 | 
			
		||||
            dbChallenge.Completed ??= [];
 | 
			
		||||
            for (const completion of Completed!) {
 | 
			
		||||
                if (dbChallenge.Completed.indexOf(completion) == -1) {
 | 
			
		||||
                    if (completion == "challengeRewards") {
 | 
			
		||||
                        if (Name in challengeRewardsInboxMessages) {
 | 
			
		||||
                            await createMessage(account._id, [challengeRewardsInboxMessages[Name]]);
 | 
			
		||||
                            dbChallenge.Completed.push(completion);
 | 
			
		||||
                            // Would love to somehow let the client know about inbox or inventory changes, but there doesn't seem to anything for updateChallengeProgress.
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    logger.warn(`ignoring unknown challenge completion`, { challenge: Name, completion });
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const affiliationMods: IAffiliationMods[] = [];
 | 
			
		||||
    if (SeasonChallengeCompletions) {
 | 
			
		||||
 | 
			
		||||
@ -292,7 +292,7 @@ export const addMissionInventoryUpdates = async (
 | 
			
		||||
                addRecipes(inventory, value);
 | 
			
		||||
                break;
 | 
			
		||||
            case "ChallengeProgress":
 | 
			
		||||
                addChallenges(account, inventory, value, inventoryUpdates.SeasonChallengeCompletions);
 | 
			
		||||
                await addChallenges(account, inventory, value, inventoryUpdates.SeasonChallengeCompletions);
 | 
			
		||||
                break;
 | 
			
		||||
            case "FusionTreasures":
 | 
			
		||||
                addFusionTreasures(inventory, value);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user