forked from OpenWF/SpaceNinjaServer
		
	feat: daily synthesis (#1014)
Closes #386 Closes #533 Reviewed-on: OpenWF/SpaceNinjaServer#1014 Co-authored-by: Sainan <sainan@calamity.inc> Co-committed-by: Sainan <sainan@calamity.inc>
This commit is contained in:
		
							parent
							
								
									d7628d46e9
								
							
						
					
					
						commit
						28a36052d9
					
				
							
								
								
									
										11
									
								
								src/controllers/api/abandonLibraryDailyTaskController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/controllers/api/abandonLibraryDailyTaskController.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
import { getInventory } from "@/src/services/inventoryService";
 | 
			
		||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
 | 
			
		||||
export const abandonLibraryDailyTaskController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const accountId = await getAccountIdForRequest(req);
 | 
			
		||||
    const inventory = await getInventory(accountId);
 | 
			
		||||
    inventory.LibraryActiveDailyTaskInfo = undefined;
 | 
			
		||||
    await inventory.save();
 | 
			
		||||
    res.status(200).end();
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										31
									
								
								src/controllers/api/claimLibraryDailyTaskRewardController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/controllers/api/claimLibraryDailyTaskRewardController.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,31 @@
 | 
			
		||||
import { getInventory } from "@/src/services/inventoryService";
 | 
			
		||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
 | 
			
		||||
export const claimLibraryDailyTaskRewardController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const accountId = await getAccountIdForRequest(req);
 | 
			
		||||
    const inventory = await getInventory(accountId);
 | 
			
		||||
 | 
			
		||||
    const rewardQuantity = inventory.LibraryActiveDailyTaskInfo!.RewardQuantity;
 | 
			
		||||
    const rewardStanding = inventory.LibraryActiveDailyTaskInfo!.RewardStanding;
 | 
			
		||||
    inventory.LibraryActiveDailyTaskInfo = undefined;
 | 
			
		||||
    inventory.LibraryAvailableDailyTaskInfo = undefined;
 | 
			
		||||
 | 
			
		||||
    let syndicate = inventory.Affiliations.find(x => x.Tag == "LibrarySyndicate");
 | 
			
		||||
    if (!syndicate) {
 | 
			
		||||
        syndicate = inventory.Affiliations[inventory.Affiliations.push({ Tag: "LibrarySyndicate", Standing: 0 }) - 1];
 | 
			
		||||
    }
 | 
			
		||||
    syndicate.Standing += rewardStanding;
 | 
			
		||||
 | 
			
		||||
    inventory.FusionPoints += 80 * rewardQuantity;
 | 
			
		||||
    await inventory.save();
 | 
			
		||||
 | 
			
		||||
    res.json({
 | 
			
		||||
        RewardItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/RareFusionBundle",
 | 
			
		||||
        RewardQuantity: rewardQuantity,
 | 
			
		||||
        StandingAwarded: rewardStanding,
 | 
			
		||||
        InventoryChanges: {
 | 
			
		||||
            FusionPoints: 80 * rewardQuantity
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
};
 | 
			
		||||
@ -14,7 +14,7 @@ import {
 | 
			
		||||
    ExportVirtuals
 | 
			
		||||
} from "warframe-public-export-plus";
 | 
			
		||||
import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "./infestedFoundryController";
 | 
			
		||||
import { allDailyAffiliationKeys } from "@/src/services/inventoryService";
 | 
			
		||||
import { allDailyAffiliationKeys, createLibraryDailyTask } from "@/src/services/inventoryService";
 | 
			
		||||
 | 
			
		||||
export const inventoryController: RequestHandler = async (request, response) => {
 | 
			
		||||
    const account = await getAccountForRequest(request);
 | 
			
		||||
@ -36,6 +36,9 @@ export const inventoryController: RequestHandler = async (request, response) =>
 | 
			
		||||
            inventory[key] = 16000 + inventory.PlayerLevel * 500;
 | 
			
		||||
        }
 | 
			
		||||
        inventory.DailyFocus = 250000 + inventory.PlayerLevel * 5000;
 | 
			
		||||
 | 
			
		||||
        inventory.LibraryAvailableDailyTaskInfo = createLibraryDailyTask();
 | 
			
		||||
 | 
			
		||||
        await inventory.save();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								src/controllers/api/startLibraryDailyTaskController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/controllers/api/startLibraryDailyTaskController.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
import { getInventory } from "@/src/services/inventoryService";
 | 
			
		||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
 | 
			
		||||
export const startLibraryDailyTaskController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const accountId = await getAccountIdForRequest(req);
 | 
			
		||||
    const inventory = await getInventory(accountId);
 | 
			
		||||
    inventory.LibraryActiveDailyTaskInfo = inventory.LibraryAvailableDailyTaskInfo;
 | 
			
		||||
    await inventory.save();
 | 
			
		||||
    res.json(inventory.LibraryAvailableDailyTaskInfo);
 | 
			
		||||
};
 | 
			
		||||
@ -68,7 +68,7 @@ import {
 | 
			
		||||
    ICalendarProgress,
 | 
			
		||||
    IPendingCouponDatabase,
 | 
			
		||||
    IPendingCouponClient,
 | 
			
		||||
    ILibraryAvailableDailyTaskInfo,
 | 
			
		||||
    ILibraryDailyTaskInfo,
 | 
			
		||||
    IDroneDatabase,
 | 
			
		||||
    IDroneClient
 | 
			
		||||
} from "../../types/inventoryTypes/inventoryTypes";
 | 
			
		||||
@ -950,11 +950,12 @@ pendingCouponSchema.set("toJSON", {
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const libraryAvailableDailyTaskInfoSchema = new Schema<ILibraryAvailableDailyTaskInfo>(
 | 
			
		||||
const libraryDailyTaskInfoSchema = new Schema<ILibraryDailyTaskInfo>(
 | 
			
		||||
    {
 | 
			
		||||
        EnemyTypes: [String],
 | 
			
		||||
        EnemyLocTag: String,
 | 
			
		||||
        EnemyIcon: String,
 | 
			
		||||
        Scans: Number,
 | 
			
		||||
        ScansRequired: Number,
 | 
			
		||||
        RewardStoreItem: String,
 | 
			
		||||
        RewardQuantity: Number,
 | 
			
		||||
@ -1209,7 +1210,8 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
 | 
			
		||||
        //Cephalon Simaris Entries Example:"TargetType"+"Scans"(1-10)+"Completed": true|false
 | 
			
		||||
        LibraryPersonalProgress: [Schema.Types.Mixed],
 | 
			
		||||
        //Cephalon Simaris Daily Task
 | 
			
		||||
        LibraryAvailableDailyTaskInfo: libraryAvailableDailyTaskInfoSchema,
 | 
			
		||||
        LibraryAvailableDailyTaskInfo: libraryDailyTaskInfoSchema,
 | 
			
		||||
        LibraryActiveDailyTaskInfo: libraryDailyTaskInfoSchema,
 | 
			
		||||
 | 
			
		||||
        //https://warframe.fandom.com/wiki/Invasion
 | 
			
		||||
        InvasionChainProgress: [Schema.Types.Mixed],
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
import express from "express";
 | 
			
		||||
import { abandonLibraryDailyTaskController } from "@/src/controllers/api/abandonLibraryDailyTaskController";
 | 
			
		||||
import { activateRandomModController } from "@/src/controllers/api/activateRandomModController";
 | 
			
		||||
import { addFriendImageController } from "@/src/controllers/api/addFriendImageController";
 | 
			
		||||
import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController";
 | 
			
		||||
@ -7,6 +8,7 @@ import { artifactsController } from "@/src/controllers/api/artifactsController";
 | 
			
		||||
import { changeDojoRootController } from "@/src/controllers/api/changeDojoRootController";
 | 
			
		||||
import { checkDailyMissionBonusController } from "@/src/controllers/api/checkDailyMissionBonusController";
 | 
			
		||||
import { claimCompletedRecipeController } from "@/src/controllers/api/claimCompletedRecipeController";
 | 
			
		||||
import { claimLibraryDailyTaskRewardController } from "@/src/controllers/api/claimLibraryDailyTaskRewardController";
 | 
			
		||||
import { clearDialogueHistoryController } from "@/src/controllers/api/clearDialogueHistoryController";
 | 
			
		||||
import { completeRandomModChallengeController } from "@/src/controllers/api/completeRandomModChallengeController";
 | 
			
		||||
import { createGuildController } from "@/src/controllers/api/createGuildController";
 | 
			
		||||
@ -75,6 +77,7 @@ import { setSupportedSyndicateController } from "@/src/controllers/api/setSuppor
 | 
			
		||||
import { setWeaponSkillTreeController } from "@/src/controllers/api/setWeaponSkillTreeController";
 | 
			
		||||
import { shipDecorationsController } from "@/src/controllers/api/shipDecorationsController";
 | 
			
		||||
import { startDojoRecipeController } from "@/src/controllers/api/startDojoRecipeController";
 | 
			
		||||
import { startLibraryDailyTaskController } from "@/src/controllers/api/startLibraryDailyTaskController";
 | 
			
		||||
import { startLibraryPersonalTargetController } from "@/src/controllers/api/startLibraryPersonalTargetController";
 | 
			
		||||
import { startRecipeController } from "@/src/controllers/api/startRecipeController";
 | 
			
		||||
import { stepSequencersController } from "@/src/controllers/api/stepSequencersController";
 | 
			
		||||
@ -93,7 +96,9 @@ import { upgradesController } from "@/src/controllers/api/upgradesController";
 | 
			
		||||
const apiRouter = express.Router();
 | 
			
		||||
 | 
			
		||||
// get
 | 
			
		||||
apiRouter.get("/abandonLibraryDailyTask.php", abandonLibraryDailyTaskController);
 | 
			
		||||
apiRouter.get("/checkDailyMissionBonus.php", checkDailyMissionBonusController);
 | 
			
		||||
apiRouter.get("/claimLibraryDailyTaskReward.php", claimLibraryDailyTaskRewardController);
 | 
			
		||||
apiRouter.get("/credits.php", creditsController);
 | 
			
		||||
apiRouter.get("/deleteSession.php", deleteSessionController);
 | 
			
		||||
apiRouter.get("/dojo", dojoController);
 | 
			
		||||
@ -121,6 +126,7 @@ apiRouter.get("/setActiveQuest.php", setActiveQuestController);
 | 
			
		||||
apiRouter.get("/setActiveShip.php", setActiveShipController);
 | 
			
		||||
apiRouter.get("/setBootLocation.php", setBootLocationController);
 | 
			
		||||
apiRouter.get("/setSupportedSyndicate.php", setSupportedSyndicateController);
 | 
			
		||||
apiRouter.get("/startLibraryDailyTask.php", startLibraryDailyTaskController);
 | 
			
		||||
apiRouter.get("/startLibraryPersonalTarget.php", startLibraryPersonalTargetController);
 | 
			
		||||
apiRouter.get("/surveys.php", surveysController);
 | 
			
		||||
apiRouter.get("/updateSession.php", updateSessionGetController);
 | 
			
		||||
 | 
			
		||||
@ -23,7 +23,7 @@ import {
 | 
			
		||||
    IInventoryDatabase,
 | 
			
		||||
    IKubrowPetEggDatabase,
 | 
			
		||||
    IKubrowPetEggClient,
 | 
			
		||||
    ILibraryAvailableDailyTaskInfo,
 | 
			
		||||
    ILibraryDailyTaskInfo,
 | 
			
		||||
    ICalendarProgress,
 | 
			
		||||
    IDroneClient,
 | 
			
		||||
    IUpgradeClient
 | 
			
		||||
@ -42,6 +42,7 @@ import {
 | 
			
		||||
    ExportBundles,
 | 
			
		||||
    ExportCustoms,
 | 
			
		||||
    ExportDrones,
 | 
			
		||||
    ExportEnemies,
 | 
			
		||||
    ExportFlavour,
 | 
			
		||||
    ExportFusionBundles,
 | 
			
		||||
    ExportGear,
 | 
			
		||||
@ -63,6 +64,8 @@ import { generateRewardSeed } from "@/src/controllers/api/getNewRewardSeedContro
 | 
			
		||||
import { addStartingGear } from "@/src/controllers/api/giveStartingGearController";
 | 
			
		||||
import { addQuestKey, completeQuest } from "@/src/services/questService";
 | 
			
		||||
import { handleBundleAcqusition } from "./purchaseService";
 | 
			
		||||
import libraryDailyTasks from "@/static/fixed_responses/libraryDailyTasks.json";
 | 
			
		||||
import { getRandomElement, getRandomInt } from "./rngService";
 | 
			
		||||
 | 
			
		||||
export const createInventory = async (
 | 
			
		||||
    accountOwnerId: Types.ObjectId,
 | 
			
		||||
@ -77,7 +80,7 @@ export const createInventory = async (
 | 
			
		||||
            ReceivedStartingGear: config.skipTutorial
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        inventory.LibraryAvailableDailyTaskInfo = createLibraryAvailableDailyTaskInfo();
 | 
			
		||||
        inventory.LibraryAvailableDailyTaskInfo = createLibraryDailyTask();
 | 
			
		||||
        inventory.CalendarProgress = createCalendar();
 | 
			
		||||
        inventory.RewardSeed = generateRewardSeed();
 | 
			
		||||
        inventory.DuviriInfo = {
 | 
			
		||||
@ -1193,15 +1196,19 @@ export const addKeyChainItems = async (
 | 
			
		||||
 | 
			
		||||
    return inventoryChanges;
 | 
			
		||||
};
 | 
			
		||||
const createLibraryAvailableDailyTaskInfo = (): ILibraryAvailableDailyTaskInfo => {
 | 
			
		||||
 | 
			
		||||
export const createLibraryDailyTask = (): ILibraryDailyTaskInfo => {
 | 
			
		||||
    const enemyTypes = getRandomElement(libraryDailyTasks);
 | 
			
		||||
    const enemyAvatar = ExportEnemies.avatars[enemyTypes[0]];
 | 
			
		||||
    const scansRequired = getRandomInt(2, 4);
 | 
			
		||||
    return {
 | 
			
		||||
        EnemyTypes: ["/Lotus/Types/Enemies/Orokin/RifleLancerAvatar"],
 | 
			
		||||
        EnemyLocTag: "/Lotus/Language/Game/CorruptedLancer",
 | 
			
		||||
        EnemyIcon: "/Lotus/Interface/Icons/Npcs/OrokinRifleLancerAvatar.png",
 | 
			
		||||
        ScansRequired: 3,
 | 
			
		||||
        RewardStoreItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/UncommonFusionBundle",
 | 
			
		||||
        RewardQuantity: 7,
 | 
			
		||||
        RewardStanding: 7500
 | 
			
		||||
        EnemyTypes: enemyTypes,
 | 
			
		||||
        EnemyLocTag: enemyAvatar.name,
 | 
			
		||||
        EnemyIcon: enemyAvatar.icon!,
 | 
			
		||||
        ScansRequired: scansRequired,
 | 
			
		||||
        RewardStoreItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/RareFusionBundle",
 | 
			
		||||
        RewardQuantity: Math.trunc(scansRequired * 2.5),
 | 
			
		||||
        RewardStanding: 2500 * scansRequired
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -185,6 +185,22 @@ export const addMissionInventoryUpdates = (
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
                break;
 | 
			
		||||
            case "LibraryScans":
 | 
			
		||||
                value.forEach(scan => {
 | 
			
		||||
                    if (inventory.LibraryActiveDailyTaskInfo) {
 | 
			
		||||
                        if (inventory.LibraryActiveDailyTaskInfo.EnemyTypes.find(x => x == scan.EnemyType)) {
 | 
			
		||||
                            inventory.LibraryActiveDailyTaskInfo.Scans ??= 0;
 | 
			
		||||
                            inventory.LibraryActiveDailyTaskInfo.Scans += scan.Count;
 | 
			
		||||
                        } else {
 | 
			
		||||
                            logger.warn(
 | 
			
		||||
                                `ignoring synthesis of ${scan.EnemyType} as it's not part of the active daily task`
 | 
			
		||||
                            );
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        logger.warn(`no library daily task active, ignoring synthesis of ${scan.EnemyType}`);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
                break;
 | 
			
		||||
            case "SyndicateId": {
 | 
			
		||||
                inventory.CompletedSyndicates.push(value);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
@ -320,7 +320,8 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
 | 
			
		||||
    LibraryPersonalTarget: string;
 | 
			
		||||
    LibraryPersonalProgress: ILibraryPersonalProgress[];
 | 
			
		||||
    CollectibleSeries: ICollectibleSery[];
 | 
			
		||||
    LibraryAvailableDailyTaskInfo: ILibraryAvailableDailyTaskInfo;
 | 
			
		||||
    LibraryAvailableDailyTaskInfo?: ILibraryDailyTaskInfo;
 | 
			
		||||
    LibraryActiveDailyTaskInfo?: ILibraryDailyTaskInfo;
 | 
			
		||||
    HasResetAccount: boolean;
 | 
			
		||||
    PendingCoupon?: IPendingCouponClient;
 | 
			
		||||
    Harvestable: boolean;
 | 
			
		||||
@ -658,10 +659,11 @@ export interface ILastSortieReward {
 | 
			
		||||
    Manifest: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ILibraryAvailableDailyTaskInfo {
 | 
			
		||||
export interface ILibraryDailyTaskInfo {
 | 
			
		||||
    EnemyTypes: string[];
 | 
			
		||||
    EnemyLocTag: string;
 | 
			
		||||
    EnemyIcon: string;
 | 
			
		||||
    Scans?: number;
 | 
			
		||||
    ScansRequired: number;
 | 
			
		||||
    RewardStoreItem: string;
 | 
			
		||||
    RewardQuantity: number;
 | 
			
		||||
 | 
			
		||||
@ -92,6 +92,12 @@ export type IMissionInventoryUpdateRequest = {
 | 
			
		||||
        IsFinalWave: boolean;
 | 
			
		||||
        Participants: IVoidTearParticipantInfo[];
 | 
			
		||||
    };
 | 
			
		||||
    LibraryScans?: {
 | 
			
		||||
        EnemyType: string;
 | 
			
		||||
        Count: number;
 | 
			
		||||
        CodexScanCount: number;
 | 
			
		||||
        Standing: number;
 | 
			
		||||
    }[];
 | 
			
		||||
} & {
 | 
			
		||||
    [K in TEquipmentKey]?: IEquipmentClient[];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										148
									
								
								static/fixed_responses/libraryDailyTasks.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								static/fixed_responses/libraryDailyTasks.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,148 @@
 | 
			
		||||
[
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/LaserCannonBipedAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/RailgunBipedAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/ShockwaveBipedAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/LaserDiscBipedAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/SuperMoaBipedAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Corpus/Spaceman/EliteSpacemanAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/RifleSpacemanAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/DeployableSpacemanAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/MeleeSpacemanAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/ShotgunSpacemanAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/SniperSpacemanAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/NullifySpacemanAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/BeastMasterAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/BladeSawmanAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/BlowtorchSawmanAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/PistonSawmanAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Desert/Avatars/BladeSawmanAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Forest/Avatars/BladeSawmanAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/BladeSawmanAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/RifleLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Desert/Avatars/EliteRifleLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Desert/Avatars/RifleLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Forest/Avatars/EliteRifleLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Forest/Avatars/RifleLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/EliteRifleLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/RifleLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/EliteRifleLancerAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/EviseratorLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Forest/Avatars/EvisceratorLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/EvisceratorLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Desert/Avatars/EvisceratorLancerAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/FemaleGrineerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/FemaleGrineerSniperAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/FlameLancerAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/GrineerMeleeStaffAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/HeavyFemaleGrineerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Desert/HeavyFemaleGrineerAvatarDesert",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Forest/HeavyFemaleGrineerAvatarDesert",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/FemaleGrineerHeavyAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/IncendiaryBombardAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/JetpackMarineAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Desert/Avatars/JetpackMarineAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Forest/Avatars/JetpackMarineAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/JetpackMarineAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/MacheteWomanAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/FemaleGrineerMacheteAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/ShieldLancerAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/ShotgunLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Desert/Avatars/ShotgunLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Forest/Avatars/ShotgunLancerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/ShotgunLancerAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/GrineerAvatars/GrineerMarinePistolAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Desert/Avatars/GrineerMarinePistolAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/Forest/Avatars/GrineerMarinePistolAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/GrineerMarinePistolAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Ancients/AncientAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Ancients/HealingAncientAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Ancients/ToxicAncientAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Ancients/DiseasedAncientAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Ancients/SpawningAncientAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/CrawlerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/NoxiousCrawlerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/GraspingCrawlerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/GrenadeAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/LightningAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/InfestedMoas/NaniteCloudBipedAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/InfestedMoas/SlowBombBipedAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Quadrupeds/QuadrupedAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Runners/LeapingRunnerAvatar",
 | 
			
		||||
        "/Lotus/Types/Enemies/Infested/AiWeek/Runners/RunnerAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Orokin/OrokinBladeSawmanAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Orokin/OrokinHealingAncientAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Orokin/OrokinHeavyFemaleAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Orokin/OrokinNullifySpacemanAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Orokin/OrokinRocketBombardAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Orokin/RifleLancerAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Orokin/RifleSpacemanAvatar"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
        "/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/RocketBombardAvatar"
 | 
			
		||||
    ]
 | 
			
		||||
]
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user