Compare commits
8 Commits
2b40e30a9d
...
f72c1482b3
Author | SHA1 | Date | |
---|---|---|---|
f72c1482b3 | |||
40acb3b03f | |||
9e94083875 | |||
db0e0d80dd | |||
5cda2e2d08 | |||
e23d865044 | |||
c7658b5b20 | |||
9993500eca |
@ -133,7 +133,14 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
|
|||||||
if (recipe.secretIngredientAction != "SIA_UNBRAND") {
|
if (recipe.secretIngredientAction != "SIA_UNBRAND") {
|
||||||
InventoryChanges = {
|
InventoryChanges = {
|
||||||
...InventoryChanges,
|
...InventoryChanges,
|
||||||
...(await addItem(inventory, recipe.resultType, recipe.num, false))
|
...(await addItem(
|
||||||
|
inventory,
|
||||||
|
recipe.resultType,
|
||||||
|
recipe.num,
|
||||||
|
false,
|
||||||
|
undefined,
|
||||||
|
pendingRecipe.TargetFingerprint
|
||||||
|
))
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
|
@ -3,6 +3,7 @@ import {
|
|||||||
encodeNemesisGuess,
|
encodeNemesisGuess,
|
||||||
getInfNodes,
|
getInfNodes,
|
||||||
getNemesisPasscode,
|
getNemesisPasscode,
|
||||||
|
getWeaponsForManifest,
|
||||||
IKnifeResponse
|
IKnifeResponse
|
||||||
} from "@/src/helpers/nemesisHelpers";
|
} from "@/src/helpers/nemesisHelpers";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||||
@ -170,18 +171,7 @@ export const nemesisController: RequestHandler = async (req, res) => {
|
|||||||
|
|
||||||
let weaponIdx = -1;
|
let weaponIdx = -1;
|
||||||
if (body.target.Faction != "FC_INFESTATION") {
|
if (body.target.Faction != "FC_INFESTATION") {
|
||||||
let weapons: readonly string[];
|
const weapons = getWeaponsForManifest(body.target.manifest);
|
||||||
if (body.target.manifest == "/Lotus/Types/Game/Nemesis/KuvaLich/KuvaLichManifestVersionSix") {
|
|
||||||
weapons = kuvaLichVersionSixWeapons;
|
|
||||||
} else if (
|
|
||||||
body.target.manifest == "/Lotus/Types/Enemies/Corpus/Lawyers/LawyerManifestVersionFour" ||
|
|
||||||
body.target.manifest == "/Lotus/Types/Enemies/Corpus/Lawyers/LawyerManifestVersionThree"
|
|
||||||
) {
|
|
||||||
weapons = corpusVersionThreeWeapons;
|
|
||||||
} else {
|
|
||||||
throw new Error(`unknown nemesis manifest: ${body.target.manifest}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const initialWeaponIdx = new SRng(body.target.fp).randomInt(0, weapons.length - 1);
|
const initialWeaponIdx = new SRng(body.target.fp).randomInt(0, weapons.length - 1);
|
||||||
weaponIdx = initialWeaponIdx;
|
weaponIdx = initialWeaponIdx;
|
||||||
do {
|
do {
|
||||||
@ -283,39 +273,3 @@ interface INemesisRequiemRequest {
|
|||||||
HiddenWhenHolstered: boolean;
|
HiddenWhenHolstered: boolean;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const kuvaLichVersionSixWeapons = [
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Drakgoon/KuvaDrakgoon",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Karak/KuvaKarak",
|
|
||||||
"/Lotus/Weapons/Grineer/Melee/GrnKuvaLichScythe/GrnKuvaLichScytheWeapon",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Kohm/KuvaKohm",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Ogris/KuvaOgris",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Quartakk/KuvaQuartakk",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Tonkor/KuvaTonkor",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/Secondaries/Brakk/KuvaBrakk",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/Secondaries/Kraken/KuvaKraken",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/Secondaries/Seer/KuvaSeer",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/Secondaries/Stubba/KuvaStubba",
|
|
||||||
"/Lotus/Weapons/Grineer/HeavyWeapons/GrnHeavyGrenadeLauncher",
|
|
||||||
"/Lotus/Weapons/Grineer/LongGuns/GrnKuvaLichRifle/GrnKuvaLichRifleWeapon",
|
|
||||||
"/Lotus/Weapons/Grineer/Bows/GrnBow/GrnBowWeapon",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Hind/KuvaHind",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/Secondaries/Nukor/KuvaNukor",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Hek/KuvaHekWeapon",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Zarr/KuvaZarr",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/HeavyWeapons/Grattler/KuvaGrattler",
|
|
||||||
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Sobek/KuvaSobek"
|
|
||||||
];
|
|
||||||
|
|
||||||
const corpusVersionThreeWeapons = [
|
|
||||||
"/Lotus/Weapons/Corpus/LongGuns/CrpBriefcaseLauncher/CrpBriefcaseLauncher",
|
|
||||||
"/Lotus/Weapons/Corpus/BoardExec/Primary/CrpBEArcaPlasmor/CrpBEArcaPlasmor",
|
|
||||||
"/Lotus/Weapons/Corpus/BoardExec/Primary/CrpBEFluxRifle/CrpBEFluxRifle",
|
|
||||||
"/Lotus/Weapons/Corpus/BoardExec/Primary/CrpBETetra/CrpBETetra",
|
|
||||||
"/Lotus/Weapons/Corpus/BoardExec/Secondary/CrpBECycron/CrpBECycron",
|
|
||||||
"/Lotus/Weapons/Corpus/BoardExec/Secondary/CrpBEDetron/CrpBEDetron",
|
|
||||||
"/Lotus/Weapons/Corpus/Pistols/CrpIgniterPistol/CrpIgniterPistol",
|
|
||||||
"/Lotus/Weapons/Corpus/Pistols/CrpBriefcaseAkimbo/CrpBriefcaseAkimboPistol",
|
|
||||||
"/Lotus/Weapons/Corpus/BoardExec/Secondary/CrpBEPlinx/CrpBEPlinxWeapon",
|
|
||||||
"/Lotus/Weapons/Corpus/BoardExec/Primary/CrpBEGlaxion/CrpBEGlaxion"
|
|
||||||
];
|
|
||||||
|
@ -27,7 +27,15 @@ const viewController: RequestHandler = async (req, res) => {
|
|||||||
for (const type of Object.keys(ExportEnemies.avatars)) {
|
for (const type of Object.keys(ExportEnemies.avatars)) {
|
||||||
if (!scans.has(type)) scans.add(type);
|
if (!scans.has(type)) scans.add(type);
|
||||||
}
|
}
|
||||||
responseJson.Scans ??= [];
|
|
||||||
|
// Take any existing scans and also set them to 9999
|
||||||
|
if (responseJson.Scans) {
|
||||||
|
for (const scan of responseJson.Scans) {
|
||||||
|
scans.add(scan.type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
responseJson.Scans = [];
|
||||||
|
|
||||||
for (const type of scans) {
|
for (const type of scans) {
|
||||||
responseJson.Scans.push({ type: type, scans: 9999 });
|
responseJson.Scans.push({ type: type, scans: 9999 });
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { ExportRegions } from "warframe-public-export-plus";
|
import { ExportRegions, ExportWarframes } from "warframe-public-export-plus";
|
||||||
import { IInfNode } from "@/src/types/inventoryTypes/inventoryTypes";
|
import { IInfNode } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||||
import { SRng } from "@/src/services/rngService";
|
import { SRng } from "@/src/services/rngService";
|
||||||
import { TInventoryDatabaseDocument } from "../models/inventoryModels/inventoryModel";
|
import { TInventoryDatabaseDocument } from "../models/inventoryModels/inventoryModel";
|
||||||
@ -129,3 +129,147 @@ export const consumeModCharge = (
|
|||||||
response.UpgradeNew.push(true);
|
response.UpgradeNew.push(true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const kuvaLichVersionSixWeapons = [
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Drakgoon/KuvaDrakgoon",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Karak/KuvaKarak",
|
||||||
|
"/Lotus/Weapons/Grineer/Melee/GrnKuvaLichScythe/GrnKuvaLichScytheWeapon",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Kohm/KuvaKohm",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Ogris/KuvaOgris",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Quartakk/KuvaQuartakk",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Tonkor/KuvaTonkor",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/Secondaries/Brakk/KuvaBrakk",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/Secondaries/Kraken/KuvaKraken",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/Secondaries/Seer/KuvaSeer",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/Secondaries/Stubba/KuvaStubba",
|
||||||
|
"/Lotus/Weapons/Grineer/HeavyWeapons/GrnHeavyGrenadeLauncher",
|
||||||
|
"/Lotus/Weapons/Grineer/LongGuns/GrnKuvaLichRifle/GrnKuvaLichRifleWeapon",
|
||||||
|
"/Lotus/Weapons/Grineer/Bows/GrnBow/GrnBowWeapon",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Hind/KuvaHind",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/Secondaries/Nukor/KuvaNukor",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Hek/KuvaHekWeapon",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Zarr/KuvaZarr",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/HeavyWeapons/Grattler/KuvaGrattler",
|
||||||
|
"/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Sobek/KuvaSobek"
|
||||||
|
];
|
||||||
|
|
||||||
|
const corpusVersionThreeWeapons = [
|
||||||
|
"/Lotus/Weapons/Corpus/LongGuns/CrpBriefcaseLauncher/CrpBriefcaseLauncher",
|
||||||
|
"/Lotus/Weapons/Corpus/BoardExec/Primary/CrpBEArcaPlasmor/CrpBEArcaPlasmor",
|
||||||
|
"/Lotus/Weapons/Corpus/BoardExec/Primary/CrpBEFluxRifle/CrpBEFluxRifle",
|
||||||
|
"/Lotus/Weapons/Corpus/BoardExec/Primary/CrpBETetra/CrpBETetra",
|
||||||
|
"/Lotus/Weapons/Corpus/BoardExec/Secondary/CrpBECycron/CrpBECycron",
|
||||||
|
"/Lotus/Weapons/Corpus/BoardExec/Secondary/CrpBEDetron/CrpBEDetron",
|
||||||
|
"/Lotus/Weapons/Corpus/Pistols/CrpIgniterPistol/CrpIgniterPistol",
|
||||||
|
"/Lotus/Weapons/Corpus/Pistols/CrpBriefcaseAkimbo/CrpBriefcaseAkimboPistol",
|
||||||
|
"/Lotus/Weapons/Corpus/BoardExec/Secondary/CrpBEPlinx/CrpBEPlinxWeapon",
|
||||||
|
"/Lotus/Weapons/Corpus/BoardExec/Primary/CrpBEGlaxion/CrpBEGlaxion"
|
||||||
|
];
|
||||||
|
|
||||||
|
export const getWeaponsForManifest = (manifest: string): readonly string[] => {
|
||||||
|
switch (manifest) {
|
||||||
|
case "/Lotus/Types/Game/Nemesis/KuvaLich/KuvaLichManifestVersionSix":
|
||||||
|
return kuvaLichVersionSixWeapons;
|
||||||
|
case "/Lotus/Types/Enemies/Corpus/Lawyers/LawyerManifestVersionThree":
|
||||||
|
case "/Lotus/Types/Enemies/Corpus/Lawyers/LawyerManifestVersionFour":
|
||||||
|
return corpusVersionThreeWeapons;
|
||||||
|
}
|
||||||
|
throw new Error(`unknown nemesis manifest: ${manifest}`);
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: This sucks.
|
||||||
|
export const getInnateDamageTag = (
|
||||||
|
KillingSuit: string
|
||||||
|
):
|
||||||
|
| "InnateElectricityDamage"
|
||||||
|
| "InnateFreezeDamage"
|
||||||
|
| "InnateHeatDamage"
|
||||||
|
| "InnateImpactDamage"
|
||||||
|
| "InnateMagDamage"
|
||||||
|
| "InnateRadDamage"
|
||||||
|
| "InnateToxinDamage" => {
|
||||||
|
const baseSuitType = ExportWarframes[KillingSuit].parentName;
|
||||||
|
switch (baseSuitType) {
|
||||||
|
case "/Lotus/Powersuits/Volt/VoltBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Excalibur/ExcaliburBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/AntiMatter/NovaBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Banshee/BansheeBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Berserker/BerserkerBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Magician/MagicianBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Sentient/SentientBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Gyre/GyreBaseSuit":
|
||||||
|
return "InnateElectricityDamage";
|
||||||
|
case "/Lotus/Powersuits/Ember/EmberBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Dragon/DragonBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Nezha/NezhaBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Sandman/SandmanBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Trapper/TrapperBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Wisp/WispBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Odalisk/OdaliskBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/PaxDuviricus/PaxDuviricusBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Choir/ChoirBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Temple/TempleBaseSuit":
|
||||||
|
return "InnateHeatDamage";
|
||||||
|
case "/Lotus/Powersuits/Frost/FrostBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Glass/GlassBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Fairy/FairyBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/IronFrame/IronFrameBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Revenant/RevenantBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Trinity/TrinityBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Hoplite/HopliteBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Koumei/KoumeiBaseSuit":
|
||||||
|
return "InnateFreezeDamage";
|
||||||
|
case "/Lotus/Powersuits/Saryn/SarynBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Paladin/PaladinBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Brawler/BrawlerBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Infestation/InfestationBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Necro/NecroBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Khora/KhoraBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Ranger/RangerBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Dagath/DagathBaseSuit":
|
||||||
|
return "InnateToxinDamage";
|
||||||
|
case "/Lotus/Powersuits/Mag/MagBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Pirate/PirateBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Cowgirl/CowgirlBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Priest/PriestBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/BrokenFrame/BrokenFrameBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Alchemist/AlchemistBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Yareli/YareliBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Geode/GeodeBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Frumentarius/FrumentariusBaseSuit":
|
||||||
|
return "InnateMagDamage";
|
||||||
|
case "/Lotus/Powersuits/Loki/LokiBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Ninja/NinjaBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Jade/JadeBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Bard/BardBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Harlequin/HarlequinBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Garuda/GarudaBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/YinYang/YinYangBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Werewolf/WerewolfBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/ConcreteFrame/ConcreteFrameBaseSuit":
|
||||||
|
return "InnateRadDamage";
|
||||||
|
case "/Lotus/Powersuits/Rhino/RhinoBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Tengu/TenguBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/MonkeyKing/MonkeyKingBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Runner/RunnerBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Pacifist/PacifistBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Devourer/DevourerBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Wraith/WraithBaseSuit":
|
||||||
|
case "/Lotus/Powersuits/Pagemaster/PagemasterBaseSuit":
|
||||||
|
return "InnateImpactDamage";
|
||||||
|
}
|
||||||
|
logger.warn(`unknown innate damage type for ${KillingSuit}, using heat as a fallback`);
|
||||||
|
return "InnateHeatDamage";
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: For -1399275245665749231n, the value should be 75306944, but we're off by 59 with 75307003.
|
||||||
|
export const getInnateDamageValue = (fp: bigint): number => {
|
||||||
|
const rng = new SRng(fp);
|
||||||
|
rng.randomFloat(); // used for the weapon index
|
||||||
|
const WeaponUpgradeValueAttenuationExponent = 2.25;
|
||||||
|
let value = Math.pow(rng.randomFloat(), WeaponUpgradeValueAttenuationExponent);
|
||||||
|
if (value >= 0.941428) {
|
||||||
|
value = 1;
|
||||||
|
}
|
||||||
|
return Math.trunc(value * 0x40000000);
|
||||||
|
};
|
||||||
|
@ -1039,6 +1039,8 @@ const pendingRecipeSchema = new Schema<IPendingRecipeDatabase>(
|
|||||||
{
|
{
|
||||||
ItemType: String,
|
ItemType: String,
|
||||||
CompletionDate: Date,
|
CompletionDate: Date,
|
||||||
|
TargetItemId: String,
|
||||||
|
TargetFingerprint: String,
|
||||||
LongGuns: { type: [EquipmentSchema], default: undefined },
|
LongGuns: { type: [EquipmentSchema], default: undefined },
|
||||||
Pistols: { type: [EquipmentSchema], default: undefined },
|
Pistols: { type: [EquipmentSchema], default: undefined },
|
||||||
Melee: { type: [EquipmentSchema], default: undefined },
|
Melee: { type: [EquipmentSchema], default: undefined },
|
||||||
@ -1260,11 +1262,11 @@ const nemesisSchema = new Schema<INemesisDatabase>(
|
|||||||
PrevOwners: Number,
|
PrevOwners: Number,
|
||||||
SecondInCommand: Boolean,
|
SecondInCommand: Boolean,
|
||||||
Weakened: Boolean,
|
Weakened: Boolean,
|
||||||
InfNodes: [infNodeSchema],
|
InfNodes: { type: [infNodeSchema], default: undefined },
|
||||||
HenchmenKilled: Number,
|
HenchmenKilled: Number,
|
||||||
HintProgress: Number,
|
HintProgress: Number,
|
||||||
Hints: [Number],
|
Hints: { type: [Number], default: undefined },
|
||||||
GuessHistory: [Number],
|
GuessHistory: { type: [Number], default: undefined },
|
||||||
MissionCount: Number,
|
MissionCount: Number,
|
||||||
LastEnc: Number
|
LastEnc: Number
|
||||||
},
|
},
|
||||||
@ -1609,7 +1611,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
|||||||
//CorpusLich or GrineerLich
|
//CorpusLich or GrineerLich
|
||||||
NemesisAbandonedRewards: { type: [String], default: [] },
|
NemesisAbandonedRewards: { type: [String], default: [] },
|
||||||
Nemesis: nemesisSchema,
|
Nemesis: nemesisSchema,
|
||||||
NemesisHistory: [Schema.Types.Mixed],
|
NemesisHistory: { type: [nemesisSchema], default: undefined },
|
||||||
LastNemesisAllySpawnTime: Schema.Types.Mixed,
|
LastNemesisAllySpawnTime: Schema.Types.Mixed,
|
||||||
|
|
||||||
//TradingRulesConfirmed,ShowFriendInvNotifications(Option->Social)
|
//TradingRulesConfirmed,ShowFriendInvNotifications(Option->Social)
|
||||||
|
@ -505,7 +505,7 @@ export const hasGuildPermissionEx = (
|
|||||||
|
|
||||||
export const removePigmentsFromGuildMembers = async (guildId: string | Types.ObjectId): Promise<void> => {
|
export const removePigmentsFromGuildMembers = async (guildId: string | Types.ObjectId): Promise<void> => {
|
||||||
const members = await GuildMember.find({ guildId, status: 0 }, "accountId");
|
const members = await GuildMember.find({ guildId, status: 0 }, "accountId");
|
||||||
for (const member of members) {
|
await parallelForeach(members, async member => {
|
||||||
const inventory = await getInventory(member.accountId.toString(), "MiscItems");
|
const inventory = await getInventory(member.accountId.toString(), "MiscItems");
|
||||||
const index = inventory.MiscItems.findIndex(
|
const index = inventory.MiscItems.findIndex(
|
||||||
x => x.ItemType == "/Lotus/Types/Items/Research/DojoColors/GenericDojoColorPigment"
|
x => x.ItemType == "/Lotus/Types/Items/Research/DojoColors/GenericDojoColorPigment"
|
||||||
@ -514,7 +514,7 @@ export const removePigmentsFromGuildMembers = async (guildId: string | Types.Obj
|
|||||||
inventory.MiscItems.splice(index, 1);
|
inventory.MiscItems.splice(index, 1);
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const processGuildTechProjectContributionsUpdate = async (
|
export const processGuildTechProjectContributionsUpdate = async (
|
||||||
|
@ -26,7 +26,9 @@ import {
|
|||||||
Status,
|
Status,
|
||||||
IKubrowPetDetailsDatabase,
|
IKubrowPetDetailsDatabase,
|
||||||
ITraits,
|
ITraits,
|
||||||
ICalendarProgress
|
ICalendarProgress,
|
||||||
|
INemesisWeaponTargetFingerprint,
|
||||||
|
INemesisPetTargetFingerprint
|
||||||
} from "@/src/types/inventoryTypes/inventoryTypes";
|
} from "@/src/types/inventoryTypes/inventoryTypes";
|
||||||
import { IGenericUpdate, IUpdateNodeIntrosResponse } from "../types/genericUpdate";
|
import { IGenericUpdate, IUpdateNodeIntrosResponse } from "../types/genericUpdate";
|
||||||
import { IKeyChainRequest, IMissionInventoryUpdateRequest } from "../types/requestTypes";
|
import { IKeyChainRequest, IMissionInventoryUpdateRequest } from "../types/requestTypes";
|
||||||
@ -79,6 +81,7 @@ import { getRandomElement, getRandomInt, getRandomWeightedReward, SRng } from ".
|
|||||||
import { createMessage } from "./inboxService";
|
import { createMessage } from "./inboxService";
|
||||||
import { getMaxStanding } from "@/src/helpers/syndicateStandingHelper";
|
import { getMaxStanding } from "@/src/helpers/syndicateStandingHelper";
|
||||||
import { getWorldState } from "./worldStateService";
|
import { getWorldState } from "./worldStateService";
|
||||||
|
import { getInnateDamageTag, getInnateDamageValue } from "../helpers/nemesisHelpers";
|
||||||
|
|
||||||
export const createInventory = async (
|
export const createInventory = async (
|
||||||
accountOwnerId: Types.ObjectId,
|
accountOwnerId: Types.ObjectId,
|
||||||
@ -327,7 +330,8 @@ export const addItem = async (
|
|||||||
typeName: string,
|
typeName: string,
|
||||||
quantity: number = 1,
|
quantity: number = 1,
|
||||||
premiumPurchase: boolean = false,
|
premiumPurchase: boolean = false,
|
||||||
seed?: bigint
|
seed?: bigint,
|
||||||
|
targetFingerprint?: string
|
||||||
): Promise<IInventoryChanges> => {
|
): Promise<IInventoryChanges> => {
|
||||||
// Bundles are technically StoreItems but a) they don't have a normal counterpart, and b) they are used in non-StoreItem contexts, e.g. email attachments.
|
// Bundles are technically StoreItems but a) they don't have a normal counterpart, and b) they are used in non-StoreItem contexts, e.g. email attachments.
|
||||||
if (typeName in ExportBundles) {
|
if (typeName in ExportBundles) {
|
||||||
@ -530,6 +534,12 @@ export const addItem = async (
|
|||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if (targetFingerprint) {
|
||||||
|
const targetFingerprintObj = JSON.parse(targetFingerprint) as INemesisWeaponTargetFingerprint;
|
||||||
|
defaultOverwrites.UpgradeType = targetFingerprintObj.ItemType;
|
||||||
|
defaultOverwrites.UpgradeFingerprint = JSON.stringify(targetFingerprintObj.UpgradeFingerprint);
|
||||||
|
defaultOverwrites.ItemName = targetFingerprintObj.Name;
|
||||||
|
}
|
||||||
const inventoryChanges = addEquipment(inventory, weapon.productCategory, typeName, defaultOverwrites);
|
const inventoryChanges = addEquipment(inventory, weapon.productCategory, typeName, defaultOverwrites);
|
||||||
if (weapon.additionalItems) {
|
if (weapon.additionalItems) {
|
||||||
for (const item of weapon.additionalItems) {
|
for (const item of weapon.additionalItems) {
|
||||||
@ -544,6 +554,27 @@ export const addItem = async (
|
|||||||
premiumPurchase
|
premiumPurchase
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
} else if (targetFingerprint) {
|
||||||
|
// Sister's Hound
|
||||||
|
const targetFingerprintObj = JSON.parse(targetFingerprint) as INemesisPetTargetFingerprint;
|
||||||
|
const head = targetFingerprintObj.Parts[0];
|
||||||
|
const defaultOverwrites: Partial<IEquipmentDatabase> = {
|
||||||
|
ModularParts: targetFingerprintObj.Parts,
|
||||||
|
ItemName: targetFingerprintObj.Name,
|
||||||
|
Configs: applyDefaultUpgrades(inventory, ExportWeapons[head].defaultUpgrades)
|
||||||
|
};
|
||||||
|
const itemType = {
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadA":
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit",
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadB":
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit",
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadC":
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit"
|
||||||
|
}[head] as string;
|
||||||
|
return {
|
||||||
|
...addEquipment(inventory, "MoaPets", itemType, defaultOverwrites),
|
||||||
|
...occupySlot(inventory, InventorySlot.SENTINELS, premiumPurchase)
|
||||||
|
};
|
||||||
} else {
|
} else {
|
||||||
// Modular weapon parts
|
// Modular weapon parts
|
||||||
const miscItemChanges = [
|
const miscItemChanges = [
|
||||||
@ -1851,3 +1882,78 @@ export const getCalendarProgress = (inventory: TInventoryDatabaseDocument): ICal
|
|||||||
|
|
||||||
return inventory.CalendarProgress;
|
return inventory.CalendarProgress;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const giveNemesisWeaponRecipe = (
|
||||||
|
inventory: TInventoryDatabaseDocument,
|
||||||
|
weaponType: string,
|
||||||
|
nemesisName: string = "AGOR ROK",
|
||||||
|
weaponLoc?: string,
|
||||||
|
KillingSuit: string = "/Lotus/Powersuits/Ember/Ember",
|
||||||
|
fp: bigint = generateRewardSeed()
|
||||||
|
): void => {
|
||||||
|
if (!weaponLoc) {
|
||||||
|
weaponLoc = ExportWeapons[weaponType].name;
|
||||||
|
}
|
||||||
|
const recipeType = Object.entries(ExportRecipes).find(arr => arr[1].resultType == weaponType)![0];
|
||||||
|
addRecipes(inventory, [
|
||||||
|
{
|
||||||
|
ItemType: recipeType,
|
||||||
|
ItemCount: 1
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
inventory.PendingRecipes.push({
|
||||||
|
CompletionDate: new Date(),
|
||||||
|
ItemType: recipeType,
|
||||||
|
TargetFingerprint: JSON.stringify({
|
||||||
|
ItemType: "/Lotus/Weapons/Grineer/KuvaLich/Upgrades/InnateDamageRandomMod",
|
||||||
|
UpgradeFingerprint: {
|
||||||
|
compat: weaponType,
|
||||||
|
buffs: [
|
||||||
|
{
|
||||||
|
Tag: getInnateDamageTag(KillingSuit),
|
||||||
|
Value: getInnateDamageValue(fp)
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
Name: weaponLoc + "|" + nemesisName
|
||||||
|
} satisfies INemesisWeaponTargetFingerprint)
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const giveNemesisPetRecipe = (inventory: TInventoryDatabaseDocument, nemesisName: string = "AGOR ROK"): void => {
|
||||||
|
const head = getRandomElement([
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadA",
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadB",
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadC"
|
||||||
|
]);
|
||||||
|
const body = getRandomElement([
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyA",
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyB",
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyC"
|
||||||
|
]);
|
||||||
|
const legs = getRandomElement([
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsA",
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsB",
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsC"
|
||||||
|
]);
|
||||||
|
const tail = getRandomElement([
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailA",
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailB",
|
||||||
|
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailC"
|
||||||
|
]);
|
||||||
|
const recipeType = Object.entries(ExportRecipes).find(arr => arr[1].resultType == head)![0];
|
||||||
|
addRecipes(inventory, [
|
||||||
|
{
|
||||||
|
ItemType: recipeType,
|
||||||
|
ItemCount: 1
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
inventory.PendingRecipes.push({
|
||||||
|
CompletionDate: new Date(),
|
||||||
|
ItemType: recipeType,
|
||||||
|
TargetFingerprint: JSON.stringify({
|
||||||
|
Parts: [head, body, legs, tail],
|
||||||
|
Name: "/Lotus/Language/Pets/ZanukaPetName|" + nemesisName
|
||||||
|
} satisfies INemesisPetTargetFingerprint)
|
||||||
|
});
|
||||||
|
};
|
||||||
|
@ -35,6 +35,8 @@ import {
|
|||||||
combineInventoryChanges,
|
combineInventoryChanges,
|
||||||
generateRewardSeed,
|
generateRewardSeed,
|
||||||
getCalendarProgress,
|
getCalendarProgress,
|
||||||
|
giveNemesisPetRecipe,
|
||||||
|
giveNemesisWeaponRecipe,
|
||||||
updateCurrency,
|
updateCurrency,
|
||||||
updateSyndicate
|
updateSyndicate
|
||||||
} from "@/src/services/inventoryService";
|
} from "@/src/services/inventoryService";
|
||||||
@ -53,7 +55,7 @@ import kuriaMessage50 from "@/static/fixed_responses/kuriaMessages/fiftyPercent.
|
|||||||
import kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json";
|
import kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json";
|
||||||
import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json";
|
import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json";
|
||||||
import conservationAnimals from "@/static/fixed_responses/conservationAnimals.json";
|
import conservationAnimals from "@/static/fixed_responses/conservationAnimals.json";
|
||||||
import { getInfNodes } from "@/src/helpers/nemesisHelpers";
|
import { getInfNodes, getWeaponsForManifest } from "@/src/helpers/nemesisHelpers";
|
||||||
import { Loadout } from "../models/inventoryModels/loadoutModel";
|
import { Loadout } from "../models/inventoryModels/loadoutModel";
|
||||||
import { ILoadoutConfigDatabase } from "../types/saveLoadoutTypes";
|
import { ILoadoutConfigDatabase } from "../types/saveLoadoutTypes";
|
||||||
import { getLiteSortie, getWorldState, idToWeek } from "./worldStateService";
|
import { getLiteSortie, getWorldState, idToWeek } from "./worldStateService";
|
||||||
@ -513,6 +515,16 @@ export const addMissionInventoryUpdates = async (
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "KubrowPetEggs": {
|
||||||
|
for (const egg of value) {
|
||||||
|
inventory.KubrowPetEggs ??= [];
|
||||||
|
inventory.KubrowPetEggs.push({
|
||||||
|
ItemType: egg.ItemType,
|
||||||
|
_id: new Types.ObjectId()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "DiscoveredMarkers": {
|
case "DiscoveredMarkers": {
|
||||||
for (const clientMarker of value) {
|
for (const clientMarker of value) {
|
||||||
const dbMarker = inventory.DiscoveredMarkers.find(x => x.tag == clientMarker.tag);
|
const dbMarker = inventory.DiscoveredMarkers.find(x => x.tag == clientMarker.tag);
|
||||||
@ -602,6 +614,52 @@ export const addMissionInventoryUpdates = async (
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "NemesisKillConvert":
|
||||||
|
if (inventory.Nemesis) {
|
||||||
|
inventory.NemesisHistory ??= [];
|
||||||
|
inventory.NemesisHistory.push({
|
||||||
|
// Copy over all 'base' values
|
||||||
|
fp: inventory.Nemesis.fp,
|
||||||
|
d: inventory.Nemesis.d,
|
||||||
|
manifest: inventory.Nemesis.manifest,
|
||||||
|
KillingSuit: inventory.Nemesis.KillingSuit,
|
||||||
|
killingDamageType: inventory.Nemesis.killingDamageType,
|
||||||
|
ShoulderHelmet: inventory.Nemesis.ShoulderHelmet,
|
||||||
|
WeaponIdx: inventory.Nemesis.WeaponIdx,
|
||||||
|
AgentIdx: inventory.Nemesis.AgentIdx,
|
||||||
|
BirthNode: inventory.Nemesis.BirthNode,
|
||||||
|
Faction: inventory.Nemesis.Faction,
|
||||||
|
Rank: inventory.Nemesis.Rank,
|
||||||
|
Traded: inventory.Nemesis.Traded,
|
||||||
|
PrevOwners: inventory.Nemesis.PrevOwners,
|
||||||
|
SecondInCommand: inventory.Nemesis.SecondInCommand,
|
||||||
|
Weakened: inventory.Nemesis.Weakened,
|
||||||
|
// And set killed flag
|
||||||
|
k: value.killed
|
||||||
|
});
|
||||||
|
|
||||||
|
if (value.killed) {
|
||||||
|
if (value.weaponLoc) {
|
||||||
|
const weaponType = getWeaponsForManifest(inventory.Nemesis.manifest)[
|
||||||
|
inventory.Nemesis.WeaponIdx
|
||||||
|
];
|
||||||
|
giveNemesisWeaponRecipe(
|
||||||
|
inventory,
|
||||||
|
weaponType,
|
||||||
|
value.nemesisName,
|
||||||
|
value.weaponLoc,
|
||||||
|
inventory.Nemesis.KillingSuit,
|
||||||
|
inventory.Nemesis.fp
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (value.petLoc) {
|
||||||
|
giveNemesisPetRecipe(inventory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inventory.Nemesis = undefined;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
// Equipment XP updates
|
// Equipment XP updates
|
||||||
if (equipmentKeys.includes(key as TEquipmentKey)) {
|
if (equipmentKeys.includes(key as TEquipmentKey)) {
|
||||||
|
@ -73,7 +73,6 @@ const generatableVendors: IGeneratableVendorInfo[] = [
|
|||||||
{
|
{
|
||||||
_id: { $oid: "67dadc30e4b6e0e5979c8d84" },
|
_id: { $oid: "67dadc30e4b6e0e5979c8d84" },
|
||||||
TypeName: "/Lotus/Types/Game/VendorManifests/TheHex/InfestedLichWeaponVendorManifest",
|
TypeName: "/Lotus/Types/Game/VendorManifests/TheHex/InfestedLichWeaponVendorManifest",
|
||||||
PropertyTextHash: "77093DD05A8561A022DEC9A4B9BB4A56",
|
|
||||||
RandomSeedType: "VRST_WEAPON",
|
RandomSeedType: "VRST_WEAPON",
|
||||||
RequiredGoalTag: "",
|
RequiredGoalTag: "",
|
||||||
WeaponUpgradeValueAttenuationExponent: 2.25,
|
WeaponUpgradeValueAttenuationExponent: 2.25,
|
||||||
@ -83,7 +82,6 @@ const generatableVendors: IGeneratableVendorInfo[] = [
|
|||||||
{
|
{
|
||||||
_id: { $oid: "60ad3b6ec96976e97d227e19" },
|
_id: { $oid: "60ad3b6ec96976e97d227e19" },
|
||||||
TypeName: "/Lotus/Types/Game/VendorManifests/Hubs/PerrinSequenceWeaponVendorManifest",
|
TypeName: "/Lotus/Types/Game/VendorManifests/Hubs/PerrinSequenceWeaponVendorManifest",
|
||||||
PropertyTextHash: "34F8CF1DFF745F0D67433A5EF0A03E70",
|
|
||||||
RandomSeedType: "VRST_WEAPON",
|
RandomSeedType: "VRST_WEAPON",
|
||||||
WeaponUpgradeValueAttenuationExponent: 2.25,
|
WeaponUpgradeValueAttenuationExponent: 2.25,
|
||||||
cycleOffset: 1744934400_000,
|
cycleOffset: 1744934400_000,
|
||||||
@ -92,21 +90,18 @@ const generatableVendors: IGeneratableVendorInfo[] = [
|
|||||||
{
|
{
|
||||||
_id: { $oid: "5be4a159b144f3cdf1c22efa" },
|
_id: { $oid: "5be4a159b144f3cdf1c22efa" },
|
||||||
TypeName: "/Lotus/Types/Game/VendorManifests/Solaris/DebtTokenVendorManifest",
|
TypeName: "/Lotus/Types/Game/VendorManifests/Solaris/DebtTokenVendorManifest",
|
||||||
PropertyTextHash: "A39621049CA3CA13761028CD21C239EF",
|
|
||||||
RandomSeedType: "VRST_FLAVOUR_TEXT",
|
RandomSeedType: "VRST_FLAVOUR_TEXT",
|
||||||
cycleDuration: unixTimesInMs.hour
|
cycleDuration: unixTimesInMs.hour
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
_id: { $oid: "61ba123467e5d37975aeeb03" },
|
_id: { $oid: "61ba123467e5d37975aeeb03" },
|
||||||
TypeName: "/Lotus/Types/Game/VendorManifests/Hubs/GuildAdvertisementVendorManifest",
|
TypeName: "/Lotus/Types/Game/VendorManifests/Hubs/GuildAdvertisementVendorManifest",
|
||||||
PropertyTextHash: "255AFE2169BAE4130B4B20D7C55D14FA",
|
|
||||||
RandomSeedType: "VRST_FLAVOUR_TEXT",
|
RandomSeedType: "VRST_FLAVOUR_TEXT",
|
||||||
cycleDuration: unixTimesInMs.week
|
cycleDuration: unixTimesInMs.week
|
||||||
}
|
}
|
||||||
// {
|
// {
|
||||||
// _id: { $oid: "5dbb4c41e966f7886c3ce939" },
|
// _id: { $oid: "5dbb4c41e966f7886c3ce939" },
|
||||||
// TypeName: "/Lotus/Types/Game/VendorManifests/Hubs/IronwakeDondaVendorManifest",
|
// TypeName: "/Lotus/Types/Game/VendorManifests/Hubs/IronwakeDondaVendorManifest"
|
||||||
// PropertyTextHash: "62B64A8065B7C0FA345895D4BC234621"
|
|
||||||
// }
|
// }
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import staticWorldState from "@/static/fixed_responses/worldState/worldState.json";
|
import staticWorldState from "@/static/fixed_responses/worldState/worldState.json";
|
||||||
import sortieTilesets from "@/static/fixed_responses/worldState/sortieTilesets.json";
|
import sortieTilesets from "@/static/fixed_responses/worldState/sortieTilesets.json";
|
||||||
|
import syndicateMissions from "@/static/fixed_responses/worldState/syndicateMissions.json";
|
||||||
import { buildConfig } from "@/src/services/buildConfigService";
|
import { buildConfig } from "@/src/services/buildConfigService";
|
||||||
import { unixTimesInMs } from "@/src/constants/timeConstants";
|
import { unixTimesInMs } from "@/src/constants/timeConstants";
|
||||||
import { config } from "@/src/services/configService";
|
import { config } from "@/src/services/configService";
|
||||||
@ -189,20 +190,7 @@ const pushSyndicateMissions = (
|
|||||||
idSuffix: string,
|
idSuffix: string,
|
||||||
syndicateTag: string
|
syndicateTag: string
|
||||||
): void => {
|
): void => {
|
||||||
const nodeOptions: string[] = [];
|
const nodeOptions: string[] = [...syndicateMissions];
|
||||||
for (const [key, value] of Object.entries(ExportRegions)) {
|
|
||||||
if (
|
|
||||||
!isArchwingMission(value) &&
|
|
||||||
!value.questReq && // Exclude zariman, murmor, and 1999 stuff
|
|
||||||
!value.hidden && // Exclude the index
|
|
||||||
!value.darkSectorData && // Exclude dark sectors
|
|
||||||
value.missionIndex != 10 && // Exclude MT_PVP (for relays)
|
|
||||||
value.missionIndex != 23 && // no junctions
|
|
||||||
value.missionIndex < 28 // no open worlds, railjack, etc
|
|
||||||
) {
|
|
||||||
nodeOptions.push(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const rng = new CRng(seed);
|
const rng = new CRng(seed);
|
||||||
const nodes: string[] = [];
|
const nodes: string[] = [];
|
||||||
|
@ -43,6 +43,7 @@ export interface IInventoryDatabase
|
|||||||
| "RecentVendorPurchases"
|
| "RecentVendorPurchases"
|
||||||
| "NextRefill"
|
| "NextRefill"
|
||||||
| "Nemesis"
|
| "Nemesis"
|
||||||
|
| "NemesisHistory"
|
||||||
| "EntratiVaultCountResetDate"
|
| "EntratiVaultCountResetDate"
|
||||||
| "BrandedSuits"
|
| "BrandedSuits"
|
||||||
| "LockedWeaponGroup"
|
| "LockedWeaponGroup"
|
||||||
@ -79,6 +80,7 @@ export interface IInventoryDatabase
|
|||||||
RecentVendorPurchases?: IRecentVendorPurchaseDatabase[];
|
RecentVendorPurchases?: IRecentVendorPurchaseDatabase[];
|
||||||
NextRefill?: Date;
|
NextRefill?: Date;
|
||||||
Nemesis?: INemesisDatabase;
|
Nemesis?: INemesisDatabase;
|
||||||
|
NemesisHistory?: INemesisBaseDatabase[];
|
||||||
EntratiVaultCountResetDate?: Date;
|
EntratiVaultCountResetDate?: Date;
|
||||||
BrandedSuits?: Types.ObjectId[];
|
BrandedSuits?: Types.ObjectId[];
|
||||||
LockedWeaponGroup?: ILockedWeaponGroupDatabase;
|
LockedWeaponGroup?: ILockedWeaponGroupDatabase;
|
||||||
@ -313,7 +315,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
|
|||||||
EquippedInstrument?: string;
|
EquippedInstrument?: string;
|
||||||
InvasionChainProgress: IInvasionChainProgress[];
|
InvasionChainProgress: IInvasionChainProgress[];
|
||||||
Nemesis?: INemesisClient;
|
Nemesis?: INemesisClient;
|
||||||
NemesisHistory: INemesisBaseClient[];
|
NemesisHistory?: INemesisBaseClient[];
|
||||||
LastNemesisAllySpawnTime?: IMongoDate;
|
LastNemesisAllySpawnTime?: IMongoDate;
|
||||||
Settings?: ISettings;
|
Settings?: ISettings;
|
||||||
PersonalTechProjects: IPersonalTechProjectClient[];
|
PersonalTechProjects: IPersonalTechProjectClient[];
|
||||||
@ -902,8 +904,8 @@ export interface IPendingRecipeDatabase {
|
|||||||
ItemType: string;
|
ItemType: string;
|
||||||
CompletionDate: Date;
|
CompletionDate: Date;
|
||||||
ItemId: IOid;
|
ItemId: IOid;
|
||||||
TargetItemId?: string; // likely related to liches
|
TargetItemId?: string; // unsure what this is for
|
||||||
TargetFingerprint?: string; // likely related to liches
|
TargetFingerprint?: string;
|
||||||
LongGuns?: IEquipmentDatabase[];
|
LongGuns?: IEquipmentDatabase[];
|
||||||
Pistols?: IEquipmentDatabase[];
|
Pistols?: IEquipmentDatabase[];
|
||||||
Melee?: IEquipmentDatabase[];
|
Melee?: IEquipmentDatabase[];
|
||||||
@ -951,6 +953,17 @@ export interface ICrewShipComponentFingerprint extends IInnateDamageFingerprint
|
|||||||
SubroutineIndex?: number;
|
SubroutineIndex?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface INemesisWeaponTargetFingerprint {
|
||||||
|
ItemType: string;
|
||||||
|
UpgradeFingerprint: IInnateDamageFingerprint;
|
||||||
|
Name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface INemesisPetTargetFingerprint {
|
||||||
|
Parts: string[];
|
||||||
|
Name: string;
|
||||||
|
}
|
||||||
|
|
||||||
export enum GettingSlotOrderInfo {
|
export enum GettingSlotOrderInfo {
|
||||||
Empty = "",
|
Empty = "",
|
||||||
LotusUpgradesModsRandomizedPlayerMeleeWeaponRandomModRare0 = "/Lotus/Upgrades/Mods/Randomized/PlayerMeleeWeaponRandomModRare:0",
|
LotusUpgradesModsRandomizedPlayerMeleeWeaponRandomModRare0 = "/Lotus/Upgrades/Mods/Randomized/PlayerMeleeWeaponRandomModRare:0",
|
||||||
|
@ -21,7 +21,9 @@ import {
|
|||||||
ILockedWeaponGroupClient,
|
ILockedWeaponGroupClient,
|
||||||
ILoadOutPresets,
|
ILoadOutPresets,
|
||||||
IInvasionProgressClient,
|
IInvasionProgressClient,
|
||||||
IWeaponSkinClient
|
IWeaponSkinClient,
|
||||||
|
IKubrowPetEggClient,
|
||||||
|
INemesisClient
|
||||||
} from "./inventoryTypes/inventoryTypes";
|
} from "./inventoryTypes/inventoryTypes";
|
||||||
import { IGroup } from "./loginTypes";
|
import { IGroup } from "./loginTypes";
|
||||||
|
|
||||||
@ -73,6 +75,14 @@ export type IMissionInventoryUpdateRequest = {
|
|||||||
PS: string;
|
PS: string;
|
||||||
ActiveDojoColorResearch: string;
|
ActiveDojoColorResearch: string;
|
||||||
RewardInfo?: IRewardInfo;
|
RewardInfo?: IRewardInfo;
|
||||||
|
NemesisKillConvert?: {
|
||||||
|
nemesisName: string;
|
||||||
|
weaponLoc: string;
|
||||||
|
petLoc: "" | "/Lotus/Language/Pets/ZanukaPetName";
|
||||||
|
fingerprint: bigint | number;
|
||||||
|
killed: boolean;
|
||||||
|
};
|
||||||
|
target?: INemesisClient;
|
||||||
ReceivedCeremonyMsg: boolean;
|
ReceivedCeremonyMsg: boolean;
|
||||||
LastCeremonyResetDate: number;
|
LastCeremonyResetDate: number;
|
||||||
MissionPTS: number;
|
MissionPTS: number;
|
||||||
@ -118,6 +128,7 @@ export type IMissionInventoryUpdateRequest = {
|
|||||||
NumExtraRewards: number;
|
NumExtraRewards: number;
|
||||||
Count: number;
|
Count: number;
|
||||||
}[];
|
}[];
|
||||||
|
KubrowPetEggs?: IKubrowPetEggClient[];
|
||||||
DiscoveredMarkers?: IDiscoveredMarker[];
|
DiscoveredMarkers?: IDiscoveredMarker[];
|
||||||
LockedWeaponGroup?: ILockedWeaponGroupClient; // sent when captured by zanuka
|
LockedWeaponGroup?: ILockedWeaponGroupClient; // sent when captured by zanuka
|
||||||
UnlockWeapons?: boolean; // sent when recovered weapons from zanuka capture
|
UnlockWeapons?: boolean; // sent when recovered weapons from zanuka capture
|
||||||
|
157
static/fixed_responses/worldState/syndicateMissions.json
Normal file
157
static/fixed_responses/worldState/syndicateMissions.json
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
[
|
||||||
|
"SettlementNode1",
|
||||||
|
"SettlementNode11",
|
||||||
|
"SettlementNode12",
|
||||||
|
"SettlementNode14",
|
||||||
|
"SettlementNode15",
|
||||||
|
"SettlementNode2",
|
||||||
|
"SettlementNode3",
|
||||||
|
"SolNode1",
|
||||||
|
"SolNode10",
|
||||||
|
"SolNode100",
|
||||||
|
"SolNode101",
|
||||||
|
"SolNode102",
|
||||||
|
"SolNode103",
|
||||||
|
"SolNode106",
|
||||||
|
"SolNode107",
|
||||||
|
"SolNode109",
|
||||||
|
"SolNode11",
|
||||||
|
"SolNode113",
|
||||||
|
"SolNode118",
|
||||||
|
"SolNode119",
|
||||||
|
"SolNode12",
|
||||||
|
"SolNode121",
|
||||||
|
"SolNode122",
|
||||||
|
"SolNode123",
|
||||||
|
"SolNode125",
|
||||||
|
"SolNode126",
|
||||||
|
"SolNode128",
|
||||||
|
"SolNode130",
|
||||||
|
"SolNode131",
|
||||||
|
"SolNode132",
|
||||||
|
"SolNode135",
|
||||||
|
"SolNode137",
|
||||||
|
"SolNode138",
|
||||||
|
"SolNode139",
|
||||||
|
"SolNode14",
|
||||||
|
"SolNode140",
|
||||||
|
"SolNode141",
|
||||||
|
"SolNode146",
|
||||||
|
"SolNode147",
|
||||||
|
"SolNode149",
|
||||||
|
"SolNode15",
|
||||||
|
"SolNode153",
|
||||||
|
"SolNode16",
|
||||||
|
"SolNode162",
|
||||||
|
"SolNode164",
|
||||||
|
"SolNode166",
|
||||||
|
"SolNode167",
|
||||||
|
"SolNode17",
|
||||||
|
"SolNode171",
|
||||||
|
"SolNode172",
|
||||||
|
"SolNode173",
|
||||||
|
"SolNode175",
|
||||||
|
"SolNode177",
|
||||||
|
"SolNode18",
|
||||||
|
"SolNode181",
|
||||||
|
"SolNode184",
|
||||||
|
"SolNode185",
|
||||||
|
"SolNode187",
|
||||||
|
"SolNode188",
|
||||||
|
"SolNode189",
|
||||||
|
"SolNode19",
|
||||||
|
"SolNode191",
|
||||||
|
"SolNode195",
|
||||||
|
"SolNode196",
|
||||||
|
"SolNode2",
|
||||||
|
"SolNode20",
|
||||||
|
"SolNode203",
|
||||||
|
"SolNode204",
|
||||||
|
"SolNode205",
|
||||||
|
"SolNode209",
|
||||||
|
"SolNode21",
|
||||||
|
"SolNode211",
|
||||||
|
"SolNode212",
|
||||||
|
"SolNode214",
|
||||||
|
"SolNode215",
|
||||||
|
"SolNode216",
|
||||||
|
"SolNode217",
|
||||||
|
"SolNode22",
|
||||||
|
"SolNode220",
|
||||||
|
"SolNode223",
|
||||||
|
"SolNode224",
|
||||||
|
"SolNode225",
|
||||||
|
"SolNode226",
|
||||||
|
"SolNode23",
|
||||||
|
"SolNode25",
|
||||||
|
"SolNode26",
|
||||||
|
"SolNode27",
|
||||||
|
"SolNode30",
|
||||||
|
"SolNode31",
|
||||||
|
"SolNode36",
|
||||||
|
"SolNode38",
|
||||||
|
"SolNode39",
|
||||||
|
"SolNode4",
|
||||||
|
"SolNode400",
|
||||||
|
"SolNode401",
|
||||||
|
"SolNode402",
|
||||||
|
"SolNode403",
|
||||||
|
"SolNode404",
|
||||||
|
"SolNode405",
|
||||||
|
"SolNode406",
|
||||||
|
"SolNode407",
|
||||||
|
"SolNode408",
|
||||||
|
"SolNode409",
|
||||||
|
"SolNode41",
|
||||||
|
"SolNode410",
|
||||||
|
"SolNode412",
|
||||||
|
"SolNode42",
|
||||||
|
"SolNode43",
|
||||||
|
"SolNode45",
|
||||||
|
"SolNode46",
|
||||||
|
"SolNode48",
|
||||||
|
"SolNode49",
|
||||||
|
"SolNode50",
|
||||||
|
"SolNode56",
|
||||||
|
"SolNode57",
|
||||||
|
"SolNode58",
|
||||||
|
"SolNode59",
|
||||||
|
"SolNode6",
|
||||||
|
"SolNode61",
|
||||||
|
"SolNode62",
|
||||||
|
"SolNode63",
|
||||||
|
"SolNode64",
|
||||||
|
"SolNode66",
|
||||||
|
"SolNode67",
|
||||||
|
"SolNode68",
|
||||||
|
"SolNode70",
|
||||||
|
"SolNode706",
|
||||||
|
"SolNode707",
|
||||||
|
"SolNode708",
|
||||||
|
"SolNode709",
|
||||||
|
"SolNode710",
|
||||||
|
"SolNode711",
|
||||||
|
"SolNode72",
|
||||||
|
"SolNode73",
|
||||||
|
"SolNode74",
|
||||||
|
"SolNode741",
|
||||||
|
"SolNode742",
|
||||||
|
"SolNode743",
|
||||||
|
"SolNode744",
|
||||||
|
"SolNode745",
|
||||||
|
"SolNode746",
|
||||||
|
"SolNode748",
|
||||||
|
"SolNode75",
|
||||||
|
"SolNode76",
|
||||||
|
"SolNode78",
|
||||||
|
"SolNode79",
|
||||||
|
"SolNode81",
|
||||||
|
"SolNode82",
|
||||||
|
"SolNode84",
|
||||||
|
"SolNode85",
|
||||||
|
"SolNode88",
|
||||||
|
"SolNode89",
|
||||||
|
"SolNode93",
|
||||||
|
"SolNode96",
|
||||||
|
"SolNode97"
|
||||||
|
]
|
@ -120,9 +120,9 @@ dict = {
|
|||||||
mods_fingerprintHelp: `¿Necesitas ayuda con la huella digital?`,
|
mods_fingerprintHelp: `¿Necesitas ayuda con la huella digital?`,
|
||||||
mods_rivens: `Agrietados`,
|
mods_rivens: `Agrietados`,
|
||||||
mods_mods: `Mods`,
|
mods_mods: `Mods`,
|
||||||
mods_addMissingUnrankedMods: `[UNTRANSLATED] Add Missing Unranked Mods`,
|
mods_addMissingUnrankedMods: `Agregar mods sin rango faltantes`,
|
||||||
mods_removeUnranked: `Quitar mods sin rango`,
|
mods_removeUnranked: `Quitar mods sin rango`,
|
||||||
mods_addMissingMaxRankMods: `[UNTRANSLATED] Add Missing Max Rank Mods`,
|
mods_addMissingMaxRankMods: `Agregar mods de rango máximo faltantes`,
|
||||||
cheats_administratorRequirement: `Debes ser administrador para usar esta función. Para convertirte en administrador, agrega <code>|DISPLAYNAME|</code> a <code>administratorNames</code> en el archivo config.json.`,
|
cheats_administratorRequirement: `Debes ser administrador para usar esta función. Para convertirte en administrador, agrega <code>|DISPLAYNAME|</code> a <code>administratorNames</code> en el archivo config.json.`,
|
||||||
cheats_server: `Servidor`,
|
cheats_server: `Servidor`,
|
||||||
cheats_skipTutorial: `Omitir tutorial`,
|
cheats_skipTutorial: `Omitir tutorial`,
|
||||||
@ -134,7 +134,7 @@ dict = {
|
|||||||
cheats_infiniteEndo: `Endo infinito`,
|
cheats_infiniteEndo: `Endo infinito`,
|
||||||
cheats_infiniteRegalAya: `Aya Real infinita`,
|
cheats_infiniteRegalAya: `Aya Real infinita`,
|
||||||
cheats_infiniteHelminthMaterials: `Materiales Helminto infinitos`,
|
cheats_infiniteHelminthMaterials: `Materiales Helminto infinitos`,
|
||||||
cheats_dontSubtractConsumables: `[UNTRANSLATED] Don't Subtract Consumables`,
|
cheats_dontSubtractConsumables: `No restar consumibles`,
|
||||||
cheats_unlockAllShipFeatures: `Desbloquear todas las funciones de nave`,
|
cheats_unlockAllShipFeatures: `Desbloquear todas las funciones de nave`,
|
||||||
cheats_unlockAllShipDecorations: `Desbloquear todas las decoraciones de nave`,
|
cheats_unlockAllShipDecorations: `Desbloquear todas las decoraciones de nave`,
|
||||||
cheats_unlockAllFlavourItems: `Desbloquear todos los <abbr title="Conjuntos de animaciones, glifos, paletas, etc.">ítems estéticos</abbr>`,
|
cheats_unlockAllFlavourItems: `Desbloquear todos los <abbr title="Conjuntos de animaciones, glifos, paletas, etc.">ítems estéticos</abbr>`,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user