返回提交历史
Added
src/controllers/api/abandonLibraryDailyTaskController.ts
+11
-0
Added
src/controllers/api/claimLibraryDailyTaskRewardController.ts
+31
-0
Modified
src/controllers/api/inventoryController.ts
+4
-1
Added
src/controllers/api/startLibraryDailyTaskController.ts
+11
-0
Modified
src/models/inventoryModels/inventoryModel.ts
+5
-3
Modified
src/routes/api.ts
+6
-0
Modified
src/services/inventoryService.ts
+17
-10
Modified
src/services/missionInventoryUpdateService.ts
+16
-0
Modified
src/types/inventoryTypes/inventoryTypes.ts
+4
-2
Modified
src/types/requestTypes.ts
+6
-0
Added
static/fixed_responses/libraryDailyTasks.json
+148
-0
XFEstudio/XFESpaceNinjaServer
feat: daily synthesis (#1014)
Closes #386 Closes #533 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1014 Co-authored-by: Sainan <sainan@calamity.inc> Co-committed-by: Sainan <sainan@calamity.inc>
28a36052
代码差异
11 个文件
+259
-16
@@ -0,0 +1,11 @@
1
import { getInventory } from "@/src/services/inventoryService";
2
import { getAccountIdForRequest } from "@/src/services/loginService";
3
import { RequestHandler } from "express";
4
5
export const abandonLibraryDailyTaskController: RequestHandler = async (req, res) => {
6
const accountId = await getAccountIdForRequest(req);
7
const inventory = await getInventory(accountId);
8
inventory.LibraryActiveDailyTaskInfo = undefined;
9
await inventory.save();
10
res.status(200).end();
11
};
@@ -0,0 +1,31 @@
1
import { getInventory } from "@/src/services/inventoryService";
2
import { getAccountIdForRequest } from "@/src/services/loginService";
3
import { RequestHandler } from "express";
4
5
export const claimLibraryDailyTaskRewardController: RequestHandler = async (req, res) => {
6
const accountId = await getAccountIdForRequest(req);
7
const inventory = await getInventory(accountId);
8
9
const rewardQuantity = inventory.LibraryActiveDailyTaskInfo!.RewardQuantity;
10
const rewardStanding = inventory.LibraryActiveDailyTaskInfo!.RewardStanding;
11
inventory.LibraryActiveDailyTaskInfo = undefined;
12
inventory.LibraryAvailableDailyTaskInfo = undefined;
13
14
let syndicate = inventory.Affiliations.find(x => x.Tag == "LibrarySyndicate");
15
if (!syndicate) {
16
syndicate = inventory.Affiliations[inventory.Affiliations.push({ Tag: "LibrarySyndicate", Standing: 0 }) - 1];
17
}
18
syndicate.Standing += rewardStanding;
19
20
inventory.FusionPoints += 80 * rewardQuantity;
21
await inventory.save();
22
23
res.json({
24
RewardItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/RareFusionBundle",
25
RewardQuantity: rewardQuantity,
26
StandingAwarded: rewardStanding,
27
InventoryChanges: {
28
FusionPoints: 80 * rewardQuantity
29
}
30
});
31
};
@@ -14,7 +14,7 @@ import {
14
14
ExportVirtuals
15
15
} from "warframe-public-export-plus";
16
16
import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "./infestedFoundryController";
17
import { allDailyAffiliationKeys } from "@/src/services/inventoryService";
17
import { allDailyAffiliationKeys, createLibraryDailyTask } from "@/src/services/inventoryService";
18
18
19
19
export const inventoryController: RequestHandler = async (request, response) => {
20
20
const account = await getAccountForRequest(request);
@@ -36,6 +36,9 @@ export const inventoryController: RequestHandler = async (request, response) =>
36
36
inventory[key] = 16000 + inventory.PlayerLevel * 500;
37
37
}
38
38
inventory.DailyFocus = 250000 + inventory.PlayerLevel * 5000;
39
40
inventory.LibraryAvailableDailyTaskInfo = createLibraryDailyTask();
41
39
42
await inventory.save();
40
43
}
41
44
@@ -0,0 +1,11 @@
1
import { getInventory } from "@/src/services/inventoryService";
2
import { getAccountIdForRequest } from "@/src/services/loginService";
3
import { RequestHandler } from "express";
4
5
export const startLibraryDailyTaskController: RequestHandler = async (req, res) => {
6
const accountId = await getAccountIdForRequest(req);
7
const inventory = await getInventory(accountId);
8
inventory.LibraryActiveDailyTaskInfo = inventory.LibraryAvailableDailyTaskInfo;
9
await inventory.save();
10
res.json(inventory.LibraryAvailableDailyTaskInfo);
11
};
@@ -68,7 +68,7 @@ import {
68
68
ICalendarProgress,
69
69
IPendingCouponDatabase,
70
70
IPendingCouponClient,
71
ILibraryAvailableDailyTaskInfo,
71
ILibraryDailyTaskInfo,
72
72
IDroneDatabase,
73
73
IDroneClient
74
74
} from "../../types/inventoryTypes/inventoryTypes";
@@ -950,11 +950,12 @@ pendingCouponSchema.set("toJSON", {
950
950
}
951
951
});
952
952
953
const libraryAvailableDailyTaskInfoSchema = new Schema<ILibraryAvailableDailyTaskInfo>(
953
const libraryDailyTaskInfoSchema = new Schema<ILibraryDailyTaskInfo>(
954
954
{
955
955
EnemyTypes: [String],
956
956
EnemyLocTag: String,
957
957
EnemyIcon: String,
958
Scans: Number,
958
959
ScansRequired: Number,
959
960
RewardStoreItem: String,
960
961
RewardQuantity: Number,
@@ -1209,7 +1210,8 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
1209
1210
//Cephalon Simaris Entries Example:"TargetType"+"Scans"(1-10)+"Completed": true|false
1210
1211
LibraryPersonalProgress: [Schema.Types.Mixed],
1211
1212
//Cephalon Simaris Daily Task
1212
LibraryAvailableDailyTaskInfo: libraryAvailableDailyTaskInfoSchema,
1213
LibraryAvailableDailyTaskInfo: libraryDailyTaskInfoSchema,
1214
LibraryActiveDailyTaskInfo: libraryDailyTaskInfoSchema,
1213
1215
1214
1216
//https://warframe.fandom.com/wiki/Invasion
1215
1217
InvasionChainProgress: [Schema.Types.Mixed],
@@ -1,4 +1,5 @@
1
1
import express from "express";
2
import { abandonLibraryDailyTaskController } from "@/src/controllers/api/abandonLibraryDailyTaskController";
2
3
import { activateRandomModController } from "@/src/controllers/api/activateRandomModController";
3
4
import { addFriendImageController } from "@/src/controllers/api/addFriendImageController";
4
5
import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController";
@@ -7,6 +8,7 @@ import { artifactsController } from "@/src/controllers/api/artifactsController";
7
8
import { changeDojoRootController } from "@/src/controllers/api/changeDojoRootController";
8
9
import { checkDailyMissionBonusController } from "@/src/controllers/api/checkDailyMissionBonusController";
9
10
import { claimCompletedRecipeController } from "@/src/controllers/api/claimCompletedRecipeController";
11
import { claimLibraryDailyTaskRewardController } from "@/src/controllers/api/claimLibraryDailyTaskRewardController";
10
12
import { clearDialogueHistoryController } from "@/src/controllers/api/clearDialogueHistoryController";
11
13
import { completeRandomModChallengeController } from "@/src/controllers/api/completeRandomModChallengeController";
12
14
import { createGuildController } from "@/src/controllers/api/createGuildController";
@@ -75,6 +77,7 @@ import { setSupportedSyndicateController } from "@/src/controllers/api/setSuppor
75
77
import { setWeaponSkillTreeController } from "@/src/controllers/api/setWeaponSkillTreeController";
76
78
import { shipDecorationsController } from "@/src/controllers/api/shipDecorationsController";
77
79
import { startDojoRecipeController } from "@/src/controllers/api/startDojoRecipeController";
80
import { startLibraryDailyTaskController } from "@/src/controllers/api/startLibraryDailyTaskController";
78
81
import { startLibraryPersonalTargetController } from "@/src/controllers/api/startLibraryPersonalTargetController";
79
82
import { startRecipeController } from "@/src/controllers/api/startRecipeController";
80
83
import { stepSequencersController } from "@/src/controllers/api/stepSequencersController";
@@ -93,7 +96,9 @@ import { upgradesController } from "@/src/controllers/api/upgradesController";
93
96
const apiRouter = express.Router();
94
97
95
98
// get
99
apiRouter.get("/abandonLibraryDailyTask.php", abandonLibraryDailyTaskController);
96
100
apiRouter.get("/checkDailyMissionBonus.php", checkDailyMissionBonusController);
101
apiRouter.get("/claimLibraryDailyTaskReward.php", claimLibraryDailyTaskRewardController);
97
102
apiRouter.get("/credits.php", creditsController);
98
103
apiRouter.get("/deleteSession.php", deleteSessionController);
99
104
apiRouter.get("/dojo", dojoController);
@@ -121,6 +126,7 @@ apiRouter.get("/setActiveQuest.php", setActiveQuestController);
121
126
apiRouter.get("/setActiveShip.php", setActiveShipController);
122
127
apiRouter.get("/setBootLocation.php", setBootLocationController);
123
128
apiRouter.get("/setSupportedSyndicate.php", setSupportedSyndicateController);
129
apiRouter.get("/startLibraryDailyTask.php", startLibraryDailyTaskController);
124
130
apiRouter.get("/startLibraryPersonalTarget.php", startLibraryPersonalTargetController);
125
131
apiRouter.get("/surveys.php", surveysController);
126
132
apiRouter.get("/updateSession.php", updateSessionGetController);
@@ -23,7 +23,7 @@ import {
23
23
IInventoryDatabase,
24
24
IKubrowPetEggDatabase,
25
25
IKubrowPetEggClient,
26
ILibraryAvailableDailyTaskInfo,
26
ILibraryDailyTaskInfo,
27
27
ICalendarProgress,
28
28
IDroneClient,
29
29
IUpgradeClient
@@ -42,6 +42,7 @@ import {
42
42
ExportBundles,
43
43
ExportCustoms,
44
44
ExportDrones,
45
ExportEnemies,
45
46
ExportFlavour,
46
47
ExportFusionBundles,
47
48
ExportGear,
@@ -63,6 +64,8 @@ import { generateRewardSeed } from "@/src/controllers/api/getNewRewardSeedContro
63
64
import { addStartingGear } from "@/src/controllers/api/giveStartingGearController";
64
65
import { addQuestKey, completeQuest } from "@/src/services/questService";
65
66
import { handleBundleAcqusition } from "./purchaseService";
67
import libraryDailyTasks from "@/static/fixed_responses/libraryDailyTasks.json";
68
import { getRandomElement, getRandomInt } from "./rngService";
66
69
67
70
export const createInventory = async (
68
71
accountOwnerId: Types.ObjectId,
@@ -77,7 +80,7 @@ export const createInventory = async (
77
80
ReceivedStartingGear: config.skipTutorial
78
81
});
79
82
80
inventory.LibraryAvailableDailyTaskInfo = createLibraryAvailableDailyTaskInfo();
83
inventory.LibraryAvailableDailyTaskInfo = createLibraryDailyTask();
81
84
inventory.CalendarProgress = createCalendar();
82
85
inventory.RewardSeed = generateRewardSeed();
83
86
inventory.DuviriInfo = {
@@ -1193,15 +1196,19 @@ export const addKeyChainItems = async (
1193
1196
1194
1197
return inventoryChanges;
1195
1198
};
1196
const createLibraryAvailableDailyTaskInfo = (): ILibraryAvailableDailyTaskInfo => {
1199
1200
export const createLibraryDailyTask = (): ILibraryDailyTaskInfo => {
1201
const enemyTypes = getRandomElement(libraryDailyTasks);
1202
const enemyAvatar = ExportEnemies.avatars[enemyTypes[0]];
1203
const scansRequired = getRandomInt(2, 4);
1197
1204
return {
1198
EnemyTypes: ["/Lotus/Types/Enemies/Orokin/RifleLancerAvatar"],
1199
EnemyLocTag: "/Lotus/Language/Game/CorruptedLancer",
1200
EnemyIcon: "/Lotus/Interface/Icons/Npcs/OrokinRifleLancerAvatar.png",
1201
ScansRequired: 3,
1202
RewardStoreItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/UncommonFusionBundle",
1203
RewardQuantity: 7,
1204
RewardStanding: 7500
1205
EnemyTypes: enemyTypes,
1206
EnemyLocTag: enemyAvatar.name,
1207
EnemyIcon: enemyAvatar.icon!,
1208
ScansRequired: scansRequired,
1209
RewardStoreItem: "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/RareFusionBundle",
1210
RewardQuantity: Math.trunc(scansRequired * 2.5),
1211
RewardStanding: 2500 * scansRequired
1205
1212
};
1206
1213
};
1207
1214
@@ -185,6 +185,22 @@ export const addMissionInventoryUpdates = (
185
185
}
186
186
});
187
187
break;
188
case "LibraryScans":
189
value.forEach(scan => {
190
if (inventory.LibraryActiveDailyTaskInfo) {
191
if (inventory.LibraryActiveDailyTaskInfo.EnemyTypes.find(x => x == scan.EnemyType)) {
192
inventory.LibraryActiveDailyTaskInfo.Scans ??= 0;
193
inventory.LibraryActiveDailyTaskInfo.Scans += scan.Count;
194
} else {
195
logger.warn(
196
`ignoring synthesis of ${scan.EnemyType} as it's not part of the active daily task`
197
);
198
}
199
} else {
200
logger.warn(`no library daily task active, ignoring synthesis of ${scan.EnemyType}`);
201
}
202
});
203
break;
188
204
case "SyndicateId": {
189
205
inventory.CompletedSyndicates.push(value);
190
206
break;
@@ -320,7 +320,8 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
320
320
LibraryPersonalTarget: string;
321
321
LibraryPersonalProgress: ILibraryPersonalProgress[];
322
322
CollectibleSeries: ICollectibleSery[];
323
LibraryAvailableDailyTaskInfo: ILibraryAvailableDailyTaskInfo;
323
LibraryAvailableDailyTaskInfo?: ILibraryDailyTaskInfo;
324
LibraryActiveDailyTaskInfo?: ILibraryDailyTaskInfo;
324
325
HasResetAccount: boolean;
325
326
PendingCoupon?: IPendingCouponClient;
326
327
Harvestable: boolean;
@@ -658,10 +659,11 @@ export interface ILastSortieReward {
658
659
Manifest: string;
659
660
}
660
661
661
export interface ILibraryAvailableDailyTaskInfo {
662
export interface ILibraryDailyTaskInfo {
662
663
EnemyTypes: string[];
663
664
EnemyLocTag: string;
664
665
EnemyIcon: string;
666
Scans?: number;
665
667
ScansRequired: number;
666
668
RewardStoreItem: string;
667
669
RewardQuantity: number;
@@ -92,6 +92,12 @@ export type IMissionInventoryUpdateRequest = {
92
92
IsFinalWave: boolean;
93
93
Participants: IVoidTearParticipantInfo[];
94
94
};
95
LibraryScans?: {
96
EnemyType: string;
97
Count: number;
98
CodexScanCount: number;
99
Standing: number;
100
}[];
95
101
} & {
96
102
[K in TEquipmentKey]?: IEquipmentClient[];
97
103
};
@@ -0,0 +1,148 @@
1
[
2
[
3
"/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/LaserCannonBipedAvatar",
4
"/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/RailgunBipedAvatar",
5
"/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/ShockwaveBipedAvatar"
6
],
7
[
8
"/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/LaserDiscBipedAvatar"
9
],
10
[
11
"/Lotus/Types/Enemies/Corpus/BipedRobot/AIWeek/SuperMoaBipedAvatar"
12
],
13
[
14
"/Lotus/Types/Enemies/Corpus/Spaceman/EliteSpacemanAvatar",
15
"/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/RifleSpacemanAvatar",
16
"/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/DeployableSpacemanAvatar",
17
"/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/MeleeSpacemanAvatar",
18
"/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/ShotgunSpacemanAvatar",
19
"/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/SniperSpacemanAvatar"
20
],
21
[
22
"/Lotus/Types/Enemies/Corpus/Spaceman/AIWeek/NullifySpacemanAvatar"
23
],
24
[
25
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/BeastMasterAvatar"
26
],
27
[
28
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/BladeSawmanAvatar",
29
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/BlowtorchSawmanAvatar",
30
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/PistonSawmanAvatar",
31
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/BladeSawmanAvatar",
32
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/BladeSawmanAvatar",
33
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/BladeSawmanAvatar"
34
],
35
[
36
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/RifleLancerAvatar",
37
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/EliteRifleLancerAvatar",
38
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/RifleLancerAvatar",
39
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/EliteRifleLancerAvatar",
40
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/RifleLancerAvatar",
41
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/EliteRifleLancerAvatar",
42
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/RifleLancerAvatar",
43
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/EliteRifleLancerAvatar"
44
],
45
[
46
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/EviseratorLancerAvatar",
47
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/EvisceratorLancerAvatar",
48
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/EvisceratorLancerAvatar",
49
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/EvisceratorLancerAvatar"
50
],
51
[
52
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/FemaleGrineerAvatar",
53
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/FemaleGrineerSniperAvatar"
54
],
55
[
56
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/FlameLancerAvatar"
57
],
58
[
59
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/GrineerMeleeStaffAvatar"
60
],
61
[
62
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/HeavyFemaleGrineerAvatar",
63
"/Lotus/Types/Enemies/Grineer/Desert/HeavyFemaleGrineerAvatarDesert",
64
"/Lotus/Types/Enemies/Grineer/Forest/HeavyFemaleGrineerAvatarDesert",
65
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/FemaleGrineerHeavyAvatar"
66
],
67
[
68
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/IncendiaryBombardAvatar"
69
],
70
[
71
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/JetpackMarineAvatar",
72
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/JetpackMarineAvatar",
73
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/JetpackMarineAvatar",
74
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/JetpackMarineAvatar"
75
],
76
[
77
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/MacheteWomanAvatar",
78
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/FemaleGrineerMacheteAvatar"
79
],
80
[
81
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/ShieldLancerAvatar"
82
],
83
[
84
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/ShotgunLancerAvatar",
85
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/ShotgunLancerAvatar",
86
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/ShotgunLancerAvatar",
87
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/ShotgunLancerAvatar"
88
],
89
[
90
"/Lotus/Types/Enemies/Grineer/GrineerAvatars/GrineerMarinePistolAvatar",
91
"/Lotus/Types/Enemies/Grineer/Desert/Avatars/GrineerMarinePistolAvatar",
92
"/Lotus/Types/Enemies/Grineer/Forest/Avatars/GrineerMarinePistolAvatar",
93
"/Lotus/Types/Enemies/Grineer/SeaLab/Avatars/GrineerMarinePistolAvatar"
94
],
95
[
96
"/Lotus/Types/Enemies/Infested/AiWeek/Ancients/AncientAvatar",
97
"/Lotus/Types/Enemies/Infested/AiWeek/Ancients/HealingAncientAvatar",
98
"/Lotus/Types/Enemies/Infested/AiWeek/Ancients/ToxicAncientAvatar"
99
],
100
[
101
"/Lotus/Types/Enemies/Infested/AiWeek/Ancients/DiseasedAncientAvatar"
102
],
103
[
104
"/Lotus/Types/Enemies/Infested/AiWeek/Ancients/SpawningAncientAvatar"
105
],
106
[
107
"/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/CrawlerAvatar",
108
"/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/NoxiousCrawlerAvatar",
109
"/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/GraspingCrawlerAvatar",
110
"/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/GrenadeAvatar",
111
"/Lotus/Types/Enemies/Infested/AiWeek/Crawlers/LightningAvatar"
112
],
113
[
114
"/Lotus/Types/Enemies/Infested/AiWeek/InfestedMoas/NaniteCloudBipedAvatar",
115
"/Lotus/Types/Enemies/Infested/AiWeek/InfestedMoas/SlowBombBipedAvatar"
116
],
117
[
118
"/Lotus/Types/Enemies/Infested/AiWeek/Quadrupeds/QuadrupedAvatar"
119
],
120
[
121
"/Lotus/Types/Enemies/Infested/AiWeek/Runners/LeapingRunnerAvatar",
122
"/Lotus/Types/Enemies/Infested/AiWeek/Runners/RunnerAvatar"
123
],
124
[
125
"/Lotus/Types/Enemies/Orokin/OrokinBladeSawmanAvatar"
126
],
127
[
128
"/Lotus/Types/Enemies/Orokin/OrokinHealingAncientAvatar"
129
],
130
[
131
"/Lotus/Types/Enemies/Orokin/OrokinHeavyFemaleAvatar"
132
],
133
[
134
"/Lotus/Types/Enemies/Orokin/OrokinNullifySpacemanAvatar"
135
],
136
[
137
"/Lotus/Types/Enemies/Orokin/OrokinRocketBombardAvatar"
138
],
139
[
140
"/Lotus/Types/Enemies/Orokin/RifleLancerAvatar"
141
],
142
[
143
"/Lotus/Types/Enemies/Orokin/RifleSpacemanAvatar"
144
],
145
[
146
"/Lotus/Types/Enemies/Grineer/AIWeek/Avatars/RocketBombardAvatar"
147
]
148
]